diff --git a/src/panels/lovelace/common/create-hui-element.js b/src/panels/lovelace/common/create-hui-element.js index 01bdded3ea..c68f1fee08 100644 --- a/src/panels/lovelace/common/create-hui-element.js +++ b/src/panels/lovelace/common/create-hui-element.js @@ -2,7 +2,7 @@ import "../elements/hui-icon-element"; import "../elements/hui-image-element"; import "../elements/hui-service-button-element"; import "../elements/hui-state-badge-element.js"; -import "../elements/hui-state-icon-element.js"; +import "../elements/hui-state-icon-element"; import "../elements/hui-state-label-element"; import { fireEvent } from "../../../common/dom/fire_event.js"; diff --git a/src/panels/lovelace/elements/hui-state-icon-element.js b/src/panels/lovelace/elements/hui-state-icon-element.js deleted file mode 100644 index 1ad1a3b4a7..0000000000 --- a/src/panels/lovelace/elements/hui-state-icon-element.js +++ /dev/null @@ -1,61 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag.js"; -import { PolymerElement } from "@polymer/polymer/polymer-element.js"; - -import "../../../components/entity/state-badge.js"; - -import ElementClickMixin from "../mixins/element-click-mixin.js"; -import { longPressBind } from "../common/directives/long-press-directive"; - -/* - * @appliesMixin ElementClickMixin - */ -class HuiStateIconElement extends ElementClickMixin(PolymerElement) { - static get template() { - return html` - - - `; - } - - static get properties() { - return { - hass: { - type: Object, - observer: "_hassChanged", - }, - _config: Object, - _stateObj: Object, - }; - } - - ready() { - super.ready(); - longPressBind(this); - this.addEventListener("ha-click", () => - this.handleClick(this.hass, this._config, false) - ); - this.addEventListener("ha-hold", () => - this.handleClick(this.hass, this._config, true) - ); - } - - setConfig(config) { - if (!config || !config.entity) { - throw Error("Error in element configuration"); - } - - this._config = config; - } - - _hassChanged(hass) { - this._stateObj = hass.states[this._config.entity]; - } -} -customElements.define("hui-state-icon-element", HuiStateIconElement); diff --git a/src/panels/lovelace/elements/hui-state-icon-element.ts b/src/panels/lovelace/elements/hui-state-icon-element.ts new file mode 100644 index 0000000000..d75098586a --- /dev/null +++ b/src/panels/lovelace/elements/hui-state-icon-element.ts @@ -0,0 +1,77 @@ +import { html, LitElement } from "@polymer/lit-element"; +import { TemplateResult } from "lit-html"; + +import "../../../components/entity/state-badge.js"; + +import { computeTooltip } from "../../../common/string/compute-tooltip"; +import { handleClick } from "../../../common/dom/handle-click"; +import { longPress } from "../common/directives/long-press-directive"; +import { hassLocalizeLitMixin } from "../../../mixins/lit-localize-mixin"; +import { LovelaceElement, LovelaceElementConfig } from "./types.js"; +import { HomeAssistant } from "../../../types.js"; + +export class HuiStateIconElement extends hassLocalizeLitMixin(LitElement) + implements LovelaceElement { + public hass?: HomeAssistant; + private _config?: LovelaceElementConfig; + + static get properties() { + return { hass: {}, _config: {} }; + } + + public setConfig(config: LovelaceElementConfig): void { + if (!config.entity) { + throw Error("Invalid Configuration: 'entity' required"); + } + + this._config = config; + } + + protected render(): TemplateResult { + if ( + !this._config || + !this.hass || + !this.hass.states[this._config.entity!] + ) { + return html``; + } + + const state = this.hass!.states[this._config.entity!]; + return html` + ${this.renderStyle()} + + `; + } + + private renderStyle(): TemplateResult { + return html` + + `; + } + + private _handleClick() { + handleClick(this, this.hass!, this._config!, false); + } + + private _handleHold() { + handleClick(this, this.hass!, this._config!, true); + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-state-icon-element": HuiStateIconElement; + } +} + +customElements.define("hui-state-icon-element", HuiStateIconElement);