${this.hass.localize(
@@ -80,7 +77,6 @@ export class HaChooseAction extends LitElement implements ActionElement {
.hass=${this.hass}
.idx=${idx}
@value-changed=${this._actionChanged}
- .clipboard=${this.clipboard}
>
`
@@ -109,7 +105,6 @@ export class HaChooseAction extends LitElement implements ActionElement {
.disabled=${this.disabled}
@value-changed=${this._defaultChanged}
.hass=${this.hass}
- .clipboard=${this.clipboard}
>
`
: html`
diff --git a/src/panels/config/automation/action/types/ha-automation-action-condition.ts b/src/panels/config/automation/action/types/ha-automation-action-condition.ts
index d2422acbcd..4c8c3d2c50 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-condition.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-condition.ts
@@ -6,7 +6,7 @@ import { stringCompare } from "../../../../../common/string/compare";
import type { LocalizeFunc } from "../../../../../common/translations/localize";
import "../../../../../components/ha-select";
import type { HaSelect } from "../../../../../components/ha-select";
-import type { Condition, Clipboard } from "../../../../../data/automation";
+import type { Condition } from "../../../../../data/automation";
import { CONDITION_TYPES } from "../../../../../data/condition";
import { HomeAssistant } from "../../../../../types";
import "../../condition/ha-automation-condition-editor";
@@ -20,8 +20,6 @@ export class HaConditionAction extends LitElement implements ActionElement {
@property() public action!: Condition;
- @property() public clipboard?: Clipboard;
-
public static get defaultConfig() {
return { condition: "state" };
}
@@ -51,7 +49,6 @@ export class HaConditionAction extends LitElement implements ActionElement {
.disabled=${this.disabled}
.hass=${this.hass}
@value-changed=${this._conditionChanged}
- .clipboard=${this.clipboard}
>
`;
}
diff --git a/src/panels/config/automation/action/types/ha-automation-action-if.ts b/src/panels/config/automation/action/types/ha-automation-action-if.ts
index c49b9ef287..195590a689 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-if.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-if.ts
@@ -1,13 +1,12 @@
import { css, CSSResultGroup, html, LitElement } from "lit";
import { customElement, property, state } from "lit/decorators";
import { fireEvent } from "../../../../../common/dom/fire_event";
+import "../../../../../components/ha-textfield";
import { Action, IfAction } from "../../../../../data/script";
-import type { Clipboard } from "../../../../../data/automation";
import { haStyle } from "../../../../../resources/styles";
import type { HomeAssistant } from "../../../../../types";
import type { Condition } from "../../../../lovelace/common/validate-condition";
import "../ha-automation-action";
-import "../../../../../components/ha-textfield";
import type { ActionElement } from "../ha-automation-action-row";
@customElement("ha-automation-action-if")
@@ -20,8 +19,6 @@ export class HaIfAction extends LitElement implements ActionElement {
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
-
@state() private _showElse = false;
public static get defaultConfig() {
@@ -46,7 +43,6 @@ export class HaIfAction extends LitElement implements ActionElement {
.reOrderMode=${this.reOrderMode}
.disabled=${this.disabled}
@value-changed=${this._ifChanged}
- .clipboard=${this.clipboard}
.hass=${this.hass}
>
@@ -61,7 +57,6 @@ export class HaIfAction extends LitElement implements ActionElement {
.reOrderMode=${this.reOrderMode}
.disabled=${this.disabled}
@value-changed=${this._thenChanged}
- .clipboard=${this.clipboard}
.hass=${this.hass}
>
${this._showElse || action.else
@@ -77,7 +72,6 @@ export class HaIfAction extends LitElement implements ActionElement {
.reOrderMode=${this.reOrderMode}
.disabled=${this.disabled}
@value-changed=${this._elseChanged}
- .clipboard=${this.clipboard}
.hass=${this.hass}
>
`
diff --git a/src/panels/config/automation/action/types/ha-automation-action-parallel.ts b/src/panels/config/automation/action/types/ha-automation-action-parallel.ts
index 47405007af..39ee18ee26 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-parallel.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-parallel.ts
@@ -1,12 +1,11 @@
import { CSSResultGroup, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../../../../common/dom/fire_event";
+import "../../../../../components/ha-textfield";
import { Action, ParallelAction } from "../../../../../data/script";
-import type { Clipboard } from "../../../../../data/automation";
import { haStyle } from "../../../../../resources/styles";
import type { HomeAssistant } from "../../../../../types";
import "../ha-automation-action";
-import "../../../../../components/ha-textfield";
import type { ActionElement } from "../ha-automation-action-row";
@customElement("ha-automation-action-parallel")
@@ -19,8 +18,6 @@ export class HaParallelAction extends LitElement implements ActionElement {
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
-
public static get defaultConfig() {
return {
parallel: [],
@@ -37,7 +34,6 @@ export class HaParallelAction extends LitElement implements ActionElement {
.reOrderMode=${this.reOrderMode}
.disabled=${this.disabled}
@value-changed=${this._actionsChanged}
- .clipboard=${this.clipboard}
.hass=${this.hass}
>
`;
diff --git a/src/panels/config/automation/action/types/ha-automation-action-repeat.ts b/src/panels/config/automation/action/types/ha-automation-action-repeat.ts
index c3535fd205..5f6e449eed 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-repeat.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-repeat.ts
@@ -1,6 +1,7 @@
import { css, CSSResultGroup, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../../../../common/dom/fire_event";
+import "../../../../../components/ha-textfield";
import {
Action,
CountRepeat,
@@ -8,12 +9,10 @@ import {
UntilRepeat,
WhileRepeat,
} from "../../../../../data/script";
-import type { Clipboard } from "../../../../../data/automation";
import { haStyle } from "../../../../../resources/styles";
import type { HomeAssistant } from "../../../../../types";
import type { Condition } from "../../../../lovelace/common/validate-condition";
import "../ha-automation-action";
-import "../../../../../components/ha-textfield";
import type { ActionElement } from "../ha-automation-action-row";
const OPTIONS = ["count", "while", "until"] as const;
@@ -30,8 +29,6 @@ export class HaRepeatAction extends LitElement implements ActionElement {
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
-
public static get defaultConfig() {
return { repeat: { count: 2, sequence: [] } };
}
@@ -85,7 +82,6 @@ export class HaRepeatAction extends LitElement implements ActionElement {
.hass=${this.hass}
.disabled=${this.disabled}
@value-changed=${this._conditionChanged}
- .clipboard=${this.clipboard}
>`
: type === "until"
? html`
@@ -99,7 +95,6 @@ export class HaRepeatAction extends LitElement implements ActionElement {
.hass=${this.hass}
.disabled=${this.disabled}
@value-changed=${this._conditionChanged}
- .clipboard=${this.clipboard}
>`
: ""}
@@ -114,7 +109,6 @@ export class HaRepeatAction extends LitElement implements ActionElement {
.reOrderMode=${this.reOrderMode}
.disabled=${this.disabled}
@value-changed=${this._actionChanged}
- .clipboard=${this.clipboard}
.hass=${this.hass}
>
`;
diff --git a/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts b/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts
index d5c21b5989..b6bd373831 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts
@@ -1,17 +1,16 @@
-import "../../../../../components/ha-textfield";
import { css, CSSResultGroup, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
+import { ensureArray } from "../../../../../common/array/ensure-array";
+import { createDurationData } from "../../../../../common/datetime/create_duration_data";
import { fireEvent } from "../../../../../common/dom/fire_event";
+import { TimeChangedEvent } from "../../../../../components/ha-base-time-input";
+import "../../../../../components/ha-duration-input";
import "../../../../../components/ha-formfield";
+import "../../../../../components/ha-textfield";
import { WaitForTriggerAction } from "../../../../../data/script";
-import type { Clipboard } from "../../../../../data/automation";
import { HomeAssistant } from "../../../../../types";
import "../../trigger/ha-automation-trigger";
import { ActionElement, handleChangeEvent } from "../ha-automation-action-row";
-import "../../../../../components/ha-duration-input";
-import { createDurationData } from "../../../../../common/datetime/create_duration_data";
-import { TimeChangedEvent } from "../../../../../components/ha-base-time-input";
-import { ensureArray } from "../../../../../common/array/ensure-array";
@customElement("ha-automation-action-wait_for_trigger")
export class HaWaitForTriggerAction
@@ -26,8 +25,6 @@ export class HaWaitForTriggerAction
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
-
public static get defaultConfig() {
return { wait_for_trigger: [] };
}
@@ -65,7 +62,6 @@ export class HaWaitForTriggerAction
.name=${"wait_for_trigger"}
.reOrderMode=${this.reOrderMode}
@value-changed=${this._valueChanged}
- .clipboard=${this.clipboard}
>
`;
}
diff --git a/src/panels/config/automation/condition/ha-automation-condition-editor.ts b/src/panels/config/automation/condition/ha-automation-condition-editor.ts
index 2adf0512aa..eb4558569e 100644
--- a/src/panels/config/automation/condition/ha-automation-condition-editor.ts
+++ b/src/panels/config/automation/condition/ha-automation-condition-editor.ts
@@ -4,7 +4,7 @@ import memoizeOne from "memoize-one";
import { dynamicElement } from "../../../../common/dom/dynamic-element-directive";
import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-yaml-editor";
-import type { Condition, Clipboard } from "../../../../data/automation";
+import type { Condition } from "../../../../data/automation";
import { expandConditionWithShorthand } from "../../../../data/automation";
import { haStyle } from "../../../../resources/styles";
import type { HomeAssistant } from "../../../../types";
@@ -32,8 +32,6 @@ export default class HaAutomationConditionEditor extends LitElement {
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
-
private _processedCondition = memoizeOne((condition) =>
expandConditionWithShorthand(condition)
);
@@ -72,7 +70,6 @@ export default class HaAutomationConditionEditor extends LitElement {
condition: condition,
reOrderMode: this.reOrderMode,
disabled: this.disabled,
- clipboard: this.clipboard,
}
)}
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 8f6cd63441..7e8bb4e270 100644
--- a/src/panels/config/automation/condition/ha-automation-condition-row.ts
+++ b/src/panels/config/automation/condition/ha-automation-condition-row.ts
@@ -3,9 +3,9 @@ import { ActionDetail } from "@material/mwc-list/mwc-list-foundation";
import "@material/mwc-list/mwc-list-item";
import {
mdiCheck,
- mdiContentDuplicate,
mdiContentCopy,
mdiContentCut,
+ mdiContentDuplicate,
mdiDelete,
mdiDotsVertical,
mdiFlask,
@@ -14,9 +14,11 @@ import {
mdiSort,
mdiStopCircleOutline,
} from "@mdi/js";
-import { css, CSSResultGroup, html, LitElement, nothing } from "lit";
+import deepClone from "deep-clone-simple";
+import { CSSResultGroup, LitElement, css, html, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
+import { storage } from "../../../../common/decorators/storage";
import { fireEvent } from "../../../../common/dom/fire_event";
import { capitalizeFirstLetter } from "../../../../common/string/capitalize-first-letter";
import { handleStructError } from "../../../../common/structs/handle-errors";
@@ -24,8 +26,8 @@ import "../../../../components/ha-button-menu";
import "../../../../components/ha-card";
import "../../../../components/ha-expansion-panel";
import "../../../../components/ha-icon-button";
+import type { AutomationClipboard } from "../../../../data/automation";
import { Condition, testCondition } from "../../../../data/automation";
-import type { Clipboard } from "../../../../data/automation";
import { describeCondition } from "../../../../data/automation_i18n";
import { CONDITION_TYPES } from "../../../../data/condition";
import { validateConfig } from "../../../../data/config";
@@ -83,7 +85,13 @@ export default class HaAutomationConditionRow extends LitElement {
@property({ type: Boolean }) public disabled = false;
- @property() public clipboard?: Clipboard;
+ @storage({
+ key: "automationClipboard",
+ state: false,
+ subscribe: true,
+ storage: "sessionStorage",
+ })
+ public _clipboard?: AutomationClipboard;
@state() private _yamlMode = false;
@@ -290,7 +298,6 @@ export default class HaAutomationConditionRow extends LitElement {
.hass=${this.hass}
.condition=${this.condition}
.reOrderMode=${this.reOrderMode}
- .clipboard=${this.clipboard}
>
@@ -343,10 +350,10 @@ export default class HaAutomationConditionRow extends LitElement {
fireEvent(this, "duplicate");
break;
case 4:
- fireEvent(this, "set-clipboard", { condition: this.condition });
+ this._setClipboard();
break;
case 5:
- fireEvent(this, "set-clipboard", { condition: this.condition });
+ this._setClipboard();
fireEvent(this, "value-changed", { value: null });
break;
case 6:
@@ -366,6 +373,13 @@ export default class HaAutomationConditionRow extends LitElement {
}
}
+ private _setClipboard() {
+ this._clipboard = {
+ ...this._clipboard,
+ condition: deepClone(this.condition),
+ };
+ }
+
private _onDisable() {
const enabled = !(this.condition.enabled ?? true);
const value = { ...this.condition, enabled };
diff --git a/src/panels/config/automation/condition/ha-automation-condition.ts b/src/panels/config/automation/condition/ha-automation-condition.ts
index 3b64474463..8ee6552bae 100644
--- a/src/panels/config/automation/condition/ha-automation-condition.ts
+++ b/src/panels/config/automation/condition/ha-automation-condition.ts
@@ -3,9 +3,9 @@ import type { ActionDetail } from "@material/mwc-list";
import {
mdiArrowDown,
mdiArrowUp,
+ mdiContentPaste,
mdiDrag,
mdiPlus,
- mdiContentPaste,
} from "@mdi/js";
import deepClone from "deep-clone-simple";
import {
@@ -13,8 +13,8 @@ import {
CSSResultGroup,
html,
LitElement,
- PropertyValues,
nothing,
+ PropertyValues,
} from "lit";
import { customElement, property } from "lit/decorators";
import { repeat } from "lit/directives/repeat";
@@ -24,7 +24,10 @@ import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-button";
import "../../../../components/ha-button-menu";
import "../../../../components/ha-svg-icon";
-import type { Condition, Clipboard } from "../../../../data/automation";
+import type {
+ AutomationClipboard,
+ Condition,
+} from "../../../../data/automation";
import type { HomeAssistant } from "../../../../types";
import "./ha-automation-condition-row";
import type HaAutomationConditionRow from "./ha-automation-condition-row";
@@ -49,6 +52,7 @@ import "./types/ha-automation-condition-template";
import "./types/ha-automation-condition-time";
import "./types/ha-automation-condition-trigger";
import "./types/ha-automation-condition-zone";
+import { storage } from "../../../../common/decorators/storage";
const PASTE_VALUE = "__paste__";
@@ -64,7 +68,13 @@ export default class HaAutomationCondition extends LitElement {
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
+ @storage({
+ key: "automationClipboard",
+ state: true,
+ subscribe: true,
+ storage: "sessionStorage",
+ })
+ public _clipboard?: AutomationClipboard;
private _focusLastConditionOnChange = false;
@@ -157,7 +167,6 @@ export default class HaAutomationCondition extends LitElement {
@move-condition=${this._move}
@value-changed=${this._conditionChanged}
@re-order=${this._enterReOrderMode}
- .clipboard=${this.clipboard}
.hass=${this.hass}
>
${this.reOrderMode
@@ -206,13 +215,13 @@ export default class HaAutomationCondition extends LitElement {
>
- ${this.clipboard?.condition
+ ${this._clipboard?.condition
? html`
${this.hass.localize(
"ui.panel.config.automation.editor.conditions.paste"
)}
(${this.hass.localize(
- `ui.panel.config.automation.editor.conditions.type.${this.clipboard.condition.condition}.label`
+ `ui.panel.config.automation.editor.conditions.type.${this._clipboard.condition.condition}.label`
)})
`
@@ -281,7 +290,9 @@ export default class HaAutomationCondition extends LitElement {
let conditions: Condition[];
if (value === PASTE_VALUE) {
- conditions = this.conditions.concat(deepClone(this.clipboard!.condition));
+ conditions = this.conditions.concat(
+ deepClone(this._clipboard!.condition)
+ );
} else {
const condition = value as Condition["condition"];
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 527e2b7234..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
@@ -1,10 +1,7 @@
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../../../../common/dom/fire_event";
-import type {
- LogicalCondition,
- Clipboard,
-} from "../../../../../data/automation";
+import type { LogicalCondition } from "../../../../../data/automation";
import type { HomeAssistant } from "../../../../../types";
import "../ha-automation-condition";
import type { ConditionElement } from "../ha-automation-condition-row";
@@ -19,8 +16,6 @@ export class HaLogicalCondition extends LitElement implements ConditionElement {
@property({ type: Boolean }) public reOrderMode = false;
- @property() public clipboard?: Clipboard;
-
public static get defaultConfig() {
return {
conditions: [],
@@ -35,7 +30,6 @@ export class HaLogicalCondition extends LitElement implements ConditionElement {
@value-changed=${this._valueChanged}
.hass=${this.hass}
.disabled=${this.disabled}
- .clipboard=${this.clipboard}
.reOrderMode=${this.reOrderMode}
>
`;
diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts
index 3aa074c345..ecc97fb23d 100644
--- a/src/panels/config/automation/ha-automation-editor.ts
+++ b/src/panels/config/automation/ha-automation-editor.ts
@@ -16,12 +16,12 @@ import {
} from "@mdi/js";
import { UnsubscribeFunc } from "home-assistant-js-websocket";
import {
- css,
CSSResultGroup,
- html,
LitElement,
PropertyValues,
TemplateResult,
+ css,
+ html,
} from "lit";
import { property, query, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
@@ -46,10 +46,7 @@ import {
saveAutomationConfig,
showAutomationEditor,
triggerAutomationActions,
- Trigger,
- Condition,
} from "../../../data/automation";
-import { Action } from "../../../data/script";
import { fetchEntityRegistry } from "../../../data/entity_registry";
import {
showAlertDialog,
@@ -79,11 +76,6 @@ declare global {
"ui-mode-not-available": Error;
duplicate: undefined;
"re-order": undefined;
- "set-clipboard": {
- trigger?: Trigger;
- condition?: Condition;
- action?: Action;
- };
}
}
diff --git a/src/panels/config/automation/manual-automation-editor.ts b/src/panels/config/automation/manual-automation-editor.ts
index c8cf4fa69b..e0417269b6 100644
--- a/src/panels/config/automation/manual-automation-editor.ts
+++ b/src/panels/config/automation/manual-automation-editor.ts
@@ -3,7 +3,6 @@ import { mdiHelpCircle } from "@mdi/js";
import { HassEntity } from "home-assistant-js-websocket";
import { css, CSSResultGroup, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
-import deepClone from "deep-clone-simple";
import { fireEvent } from "../../../common/dom/fire_event";
import "../../../components/ha-card";
import "../../../components/ha-icon-button";
@@ -11,7 +10,6 @@ import {
Condition,
ManualAutomationConfig,
Trigger,
- Clipboard,
} from "../../../data/automation";
import { Action } from "../../../data/script";
import { haStyle } from "../../../resources/styles";
@@ -20,7 +18,6 @@ import { documentationUrl } from "../../../util/documentation-url";
import "./action/ha-automation-action";
import "./condition/ha-automation-condition";
import "./trigger/ha-automation-trigger";
-import { storage } from "../../../common/decorators/storage";
@customElement("manual-automation-editor")
export class HaManualAutomationEditor extends LitElement {
@@ -36,14 +33,6 @@ export class HaManualAutomationEditor extends LitElement {
@property({ attribute: false }) public stateObj?: HassEntity;
- @storage({
- key: "automationClipboard",
- state: true,
- subscribe: false,
- storage: "sessionStorage",
- })
- private _clipboard: Clipboard = {};
-
protected render() {
return html`
${this.disabled
@@ -102,8 +91,6 @@ export class HaManualAutomationEditor extends LitElement {
@value-changed=${this._triggerChanged}
.hass=${this.hass}
.disabled=${this.disabled}
- @set-clipboard=${this._setClipboard}
- .clipboard=${this._clipboard}
>