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` -
- - - - - - - - - - - ${this._config!.severity !== undefined - ? html` - - - -
- ` - : ""} - + `; } - static get styles(): CSSResultGroup { - return [ - configElementStyle, - css` - .severity { - display: none; - width: 100%; - padding-left: 16px; - flex-direction: row; - flex-wrap: wrap; - } - .severity > * { - flex: 1 0 30%; - padding-right: 4px; - } - ha-switch[checked] ~ .severity { - display: flex; - } - `, - ]; - } + private _valueChanged(ev: CustomEvent): void { + let config = ev.detail.value; - private _toggleNeedle(ev: EntitiesEditorEvent): void { - if (!this._config || !this.hass) { - return; - } - if ((ev.target as EditorTarget).checked) { - this._config = { - ...this._config, - needle: true, - }; - } else { - this._config = { ...this._config }; - delete this._config.needle; - } - fireEvent(this, "config-changed", { config: this._config }); - } - - private _toggleSeverity(ev: EntitiesEditorEvent): void { - if (!this._config || !this.hass) { - return; - } - - if ((ev.target as EditorTarget).checked) { - this._config = { - ...this._config, + if (config.show_severity) { + config = { + ...config, severity: { - green: 0, - yellow: 0, - red: 0, + green: config.green || config.severity?.green || 0, + yellow: config.yellow || config.severity?.yellow || 0, + red: config.red || config.severity?.red || 0, }, }; - } else { - this._config = { ...this._config }; - delete this._config.severity; + } else if (!config.show_severity && config.severity) { + delete config.severity; } - fireEvent(this, "config-changed", { config: this._config }); + + delete config.show_severity; + delete config.green; + delete config.yellow; + delete config.red; + + fireEvent(this, "config-changed", { config }); } - private _severityChanged(ev: EntitiesEditorEvent): void { - if (!this._config || !this.hass) { - return; + private _computeLabelCallback = (schema: HaFormSchema) => { + switch (schema.name) { + case "name": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.generic.name" + ); + case "entity": + return `${this.hass!.localize( + "ui.panel.lovelace.editor.card.generic.entity" + )} (${this.hass!.localize( + "ui.panel.lovelace.editor.card.config.required" + )})`; + case "max": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.generic.maximum" + ); + case "min": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.generic.minimum" + ); + case "show_severity": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.gauge.severity.define" + ); + case "needle": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.gauge.needle_gauge" + ); } - const target = ev.target! as EditorTarget; - const severity = { - ...this._config.severity, - [target.configValue!]: Number(target.value), - }; - this._config = { - ...this._config, - severity, - }; - fireEvent(this, "config-changed", { config: this._config }); - } - - private _valueChanged(ev: EntitiesEditorEvent): void { - if (!this._config || !this.hass) { - return; - } - const target = ev.target! as EditorTarget; - - if (target.configValue) { - if ( - target.value === "" || - (target.type === "number" && isNaN(Number(target.value))) - ) { - this._config = { ...this._config }; - delete this._config[target.configValue!]; - } else { - let value: any = target.value; - if (target.type === "number") { - value = Number(value); - } - this._config = { ...this._config, [target.configValue!]: value }; - } - } - fireEvent(this, "config-changed", { config: this._config }); - } + return ( + this.hass!.localize( + `ui.panel.lovelace.editor.card.gauge.${schema.name}` + ) || + this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.${schema.name}` + ) || + this.hass!.localize( + `ui.panel.lovelace.editor.card.gauge.severity.${schema.name}` + ) + ); + }; } declare global {