From 97ba7a6b78d53e497b8931f7a5c513771ca203a0 Mon Sep 17 00:00:00 2001
From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
Date: Wed, 10 Dec 2025 08:28:48 -0600
Subject: [PATCH] add select all link to face library, classification, and
explore
---
web/public/locales/en/views/events.json | 1 +
web/public/locales/en/views/faceLibrary.json | 1 +
.../components/filter/SearchActionGroup.tsx | 15 ++++++++
web/src/pages/FaceLibrary.tsx | 38 +++++++++++++++++--
.../classification/ModelTrainingView.tsx | 24 +++++++++++-
web/src/views/search/SearchView.tsx | 2 +
6 files changed, 75 insertions(+), 6 deletions(-)
diff --git a/web/public/locales/en/views/events.json b/web/public/locales/en/views/events.json
index ee4aadef6..5c0f137b3 100644
--- a/web/public/locales/en/views/events.json
+++ b/web/public/locales/en/views/events.json
@@ -52,6 +52,7 @@
},
"selected_one": "{{count}} selected",
"selected_other": "{{count}} selected",
+ "select_all": "All",
"camera": "Camera",
"detected": "detected",
"normalActivity": "Normal",
diff --git a/web/public/locales/en/views/faceLibrary.json b/web/public/locales/en/views/faceLibrary.json
index 453abfc22..2dbb1a4fd 100644
--- a/web/public/locales/en/views/faceLibrary.json
+++ b/web/public/locales/en/views/faceLibrary.json
@@ -29,6 +29,7 @@
},
"train": {
"title": "Recent Recognitions",
+ "titleShort": "Recent",
"aria": "Select recent recognitions",
"empty": "There are no recent face recognition attempts"
},
diff --git a/web/src/components/filter/SearchActionGroup.tsx b/web/src/components/filter/SearchActionGroup.tsx
index cea02377d..62a3dc648 100644
--- a/web/src/components/filter/SearchActionGroup.tsx
+++ b/web/src/components/filter/SearchActionGroup.tsx
@@ -22,11 +22,15 @@ type SearchActionGroupProps = {
selectedObjects: string[];
setSelectedObjects: (ids: string[]) => void;
pullLatestData: () => void;
+ onSelectAllObjects: () => void;
+ totalItems: number;
};
export default function SearchActionGroup({
selectedObjects,
setSelectedObjects,
pullLatestData,
+ onSelectAllObjects,
+ totalItems,
}: SearchActionGroupProps) {
const { t } = useTranslation(["components/filter"]);
const isAdmin = useIsAdmin();
@@ -124,6 +128,17 @@ export default function SearchActionGroup({
>
{t("button.unselect", { ns: "common" })}
+ {selectedObjects.length < totalItems && (
+ <>
+
{"|"}
+
+ {t("select_all", { ns: "views/events" })}
+
+ >
+ )}
{isAdmin && (
diff --git a/web/src/pages/FaceLibrary.tsx b/web/src/pages/FaceLibrary.tsx
index d25c997c0..0f281895e 100644
--- a/web/src/pages/FaceLibrary.tsx
+++ b/web/src/pages/FaceLibrary.tsx
@@ -52,7 +52,7 @@ import {
useRef,
useState,
} from "react";
-import { isDesktop } from "react-device-detect";
+import { isDesktop, isMobileOnly } from "react-device-detect";
import { Trans, useTranslation } from "react-i18next";
import {
LuFolderCheck,
@@ -370,10 +370,10 @@ export default function FaceLibrary() {
/>
{selectedFaces?.length > 0 ? (
-
+
{t("selected", {
- ns: "views/event",
+ ns: "views/events",
count: selectedFaces.length,
})}
@@ -384,6 +384,24 @@ export default function FaceLibrary() {
>
{t("button.unselect", { ns: "common" })}
+ {selectedFaces.length <
+ (pageToggle === "train"
+ ? trainImages.length
+ : faceImages.length) && (
+ <>
+
{"|"}
+
+ setSelectedFaces([
+ ...(pageToggle === "train" ? trainImages : faceImages),
+ ])
+ }
+ >
+ {t("select_all", { ns: "views/events" })}
+
+ >
+ )}
)}