mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-25 18:26:35 +00:00
Love: Entities card: add turn on/off all (#1337)
* Love: Entities card: add turn on/off all * Cleanup * Fix hide toggle * Lint * Lint * Feedback * Lint * Fix ent pic card
This commit is contained in:
parent
be7900cd87
commit
479de6c4c7
@ -122,13 +122,16 @@ class HaEntityToggle extends PolymerElement {
|
|||||||
|
|
||||||
if (stateDomain === 'lock') {
|
if (stateDomain === 'lock') {
|
||||||
serviceDomain = 'lock';
|
serviceDomain = 'lock';
|
||||||
service = turnOn ? 'lock' : 'unlock';
|
service = turnOn ? 'unlock' : 'lock';
|
||||||
} else if (stateDomain === 'cover') {
|
} else if (stateDomain === 'cover') {
|
||||||
serviceDomain = 'cover';
|
serviceDomain = 'cover';
|
||||||
service = turnOn ? 'open' : 'close';
|
service = turnOn ? 'open_cover' : 'close_cover';
|
||||||
} else {
|
} else if (stateDomain === 'group') {
|
||||||
serviceDomain = 'homeassistant';
|
serviceDomain = 'homeassistant';
|
||||||
service = turnOn ? 'turn_on' : 'turn_off';
|
service = turnOn ? 'turn_on' : 'turn_off';
|
||||||
|
} else {
|
||||||
|
serviceDomain = stateDomain;
|
||||||
|
service = turnOn ? 'turn_on' : 'turn_off';
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentState = this.stateObj;
|
const currentState = this.stateObj;
|
||||||
|
@ -7,6 +7,7 @@ import computeDomain from '../../../common/entity/compute_domain.js';
|
|||||||
import { DOMAINS_HIDE_MORE_INFO } from '../../../common/const.js';
|
import { DOMAINS_HIDE_MORE_INFO } from '../../../common/const.js';
|
||||||
|
|
||||||
import '../../../components/ha-card.js';
|
import '../../../components/ha-card.js';
|
||||||
|
import '../components/hui-entities-toggle.js';
|
||||||
|
|
||||||
// just importing this now as shortcut to import correct state-card-*
|
// just importing this now as shortcut to import correct state-card-*
|
||||||
import '../../../state-summary/state-card-content.js';
|
import '../../../state-summary/state-card-content.js';
|
||||||
@ -36,6 +37,8 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) {
|
|||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
color: var(--primary-text-color);
|
color: var(--primary-text-color);
|
||||||
padding: 4px 0 12px;
|
padding: 4px 0 12px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
.header .name {
|
.header .name {
|
||||||
@apply --paper-font-common-nowrap;
|
@apply --paper-font-common-nowrap;
|
||||||
@ -48,6 +51,9 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) {
|
|||||||
<ha-card>
|
<ha-card>
|
||||||
<div class='header'>
|
<div class='header'>
|
||||||
<div class="name">[[_computeTitle(config)]]</div>
|
<div class="name">[[_computeTitle(config)]]</div>
|
||||||
|
<template is="dom-if" if="[[_showHeaderToggle(config.show_header_toggle)]]">
|
||||||
|
<hui-entities-toggle hass="[[hass]]" entities="[[config.entities]]"></hui-entities-toggle>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div id="states"></div>
|
<div id="states"></div>
|
||||||
</ha-card>
|
</ha-card>
|
||||||
@ -81,6 +87,10 @@ class HuiEntitiesCard extends EventsMixin(PolymerElement) {
|
|||||||
return config.title;
|
return config.title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_showHeaderToggle(show) {
|
||||||
|
return show !== false;
|
||||||
|
}
|
||||||
|
|
||||||
_configChanged(config) {
|
_configChanged(config) {
|
||||||
const root = this.$.states;
|
const root = this.$.states;
|
||||||
|
|
||||||
|
@ -124,17 +124,17 @@ class HuiPictureCard extends LocalizeMixin(PolymerElement) {
|
|||||||
if (domain === 'weblink') {
|
if (domain === 'weblink') {
|
||||||
window.open(this.hass.states[entityId].state);
|
window.open(this.hass.states[entityId].state);
|
||||||
} else {
|
} else {
|
||||||
const isOn = STATES_ON.includes(this.hass.states[entityId].state);
|
const turnOn = !STATES_ON.includes(this.hass.states[entityId].state);
|
||||||
let service;
|
let service;
|
||||||
switch (domain) {
|
switch (domain) {
|
||||||
case 'lock':
|
case 'lock':
|
||||||
service = isOn ? 'unlock' : 'lock';
|
service = turnOn ? 'unlock' : 'lock';
|
||||||
break;
|
break;
|
||||||
case 'cover':
|
case 'cover':
|
||||||
service = isOn ? 'close' : 'open';
|
service = turnOn ? 'open_cover' : 'close_cover';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
service = isOn ? 'turn_off' : 'turn_on';
|
service = turnOn ? 'turn_on' : 'turn_off';
|
||||||
}
|
}
|
||||||
this.hass.callService(domain, service, { entity_id: entityId });
|
this.hass.callService(domain, service, { entity_id: entityId });
|
||||||
}
|
}
|
||||||
|
84
src/panels/lovelace/components/hui-entities-toggle.js
Normal file
84
src/panels/lovelace/components/hui-entities-toggle.js
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import { html } from '@polymer/polymer/lib/utils/html-tag.js';
|
||||||
|
import { PolymerElement } from '@polymer/polymer/polymer-element.js';
|
||||||
|
import '@polymer/paper-toggle-button/paper-toggle-button.js';
|
||||||
|
|
||||||
|
import canToggleState from '../../../common/entity/can_toggle_state.js';
|
||||||
|
import computeDomain from '../../../common/entity/compute_domain.js';
|
||||||
|
import { STATES_ON } from '../../../common/const.js';
|
||||||
|
|
||||||
|
class HuiEntitiesToggle extends PolymerElement {
|
||||||
|
static get template() {
|
||||||
|
return html`
|
||||||
|
<style>
|
||||||
|
:host {
|
||||||
|
width: 38px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
paper-toggle-button {
|
||||||
|
cursor: pointer;
|
||||||
|
--paper-toggle-button-label-spacing: 0;
|
||||||
|
padding: 13px 5px;
|
||||||
|
margin: -4px -5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<template is="dom-if" if="[[_toggleEntities.length]]">
|
||||||
|
<paper-toggle-button checked="[[_computeIsChecked(hass, _toggleEntities)]]" on-change="_callService"></paper-toggle-button>
|
||||||
|
</template>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
static get properties() {
|
||||||
|
return {
|
||||||
|
hass: Object,
|
||||||
|
entities: Array,
|
||||||
|
_toggleEntities: {
|
||||||
|
type: Array,
|
||||||
|
computed: '_computeToggleEntities(hass, entities)'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
_computeToggleEntities(hass, entities) {
|
||||||
|
return entities.filter(entity => (entity in hass.states ?
|
||||||
|
canToggleState(hass, hass.states[entity]) : false));
|
||||||
|
}
|
||||||
|
|
||||||
|
_computeIsChecked(hass, entities) {
|
||||||
|
return entities.some(entity => STATES_ON.includes(hass.states[entity].state));
|
||||||
|
}
|
||||||
|
|
||||||
|
_callService(ev) {
|
||||||
|
const turnOn = ev.target.checked;
|
||||||
|
const toCall = {};
|
||||||
|
|
||||||
|
this.entities.forEach((entity) => {
|
||||||
|
if ((STATES_ON.includes(this.hass.states[entity].state)) !== turnOn) {
|
||||||
|
const stateDomain = computeDomain(entity);
|
||||||
|
const serviceDomain = stateDomain === 'lock' || stateDomain === 'cover' ?
|
||||||
|
stateDomain : 'homeassistant';
|
||||||
|
|
||||||
|
if (!(serviceDomain in toCall)) toCall[serviceDomain] = [];
|
||||||
|
toCall[serviceDomain].push(entity);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.keys(toCall).forEach((domain) => {
|
||||||
|
let service;
|
||||||
|
switch (domain) {
|
||||||
|
case 'lock':
|
||||||
|
service = turnOn ? 'unlock' : 'lock';
|
||||||
|
break;
|
||||||
|
case 'cover':
|
||||||
|
service = turnOn ? 'open_cover' : 'close_cover';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
service = turnOn ? 'turn_on' : 'turn_off';
|
||||||
|
}
|
||||||
|
|
||||||
|
const entities = toCall[domain];
|
||||||
|
this.hass.callService(domain, service, { entity_id: entities });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define('hui-entities-toggle', HuiEntitiesToggle);
|
Loading…
x
Reference in New Issue
Block a user