mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Ensure all cameras switch enables/disables each individual switch (#13716)
This commit is contained in:
		
							parent
							
								
									ba49054cd7
								
							
						
					
					
						commit
						90c1cc3e3b
					
				| @ -29,7 +29,10 @@ export function CamerasFilterButton({ | |||||||
| }: CameraFilterButtonProps) { | }: CameraFilterButtonProps) { | ||||||
|   const [open, setOpen] = useState(false); |   const [open, setOpen] = useState(false); | ||||||
|   const [currentCameras, setCurrentCameras] = useState<string[] | undefined>( |   const [currentCameras, setCurrentCameras] = useState<string[] | undefined>( | ||||||
|     selectedCameras, |     selectedCameras === undefined ? [...allCameras] : selectedCameras, | ||||||
|  |   ); | ||||||
|  |   const [allCamerasSelected, setAllCamerasSelected] = useState( | ||||||
|  |     selectedCameras === undefined, | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   const buttonText = useMemo(() => { |   const buttonText = useMemo(() => { | ||||||
| @ -37,12 +40,18 @@ export function CamerasFilterButton({ | |||||||
|       return "Cameras"; |       return "Cameras"; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!selectedCameras || selectedCameras.length == 0) { |     if (allCamerasSelected) { | ||||||
|       return "All Cameras"; |       return "All Cameras"; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return `${selectedCameras.includes("birdseye") ? selectedCameras.length - 1 : selectedCameras.length} Camera${selectedCameras.length !== 1 ? "s" : ""}`; |     if (!currentCameras || currentCameras.length === 0) { | ||||||
|   }, [selectedCameras]); |       return "No cameras"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return `${currentCameras.includes("birdseye") ? currentCameras.length - 1 : currentCameras.length} Camera${ | ||||||
|  |       currentCameras.length !== 1 ? "s" : "" | ||||||
|  |     }`;
 | ||||||
|  |   }, [allCamerasSelected, currentCameras]); | ||||||
| 
 | 
 | ||||||
|   const trigger = ( |   const trigger = ( | ||||||
|     <Button |     <Button | ||||||
| @ -72,11 +81,15 @@ export function CamerasFilterButton({ | |||||||
|       )} |       )} | ||||||
|       <div className="scrollbar-container h-auto max-h-[80dvh] overflow-y-auto overflow-x-hidden p-4"> |       <div className="scrollbar-container h-auto max-h-[80dvh] overflow-y-auto overflow-x-hidden p-4"> | ||||||
|         <FilterSwitch |         <FilterSwitch | ||||||
|           isChecked={currentCameras == undefined} |           isChecked={allCamerasSelected} | ||||||
|           label="All Cameras" |           label="All Cameras" | ||||||
|           onCheckedChange={(isChecked) => { |           onCheckedChange={(isChecked) => { | ||||||
|  |             setAllCamerasSelected(isChecked); | ||||||
|  | 
 | ||||||
|             if (isChecked) { |             if (isChecked) { | ||||||
|               setCurrentCameras(undefined); |               setCurrentCameras([...allCameras]); | ||||||
|  |             } else { | ||||||
|  |               setCurrentCameras([]); | ||||||
|             } |             } | ||||||
|           }} |           }} | ||||||
|         /> |         /> | ||||||
| @ -108,19 +121,26 @@ export function CamerasFilterButton({ | |||||||
|                   const updatedCameras = currentCameras |                   const updatedCameras = currentCameras | ||||||
|                     ? [...currentCameras] |                     ? [...currentCameras] | ||||||
|                     : []; |                     : []; | ||||||
| 
 |  | ||||||
|                   updatedCameras.push(item); |                   updatedCameras.push(item); | ||||||
|                   setCurrentCameras(updatedCameras); |                   setCurrentCameras(updatedCameras); | ||||||
|  | 
 | ||||||
|  |                   // Check if all cameras are now selected
 | ||||||
|  |                   setAllCamerasSelected( | ||||||
|  |                     updatedCameras.length === allCameras.length, | ||||||
|  |                   ); | ||||||
|                 } else { |                 } else { | ||||||
|                   const updatedCameras = currentCameras |                   const updatedCameras = currentCameras | ||||||
|                     ? [...currentCameras] |                     ? [...currentCameras] | ||||||
|                     : []; |                     : []; | ||||||
|  |                   const index = updatedCameras.indexOf(item); | ||||||
| 
 | 
 | ||||||
|                   // can not deselect the last item
 |                   if (index > -1) { | ||||||
|                   if (updatedCameras.length > 1) { |                     updatedCameras.splice(index, 1); | ||||||
|                     updatedCameras.splice(updatedCameras.indexOf(item), 1); |  | ||||||
|                     setCurrentCameras(updatedCameras); |                     setCurrentCameras(updatedCameras); | ||||||
|                   } |                   } | ||||||
|  | 
 | ||||||
|  |                   // Deselecting one camera should disable the "All Cameras" switch
 | ||||||
|  |                   setAllCamerasSelected(false); | ||||||
|                 } |                 } | ||||||
|               }} |               }} | ||||||
|             /> |             /> | ||||||
| @ -131,8 +151,9 @@ export function CamerasFilterButton({ | |||||||
|       <div className="flex items-center justify-evenly p-2"> |       <div className="flex items-center justify-evenly p-2"> | ||||||
|         <Button |         <Button | ||||||
|           variant="select" |           variant="select" | ||||||
|  |           disabled={currentCameras?.length === 0} | ||||||
|           onClick={() => { |           onClick={() => { | ||||||
|             updateCameraFilter(currentCameras); |             updateCameraFilter(allCamerasSelected ? undefined : currentCameras); | ||||||
|             setOpen(false); |             setOpen(false); | ||||||
|           }} |           }} | ||||||
|         > |         > | ||||||
| @ -140,7 +161,8 @@ export function CamerasFilterButton({ | |||||||
|         </Button> |         </Button> | ||||||
|         <Button |         <Button | ||||||
|           onClick={() => { |           onClick={() => { | ||||||
|             setCurrentCameras(undefined); |             setCurrentCameras([...allCameras]); | ||||||
|  |             setAllCamerasSelected(true); | ||||||
|             updateCameraFilter(undefined); |             updateCameraFilter(undefined); | ||||||
|           }} |           }} | ||||||
|         > |         > | ||||||
| @ -156,7 +178,8 @@ export function CamerasFilterButton({ | |||||||
|         open={open} |         open={open} | ||||||
|         onOpenChange={(open) => { |         onOpenChange={(open) => { | ||||||
|           if (!open) { |           if (!open) { | ||||||
|             setCurrentCameras(selectedCameras); |             setCurrentCameras(selectedCameras ?? allCameras); | ||||||
|  |             setAllCamerasSelected(selectedCameras === undefined); | ||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           setOpen(open); |           setOpen(open); | ||||||
| @ -176,9 +199,9 @@ export function CamerasFilterButton({ | |||||||
|       open={open} |       open={open} | ||||||
|       onOpenChange={(open) => { |       onOpenChange={(open) => { | ||||||
|         if (!open) { |         if (!open) { | ||||||
|           setCurrentCameras(selectedCameras); |           setCurrentCameras(selectedCameras ?? allCameras); | ||||||
|  |           setAllCamerasSelected(selectedCameras === undefined); | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         setOpen(open); |         setOpen(open); | ||||||
|       }} |       }} | ||||||
|     > |     > | ||||||
|  | |||||||
| @ -199,7 +199,7 @@ export default function SearchDetailDialog({ | |||||||
|         {page == "video" && <VideoTab search={search} config={config} />} |         {page == "video" && <VideoTab search={search} config={config} />} | ||||||
|         {page == "object lifecycle" && ( |         {page == "object lifecycle" && ( | ||||||
|           <ObjectLifecycle |           <ObjectLifecycle | ||||||
|             className="w-full" |             className="w-full overflow-x-hidden" | ||||||
|             event={search as unknown as Event} |             event={search as unknown as Event} | ||||||
|             fullscreen={true} |             fullscreen={true} | ||||||
|             setPane={() => {}} |             setPane={() => {}} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user