Update UI when service schema change (#9120)

This commit is contained in:
Bram Kragten 2021-05-07 11:28:37 +02:00 committed by GitHub
parent a9c7a39a47
commit 9be4a00169
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,5 +1,9 @@
import { mdiHelpCircle } from "@mdi/js"; import { mdiHelpCircle } from "@mdi/js";
import { HassService, HassServiceTarget } from "home-assistant-js-websocket"; import {
HassService,
HassServices,
HassServiceTarget,
} from "home-assistant-js-websocket";
import { import {
css, css,
CSSResult, CSSResult,
@ -73,7 +77,10 @@ export class HaServiceControl extends LitElement {
this._checkedKeys = new Set(); this._checkedKeys = new Set();
} }
const serviceData = this._getServiceInfo(this.value?.service); const serviceData = this._getServiceInfo(
this.value?.service,
this.hass.services
);
if ( if (
serviceData && serviceData &&
@ -122,40 +129,45 @@ export class HaServiceControl extends LitElement {
return ENTITY_COMPONENT_DOMAINS.includes(domain) ? [domain] : null; return ENTITY_COMPONENT_DOMAINS.includes(domain) ? [domain] : null;
}); });
private _getServiceInfo = memoizeOne((service?: string): private _getServiceInfo = memoizeOne(
| ExtHassService (
| undefined => { service?: string,
if (!service) { serviceDomains?: HassServices
return undefined; ): ExtHassService | undefined => {
} if (!service || !serviceDomains) {
const domain = computeDomain(service); return undefined;
const serviceName = computeObjectId(service); }
const serviceDomains = this.hass.services; const domain = computeDomain(service);
if (!(domain in serviceDomains)) { const serviceName = computeObjectId(service);
return undefined; if (!(domain in serviceDomains)) {
} return undefined;
if (!(serviceName in serviceDomains[domain])) { }
return undefined; if (!(serviceName in serviceDomains[domain])) {
} return undefined;
}
const fields = Object.entries( const fields = Object.entries(
serviceDomains[domain][serviceName].fields serviceDomains[domain][serviceName].fields
).map(([key, value]) => ({ ).map(([key, value]) => ({
key, key,
...value, ...value,
selector: value.selector as Selector | undefined, selector: value.selector as Selector | undefined,
})); }));
return { return {
...serviceDomains[domain][serviceName], ...serviceDomains[domain][serviceName],
fields, fields,
hasSelector: fields.length hasSelector: fields.length
? fields.filter((field) => field.selector).map((field) => field.key) ? fields.filter((field) => field.selector).map((field) => field.key)
: [], : [],
}; };
}); }
);
protected render() { protected render() {
const serviceData = this._getServiceInfo(this._value?.service); const serviceData = this._getServiceInfo(
this._value?.service,
this.hass.services
);
const shouldRenderServiceDataYaml = const shouldRenderServiceDataYaml =
(serviceData?.fields.length && !serviceData.hasSelector.length) || (serviceData?.fields.length && !serviceData.hasSelector.length) ||