From 6d63028406a8a39a2ee07df1677783833c94ec73 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Fri, 1 Sep 2023 15:18:47 +0200 Subject: [PATCH] Move tile card features logic into its own file (#17775) --- src/panels/lovelace/cards/hui-tile-card.ts | 51 ++---------- .../tile-features/hui-tile-features.ts | 82 +++++++++++++++++++ 2 files changed, 90 insertions(+), 43 deletions(-) create mode 100644 src/panels/lovelace/tile-features/hui-tile-features.ts diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index c21b8bf172..a0f7e8bcf9 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -49,14 +49,8 @@ import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; import { handleAction } from "../common/handle-action"; import "../components/hui-timestamp-display"; -import { createTileFeatureElement } from "../create-element/create-tile-feature-element"; -import type { LovelaceTileFeatureConfig } from "../tile-features/types"; -import type { - LovelaceCard, - LovelaceCardEditor, - LovelaceTileFeature, -} from "../types"; -import type { HuiErrorCard } from "./hui-error-card"; +import "../tile-features/hui-tile-features"; +import type { LovelaceCard, LovelaceCardEditor } from "../types"; import { computeTileBadge } from "./tile/badges/tile-badge"; import type { ThermostatCardConfig, TileCardConfig } from "./types"; @@ -391,45 +385,16 @@ export class HuiTileCard extends LitElement implements LovelaceCard { > -
- ${this._config.features?.map((featureConf) => - this.renderFeature(featureConf, stateObj) - )} -
+ `; } - private _featuresElements = new WeakMap< - LovelaceTileFeatureConfig, - LovelaceTileFeature | HuiErrorCard - >(); - - private _getFeatureElement(feature: LovelaceTileFeatureConfig) { - if (!this._featuresElements.has(feature)) { - const element = createTileFeatureElement(feature); - this._featuresElements.set(feature, element); - return element; - } - - return this._featuresElements.get(feature)!; - } - - private renderFeature( - featureConf: LovelaceTileFeatureConfig, - stateObj: HassEntity - ): TemplateResult { - const element = this._getFeatureElement(featureConf); - - if (this.hass) { - element.hass = this.hass; - (element as LovelaceTileFeature).stateObj = stateObj; - (element as LovelaceTileFeature).color = this._config!.color; - } - - return html`${element}`; - } - static get styles(): CSSResultGroup { return css` :host { diff --git a/src/panels/lovelace/tile-features/hui-tile-features.ts b/src/panels/lovelace/tile-features/hui-tile-features.ts new file mode 100644 index 0000000000..fea6b29d14 --- /dev/null +++ b/src/panels/lovelace/tile-features/hui-tile-features.ts @@ -0,0 +1,82 @@ +import type { HassEntity } from "home-assistant-js-websocket"; +import { + CSSResultGroup, + LitElement, + TemplateResult, + css, + html, + nothing, +} from "lit"; +import { customElement, property } from "lit/decorators"; +import { HomeAssistant } from "../../../types"; +import type { HuiErrorCard } from "../cards/hui-error-card"; +import { createTileFeatureElement } from "../create-element/create-tile-feature-element"; +import type { LovelaceTileFeature } from "../types"; +import type { LovelaceTileFeatureConfig } from "./types"; + +@customElement("hui-tile-features") +export class HuiTileFeatures extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj!: HassEntity; + + @property({ attribute: false }) public features?: LovelaceTileFeatureConfig[]; + + @property({ attribute: false }) public color?: string; + + private _featuresElements = new WeakMap< + LovelaceTileFeatureConfig, + LovelaceTileFeature | HuiErrorCard + >(); + + private _getFeatureElement(feature: LovelaceTileFeatureConfig) { + if (!this._featuresElements.has(feature)) { + const element = createTileFeatureElement(feature); + this._featuresElements.set(feature, element); + return element; + } + + return this._featuresElements.get(feature)!; + } + + private renderFeature( + featureConf: LovelaceTileFeatureConfig, + stateObj: HassEntity + ): TemplateResult { + const element = this._getFeatureElement(featureConf); + + if (this.hass) { + element.hass = this.hass; + (element as LovelaceTileFeature).stateObj = stateObj; + (element as LovelaceTileFeature).color = this.color; + } + + return html`${element}`; + } + + protected render() { + if (!this.features) { + return nothing; + } + return html` + ${this.features.map((featureConf) => + this.renderFeature(featureConf, this.stateObj) + )} + `; + } + + static get styles(): CSSResultGroup { + return css` + :host { + display: flex; + flex-direction: column; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-tile-features": HuiTileFeatures; + } +}