From ac179f5b455e904eb88d998caf3efffc08f980aa Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 15 Feb 2019 09:46:32 -0800 Subject: [PATCH] Unused entities to respect tap/hold action (#2754) --- src/data/lovelace.ts | 6 +- .../common/compute-unused-entities.ts | 89 ++++++++++++------- src/panels/lovelace/common/handle-click.ts | 2 +- src/panels/lovelace/hui-unused-entities.ts | 2 +- 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/data/lovelace.ts b/src/data/lovelace.ts index 84edaa0472..fa638acb85 100644 --- a/src/data/lovelace.ts +++ b/src/data/lovelace.ts @@ -5,7 +5,6 @@ export interface LovelaceConfig { views: LovelaceViewConfig[]; background?: string; resources?: Array<{ type: "css" | "js" | "module" | "html"; url: string }>; - excluded_entities?: string[]; } export interface LovelaceViewConfig { @@ -34,7 +33,10 @@ export interface ToggleActionConfig { export interface CallServiceActionConfig { action: "call-service"; service: string; - service_data?: { [key: string]: any }; + service_data?: { + entity_id?: string | [string]; + [key: string]: any; + }; } export interface NavigateActionConfig { diff --git a/src/panels/lovelace/common/compute-unused-entities.ts b/src/panels/lovelace/common/compute-unused-entities.ts index 0c4fd0c331..145bf463b6 100644 --- a/src/panels/lovelace/common/compute-unused-entities.ts +++ b/src/panels/lovelace/common/compute-unused-entities.ts @@ -1,38 +1,66 @@ -import { LovelaceConfig } from "../../../data/lovelace"; +import { LovelaceConfig, ActionConfig } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; const EXCLUDED_DOMAINS = ["zone"]; +const addFromAction = (entities: Set, actionConfig: ActionConfig) => { + if ( + actionConfig.action !== "call-service" || + !actionConfig.service_data || + !actionConfig.service_data.entity_id + ) { + return; + } + let entityIds = actionConfig.service_data.entity_id; + if (!Array.isArray(entityIds)) { + entityIds = [entityIds]; + } + for (const entityId of entityIds) { + entities.add(entityId); + } +}; + +const addEntityId = (entities: Set, entity) => { + if (typeof entity === "string") { + entities.add(entity); + return; + } + + if (entity.entity) { + entities.add(entity.entity); + } + if (entity.camera_image) { + entities.add(entity.camera_image); + } + if (entity.tap_action) { + addFromAction(entities, entity.tap_action); + } + if (entity.hold_action) { + addFromAction(entities, entity.hold_action); + } +}; + +const addEntities = (entities: Set, obj) => { + if (obj.entity) { + addEntityId(entities, obj.entity); + } + if (obj.entities) { + obj.entities.forEach((entity) => addEntityId(entities, entity)); + } + if (obj.card) { + addEntities(entities, obj.card); + } + if (obj.cards) { + obj.cards.forEach((card) => addEntities(entities, card)); + } + if (obj.badges) { + obj.badges.forEach((badge) => addEntityId(entities, badge)); + } +}; + const computeUsedEntities = (config) => { const entities = new Set(); - - const addEntityId = (entity) => { - if (typeof entity === "string") { - entities.add(entity); - } else if (entity.entity) { - entities.add(entity.entity); - } - }; - - const addEntities = (obj) => { - if (obj.entity) { - addEntityId(obj.entity); - } - if (obj.entities) { - obj.entities.forEach((entity) => addEntityId(entity)); - } - if (obj.card) { - addEntities(obj.card); - } - if (obj.cards) { - obj.cards.forEach((card) => addEntities(card)); - } - if (obj.badges) { - obj.badges.forEach((badge) => addEntityId(badge)); - } - }; - - config.views.forEach((view) => addEntities(view)); + config.views.forEach((view) => addEntities(entities, view)); return entities; }; @@ -45,9 +73,6 @@ export const computeUnusedEntities = ( .filter( (entity) => !usedEntities.has(entity) && - !( - config.excluded_entities && config.excluded_entities.includes(entity) - ) && !EXCLUDED_DOMAINS.includes(entity.split(".", 1)[0]) ) .sort(); diff --git a/src/panels/lovelace/common/handle-click.ts b/src/panels/lovelace/common/handle-click.ts index bf1e3c149d..5ee86f965f 100644 --- a/src/panels/lovelace/common/handle-click.ts +++ b/src/panels/lovelace/common/handle-click.ts @@ -33,7 +33,7 @@ export const handleClick = ( case "more-info": if (config.entity || config.camera_image) { fireEvent(node, "hass-more-info", { - entityId: config.entity ? config.entity! : config.camera_image!, + entityId: config.entity ? config.entity : config.camera_image!, }); } break; diff --git a/src/panels/lovelace/hui-unused-entities.ts b/src/panels/lovelace/hui-unused-entities.ts index 10769275cc..949dd0f38a 100644 --- a/src/panels/lovelace/hui-unused-entities.ts +++ b/src/panels/lovelace/hui-unused-entities.ts @@ -64,7 +64,7 @@ export class HuiUnusedEntities extends LitElement { hui-entities-card { max-width: 400px; padding: 4px; - flex: 1; + flex: 1 auto; } `;