diff --git a/frigate/http.py b/frigate/http.py index 0061d338f..87113c648 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -946,7 +946,7 @@ def events(): if is_submitted is not None: if is_submitted == 0: clauses.append((Event.plus_id.is_null())) - else: + elif is_submitted > 0: clauses.append((Event.plus_id != "")) if len(clauses) == 0: diff --git a/web/src/icons/Submitted.jsx b/web/src/icons/Submitted.jsx new file mode 100644 index 000000000..e7612a79f --- /dev/null +++ b/web/src/icons/Submitted.jsx @@ -0,0 +1,19 @@ +import { h } from 'preact'; +import { memo } from 'preact/compat'; + +export function Submitted({ className = 'h-6 w-6', inner_fill = 'none', outer_stroke = 'currentColor', onClick = () => {} }) { + return ( + + + + + + ); +} + +export default memo(Submitted); diff --git a/web/src/routes/Events.jsx b/web/src/routes/Events.jsx index 24183c631..21e23eff6 100644 --- a/web/src/routes/Events.jsx +++ b/web/src/routes/Events.jsx @@ -11,6 +11,7 @@ import axios from 'axios'; import { useState, useRef, useCallback, useMemo } from 'preact/hooks'; import VideoPlayer from '../components/VideoPlayer'; import { StarRecording } from '../icons/StarRecording'; +import { Submitted } from '../icons/Submitted'; import { Snapshot } from '../icons/Snapshot'; import { UploadPlus } from '../icons/UploadPlus'; import { Clip } from '../icons/Clip'; @@ -63,6 +64,7 @@ export default function Events({ path, ...props }) { time_range: '00:00,24:00', timezone, favorites: props.favorites ?? 0, + is_submitted: props.is_submitted ?? -1, event: props.event, }); const [state, setState] = useState({ @@ -281,6 +283,20 @@ export default function Events({ path, ...props }) { [path, searchParams, setSearchParams] ); + const onClickSubmitted = useCallback( + () => { + if (searchParams.is_submitted == -1) { + searchParams.is_submitted = 1; + } else if (searchParams.is_submitted == 1) { + searchParams.is_submitted = 0; + } else { + searchParams.is_submitted = -1; + } + onFilter('is_submitted', searchParams.is_submitted); + }, + [path, searchParams, setSearchParams] + ); + const isDone = (eventPages?.[eventPages.length - 1]?.length ?? 0) < API_LIMIT; // hooks for infinite scroll @@ -394,8 +410,15 @@ export default function Events({ path, ...props }) { )} - onClickSubmitted()} + inner_fill={searchParams.is_submitted == 1 ? 'currentColor' : 'gray'} + outer_stroke={searchParams.is_submitted >= 0 ? 'currentColor' : 'gray'} + /> + + onFilter('favorites', searchParams.favorites ? 0 : 1)} fill={searchParams.favorites == 1 ? 'currentColor' : 'none'} />