From 45efee28b836b1bfaf2b540cf7764eeb0548f90b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 21 Nov 2021 20:59:56 -0800 Subject: [PATCH] Add scenes and scripts as buttons in footer of area cards (#10673) * Add scenes and scripts as chips in footer of area cards * Remove unused chips config type * Update src/panels/lovelace/common/generate-lovelace-config.ts Co-authored-by: Zack Barett * Fix typing Co-authored-by: Zack Barett --- .../common/generate-lovelace-config.ts | 22 ++++++++++++++++--- src/panels/lovelace/header-footer/types.ts | 7 ++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index bd8dce5416..59b5a6b6fa 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -25,6 +25,7 @@ import { ThermostatCardConfig, } from "../cards/types"; import { LovelaceRowConfig } from "../entity-rows/types"; +import { ButtonsHeaderFooterConfig } from "../header-footer/types"; const HIDE_DOMAIN = new Set([ "automation", @@ -97,6 +98,8 @@ export const computeCards = ( ? `${entityCardOptions.title} `.toLowerCase() : undefined; + const footerEntities: ButtonsHeaderFooterConfig["entities"] = []; + for (const [entityId, stateObj] of states) { const domain = computeDomain(entityId); @@ -143,6 +146,12 @@ export const computeCards = ( show_forecast: false, }; cards.push(cardConfig); + } else if (domain === "scene" || domain === "script") { + footerEntities.push({ + entity: entityId, + show_icon: true, + show_name: true, + }); } else if ( domain === "sensor" && stateObj?.attributes.device_class === SENSOR_DEVICE_CLASS_BATTERY @@ -168,12 +177,19 @@ export const computeCards = ( } } - if (entities.length > 0) { - cards.unshift({ + if (entities.length > 0 || footerEntities.length > 0) { + const card: EntitiesCardConfig = { type: "entities", entities, ...entityCardOptions, - }); + }; + if (footerEntities.length > 0) { + card.footer = { + type: "buttons", + entities: footerEntities, + } as ButtonsHeaderFooterConfig; + } + cards.unshift(card); } if (cards.length < 2) { diff --git a/src/panels/lovelace/header-footer/types.ts b/src/panels/lovelace/header-footer/types.ts index ddbe7c79c8..a13cfc2401 100644 --- a/src/panels/lovelace/header-footer/types.ts +++ b/src/panels/lovelace/header-footer/types.ts @@ -1,15 +1,17 @@ import { ActionConfig } from "../../../data/lovelace"; -import { EntityConfig } from "../entity-rows/types"; +import { EntitiesCardEntityConfig } from "../cards/types"; export interface LovelaceHeaderFooterConfig { type: string; } export interface ButtonsHeaderFooterConfig extends LovelaceHeaderFooterConfig { - entities: Array; + type: "buttons"; + entities: Array; } export interface GraphHeaderFooterConfig extends LovelaceHeaderFooterConfig { + type: "graph"; entity: string; detail?: number; hours_to_show?: number; @@ -20,6 +22,7 @@ export interface GraphHeaderFooterConfig extends LovelaceHeaderFooterConfig { } export interface PictureHeaderFooterConfig extends LovelaceHeaderFooterConfig { + type: "picture"; image: string; tap_action?: ActionConfig; hold_action?: ActionConfig;