mirror of
https://github.com/home-assistant/frontend.git
synced 2025-11-06 09:29:40 +00:00
Fix target picker in logbook card editor (#27804)
Co-authored-by: Wendelin <12148533+wendevlin@users.noreply.github.com>
This commit is contained in:
committed by
Bram Kragten
parent
33b0897522
commit
cdfb7f914f
@@ -87,166 +87,208 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) {
|
|||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
if (this.addOnTop) {
|
if (this.addOnTop) {
|
||||||
return html` ${this._renderChips()} ${this._renderItems()} `;
|
return html` ${this._renderPicker()} ${this._renderItems()} `;
|
||||||
}
|
}
|
||||||
return html` ${this._renderItems()} ${this._renderChips()} `;
|
return html` ${this._renderItems()} ${this._renderPicker()} `;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _renderValueChips() {
|
private _renderValueChips() {
|
||||||
return html`<div class="mdc-chip-set items">
|
const entityIds = this.value?.entity_id
|
||||||
${this.value?.floor_id
|
? ensureArray(this.value.entity_id)
|
||||||
? ensureArray(this.value.floor_id).map(
|
: [];
|
||||||
(floor_id) => html`
|
const deviceIds = this.value?.device_id
|
||||||
<ha-target-picker-value-chip
|
? ensureArray(this.value.device_id)
|
||||||
.hass=${this.hass}
|
: [];
|
||||||
type="floor"
|
const areaIds = this.value?.area_id ? ensureArray(this.value.area_id) : [];
|
||||||
.itemId=${floor_id}
|
const floorIds = this.value?.floor_id
|
||||||
@remove-target-item=${this._handleRemove}
|
? ensureArray(this.value.floor_id)
|
||||||
@expand-target-item=${this._handleExpand}
|
: [];
|
||||||
></ha-target-picker-value-chip>
|
const labelIds = this.value?.label_id
|
||||||
`
|
? ensureArray(this.value.label_id)
|
||||||
)
|
: [];
|
||||||
: nothing}
|
|
||||||
${this.value?.area_id
|
|
||||||
? ensureArray(this.value.area_id).map(
|
|
||||||
(area_id) => html`
|
|
||||||
<ha-target-picker-value-chip
|
|
||||||
.hass=${this.hass}
|
|
||||||
type="area"
|
|
||||||
.itemId=${area_id}
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
@expand-target-item=${this._handleExpand}
|
|
||||||
></ha-target-picker-value-chip>
|
|
||||||
`
|
|
||||||
)
|
|
||||||
: nothing}
|
|
||||||
${this.value?.device_id
|
|
||||||
? ensureArray(this.value.device_id).map(
|
|
||||||
(device_id) => html`
|
|
||||||
<ha-target-picker-value-chip
|
|
||||||
.hass=${this.hass}
|
|
||||||
type="device"
|
|
||||||
.itemId=${device_id}
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
@expand-target-item=${this._handleExpand}
|
|
||||||
></ha-target-picker-value-chip>
|
|
||||||
`
|
|
||||||
)
|
|
||||||
: nothing}
|
|
||||||
${this.value?.entity_id
|
|
||||||
? ensureArray(this.value.entity_id).map(
|
|
||||||
(entity_id) => html`
|
|
||||||
<ha-target-picker-value-chip
|
|
||||||
.hass=${this.hass}
|
|
||||||
type="entity"
|
|
||||||
.itemId=${entity_id}
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
@expand-target-item=${this._handleExpand}
|
|
||||||
></ha-target-picker-value-chip>
|
|
||||||
`
|
|
||||||
)
|
|
||||||
: nothing}
|
|
||||||
${this.value?.label_id
|
|
||||||
? ensureArray(this.value.label_id).map(
|
|
||||||
(label_id) => html`
|
|
||||||
<ha-target-picker-value-chip
|
|
||||||
.hass=${this.hass}
|
|
||||||
type="label"
|
|
||||||
.itemId=${label_id}
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
@expand-target-item=${this._handleExpand}
|
|
||||||
></ha-target-picker-value-chip>
|
|
||||||
`
|
|
||||||
)
|
|
||||||
: nothing}
|
|
||||||
</div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
private _renderValueGroups() {
|
|
||||||
return html`<div class="item-groups">
|
|
||||||
${this.value?.entity_id
|
|
||||||
? html`
|
|
||||||
<ha-target-picker-item-group
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
type="entity"
|
|
||||||
.hass=${this.hass}
|
|
||||||
.items=${{ entity: ensureArray(this.value?.entity_id) }}
|
|
||||||
.deviceFilter=${this.deviceFilter}
|
|
||||||
.entityFilter=${this.entityFilter}
|
|
||||||
.includeDomains=${this.includeDomains}
|
|
||||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
|
||||||
>
|
|
||||||
</ha-target-picker-item-group>
|
|
||||||
`
|
|
||||||
: nothing}
|
|
||||||
${this.value?.device_id
|
|
||||||
? html`
|
|
||||||
<ha-target-picker-item-group
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
type="device"
|
|
||||||
.hass=${this.hass}
|
|
||||||
.items=${{ device: ensureArray(this.value?.device_id) }}
|
|
||||||
.deviceFilter=${this.deviceFilter}
|
|
||||||
.entityFilter=${this.entityFilter}
|
|
||||||
.includeDomains=${this.includeDomains}
|
|
||||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
|
||||||
>
|
|
||||||
</ha-target-picker-item-group>
|
|
||||||
`
|
|
||||||
: nothing}
|
|
||||||
${this.value?.floor_id || this.value?.area_id
|
|
||||||
? html`
|
|
||||||
<ha-target-picker-item-group
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
type="area"
|
|
||||||
.hass=${this.hass}
|
|
||||||
.items=${{
|
|
||||||
floor: ensureArray(this.value?.floor_id),
|
|
||||||
area: ensureArray(this.value?.area_id),
|
|
||||||
}}
|
|
||||||
.deviceFilter=${this.deviceFilter}
|
|
||||||
.entityFilter=${this.entityFilter}
|
|
||||||
.includeDomains=${this.includeDomains}
|
|
||||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
|
||||||
>
|
|
||||||
</ha-target-picker-item-group>
|
|
||||||
`
|
|
||||||
: nothing}
|
|
||||||
${this.value?.label_id
|
|
||||||
? html`
|
|
||||||
<ha-target-picker-item-group
|
|
||||||
@remove-target-item=${this._handleRemove}
|
|
||||||
type="label"
|
|
||||||
.hass=${this.hass}
|
|
||||||
.items=${{ label: ensureArray(this.value?.label_id) }}
|
|
||||||
.deviceFilter=${this.deviceFilter}
|
|
||||||
.entityFilter=${this.entityFilter}
|
|
||||||
.includeDomains=${this.includeDomains}
|
|
||||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
|
||||||
>
|
|
||||||
</ha-target-picker-item-group>
|
|
||||||
`
|
|
||||||
: nothing}
|
|
||||||
</div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
private _renderItems() {
|
|
||||||
if (
|
if (
|
||||||
!this.value?.floor_id &&
|
!entityIds.length &&
|
||||||
!this.value?.area_id &&
|
!deviceIds.length &&
|
||||||
!this.value?.device_id &&
|
!areaIds.length &&
|
||||||
!this.value?.entity_id &&
|
!floorIds.length &&
|
||||||
!this.value?.label_id
|
!labelIds.length
|
||||||
) {
|
) {
|
||||||
return nothing;
|
return nothing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="mdc-chip-set items">
|
||||||
|
${floorIds.length
|
||||||
|
? floorIds.map(
|
||||||
|
(floor_id) => html`
|
||||||
|
<ha-target-picker-value-chip
|
||||||
|
.hass=${this.hass}
|
||||||
|
type="floor"
|
||||||
|
.itemId=${floor_id}
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
@expand-target-item=${this._handleExpand}
|
||||||
|
></ha-target-picker-value-chip>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
: nothing}
|
||||||
|
${areaIds.length
|
||||||
|
? areaIds.map(
|
||||||
|
(area_id) => html`
|
||||||
|
<ha-target-picker-value-chip
|
||||||
|
.hass=${this.hass}
|
||||||
|
type="area"
|
||||||
|
.itemId=${area_id}
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
@expand-target-item=${this._handleExpand}
|
||||||
|
></ha-target-picker-value-chip>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
: nothing}
|
||||||
|
${deviceIds.length
|
||||||
|
? deviceIds.map(
|
||||||
|
(device_id) => html`
|
||||||
|
<ha-target-picker-value-chip
|
||||||
|
.hass=${this.hass}
|
||||||
|
type="device"
|
||||||
|
.itemId=${device_id}
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
@expand-target-item=${this._handleExpand}
|
||||||
|
></ha-target-picker-value-chip>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
: nothing}
|
||||||
|
${entityIds.length
|
||||||
|
? entityIds.map(
|
||||||
|
(entity_id) => html`
|
||||||
|
<ha-target-picker-value-chip
|
||||||
|
.hass=${this.hass}
|
||||||
|
type="entity"
|
||||||
|
.itemId=${entity_id}
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
@expand-target-item=${this._handleExpand}
|
||||||
|
></ha-target-picker-value-chip>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
: nothing}
|
||||||
|
${labelIds.length
|
||||||
|
? labelIds.map(
|
||||||
|
(label_id) => html`
|
||||||
|
<ha-target-picker-value-chip
|
||||||
|
.hass=${this.hass}
|
||||||
|
type="label"
|
||||||
|
.itemId=${label_id}
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
@expand-target-item=${this._handleExpand}
|
||||||
|
></ha-target-picker-value-chip>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
: nothing}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _renderValueGroups() {
|
||||||
|
const entityIds = this.value?.entity_id
|
||||||
|
? ensureArray(this.value.entity_id)
|
||||||
|
: [];
|
||||||
|
const deviceIds = this.value?.device_id
|
||||||
|
? ensureArray(this.value.device_id)
|
||||||
|
: [];
|
||||||
|
const areaIds = this.value?.area_id ? ensureArray(this.value.area_id) : [];
|
||||||
|
const floorIds = this.value?.floor_id
|
||||||
|
? ensureArray(this.value.floor_id)
|
||||||
|
: [];
|
||||||
|
const labelIds = this.value?.label_id
|
||||||
|
? ensureArray(this.value?.label_id)
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (
|
||||||
|
!entityIds.length &&
|
||||||
|
!deviceIds.length &&
|
||||||
|
!areaIds.length &&
|
||||||
|
!floorIds.length &&
|
||||||
|
!labelIds.length
|
||||||
|
) {
|
||||||
|
return nothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div class="item-groups">
|
||||||
|
${entityIds.length
|
||||||
|
? html`
|
||||||
|
<ha-target-picker-item-group
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
type="entity"
|
||||||
|
.hass=${this.hass}
|
||||||
|
.items=${{ entity: entityIds }}
|
||||||
|
.deviceFilter=${this.deviceFilter}
|
||||||
|
.entityFilter=${this.entityFilter}
|
||||||
|
.includeDomains=${this.includeDomains}
|
||||||
|
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||||
|
>
|
||||||
|
</ha-target-picker-item-group>
|
||||||
|
`
|
||||||
|
: nothing}
|
||||||
|
${deviceIds.length
|
||||||
|
? html`
|
||||||
|
<ha-target-picker-item-group
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
type="device"
|
||||||
|
.hass=${this.hass}
|
||||||
|
.items=${{ device: deviceIds }}
|
||||||
|
.deviceFilter=${this.deviceFilter}
|
||||||
|
.entityFilter=${this.entityFilter}
|
||||||
|
.includeDomains=${this.includeDomains}
|
||||||
|
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||||
|
>
|
||||||
|
</ha-target-picker-item-group>
|
||||||
|
`
|
||||||
|
: nothing}
|
||||||
|
${floorIds.length || areaIds.length
|
||||||
|
? html`
|
||||||
|
<ha-target-picker-item-group
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
type="area"
|
||||||
|
.hass=${this.hass}
|
||||||
|
.items=${{
|
||||||
|
floor: floorIds,
|
||||||
|
area: areaIds,
|
||||||
|
}}
|
||||||
|
.deviceFilter=${this.deviceFilter}
|
||||||
|
.entityFilter=${this.entityFilter}
|
||||||
|
.includeDomains=${this.includeDomains}
|
||||||
|
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||||
|
>
|
||||||
|
</ha-target-picker-item-group>
|
||||||
|
`
|
||||||
|
: nothing}
|
||||||
|
${labelIds.length
|
||||||
|
? html`
|
||||||
|
<ha-target-picker-item-group
|
||||||
|
@remove-target-item=${this._handleRemove}
|
||||||
|
type="label"
|
||||||
|
.hass=${this.hass}
|
||||||
|
.items=${{ label: labelIds }}
|
||||||
|
.deviceFilter=${this.deviceFilter}
|
||||||
|
.entityFilter=${this.entityFilter}
|
||||||
|
.includeDomains=${this.includeDomains}
|
||||||
|
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||||
|
>
|
||||||
|
</ha-target-picker-item-group>
|
||||||
|
`
|
||||||
|
: nothing}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _renderItems() {
|
||||||
return html`
|
return html`
|
||||||
${this.compact ? this._renderValueChips() : this._renderValueGroups()}
|
${this.compact ? this._renderValueChips() : this._renderValueGroups()}
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _renderChips() {
|
private _renderPicker() {
|
||||||
return html`
|
return html`
|
||||||
<div class="add-target-wrapper">
|
<div class="add-target-wrapper">
|
||||||
<ha-button
|
<ha-button
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { html, LitElement, nothing } from "lit";
|
import type { HassServiceTarget } from "home-assistant-js-websocket";
|
||||||
|
import { css, html, LitElement, nothing } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
import {
|
import {
|
||||||
array,
|
array,
|
||||||
@@ -9,21 +10,20 @@ import {
|
|||||||
optional,
|
optional,
|
||||||
string,
|
string,
|
||||||
} from "superstruct";
|
} from "superstruct";
|
||||||
import type { HassServiceTarget } from "home-assistant-js-websocket";
|
|
||||||
import { fireEvent } from "../../../../common/dom/fire_event";
|
import { fireEvent } from "../../../../common/dom/fire_event";
|
||||||
import "../../../../components/entity/ha-entities-picker";
|
import "../../../../components/entity/ha-entities-picker";
|
||||||
import "../../../../components/ha-target-picker";
|
|
||||||
import "../../../../components/ha-form/ha-form";
|
import "../../../../components/ha-form/ha-form";
|
||||||
import type { SchemaUnion } from "../../../../components/ha-form/types";
|
import type { SchemaUnion } from "../../../../components/ha-form/types";
|
||||||
|
import "../../../../components/ha-target-picker";
|
||||||
|
import type { HaEntityPickerEntityFilterFunc } from "../../../../data/entity";
|
||||||
import { filterLogbookCompatibleEntities } from "../../../../data/logbook";
|
import { filterLogbookCompatibleEntities } from "../../../../data/logbook";
|
||||||
|
import { targetStruct } from "../../../../data/script";
|
||||||
|
import { getSensorNumericDeviceClasses } from "../../../../data/sensor";
|
||||||
import type { HomeAssistant } from "../../../../types";
|
import type { HomeAssistant } from "../../../../types";
|
||||||
|
import { DEFAULT_HOURS_TO_SHOW } from "../../cards/hui-logbook-card";
|
||||||
import type { LogbookCardConfig } from "../../cards/types";
|
import type { LogbookCardConfig } from "../../cards/types";
|
||||||
import type { LovelaceCardEditor } from "../../types";
|
import type { LovelaceCardEditor } from "../../types";
|
||||||
import { baseLovelaceCardConfig } from "../structs/base-card-struct";
|
import { baseLovelaceCardConfig } from "../structs/base-card-struct";
|
||||||
import { DEFAULT_HOURS_TO_SHOW } from "../../cards/hui-logbook-card";
|
|
||||||
import { targetStruct } from "../../../../data/script";
|
|
||||||
import { getSensorNumericDeviceClasses } from "../../../../data/sensor";
|
|
||||||
import type { HaEntityPickerEntityFilterFunc } from "../../../../data/entity";
|
|
||||||
|
|
||||||
const cardConfigStruct = assign(
|
const cardConfigStruct = assign(
|
||||||
baseLovelaceCardConfig,
|
baseLovelaceCardConfig,
|
||||||
@@ -116,7 +116,6 @@ export class HuiLogbookCardEditor
|
|||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.entityFilter=${this._filterFunc}
|
.entityFilter=${this._filterFunc}
|
||||||
.value=${this._targetPicker}
|
.value=${this._targetPicker}
|
||||||
add-on-top
|
|
||||||
@value-changed=${this._entitiesChanged}
|
@value-changed=${this._entitiesChanged}
|
||||||
></ha-target-picker>
|
></ha-target-picker>
|
||||||
`;
|
`;
|
||||||
@@ -148,6 +147,13 @@ export class HuiLogbookCardEditor
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static styles = css`
|
||||||
|
ha-target-picker {
|
||||||
|
display: block;
|
||||||
|
margin-top: var(--ha-space-4);
|
||||||
|
}
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
|||||||
Reference in New Issue
Block a user