From ecfdb16957a8e9f4db20507be8f7b678ce23fd3a Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Sun, 28 Oct 2018 03:09:43 -0500 Subject: [PATCH] Convert hui-state-label-element to TypeScript/LitElement (#1893) --- .../lovelace/common/create-hui-element.js | 2 +- .../elements/hui-state-label-element.js | 74 ------------------ .../elements/hui-state-label-element.ts | 78 +++++++++++++++++++ 3 files changed, 79 insertions(+), 75 deletions(-) delete mode 100644 src/panels/lovelace/elements/hui-state-label-element.js create mode 100644 src/panels/lovelace/elements/hui-state-label-element.ts diff --git a/src/panels/lovelace/common/create-hui-element.js b/src/panels/lovelace/common/create-hui-element.js index 8394c12115..3ee45b3466 100644 --- a/src/panels/lovelace/common/create-hui-element.js +++ b/src/panels/lovelace/common/create-hui-element.js @@ -3,7 +3,7 @@ import "../elements/hui-image-element.js"; import "../elements/hui-service-button-element.js"; import "../elements/hui-state-badge-element.js"; import "../elements/hui-state-icon-element.js"; -import "../elements/hui-state-label-element.js"; +import "../elements/hui-state-label-element"; import { fireEvent } from "../../../common/dom/fire_event.js"; import createErrorCardConfig from "./create-error-card-config.js"; diff --git a/src/panels/lovelace/elements/hui-state-label-element.js b/src/panels/lovelace/elements/hui-state-label-element.js deleted file mode 100644 index e22ab9ac9c..0000000000 --- a/src/panels/lovelace/elements/hui-state-label-element.js +++ /dev/null @@ -1,74 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag.js"; -import { PolymerElement } from "@polymer/polymer/polymer-element.js"; - -import computeStateDisplay from "../../../common/entity/compute_state_display.js"; - -import "../../../components/entity/ha-state-label-badge.js"; - -import LocalizeMixin from "../../../mixins/localize-mixin.js"; -import ElementClickMixin from "../mixins/element-click-mixin.js"; -import { longPressBind } from "../common/directives/long-press-directive"; - -/* - * @appliesMixin ElementClickMixin - * @appliesMixin LocalizeMixin - */ -class HuiStateLabelElement extends LocalizeMixin( - ElementClickMixin(PolymerElement) -) { - static get template() { - return html` - -
- [[_config.prefix]][[_computeStateDisplay(_stateObj)]][[_config.suffix]] -
- `; - } - - 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]; - } - - _computeStateDisplay(stateObj) { - return stateObj ? computeStateDisplay(this.localize, stateObj) : "-"; - } -} -customElements.define("hui-state-label-element", HuiStateLabelElement); diff --git a/src/panels/lovelace/elements/hui-state-label-element.ts b/src/panels/lovelace/elements/hui-state-label-element.ts new file mode 100644 index 0000000000..50bf3d4e89 --- /dev/null +++ b/src/panels/lovelace/elements/hui-state-label-element.ts @@ -0,0 +1,78 @@ +import { html, LitElement } from "@polymer/lit-element"; + +import "../../../components/entity/ha-state-label-badge.js"; + +import { computeTooltip } from "../../../common/string/compute-tooltip"; +import computeStateDisplay from "../../../common/entity/compute_state_display.js"; +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"; +import { TemplateResult } from "lit-html"; + +interface Config extends LovelaceElementConfig { + prefix?: string; + suffix?: string; +} + +class HuiStateLabelElement extends hassLocalizeLitMixin(LitElement) + implements LovelaceElement { + public hass?: HomeAssistant; + private _config?: Config; + + static get properties() { + return { hass: {}, _config: {} }; + } + + public setConfig(config: Config): void { + if (!config.entity) { + throw Error("Invalid Configuration: 'entity' required"); + } + + this._config = config; + } + + protected render(): TemplateResult { + if (!this._config) { + return html``; + } + + const state = this.hass!.states[this._config.entity!]; + return html` + ${this.renderStyle()} +
+ ${this._config.prefix}${ + state ? computeStateDisplay(this.localize, state) : "-" + }${this._config.suffix} +
+ `; + } + + private renderStyle(): TemplateResult { + return html` + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-state-label-element": HuiStateLabelElement; + } +} + +customElements.define("hui-state-label-element", HuiStateLabelElement);