diff --git a/web/src/components/filter/ReviewFilterGroup.tsx b/web/src/components/filter/ReviewFilterGroup.tsx index d6df53987..76274ec3f 100644 --- a/web/src/components/filter/ReviewFilterGroup.tsx +++ b/web/src/components/filter/ReviewFilterGroup.tsx @@ -454,6 +454,24 @@ export function GeneralFilterContent({ onClose, }: GeneralFilterContentProps) { const { t } = useTranslation(["components/filter", "views/events"]); + const { data: config } = useSWR("config", { + revalidateOnFocus: false, + }); + const allAudioListenLabels = useMemo(() => { + if (!config) { + return []; + } + + const labels = new Set(); + Object.values(config.cameras).forEach((camera) => { + if (camera?.audio?.enabled) { + camera.audio.listen.forEach((label) => { + labels.add(label); + }); + } + }); + return [...labels].sort(); + }, [config]); return ( <>
@@ -504,7 +522,10 @@ export function GeneralFilterContent({ {allLabels.map((item) => ( { if (isChecked) { diff --git a/web/src/components/input/InputWithTags.tsx b/web/src/components/input/InputWithTags.tsx index 199209c7c..d1bd4da40 100755 --- a/web/src/components/input/InputWithTags.tsx +++ b/web/src/components/input/InputWithTags.tsx @@ -81,6 +81,22 @@ export default function InputWithTags({ revalidateOnFocus: false, }); + const allAudioListenLabels = useMemo(() => { + if (!config) { + return []; + } + + const labels = new Set(); + Object.values(config.cameras).forEach((camera) => { + if (camera?.audio?.enabled) { + camera.audio.listen.forEach((label) => { + labels.add(label); + }); + } + }); + return [...labels].sort(); + }, [config]); + const [inputValue, setInputValue] = useState(search || ""); const [currentFilterType, setCurrentFilterType] = useState( null, @@ -421,7 +437,11 @@ export default function InputWithTags({ ? t("button.yes", { ns: "common" }) : t("button.no", { ns: "common" }); } else if (filterType === "labels") { - return getTranslatedLabel(String(filterValues)); + const value = String(filterValues); + return getTranslatedLabel( + value, + allAudioListenLabels.includes(value) ? "audio" : "object", + ); } else if (filterType === "search_type") { return t("filter.searchType." + String(filterValues)); } else { @@ -828,7 +848,12 @@ export default function InputWithTags({ > {t("filter.label." + filterType)}:{" "} {filterType === "labels" ? ( - getTranslatedLabel(value) + getTranslatedLabel( + value, + allAudioListenLabels.includes(value) + ? "audio" + : "object", + ) ) : filterType === "cameras" ? ( ) : filterType === "zones" ? ( diff --git a/web/src/components/timeline/DetailStream.tsx b/web/src/components/timeline/DetailStream.tsx index 6127ab832..20bac9116 100644 --- a/web/src/components/timeline/DetailStream.tsx +++ b/web/src/components/timeline/DetailStream.tsx @@ -478,7 +478,7 @@ function ReviewGroup({
{getIconForLabel(audioLabel, "size-3 text-white")}
- {getTranslatedLabel(audioLabel)} + {getTranslatedLabel(audioLabel, "audio")}
))} @@ -513,7 +513,28 @@ function EventList({ const isSelected = selectedObjectIds.includes(event.id); - const label = event.sub_label || getTranslatedLabel(event.label); + const allAudioListenLabels = useMemo(() => { + if (!config) { + return []; + } + + const labels = new Set(); + Object.values(config.cameras).forEach((camera) => { + if (camera?.audio?.enabled) { + camera.audio.listen.forEach((label) => { + labels.add(label); + }); + } + }); + return [...labels].sort(); + }, [config]); + + const label = + event.sub_label || + getTranslatedLabel( + event.label, + allAudioListenLabels.includes(event.label) ? "audio" : "object", + ); const handleObjectSelect = (event: Event | undefined) => { if (event) {