From 9be864b45e3471b30684041157b1b971fa5c7441 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 10:01:33 +0200 Subject: [PATCH 01/25] Fix search for data-tables using the builtin search bar (#5937) --- src/components/data-table/ha-data-table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index 015f54130e..ce957a0ee4 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -382,7 +382,7 @@ export class HaDataTable extends LitElement { filteredData = await this._memFilterData( this.data, this._sortColumns, - this.filter + this._filter ); } From 339221e7931b57afa7c3cf61a6b1fbe723487e51 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 16:23:50 +0200 Subject: [PATCH 02/25] Upgrade lazy loaded elements before setting config (#5944) --- src/panels/lovelace/create-element/create-element-base.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index c8379e8f3a..f409f6a3b6 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -126,6 +126,7 @@ const _lazyCreate = ( ) as CreateElementConfigTypes[T]["element"]; customElements.whenDefined(tag).then(() => { try { + customElements.upgrade(element); // @ts-ignore element.setConfig(config); } catch (err) { From 11bd72915c311a701b169edaa03b76b0b331e896 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 17:34:15 +0200 Subject: [PATCH 03/25] Fix picture header footer upgrade (#5945) --- .../header-footer/hui-picture-header-footer.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts index 9807c4a0e6..34d4c893b7 100644 --- a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts @@ -6,6 +6,7 @@ import { LitElement, property, TemplateResult, + PropertyValues, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; import { ifDefined } from "lit-html/directives/if-defined"; @@ -30,7 +31,7 @@ export class HuiPictureHeaderFooter extends LitElement }; } - public hass?: HomeAssistant; + @property() public hass?: HomeAssistant; @property() protected _config?: PictureHeaderFooterConfig; @@ -42,6 +43,13 @@ export class HuiPictureHeaderFooter extends LitElement this._config = config; } + protected shouldUpdate(changedProps: PropertyValues): boolean { + if (changedProps.size === 1 && changedProps.has("hass")) { + return !changedProps.get("hass"); + } + return true; + } + protected render(): TemplateResult { if (!this._config || !this.hass) { return html``; From 612811e2c2e8ed86002ec4be8f47adbb390c85d2 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 19:31:45 +0200 Subject: [PATCH 04/25] Fix disabled styling zone panel (#5950) --- src/panels/config/zone/ha-config-zone.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index 475e3822a7..1d794fa3e4 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -489,6 +489,9 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { mwc-icon-button:not([disabled]) { color: var(--secondary-text-color); } + mwc-icon-button { + --mdc-theme-text-disabled-on-light: var(--disabled-text-color); + } .empty { text-align: center; padding: 8px; From 91a655a81e8356f4112fb652c5690871bf9d9d24 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 21:27:08 +0200 Subject: [PATCH 05/25] Fix resize observers and update gauge styling (#5949) --- src/panels/lovelace/cards/hui-gauge-card.ts | 45 ++++++++++--------- .../lovelace/cards/hui-media-control-card.ts | 6 +-- .../cards/hui-weather-forecast-card.ts | 6 +-- .../hui-media-player-entity-row.ts | 6 +-- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/panels/lovelace/cards/hui-gauge-card.ts b/src/panels/lovelace/cards/hui-gauge-card.ts index 3297515f53..c13ff98fef 100644 --- a/src/panels/lovelace/cards/hui-gauge-card.ts +++ b/src/panels/lovelace/cards/hui-gauge-card.ts @@ -238,9 +238,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { private async _attachObserver(): Promise { await installResizeObserver(); - this._resizeObserver = new ResizeObserver( - debounce(() => this._measureCard(), 250, false) - ); + this._resizeObserver = new ResizeObserver(this._debouncedMeasure); const card = this.shadowRoot!.querySelector("ha-card"); // If we show an error or warning there is no ha-card @@ -250,6 +248,8 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { this._resizeObserver.observe(card); } + private _debouncedMeasure = debounce(() => this._measureCard(), 250, true); + private _measureCard() { if (!this.isConnected) { return; @@ -277,7 +277,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { cursor: pointer; height: 100%; overflow: hidden; - padding: 16px 16px 0 16px; + padding: 16px; display: flex; align-items: center; justify-content: center; @@ -293,37 +293,39 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { round-slider { max-width: 200px; --round-slider-path-width: 35px; - --round-slider-path-color: var(--disabled-text-color); + --round-slider-path-color: var(--primary-background-color); --round-slider-linecap: "butt"; } .gauge-data { - line-height: 1; text-align: center; - position: relative; + line-height: initial; color: var(--primary-text-color); - margin-top: -28px; - margin-bottom: 14px; + margin-top: -26px; + width: 100%; } .gauge-data .percent { + white-space: nowrap; font-size: 28px; } .gauge-data .name { - padding-top: 6px; - font-size: 14px; + font-size: 15px; } /* ============= NARROW ============= */ + :host([narrow]) ha-card { + padding: 8px; + } + :host([narrow]) round-slider { --round-slider-path-width: 22px; } :host([narrow]) .gauge-data { - margin-top: -24px; - margin-bottom: 12px; + margin-top: -22px; } :host([narrow]) .gauge-data .percent { @@ -331,30 +333,29 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { } :host([narrow]) .gauge-data .name { - font-size: 12px; + font-size: 14px; } /* ============= VERY NARROW ============= */ + :host([narrow]) ha-card { + padding: 4px; + } + :host([veryNarrow]) round-slider { --round-slider-path-width: 15px; } - :host([veryNarrow]) ha-card { - padding-bottom: 16px; - } - :host([veryNarrow]) .gauge-data { - margin-top: 0; - margin-bottom: 0; + margin-top: -16px; } :host([veryNarrow]) .gauge-data .percent { - font-size: 20px; + font-size: 16px; } :host([veryNarrow]) .gauge-data .name { - font-size: 10px; + font-size: 12px; } `; } diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index f1e070ff65..c7e5ba8319 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -618,6 +618,8 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { ); } + private _debouncedMeasure = debounce(() => this._measureCard(), 250, true); + private _measureCard() { const card = this.shadowRoot!.querySelector("ha-card"); if (!card) { @@ -630,9 +632,7 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { private async _attachObserver(): Promise { await installResizeObserver(); - this._resizeObserver = new ResizeObserver( - debounce(() => this._measureCard(), 250, false) - ); + this._resizeObserver = new ResizeObserver(this._debouncedMeasure); const card = this.shadowRoot!.querySelector("ha-card"); // If we show an error or warning there is no ha-card diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 74f0151a2e..69862bb4c3 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -290,9 +290,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { private async _attachObserver(): Promise { await installResizeObserver(); - this._resizeObserver = new ResizeObserver( - debounce(() => this._measureCard(), 250, false) - ); + this._resizeObserver = new ResizeObserver(this._debouncedMeasure); const card = this.shadowRoot!.querySelector("ha-card"); // If we show an error or warning there is no ha-card @@ -302,6 +300,8 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { this._resizeObserver.observe(card); } + private _debouncedMeasure = debounce(() => this._measureCard(), 250, true); + private _measureCard() { if (!this.isConnected) { return; diff --git a/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts b/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts index a3a41ba6d2..ba9da31e08 100644 --- a/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts @@ -53,7 +53,7 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow { this._veryNarrow = (this.clientWidth || 0) < 225; }, 250, - false + true ); public setConfig(config: EntityConfig): void { @@ -216,9 +216,7 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow { private _attachObserver(): void { installResizeObserver().then(() => { - this._resizeObserver = new ResizeObserver(() => - this._debouncedResizeListener() - ); + this._resizeObserver = new ResizeObserver(this._debouncedResizeListener); this._resizeObserver.observe(this); }); From e165a9668969410b435184abf9d5b04f2b90f019 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 21:36:11 +0200 Subject: [PATCH 06/25] Bumped version to 20200519.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index eb4d8d3d99..d63dd6e454 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200519.0", + version="20200519.1", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 4b8f7e1fe9c6f9000c799569a03e2b09e22db9be Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Wed, 20 May 2020 15:39:29 -0400 Subject: [PATCH 07/25] Weather Card: Fix Forecast Image Spacing (#5952) --- src/panels/lovelace/cards/hui-weather-forecast-card.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 69862bb4c3..06b839075d 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -435,6 +435,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { .forecast-image-icon > * { width: 40px; + height: 40px; } .forecast-icon { From 9689db9605b23b3031d2fdaf537ba2f8ee53857b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 20 May 2020 23:08:49 +0200 Subject: [PATCH 08/25] Upgrade lazy error card (#5955) --- src/panels/lovelace/create-element/create-element-base.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index f409f6a3b6..1e9c09cf59 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -52,9 +52,10 @@ export const createErrorCardElement = (config: ErrorCardConfig) => { el.setConfig(config); } else { import("../cards/hui-error-card"); - customElements - .whenDefined("hui-error-card") - .then(() => el.setConfig(config)); + customElements.whenDefined("hui-error-card").then(() => { + customElements.upgrade(el); + el.setConfig(config); + }); } return el; }; From c6be3be45ad58b3c312a857512bf8185e7cb8c0d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 21 May 2020 13:00:33 +0200 Subject: [PATCH 09/25] Fix markdown card crashing the demo (#5962) --- .../lovelace/cards/hui-markdown-card.ts | 36 +++++++++---------- .../cards/hui-weather-forecast-card.ts | 1 + .../lovelace/common/compute-card-size.ts | 2 +- .../editor/card-editor/hui-card-picker.ts | 15 +++++--- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/panels/lovelace/cards/hui-markdown-card.ts b/src/panels/lovelace/cards/hui-markdown-card.ts index 75ac449ad0..1e0b886e57 100644 --- a/src/panels/lovelace/cards/hui-markdown-card.ts +++ b/src/panels/lovelace/cards/hui-markdown-card.ts @@ -41,7 +41,7 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { @property() private _content = ""; - @property() private _unsubRenderTemplate?: Promise; + @property() private _unsubRenderTemplate?: UnsubscribeFunc; public getCardSize(): number { return this._config === undefined @@ -121,24 +121,25 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { return; } - this._unsubRenderTemplate = subscribeRenderTemplate( - this.hass.connection, - (result) => { - this._content = result; - }, - { - template: this._config.content, - entity_ids: this._config.entity_id, - variables: { - config: this._config, - user: this.hass.user!.name, + try { + this._unsubRenderTemplate = await subscribeRenderTemplate( + this.hass.connection, + (result) => { + this._content = result; }, - } - ); - this._unsubRenderTemplate.catch(() => { + { + template: this._config.content, + entity_ids: this._config.entity_id, + variables: { + config: this._config, + user: this.hass.user!.name, + }, + } + ); + } catch { this._content = this._config!.content; this._unsubRenderTemplate = undefined; - }); + } } private async _tryDisconnect(): Promise { @@ -147,9 +148,8 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { } try { - const unsub = await this._unsubRenderTemplate; + this._unsubRenderTemplate(); this._unsubRenderTemplate = undefined; - unsub(); } catch (e) { if (e.code === "not_found") { // If we get here, the connection was probably already closed. Ignore. diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 06b839075d..d9d7e5ce4f 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -115,6 +115,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { oldConfig.theme !== this._config.theme ) { applyThemesOnElement(this, this.hass.themes, this._config.theme); + this.requestUpdate(); } } diff --git a/src/panels/lovelace/common/compute-card-size.ts b/src/panels/lovelace/common/compute-card-size.ts index a8f884f75c..b572b0b5e3 100644 --- a/src/panels/lovelace/common/compute-card-size.ts +++ b/src/panels/lovelace/common/compute-card-size.ts @@ -1,5 +1,5 @@ import { LovelaceCard } from "../types"; export const computeCardSize = (card: LovelaceCard): number => { - return typeof card.getCardSize === "function" ? card.getCardSize() : 1; + return typeof card.getCardSize === "function" ? card.getCardSize() : 4; }; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index cf2870801e..9b0216d155 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -284,16 +284,23 @@ export class HuiCardPicker extends LitElement { "ll-rebuild", (ev) => { ev.stopPropagation(); - element.parentElement!.replaceChild( - this._createCardElement(cardConfig), - element - ); + this._rebuildCard(element, cardConfig); }, { once: true } ); return element; } + private _rebuildCard( + cardElToReplace: LovelaceCard, + config: LovelaceCardConfig + ): void { + const newCardEl = this._createCardElement(config); + if (cardElToReplace.parentElement) { + cardElToReplace.parentElement!.replaceChild(newCardEl, cardElToReplace); + } + } + private async _renderCardElement(card: Card): Promise { let { type } = card; const { showElement, isCustom, name, description } = card; From 0c57c05a229a27ec9c6c5cba497fe242d8e7167e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 21 May 2020 13:02:07 +0200 Subject: [PATCH 10/25] Bumped version to 20200519.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d63dd6e454..e96209534f 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200519.1", + version="20200519.2", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 8e0688140ececb3cf43076cbbdc5b8b646139d54 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 21 May 2020 14:54:10 +0200 Subject: [PATCH 11/25] Fix weather card (#5966) --- .../cards/hui-weather-forecast-card.ts | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index d9d7e5ce4f..e2b49a2d4b 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -97,6 +97,14 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { this._config = config; } + protected shouldUpdate(changedProps: PropertyValues): boolean { + return hasConfigOrEntityChanged(this, changedProps); + } + + protected firstUpdated(): void { + this._attachObserver(); + } + protected updated(changedProps: PropertyValues): void { super.updated(changedProps); if (!this._config || !this.hass) { @@ -109,10 +117,10 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { | undefined; if ( - !oldHass || - !oldConfig || - oldHass.themes !== this.hass.themes || - oldConfig.theme !== this._config.theme + (changedProps.has("hass") && !oldHass) || + (changedProps.has("_config") && !oldConfig) || + (changedProps.has("hass") && oldHass!.themes !== this.hass.themes) || + (changedProps.has("_config") && oldConfig!.theme !== this._config.theme) ) { applyThemesOnElement(this, this.hass.themes, this._config.theme); this.requestUpdate(); @@ -277,22 +285,15 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { `; } - protected shouldUpdate(changedProps: PropertyValues): boolean { - return hasConfigOrEntityChanged(this, changedProps); - } - - protected firstUpdated(): void { - this._attachObserver(); - } - private _handleAction(): void { fireEvent(this, "hass-more-info", { entityId: this._config!.entity }); } private async _attachObserver(): Promise { - await installResizeObserver(); - this._resizeObserver = new ResizeObserver(this._debouncedMeasure); - + if (!this._resizeObserver) { + await installResizeObserver(); + this._resizeObserver = new ResizeObserver(this._debouncedMeasure); + } const card = this.shadowRoot!.querySelector("ha-card"); // If we show an error or warning there is no ha-card if (!card) { From 3f35c603d2f21f2ddc67fed7167bac7e76b41f83 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 21 May 2020 15:10:32 +0200 Subject: [PATCH 12/25] Don't set hass when not defined (#5967) --- src/panels/lovelace/cards/hui-picture-elements-card.ts | 4 +++- src/panels/lovelace/cards/hui-stack-card.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/cards/hui-picture-elements-card.ts b/src/panels/lovelace/cards/hui-picture-elements-card.ts index 9a178f22d4..29c78c9650 100644 --- a/src/panels/lovelace/cards/hui-picture-elements-card.ts +++ b/src/panels/lovelace/cards/hui-picture-elements-card.ts @@ -76,7 +76,9 @@ class HuiPictureElementsCard extends LitElement implements LovelaceCard { this._elements = this._config.elements.map( (elementConfig: LovelaceElementConfig) => { const element = createStyledHuiElement(elementConfig); - element.hass = this.hass; + if (this.hass) { + element.hass = this.hass; + } return element as LovelaceElement; } ); diff --git a/src/panels/lovelace/cards/hui-stack-card.ts b/src/panels/lovelace/cards/hui-stack-card.ts index 547aad6357..92e8e3f1e4 100644 --- a/src/panels/lovelace/cards/hui-stack-card.ts +++ b/src/panels/lovelace/cards/hui-stack-card.ts @@ -58,8 +58,12 @@ export abstract class HuiStackCard extends LitElement implements LovelaceCard { } for (const element of this._cards) { - element.hass = this.hass; - element.editMode = this.editMode; + if (this.hass) { + element.hass = this.hass; + } + if (this.editMode !== undefined) { + element.editMode = this.editMode; + } } } From 9c574995ac6e2202ef8c41829e8d2d3009cfeaaf Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 21 May 2020 15:15:37 +0200 Subject: [PATCH 13/25] Bumped version to 20200519.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e96209534f..384c4c7392 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200519.2", + version="20200519.3", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 6d0490d7d9a44b668d0c9990b89a3129844457de Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 22 May 2020 14:44:17 +0200 Subject: [PATCH 14/25] Fix show password toggle (#5979) --- src/components/ha-form/ha-form-string.ts | 5 ++--- src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/ha-form/ha-form-string.ts b/src/components/ha-form/ha-form-string.ts index 4b7c78848f..c940e5e7c6 100644 --- a/src/components/ha-form/ha-form-string.ts +++ b/src/components/ha-form/ha-form-string.ts @@ -49,7 +49,6 @@ export class HaFormString extends LitElement implements HaFormElement { > From 55dd1f4aa1a998503cf15a15cd0a19b3a82e57d1 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 22 May 2020 15:36:30 +0200 Subject: [PATCH 15/25] Fix device entities not updating (#5983) --- .../device-detail/ha-device-entities-card.ts | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/panels/config/devices/device-detail/ha-device-entities-card.ts b/src/panels/config/devices/device-detail/ha-device-entities-card.ts index b82d7e4dd0..a586d15f5a 100644 --- a/src/panels/config/devices/device-detail/ha-device-entities-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-entities-card.ts @@ -9,7 +9,6 @@ import { LitElement, property, PropertyValues, - queryAll, TemplateResult, } from "lit-element"; import { computeDomain } from "../../../../common/entity/compute_domain"; @@ -23,6 +22,7 @@ import { addEntitiesToLovelaceView } from "../../../lovelace/editor/add-entities import { LovelaceRow } from "../../../lovelace/entity-rows/types"; import { showEntityEditorDialog } from "../../entities/show-dialog-entity-editor"; import { EntityRegistryStateEntry } from "../ha-config-device-page"; +import { HuiErrorCard } from "../../../lovelace/cards/hui-error-card"; @customElement("ha-device-entities-card") export class HaDeviceEntitiesCard extends LitElement { @@ -32,20 +32,21 @@ export class HaDeviceEntitiesCard extends LitElement { @property() private _showDisabled = false; - @queryAll("#entities > *") private _entityRows?: LovelaceRow[]; + private _entityRows: Array = []; protected shouldUpdate(changedProps: PropertyValues) { - if (changedProps.has("hass")) { - this._entityRows?.forEach((element) => { + if (changedProps.has("hass") && changedProps.size === 1) { + this._entityRows.forEach((element) => { element.hass = this.hass; }); - return changedProps.size > 1; + return false; } return true; } protected render(): TemplateResult { const disabledEntities: EntityRegistryStateEntry[] = []; + this._entityRows = []; return html` ${this.entities.length ? html` -
+
${this.entities.map((entry: EntityRegistryStateEntry) => { if (entry.disabled_by) { disabledEntities.push(entry); @@ -127,8 +128,7 @@ export class HaDeviceEntitiesCard extends LitElement { } // @ts-ignore element.entry = entry; - element.addEventListener("hass-more-info", (ev) => this._openEditEntry(ev)); - + this._entityRows.push(element); return html`
${element}
`; } @@ -148,8 +148,16 @@ export class HaDeviceEntitiesCard extends LitElement { `; } - private _openEditEntry(ev: Event): void { + private _overrideMoreInfo(ev: Event): void { ev.stopPropagation(); + const entry = (ev.target! as any).entry; + showEntityEditorDialog(this, { + entry, + entity_id: entry.entity_id, + }); + } + + private _openEditEntry(ev: Event): void { const entry = (ev.currentTarget! as any).entry; showEntityEditorDialog(this, { entry, @@ -173,7 +181,7 @@ export class HaDeviceEntitiesCard extends LitElement { display: block; } ha-icon { - width: 40px; + margin-left: 8px; } .entity-id { color: var(--secondary-text-color); From 785f49b005ce8f79212556ff650d84c0b7cfb3a2 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 22 May 2020 15:36:43 +0200 Subject: [PATCH 16/25] Picture glance: Use icon button instead of icon with button styles. (#5977) --- .../lovelace/cards/hui-picture-glance-card.ts | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/panels/lovelace/cards/hui-picture-glance-card.ts b/src/panels/lovelace/cards/hui-picture-glance-card.ts index a1fb3bec86..e1b6c22f91 100644 --- a/src/panels/lovelace/cards/hui-picture-glance-card.ts +++ b/src/panels/lovelace/cards/hui-picture-glance-card.ts @@ -17,7 +17,7 @@ import { computeStateDisplay } from "../../../common/entity/compute_state_displa import { computeStateName } from "../../../common/entity/compute_state_name"; import { stateIcon } from "../../../common/entity/state_icon"; import "../../../components/ha-card"; -import "../../../components/ha-icon"; +import "../../../components/ha-icon-button"; import { ActionHandlerEvent } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; @@ -240,15 +240,16 @@ class HuiPictureGlanceCard extends LitElement implements LovelaceCard { return html`
- + > ${this._config!.show_state !== true && entityConf.show_state !== true ? html`
` : html` @@ -326,19 +327,15 @@ class HuiPictureGlanceCard extends LitElement implements LovelaceCard { margin-left: 8px; } - ha-icon { - cursor: pointer; + ha-icon-button { + --mdc-icon-button-size: 40px; + --disabled-text-color: currentColor; color: #a9a9a9; } - ha-icon.state-on { + ha-icon-button.state-on { color: white; } - ha-icon:focus { - outline: none; - background: var(--divider-color); - border-radius: 100%; - } .state { display: block; font-size: 12px; From 736444201be61dfa67eff38bdbb1babb96fdcb6a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 22 May 2020 17:55:28 +0200 Subject: [PATCH 17/25] Fix for icons with firefox private mode (#5985) --- src/components/ha-icon.ts | 9 ++++++++- src/data/iconsets.ts | 13 ++++++++++--- src/panels/lovelace/cards/hui-markdown-card.ts | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/components/ha-icon.ts b/src/components/ha-icon.ts index 7f1bfc57c9..7a8eee1896 100644 --- a/src/components/ha-icon.ts +++ b/src/components/ha-icon.ts @@ -90,7 +90,14 @@ export class HaIcon extends LitElement { return; } - const databaseIcon: string = await getIcon(iconName); + let databaseIcon: string | undefined; + try { + databaseIcon = await getIcon(iconName); + } catch (_err) { + // Firefox in private mode doesn't support IDB + databaseIcon = undefined; + } + if (databaseIcon) { this._path = databaseIcon; cachedIcons[iconName] = databaseIcon; diff --git a/src/data/iconsets.ts b/src/data/iconsets.ts index 1f28e7dd80..941f84cd74 100644 --- a/src/data/iconsets.ts +++ b/src/data/iconsets.ts @@ -14,12 +14,12 @@ export const iconStore = new Store("hass-icon-db", "mdi-icon-store"); export const MDI_PREFIXES = ["mdi", "hass", "hassio", "hademo"]; -let toRead: Array<[string, (string) => void]> = []; +let toRead: Array<[string, (string) => void, () => void]> = []; // Queue up as many icon fetches in 1 transaction export const getIcon = (iconName: string) => - new Promise((resolve) => { - toRead.push([iconName, resolve]); + new Promise((resolve, reject) => { + toRead.push([iconName, resolve, reject]); if (toRead.length > 1) { return; @@ -38,6 +38,13 @@ export const getIcon = (iconName: string) => for (const [resolve_, request] of results) { resolve_(request.result); } + }) + .catch(() => { + // Firefox in private mode doesn't support IDB + for (const [, , reject_] of toRead) { + reject_(); + } + toRead = []; }); }); diff --git a/src/panels/lovelace/cards/hui-markdown-card.ts b/src/panels/lovelace/cards/hui-markdown-card.ts index 1e0b886e57..d2ced882c2 100644 --- a/src/panels/lovelace/cards/hui-markdown-card.ts +++ b/src/panels/lovelace/cards/hui-markdown-card.ts @@ -136,7 +136,7 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { }, } ); - } catch { + } catch (_err) { this._content = this._config!.content; this._unsubRenderTemplate = undefined; } From 23192226dd36130c565c5b19b6247275b663f392 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 22 May 2020 18:16:45 +0200 Subject: [PATCH 18/25] Missed paper icon button (#5987) --- .../automation/condition/ha-automation-condition-row.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/config/automation/condition/ha-automation-condition-row.ts b/src/panels/config/automation/condition/ha-automation-condition-row.ts index af0850e5f6..d25bd7d0e1 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-row.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-row.ts @@ -68,10 +68,10 @@ export default class HaAutomationConditionRow extends LitElement { vertical-offset="-5" close-on-activate > - + > ${this._yamlMode From 6cc9ce573b3484f92f8563f0b554e62dbeb00f6d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 22 May 2020 18:21:00 +0200 Subject: [PATCH 19/25] Bumped version to 20200519.4 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 384c4c7392..378ef1156c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200519.3", + version="20200519.4", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 9c43c5806dd6ca88739bd974b9135e9ba0f9e3b6 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 26 May 2020 09:44:46 +0200 Subject: [PATCH 20/25] Fix shopping list initial data fetch (#6020) --- src/mixins/subscribe-mixin.ts | 9 +- .../lovelace/cards/hui-markdown-card.ts | 7 +- .../lovelace/cards/hui-shopping-list-card.ts | 158 ++++++++---------- 3 files changed, 84 insertions(+), 90 deletions(-) diff --git a/src/mixins/subscribe-mixin.ts b/src/mixins/subscribe-mixin.ts index a4d877a85f..3250093763 100644 --- a/src/mixins/subscribe-mixin.ts +++ b/src/mixins/subscribe-mixin.ts @@ -12,7 +12,7 @@ export const SubscribeMixin = >( class SubscribeClass extends superClass { @property() public hass?: HomeAssistant; - private __unsubs?: UnsubscribeFunc[]; + private __unsubs?: Array>; public connectedCallback() { super.connectedCallback(); @@ -23,7 +23,8 @@ export const SubscribeMixin = >( super.disconnectedCallback(); if (this.__unsubs) { while (this.__unsubs.length) { - this.__unsubs.pop()!(); + const unsub = this.__unsubs.pop()!; + Promise.resolve(unsub).then((unsubFunc) => unsubFunc()); } this.__unsubs = undefined; } @@ -36,7 +37,9 @@ export const SubscribeMixin = >( } } - protected hassSubscribe(): UnsubscribeFunc[] { + protected hassSubscribe(): Array< + UnsubscribeFunc | Promise + > { return []; } diff --git a/src/panels/lovelace/cards/hui-markdown-card.ts b/src/panels/lovelace/cards/hui-markdown-card.ts index d2ced882c2..4a466d72b6 100644 --- a/src/panels/lovelace/cards/hui-markdown-card.ts +++ b/src/panels/lovelace/cards/hui-markdown-card.ts @@ -41,7 +41,7 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { @property() private _content = ""; - @property() private _unsubRenderTemplate?: UnsubscribeFunc; + @property() private _unsubRenderTemplate?: Promise; public getCardSize(): number { return this._config === undefined @@ -122,7 +122,7 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { } try { - this._unsubRenderTemplate = await subscribeRenderTemplate( + this._unsubRenderTemplate = subscribeRenderTemplate( this.hass.connection, (result) => { this._content = result; @@ -148,7 +148,8 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { } try { - this._unsubRenderTemplate(); + const unsub = await this._unsubRenderTemplate; + unsub(); this._unsubRenderTemplate = undefined; } catch (e) { if (e.code === "not_found") { diff --git a/src/panels/lovelace/cards/hui-shopping-list-card.ts b/src/panels/lovelace/cards/hui-shopping-list-card.ts index 2695f7fcf2..85395dfffd 100644 --- a/src/panels/lovelace/cards/hui-shopping-list-card.ts +++ b/src/panels/lovelace/cards/hui-shopping-list-card.ts @@ -25,9 +25,12 @@ import { import { HomeAssistant } from "../../../types"; import { LovelaceCard, LovelaceCardEditor } from "../types"; import { SensorCardConfig, ShoppingListCardConfig } from "./types"; +import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; @customElement("hui-shopping-list-card") -class HuiShoppingListCard extends LitElement implements LovelaceCard { +class HuiShoppingListCard extends SubscribeMixin(LitElement) + implements LovelaceCard { public static async getConfigElement(): Promise { await import( /* webpackChunkName: "hui-shopping-list-editor" */ "../editor/config-elements/hui-shopping-list-editor" @@ -47,8 +50,6 @@ class HuiShoppingListCard extends LitElement implements LovelaceCard { @property() private _checkedItems?: ShoppingListItem[]; - private _unsubEvents?: Promise<() => Promise>; - public getCardSize(): number { return (this._config ? (this._config.title ? 1 : 0) : 0) + 3; } @@ -57,27 +58,16 @@ class HuiShoppingListCard extends LitElement implements LovelaceCard { this._config = config; this._uncheckedItems = []; this._checkedItems = []; - this._fetchData(); } - public connectedCallback(): void { - super.connectedCallback(); - - if (this.hass) { - this._unsubEvents = this.hass.connection.subscribeEvents( + public hassSubscribe(): Promise[] { + this._fetchData(); + return [ + this.hass!.connection.subscribeEvents( () => this._fetchData(), "shopping_list_updated" - ); - this._fetchData(); - } - } - - public disconnectedCallback(): void { - super.disconnectedCallback(); - - if (this._unsubEvents) { - this._unsubEvents.then((unsub) => unsub()); - } + ), + ]; } protected updated(changedProps: PropertyValues): void { @@ -85,16 +75,15 @@ class HuiShoppingListCard extends LitElement implements LovelaceCard { if (!this._config || !this.hass) { return; } + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; const oldConfig = changedProps.get("_config") as | SensorCardConfig | undefined; if ( - !oldHass || - !oldConfig || - oldHass.themes !== this.hass.themes || - oldConfig.theme !== this._config.theme + (changedProps.has("hass") && oldHass?.themes !== this.hass.themes) || + (changedProps.has("_config") && oldConfig?.theme !== this._config.theme) ) { applyThemesOnElement(this, this.hass.themes, this._config.theme); } @@ -199,6 +188,67 @@ class HuiShoppingListCard extends LitElement implements LovelaceCard { `; } + private async _fetchData(): Promise { + if (!this.hass) { + return; + } + const checkedItems: ShoppingListItem[] = []; + const uncheckedItems: ShoppingListItem[] = []; + const items = await fetchItems(this.hass); + for (const key in items) { + if (items[key].complete) { + checkedItems.push(items[key]); + } else { + uncheckedItems.push(items[key]); + } + } + this._checkedItems = checkedItems; + this._uncheckedItems = uncheckedItems; + } + + private _completeItem(ev): void { + updateItem(this.hass!, ev.target.itemId, { + complete: ev.target.checked, + }).catch(() => this._fetchData()); + } + + private _saveEdit(ev): void { + updateItem(this.hass!, ev.target.itemId, { + name: ev.target.value, + }).catch(() => this._fetchData()); + + ev.target.blur(); + } + + private _clearItems(): void { + if (this.hass) { + clearItems(this.hass).catch(() => this._fetchData()); + } + } + + private get _newItem(): PaperInputElement { + return this.shadowRoot!.querySelector(".addBox") as PaperInputElement; + } + + private _addItem(ev): void { + const newItem = this._newItem; + + if (newItem.value!.length > 0) { + addItem(this.hass!, newItem.value!).catch(() => this._fetchData()); + } + + newItem.value = ""; + if (ev) { + newItem.focus(); + } + } + + private _addKeyPress(ev): void { + if (ev.keyCode === 13) { + this._addItem(null); + } + } + static get styles(): CSSResult { return css` ha-card { @@ -257,66 +307,6 @@ class HuiShoppingListCard extends LitElement implements LovelaceCard { } `; } - - private async _fetchData(): Promise { - if (this.hass) { - const checkedItems: ShoppingListItem[] = []; - const uncheckedItems: ShoppingListItem[] = []; - const items = await fetchItems(this.hass); - for (const key in items) { - if (items[key].complete) { - checkedItems.push(items[key]); - } else { - uncheckedItems.push(items[key]); - } - } - this._checkedItems = checkedItems; - this._uncheckedItems = uncheckedItems; - } - } - - private _completeItem(ev): void { - updateItem(this.hass!, ev.target.itemId, { - complete: ev.target.checked, - }).catch(() => this._fetchData()); - } - - private _saveEdit(ev): void { - updateItem(this.hass!, ev.target.itemId, { - name: ev.target.value, - }).catch(() => this._fetchData()); - - ev.target.blur(); - } - - private _clearItems(): void { - if (this.hass) { - clearItems(this.hass).catch(() => this._fetchData()); - } - } - - private get _newItem(): PaperInputElement { - return this.shadowRoot!.querySelector(".addBox") as PaperInputElement; - } - - private _addItem(ev): void { - const newItem = this._newItem; - - if (newItem.value!.length > 0) { - addItem(this.hass!, newItem.value!).catch(() => this._fetchData()); - } - - newItem.value = ""; - if (ev) { - newItem.focus(); - } - } - - private _addKeyPress(ev): void { - if (ev.keyCode === 13) { - this._addItem(null); - } - } } declare global { From 582d15988474783c8ea781871a1dcc2cc12d8266 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 25 May 2020 21:57:04 +0200 Subject: [PATCH 21/25] Remove mwc-icon-button from dev tools states (#6046) --- .../developer-tools/state/developer-tools-state.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/panels/developer-tools/state/developer-tools-state.js b/src/panels/developer-tools/state/developer-tools-state.js index 76fecb5d97..2c55a1f6de 100644 --- a/src/panels/developer-tools/state/developer-tools-state.js +++ b/src/panels/developer-tools/state/developer-tools-state.js @@ -1,5 +1,4 @@ import "@material/mwc-button"; -import "@material/mwc-icon-button"; import "@polymer/paper-checkbox/paper-checkbox"; import "@polymer/paper-input/paper-input"; import { html } from "@polymer/polymer/lib/utils/html-tag"; @@ -59,9 +58,10 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { .entities td { padding: 4px; } - .entities mwc-icon-button { - --mdc-icon-button-size: 24px; + .entities ha-svg-icon { --mdc-icon-size: 20px; + padding: 4px; + cursor: pointer; } .entities td:nth-child(3) { white-space: pre-wrap; @@ -153,12 +153,12 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) {