From 873ce2b405b8ec96d34e9bad24589c17b900cf52 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 28 Sep 2023 17:04:59 +0200 Subject: [PATCH] Improve performance and editor --- .../common/ha-card-condition-editor.ts | 10 ++++++ .../types/ha-card-condition-responsive.ts | 6 ++-- .../components/hui-conditional-base.ts | 32 +++++++++++++------ .../hui-conditional-card-editor.ts | 1 - src/translations/en.json | 2 +- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/panels/lovelace/common/ha-card-condition-editor.ts b/src/panels/lovelace/common/ha-card-condition-editor.ts index 4f6151f3ad..8dea90a462 100644 --- a/src/panels/lovelace/common/ha-card-condition-editor.ts +++ b/src/panels/lovelace/common/ha-card-condition-editor.ts @@ -44,6 +44,11 @@ export default class HaCardConditionEditor extends LitElement { )} .path=${yamlMode ? mdiListBoxOutline : mdiCodeBraces} > + + ${this.hass.localize( + `ui.panel.lovelace.editor.card.conditional.condition.${condition.condition}.label` + ) || condition.condition} + c.media_query ?? "") - .filter((m) => m !== ""); + .filter((c) => c.media_query) + .map((c) => c.media_query as string); if (deepEqual(mediaQueries, this._mediaQueries)) return; @@ -92,7 +92,12 @@ export class HuiConditionalBase extends ReactiveElement { this._mediaQueriesListeners.pop()!(); } mediaQueries.forEach((query) => { - const listener = listenMediaQuery(query, () => { + const listener = listenMediaQuery(query, (matches) => { + // For performance, if there is only one condition, set the visibility directly + if (this._config!.conditions.length === 1) { + this._setVisibility(matches); + return; + } this._updateVisibility(); }); this._mediaQueriesListeners.push(listener); @@ -117,20 +122,29 @@ export class HuiConditionalBase extends ReactiveElement { return; } - this._element!.editMode = this.editMode; + this._element.editMode = this.editMode; - const visible = - this.editMode || checkConditionsMet(this._config!.conditions, this.hass!); + const conditionMet = checkConditionsMet( + this._config!.conditions, + this.hass! + ); + this._setVisibility(conditionMet); + } + + private _setVisibility(conditionMet: boolean) { + if (!this._element || !this.hass) { + return; + } + const visible = this.editMode || conditionMet; this.hidden = !visible; - this.style.setProperty("display", visible ? "" : "none"); if (visible) { - this._element!.hass = this.hass; + this._element.hass = this.hass; if (!this._element!.parentElement) { this.appendChild(this._element!); } - } else if (this._element!.parentElement) { + } else if (this._element.parentElement) { this.removeChild(this._element!); } } diff --git a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts index 26a490878c..c9a6e2673e 100644 --- a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts @@ -111,7 +111,6 @@ export class HuiConditionalCardEditor )} .path=${isGuiMode ? mdiCodeBraces : mdiListBoxOutline} > -