mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-28 03:36:44 +00:00
Expand createDomains to more selectors (#20714)
Expand createDomains to more pickers
This commit is contained in:
parent
cdf64ccdaa
commit
ff9f331287
@ -76,6 +76,8 @@ class HaEntitiesPickerLight extends LitElement {
|
|||||||
@property({ attribute: false })
|
@property({ attribute: false })
|
||||||
public entityFilter?: HaEntityPickerEntityFilterFunc;
|
public entityFilter?: HaEntityPickerEntityFilterFunc;
|
||||||
|
|
||||||
|
@property({ type: Array }) public createDomains?: string[];
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
if (!this.hass) {
|
if (!this.hass) {
|
||||||
return nothing;
|
return nothing;
|
||||||
@ -103,6 +105,7 @@ class HaEntitiesPickerLight extends LitElement {
|
|||||||
.value=${entityId}
|
.value=${entityId}
|
||||||
.label=${this.pickedEntityLabel}
|
.label=${this.pickedEntityLabel}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
|
.createDomains=${this.createDomains}
|
||||||
@value-changed=${this._entityChanged}
|
@value-changed=${this._entityChanged}
|
||||||
></ha-entity-picker>
|
></ha-entity-picker>
|
||||||
</div>
|
</div>
|
||||||
@ -122,6 +125,7 @@ class HaEntitiesPickerLight extends LitElement {
|
|||||||
.label=${this.pickEntityLabel}
|
.label=${this.pickEntityLabel}
|
||||||
.helper=${this.helper}
|
.helper=${this.helper}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
|
.createDomains=${this.createDomains}
|
||||||
.required=${this.required && !currentEntities.length}
|
.required=${this.required && !currentEntities.length}
|
||||||
@value-changed=${this._addEntity}
|
@value-changed=${this._addEntity}
|
||||||
></ha-entity-picker>
|
></ha-entity-picker>
|
||||||
|
@ -8,7 +8,10 @@ import {
|
|||||||
fetchEntitySourcesWithCache,
|
fetchEntitySourcesWithCache,
|
||||||
} from "../../data/entity_sources";
|
} from "../../data/entity_sources";
|
||||||
import type { EntitySelector } from "../../data/selector";
|
import type { EntitySelector } from "../../data/selector";
|
||||||
import { filterSelectorEntities } from "../../data/selector";
|
import {
|
||||||
|
filterSelectorEntities,
|
||||||
|
computeCreateDomains,
|
||||||
|
} from "../../data/selector";
|
||||||
import { HomeAssistant } from "../../types";
|
import { HomeAssistant } from "../../types";
|
||||||
import "../entity/ha-entities-picker";
|
import "../entity/ha-entities-picker";
|
||||||
import "../entity/ha-entity-picker";
|
import "../entity/ha-entity-picker";
|
||||||
@ -31,6 +34,8 @@ export class HaEntitySelector extends LitElement {
|
|||||||
|
|
||||||
@property({ type: Boolean }) public required = true;
|
@property({ type: Boolean }) public required = true;
|
||||||
|
|
||||||
|
@state() private _createDomains: string[] | undefined;
|
||||||
|
|
||||||
private _hasIntegration(selector: EntitySelector) {
|
private _hasIntegration(selector: EntitySelector) {
|
||||||
return (
|
return (
|
||||||
selector.entity?.filter &&
|
selector.entity?.filter &&
|
||||||
@ -64,6 +69,7 @@ export class HaEntitySelector extends LitElement {
|
|||||||
.includeEntities=${this.selector.entity?.include_entities}
|
.includeEntities=${this.selector.entity?.include_entities}
|
||||||
.excludeEntities=${this.selector.entity?.exclude_entities}
|
.excludeEntities=${this.selector.entity?.exclude_entities}
|
||||||
.entityFilter=${this._filterEntities}
|
.entityFilter=${this._filterEntities}
|
||||||
|
.createDomains=${this._createDomains}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
.required=${this.required}
|
.required=${this.required}
|
||||||
allow-custom-entity
|
allow-custom-entity
|
||||||
@ -79,6 +85,7 @@ export class HaEntitySelector extends LitElement {
|
|||||||
.includeEntities=${this.selector.entity.include_entities}
|
.includeEntities=${this.selector.entity.include_entities}
|
||||||
.excludeEntities=${this.selector.entity.exclude_entities}
|
.excludeEntities=${this.selector.entity.exclude_entities}
|
||||||
.entityFilter=${this._filterEntities}
|
.entityFilter=${this._filterEntities}
|
||||||
|
.createDomains=${this._createDomains}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
.required=${this.required}
|
.required=${this.required}
|
||||||
></ha-entities-picker>
|
></ha-entities-picker>
|
||||||
@ -96,6 +103,9 @@ export class HaEntitySelector extends LitElement {
|
|||||||
this._entitySources = sources;
|
this._entitySources = sources;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (changedProps.has("selector")) {
|
||||||
|
this._createDomains = computeCreateDomains(this.selector);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _filterEntities = (entity: HassEntity): boolean => {
|
private _filterEntities = (entity: HassEntity): boolean => {
|
||||||
|
@ -22,6 +22,7 @@ import {
|
|||||||
filterSelectorDevices,
|
filterSelectorDevices,
|
||||||
filterSelectorEntities,
|
filterSelectorEntities,
|
||||||
TargetSelector,
|
TargetSelector,
|
||||||
|
computeCreateDomains,
|
||||||
} from "../../data/selector";
|
} from "../../data/selector";
|
||||||
import type { HomeAssistant } from "../../types";
|
import type { HomeAssistant } from "../../types";
|
||||||
import "../ha-target-picker";
|
import "../ha-target-picker";
|
||||||
@ -42,6 +43,8 @@ export class HaTargetSelector extends LitElement {
|
|||||||
|
|
||||||
@state() private _entitySources?: EntitySources;
|
@state() private _entitySources?: EntitySources;
|
||||||
|
|
||||||
|
@state() private _createDomains: string[] | undefined;
|
||||||
|
|
||||||
private _deviceIntegrationLookup = memoizeOne(getDeviceIntegrationLookup);
|
private _deviceIntegrationLookup = memoizeOne(getDeviceIntegrationLookup);
|
||||||
|
|
||||||
private _hasIntegration(selector: TargetSelector) {
|
private _hasIntegration(selector: TargetSelector) {
|
||||||
@ -68,6 +71,9 @@ export class HaTargetSelector extends LitElement {
|
|||||||
this._entitySources = sources;
|
this._entitySources = sources;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (changedProperties.has("selector")) {
|
||||||
|
this._createDomains = computeCreateDomains(this.selector);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
@ -82,7 +88,7 @@ export class HaTargetSelector extends LitElement {
|
|||||||
.deviceFilter=${this._filterDevices}
|
.deviceFilter=${this._filterDevices}
|
||||||
.entityFilter=${this._filterEntities}
|
.entityFilter=${this._filterEntities}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
.createDomains=${this.selector.target?.create_domains}
|
.createDomains=${this._createDomains}
|
||||||
></ha-target-picker>`;
|
></ha-target-picker>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,6 @@ import "./ha-service-picker";
|
|||||||
import "./ha-settings-row";
|
import "./ha-settings-row";
|
||||||
import "./ha-yaml-editor";
|
import "./ha-yaml-editor";
|
||||||
import type { HaYamlEditor } from "./ha-yaml-editor";
|
import type { HaYamlEditor } from "./ha-yaml-editor";
|
||||||
import { isHelperDomain } from "../panels/config/helpers/const";
|
|
||||||
|
|
||||||
const attributeFilter = (values: any[], attribute: any) => {
|
const attributeFilter = (values: any[], attribute: any) => {
|
||||||
if (typeof attribute === "object") {
|
if (typeof attribute === "object") {
|
||||||
@ -366,12 +365,8 @@ export class HaServiceControl extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _targetSelector = memoizeOne(
|
private _targetSelector = memoizeOne(
|
||||||
(targetSelector: TargetSelector | null | undefined, domain?: string) => {
|
(targetSelector: TargetSelector | null | undefined) =>
|
||||||
const create_domains = isHelperDomain(domain) ? [domain] : undefined;
|
targetSelector ? { target: { ...targetSelector } } : { target: {} }
|
||||||
return targetSelector
|
|
||||||
? { target: { ...targetSelector, create_domains } }
|
|
||||||
: { target: { create_domains } };
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
@ -462,8 +457,7 @@ export class HaServiceControl extends LitElement {
|
|||||||
><ha-selector
|
><ha-selector
|
||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.selector=${this._targetSelector(
|
.selector=${this._targetSelector(
|
||||||
serviceData.target as TargetSelector,
|
serviceData.target as TargetSelector
|
||||||
domain
|
|
||||||
)}
|
)}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
@value-changed=${this._targetChanged}
|
@value-changed=${this._targetChanged}
|
||||||
|
@ -13,6 +13,7 @@ import {
|
|||||||
EntityRegistryEntry,
|
EntityRegistryEntry,
|
||||||
} from "./entity_registry";
|
} from "./entity_registry";
|
||||||
import { EntitySources } from "./entity_sources";
|
import { EntitySources } from "./entity_sources";
|
||||||
|
import { isHelperDomain } from "../panels/config/helpers/const";
|
||||||
|
|
||||||
export type Selector =
|
export type Selector =
|
||||||
| ActionSelector
|
| ActionSelector
|
||||||
@ -405,7 +406,6 @@ export interface TargetSelector {
|
|||||||
target: {
|
target: {
|
||||||
entity?: EntitySelectorFilter | readonly EntitySelectorFilter[];
|
entity?: EntitySelectorFilter | readonly EntitySelectorFilter[];
|
||||||
device?: DeviceSelectorFilter | readonly DeviceSelectorFilter[];
|
device?: DeviceSelectorFilter | readonly DeviceSelectorFilter[];
|
||||||
create_domains?: string[];
|
|
||||||
} | null;
|
} | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -822,3 +822,34 @@ export const handleLegacyDeviceSelector = (
|
|||||||
device: rest,
|
device: rest,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const computeCreateDomains = (
|
||||||
|
selector: EntitySelector | TargetSelector
|
||||||
|
): undefined | string[] => {
|
||||||
|
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)];
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user