diff --git a/src/components/ha-selector/ha-selector-entity.ts b/src/components/ha-selector/ha-selector-entity.ts index 2facd604ba..9159a5dd7b 100644 --- a/src/components/ha-selector/ha-selector-entity.ts +++ b/src/components/ha-selector/ha-selector-entity.ts @@ -50,7 +50,12 @@ export class HaEntitySelector extends SubscribeMixin(LitElement) { private _filterEntities = (entity: HassEntity): boolean => { if (this.selector.entity?.domain) { - if (computeStateDomain(entity) !== this.selector.entity.domain) { + const filterDomain = this.selector.entity.domain; + const entityDomain = computeStateDomain(entity); + if ( + (Array.isArray(filterDomain) && !filterDomain.includes(entityDomain)) || + entityDomain !== filterDomain + ) { return false; } } diff --git a/src/components/ha-selector/ha-selector-text.ts b/src/components/ha-selector/ha-selector-text.ts index 6827de4ac6..2e6c879d9e 100644 --- a/src/components/ha-selector/ha-selector-text.ts +++ b/src/components/ha-selector/ha-selector-text.ts @@ -76,6 +76,7 @@ export class HaTextSelector extends LitElement { if (value === "" && !this.required) { value = undefined; } + fireEvent(this, "value-changed", { value }); } diff --git a/src/data/selector.ts b/src/data/selector.ts index b51c077b01..f3d1d39c71 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -20,7 +20,7 @@ export type Selector = export interface EntitySelector { entity: { integration?: string; - domain?: string; + domain?: string | string[]; device_class?: string; }; } diff --git a/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts index 2656a291f2..a0e1694d3b 100644 --- a/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts @@ -1,5 +1,5 @@ -import "@polymer/paper-input/paper-input"; -import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import "../../../../components/ha-form/ha-form"; +import { html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { assert, @@ -10,18 +10,13 @@ import { optional, string, } from "superstruct"; +import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { computeRTLDirection } from "../../../../common/util/compute_rtl"; -import "../../../../components/ha-formfield"; -import "../../../../components/ha-switch"; -import { HomeAssistant } from "../../../../types"; -import { GaugeCardConfig, SeverityConfig } from "../../cards/types"; -import "../../components/hui-entity-editor"; -import "../../components/hui-theme-select-editor"; -import { LovelaceCardEditor } from "../../types"; +import type { HaFormSchema } from "../../../../components/ha-form/types"; +import type { HomeAssistant } from "../../../../types"; +import type { GaugeCardConfig } from "../../cards/types"; +import type { LovelaceCardEditor } from "../../types"; import { baseLovelaceCardConfig } from "../structs/base-card-struct"; -import { EditorTarget, EntitiesEditorEvent } from "../types"; -import { configElementStyle } from "./config-elements-style"; const cardConfigStruct = assign( baseLovelaceCardConfig, @@ -37,8 +32,6 @@ const cardConfigStruct = assign( }) ); -const includeDomains = ["counter", "input_number", "number", "sensor"]; - @customElement("hui-gauge-card-editor") export class HuiGaugeCardEditor extends LitElement @@ -53,264 +46,145 @@ export class HuiGaugeCardEditor this._config = config; } - get _name(): string { - return this._config!.name || ""; - } + private _schema = memoizeOne((showSeverity: boolean) => { + const schema = [ + { + name: "entity", + selector: { + entity: { + domain: ["counter", "input_number", "number", "sensor"], + }, + }, + }, + { + name: "", + type: "grid", + schema: [ + { name: "name", selector: { text: {} } }, + { name: "unit", selector: { text: {} } }, + ], + }, + { name: "theme", selector: { theme: {} } }, + { + name: "", + type: "grid", + schema: [ + { name: "min", selector: { number: { min: 1, mode: "box" } } }, + { name: "max", selector: { number: { min: 1, mode: "box" } } }, + ], + }, + { + name: "", + type: "grid", + schema: [ + { name: "needle", selector: { boolean: {} } }, + { name: "show_severity", selector: { boolean: {} } }, + ], + }, + ]; - get _entity(): string { - return this._config!.entity || ""; - } + if (showSeverity) { + schema.push({ + name: "", + type: "grid", + schema: [ + { name: "green", selector: { number: { min: 0, mode: "box" } } }, + { name: "yellow", selector: { number: { min: 0, mode: "box" } } }, + { name: "red", selector: { number: { min: 0, mode: "box" } } }, + ], + }); + } - get _unit(): string { - return this._config!.unit || ""; - } - - get _theme(): string { - return this._config!.theme || ""; - } - - get _min(): number { - return this._config!.min || 0; - } - - get _max(): number { - return this._config!.max || 100; - } - - get _severity(): SeverityConfig | undefined { - return this._config!.severity || undefined; - } + return schema; + }); protected render(): TemplateResult { if (!this.hass || !this._config) { return html``; } + const schema = this._schema(this._config!.severity !== undefined); + const data = { + show_severity: this._config!.severity !== undefined, + ...this._config, + }; + return html` -