Initial draft for filtering Frigate+ submits in frontend

This commit is contained in:
tpjanssen 2023-10-26 22:46:56 +02:00
parent 5a46c36380
commit ec52bde3f6
3 changed files with 44 additions and 2 deletions

View File

@ -946,7 +946,7 @@ def events():
if is_submitted is not None: if is_submitted is not None:
if is_submitted == 0: if is_submitted == 0:
clauses.append((Event.plus_id.is_null())) clauses.append((Event.plus_id.is_null()))
else: elif is_submitted > 0:
clauses.append((Event.plus_id != "")) clauses.append((Event.plus_id != ""))
if len(clauses) == 0: if len(clauses) == 0:

View File

@ -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 (
<svg
xmlns="http://www.w3.org/2000/svg"
className={className}
viewBox="0 0 32 32"
onClick={onClick}
>
<rect x="10" y="15" fill={inner_fill} width="12" height="2"/>
<rect x="15" y="10" fill={inner_fill} width="2" height="12"/>
<circle fill="none" stroke={outer_stroke} stroke-width="2" stroke-miterlimit="10" cx="16" cy="16" r="12"/>
</svg>
);
}
export default memo(Submitted);

View File

@ -11,6 +11,7 @@ import axios from 'axios';
import { useState, useRef, useCallback, useMemo } from 'preact/hooks'; import { useState, useRef, useCallback, useMemo } from 'preact/hooks';
import VideoPlayer from '../components/VideoPlayer'; import VideoPlayer from '../components/VideoPlayer';
import { StarRecording } from '../icons/StarRecording'; import { StarRecording } from '../icons/StarRecording';
import { Submitted } from '../icons/Submitted';
import { Snapshot } from '../icons/Snapshot'; import { Snapshot } from '../icons/Snapshot';
import { UploadPlus } from '../icons/UploadPlus'; import { UploadPlus } from '../icons/UploadPlus';
import { Clip } from '../icons/Clip'; import { Clip } from '../icons/Clip';
@ -63,6 +64,7 @@ export default function Events({ path, ...props }) {
time_range: '00:00,24:00', time_range: '00:00,24:00',
timezone, timezone,
favorites: props.favorites ?? 0, favorites: props.favorites ?? 0,
is_submitted: props.is_submitted ?? -1,
event: props.event, event: props.event,
}); });
const [state, setState] = useState({ const [state, setState] = useState({
@ -281,6 +283,20 @@ export default function Events({ path, ...props }) {
[path, searchParams, setSearchParams] [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; const isDone = (eventPages?.[eventPages.length - 1]?.length ?? 0) < API_LIMIT;
// hooks for infinite scroll // hooks for infinite scroll
@ -394,8 +410,15 @@ export default function Events({ path, ...props }) {
</Button> </Button>
)} )}
<StarRecording <Submitted
className="h-10 w-10 text-yellow-300 cursor-pointer ml-auto" className="h-10 w-10 text-yellow-300 cursor-pointer ml-auto"
onClick={() => onClickSubmitted()}
inner_fill={searchParams.is_submitted == 1 ? 'currentColor' : 'gray'}
outer_stroke={searchParams.is_submitted >= 0 ? 'currentColor' : 'gray'}
/>
<StarRecording
className="h-10 w-10 text-yellow-300 cursor-pointer ml-right"
onClick={() => onFilter('favorites', searchParams.favorites ? 0 : 1)} onClick={() => onFilter('favorites', searchParams.favorites ? 0 : 1)}
fill={searchParams.favorites == 1 ? 'currentColor' : 'none'} fill={searchParams.favorites == 1 ? 'currentColor' : 'none'}
/> />