Add support for renaming actions, conditions and triggers (#13444)

This commit is contained in:
Franck Nijhof 2022-08-23 17:21:16 +02:00 committed by GitHub
parent 1616911ba9
commit dff3ffe935
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 147 additions and 15 deletions

View File

@ -3,8 +3,8 @@ import { computeStateName } from "../common/entity/compute_state_name";
import type { HomeAssistant } from "../types"; import type { HomeAssistant } from "../types";
import { Condition, Trigger } from "./automation"; import { Condition, Trigger } from "./automation";
export const describeTrigger = (trigger: Trigger) => { export const describeTrigger = (trigger: Trigger, ignoreAlias = false) => {
if (trigger.alias) { if (trigger.alias && !ignoreAlias) {
return trigger.alias; return trigger.alias;
} }
return `${trigger.platform || "Unknown"} trigger`; return `${trigger.platform || "Unknown"} trigger`;
@ -12,9 +12,10 @@ export const describeTrigger = (trigger: Trigger) => {
export const describeCondition = ( export const describeCondition = (
condition: Condition, condition: Condition,
hass: HomeAssistant hass: HomeAssistant,
ignoreAlias = false
) => { ) => {
if (condition.alias) { if (condition.alias && !ignoreAlias) {
return condition.alias; return condition.alias;
} }

View File

@ -26,9 +26,10 @@ import {
export const describeAction = <T extends ActionType>( export const describeAction = <T extends ActionType>(
hass: HomeAssistant, hass: HomeAssistant,
action: ActionTypes[T], action: ActionTypes[T],
actionType?: T actionType?: T,
ignoreAlias = false
): string => { ): string => {
if (action.alias) { if (action.alias && !ignoreAlias) {
return action.alias; return action.alias;
} }
if (!actionType) { if (!actionType) {

View File

@ -73,6 +73,7 @@ class DialogBox extends LitElement {
<ha-textfield <ha-textfield
dialogInitialFocus dialogInitialFocus
value=${ifDefined(this._params.defaultValue)} value=${ifDefined(this._params.defaultValue)}
.placeholder=${ifDefined(this._params.placeholder)}
.label=${this._params.inputLabel .label=${this._params.inputLabel
? this._params.inputLabel ? this._params.inputLabel
: ""} : ""}
@ -158,6 +159,14 @@ class DialogBox extends LitElement {
/* Place above other dialogs */ /* Place above other dialogs */
--dialog-z-index: 104; --dialog-z-index: 104;
} }
@media all and (min-width: 600px) {
ha-dialog {
--mdc-dialog-min-width: 400px;
}
}
ha-textfield {
width: 100%;
}
`; `;
} }
} }

View File

@ -22,6 +22,7 @@ export interface PromptDialogParams extends BaseDialogBoxParams {
inputLabel?: string; inputLabel?: string;
inputType?: string; inputType?: string;
defaultValue?: string; defaultValue?: string;
placeholder?: string;
confirm?: (out?: string) => void; confirm?: (out?: string) => void;
} }

View File

@ -20,6 +20,7 @@ import { callExecuteScript } from "../../../../data/service";
import { import {
showAlertDialog, showAlertDialog,
showConfirmationDialog, showConfirmationDialog,
showPromptDialog,
} from "../../../../dialogs/generic/show-dialog-box"; } 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";
@ -200,6 +201,11 @@ export default class HaAutomationActionRow extends LitElement {
"ui.panel.config.automation.editor.edit_yaml" "ui.panel.config.automation.editor.edit_yaml"
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item>
${this.hass.localize(
"ui.panel.config.automation.editor.actions.rename"
)}
</mwc-list-item>
<mwc-list-item> <mwc-list-item>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
@ -298,7 +304,7 @@ export default class HaAutomationActionRow extends LitElement {
fireEvent(this, "move-action", { direction: "down" }); fireEvent(this, "move-action", { direction: "down" });
} }
private _handleAction(ev: CustomEvent<ActionDetail>) { private async _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) { switch (ev.detail.index) {
case 0: case 0:
this._runAction(); this._runAction();
@ -308,12 +314,15 @@ export default class HaAutomationActionRow extends LitElement {
this.expand(); this.expand();
break; break;
case 2: case 2:
fireEvent(this, "duplicate"); await this._renameAction();
break; break;
case 3: case 3:
this._onDisable(); fireEvent(this, "duplicate");
break; break;
case 4: case 4:
this._onDisable();
break;
case 5:
this._onDelete(); this._onDelete();
break; break;
} }
@ -388,6 +397,35 @@ export default class HaAutomationActionRow extends LitElement {
this._yamlMode = !this._yamlMode; this._yamlMode = !this._yamlMode;
} }
private async _renameAction(): Promise<void> {
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() { public expand() {
this.updateComplete.then(() => { this.updateComplete.then(() => {
this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true; this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true;

View File

@ -19,6 +19,7 @@ import { validateConfig } from "../../../../data/config";
import { import {
showAlertDialog, showAlertDialog,
showConfirmationDialog, showConfirmationDialog,
showPromptDialog,
} from "../../../../dialogs/generic/show-dialog-box"; } from "../../../../dialogs/generic/show-dialog-box";
import { haStyle } from "../../../../resources/styles"; import { haStyle } from "../../../../resources/styles";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
@ -112,6 +113,11 @@ export default class HaAutomationConditionRow extends LitElement {
"ui.panel.config.automation.editor.edit_yaml" "ui.panel.config.automation.editor.edit_yaml"
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item>
${this.hass.localize(
"ui.panel.config.automation.editor.conditions.rename"
)}
</mwc-list-item>
<mwc-list-item> <mwc-list-item>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
@ -187,19 +193,22 @@ export default class HaAutomationConditionRow extends LitElement {
} }
} }
private _handleAction(ev: CustomEvent<ActionDetail>) { private async _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) { switch (ev.detail.index) {
case 0: case 0:
this._switchYamlMode(); this._switchYamlMode();
this.expand(); this.expand();
break; break;
case 1: case 1:
fireEvent(this, "duplicate"); await this._renameCondition();
break; break;
case 2: case 2:
this._onDisable(); fireEvent(this, "duplicate");
break; break;
case 3: case 3:
this._onDisable();
break;
case 4:
this._onDelete(); this._onDelete();
break; break;
} }
@ -288,6 +297,33 @@ export default class HaAutomationConditionRow extends LitElement {
} }
} }
private async _renameCondition(): Promise<void> {
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() { public expand() {
this.updateComplete.then(() => { this.updateComplete.then(() => {
this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true; this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true;

View File

@ -21,6 +21,7 @@ import { validateConfig } from "../../../../data/config";
import { import {
showAlertDialog, showAlertDialog,
showConfirmationDialog, showConfirmationDialog,
showPromptDialog,
} from "../../../../dialogs/generic/show-dialog-box"; } 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";
@ -139,6 +140,11 @@ export default class HaAutomationTriggerRow extends LitElement {
"ui.panel.config.automation.editor.edit_yaml" "ui.panel.config.automation.editor.edit_yaml"
)} )}
</mwc-list-item> </mwc-list-item>
<mwc-list-item>
${this.hass.localize(
"ui.panel.config.automation.editor.triggers.rename"
)}
</mwc-list-item>
<mwc-list-item> <mwc-list-item>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
@ -325,7 +331,7 @@ export default class HaAutomationTriggerRow extends LitElement {
} }
} }
private _handleAction(ev: CustomEvent<ActionDetail>) { private async _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) { switch (ev.detail.index) {
case 0: case 0:
this._requestShowId = true; this._requestShowId = true;
@ -336,12 +342,15 @@ export default class HaAutomationTriggerRow extends LitElement {
this.expand(); this.expand();
break; break;
case 2: case 2:
fireEvent(this, "duplicate"); await this._renameTrigger();
break; break;
case 3: case 3:
this._onDisable(); fireEvent(this, "duplicate");
break; break;
case 4: case 4:
this._onDisable();
break;
case 5:
this._onDelete(); this._onDelete();
break; break;
} }
@ -412,6 +421,34 @@ export default class HaAutomationTriggerRow extends LitElement {
}); });
} }
private async _renameTrigger(): Promise<void> {
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() { public expand() {
this.updateComplete.then(() => { this.updateComplete.then(() => {
this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true; this.shadowRoot!.querySelector("ha-expansion-panel")!.expanded = true;

View File

@ -1858,6 +1858,9 @@
"id": "Trigger ID", "id": "Trigger ID",
"edit_id": "Edit trigger ID", "edit_id": "Edit trigger ID",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"rename": "Rename",
"change_alias": "Rename trigger",
"alias": "Trigger name",
"delete": "[%key:ui::panel::mailbox::delete_button%]", "delete": "[%key:ui::panel::mailbox::delete_button%]",
"delete_confirm": "Are you sure you want to delete this?", "delete_confirm": "Are you sure you want to delete this?",
"unsupported_platform": "No visual editor support for platform: {platform}", "unsupported_platform": "No visual editor support for platform: {platform}",
@ -1973,6 +1976,9 @@
"invalid_condition": "Invalid condition configuration", "invalid_condition": "Invalid condition configuration",
"test_failed": "Error occurred while testing condition", "test_failed": "Error occurred while testing condition",
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "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": "[%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%]",
"unsupported_condition": "No visual editor support for condition: {condition}", "unsupported_condition": "No visual editor support for condition: {condition}",
@ -2061,6 +2067,9 @@
"run_action_error": "Error running action", "run_action_error": "Error running action",
"run_action_success": "Action run successfully", "run_action_success": "Action run successfully",
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "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", "enable": "Enable",
"disable": "Disable", "disable": "Disable",
"disabled": "Disabled", "disabled": "Disabled",