From dff3ffe9355482b1acea637959f3c76f727b17d4 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 23 Aug 2022 17:21:16 +0200 Subject: [PATCH] Add support for renaming actions, conditions and triggers (#13444) --- src/data/automation_i18n.ts | 9 ++-- src/data/script_i18n.ts | 5 ++- src/dialogs/generic/dialog-box.ts | 9 ++++ src/dialogs/generic/show-dialog-box.ts | 1 + .../action/ha-automation-action-row.ts | 44 +++++++++++++++++-- .../condition/ha-automation-condition-row.ts | 42 ++++++++++++++++-- .../trigger/ha-automation-trigger-row.ts | 43 ++++++++++++++++-- src/translations/en.json | 9 ++++ 8 files changed, 147 insertions(+), 15 deletions(-) diff --git a/src/data/automation_i18n.ts b/src/data/automation_i18n.ts index 5b72330818..909061103f 100644 --- a/src/data/automation_i18n.ts +++ b/src/data/automation_i18n.ts @@ -3,8 +3,8 @@ import { computeStateName } from "../common/entity/compute_state_name"; import type { HomeAssistant } from "../types"; import { Condition, Trigger } from "./automation"; -export const describeTrigger = (trigger: Trigger) => { - if (trigger.alias) { +export const describeTrigger = (trigger: Trigger, ignoreAlias = false) => { + if (trigger.alias && !ignoreAlias) { return trigger.alias; } return `${trigger.platform || "Unknown"} trigger`; @@ -12,9 +12,10 @@ export const describeTrigger = (trigger: Trigger) => { export const describeCondition = ( condition: Condition, - hass: HomeAssistant + hass: HomeAssistant, + ignoreAlias = false ) => { - if (condition.alias) { + if (condition.alias && !ignoreAlias) { return condition.alias; } diff --git a/src/data/script_i18n.ts b/src/data/script_i18n.ts index 899a5242f9..bef0eaf2dc 100644 --- a/src/data/script_i18n.ts +++ b/src/data/script_i18n.ts @@ -26,9 +26,10 @@ import { export const describeAction = ( hass: HomeAssistant, action: ActionTypes[T], - actionType?: T + actionType?: T, + ignoreAlias = false ): string => { - if (action.alias) { + if (action.alias && !ignoreAlias) { return action.alias; } if (!actionType) { diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts index 7aa5ebb5e6..27da086a0b 100644 --- a/src/dialogs/generic/dialog-box.ts +++ b/src/dialogs/generic/dialog-box.ts @@ -73,6 +73,7 @@ class DialogBox extends LitElement { void; } diff --git a/src/panels/config/automation/action/ha-automation-action-row.ts b/src/panels/config/automation/action/ha-automation-action-row.ts index 9f72db5417..d37f820928 100644 --- a/src/panels/config/automation/action/ha-automation-action-row.ts +++ b/src/panels/config/automation/action/ha-automation-action-row.ts @@ -20,6 +20,7 @@ import { callExecuteScript } from "../../../../data/service"; import { showAlertDialog, showConfirmationDialog, + showPromptDialog, } from "../../../../dialogs/generic/show-dialog-box"; import { haStyle } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; @@ -200,6 +201,11 @@ export default class HaAutomationActionRow extends LitElement { "ui.panel.config.automation.editor.edit_yaml" )} + + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.rename" + )} + ${this.hass.localize( "ui.panel.config.automation.editor.actions.duplicate" @@ -298,7 +304,7 @@ export default class HaAutomationActionRow extends LitElement { fireEvent(this, "move-action", { direction: "down" }); } - private _handleAction(ev: CustomEvent) { + private async _handleAction(ev: CustomEvent) { switch (ev.detail.index) { case 0: this._runAction(); @@ -308,12 +314,15 @@ export default class HaAutomationActionRow extends LitElement { this.expand(); break; case 2: - fireEvent(this, "duplicate"); + await this._renameAction(); break; case 3: - this._onDisable(); + fireEvent(this, "duplicate"); break; case 4: + this._onDisable(); + break; + case 5: this._onDelete(); break; } @@ -388,6 +397,35 @@ export default class HaAutomationActionRow extends LitElement { this._yamlMode = !this._yamlMode; } + private async _renameAction(): Promise { + const alias = await showPromptDialog(this, { + title: this.hass.localize( + "ui.panel.config.automation.editor.actions.change_alias" + ), + inputLabel: this.hass.localize( + "ui.panel.config.automation.editor.actions.alias" + ), + inputType: "string", + placeholder: capitalizeFirstLetter( + describeAction(this.hass, this.action, undefined, true) + ), + defaultValue: this.action.alias, + confirmText: this.hass.localize("ui.common.submit"), + }); + const value = { ...this.action }; + if (!alias) { + delete value.alias; + } else { + value.alias = alias; + } + fireEvent(this, "value-changed", { + value, + }); + if (this._yamlMode) { + this._yamlEditor?.setValue(value); + } + } + public expand() { this.updateComplete.then(() => { this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true; diff --git a/src/panels/config/automation/condition/ha-automation-condition-row.ts b/src/panels/config/automation/condition/ha-automation-condition-row.ts index cd9b7e6d4b..56570711df 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-row.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-row.ts @@ -19,6 +19,7 @@ import { validateConfig } from "../../../../data/config"; import { showAlertDialog, showConfirmationDialog, + showPromptDialog, } from "../../../../dialogs/generic/show-dialog-box"; import { haStyle } from "../../../../resources/styles"; import { HomeAssistant } from "../../../../types"; @@ -112,6 +113,11 @@ export default class HaAutomationConditionRow extends LitElement { "ui.panel.config.automation.editor.edit_yaml" )} + + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.rename" + )} + ${this.hass.localize( "ui.panel.config.automation.editor.actions.duplicate" @@ -187,19 +193,22 @@ export default class HaAutomationConditionRow extends LitElement { } } - private _handleAction(ev: CustomEvent) { + private async _handleAction(ev: CustomEvent) { switch (ev.detail.index) { case 0: this._switchYamlMode(); this.expand(); break; case 1: - fireEvent(this, "duplicate"); + await this._renameCondition(); break; case 2: - this._onDisable(); + fireEvent(this, "duplicate"); break; case 3: + this._onDisable(); + break; + case 4: this._onDelete(); break; } @@ -288,6 +297,33 @@ export default class HaAutomationConditionRow extends LitElement { } } + private async _renameCondition(): Promise { + const alias = await showPromptDialog(this, { + title: this.hass.localize( + "ui.panel.config.automation.editor.conditions.change_alias" + ), + inputLabel: this.hass.localize( + "ui.panel.config.automation.editor.conditions.alias" + ), + inputType: "string", + placeholder: capitalizeFirstLetter( + describeCondition(this.condition, this.hass, true) + ), + defaultValue: this.condition.alias, + confirmText: this.hass.localize("ui.common.submit"), + }); + + const value = { ...this.condition }; + if (!alias) { + delete value.alias; + } else { + value.alias = alias; + } + fireEvent(this, "value-changed", { + value, + }); + } + public expand() { this.updateComplete.then(() => { this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true; diff --git a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts index 24a3d30762..c4a619653f 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts @@ -21,6 +21,7 @@ import { validateConfig } from "../../../../data/config"; import { showAlertDialog, showConfirmationDialog, + showPromptDialog, } from "../../../../dialogs/generic/show-dialog-box"; import { haStyle } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; @@ -139,6 +140,11 @@ export default class HaAutomationTriggerRow extends LitElement { "ui.panel.config.automation.editor.edit_yaml" )} + + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.rename" + )} + ${this.hass.localize( "ui.panel.config.automation.editor.actions.duplicate" @@ -325,7 +331,7 @@ export default class HaAutomationTriggerRow extends LitElement { } } - private _handleAction(ev: CustomEvent) { + private async _handleAction(ev: CustomEvent) { switch (ev.detail.index) { case 0: this._requestShowId = true; @@ -336,12 +342,15 @@ export default class HaAutomationTriggerRow extends LitElement { this.expand(); break; case 2: - fireEvent(this, "duplicate"); + await this._renameTrigger(); break; case 3: - this._onDisable(); + fireEvent(this, "duplicate"); break; case 4: + this._onDisable(); + break; + case 5: this._onDelete(); break; } @@ -412,6 +421,34 @@ export default class HaAutomationTriggerRow extends LitElement { }); } + private async _renameTrigger(): Promise { + const alias = await showPromptDialog(this, { + title: this.hass.localize( + "ui.panel.config.automation.editor.triggers.change_alias" + ), + inputLabel: this.hass.localize( + "ui.panel.config.automation.editor.triggers.alias" + ), + inputType: "string", + placeholder: capitalizeFirstLetter(describeTrigger(this.trigger, true)), + defaultValue: this.trigger.alias, + confirmText: this.hass.localize("ui.common.submit"), + }); + + const value = { ...this.trigger }; + if (!alias) { + delete value.alias; + } else { + value.alias = alias; + } + fireEvent(this, "value-changed", { + value, + }); + if (this._yamlMode) { + this._yamlEditor?.setValue(value); + } + } + public expand() { this.updateComplete.then(() => { this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true; diff --git a/src/translations/en.json b/src/translations/en.json index cc604a5cf0..222b1033f3 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1858,6 +1858,9 @@ "id": "Trigger ID", "edit_id": "Edit trigger ID", "duplicate": "Duplicate", + "rename": "Rename", + "change_alias": "Rename trigger", + "alias": "Trigger name", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "Are you sure you want to delete this?", "unsupported_platform": "No visual editor support for platform: {platform}", @@ -1973,6 +1976,9 @@ "invalid_condition": "Invalid condition configuration", "test_failed": "Error occurred while testing condition", "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", + "rename": "[%key:ui::panel::config::automation::editor::triggers::rename%]", + "change_alias": "Rename condition", + "alias": "Condition name", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]", "unsupported_condition": "No visual editor support for condition: {condition}", @@ -2061,6 +2067,9 @@ "run_action_error": "Error running action", "run_action_success": "Action run successfully", "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", + "rename": "[%key:ui::panel::config::automation::editor::triggers::rename%]", + "change_alias": "Rename action", + "alias": "Action name", "enable": "Enable", "disable": "Disable", "disabled": "Disabled",