Don't add undefined values to extra data in device automations (#6499)

This commit is contained in:
Bram Kragten 2020-07-31 19:07:11 +02:00 committed by GitHub
parent 3a41b3bdcf
commit 89569355be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 81 additions and 47 deletions

View File

@ -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", {

View File

@ -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(() => {

View File

@ -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<DeviceAction[]>({
type: "device_automation/action/list",
@ -42,7 +47,7 @@ export const fetchDeviceActionCapabilities = (
hass: HomeAssistant,
action: DeviceAction
) =>
hass.callWS<DeviceAction[]>({
hass.callWS<DeviceCapabilities>({
type: "device_automation/action/capabilities",
action,
});
@ -51,7 +56,7 @@ export const fetchDeviceConditionCapabilities = (
hass: HomeAssistant,
condition: DeviceCondition
) =>
hass.callWS<DeviceCondition[]>({
hass.callWS<DeviceCapabilities>({
type: "device_automation/condition/capabilities",
condition,
});
@ -60,7 +65,7 @@ export const fetchDeviceTriggerCapabilities = (
hass: HomeAssistant,
trigger: DeviceTrigger
) =>
hass.callWS<DeviceTrigger[]>({
hass.callWS<DeviceCapabilities>({
type: "device_automation/trigger/capabilities",
trigger,
});

View File

@ -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`
<ha-device-picker
@ -70,10 +71,10 @@ export class HaDeviceAction extends LitElement {
"ui.panel.config.automation.editor.actions.type.device_id.action"
)}
></ha-device-action-picker>
${extraFieldsData
${this._capabilities?.extra_fields
? html`
<ha-form
.data=${Object.assign({}, ...extraFieldsData)}
.data=${this._extraFieldsData(this.action, this._capabilities)}
.schema=${this._capabilities.extra_fields}
.computeLabel=${this._extraFieldsComputeLabelCallback(
this.hass.localize
@ -105,7 +106,7 @@ export class HaDeviceAction extends LitElement {
private async _getCapabilities() {
this._capabilities = this.action.domain
? await fetchDeviceActionCapabilities(this.hass, this.action)
: null;
: undefined;
}
private _devicePicked(ev) {

View File

@ -13,18 +13,20 @@ import {
deviceAutomationsEqual,
DeviceCondition,
fetchDeviceConditionCapabilities,
DeviceCapabilities,
} from "../../../../../data/device_automation";
import { HomeAssistant } from "../../../../../types";
import memoizeOne from "memoize-one";
@customElement("ha-automation-condition-device")
export class HaDeviceCondition extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property() public condition!: DeviceCondition;
@property({ type: Object }) public condition!: DeviceCondition;
@internalProperty() private _deviceId?: string;
@internalProperty() private _capabilities?;
@internalProperty() private _capabilities?: DeviceCapabilities;
private _origCondition?: DeviceCondition;
@ -36,16 +38,21 @@ export class HaDeviceCondition extends LitElement {
};
}
private _extraFieldsData = memoizeOne(
(condition: DeviceCondition, capabilities: DeviceCapabilities) => {
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`
<ha-device-picker
.value=${deviceId}
@ -64,10 +71,10 @@ export class HaDeviceCondition extends LitElement {
"ui.panel.config.automation.editor.conditions.type.device.condition"
)}
></ha-device-condition-picker>
${extraFieldsData
${this._capabilities?.extra_fields
? html`
<ha-form
.data=${Object.assign({}, ...extraFieldsData)}
.data=${this._extraFieldsData(this.condition, this._capabilities)}
.schema=${this._capabilities.extra_fields}
.computeLabel=${this._extraFieldsComputeLabelCallback(
this.hass.localize
@ -103,7 +110,7 @@ export class HaDeviceCondition extends LitElement {
this._capabilities = condition.domain
? await fetchDeviceConditionCapabilities(this.hass, condition)
: null;
: undefined;
}
private _devicePicked(ev) {
@ -141,3 +148,9 @@ export class HaDeviceCondition extends LitElement {
) || schema.name;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-automation-condition-device": HaDeviceCondition;
}
}

View File

@ -13,18 +13,20 @@ import {
deviceAutomationsEqual,
DeviceTrigger,
fetchDeviceTriggerCapabilities,
DeviceCapabilities,
} from "../../../../../data/device_automation";
import { HomeAssistant } from "../../../../../types";
import memoizeOne from "memoize-one";
@customElement("ha-automation-trigger-device")
export class HaDeviceTrigger extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property() public trigger!: DeviceTrigger;
@property({ type: Object }) public trigger!: DeviceTrigger;
@internalProperty() private _deviceId?: string;
@internalProperty() private _capabilities?;
@internalProperty() private _capabilities?: DeviceCapabilities;
private _origTrigger?: DeviceTrigger;
@ -36,16 +38,21 @@ export class HaDeviceTrigger extends LitElement {
};
}
private _extraFieldsData = memoizeOne(
(trigger: DeviceTrigger, capabilities: DeviceCapabilities) => {
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`
<ha-device-picker
.value=${deviceId}
@ -64,10 +71,10 @@ export class HaDeviceTrigger extends LitElement {
"ui.panel.config.automation.editor.triggers.type.device.trigger"
)}
></ha-device-trigger-picker>
${extraFieldsData
${this._capabilities?.extra_fields
? html`
<ha-form
.data=${Object.assign({}, ...extraFieldsData)}
.data=${this._extraFieldsData(this.trigger, this._capabilities)}
.schema=${this._capabilities.extra_fields}
.computeLabel=${this._extraFieldsComputeLabelCallback(
this.hass.localize
@ -100,7 +107,7 @@ export class HaDeviceTrigger extends LitElement {
this._capabilities = trigger.domain
? await fetchDeviceTriggerCapabilities(this.hass, trigger)
: null;
: undefined;
}
private _devicePicked(ev) {
@ -120,7 +127,7 @@ export class HaDeviceTrigger extends LitElement {
fireEvent(this, "value-changed", { value: trigger });
}
private _extraFieldsChanged(ev) {
private _extraFieldsChanged(ev: CustomEvent) {
ev.stopPropagation();
fireEvent(this, "value-changed", {
value: {
@ -138,3 +145,9 @@ export class HaDeviceTrigger extends LitElement {
) || schema.name;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-automation-trigger-device": HaDeviceTrigger;
}
}