diff --git a/src/components/ha-selector/ha-selector-action.ts b/src/components/ha-selector/ha-selector-action.ts index 5a6fd5f6c3..f5c770ebf0 100644 --- a/src/components/ha-selector/ha-selector-action.ts +++ b/src/components/ha-selector/ha-selector-action.ts @@ -18,11 +18,13 @@ export class HaActionSelector extends LitElement { @property({ type: Boolean, reflect: true }) public disabled = false; protected render() { - return html``; + return html` + + `; } static get styles(): CSSResultGroup { 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 5fa84a8dea..71593afff5 100644 --- a/src/panels/config/automation/action/ha-automation-action-row.ts +++ b/src/panels/config/automation/action/ha-automation-action-row.ts @@ -9,6 +9,7 @@ import { mdiPlayCircleOutline, mdiRenameBox, mdiStopCircleOutline, + mdiSort, } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; import { customElement, property, query, state } from "lit/decorators"; @@ -190,6 +191,12 @@ export default class HaAutomationActionRow extends LitElement { .path=${mdiRenameBox} > + + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.re_order" + )} + + ${this.hass.localize( "ui.panel.config.automation.editor.actions.duplicate" @@ -348,20 +355,23 @@ export default class HaAutomationActionRow extends LitElement { await this._renameAction(); break; case 2: - fireEvent(this, "duplicate"); + fireEvent(this, "re-order"); break; case 3: + fireEvent(this, "duplicate"); + break; + case 4: this._switchUiMode(); this.expand(); break; - case 4: + case 5: this._switchYamlMode(); this.expand(); break; - case 5: + case 6: this._onDisable(); break; - case 6: + case 7: this._onDelete(); break; } diff --git a/src/panels/config/automation/action/ha-automation-action.ts b/src/panels/config/automation/action/ha-automation-action.ts index 3462abd6bc..5b34dccef0 100644 --- a/src/panels/config/automation/action/ha-automation-action.ts +++ b/src/panels/config/automation/action/ha-automation-action.ts @@ -46,6 +46,8 @@ export default class HaAutomationAction extends LitElement { @property({ type: Boolean }) public disabled = false; + @property({ type: Boolean }) public nested = false; + @property() public actions!: Action[]; @property({ type: Boolean }) public reOrderMode = false; @@ -58,6 +60,25 @@ export default class HaAutomationAction extends LitElement { protected render() { return html` + ${this.reOrderMode && !this.nested + ? html` + + ${this.hass.localize( + "ui.panel.config.automation.editor.re_order_mode.description_actions" + )} + + ${this.hass.localize( + "ui.panel.config.automation.editor.re_order_mode.exit" + )} + + + ` + : null}
${repeat( this.actions, @@ -72,6 +93,7 @@ export default class HaAutomationAction extends LitElement { .reOrderMode=${this.reOrderMode} @duplicate=${this._duplicateAction} @value-changed=${this._actionChanged} + @re-order=${this._enterReOrderMode} .hass=${this.hass} > ${this.reOrderMode @@ -155,6 +177,16 @@ export default class HaAutomationAction extends LitElement { } } + private async _enterReOrderMode(ev: CustomEvent) { + if (this.nested) return; + ev.stopPropagation(); + this.reOrderMode = true; + } + + private async _exitReOrderMode() { + this.reOrderMode = false; + } + private async _createSortable() { const Sortable = await loadSortable(); this._sortable = new Sortable(this.shadowRoot!.querySelector(".actions")!, { @@ -282,6 +314,12 @@ export default class HaAutomationAction extends LitElement { ha-svg-icon { height: 20px; } + ha-alert { + display: block; + margin-bottom: 16px; + border-radius: var(--ha-card-border-radius, 16px); + overflow: hidden; + } .handle { cursor: move; padding: 12px; diff --git a/src/panels/config/automation/action/types/ha-automation-action-choose.ts b/src/panels/config/automation/action/types/ha-automation-action-choose.ts index 9158f61106..b9b15a384d 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-choose.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-choose.ts @@ -55,6 +55,7 @@ export class HaChooseAction extends LitElement implements ActionElement { )}: (option.conditions)} .reOrderMode=${this.reOrderMode} .disabled=${this.disabled} @@ -68,6 +69,7 @@ export class HaChooseAction extends LitElement implements ActionElement { )}: `; 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 e1b861358d..ee83f2d96a 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-row.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-row.ts @@ -8,6 +8,7 @@ import { mdiFlask, mdiPlayCircleOutline, mdiRenameBox, + mdiSort, mdiStopCircleOutline, } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement } from "lit"; @@ -142,6 +143,14 @@ export default class HaAutomationConditionRow extends LitElement { .path=${mdiRenameBox} > + + + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.re_order" + )} + + + ${this.hass.localize( "ui.panel.config.automation.editor.actions.duplicate" @@ -294,20 +303,23 @@ export default class HaAutomationConditionRow extends LitElement { await this._renameCondition(); break; case 2: - fireEvent(this, "duplicate"); + fireEvent(this, "re-order"); break; case 3: + fireEvent(this, "duplicate"); + break; + case 4: this._switchUiMode(); this.expand(); break; - case 4: + case 5: this._switchYamlMode(); this.expand(); break; - case 5: + case 6: this._onDisable(); break; - case 6: + case 7: this._onDelete(); break; } diff --git a/src/panels/config/automation/condition/ha-automation-condition.ts b/src/panels/config/automation/condition/ha-automation-condition.ts index e6ac6e7a89..70fdfb17d6 100644 --- a/src/panels/config/automation/condition/ha-automation-condition.ts +++ b/src/panels/config/automation/condition/ha-automation-condition.ts @@ -44,6 +44,8 @@ export default class HaAutomationCondition extends LitElement { @property({ type: Boolean }) public disabled = false; + @property({ type: Boolean }) public nested = false; + @property({ type: Boolean }) public reOrderMode = false; private _focusLastConditionOnChange = false; @@ -102,6 +104,25 @@ export default class HaAutomationCondition extends LitElement { return html``; } return html` + ${this.reOrderMode && !this.nested + ? html` + + ${this.hass.localize( + "ui.panel.config.automation.editor.re_order_mode.description_conditions" + )} + + ${this.hass.localize( + "ui.panel.config.automation.editor.re_order_mode.exit" + )} + + + ` + : null}
${repeat( this.conditions, @@ -117,6 +138,7 @@ export default class HaAutomationCondition extends LitElement { @duplicate=${this._duplicateCondition} @move-condition=${this._move} @value-changed=${this._conditionChanged} + @re-order=${this._enterReOrderMode} .hass=${this.hass} > ${this.reOrderMode @@ -176,6 +198,16 @@ export default class HaAutomationCondition extends LitElement { `; } + private async _enterReOrderMode(ev: CustomEvent) { + if (this.nested) return; + ev.stopPropagation(); + this.reOrderMode = true; + } + + private async _exitReOrderMode() { + this.reOrderMode = false; + } + private async _createSortable() { const Sortable = await loadSortable(); this._sortable = new Sortable( @@ -311,6 +343,12 @@ export default class HaAutomationCondition extends LitElement { ha-svg-icon { height: 20px; } + ha-alert { + display: block; + margin-bottom: 16px; + border-radius: var(--ha-card-border-radius, 16px); + overflow: hidden; + } .handle { cursor: move; padding: 12px; diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-logical.ts b/src/panels/config/automation/condition/types/ha-automation-condition-logical.ts index 08de5eb584..a7aa3fb9a6 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-logical.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-logical.ts @@ -25,6 +25,7 @@ export class HaLogicalCondition extends LitElement implements ConditionElement { protected render() { return html` void @@ -215,18 +211,6 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) { ` : ""} - ${this._config && !("use_blueprint" in this._config) - ? html` - ${this.hass.localize( - "ui.panel.config.automation.editor.re_order" - )} - - ` - : ""} { return new Promise((resolve) => { showAutomationRenameDialog(this, { diff --git a/src/panels/config/automation/manual-automation-editor.ts b/src/panels/config/automation/manual-automation-editor.ts index 59fc55b3ce..e0417269b6 100644 --- a/src/panels/config/automation/manual-automation-editor.ts +++ b/src/panels/config/automation/manual-automation-editor.ts @@ -6,7 +6,6 @@ import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/ha-card"; import "../../../components/ha-icon-button"; -import "../../../components/ha-alert"; import { Condition, ManualAutomationConfig, @@ -34,9 +33,6 @@ export class HaManualAutomationEditor extends LitElement { @property({ attribute: false }) public stateObj?: HassEntity; - @property({ type: Boolean, reflect: true, attribute: "re-order-mode" }) - public reOrderMode = false; - protected render() { return html` ${this.disabled @@ -61,25 +57,6 @@ export class HaManualAutomationEditor extends LitElement { ` : ""} - ${this.reOrderMode - ? html` - - ${this.hass.localize( - "ui.panel.config.automation.editor.re_order_mode.description" - )} - - ${this.hass.localize( - "ui.panel.config.automation.editor.re_order_mode.exit" - )} - - - ` - : ""} ${this.config.description ? html` @@ -143,7 +119,6 @@ export class HaManualAutomationEditor extends LitElement { .conditions=${this.config.condition || []} @value-changed=${this._conditionChanged} .hass=${this.hass} - .reOrderMode=${this.reOrderMode} .disabled=${this.disabled} > @@ -176,16 +151,11 @@ export class HaManualAutomationEditor extends LitElement { @value-changed=${this._actionChanged} .hass=${this.hass} .narrow=${this.narrow} - .reOrderMode=${this.reOrderMode} .disabled=${this.disabled} > `; } - private _exitReOrderMode() { - this.reOrderMode = !this.reOrderMode; - } - private _triggerChanged(ev: CustomEvent): void { ev.stopPropagation(); fireEvent(this, "value-changed", { @@ -254,10 +224,6 @@ export class HaManualAutomationEditor extends LitElement { .header a { color: var(--secondary-text-color); } - ha-alert { - display: block; - margin-bottom: 16px; - } `, ]; } 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 1e448766c9..3ba9373939 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts @@ -8,6 +8,7 @@ import { mdiIdentifier, mdiPlayCircleOutline, mdiRenameBox, + mdiSort, mdiStopCircleOutline, } from "@mdi/js"; import type { UnsubscribeFunc } from "home-assistant-js-websocket"; @@ -159,9 +160,17 @@ export default class HaAutomationTriggerRow extends LitElement { .path=${mdiRenameBox} > + ${this.hass.localize( - "ui.panel.config.automation.editor.actions.duplicate" + "ui.panel.config.automation.editor.triggers.re_order" + )} + + + + + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.duplicate" )} (); @@ -55,6 +57,27 @@ export default class HaAutomationTrigger extends LitElement { protected render() { return html` + ${ + this.reOrderMode && !this.nested + ? html` + + ${this.hass.localize( + "ui.panel.config.automation.editor.re_order_mode.description_triggers" + )} + + ${this.hass.localize( + "ui.panel.config.automation.editor.re_order_mode.exit" + )} + + + ` + : null + }
${repeat( this.triggers, @@ -68,6 +91,7 @@ export default class HaAutomationTrigger extends LitElement { @value-changed=${this._triggerChanged} .hass=${this.hass} .disabled=${this.disabled} + @re-order=${this._enterReOrderMode} > ${this.reOrderMode ? html` @@ -148,6 +172,16 @@ export default class HaAutomationTrigger extends LitElement { } } + private async _enterReOrderMode(ev: CustomEvent) { + if (this.nested) return; + ev.stopPropagation(); + this.reOrderMode = true; + } + + private async _exitReOrderMode() { + this.reOrderMode = false; + } + private async _createSortable() { const Sortable = await loadSortable(); this._sortable = new Sortable( @@ -283,6 +317,12 @@ export default class HaAutomationTrigger extends LitElement { ha-svg-icon { height: 20px; } + ha-alert { + display: block; + margin-bottom: 16px; + border-radius: var(--ha-card-border-radius, 16px); + overflow: hidden; + } .handle { cursor: move; padding: 12px; diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index 4d8b4d12ff..167b0f6d95 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -7,7 +7,6 @@ import { mdiDotsVertical, mdiInformationOutline, mdiPlay, - mdiSort, mdiTransitConnection, } from "@mdi/js"; import "@polymer/app-layout/app-header/app-header"; @@ -62,7 +61,6 @@ import { documentationUrl } from "../../../util/documentation-url"; import { showToast } from "../../../util/toast"; import "./blueprint-script-editor"; import "./manual-script-editor"; -import type { HaManualScriptEditor } from "./manual-script-editor"; export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; @@ -93,9 +91,6 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) { @query("ha-yaml-editor", true) private _yamlEditor?: HaYamlEditor; - @query("manual-script-editor") - private _manualEditor?: HaManualScriptEditor; - private _schema = memoizeOne( ( hasID: boolean, @@ -238,23 +233,6 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) { ` : ""} - ${this._config && !("use_blueprint" in this._config) - ? html` - - ${this.hass.localize( - "ui.panel.config.automation.editor.re_order" - )} - - - ` - : ""}
  • @@ -801,12 +779,6 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) { this._mode = "yaml"; } - private _toggleReOrderMode() { - if (this._manualEditor) { - this._manualEditor.reOrderMode = !this._manualEditor.reOrderMode; - } - } - private async _saveScript(): Promise { if (this._idError) { showToast(this, { diff --git a/src/panels/config/script/manual-script-editor.ts b/src/panels/config/script/manual-script-editor.ts index 172c93ed22..d7d7ced9cf 100644 --- a/src/panels/config/script/manual-script-editor.ts +++ b/src/panels/config/script/manual-script-editor.ts @@ -3,7 +3,6 @@ import { mdiHelpCircle } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/ha-alert"; import "../../../components/ha-card"; import "../../../components/ha-icon-button"; import { Action, ScriptConfig } from "../../../data/script"; @@ -24,9 +23,6 @@ export class HaManualScriptEditor extends LitElement { @property({ attribute: false }) public config!: ScriptConfig; - @property({ type: Boolean, reflect: true, attribute: "re-order-mode" }) - public reOrderMode = false; - protected render() { return html` ${this.disabled @@ -37,26 +33,6 @@ export class HaManualScriptEditor extends LitElement { ` : ""} - ${this.reOrderMode - ? html` - - ${this.hass.localize( - "ui.panel.config.automation.editor.re_order_mode.description" - )} - - ${this.hass.localize( - "ui.panel.config.automation.editor.re_order_mode.exit" - )} - - - ` - : ""} -

    ${this.hass.localize("ui.panel.config.script.editor.sequence")} @@ -83,7 +59,6 @@ export class HaManualScriptEditor extends LitElement { .hass=${this.hass} .narrow=${this.narrow} .disabled=${this.disabled} - .reOrderMode=${this.reOrderMode} > `; } @@ -95,10 +70,6 @@ export class HaManualScriptEditor extends LitElement { }); } - private _exitReOrderMode() { - this.reOrderMode = !this.reOrderMode; - } - private _duplicate() { fireEvent(this, "duplicate"); } @@ -134,10 +105,6 @@ export class HaManualScriptEditor extends LitElement { .header a { color: var(--secondary-text-color); } - ha-alert { - display: block; - margin-bottom: 16px; - } `, ]; } diff --git a/src/translations/en.json b/src/translations/en.json index 338e655df2..761a3531ad 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1884,7 +1884,9 @@ "re_order": "Re-order", "re_order_mode": { "title": "Re-order mode", - "description": "You are in re-order mode, you can re-order your triggers, conditions and actions.", + "description_triggers": "You are in re-order mode, you can re-order your triggers.", + "description_conditions": "You are in re-order mode, you can re-order your conditions.", + "description_actions": "You are in re-order mode, you can re-order your actions.", "exit": "Exit" }, "description": { @@ -1922,6 +1924,7 @@ "id": "Trigger ID", "edit_id": "Edit ID", "duplicate": "[%key:ui::common::duplicate%]", + "re_order": "Re-order", "rename": "Rename", "change_alias": "Rename trigger", "alias": "Trigger name", @@ -2043,6 +2046,7 @@ "invalid_condition": "Invalid condition configuration", "test_failed": "Error occurred while testing condition", "duplicate": "[%key:ui::common::duplicate%]", + "re_order": "[%key:ui::panel::config::automation::editor::triggers::re_order%]", "rename": "[%key:ui::panel::config::automation::editor::triggers::rename%]", "change_alias": "Rename condition", "alias": "Condition name", @@ -2135,6 +2139,7 @@ "run_action_error": "Error running action", "run_action_success": "Action run successfully", "duplicate": "[%key:ui::common::duplicate%]", + "re_order": "[%key:ui::panel::config::automation::editor::triggers::re_order%]", "rename": "[%key:ui::panel::config::automation::editor::triggers::rename%]", "change_alias": "Rename action", "alias": "Action name",