mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-07 17:36:35 +00:00
Add image type for picture-elements card. (#1428)
* Add image type for picture-elements. * Rebased master. Move overflow rule to parent. * Cleaned up click handler.
This commit is contained in:
parent
c90a3dcdfd
commit
19e58c775e
@ -6,9 +6,11 @@ import '../../../components/entity/ha-state-label-badge.js';
|
||||
import '../../../components/entity/state-badge.js';
|
||||
import '../../../components/ha-icon.js';
|
||||
import '../../../components/ha-card.js';
|
||||
import '../components/hui-image.js';
|
||||
|
||||
import computeStateDisplay from '../../../common/entity/compute_state_display.js';
|
||||
import computeStateName from '../../../common/entity/compute_state_name.js';
|
||||
import computeDomain from '../../../common/entity/compute_domain';
|
||||
import toggleEntity from '../common/entity/toggle-entity.js';
|
||||
|
||||
import EventsMixin from '../../../mixins/events-mixin.js';
|
||||
@ -16,6 +18,7 @@ import LocalizeMixin from '../../../mixins/localize-mixin.js';
|
||||
import NavigateMixin from '../../../mixins/navigate-mixin.js';
|
||||
|
||||
const VALID_TYPES = new Set([
|
||||
'image',
|
||||
'navigation',
|
||||
'service-button',
|
||||
'state-badge',
|
||||
@ -58,6 +61,9 @@ class HuiPictureElementsCard extends NavigateMixin(EventsMixin(LocalizeMixin(Pol
|
||||
color: var(--primary-color);
|
||||
white-space: nowrap;
|
||||
}
|
||||
hui-image {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
<ha-card header="[[_config.title]]">
|
||||
@ -81,6 +87,7 @@ class HuiPictureElementsCard extends NavigateMixin(EventsMixin(LocalizeMixin(Pol
|
||||
this._stateBadges = [];
|
||||
this._stateIcons = [];
|
||||
this._stateLabels = [];
|
||||
this._images = [];
|
||||
}
|
||||
|
||||
ready() {
|
||||
@ -139,13 +146,13 @@ class HuiPictureElementsCard extends NavigateMixin(EventsMixin(LocalizeMixin(Pol
|
||||
break;
|
||||
case 'state-icon':
|
||||
el = document.createElement('state-badge');
|
||||
el.addEventListener('click', () => this._handleClick(entityId, element.tap_action === 'toggle'));
|
||||
el.addEventListener('click', () => this._handleClick(element));
|
||||
el.classList.add('clickable');
|
||||
this._stateIcons.push({ el, entityId });
|
||||
break;
|
||||
case 'state-label':
|
||||
el = document.createElement('div');
|
||||
el.addEventListener('click', () => this._handleClick(entityId, false));
|
||||
el.addEventListener('click', () => this._handleClick(element));
|
||||
el.classList.add('clickable', 'state-label');
|
||||
this._stateLabels.push({ el, entityId });
|
||||
break;
|
||||
@ -156,6 +163,23 @@ class HuiPictureElementsCard extends NavigateMixin(EventsMixin(LocalizeMixin(Pol
|
||||
el.title = element.navigation_path;
|
||||
el.classList.add('clickable');
|
||||
break;
|
||||
case 'image':
|
||||
el = document.createElement('hui-image');
|
||||
el.hass = this.hass;
|
||||
el.entity = element.entity;
|
||||
el.image = element.image;
|
||||
el.stateImage = element.state_image;
|
||||
el.filter = element.filter;
|
||||
el.stateFilter = element.state_filter;
|
||||
if (!element.camera_image && computeDomain(element.entity) === 'camera') {
|
||||
el.cameraImage = element.entity;
|
||||
} else {
|
||||
el.cameraImage = element.camera_image;
|
||||
}
|
||||
this._images.push(el);
|
||||
if (element.tap_action === 'none') break;
|
||||
el.addEventListener('click', () => this._handleClick(element));
|
||||
el.classList.add('clickable');
|
||||
}
|
||||
|
||||
el.classList.add('element');
|
||||
@ -197,17 +221,34 @@ class HuiPictureElementsCard extends NavigateMixin(EventsMixin(LocalizeMixin(Pol
|
||||
el.title = '';
|
||||
}
|
||||
});
|
||||
|
||||
this._images.forEach((el) => {
|
||||
el.hass = hass;
|
||||
});
|
||||
}
|
||||
|
||||
_computeTooltip(stateObj) {
|
||||
return `${computeStateName(stateObj)}: ${computeStateDisplay(this.localize, stateObj)}`;
|
||||
}
|
||||
|
||||
_handleClick(entityId, toggle) {
|
||||
if (toggle) {
|
||||
toggleEntity(this.hass, entityId);
|
||||
} else {
|
||||
this.fire('hass-more-info', { entityId });
|
||||
_handleClick(elementConfig) {
|
||||
const tapAction = elementConfig.tap_action || 'more_info';
|
||||
|
||||
switch (tapAction) {
|
||||
case 'more_info':
|
||||
this.fire('hass-more-info', { entityId: elementConfig.entity });
|
||||
break;
|
||||
case 'toggle':
|
||||
toggleEntity(this.hass, elementConfig.entity);
|
||||
break;
|
||||
case 'call_service': {
|
||||
const [domain, service] = elementConfig.service.split('.', 2);
|
||||
const serviceData = Object.assign(
|
||||
{}, { entity_id: elementConfig.entity },
|
||||
elementConfig.service_data
|
||||
);
|
||||
this.hass.callService(domain, service, serviceData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user