mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-08-22 13:47:29 +02:00
Add cameras filter to history view (#16995)
This commit is contained in:
parent
f81bab8895
commit
0e3e2e5ccc
@ -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 isn’t 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
|
||||||
|
@ -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 });
|
||||||
}}
|
}}
|
||||||
|
@ -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={() => {}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
Loading…
Reference in New Issue
Block a user