diff --git a/web/src/components/overlay/CreateTriggerDialog.tsx b/web/src/components/overlay/CreateTriggerDialog.tsx index f3a8a22bd..620d3fe62 100644 --- a/web/src/components/overlay/CreateTriggerDialog.tsx +++ b/web/src/components/overlay/CreateTriggerDialog.tsx @@ -60,6 +60,7 @@ type CreateTriggerDialogProps = { data: string, threshold: number, actions: TriggerAction[], + friendly_name: string, ) => void; onEdit: (trigger: Trigger) => void; onCancel: () => void; @@ -102,6 +103,7 @@ export default function CreateTriggerDialog({ !existingTriggerNames.includes(value) || value === trigger?.name, t("triggers.dialog.form.name.error.alreadyExists"), ), + friendly_name: z.string().optional(), type: z.enum(["thumbnail", "description"]), data: z.string().min(1, t("triggers.dialog.form.content.error.required")), threshold: z @@ -117,6 +119,7 @@ export default function CreateTriggerDialog({ defaultValues: { enabled: trigger?.enabled ?? true, name: trigger?.name ?? "", + friendly_name: trigger?.friendly_name ?? "", type: trigger?.type ?? "description", data: trigger?.data ?? "", threshold: trigger?.threshold ?? 0.5, @@ -135,6 +138,7 @@ export default function CreateTriggerDialog({ values.data, values.threshold, values.actions, + values.friendly_name ?? "", ); } }; @@ -144,6 +148,7 @@ export default function CreateTriggerDialog({ form.reset({ enabled: true, name: "", + friendly_name: "", type: "description", data: "", threshold: 0.5, @@ -154,6 +159,7 @@ export default function CreateTriggerDialog({ { enabled: trigger.enabled, name: trigger.name, + friendly_name: trigger.friendly_name ?? "", type: trigger.type, data: trigger.data, threshold: trigger.threshold, @@ -231,6 +237,31 @@ export default function CreateTriggerDialog({ )} /> + ( + + + {t("triggers.dialog.form.friendly_name.title")} + + + + + + {t("triggers.dialog.form.friendly_name.description")} + + + + )} + /> + { if ( !config || @@ -93,6 +107,7 @@ export default function TriggerView({ ).map(([name, trigger]) => ({ enabled: trigger.enabled, name, + friendly_name: trigger.friendly_name, type: trigger.type, data: trigger.data, threshold: trigger.threshold, @@ -139,7 +154,8 @@ export default function TriggerView({ const saveToConfig = useCallback( (trigger: Trigger, isEdit: boolean) => { setIsLoading(true); - const { enabled, name, type, data, threshold, actions } = trigger; + const { enabled, name, type, data, threshold, actions, friendly_name } = + trigger; const embeddingBody: TriggerEmbeddingBody = { type, data, threshold }; const embeddingUrl = isEdit ? `/trigger/embedding/${selectedCamera}/${name}` @@ -162,6 +178,7 @@ export default function TriggerView({ data, threshold, actions, + friendly_name, }, }, }, @@ -220,9 +237,21 @@ export default function TriggerView({ data: string, threshold: number, actions: TriggerAction[], + friendly_name: string, ) => { setUnsavedChanges(true); - saveToConfig({ enabled, name, type, data, threshold, actions }, false); + saveToConfig( + { + enabled, + name, + type, + data, + threshold, + actions, + friendly_name, + }, + false, + ); }, [saveToConfig, setUnsavedChanges], ); @@ -359,7 +388,7 @@ export default function TriggerView({ // for adding a trigger with event id via explore context menu useSearchEffect("event_id", (eventId: string) => { - if (!config || isLoading) { + if (!config || isLoading || !isSemanticSearchEnabled) { return false; } setShowCreate(true); @@ -386,189 +415,227 @@ export default function TriggerView({
-
-
- - {t("triggers.management.title")} - -

- {t("triggers.management.desc", { - camera: cameraName, - })} -

-
- -
-
-
-
- {triggers.length === 0 ? ( -
-

- {t("triggers.table.noTriggers")} -

-
- ) : ( -
- {triggers.map((trigger) => ( -
+
+ + {t("triggers.management.title")} + +

+ {t("triggers.management.desc", { + camera: cameraName, + })} +

+ + + {t("triggers.semanticSearch.title")} + + + triggers.semanticSearch.desc + +
+ -
-
-

- {trigger.name} -

-
-
- - {t(`triggers.type.${trigger.type}`)} - -
- - -
- {t("triggers.table.lastTriggered")}:{" "} - {trigger_status && - trigger_status.triggers[trigger.name] - ?.last_triggered - ? formatUnixTimestampToDateTime( - trigger_status.triggers[trigger.name] - ?.last_triggered, - { - timezone: config.ui.timezone, - date_format: - config.ui.time_format == "24hour" - ? t( - "time.formattedTimestamp2.24hour", - { - ns: "common", - }, - ) - : t( - "time.formattedTimestamp2.12hour", - { - ns: "common", - }, - ), - time_style: "medium", - date_style: "medium", - }, - ) - : "Never"} - - - - - - {t("details.item.button.viewInExplore", { - ns: "views/explore", - })} - - -
- -
-
- -
- - - - - - -

{t("triggers.table.edit")}

-
-
- - - - - -

{t("triggers.table.deleteTrigger")}

-
-
-
-
-
- ))} -
- )} + {t("readTheDocumentation", { ns: "common" })}{" "} + + +
+ +
-
+ ) : ( + <> +
+
+ + {t("triggers.management.title")} + +

+ {t("triggers.management.desc", { + camera: cameraName, + })} +

+
+ +
+
+
+
+ {triggers.length === 0 ? ( +
+

+ {t("triggers.table.noTriggers")} +

+
+ ) : ( +
+ {triggers.map((trigger) => ( +
+
+
+

+ {trigger.friendly_name || trigger.name} +

+
+
+ + {t(`triggers.type.${trigger.type}`)} + +
+ + +
+ {t("triggers.table.lastTriggered")}:{" "} + {trigger_status && + trigger_status.triggers[trigger.name] + ?.last_triggered + ? formatUnixTimestampToDateTime( + trigger_status.triggers[trigger.name] + ?.last_triggered, + { + timezone: config.ui.timezone, + date_format: + config.ui.time_format == "24hour" + ? t( + "time.formattedTimestamp2.24hour", + { + ns: "common", + }, + ) + : t( + "time.formattedTimestamp2.12hour", + { + ns: "common", + }, + ), + time_style: "medium", + date_style: "medium", + }, + ) + : "Never"} + + + + + + {t("details.item.button.viewInExplore", { + ns: "views/explore", + })} + + +
+ +
+
+ +
+ + + + + + +

{t("triggers.table.edit")}

+
+
+ + + + + +

{t("triggers.table.deleteTrigger")}

+
+
+
+
+
+ ))} +
+ )} +
+
+
+ + )}