mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-15 23:55:25 +03:00
move search type to settings
This commit is contained in:
parent
8c0781ad4a
commit
58a42a5fb9
@ -65,9 +65,7 @@ export default function SearchFilterDialog({
|
|||||||
(currentFilter.min_score ?? 0) > 0.5 ||
|
(currentFilter.min_score ?? 0) > 0.5 ||
|
||||||
(currentFilter.max_score ?? 1) < 1 ||
|
(currentFilter.max_score ?? 1) < 1 ||
|
||||||
(currentFilter.zones?.length ?? 0) > 0 ||
|
(currentFilter.zones?.length ?? 0) > 0 ||
|
||||||
(currentFilter.sub_labels?.length ?? 0) > 0 ||
|
(currentFilter.sub_labels?.length ?? 0) > 0),
|
||||||
(!currentFilter.search_type?.includes("similarity") &&
|
|
||||||
(currentFilter.search_type?.length ?? 2) !== 2)),
|
|
||||||
[currentFilter],
|
[currentFilter],
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -115,20 +113,6 @@ export default function SearchFilterDialog({
|
|||||||
setCurrentFilter({ ...currentFilter, min_score: min, max_score: max })
|
setCurrentFilter({ ...currentFilter, min_score: min, max_score: max })
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
{config?.semantic_search?.enabled &&
|
|
||||||
!currentFilter?.search_type?.includes("similarity") && (
|
|
||||||
<SearchTypeContent
|
|
||||||
searchSources={
|
|
||||||
currentFilter?.search_type ?? ["thumbnail", "description"]
|
|
||||||
}
|
|
||||||
setSearchSources={(newSearchSource) =>
|
|
||||||
setCurrentFilter({
|
|
||||||
...currentFilter,
|
|
||||||
search_type: newSearchSource,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{isDesktop && <DropdownMenuSeparator />}
|
{isDesktop && <DropdownMenuSeparator />}
|
||||||
<div className="flex items-center justify-evenly p-2">
|
<div className="flex items-center justify-evenly p-2">
|
||||||
<Button
|
<Button
|
||||||
@ -491,59 +475,3 @@ export function ScoreFilterContent({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
type SearchTypeContentProps = {
|
|
||||||
searchSources: SearchSource[] | undefined;
|
|
||||||
setSearchSources: (sources: SearchSource[] | undefined) => void;
|
|
||||||
};
|
|
||||||
export function SearchTypeContent({
|
|
||||||
searchSources,
|
|
||||||
setSearchSources,
|
|
||||||
}: SearchTypeContentProps) {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div className="overflow-x-hidden">
|
|
||||||
<DropdownMenuSeparator className="mb-3" />
|
|
||||||
<div className="text-lg">Search Sources</div>
|
|
||||||
<div className="mt-2.5 flex flex-col gap-2.5">
|
|
||||||
<FilterSwitch
|
|
||||||
label="Thumbnail Image"
|
|
||||||
isChecked={searchSources?.includes("thumbnail") ?? false}
|
|
||||||
onCheckedChange={(isChecked) => {
|
|
||||||
const updatedSources = searchSources ? [...searchSources] : [];
|
|
||||||
|
|
||||||
if (isChecked) {
|
|
||||||
updatedSources.push("thumbnail");
|
|
||||||
setSearchSources(updatedSources);
|
|
||||||
} else {
|
|
||||||
if (updatedSources.length > 1) {
|
|
||||||
const index = updatedSources.indexOf("thumbnail");
|
|
||||||
if (index !== -1) updatedSources.splice(index, 1);
|
|
||||||
setSearchSources(updatedSources);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<FilterSwitch
|
|
||||||
label="Description"
|
|
||||||
isChecked={searchSources?.includes("description") ?? false}
|
|
||||||
onCheckedChange={(isChecked) => {
|
|
||||||
const updatedSources = searchSources ? [...searchSources] : [];
|
|
||||||
|
|
||||||
if (isChecked) {
|
|
||||||
updatedSources.push("description");
|
|
||||||
setSearchSources(updatedSources);
|
|
||||||
} else {
|
|
||||||
if (updatedSources.length > 1) {
|
|
||||||
const index = updatedSources.indexOf("description");
|
|
||||||
if (index !== -1) updatedSources.splice(index, 1);
|
|
||||||
setSearchSources(updatedSources);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|||||||
@ -13,23 +13,36 @@ import {
|
|||||||
SelectTrigger,
|
SelectTrigger,
|
||||||
} from "@/components/ui/select";
|
} from "@/components/ui/select";
|
||||||
import { DropdownMenuSeparator } from "../ui/dropdown-menu";
|
import { DropdownMenuSeparator } from "../ui/dropdown-menu";
|
||||||
|
import FilterSwitch from "../filter/FilterSwitch";
|
||||||
|
import { SearchFilter, SearchSource } from "@/types/search";
|
||||||
|
import useSWR from "swr";
|
||||||
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
|
|
||||||
type SearchSettingsProps = {
|
type SearchSettingsProps = {
|
||||||
className?: string;
|
className?: string;
|
||||||
columns: number;
|
columns: number;
|
||||||
defaultView: string;
|
defaultView: string;
|
||||||
|
filter?: SearchFilter;
|
||||||
setColumns: (columns: number) => void;
|
setColumns: (columns: number) => void;
|
||||||
setDefaultView: (view: string) => void;
|
setDefaultView: (view: string) => void;
|
||||||
|
onUpdateFilter: (filter: SearchFilter) => void;
|
||||||
};
|
};
|
||||||
export default function SearchSettings({
|
export default function SearchSettings({
|
||||||
className,
|
className,
|
||||||
columns,
|
columns,
|
||||||
setColumns,
|
setColumns,
|
||||||
defaultView,
|
defaultView,
|
||||||
|
filter,
|
||||||
setDefaultView,
|
setDefaultView,
|
||||||
|
onUpdateFilter,
|
||||||
}: SearchSettingsProps) {
|
}: SearchSettingsProps) {
|
||||||
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
|
const [searchSources, setSearchSources] = useState<SearchSource[]>([
|
||||||
|
"thumbnail",
|
||||||
|
]);
|
||||||
|
|
||||||
const trigger = (
|
const trigger = (
|
||||||
<Button className="flex items-center gap-2" size="sm">
|
<Button className="flex items-center gap-2" size="sm">
|
||||||
<FaCog className="text-secondary-foreground" />
|
<FaCog className="text-secondary-foreground" />
|
||||||
@ -94,6 +107,15 @@ export default function SearchSettings({
|
|||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
{config?.semantic_search?.enabled && (
|
||||||
|
<SearchTypeContent
|
||||||
|
searchSources={searchSources}
|
||||||
|
setSearchSources={(sources) => {
|
||||||
|
setSearchSources(sources as SearchSource[]);
|
||||||
|
onUpdateFilter({ ...filter, search_type: sources });
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -113,3 +135,65 @@ export default function SearchSettings({
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SearchTypeContentProps = {
|
||||||
|
searchSources: SearchSource[] | undefined;
|
||||||
|
setSearchSources: (sources: SearchSource[] | undefined) => void;
|
||||||
|
};
|
||||||
|
export function SearchTypeContent({
|
||||||
|
searchSources,
|
||||||
|
setSearchSources,
|
||||||
|
}: SearchTypeContentProps) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="overflow-x-hidden">
|
||||||
|
<DropdownMenuSeparator className="mb-3" />
|
||||||
|
<div className="space-y-0.5">
|
||||||
|
<div className="text-md">Search Source</div>
|
||||||
|
<div className="space-y-1 text-xs text-muted-foreground">
|
||||||
|
Choose whether to search the thumbnails or descriptions of your
|
||||||
|
tracked objects.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="mt-2.5 flex flex-col gap-2.5">
|
||||||
|
<FilterSwitch
|
||||||
|
label="Thumbnail Image"
|
||||||
|
isChecked={searchSources?.includes("thumbnail") ?? false}
|
||||||
|
onCheckedChange={(isChecked) => {
|
||||||
|
const updatedSources = searchSources ? [...searchSources] : [];
|
||||||
|
|
||||||
|
if (isChecked) {
|
||||||
|
updatedSources.push("thumbnail");
|
||||||
|
setSearchSources(updatedSources);
|
||||||
|
} else {
|
||||||
|
if (updatedSources.length > 1) {
|
||||||
|
const index = updatedSources.indexOf("thumbnail");
|
||||||
|
if (index !== -1) updatedSources.splice(index, 1);
|
||||||
|
setSearchSources(updatedSources);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<FilterSwitch
|
||||||
|
label="Description"
|
||||||
|
isChecked={searchSources?.includes("description") ?? false}
|
||||||
|
onCheckedChange={(isChecked) => {
|
||||||
|
const updatedSources = searchSources ? [...searchSources] : [];
|
||||||
|
|
||||||
|
if (isChecked) {
|
||||||
|
updatedSources.push("description");
|
||||||
|
setSearchSources(updatedSources);
|
||||||
|
} else {
|
||||||
|
if (updatedSources.length > 1) {
|
||||||
|
const index = updatedSources.indexOf("description");
|
||||||
|
if (index !== -1) updatedSources.splice(index, 1);
|
||||||
|
setSearchSources(updatedSources);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@ -373,6 +373,8 @@ export default function SearchView({
|
|||||||
setColumns={setColumns}
|
setColumns={setColumns}
|
||||||
defaultView={defaultView}
|
defaultView={defaultView}
|
||||||
setDefaultView={setDefaultView}
|
setDefaultView={setDefaultView}
|
||||||
|
filter={searchFilter}
|
||||||
|
onUpdateFilter={onUpdateFilter}
|
||||||
/>
|
/>
|
||||||
<ScrollBar orientation="horizontal" className="h-0" />
|
<ScrollBar orientation="horizontal" className="h-0" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user