From ff9f33128735c41edf7737a9a63be56eede37d10 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 6 May 2024 06:26:13 -0700 Subject: [PATCH] Expand createDomains to more selectors (#20714) Expand createDomains to more pickers --- src/components/entity/ha-entities-picker.ts | 4 +++ .../ha-selector/ha-selector-entity.ts | 12 ++++++- .../ha-selector/ha-selector-target.ts | 8 ++++- src/components/ha-service-control.ts | 12 ++----- src/data/selector.ts | 33 ++++++++++++++++++- 5 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/components/entity/ha-entities-picker.ts b/src/components/entity/ha-entities-picker.ts index b121e34ee4..44d9608967 100644 --- a/src/components/entity/ha-entities-picker.ts +++ b/src/components/entity/ha-entities-picker.ts @@ -76,6 +76,8 @@ class HaEntitiesPickerLight extends LitElement { @property({ attribute: false }) public entityFilter?: HaEntityPickerEntityFilterFunc; + @property({ type: Array }) public createDomains?: string[]; + protected render() { if (!this.hass) { return nothing; @@ -103,6 +105,7 @@ class HaEntitiesPickerLight extends LitElement { .value=${entityId} .label=${this.pickedEntityLabel} .disabled=${this.disabled} + .createDomains=${this.createDomains} @value-changed=${this._entityChanged} > @@ -122,6 +125,7 @@ class HaEntitiesPickerLight extends LitElement { .label=${this.pickEntityLabel} .helper=${this.helper} .disabled=${this.disabled} + .createDomains=${this.createDomains} .required=${this.required && !currentEntities.length} @value-changed=${this._addEntity} > diff --git a/src/components/ha-selector/ha-selector-entity.ts b/src/components/ha-selector/ha-selector-entity.ts index ff7b4da106..b63e00884a 100644 --- a/src/components/ha-selector/ha-selector-entity.ts +++ b/src/components/ha-selector/ha-selector-entity.ts @@ -8,7 +8,10 @@ import { fetchEntitySourcesWithCache, } from "../../data/entity_sources"; import type { EntitySelector } from "../../data/selector"; -import { filterSelectorEntities } from "../../data/selector"; +import { + filterSelectorEntities, + computeCreateDomains, +} from "../../data/selector"; import { HomeAssistant } from "../../types"; import "../entity/ha-entities-picker"; import "../entity/ha-entity-picker"; @@ -31,6 +34,8 @@ export class HaEntitySelector extends LitElement { @property({ type: Boolean }) public required = true; + @state() private _createDomains: string[] | undefined; + private _hasIntegration(selector: EntitySelector) { return ( selector.entity?.filter && @@ -64,6 +69,7 @@ export class HaEntitySelector extends LitElement { .includeEntities=${this.selector.entity?.include_entities} .excludeEntities=${this.selector.entity?.exclude_entities} .entityFilter=${this._filterEntities} + .createDomains=${this._createDomains} .disabled=${this.disabled} .required=${this.required} allow-custom-entity @@ -79,6 +85,7 @@ export class HaEntitySelector extends LitElement { .includeEntities=${this.selector.entity.include_entities} .excludeEntities=${this.selector.entity.exclude_entities} .entityFilter=${this._filterEntities} + .createDomains=${this._createDomains} .disabled=${this.disabled} .required=${this.required} > @@ -96,6 +103,9 @@ export class HaEntitySelector extends LitElement { this._entitySources = sources; }); } + if (changedProps.has("selector")) { + this._createDomains = computeCreateDomains(this.selector); + } } private _filterEntities = (entity: HassEntity): boolean => { diff --git a/src/components/ha-selector/ha-selector-target.ts b/src/components/ha-selector/ha-selector-target.ts index a37557c1bd..aab5e8662a 100644 --- a/src/components/ha-selector/ha-selector-target.ts +++ b/src/components/ha-selector/ha-selector-target.ts @@ -22,6 +22,7 @@ import { filterSelectorDevices, filterSelectorEntities, TargetSelector, + computeCreateDomains, } from "../../data/selector"; import type { HomeAssistant } from "../../types"; import "../ha-target-picker"; @@ -42,6 +43,8 @@ export class HaTargetSelector extends LitElement { @state() private _entitySources?: EntitySources; + @state() private _createDomains: string[] | undefined; + private _deviceIntegrationLookup = memoizeOne(getDeviceIntegrationLookup); private _hasIntegration(selector: TargetSelector) { @@ -68,6 +71,9 @@ export class HaTargetSelector extends LitElement { this._entitySources = sources; }); } + if (changedProperties.has("selector")) { + this._createDomains = computeCreateDomains(this.selector); + } } protected render() { @@ -82,7 +88,7 @@ export class HaTargetSelector extends LitElement { .deviceFilter=${this._filterDevices} .entityFilter=${this._filterEntities} .disabled=${this.disabled} - .createDomains=${this.selector.target?.create_domains} + .createDomains=${this._createDomains} >`; } diff --git a/src/components/ha-service-control.ts b/src/components/ha-service-control.ts index 83da022e29..83df104f54 100644 --- a/src/components/ha-service-control.ts +++ b/src/components/ha-service-control.ts @@ -44,7 +44,6 @@ import "./ha-service-picker"; import "./ha-settings-row"; import "./ha-yaml-editor"; import type { HaYamlEditor } from "./ha-yaml-editor"; -import { isHelperDomain } from "../panels/config/helpers/const"; const attributeFilter = (values: any[], attribute: any) => { if (typeof attribute === "object") { @@ -366,12 +365,8 @@ export class HaServiceControl extends LitElement { } private _targetSelector = memoizeOne( - (targetSelector: TargetSelector | null | undefined, domain?: string) => { - const create_domains = isHelperDomain(domain) ? [domain] : undefined; - return targetSelector - ? { target: { ...targetSelector, create_domains } } - : { target: { create_domains } }; - } + (targetSelector: TargetSelector | null | undefined) => + targetSelector ? { target: { ...targetSelector } } : { target: {} } ); protected render() { @@ -462,8 +457,7 @@ export class HaServiceControl extends LitElement { > { + let entityFilters: EntitySelectorFilter[] | undefined; + + if ("target" in selector) { + entityFilters = ensureArray(selector.target?.entity); + } else if ("entity" in selector) { + if (selector.entity?.include_entities) { + return undefined; + } + entityFilters = ensureArray(selector.entity?.filter); + } + if (!entityFilters) { + return undefined; + } + + const createDomains = entityFilters.flatMap((entityFilter) => + !entityFilter.integration && + !entityFilter.device_class && + !entityFilter.supported_features && + entityFilter.domain + ? ensureArray(entityFilter.domain).filter((domain) => + isHelperDomain(domain) + ) + : [] + ); + + return [...new Set(createDomains)]; +};