From 60233f464a6a2a2c8879cdd9315ad5845cd17901 Mon Sep 17 00:00:00 2001 From: Sebastiaan Pasma Date: Tue, 20 Jun 2023 21:17:38 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Allow=20use?= =?UTF-8?q?rs=20to=20use=20jinja-templates=20to=20program=20first=20tab=20?= =?UTF-8?q?on=20load=20(selectedTabIndex)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tabbed-card.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/tabbed-card.ts b/src/tabbed-card.ts index e9a6ce0..532f85e 100644 --- a/src/tabbed-card.ts +++ b/src/tabbed-card.ts @@ -27,7 +27,7 @@ interface TabbedCardConfig extends LovelaceCardConfig { } interface options { - defaultTabIndex?: number; + defaultTabIndex?: string | number | undefined; } interface Tab { @@ -101,6 +101,16 @@ export class TabbedCard extends LitElement { } async _createTabs(config: TabbedCardConfig) { + let template = config?.options?.defaultTabIndex; + if (typeof template === "undefined") { + this.selectedTabIndex = 0; + } else if (typeof template === "string") { + let result = await this.evaluateJinjaTemplate(this.hass, template || "0") + // Try to parse the result as a number, if it fails, default to 0 (first tab) + this.selectedTabIndex = parseInt(result) || 0; + } else { + this.selectedTabIndex = isFinite(template)? template : 0; + } const tabs = await Promise.all( config.tabs.map(async (tab) => { return { @@ -145,6 +155,18 @@ export class TabbedCard extends LitElement { // this._tabs.splice(this._tabs.indexOf(cardElement), 1, newCardElement); } + async evaluateJinjaTemplate( + hass: HomeAssistant, + template: string, + ): Promise { + return new Promise(resolve => { + hass.connection.subscribeMessage((msg: { result: string | Record }) => resolve(msg.result.toString()), { + type: "render_template", + template: template, + }); + }); + } + render() { if (!this.hass || !this._config || !this._helpers || !this._tabs?.length) { return html``; @@ -155,7 +177,7 @@ export class TabbedCard extends LitElement { @MDCTabBar:activated=${(ev: mwcTabBarEvent) => (this.selectedTabIndex = ev.detail.index)} style=${styleMap(this._styles)} - activeIndex=${ifDefined(this._config?.options?.defaultTabIndex)} + activeIndex=${this.selectedTabIndex} > ${this._tabs.map(