Fix conditional card visiblity inside section (#20966)

* Fix conditional card visiblity inside section

* Remove _ from protected method
This commit is contained in:
Paul Bottein 2024-06-03 18:23:30 +02:00 committed by GitHub
parent f2b2da9877
commit e48286c2a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 54 additions and 10 deletions

View File

@ -12,6 +12,12 @@ import {
import { createCardElement } from "../create-element/create-card-element"; import { createCardElement } from "../create-element/create-card-element";
import type { Lovelace, LovelaceCard, LovelaceLayoutOptions } from "../types"; import type { Lovelace, LovelaceCard, LovelaceLayoutOptions } from "../types";
declare global {
interface HASSDomEvents {
"card-visibility-changed": { value: boolean };
}
}
@customElement("hui-card") @customElement("hui-card")
export class HuiCard extends ReactiveElement { export class HuiCard extends ReactiveElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public hass!: HomeAssistant;
@ -66,6 +72,11 @@ export class HuiCard extends ReactiveElement {
const element = createCardElement(config) as LovelaceCard; const element = createCardElement(config) as LovelaceCard;
element.hass = this.hass; element.hass = this.hass;
element.editMode = this.lovelace?.editMode; element.editMode = this.lovelace?.editMode;
// Update element when the visibility of the card changes (e.g. conditional card or filter card)
element.addEventListener("card-visibility-changed", (ev) => {
ev.stopPropagation();
this._updateElement();
});
return element; return element;
} }
@ -129,6 +140,13 @@ export class HuiCard extends ReactiveElement {
if (!this._element) { if (!this._element) {
return; return;
} }
if (this._element.hidden) {
this.style.setProperty("display", "none");
this.toggleAttribute("hidden", true);
return;
}
const visible = const visible =
forceVisible || forceVisible ||
this.lovelace?.editMode || this.lovelace?.editMode ||

View File

@ -1,4 +1,5 @@
import { customElement } from "lit/decorators"; import { customElement } from "lit/decorators";
import { fireEvent } from "../../../common/dom/fire_event";
import { LovelaceCardConfig } from "../../../data/lovelace/config/card"; import { LovelaceCardConfig } from "../../../data/lovelace/config/card";
import { computeCardSize } from "../common/compute-card-size"; import { computeCardSize } from "../common/compute-card-size";
import { HuiConditionalBase } from "../components/hui-conditional-base"; import { HuiConditionalBase } from "../components/hui-conditional-base";
@ -58,6 +59,15 @@ class HuiConditionalCard extends HuiConditionalBase implements LovelaceCard {
this.replaceChild(this._element, this.lastChild); this.replaceChild(this._element, this.lastChild);
} }
} }
protected setVisibility(conditionMet: boolean): void {
const visible = this.editMode || conditionMet;
const previouslyHidden = this.hidden;
super.setVisibility(conditionMet);
if (previouslyHidden !== this.hidden) {
fireEvent(this, "card-visibility-changed", { value: visible });
}
}
} }
declare global { declare global {

View File

@ -15,6 +15,7 @@ import { createCardElement } from "../create-element/create-card-element";
import { EntityFilterEntityConfig } from "../entity-rows/types"; import { EntityFilterEntityConfig } from "../entity-rows/types";
import { LovelaceCard } from "../types"; import { LovelaceCard } from "../types";
import { EntityFilterCardConfig } from "./types"; import { EntityFilterCardConfig } from "./types";
import { fireEvent } from "../../../common/dom/fire_event";
@customElement("hui-entity-filter-card") @customElement("hui-entity-filter-card")
export class HuiEntityFilterCard export class HuiEntityFilterCard
@ -162,9 +163,14 @@ export class HuiEntityFilterCard
return false; return false;
}); });
if (entitiesList.length === 0 && this._config.show_empty === false) { if (
entitiesList.length === 0 &&
this._config.show_empty === false &&
!this.hidden
) {
this.style.display = "none"; this.style.display = "none";
this.toggleAttribute("hidden", true); this.toggleAttribute("hidden", true);
fireEvent(this, "card-visibility-changed", { value: false });
return; return;
} }
@ -194,8 +200,11 @@ export class HuiEntityFilterCard
this.appendChild(this._element); this.appendChild(this._element);
} }
if (this.hidden) {
this.style.display = "block"; this.style.display = "block";
this.toggleAttribute("hidden", false); this.toggleAttribute("hidden", false);
fireEvent(this, "card-visibility-changed", { value: true });
}
} }
private _haveEntitiesChanged(oldHass: HomeAssistant | null): boolean { private _haveEntitiesChanged(oldHass: HomeAssistant | null): boolean {

View File

@ -6,14 +6,20 @@ import { HomeAssistant } from "../../../types";
import { ConditionalCardConfig } from "../cards/types"; import { ConditionalCardConfig } from "../cards/types";
import { import {
Condition, Condition,
checkConditionsMet,
attachConditionMediaQueriesListeners, attachConditionMediaQueriesListeners,
checkConditionsMet,
extractMediaQueries, extractMediaQueries,
validateConditionalConfig, validateConditionalConfig,
} from "../common/validate-condition"; } from "../common/validate-condition";
import { ConditionalRowConfig, LovelaceRow } from "../entity-rows/types"; import { ConditionalRowConfig, LovelaceRow } from "../entity-rows/types";
import { LovelaceCard } from "../types"; import { LovelaceCard } from "../types";
declare global {
interface HASSDomEvents {
"visibility-changed": { value: boolean };
}
}
@customElement("hui-conditional-base") @customElement("hui-conditional-base")
export class HuiConditionalBase extends ReactiveElement { export class HuiConditionalBase extends ReactiveElement {
@property({ attribute: false }) public hass?: HomeAssistant; @property({ attribute: false }) public hass?: HomeAssistant;
@ -95,7 +101,7 @@ export class HuiConditionalBase extends ReactiveElement {
supportedConditions, supportedConditions,
(matches) => { (matches) => {
if (hasOnlyMediaQuery) { if (hasOnlyMediaQuery) {
this._setVisibility(matches); this.setVisibility(matches);
return; return;
} }
this._updateVisibility(); this._updateVisibility();
@ -129,17 +135,18 @@ export class HuiConditionalBase extends ReactiveElement {
this.hass! this.hass!
); );
this._setVisibility(conditionMet); this.setVisibility(conditionMet);
} }
private _setVisibility(conditionMet: boolean) { protected setVisibility(conditionMet: boolean) {
if (!this._element || !this.hass) { if (!this._element || !this.hass) {
return; return;
} }
const visible = this.editMode || conditionMet; const visible = this.editMode || conditionMet;
if (this.hidden !== !visible) {
this.toggleAttribute("hidden", !visible); this.toggleAttribute("hidden", !visible);
this.style.setProperty("display", visible ? "" : "none"); this.style.setProperty("display", visible ? "" : "none");
}
if (visible) { if (visible) {
this._element.hass = this.hass; this._element.hass = this.hass;
if (!this._element!.parentElement) { if (!this._element!.parentElement) {