From 9a49956e984de3759b6ff2e7be9456e8c91a5015 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Fri, 18 Sep 2020 16:00:55 -0500 Subject: [PATCH] Updates --- .../lovelace/cards/hui-thermostat-card.ts | 124 ++++++++++++++---- 1 file changed, 95 insertions(+), 29 deletions(-) diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index f1c4df1ec4..5e41d2ff0e 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -19,6 +19,7 @@ import { UNIT_F } from "../../../common/const"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; +import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-card"; import type { HaCard } from "../../../components/ha-card"; import "../../../components/ha-icon-button"; @@ -30,8 +31,10 @@ import { } from "../../../data/climate"; import { UNAVAILABLE } from "../../../data/entity"; import { HomeAssistant } from "../../../types"; +import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entites"; import { hasConfigOrEntityChanged } from "../common/has-changed"; +import { installResizeObserver } from "../common/install-resize-observer"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import { LovelaceCard, LovelaceCardEditor } from "../types"; import { ThermostatCardConfig } from "./types"; @@ -81,8 +84,23 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { @internalProperty() private _lastSetMode?: number; + @internalProperty() private _narrow = false; + @query("ha-card") private _card?: HaCard; + private _resizeObserver?: ResizeObserver; + + public connectedCallback(): void { + super.connectedCallback(); + this.updateComplete.then(() => this._attachObserver()); + } + + public disconnectedCallback(): void { + if (this._resizeObserver) { + this._resizeObserver.disconnect(); + } + } + public getCardSize(): number { return 5; } @@ -216,6 +234,7 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard {
-
- -
-
- ${(stateObj.attributes.hvac_modes || []) - .concat() - .sort(compareClimateHvacModes) - .map((modeItem) => this._renderIcon(modeItem, mode))} -
+ ${!this._narrow + ? html` +
+ +
+
+ ${(stateObj.attributes.hvac_modes || []) + .concat() + .sort(compareClimateHvacModes) + .map((modeItem) => this._renderIcon(modeItem, mode))} +
+ ` + : ""} ${name}
@@ -278,6 +303,11 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { return hasConfigOrEntityChanged(this, changedProps); } + protected firstUpdated(): void { + this._measureCard(); + this._attachObserver(); + } + protected updated(changedProps: PropertyValues): void { super.updated(changedProps); @@ -454,6 +484,29 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { } } + private async _attachObserver(): Promise { + if (!this._resizeObserver) { + await installResizeObserver(); + this._resizeObserver = new ResizeObserver( + debounce(() => this._measureCard(), 250, false) + ); + } + const card = this.shadowRoot!.querySelector("ha-card"); + // If we show an error or warning there is no ha-card + if (!card) { + return; + } + this._resizeObserver.observe(card); + } + + private _measureCard() { + if (!this.isConnected) { + return; + } + + this._narrow = this.offsetWidth < 174; + } + static get styles(): CSSResult { return css` :host { @@ -592,6 +645,19 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { font-size: var(--name-font-size); } + .narrow #info { + margin-top: -40px; + } + + #modes { + --mdc-icon-button-size: 32px; + display: flex; + flex-wrap: wrap; + justify-content: space-around; + width: 100%; + padding-top: 8px; + } + #modes > * { color: var(--disabled-text-color); cursor: pointer; @@ -615,7 +681,7 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { } .step-icon { - --mdc-icon-button-size: 32px; + --mdc-icon-button-size: 28px; --mdc-icon-size: 18px; border-radius: 50%; border: 1px solid;