From ec52bde3f6a0a292d60c514c479868bb8c362933 Mon Sep 17 00:00:00 2001
From: tpjanssen <25168870+tpjanssen@users.noreply.github.com>
Date: Thu, 26 Oct 2023 22:46:56 +0200
Subject: [PATCH] Initial draft for filtering Frigate+ submits in frontend
---
frigate/http.py | 2 +-
web/src/icons/Submitted.jsx | 19 +++++++++++++++++++
web/src/routes/Events.jsx | 25 ++++++++++++++++++++++++-
3 files changed, 44 insertions(+), 2 deletions(-)
create mode 100644 web/src/icons/Submitted.jsx
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'}
/>