From 89569355be75b31a0407d511ff51d2402d6ec652 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 31 Jul 2020 19:07:11 +0200 Subject: [PATCH] Don't add undefined values to extra data in device automations (#6499) --- src/components/ha-form/ha-form.ts | 8 ++-- src/components/ha-yaml-editor.ts | 2 + src/data/device_automation.ts | 11 ++++-- .../types/ha-automation-action-device_id.ts | 31 ++++++++------- .../types/ha-automation-condition-device.ts | 37 ++++++++++++------ .../types/ha-automation-trigger-device.ts | 39 ++++++++++++------- 6 files changed, 81 insertions(+), 47 deletions(-) diff --git a/src/components/ha-form/ha-form.ts b/src/components/ha-form/ha-form.ts index 5f57df1bc1..afc69a15d6 100644 --- a/src/components/ha-form/ha-form.ts +++ b/src/components/ha-form/ha-form.ts @@ -100,7 +100,7 @@ export interface HaFormTimeData { } export interface HaFormElement extends LitElement { - schema: HaFormSchema; + schema: HaFormSchema | HaFormSchema[]; data?: HaFormDataContainer | HaFormData; label?: string; suffix?: string; @@ -110,7 +110,7 @@ export interface HaFormElement extends LitElement { export class HaForm extends LitElement implements HaFormElement { @property() public data!: HaFormDataContainer | HaFormData; - @property() public schema!: HaFormSchema; + @property() public schema!: HaFormSchema | HaFormSchema[]; @property() public error; @@ -190,7 +190,7 @@ export class HaForm extends LitElement implements HaFormElement { : ""; } - private _computeError(error, schema: HaFormSchema) { + private _computeError(error, schema: HaFormSchema | HaFormSchema[]) { return this.computeError ? this.computeError(error, schema) : error; } @@ -203,7 +203,7 @@ export class HaForm extends LitElement implements HaFormElement { private _valueChanged(ev: CustomEvent) { ev.stopPropagation(); - const schema = (ev.target as HaFormElement).schema; + const schema = (ev.target as HaFormElement).schema as HaFormSchema; const data = this.data as HaFormDataContainer; data[schema.name] = ev.detail.value; fireEvent(this, "value-changed", { diff --git a/src/components/ha-yaml-editor.ts b/src/components/ha-yaml-editor.ts index 83c909003b..596e878b51 100644 --- a/src/components/ha-yaml-editor.ts +++ b/src/components/ha-yaml-editor.ts @@ -50,6 +50,8 @@ export class HaYamlEditor extends LitElement { try { this._yaml = value && !isEmpty(value) ? safeDump(value) : ""; } catch (err) { + // eslint-disable-next-line no-console + console.error(err); alert(`There was an error converting to YAML: ${err}`); } afterNextRender(() => { diff --git a/src/data/device_automation.ts b/src/data/device_automation.ts index 38b808fd3b..5fd7714f7f 100644 --- a/src/data/device_automation.ts +++ b/src/data/device_automation.ts @@ -1,5 +1,6 @@ import { computeStateName } from "../common/entity/compute_state_name"; import { HomeAssistant } from "../types"; +import { HaFormSchema } from "../components/ha-form/ha-form"; export interface DeviceAutomation { device_id: string; @@ -20,6 +21,10 @@ export interface DeviceTrigger extends DeviceAutomation { platform: "device"; } +export interface DeviceCapabilities { + extra_fields: HaFormSchema[]; +} + export const fetchDeviceActions = (hass: HomeAssistant, deviceId: string) => hass.callWS({ type: "device_automation/action/list", @@ -42,7 +47,7 @@ export const fetchDeviceActionCapabilities = ( hass: HomeAssistant, action: DeviceAction ) => - hass.callWS({ + hass.callWS({ type: "device_automation/action/capabilities", action, }); @@ -51,7 +56,7 @@ export const fetchDeviceConditionCapabilities = ( hass: HomeAssistant, condition: DeviceCondition ) => - hass.callWS({ + hass.callWS({ type: "device_automation/condition/capabilities", condition, }); @@ -60,7 +65,7 @@ export const fetchDeviceTriggerCapabilities = ( hass: HomeAssistant, trigger: DeviceTrigger ) => - hass.callWS({ + hass.callWS({ type: "device_automation/trigger/capabilities", trigger, }); diff --git a/src/panels/config/automation/action/types/ha-automation-action-device_id.ts b/src/panels/config/automation/action/types/ha-automation-action-device_id.ts index f7e8eac408..f85b9d84ef 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-device_id.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-device_id.ts @@ -14,6 +14,7 @@ import { DeviceAction, deviceAutomationsEqual, fetchDeviceActionCapabilities, + DeviceCapabilities, } from "../../../../../data/device_automation"; import { HomeAssistant } from "../../../../../types"; @@ -21,11 +22,11 @@ import { HomeAssistant } from "../../../../../types"; export class HaDeviceAction extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @property() public action!: DeviceAction; + @property({ type: Object }) public action!: DeviceAction; @internalProperty() private _deviceId?: string; - @internalProperty() private _capabilities?; + @internalProperty() private _capabilities?: DeviceCapabilities; private _origAction?: DeviceAction; @@ -37,20 +38,20 @@ export class HaDeviceAction extends LitElement { }; } - private _extraFieldsData = memoizeOne((capabilities, action: DeviceAction) => - capabilities && capabilities.extra_fields - ? capabilities.extra_fields.map((item) => { - return { [item.name]: action[item.name] }; - }) - : undefined + private _extraFieldsData = memoizeOne( + (action: DeviceAction, capabilities: DeviceCapabilities) => { + const extraFieldsData: { [key: string]: any } = {}; + capabilities.extra_fields.forEach((item) => { + if (action[item.name] !== undefined) { + extraFieldsData![item.name] = action[item.name]; + } + }); + return extraFieldsData; + } ); protected render() { const deviceId = this._deviceId || this.action.device_id; - const extraFieldsData = this._extraFieldsData( - this._capabilities, - this.action - ); return html` - ${extraFieldsData + ${this._capabilities?.extra_fields ? html` { + const extraFieldsData: { [key: string]: any } = {}; + capabilities.extra_fields.forEach((item) => { + if (condition[item.name] !== undefined) { + extraFieldsData![item.name] = condition[item.name]; + } + }); + return extraFieldsData; + } + ); + protected render() { const deviceId = this._deviceId || this.condition.device_id; - const extraFieldsData = - this._capabilities && this._capabilities.extra_fields - ? this._capabilities.extra_fields.map((item) => { - return { [item.name]: this.condition[item.name] }; - }) - : undefined; - return html` - ${extraFieldsData + ${this._capabilities?.extra_fields ? html` { + const extraFieldsData: { [key: string]: any } = {}; + capabilities.extra_fields.forEach((item) => { + if (trigger[item.name] !== undefined) { + extraFieldsData![item.name] = trigger[item.name]; + } + }); + return extraFieldsData; + } + ); + protected render() { const deviceId = this._deviceId || this.trigger.device_id; - const extraFieldsData = - this._capabilities && this._capabilities.extra_fields - ? this._capabilities.extra_fields.map((item) => { - return { [item.name]: this.trigger[item.name] }; - }) - : undefined; - return html` - ${extraFieldsData + ${this._capabilities?.extra_fields ? html`