From 87a85ce8d9c6f3f2c5c5b0590280f3ab69f7fbfa Mon Sep 17 00:00:00 2001 From: Dermot Duffy Date: Sat, 21 Feb 2026 19:58:15 -0800 Subject: [PATCH] fix: Add missing capabilities to editor (#2366) --- src/editor.ts | 74 ++++++++++++++-------------------- src/localize/languages/en.json | 5 ++- 2 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/editor.ts b/src/editor.ts index 11a76293..be3cbd13 100644 --- a/src/editor.ts +++ b/src/editor.ts @@ -269,6 +269,7 @@ import { sideLoadHomeAssistantElements } from './ha/side-load-ha-elements.js'; import { HomeAssistant, LovelaceCardEditor } from './ha/types.js'; import { localize } from './localize/localize.js'; import editorStyle from './scss/editor.scss'; +import type { CapabilityKey } from './types.js'; import { arrayMove, prettifyTitle } from './utils/basic.js'; import { getCameraID } from './utils/camera.js'; import { fireAdvancedCameraCardEvent } from './utils/fire-advanced-camera-card-event.js'; @@ -978,49 +979,36 @@ export class AdvancedCameraCardEditor extends LitElement implements LovelaceCard }, ]; - private _capabilities: EditorSelectOption[] = [ - { value: '', label: '' }, - { - value: 'live', - label: localize('config.cameras.capabilities.capabilities.live'), - }, - { - value: 'substream', - label: localize('config.cameras.capabilities.capabilities.substream'), - }, - { - value: 'clips', - label: localize('config.cameras.capabilities.capabilities.clips'), - }, - { - value: 'recordings', - label: localize('config.cameras.capabilities.capabilities.recordings'), - }, - { - value: 'snapshots', - label: localize('config.cameras.capabilities.capabilities.snapshots'), - }, - { - value: 'favorite-events', - label: localize('config.cameras.capabilities.capabilities.favorite-events'), - }, - { - value: 'favorite-recordings', - label: localize('config.cameras.capabilities.capabilities.favorite-recordings'), - }, - { - value: 'seek', - label: localize('config.cameras.capabilities.capabilities.seek'), - }, - { - value: 'ptz', - label: localize('config.cameras.capabilities.capabilities.ptz'), - }, - { - value: 'menu', - label: localize('config.cameras.capabilities.capabilities.menu'), - }, - ]; + private _capabilities: EditorSelectOption[] = (() => { + // 'satisfies' enforces all CapabilityKey values are present at compile time. + const labels = { + '2-way-audio': localize('config.cameras.capabilities.capabilities.2-way-audio'), + clips: localize('config.cameras.capabilities.capabilities.clips'), + 'favorite-events': localize( + 'config.cameras.capabilities.capabilities.favorite-events', + ), + 'favorite-recordings': localize( + 'config.cameras.capabilities.capabilities.favorite-recordings', + ), + live: localize('config.cameras.capabilities.capabilities.live'), + menu: localize('config.cameras.capabilities.capabilities.menu'), + ptz: localize('config.cameras.capabilities.capabilities.ptz'), + recordings: localize('config.cameras.capabilities.capabilities.recordings'), + 'remote-control-entity': localize( + 'config.cameras.capabilities.capabilities.remote-control-entity', + ), + reviews: localize('config.cameras.capabilities.capabilities.reviews'), + seek: localize('config.cameras.capabilities.capabilities.seek'), + snapshots: localize('config.cameras.capabilities.capabilities.snapshots'), + substream: localize('config.cameras.capabilities.capabilities.substream'), + trigger: localize('config.cameras.capabilities.capabilities.trigger'), + } satisfies Record; + + return [ + { value: '', label: '' }, + ...Object.entries(labels).map(([value, label]) => ({ value, label })), + ]; + })(); private _forceableCapabilities: EditorSelectOption[] = [ { value: '', label: '' }, diff --git a/src/localize/languages/en.json b/src/localize/languages/en.json index f1f922d5..7ee9978b 100644 --- a/src/localize/languages/en.json +++ b/src/localize/languages/en.json @@ -38,9 +38,12 @@ "menu": "Menu", "ptz": "PTZ", "recordings": "Recordings", + "remote-control-entity": "Remote Control Entity", + "reviews": "Reviews", "seek": "Seeking", "snapshots": "Snapshots", - "substream": "Substream" + "substream": "Substream", + "trigger": "Trigger" }, "disable": "Disable", "disable_except": "Disable except",