From aed0966a37e8536a967bc6af672480ce2f24afbb Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Sun, 3 Mar 2024 22:14:04 -0700 Subject: [PATCH] Add camera groups to the filters for events --- .../components/filter/CameraGroupSelector.tsx | 24 +----------- .../components/filter/ReviewFilterGroup.tsx | 39 ++++++++++++++++++- web/src/components/navigation/Sidebar.tsx | 2 +- web/src/utils/iconUtil.tsx | 22 +++++++++++ 4 files changed, 62 insertions(+), 25 deletions(-) diff --git a/web/src/components/filter/CameraGroupSelector.tsx b/web/src/components/filter/CameraGroupSelector.tsx index 9da2fc293..f975d290c 100644 --- a/web/src/components/filter/CameraGroupSelector.tsx +++ b/web/src/components/filter/CameraGroupSelector.tsx @@ -2,12 +2,12 @@ import { FrigateConfig } from "@/types/frigateConfig"; import { isDesktop } from "react-device-detect"; import useSWR from "swr"; import { MdHome } from "react-icons/md"; -import { FaCar, FaCat, FaCircle, FaDog, FaLeaf } from "react-icons/fa"; import useOverlayState from "@/hooks/use-overlay-state"; import { Button } from "../ui/button"; import { useNavigate } from "react-router-dom"; import { useCallback, useMemo, useState } from "react"; import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; +import { getIconForGroup } from "@/utils/iconUtil"; type CameraGroupSelectorProps = { className?: string; @@ -88,7 +88,7 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) { onMouseEnter={() => (isDesktop ? showTooltip(name) : null)} onMouseLeave={() => (isDesktop ? showTooltip(undefined) : null)} > - {getGroupIcon(config.icon)} + {getIconForGroup(config.icon)} @@ -100,23 +100,3 @@ export function CameraGroupSelector({ className }: CameraGroupSelectorProps) { ); } - -function getGroupIcon(icon: string) { - switch (icon) { - case "car": - return ; - case "cat": - return ; - case "dog": - return ; - case "leaf": - return ; - default: - return ; - } -} - -/** - * {config && - } - */ diff --git a/web/src/components/filter/ReviewFilterGroup.tsx b/web/src/components/filter/ReviewFilterGroup.tsx index 6fb5c7d42..4ecf71c4e 100644 --- a/web/src/components/filter/ReviewFilterGroup.tsx +++ b/web/src/components/filter/ReviewFilterGroup.tsx @@ -2,7 +2,7 @@ import { LuCheck, LuVideo } from "react-icons/lu"; import { Button } from "../ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; import useSWR from "swr"; -import { FrigateConfig } from "@/types/frigateConfig"; +import { CameraGroupConfig, FrigateConfig } from "@/types/frigateConfig"; import { useCallback, useMemo, useState } from "react"; import { DropdownMenu, @@ -16,6 +16,8 @@ import { ReviewFilter } from "@/types/review"; import { getEndOfDayTimestamp } from "@/utils/dateUtil"; import { useFormattedTimestamp } from "@/hooks/use-date-utils"; import { FaCalendarAlt, FaFilter, FaVideo } from "react-icons/fa"; +import { getIconTypeForGroup } from "@/utils/iconUtil"; +import { IconType } from "react-icons"; const ATTRIBUTES = ["amazon", "face", "fedex", "license_plate", "ups"]; @@ -57,6 +59,16 @@ export default function ReviewFilterGroup({ [config, allLabels], ); + const groups = useMemo(() => { + if (!config) { + return []; + } + + return Object.entries(config.camera_groups).sort( + (a, b) => a[1].order - b[1].order, + ); + }, [config]); + // handle updating filters const onUpdateSelectedDay = useCallback( @@ -74,6 +86,7 @@ export default function ReviewFilterGroup({
{ onUpdateFilter({ ...filter, cameras: newCameras }); @@ -102,11 +115,13 @@ export default function ReviewFilterGroup({ type CameraFilterButtonProps = { allCameras: string[]; + groups: [string, CameraGroupConfig][]; selectedCameras: string[] | undefined; updateCameraFilter: (cameras: string[] | undefined) => void; }; function CamerasFilterButton({ allCameras, + groups, selectedCameras, updateCameraFilter, }: CameraFilterButtonProps) { @@ -144,6 +159,24 @@ function CamerasFilterButton({ } }} /> + {groups.length > 0 && ( + <> + + {groups.map(([name, conf]) => { + return ( + { + setCurrentCameras([...conf.cameras]); + }} + /> + ); + })} + + )} {allCameras.map((item) => ( void; }; function FilterCheckBox({ label, + CheckIcon = LuCheck, isChecked, onCheckedChange, }: FilterCheckBoxProps) { @@ -366,7 +401,7 @@ function FilterCheckBox({ onClick={() => onCheckedChange(!isChecked)} > {isChecked ? ( - + ) : (
)} diff --git a/web/src/components/navigation/Sidebar.tsx b/web/src/components/navigation/Sidebar.tsx index 1fdea0c41..450e75bce 100644 --- a/web/src/components/navigation/Sidebar.tsx +++ b/web/src/components/navigation/Sidebar.tsx @@ -11,7 +11,7 @@ function Sidebar() { {navbarLinks.map((item) => ( ; +} + export function getIconForLabel(label: string, className?: string) { switch (label) { case "car":