/* eslint-disable @typescript-eslint/no-explicit-any */ import { CSSResultGroup, LitElement, TemplateResult, html, unsafeCSS } from 'lit'; import { customElement, property, state } from 'lit/decorators'; import { HomeAssistant, LovelaceCardEditor, fireEvent } from 'custom-card-helpers'; import { localize } from './localize/localize'; import type { FrigateCardConfig } from './types'; import frigate_card_editor_style from './scss/editor.scss'; const options = { required: { icon: 'cog', name: localize('editor.required'), secondary: localize('editor.required_secondary'), show: true, }, optional: { icon: 'tune', name: localize('editor.optional'), secondary: localize('editor.optional_secondary'), show: false, }, appearance: { icon: 'palette', name: localize('editor.appearance'), secondary: localize('editor.appearance_secondary'), show: false, }, webrtc: { icon: 'webrtc', name: localize('editor.webrtc'), secondary: localize('editor.webrtc_secondary'), show: false, }, advanced: { icon: 'cogs', name: localize('editor.advanced'), secondary: localize('editor.advanced_secondary'), show: false, }, }; @customElement('frigate-card-editor') export class FrigateCardEditor extends LitElement implements LovelaceCardEditor { @property({ attribute: false }) public hass?: HomeAssistant; @state() private _config?: FrigateCardConfig; @state() private _toggle?: boolean; @state() private _helpers?: any; private _initialized = false; public setConfig(config: FrigateCardConfig): void { // Note: This does not use Zod to parse the configuration, so it may be // partially or completely invalid. It's more useful to have a partially // valid configuration here, to allow the user to fix the broken parts. this._config = config; this.loadCardHelpers(); } protected shouldUpdate(): boolean { if (!this._initialized) { this._initialize(); } return true; } protected _getEntities(domain: string): string[] { if (!this.hass) { return []; } const entities = Object.keys(this.hass.states).filter( (eid) => eid.substr(0, eid.indexOf('.')) === domain, ); entities.sort(); // Add a blank entry to unset a selection. entities.unshift(''); return entities; } protected render(): TemplateResult | void { if (!this.hass || !this._helpers) { return html``; } // The climate more-info has ha-switch and paper-dropdown-menu elements that are lazy loaded unless explicitly done here this._helpers.importMoreInfoControl('climate'); // You can restrict on domain type const cameraEntities = this._getEntities('camera'); const webrtcCameraEntity = this._config?.webrtc && (this._config?.webrtc as any).entity ? (this._config?.webrtc as any).entity : ''; const viewModes = { '': '', live: localize('menu.live'), clips: localize('menu.clips'), snapshots: localize('menu.snapshots'), clip: localize('menu.clip'), snapshot: localize('menu.snapshot'), }; const menuModes = { '': '', none: localize('menu_mode.none'), 'hidden-top': localize('menu_mode.hidden-top'), 'hidden-left': localize('menu_mode.hidden-left'), 'hidden-bottom': localize('menu_mode.hidden-bottom'), 'hidden-right': localize('menu_mode.hidden-right'), 'overlay-top': localize('menu_mode.overlay-top'), 'overlay-left': localize('menu_mode.overlay-left'), 'overlay-bottom': localize('menu_mode.overlay-bottom'), 'overlay-right': localize('menu_mode.overlay-right'), 'hover-top': localize('menu_mode.hover-top'), 'hover-left': localize('menu_mode.hover-left'), 'hover-bottom': localize('menu_mode.hover-bottom'), 'hover-right': localize('menu_mode.hover-right'), above: localize('menu_mode.above'), below: localize('menu_mode.below'), }; const liveProvider = { '': '', frigate: localize('live_provider.frigate'), webrtc: localize('live_provider.webrtc'), }; const controlsNextPrev = { '': '', thumbnails: localize('control.thumbnails'), chevrons: localize('control.chevrons'), none: localize('control.none'), }; return html`