Redesign trigger/condition/action overflow menus (#13453)

* Redesign trigger/condition/action overflow menus

* Reorder items, changed enable/disable icons, cleanup aria

* Simplify menu item names
This commit is contained in:
Franck Nijhof 2022-08-24 00:26:38 +02:00 committed by GitHub
parent ed82ae9f68
commit be169f9c83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 242 additions and 82 deletions

View File

@ -1,6 +1,17 @@
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import "@material/mwc-list/mwc-list-item"; import "@material/mwc-list/mwc-list-item";
import { mdiArrowDown, mdiArrowUp, mdiDotsVertical } from "@mdi/js"; import {
mdiArrowDown,
mdiArrowUp,
mdiCheck,
mdiContentDuplicate,
mdiDelete,
mdiDotsVertical,
mdiPlay,
mdiPlayCircleOutline,
mdiRenameBox,
mdiStopCircleOutline,
} from "@mdi/js";
import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit";
import { customElement, property, query, state } from "lit/decorators"; import { customElement, property, query, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map"; import { classMap } from "lit/directives/class-map";
@ -187,31 +198,56 @@ 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> <mwc-list-item graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.run_action" "ui.panel.config.automation.editor.actions.run"
)} )}
<ha-svg-icon slot="graphic" .path=${mdiPlay}></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item .disabled=${!this._uiModeAvailable}>
${yamlMode <mwc-list-item graphic="icon">
? this.hass.localize(
"ui.panel.config.automation.editor.edit_ui"
)
: this.hass.localize(
"ui.panel.config.automation.editor.edit_yaml"
)}
</mwc-list-item>
<mwc-list-item>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.rename" "ui.panel.config.automation.editor.actions.rename"
)} )}
<ha-svg-icon slot="graphic" .path=${mdiRenameBox}></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
)} )}
<ha-svg-icon
slot="graphic"
.path=${mdiContentDuplicate}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item>
<li divider role="separator"></li>
<mwc-list-item .disabled=${!this._uiModeAvailable} graphic="icon">
${this.hass.localize("ui.panel.config.automation.editor.edit_ui")}
${!yamlMode
? html`<ha-svg-icon
slot="graphic"
.path=${mdiCheck}
></ha-svg-icon>`
: ``}
</mwc-list-item>
<mwc-list-item .disabled=${!this._uiModeAvailable} graphic="icon">
${this.hass.localize(
"ui.panel.config.automation.editor.edit_yaml"
)}
${yamlMode
? html`<ha-svg-icon
slot="graphic"
.path=${mdiCheck}
></ha-svg-icon>`
: ``}
</mwc-list-item>
<li divider role="separator"></li>
<mwc-list-item graphic="icon">
${this.action.enabled === false ${this.action.enabled === false
? this.hass.localize( ? this.hass.localize(
"ui.panel.config.automation.editor.actions.enable" "ui.panel.config.automation.editor.actions.enable"
@ -219,11 +255,22 @@ export default class HaAutomationActionRow extends LitElement {
: this.hass.localize( : this.hass.localize(
"ui.panel.config.automation.editor.actions.disable" "ui.panel.config.automation.editor.actions.disable"
)} )}
<ha-svg-icon
slot="graphic"
.path=${this.action.enabled === false
? mdiPlayCircleOutline
: mdiStopCircleOutline}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item class="warning"> <mwc-list-item class="warning" graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.delete" "ui.panel.config.automation.editor.actions.delete"
)} )}
<ha-svg-icon
class="warning"
slot="graphic"
.path=${mdiDelete}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
</ha-button-menu> </ha-button-menu>
<div <div
@ -310,19 +357,23 @@ export default class HaAutomationActionRow extends LitElement {
this._runAction(); this._runAction();
break; break;
case 1: case 1:
await this._renameAction();
break;
case 2:
fireEvent(this, "duplicate");
break;
case 3:
this._switchUiMode();
this.expand();
break;
case 4:
this._switchYamlMode(); this._switchYamlMode();
this.expand(); this.expand();
break; break;
case 2: case 5:
await this._renameAction();
break;
case 3:
fireEvent(this, "duplicate");
break;
case 4:
this._onDisable(); this._onDisable();
break; break;
case 5: case 6:
this._onDelete(); this._onDelete();
break; break;
} }
@ -392,9 +443,14 @@ export default class HaAutomationActionRow extends LitElement {
fireEvent(this, "value-changed", { value: ev.detail.value }); fireEvent(this, "value-changed", { value: ev.detail.value });
} }
private _switchUiMode() {
this._warnings = undefined;
this._yamlMode = false;
}
private _switchYamlMode() { private _switchYamlMode() {
this._warnings = undefined; this._warnings = undefined;
this._yamlMode = !this._yamlMode; this._yamlMode = true;
} }
private async _renameAction(): Promise<void> { private async _renameAction(): Promise<void> {
@ -461,9 +517,6 @@ export default class HaAutomationActionRow extends LitElement {
mwc-list-item[disabled] { mwc-list-item[disabled] {
--mdc-theme-text-primary-on-background: var(--disabled-text-color); --mdc-theme-text-primary-on-background: var(--disabled-text-color);
} }
.warning {
margin-bottom: 8px;
}
.warning ul { .warning ul {
margin: 4px 0; margin: 4px 0;
} }

View File

@ -1,6 +1,14 @@
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import "@material/mwc-list/mwc-list-item"; import "@material/mwc-list/mwc-list-item";
import { mdiDotsVertical } from "@mdi/js"; import {
mdiCheck,
mdiContentDuplicate,
mdiDelete,
mdiDotsVertical,
mdiPlayCircleOutline,
mdiRenameBox,
mdiStopCircleOutline,
} from "@mdi/js";
import { css, CSSResultGroup, html, LitElement } from "lit"; import { css, CSSResultGroup, html, LitElement } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map"; import { classMap } from "lit/directives/class-map";
@ -104,26 +112,50 @@ export default class HaAutomationConditionRow extends LitElement {
.path=${mdiDotsVertical} .path=${mdiDotsVertical}
> >
</ha-icon-button> </ha-icon-button>
<mwc-list-item>
${this._yamlMode <mwc-list-item graphic="icon">
? this.hass.localize(
"ui.panel.config.automation.editor.edit_ui"
)
: this.hass.localize(
"ui.panel.config.automation.editor.edit_yaml"
)}
</mwc-list-item>
<mwc-list-item>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.conditions.rename" "ui.panel.config.automation.editor.conditions.rename"
)} )}
<ha-svg-icon slot="graphic" .path=${mdiRenameBox}></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
)} )}
<ha-svg-icon
slot="graphic"
.path=${mdiContentDuplicate}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item>
<li divider role="separator"></li>
<mwc-list-item graphic="icon">
${this.hass.localize("ui.panel.config.automation.editor.edit_ui")}
${!this._yamlMode
? html`<ha-svg-icon
slot="graphic"
.path=${mdiCheck}
></ha-svg-icon>`
: ``}
</mwc-list-item>
<mwc-list-item graphic="icon">
${this.hass.localize(
"ui.panel.config.automation.editor.edit_yaml"
)}
${this._yamlMode
? html`<ha-svg-icon
slot="graphic"
.path=${mdiCheck}
></ha-svg-icon>`
: ``}
</mwc-list-item>
<li divider role="separator"></li>
<mwc-list-item graphic="icon">
${this.condition.enabled === false ${this.condition.enabled === false
? this.hass.localize( ? this.hass.localize(
"ui.panel.config.automation.editor.actions.enable" "ui.panel.config.automation.editor.actions.enable"
@ -131,11 +163,22 @@ export default class HaAutomationConditionRow extends LitElement {
: this.hass.localize( : this.hass.localize(
"ui.panel.config.automation.editor.actions.disable" "ui.panel.config.automation.editor.actions.disable"
)} )}
<ha-svg-icon
slot="graphic"
.path=${this.condition.enabled === false
? mdiPlayCircleOutline
: mdiStopCircleOutline}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item class="warning"> <mwc-list-item class="warning" graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.delete" "ui.panel.config.automation.editor.actions.delete"
)} )}
<ha-svg-icon
class="warning"
slot="graphic"
.path=${mdiDelete}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
</ha-button-menu> </ha-button-menu>
@ -196,19 +239,23 @@ export default class HaAutomationConditionRow extends LitElement {
private async _handleAction(ev: CustomEvent<ActionDetail>) { private async _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) { switch (ev.detail.index) {
case 0: case 0:
await this._renameCondition();
break;
case 1:
fireEvent(this, "duplicate");
break;
case 2:
this._switchUiMode();
this.expand();
break;
case 3:
this._switchYamlMode(); this._switchYamlMode();
this.expand(); this.expand();
break; break;
case 1: case 4:
await this._renameCondition();
break;
case 2:
fireEvent(this, "duplicate");
break;
case 3:
this._onDisable(); this._onDisable();
break; break;
case 4: case 5:
this._onDelete(); this._onDelete();
break; break;
} }
@ -233,9 +280,14 @@ export default class HaAutomationConditionRow extends LitElement {
}); });
} }
private _switchUiMode() {
this._warnings = undefined;
this._yamlMode = false;
}
private _switchYamlMode() { private _switchYamlMode() {
this._warnings = undefined; this._warnings = undefined;
this._yamlMode = !this._yamlMode; this._yamlMode = true;
} }
private async _testCondition(ev) { private async _testCondition(ev) {

View File

@ -1,6 +1,15 @@
import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import "@material/mwc-list/mwc-list-item"; import "@material/mwc-list/mwc-list-item";
import { mdiDotsVertical } from "@mdi/js"; import {
mdiCheck,
mdiContentDuplicate,
mdiDelete,
mdiDotsVertical,
mdiIdentifier,
mdiPlayCircleOutline,
mdiRenameBox,
mdiStopCircleOutline,
} from "@mdi/js";
import type { UnsubscribeFunc } from "home-assistant-js-websocket"; import type { UnsubscribeFunc } from "home-assistant-js-websocket";
import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit";
import { customElement, property, query, state } from "lit/decorators"; import { customElement, property, query, state } from "lit/decorators";
@ -126,31 +135,57 @@ export default class HaAutomationTriggerRow 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( <mwc-list-item graphic="icon">
"ui.panel.config.automation.editor.triggers.edit_id"
)}
</mwc-list-item>
<mwc-list-item .disabled=${!supported}>
${yamlMode
? this.hass.localize(
"ui.panel.config.automation.editor.edit_ui"
)
: this.hass.localize(
"ui.panel.config.automation.editor.edit_yaml"
)}
</mwc-list-item>
<mwc-list-item>
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.triggers.rename" "ui.panel.config.automation.editor.triggers.rename"
)} )}
<ha-svg-icon slot="graphic" .path=${mdiRenameBox}></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item> <mwc-list-item graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.duplicate" "ui.panel.config.automation.editor.actions.duplicate"
)} )}
<ha-svg-icon
slot="graphic"
.path=${mdiContentDuplicate}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item>
<mwc-list-item graphic="icon">
${this.hass.localize(
"ui.panel.config.automation.editor.triggers.edit_id"
)}
<ha-svg-icon slot="graphic" .path=${mdiIdentifier}></ha-svg-icon>
</mwc-list-item>
<li divider role="separator"></li>
<mwc-list-item .disabled=${!supported} graphic="icon">
${this.hass.localize("ui.panel.config.automation.editor.edit_ui")}
${!yamlMode
? html`<ha-svg-icon
slot="graphic"
.path=${mdiCheck}
></ha-svg-icon>`
: ``}
</mwc-list-item>
<mwc-list-item .disabled=${!supported} graphic="icon">
${this.hass.localize(
"ui.panel.config.automation.editor.edit_yaml"
)}
${yamlMode
? html`<ha-svg-icon
slot="graphic"
.path=${mdiCheck}
></ha-svg-icon>`
: ``}
</mwc-list-item>
<li divider role="separator"></li>
<mwc-list-item graphic="icon">
${this.trigger.enabled === false ${this.trigger.enabled === false
? this.hass.localize( ? this.hass.localize(
"ui.panel.config.automation.editor.actions.enable" "ui.panel.config.automation.editor.actions.enable"
@ -158,11 +193,22 @@ export default class HaAutomationTriggerRow extends LitElement {
: this.hass.localize( : this.hass.localize(
"ui.panel.config.automation.editor.actions.disable" "ui.panel.config.automation.editor.actions.disable"
)} )}
<ha-svg-icon
slot="graphic"
.path=${this.trigger.enabled === false
? mdiPlayCircleOutline
: mdiStopCircleOutline}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
<mwc-list-item class="warning"> <mwc-list-item class="warning" graphic="icon">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.automation.editor.actions.delete" "ui.panel.config.automation.editor.actions.delete"
)} )}
<ha-svg-icon
class="warning"
slot="graphic"
.path=${mdiDelete}
></ha-svg-icon>
</mwc-list-item> </mwc-list-item>
</ha-button-menu> </ha-button-menu>
@ -334,23 +380,27 @@ export default class HaAutomationTriggerRow extends LitElement {
private async _handleAction(ev: CustomEvent<ActionDetail>) { private async _handleAction(ev: CustomEvent<ActionDetail>) {
switch (ev.detail.index) { switch (ev.detail.index) {
case 0: case 0:
await this._renameTrigger();
break;
case 1:
fireEvent(this, "duplicate");
break;
case 2:
this._requestShowId = true; this._requestShowId = true;
this.expand(); this.expand();
break; break;
case 1: case 3:
this._switchUiMode();
this.expand();
break;
case 4:
this._switchYamlMode(); this._switchYamlMode();
this.expand(); this.expand();
break; break;
case 2: case 5:
await this._renameTrigger();
break;
case 3:
fireEvent(this, "duplicate");
break;
case 4:
this._onDisable(); this._onDisable();
break; break;
case 5: case 6:
this._onDelete(); this._onDelete();
break; break;
} }
@ -404,9 +454,14 @@ export default class HaAutomationTriggerRow extends LitElement {
fireEvent(this, "value-changed", { value: ev.detail.value }); fireEvent(this, "value-changed", { value: ev.detail.value });
} }
private _switchUiMode() {
this._warnings = undefined;
this._yamlMode = false;
}
private _switchYamlMode() { private _switchYamlMode() {
this._warnings = undefined; this._warnings = undefined;
this._yamlMode = !this._yamlMode; this._yamlMode = true;
} }
private _showTriggeredInfo() { private _showTriggeredInfo() {

View File

@ -1859,7 +1859,7 @@
"triggered": "Triggered", "triggered": "Triggered",
"add": "Add trigger", "add": "Add trigger",
"id": "Trigger ID", "id": "Trigger ID",
"edit_id": "Edit trigger ID", "edit_id": "Edit ID",
"duplicate": "Duplicate", "duplicate": "Duplicate",
"rename": "Rename", "rename": "Rename",
"change_alias": "Rename trigger", "change_alias": "Rename trigger",
@ -2066,7 +2066,7 @@
"learn_more": "Learn more about actions", "learn_more": "Learn more about actions",
"add": "Add action", "add": "Add action",
"invalid_action": "Invalid action", "invalid_action": "Invalid action",
"run_action": "Run action", "run": "Run",
"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%]",