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

View File

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

View File

@ -442,7 +442,7 @@ export function RecordingView({
)} )}
{isDesktop && ( {isDesktop && (
<ReviewFilterGroup <ReviewFilterGroup
filters={["date", "general"]} filters={["cameras", "date", "general"]}
reviewSummary={reviewSummary} reviewSummary={reviewSummary}
recordingsSummary={recordingsSummary} recordingsSummary={recordingsSummary}
filter={filter} filter={filter}
@ -450,7 +450,22 @@ export function RecordingView({
filterList={reviewFilterList} filterList={reviewFilterList}
showReviewed showReviewed
setShowReviewed={() => {}} 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={() => {}} setMotionOnly={() => {}}
/> />
)} )}