Add cameras filter to history view (#16995)

This commit is contained in:
Josh Hawkins 2025-03-06 20:00:15 -06:00 committed by GitHub
parent f81bab8895
commit 0e3e2e5ccc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 4 deletions

View File

@ -18,6 +18,7 @@ type CameraFilterButtonProps = {
groups: [string, CameraGroupConfig][];
selectedCameras: string[] | undefined;
hideText?: boolean;
mainCamera?: string;
updateCameraFilter: (cameras: string[] | undefined) => void;
};
export function CamerasFilterButton({
@ -25,6 +26,7 @@ export function CamerasFilterButton({
groups,
selectedCameras,
hideText = isMobile,
mainCamera,
updateCameraFilter,
}: CameraFilterButtonProps) {
const [open, setOpen] = useState(false);
@ -74,6 +76,7 @@ export function CamerasFilterButton({
allCameras={allCameras}
groups={groups}
currentCameras={currentCameras}
mainCamera={mainCamera}
setCurrentCameras={setCurrentCameras}
setOpen={setOpen}
updateCameraFilter={updateCameraFilter}
@ -120,6 +123,7 @@ export function CamerasFilterButton({
type CamerasFilterContentProps = {
allCameras: string[];
currentCameras: string[] | undefined;
mainCamera?: string;
groups: [string, CameraGroupConfig][];
setCurrentCameras: (cameras: string[] | undefined) => void;
setOpen: (open: boolean) => void;
@ -128,6 +132,7 @@ type CamerasFilterContentProps = {
export function CamerasFilterContent({
allCameras,
currentCameras,
mainCamera,
groups,
setCurrentCameras,
setOpen,
@ -178,12 +183,29 @@ export function CamerasFilterContent({
key={item}
isChecked={currentCameras?.includes(item) ?? false}
label={item.replaceAll("_", " ")}
disabled={
mainCamera !== undefined &&
currentCameras !== undefined &&
item === mainCamera
} // Disable only if mainCamera exists and cameras are filtered
onCheckedChange={(isChecked) => {
if (
mainCamera !== undefined && // Only enforce if mainCamera is defined
item === mainCamera &&
!isChecked &&
currentCameras !== undefined
) {
return; // Prevent deselecting mainCamera when filtered and mainCamera is defined
}
if (isChecked) {
const updatedCameras = currentCameras
? [...currentCameras]
: [];
updatedCameras.push(item);
: mainCamera !== undefined && item !== mainCamera // If mainCamera exists and this isnt it
? [mainCamera] // Start with mainCamera when transitioning from undefined
: []; // Otherwise start empty
if (!updatedCameras.includes(item)) {
updatedCameras.push(item);
}
setCurrentCameras(updatedCameras);
} else {
const updatedCameras = currentCameras

View File

@ -49,6 +49,7 @@ type ReviewFilterGroupProps = {
motionOnly: boolean;
filterList?: FilterList;
showReviewed: boolean;
mainCamera?: string;
setShowReviewed: (show: boolean) => void;
onUpdateFilter: (filter: ReviewFilter) => void;
setMotionOnly: React.Dispatch<React.SetStateAction<boolean>>;
@ -63,6 +64,7 @@ export default function ReviewFilterGroup({
motionOnly,
filterList,
showReviewed,
mainCamera,
setShowReviewed,
onUpdateFilter,
setMotionOnly,
@ -185,6 +187,7 @@ export default function ReviewFilterGroup({
allCameras={filterValues.cameras}
groups={groups}
selectedCameras={filter?.cameras}
mainCamera={mainCamera}
updateCameraFilter={(newCameras) => {
onUpdateFilter({ ...filter, cameras: newCameras });
}}

View File

@ -442,7 +442,7 @@ export function RecordingView({
)}
{isDesktop && (
<ReviewFilterGroup
filters={["date", "general"]}
filters={["cameras", "date", "general"]}
reviewSummary={reviewSummary}
recordingsSummary={recordingsSummary}
filter={filter}
@ -450,7 +450,22 @@ export function RecordingView({
filterList={reviewFilterList}
showReviewed
setShowReviewed={() => {}}
onUpdateFilter={updateFilter}
mainCamera={mainCamera}
onUpdateFilter={(newFilter: ReviewFilter) => {
const updatedCameras =
newFilter.cameras === undefined
? undefined // Respect undefined as "all cameras"
: newFilter.cameras
? Array.from(
new Set([mainCamera, ...(newFilter.cameras || [])]),
) // Include mainCamera if specific cameras are selected
: [mainCamera];
const adjustedFilter: ReviewFilter = {
...newFilter,
cameras: updatedCameras,
};
updateFilter(adjustedFilter);
}}
setMotionOnly={() => {}}
/>
)}