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" })} +
+ + )}
)}