From 54fcb219171d934d368067f5a836b30f53ac1f1f Mon Sep 17 00:00:00 2001 From: Jerad Meisner Date: Sun, 1 Jul 2018 08:28:25 -0700 Subject: [PATCH] Love: Allow custom title per entity in entities card (#1374) * Allow custom title per entity in entities card * Change entityConfig to config * Only pass title to state-cards --- src/components/entity/state-info.js | 5 +++-- src/panels/lovelace/cards/hui-entities-card.js | 15 +++++++++++++-- src/state-summary/state-card-climate.js | 8 +++++++- src/state-summary/state-card-configurator.js | 8 +++++++- src/state-summary/state-card-cover.js | 8 +++++++- src/state-summary/state-card-display.js | 8 +++++++- src/state-summary/state-card-input_number.js | 10 ++++++++-- src/state-summary/state-card-input_select.js | 3 ++- src/state-summary/state-card-input_text.js | 10 ++++++++-- src/state-summary/state-card-media_player.js | 8 +++++++- src/state-summary/state-card-scene.js | 8 +++++++- src/state-summary/state-card-script.js | 8 +++++++- src/state-summary/state-card-timer.js | 8 +++++++- src/state-summary/state-card-toggle.js | 8 +++++++- src/state-summary/state-card-weblink.js | 3 ++- 15 files changed, 99 insertions(+), 19 deletions(-) diff --git a/src/components/entity/state-info.js b/src/components/entity/state-info.js index f0dddbd9b0..ef8c34627f 100644 --- a/src/components/entity/state-info.js +++ b/src/components/entity/state-info.js @@ -82,12 +82,13 @@ class StateInfo extends PolymerElement { }, hass: Object, stateObj: Object, - inDialog: Boolean + inDialog: Boolean, + overrideName: String }; } computeStateName(stateObj) { - return computeStateName(stateObj); + return this.overrideName || computeStateName(stateObj); } } diff --git a/src/panels/lovelace/cards/hui-entities-card.js b/src/panels/lovelace/cards/hui-entities-card.js index f5ab0cc5df..ee02989a39 100644 --- a/src/panels/lovelace/cards/hui-entities-card.js +++ b/src/panels/lovelace/cards/hui-entities-card.js @@ -5,6 +5,8 @@ import { PolymerElement } from '@polymer/polymer/polymer-element.js'; import stateCardType from '../../../common/entity/state_card_type.js'; import computeDomain from '../../../common/entity/compute_domain.js'; import { DOMAINS_HIDE_MORE_INFO } from '../../../common/const.js'; +import computeConfigEntities from '../common/compute-config-entities'; +import validateEntitiesConfig from '../common/validate-entities-config'; import '../../../components/ha-card.js'; import '../components/hui-entities-toggle.js'; @@ -98,6 +100,10 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) { } setConfig(config) { + if (!validateEntitiesConfig(config)) { + throw Error('Error in card config.'); + } + this._config = config; if (this.$) this._buildConfig(); } @@ -105,6 +111,7 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) { _buildConfig() { const config = this._config; const root = this.$.states; + const entities = computeConfigEntities(config); while (root.lastChild) { root.removeChild(root.lastChild); @@ -112,8 +119,9 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) { this._elements = []; - for (let i = 0; i < config.entities.length; i++) { - const entityId = config.entities[i]; + for (let i = 0; i < entities.length; i++) { + const entity = entities[i]; + const entityId = entity.entity; if (!(entityId in this.hass.states)) continue; const stateObj = this.hass.states[entityId]; const tag = stateObj ? `state-card-${stateCardType(this.hass, stateObj)}` : 'state-card-display'; @@ -124,6 +132,9 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) { } element.stateObj = stateObj; element.hass = this.hass; + if (entity.title) { + element.overrideName = entity.title; + } this._elements.push({ entityId, element }); const container = document.createElement('div'); container.appendChild(element); diff --git a/src/state-summary/state-card-climate.js b/src/state-summary/state-card-climate.js index 3456d33e85..109f4e7107 100644 --- a/src/state-summary/state-card-climate.js +++ b/src/state-summary/state-card-climate.js @@ -30,7 +30,12 @@ class StateCardClimate extends PolymerElement { static get stateInfoTemplate() { return html` - + + `; } @@ -42,6 +47,7 @@ class StateCardClimate extends PolymerElement { type: Boolean, value: false, }, + overrideName: String }; } } diff --git a/src/state-summary/state-card-configurator.js b/src/state-summary/state-card-configurator.js index b2c0aff2ba..4bb44b70af 100644 --- a/src/state-summary/state-card-configurator.js +++ b/src/state-summary/state-card-configurator.js @@ -38,7 +38,12 @@ class StateCardConfigurator extends LocalizeMixin(PolymerElement) { static get stateInfoTemplate() { return html` - + + `; } @@ -50,6 +55,7 @@ class StateCardConfigurator extends LocalizeMixin(PolymerElement) { type: Boolean, value: false, }, + overrideName: String }; } diff --git a/src/state-summary/state-card-cover.js b/src/state-summary/state-card-cover.js index 86474cdf97..a94ddbcd1f 100644 --- a/src/state-summary/state-card-cover.js +++ b/src/state-summary/state-card-cover.js @@ -29,7 +29,12 @@ class StateCardCover extends PolymerElement { static get stateInfoTemplate() { return html` - + + `; } @@ -45,6 +50,7 @@ class StateCardCover extends PolymerElement { type: Object, computed: 'computeEntityObj(hass, stateObj)', }, + overrideName: String }; } diff --git a/src/state-summary/state-card-display.js b/src/state-summary/state-card-display.js index 387048c431..57fb7743cf 100644 --- a/src/state-summary/state-card-display.js +++ b/src/state-summary/state-card-display.js @@ -46,7 +46,12 @@ class StateCardDisplay extends LocalizeMixin(PolymerElement) { static get stateInfoTemplate() { return html` - + + `; } @@ -58,6 +63,7 @@ class StateCardDisplay extends LocalizeMixin(PolymerElement) { type: Boolean, value: false, }, + overrideName: String }; } diff --git a/src/state-summary/state-card-input_number.js b/src/state-summary/state-card-input_number.js index cd0fca15e5..115e57e0d4 100644 --- a/src/state-summary/state-card-input_number.js +++ b/src/state-summary/state-card-input_number.js @@ -51,7 +51,12 @@ class StateCardInputNumber extends mixinBehaviors([ static get stateInfoTemplate() { return html` - + + `; } @@ -108,7 +113,8 @@ class StateCardInputNumber extends mixinBehaviors([ }, mode: { type: String, - } + }, + overrideName: String }; } diff --git a/src/state-summary/state-card-input_select.js b/src/state-summary/state-card-input_select.js index a8d36e0bbd..2b8fbd6d36 100644 --- a/src/state-summary/state-card-input_select.js +++ b/src/state-summary/state-card-input_select.js @@ -60,11 +60,12 @@ class StateCardInputSelect extends PolymerElement { type: String, observer: 'selectedOptionChanged', }, + overrideName: String }; } _computeStateName(stateObj) { - return computeStateName(stateObj); + return this.overrideName || computeStateName(stateObj); } computeSelected(stateObj) { diff --git a/src/state-summary/state-card-input_text.js b/src/state-summary/state-card-input_text.js index 8e8a298216..f0778b6c4a 100644 --- a/src/state-summary/state-card-input_text.js +++ b/src/state-summary/state-card-input_text.js @@ -25,7 +25,12 @@ class StateCardInputText extends PolymerElement { static get stateInfoTemplate() { return html` - + + `; } @@ -45,7 +50,8 @@ class StateCardInputText extends PolymerElement { }, pattern: String, - value: String + value: String, + overrideName: String }; } diff --git a/src/state-summary/state-card-media_player.js b/src/state-summary/state-card-media_player.js index d95f9721a0..f751d59c0c 100644 --- a/src/state-summary/state-card-media_player.js +++ b/src/state-summary/state-card-media_player.js @@ -53,7 +53,12 @@ class StateCardMediaPlayer extends LocalizeMixin(PolymerElement) { static get stateInfoTemplate() { return html` - + + `; } @@ -69,6 +74,7 @@ class StateCardMediaPlayer extends LocalizeMixin(PolymerElement) { type: Object, computed: 'computePlayerObj(hass, stateObj)', }, + overrideName: String }; } diff --git a/src/state-summary/state-card-scene.js b/src/state-summary/state-card-scene.js index f2fe51b612..f64374dfea 100644 --- a/src/state-summary/state-card-scene.js +++ b/src/state-summary/state-card-scene.js @@ -32,7 +32,12 @@ class StateCardScene extends LocalizeMixin(PolymerElement) { static get stateInfoTemplate() { return html` - + + `; } @@ -44,6 +49,7 @@ class StateCardScene extends LocalizeMixin(PolymerElement) { type: Boolean, value: false, }, + overrideName: String }; } diff --git a/src/state-summary/state-card-script.js b/src/state-summary/state-card-script.js index 0ca95df3c1..3d39d854ad 100644 --- a/src/state-summary/state-card-script.js +++ b/src/state-summary/state-card-script.js @@ -43,7 +43,12 @@ class StateCardScript extends LocalizeMixin(PolymerElement) { static get stateInfoTemplate() { return html` - + + `; } @@ -55,6 +60,7 @@ class StateCardScript extends LocalizeMixin(PolymerElement) { type: Boolean, value: false, }, + overrideName: String }; } diff --git a/src/state-summary/state-card-timer.js b/src/state-summary/state-card-timer.js index 8ef22b5c36..cea5e627ca 100644 --- a/src/state-summary/state-card-timer.js +++ b/src/state-summary/state-card-timer.js @@ -36,7 +36,12 @@ class StateCardTimer extends LocalizeMixin(PolymerElement) { static get stateInfoTemplate() { return html` - + + `; } @@ -52,6 +57,7 @@ class StateCardTimer extends LocalizeMixin(PolymerElement) { type: Boolean, value: false, }, + overrideName: String }; } diff --git a/src/state-summary/state-card-toggle.js b/src/state-summary/state-card-toggle.js index a62bb114de..84474ea183 100644 --- a/src/state-summary/state-card-toggle.js +++ b/src/state-summary/state-card-toggle.js @@ -25,7 +25,12 @@ class StateCardToggle extends PolymerElement { static get stateInfoTemplate() { return html` - + + `; } @@ -37,6 +42,7 @@ class StateCardToggle extends PolymerElement { type: Boolean, value: false, }, + overrideName: String }; } } diff --git a/src/state-summary/state-card-weblink.js b/src/state-summary/state-card-weblink.js index 05f1b80c7b..583e140699 100644 --- a/src/state-summary/state-card-weblink.js +++ b/src/state-summary/state-card-weblink.js @@ -41,6 +41,7 @@ class StateCardWeblink extends PolymerElement { type: Boolean, value: false, }, + overrideName: String }; } @@ -50,7 +51,7 @@ class StateCardWeblink extends PolymerElement { } _computeStateName(stateObj) { - return computeStateName(stateObj); + return this.overrideName || computeStateName(stateObj); } onTap(ev) {