diff --git a/src/components/ha-service-control.ts b/src/components/ha-service-control.ts index 6be50e0191d1..6b3acc0f87bc 100644 --- a/src/components/ha-service-control.ts +++ b/src/components/ha-service-control.ts @@ -499,8 +499,23 @@ export class HaServiceControl extends LitElement { .defaultValue=${this._value?.data} @value-changed=${this._dataChanged} >` - : serviceData?.fields.map((dataField) => - dataField.fields + : serviceData?.fields.map((dataField) => { + if (!dataField.fields) { + return this._renderField( + dataField, + hasOptional, + domain, + serviceName, + targetEntities + ); + } + + const fields = Object.entries(dataField.fields).map( + ([key, field]) => ({ key, ...field }) + ); + + return fields.length && + this._hasFilteredFields(fields, targetEntities) ? html`` - : this._renderField( - dataField, - hasOptional, - domain, - serviceName, - targetEntities - ) - )} `; + : nothing; + })} `; } private _getSectionDescription( @@ -551,6 +560,16 @@ export class HaServiceControl extends LitElement { ); } + private _hasFilteredFields( + dataFields: ExtHassService["fields"], + targetEntities: string[] + ) { + return dataFields.some( + (dataField) => + !dataField.filter || this._filterField(dataField.filter, targetEntities) + ); + } + private _renderField = ( dataField: ExtHassService["fields"][number], hasOptional: boolean,