mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-20 13:54:36 +01:00
Export filter UI (#21322)
* Get started on export filters * implement basic filter * Implement filtering and adjust api * Improve filter handling * Improve navigation * Cleanup * handle scrolling
This commit is contained in:
67
web/src/components/filter/ExportFilterGroup.tsx
Normal file
67
web/src/components/filter/ExportFilterGroup.tsx
Normal file
@@ -0,0 +1,67 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import {
|
||||
DEFAULT_EXPORT_FILTERS,
|
||||
ExportFilter,
|
||||
ExportFilters,
|
||||
} from "@/types/export";
|
||||
import { CamerasFilterButton } from "./CamerasFilterButton";
|
||||
import { useAllowedCameras } from "@/hooks/use-allowed-cameras";
|
||||
import { useMemo } from "react";
|
||||
import { FrigateConfig } from "@/types/frigateConfig";
|
||||
import useSWR from "swr";
|
||||
|
||||
type ExportFilterGroupProps = {
|
||||
className: string;
|
||||
filters?: ExportFilters[];
|
||||
filter?: ExportFilter;
|
||||
onUpdateFilter: (filter: ExportFilter) => void;
|
||||
};
|
||||
export default function ExportFilterGroup({
|
||||
className,
|
||||
filter,
|
||||
filters = DEFAULT_EXPORT_FILTERS,
|
||||
onUpdateFilter,
|
||||
}: ExportFilterGroupProps) {
|
||||
const { data: config } = useSWR<FrigateConfig>("config", {
|
||||
revalidateOnFocus: false,
|
||||
});
|
||||
const allowedCameras = useAllowedCameras();
|
||||
|
||||
const filterValues = useMemo(
|
||||
() => ({
|
||||
cameras: allowedCameras,
|
||||
}),
|
||||
[allowedCameras],
|
||||
);
|
||||
|
||||
const groups = useMemo(() => {
|
||||
if (!config) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return Object.entries(config.camera_groups).sort(
|
||||
(a, b) => a[1].order - b[1].order,
|
||||
);
|
||||
}, [config]);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
"scrollbar-container flex justify-center gap-2 overflow-x-auto",
|
||||
className,
|
||||
)}
|
||||
>
|
||||
{filters.includes("cameras") && (
|
||||
<CamerasFilterButton
|
||||
allCameras={filterValues.cameras}
|
||||
groups={groups}
|
||||
selectedCameras={filter?.cameras}
|
||||
hideText={false}
|
||||
updateCameraFilter={(newCameras) => {
|
||||
onUpdateFilter({ ...filter, cameras: newCameras });
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -21,3 +21,13 @@ export type DeleteClipType = {
|
||||
file: string;
|
||||
exportName: string;
|
||||
};
|
||||
|
||||
// filtering
|
||||
|
||||
const EXPORT_FILTERS = ["cameras"] as const;
|
||||
export type ExportFilters = (typeof EXPORT_FILTERS)[number];
|
||||
export const DEFAULT_EXPORT_FILTERS: ExportFilters[] = ["cameras"];
|
||||
|
||||
export type ExportFilter = {
|
||||
cameras?: string[];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user