Add support for sections in filters (#21157)

This commit is contained in:
Bram Kragten 2024-06-25 20:01:10 +02:00 committed by GitHub
parent 9cbb51549b
commit 76daa2bb7f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -65,6 +65,8 @@ interface ExtHassService extends Omit<HassService, "fields"> {
Omit<HassService["fields"][string], "selector"> & { Omit<HassService["fields"][string], "selector"> & {
key: string; key: string;
selector?: Selector; selector?: Selector;
fields?: Record<string, Omit<HassService["fields"][string], "selector">>;
collapsed?: boolean;
} }
>; >;
hasSelector: string[]; hasSelector: string[];
@ -247,20 +249,7 @@ export class HaServiceControl extends LitElement {
} }
); );
private _filterFields = memoizeOne( private _getTargetedEntities = memoizeOne((target, value) => {
(serviceData: ExtHassService | undefined, value: this["value"]) =>
serviceData?.fields?.filter(
(field) =>
!field.filter ||
this._filterField(serviceData.target, field.filter, value)
)
);
private _filterField(
target: ExtHassService["target"],
filter: ExtHassService["fields"][number]["filter"],
value: this["value"]
) {
const targetSelector = target ? { target } : { target: {} }; const targetSelector = target ? { target } : { target: {} };
const targetEntities = const targetEntities =
ensureArray( ensureArray(
@ -330,6 +319,13 @@ export class HaServiceControl extends LitElement {
); );
}); });
} }
return targetEntities;
});
private _filterField(
filter: ExtHassService["fields"][number]["filter"],
targetEntities: string[]
) {
if (!targetEntities.length) { if (!targetEntities.length) {
return false; return false;
} }
@ -391,7 +387,10 @@ export class HaServiceControl extends LitElement {
serviceData?.fields.some((field) => showOptionalToggle(field)) serviceData?.fields.some((field) => showOptionalToggle(field))
); );
const filteredFields = this._filterFields(serviceData, this._value); const targetEntities = this._getTargetedEntities(
serviceData?.target,
this._value
);
const domain = this._value?.service const domain = this._value?.service
? computeDomain(this._value.service) ? computeDomain(this._value.service)
@ -485,12 +484,54 @@ export class HaServiceControl extends LitElement {
.defaultValue=${this._value?.data} .defaultValue=${this._value?.data}
@value-changed=${this._dataChanged} @value-changed=${this._dataChanged}
></ha-yaml-editor>` ></ha-yaml-editor>`
: filteredFields?.map((dataField) => { : serviceData?.fields.map((dataField) =>
dataField.fields
? html`<ha-expansion-panel
leftChevron
.expanded=${!dataField.collapsed}
.header=${this.hass.localize(
`component.${domain}.services.${serviceName}.sections.${dataField.key}.name`
) ||
dataField.name ||
dataField.key}
>
${Object.entries(dataField.fields).map(([key, field]) =>
this._renderField(
{ key, ...field },
hasOptional,
domain,
serviceName,
targetEntities
)
)}
</ha-expansion-panel>`
: this._renderField(
dataField,
hasOptional,
domain,
serviceName,
targetEntities
)
)} `;
}
private _renderField = (
dataField: ExtHassService["fields"][number],
hasOptional: boolean,
domain: string | undefined,
serviceName: string | undefined,
targetEntities: string[]
) => {
if (
dataField.filter &&
!this._filterField(dataField.filter, targetEntities)
) {
return nothing;
}
const selector = dataField?.selector ?? { text: undefined }; const selector = dataField?.selector ?? { text: undefined };
const type = Object.keys(selector)[0]; const type = Object.keys(selector)[0];
const enhancedSelector = ["action", "condition", "trigger"].includes( const enhancedSelector = ["action", "condition", "trigger"].includes(type)
type
)
? { ? {
[type]: { [type]: {
...selector[type], ...selector[type],
@ -504,8 +545,7 @@ export class HaServiceControl extends LitElement {
return dataField.selector && return dataField.selector &&
(!dataField.advanced || (!dataField.advanced ||
this.showAdvanced || this.showAdvanced ||
(this._value?.data && (this._value?.data && this._value.data[dataField.key] !== undefined))
this._value.data[dataField.key] !== undefined))
? html`<ha-settings-row .narrow=${this.narrow}> ? html`<ha-settings-row .narrow=${this.narrow}>
${!showOptional ${!showOptional
? hasOptional ? hasOptional
@ -551,8 +591,7 @@ export class HaServiceControl extends LitElement {
></ha-selector> ></ha-selector>
</ha-settings-row>` </ha-settings-row>`
: ""; : "";
})} `; };
}
private _localizeValueCallback = (key: string) => { private _localizeValueCallback = (key: string) => {
if (!this._value?.service) { if (!this._value?.service) {
@ -839,6 +878,11 @@ export class HaServiceControl extends LitElement {
.description p { .description p {
direction: ltr; direction: ltr;
} }
ha-expansion-panel {
--ha-card-border-radius: 0;
--expansion-panel-summary-padding: 0 16px;
--expansion-panel-content-padding: 0;
}
`; `;
} }
} }