From 7e0522c3b338042790c43ca24e72352998046689 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 26 Apr 2021 23:52:18 +0200 Subject: [PATCH] Don't do migration of service data in public prop (#8949) Fixes #8879 --- src/components/ha-service-control.ts | 86 +++++++++++++++------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/src/components/ha-service-control.ts b/src/components/ha-service-control.ts index 0d72abc7ee..10d5b6b24c 100644 --- a/src/components/ha-service-control.ts +++ b/src/components/ha-service-control.ts @@ -49,6 +49,8 @@ export class HaServiceControl extends LitElement { data?: Record; }; + @internalProperty() private _value!: this["value"]; + @property({ reflect: true, type: Boolean }) public narrow!: boolean; @property({ type: Boolean }) public showAdvanced?: boolean; @@ -57,7 +59,7 @@ export class HaServiceControl extends LitElement { @query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor; - protected updated(changedProperties: PropertyValues) { + protected updated(changedProperties: PropertyValues) { if (!changedProperties.has("value")) { return; } @@ -92,21 +94,23 @@ export class HaServiceControl extends LitElement { target.device_id = this.value.data.device_id; } - this.value = { + this._value = { ...this.value, target, data: { ...this.value.data }, }; - delete this.value.data!.entity_id; - delete this.value.data!.device_id; - delete this.value.data!.area_id; + delete this._value.data!.entity_id; + delete this._value.data!.device_id; + delete this._value.data!.area_id; + } else { + this._value = this.value; } - if (this.value?.data) { + if (this._value?.data) { const yamlEditor = this._yamlEditor; - if (yamlEditor && yamlEditor.value !== this.value.data) { - yamlEditor.setValue(this.value.data); + if (yamlEditor && yamlEditor.value !== this._value.data) { + yamlEditor.setValue(this._value.data); } } } @@ -151,12 +155,12 @@ export class HaServiceControl extends LitElement { }); protected render() { - const serviceData = this._getServiceInfo(this.value?.service); + const serviceData = this._getServiceInfo(this._value?.service); const shouldRenderServiceDataYaml = (serviceData?.fields.length && !serviceData.hasSelector.length) || (serviceData && - Object.keys(this.value?.data || {}).some( + Object.keys(this._value?.data || {}).some( (key) => !serviceData!.hasSelector.includes(key) )); @@ -171,7 +175,7 @@ export class HaServiceControl extends LitElement { return html`

${serviceData?.description}

@@ -195,19 +199,19 @@ export class HaServiceControl extends LitElement { ? { target: serviceData.target } : { target: { - entity: { domain: computeDomain(this.value!.service) }, + entity: { domain: computeDomain(this._value!.service) }, }, }} @value-changed=${this._targetChanged} - .value=${this.value?.target} + .value=${this._value?.target} >` : entityId ? html`` @@ -218,15 +222,15 @@ export class HaServiceControl extends LitElement { "ui.components.service-control.service_data" )} .name=${"data"} - .defaultValue=${this.value?.data} + .defaultValue=${this._value?.data} @value-changed=${this._dataChanged} >` : serviceData?.fields.map((dataField) => dataField.selector && (!dataField.advanced || this.showAdvanced || - (this.value?.data && - this.value.data[dataField.key] !== undefined)) + (this._value?.data && + this._value.data[dataField.key] !== undefined)) ? html` ${dataField.required ? hasOptional @@ -235,8 +239,8 @@ export class HaServiceControl extends LitElement { : html``} @@ -245,15 +249,15 @@ export class HaServiceControl extends LitElement { >` @@ -268,13 +272,13 @@ export class HaServiceControl extends LitElement { this._checkedKeys.add(key); } else { this._checkedKeys.delete(key); - const data = { ...this.value?.data }; + const data = { ...this._value?.data }; delete data[key]; fireEvent(this, "value-changed", { value: { - ...this.value, + ...this._value, data, }, }); @@ -284,7 +288,7 @@ export class HaServiceControl extends LitElement { private _serviceChanged(ev: PolymerChangedEvent) { ev.stopPropagation(); - if (ev.detail.value === this.value?.service) { + if (ev.detail.value === this._value?.service) { return; } fireEvent(this, "value-changed", { @@ -295,17 +299,17 @@ export class HaServiceControl extends LitElement { private _entityPicked(ev: CustomEvent) { ev.stopPropagation(); const newValue = ev.detail.value; - if (this.value?.data?.entity_id === newValue) { + if (this._value?.data?.entity_id === newValue) { return; } let value; - if (!newValue && this.value?.data) { - value = { ...this.value }; + if (!newValue && this._value?.data) { + value = { ...this._value }; delete value.data.entity_id; } else { value = { - ...this.value, - data: { ...this.value?.data, entity_id: ev.detail.value }, + ...this._value, + data: { ...this._value?.data, entity_id: ev.detail.value }, }; } fireEvent(this, "value-changed", { @@ -316,15 +320,15 @@ export class HaServiceControl extends LitElement { private _targetChanged(ev: CustomEvent) { ev.stopPropagation(); const newValue = ev.detail.value; - if (this.value?.target === newValue) { + if (this._value?.target === newValue) { return; } let value; if (!newValue) { - value = { ...this.value }; + value = { ...this._value }; delete value.target; } else { - value = { ...this.value, target: ev.detail.value }; + value = { ...this._value, target: ev.detail.value }; } fireEvent(this, "value-changed", { value, @@ -336,13 +340,13 @@ export class HaServiceControl extends LitElement { const key = (ev.currentTarget as any).key; const value = ev.detail.value; if ( - this.value?.data?.[key] === value || - (!this.value?.data?.[key] && (value === "" || value === undefined)) + this._value?.data?.[key] === value || + (!this._value?.data?.[key] && (value === "" || value === undefined)) ) { return; } - const data = { ...this.value?.data, [key]: value }; + const data = { ...this._value?.data, [key]: value }; if (value === "" || value === undefined) { delete data[key]; @@ -350,7 +354,7 @@ export class HaServiceControl extends LitElement { fireEvent(this, "value-changed", { value: { - ...this.value, + ...this._value, data, }, }); @@ -363,7 +367,7 @@ export class HaServiceControl extends LitElement { } fireEvent(this, "value-changed", { value: { - ...this.value, + ...this._value, data: ev.detail.value, }, });