From 75bab2d6016559971533bc2a78471fa90c7c5dd0 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Mon, 9 Sep 2024 16:43:33 -0600 Subject: [PATCH] Separate out filters and clean up detail pane --- .../components/filter/SearchFilterGroup.tsx | 193 +++++++++++++----- web/src/components/icons/SubFilterIcon.tsx | 25 +++ .../overlay/detail/SearchDetailDialog.tsx | 5 +- web/src/types/search.ts | 10 + web/src/views/search/SearchView.tsx | 12 +- 5 files changed, 188 insertions(+), 57 deletions(-) create mode 100644 web/src/components/icons/SubFilterIcon.tsx diff --git a/web/src/components/filter/SearchFilterGroup.tsx b/web/src/components/filter/SearchFilterGroup.tsx index 3fdda71fe..3f36314f4 100644 --- a/web/src/components/filter/SearchFilterGroup.tsx +++ b/web/src/components/filter/SearchFilterGroup.tsx @@ -17,13 +17,16 @@ import { CamerasFilterButton } from "./CamerasFilterButton"; import { SearchFilter, SearchSource } from "@/types/search"; import { DateRange } from "react-day-picker"; import { cn } from "@/lib/utils"; +import SubFilterIcon from "../icons/SubFilterIcon"; +import { FaLocationDot } from "react-icons/fa6"; -const SEARCH_FILTERS = ["cameras", "date", "general", "sub"] as const; +const SEARCH_FILTERS = ["cameras", "date", "general", "zone", "sub"] as const; type SearchFilters = (typeof SEARCH_FILTERS)[number]; const DEFAULT_REVIEW_FILTERS: SearchFilters[] = [ "cameras", "date", "general", + "zone", "sub", ]; @@ -172,22 +175,26 @@ export default function SearchFilterGroup({ { onUpdateFilter({ ...filter, labels: newLabels }); }} - updateZoneFilter={(newZones) => - onUpdateFilter({ ...filter, zones: newZones }) - } updateSearchSourceFilter={(newSearchSource) => onUpdateFilter({ ...filter, search_type: newSearchSource }) } /> )} + {filters.includes("zone") && allZones.length > 0 && ( + + onUpdateFilter({ ...filter, zones: newZones }) + } + /> + )} {filters.includes("sub") && ( void; - updateZoneFilter: (zones: string[] | undefined) => void; updateSearchSourceFilter: (sources: SearchSource[]) => void; }; function GeneralFilterButton({ allLabels, selectedLabels, - allZones, - selectedZones, selectedSearchSources, updateLabelFilter, - updateZoneFilter, updateSearchSourceFilter, }: GeneralFilterButtonProps) { const [open, setOpen] = useState(false); const [currentLabels, setCurrentLabels] = useState( selectedLabels, ); - const [currentZones, setCurrentZones] = useState( - selectedZones, - ); const [currentSearchSources, setCurrentSearchSources] = useState< SearchSource[] >(selectedSearchSources); @@ -235,16 +233,14 @@ function GeneralFilterButton({ const trigger = ( + + + + ); +} + +type ZoneFilterButtonProps = { + allZones: string[]; + selectedZones?: string[]; + updateZoneFilter: (zones: string[] | undefined) => void; +}; +function ZoneFilterButton({ + allZones, + selectedZones, + updateZoneFilter, +}: ZoneFilterButtonProps) { + const [open, setOpen] = useState(false); + + const [currentZones, setCurrentZones] = useState( + selectedZones, + ); + + const trigger = ( + + ); + const content = ( + setOpen(false)} + /> + ); + + if (isMobile) { + return ( + { + if (!open) { + setCurrentZones(selectedZones); + } + + setOpen(open); + }} + > + {trigger} + + {content} + + + ); + } + + return ( + { + if (!open) { + setCurrentZones(selectedZones); + } + + setOpen(open); + }} + > + {trigger} + {content} + + ); +} + +type ZoneFilterContentProps = { + allZones?: string[]; + selectedZones?: string[]; + currentZones?: string[]; + updateZoneFilter?: (zones: string[] | undefined) => void; + setCurrentZones?: (zones: string[] | undefined) => void; + onClose: () => void; +}; +export function ZoneFilterContent({ + allZones, + selectedZones, + currentZones, + updateZoneFilter, + setCurrentZones, + onClose, +}: ZoneFilterContentProps) { + return ( + <> +
{allZones && setCurrentZones && ( <> @@ -495,18 +606,10 @@ export function GeneralFilterContent({