Add run action to dropdown (#11817)

This commit is contained in:
Paulus Schoutsen 2022-02-23 21:36:25 -08:00 committed by GitHub
parent bad184210d
commit be491451d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 8 deletions

View File

@ -1,8 +1,13 @@
import { HomeAssistant } from "../types"; import { HomeAssistant } from "../types";
interface ValidationResult { interface ValidConfig {
valid: boolean; valid: true;
error: string | null; error: null;
}
interface InvalidConfig {
valid: false;
error: string;
} }
type ValidKeys = "trigger" | "action" | "condition"; type ValidKeys = "trigger" | "action" | "condition";
@ -12,7 +17,7 @@ export const validateConfig = <
>( >(
hass: HomeAssistant, hass: HomeAssistant,
config: T config: T
): Promise<Record<keyof T, ValidationResult>> => ): Promise<Record<keyof T, ValidConfig | InvalidConfig>> =>
hass.callWS({ hass.callWS({
type: "validate_config", type: "validate_config",
...config, ...config,

View File

@ -1,7 +1,10 @@
import { HomeAssistant } from "../types"; import { HomeAssistant } from "../types";
import { Action } from "./script"; import { Action } from "./script";
export const callExecuteScript = (hass: HomeAssistant, sequence: Action[]) => export const callExecuteScript = (
hass: HomeAssistant,
sequence: Action | Action[]
) =>
hass.callWS({ hass.callWS({
type: "execute_script", type: "execute_script",
sequence, sequence,

View File

@ -16,10 +16,16 @@ import "../../../../components/ha-icon-button";
import "../../../../components/ha-select"; import "../../../../components/ha-select";
import type { HaSelect } from "../../../../components/ha-select"; import type { HaSelect } from "../../../../components/ha-select";
import type { HaYamlEditor } from "../../../../components/ha-yaml-editor"; import type { HaYamlEditor } from "../../../../components/ha-yaml-editor";
import { validateConfig } from "../../../../data/config";
import { Action, getActionType } from "../../../../data/script"; import { Action, getActionType } from "../../../../data/script";
import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box"; import { callExecuteScript } from "../../../../data/service";
import {
showAlertDialog,
showConfirmationDialog,
} from "../../../../dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../resources/styles"; import { haStyle } from "../../../../resources/styles";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
import { showToast } from "../../../../util/toast";
import "./types/ha-automation-action-activate_scene"; import "./types/ha-automation-action-activate_scene";
import "./types/ha-automation-action-choose"; import "./types/ha-automation-action-choose";
import "./types/ha-automation-action-condition"; import "./types/ha-automation-action-condition";
@ -180,6 +186,11 @@ export default class HaAutomationActionRow extends LitElement {
.label=${this.hass.localize("ui.common.menu")} .label=${this.hass.localize("ui.common.menu")}
.path=${mdiDotsVertical} .path=${mdiDotsVertical}
></ha-icon-button> ></ha-icon-button>
<mwc-list-item>
${this.hass.localize(
"ui.panel.config.automation.editor.actions.run_action"
)}
</mwc-list-item>
<mwc-list-item .disabled=${!this._uiModeAvailable}> <mwc-list-item .disabled=${!this._uiModeAvailable}>
${yamlMode ${yamlMode
? this.hass.localize( ? this.hass.localize(
@ -290,17 +301,54 @@ export default class HaAutomationActionRow extends LitElement {
private _handleAction(ev: CustomEvent<ActionDetail>) { private _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) { switch (ev.detail.index) {
case 0: case 0:
this._switchYamlMode(); this._runAction();
break; break;
case 1: case 1:
fireEvent(this, "duplicate"); this._switchYamlMode();
break; break;
case 2: case 2:
fireEvent(this, "duplicate");
break;
case 3:
this._onDelete(); this._onDelete();
break; break;
} }
} }
private async _runAction() {
const validated = await validateConfig(this.hass, {
action: this.action,
});
if (!validated.action.valid) {
showAlertDialog(this, {
title: this.hass.localize(
"ui.panel.config.automation.editor.actions.invalid_action"
),
text: validated.action.error,
});
return;
}
try {
await callExecuteScript(this.hass, this.action);
} catch (err: any) {
showAlertDialog(this, {
title: this.hass.localize(
"ui.panel.config.automation.editor.actions.run_action_error"
),
text: err.message || err,
});
return;
}
showToast(this, {
message: this.hass.localize(
"ui.panel.config.automation.editor.actions.run_action_success"
),
});
}
private _onDelete() { private _onDelete() {
showConfirmationDialog(this, { showConfirmationDialog(this, {
text: this.hass.localize( text: this.hass.localize(

View File

@ -1826,6 +1826,10 @@
"introduction": "The actions are what Home Assistant will do when the automation is triggered.", "introduction": "The actions are what Home Assistant will do when the automation is triggered.",
"learn_more": "Learn more about actions", "learn_more": "Learn more about actions",
"add": "Add action", "add": "Add action",
"invalid_action": "Invalid action",
"run_action": "Run action",
"run_action_error": "Error running action",
"run_action_success": "Action run successfully",
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]",
"delete": "[%key:ui::panel::mailbox::delete_button%]", "delete": "[%key:ui::panel::mailbox::delete_button%]",
"delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]", "delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]",