From 486ed7dcaa81298a4e5a2ed0345f1714516cdc7b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 1 Jun 2020 16:08:27 +0200 Subject: [PATCH] More card size tweaking (#6073) --- .../lovelace/cards/hui-alarm-panel-card.ts | 2 +- src/panels/lovelace/cards/hui-button-card.ts | 4 +- .../lovelace/cards/hui-conditional-card.ts | 4 +- .../lovelace/cards/hui-entities-card.ts | 75 ++++++++++++------- src/panels/lovelace/cards/hui-entity-card.ts | 10 ++- .../lovelace/cards/hui-entity-filter-card.ts | 14 +++- src/panels/lovelace/cards/hui-glance-card.ts | 5 +- src/panels/lovelace/cards/hui-map-card.ts | 4 +- .../lovelace/common/compute-card-size.ts | 4 +- .../hui-buttons-header-footer.ts | 4 + .../header-footer/hui-graph-header-footer.ts | 4 + .../hui-picture-header-footer.ts | 4 + src/panels/lovelace/types.ts | 1 + 13 files changed, 96 insertions(+), 39 deletions(-) diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts index 77de911dc8..06b5a40e9e 100644 --- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts +++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts @@ -77,7 +77,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { public async getCardSize(): Promise { if (!this._config || !this.hass) { - return 3; + return 5; } const stateObj = this.hass.states[this._config.entity]; diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index ce7d18e3de..0e6bc2d874 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -79,7 +79,9 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { @internalProperty() private _shouldRenderRipple = false; public getCardSize(): number { - return 2; + return ( + (this._config?.show_icon ? 3 : 0) + (this._config?.show_name ? 1 : 0) + ); } public setConfig(config: ButtonCardConfig): void { diff --git a/src/panels/lovelace/cards/hui-conditional-card.ts b/src/panels/lovelace/cards/hui-conditional-card.ts index 54c96d11b8..e9cd46a823 100644 --- a/src/panels/lovelace/cards/hui-conditional-card.ts +++ b/src/panels/lovelace/cards/hui-conditional-card.ts @@ -34,8 +34,8 @@ class HuiConditionalCard extends HuiConditionalBase implements LovelaceCard { this._element = this._createCardElement(config.card); } - public async getCardSize(): Promise { - return await computeCardSize(this._element as LovelaceCard); + public getCardSize(): Promise | number { + return computeCardSize(this._element as LovelaceCard); } private _createCardElement(cardConfig: LovelaceCardConfig) { diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index 117f4abe8b..d6d61ec7cb 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -19,13 +19,13 @@ import "../components/hui-entities-toggle"; import { createHeaderFooterElement } from "../create-element/create-header-footer-element"; import { createRowElement } from "../create-element/create-row-element"; import { LovelaceRow } from "../entity-rows/types"; -import { LovelaceHeaderFooterConfig } from "../header-footer/types"; import { LovelaceCard, LovelaceCardEditor, LovelaceHeaderFooter, } from "../types"; import { EntitiesCardConfig, EntitiesCardEntityConfig } from "./types"; +import { computeCardSize } from "../common/compute-card-size"; @customElement("hui-entities-card") class HuiEntitiesCard extends LitElement implements LovelaceCard { @@ -61,6 +61,10 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { private _showHeaderToggle?: boolean; + private _headerElement?: LovelaceHeaderFooter; + + private _footerElement?: LovelaceHeaderFooter; + set hass(hass: HomeAssistant) { this._hass = hass; this.shadowRoot!.querySelectorAll("#states > div > *").forEach( @@ -68,11 +72,12 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { (element as LovelaceRow).hass = hass; } ); - this.shadowRoot!.querySelectorAll(".header-footer > *").forEach( - (element: unknown) => { - (element as LovelaceHeaderFooter).hass = hass; - } - ); + if (this._headerElement) { + this._headerElement.hass = hass; + } + if (this._footerElement) { + this._footerElement.hass = hass; + } const entitiesToggle = this.shadowRoot!.querySelector( "hui-entities-toggle" ); @@ -81,15 +86,24 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { } } - public getCardSize(): number { + public async getCardSize(): Promise { if (!this._config) { return 0; } // +1 for the header - return ( + let size = (this._config.title || this._showHeaderToggle ? 1 : 0) + - this._config.entities.length - ); + (this._config.entities.length || 1); + if (this._headerElement) { + const headerSize = computeCardSize(this._headerElement); + size += headerSize instanceof Promise ? await headerSize : headerSize; + } + if (this._footerElement) { + const footerSize = computeCardSize(this._footerElement); + size += footerSize instanceof Promise ? await footerSize : footerSize; + } + + return size; } public setConfig(config: EntitiesCardConfig): void { @@ -113,6 +127,24 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { } else { this._showHeaderToggle = config.show_header_toggle; } + + if (this._config.header) { + this._headerElement = createHeaderFooterElement(this._config.header); + if (this._hass) { + this._headerElement.hass = this._hass; + } + } else { + this._headerElement = undefined; + } + + if (this._config.footer) { + this._footerElement = createHeaderFooterElement(this._config.footer); + if (this._hass) { + this._footerElement.hass = this._hass; + } + } else { + this._footerElement = undefined; + } } protected updated(changedProps: PropertyValues): void { @@ -142,8 +174,10 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { return html` - ${this._config.header - ? this.renderHeaderFooter(this._config.header, "header") + ${this._headerElement + ? html`` : ""} ${!this._config.title && !this._showHeaderToggle && !this._config.icon ? "" @@ -178,8 +212,10 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { )} - ${this._config.footer - ? this.renderHeaderFooter(this._config.footer, "footer") + ${this._footerElement + ? html`` : ""} `; @@ -248,17 +284,6 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { `; } - private renderHeaderFooter( - conf: LovelaceHeaderFooterConfig, - className: string - ): TemplateResult { - const element = createHeaderFooterElement(conf); - if (this._hass) { - element.hass = this._hass; - } - return html` `; - } - private renderEntity(entityConf: EntitiesCardEntityConfig): TemplateResult { const element = createRowElement( this._config!.state_color diff --git a/src/panels/lovelace/cards/hui-entity-card.ts b/src/panels/lovelace/cards/hui-entity-card.ts index bc5f9e9364..0b1caa900b 100644 --- a/src/panels/lovelace/cards/hui-entity-card.ts +++ b/src/panels/lovelace/cards/hui-entity-card.ts @@ -29,6 +29,7 @@ import { } from "../types"; import { HuiErrorCard } from "./hui-error-card"; import { EntityCardConfig } from "./types"; +import { computeCardSize } from "../common/compute-card-size"; @customElement("hui-entity-card") export class HuiEntityCard extends LitElement implements LovelaceCard { @@ -79,8 +80,13 @@ export class HuiEntityCard extends LitElement implements LovelaceCard { } } - public getCardSize(): number { - return 1 + (this._config?.footer ? 1 : 0); + public async getCardSize(): Promise { + let size = 2; + if (this._footerElement) { + const footerSize = computeCardSize(this._footerElement); + size += footerSize instanceof Promise ? await footerSize : footerSize; + } + return size; } protected render(): TemplateResult { diff --git a/src/panels/lovelace/cards/hui-entity-filter-card.ts b/src/panels/lovelace/cards/hui-entity-filter-card.ts index 86de928fed..f207847dfb 100644 --- a/src/panels/lovelace/cards/hui-entity-filter-card.ts +++ b/src/panels/lovelace/cards/hui-entity-filter-card.ts @@ -57,8 +57,9 @@ class EntityFilterCard extends UpdatingElement implements LovelaceCard { if (this.lastChild) { this.removeChild(this.lastChild); - this._element = undefined; } + + this._element = this._createCardElement(this._baseCardConfig); } protected shouldUpdate(changedProps: PropertyValues): boolean { @@ -81,7 +82,12 @@ class EntityFilterCard extends UpdatingElement implements LovelaceCard { protected update(changedProps: PropertyValues) { super.update(changedProps); - if (!this.hass || !this._config || !this._configEntities) { + if ( + !this.hass || + !this._config || + !this._configEntities || + !this._element + ) { return; } @@ -114,8 +120,8 @@ class EntityFilterCard extends UpdatingElement implements LovelaceCard { return; } - if (!this._element) { - this._element = this._createCardElement({ + if (!this.lastChild) { + this._element.setConfig({ ...this._baseCardConfig!, entities: entitiesList, }); diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 30442ebfc9..f377866025 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -68,7 +68,10 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { public getCardSize(): number { return ( (this._config!.title ? 1 : 0) + - Math.ceil(this._configEntities!.length / 5) + Math.max( + Math.ceil(this._configEntities!.length / (this._config!.columns || 5)), + 1 + ) ); } diff --git a/src/panels/lovelace/cards/hui-map-card.ts b/src/panels/lovelace/cards/hui-map-card.ts index 97fd04a1c8..374e2f335d 100644 --- a/src/panels/lovelace/cards/hui-map-card.ts +++ b/src/panels/lovelace/cards/hui-map-card.ts @@ -237,7 +237,9 @@ class HuiMapCard extends LitElement implements LovelaceCard { protected firstUpdated(changedProps: PropertyValues): void { super.firstUpdated(changedProps); - this.loadMap(); + if (this.isConnected) { + this.loadMap(); + } const root = this.shadowRoot!.getElementById("root"); if (!this._config || this.isPanel || !root) { diff --git a/src/panels/lovelace/common/compute-card-size.ts b/src/panels/lovelace/common/compute-card-size.ts index c47088fbd0..60ca74c4a6 100644 --- a/src/panels/lovelace/common/compute-card-size.ts +++ b/src/panels/lovelace/common/compute-card-size.ts @@ -1,7 +1,7 @@ -import { LovelaceCard } from "../types"; +import { LovelaceCard, LovelaceHeaderFooter } from "../types"; export const computeCardSize = ( - card: LovelaceCard + card: LovelaceCard | LovelaceHeaderFooter ): number | Promise => { if (typeof card.getCardSize === "function") { return card.getCardSize(); diff --git a/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts b/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts index 7ff040b071..93547d9b58 100644 --- a/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts @@ -23,6 +23,10 @@ export class HuiButtonsHeaderFooter extends LitElement private _configEntities?: EntityConfig[]; + public getCardSize(): number { + return 1; + } + public setConfig(config: ButtonsHeaderFooterConfig): void { this._configEntities = processConfigEntities(config.entities); this.requestUpdate(); diff --git a/src/panels/lovelace/header-footer/hui-graph-header-footer.ts b/src/panels/lovelace/header-footer/hui-graph-header-footer.ts index b73be70176..2ad3332b33 100644 --- a/src/panels/lovelace/header-footer/hui-graph-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-graph-header-footer.ts @@ -40,6 +40,10 @@ export class HuiGraphHeaderFooter extends LitElement private _fetching = false; + public getCardSize(): number { + return 2; + } + public setConfig(config: GraphHeaderFooterConfig): void { if (!config?.entity || config.entity.split(".")[0] !== "sensor") { throw new Error( 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 34d4c893b7..7b68151317 100644 --- a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts @@ -35,6 +35,10 @@ export class HuiPictureHeaderFooter extends LitElement @property() protected _config?: PictureHeaderFooterConfig; + public getCardSize(): number { + return 3; + } + public setConfig(config: PictureHeaderFooterConfig): void { if (!config || !config.image) { throw new Error("Invalid Configuration: 'image' required"); diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index 79bf4a5444..c2623ec683 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -49,6 +49,7 @@ export interface LovelaceCardConstructor extends Constructor { export interface LovelaceHeaderFooter extends HTMLElement { hass?: HomeAssistant; + getCardSize(): number | Promise; setConfig(config: LovelaceHeaderFooterConfig): void; }