Compare commits

..

1 Commits

Author SHA1 Message Date
Simon Lamon 946bb25a16 Add entity update tracking again in Automation and Script editor 2026-07-05 11:52:43 +00:00
3 changed files with 114 additions and 25 deletions
@@ -688,8 +688,17 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
...baseConfig,
...(initData ? normalizeAutomationConfig(initData) : initData),
} as AutomationConfig;
this._initDirtyTracking({ type: "deep" }, baseConfig as AutomationConfig);
this._updateDirtyState(this.config);
this._initDirtyTracking(
{ type: "deep" },
{
config: baseConfig as AutomationConfig,
entityRegistryUpdate: this.entityRegistryUpdate,
}
);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.currentEntityId = undefined;
this.readOnly = false;
}
@@ -697,7 +706,13 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
if (changedProps.has("entityId") && this.entityId) {
getAutomationStateConfig(this.hass, this.entityId).then((c) => {
this.config = normalizeAutomationConfig(c.config);
this._initDirtyTracking({ type: "deep" }, this.config);
this._initDirtyTracking(
{ type: "deep" },
{
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
}
);
this._checkValidation();
});
this.currentEntityId = this.entityId;
@@ -763,7 +778,10 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
if (this.readOnly) {
return;
}
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.errors = undefined;
}
@@ -844,7 +862,10 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
id: this.config?.id,
...normalizeAutomationConfig(ev.detail.value),
};
this._updateDirtyState(this.config!);
this._updateDirtyState({
config: this.config!,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.errors = undefined;
}
@@ -860,7 +881,10 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
updateConfig: async (config, entityRegistryUpdate) => {
this.config = config;
this.entityRegistryUpdate = entityRegistryUpdate;
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.requestUpdate();
const id = this.automationId || String(Date.now());
@@ -974,7 +998,10 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
updateConfig: async (config, entityRegistryUpdate) => {
this.config = config;
this.entityRegistryUpdate = entityRegistryUpdate;
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.requestUpdate();
resolve(true);
},
@@ -991,7 +1018,10 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
config: this.config!,
updateConfig: (config) => {
this.config = config;
this._updateDirtyState(config);
this._updateDirtyState({
config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.requestUpdate();
resolve();
},
@@ -1142,7 +1172,10 @@ export class HaAutomationEditor extends AutomationScriptEditorMixin<AutomationCo
private _applyUndoRedo(config: AutomationConfig) {
this._manualEditor?.triggerCloseSidebar();
this.config = config;
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
}
private _undo() {
@@ -85,12 +85,17 @@ export interface EditorDomainHooks<TConfig> {
domain: "automation" | "script";
}
interface AutomationEditorConfig<TConfig> {
config: TConfig;
entityRegistryUpdate?: EntityRegistryUpdate;
}
export const AutomationScriptEditorMixin = <TConfig extends BaseEditorConfig>(
superClass: Constructor<LitElement>
) => {
class AutomationScriptEditorClass extends DirtyStateProviderMixin<TConfig>()(
superClass
) {
class AutomationScriptEditorClass extends DirtyStateProviderMixin<
AutomationEditorConfig<TConfig>
>()(superClass) {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: "is-wide", type: Boolean }) public isWide = false;
@@ -220,8 +225,17 @@ export const AutomationScriptEditorMixin = <TConfig extends BaseEditorConfig>(
protected takeControlSave() {
this.readOnly = false;
// Force dirty: set baseline to null so current config always differs
this._initDirtyTracking({ type: "deep" }, null as unknown as TConfig);
this._updateDirtyState(this.config!);
this._initDirtyTracking(
{ type: "deep" },
{
config: null as unknown as TConfig,
entityRegistryUpdate: this.entityRegistryUpdate,
}
);
this._updateDirtyState({
config: this.config!,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.blueprintConfig = undefined;
}
@@ -266,7 +280,13 @@ export const AutomationScriptEditorMixin = <TConfig extends BaseEditorConfig>(
// looks dirty. Surface an alert offering to save when deprecated
// options were migrated.
this.deprecatedConfigMigrated = report.deprecated;
this._initDirtyTracking({ type: "deep" }, this.config);
this._initDirtyTracking(
{ type: "deep" },
{
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
}
);
hooks.checkValidation();
} catch (err: any) {
if (err.status_code !== 404) {
+46 -10
View File
@@ -594,15 +594,30 @@ export class HaScriptEditor extends SubscribeMixin(
...baseConfig,
...initData,
} as ScriptConfig;
this._initDirtyTracking({ type: "deep" }, baseConfig as ScriptConfig);
this._updateDirtyState(this.config);
this._initDirtyTracking(
{ type: "deep" },
{
config: baseConfig as ScriptConfig,
entityRegistryUpdate: this.entityRegistryUpdate,
}
);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.readOnly = false;
}
if (changedProps.has("entityId") && this.entityId) {
getScriptStateConfig(this.hass, this.entityId).then((c) => {
this.config = normalizeScriptConfig(c.config);
this._initDirtyTracking({ type: "deep" }, this.config);
this._initDirtyTracking(
{ type: "deep" },
{
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
}
);
this._checkValidation();
});
const regEntry = this.entityRegistry?.find(
@@ -647,7 +662,10 @@ export class HaScriptEditor extends SubscribeMixin(
this.config = ev.detail.value;
this.errors = undefined;
this._updateDirtyState(this.config!);
this._updateDirtyState({
config: this.config!,
entityRegistryUpdate: this.entityRegistryUpdate,
});
}
private async _runScript() {
@@ -734,7 +752,10 @@ export class HaScriptEditor extends SubscribeMixin(
}
this._manualEditor?.addFields();
this._updateDirtyState(this.config!);
this._updateDirtyState({
config: this.config!,
entityRegistryUpdate: this.entityRegistryUpdate,
});
}
private _preprocessYaml() {
@@ -749,7 +770,10 @@ export class HaScriptEditor extends SubscribeMixin(
}
this.yamlErrors = undefined;
this.config = ev.detail.value;
this._updateDirtyState(this.config!);
this._updateDirtyState({
config: this.config!,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.errors = undefined;
}
@@ -765,7 +789,10 @@ export class HaScriptEditor extends SubscribeMixin(
updateConfig: async (config, entityRegistryUpdate) => {
this.config = config;
this.entityRegistryUpdate = entityRegistryUpdate;
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.requestUpdate();
const id = this.scriptId || String(Date.now());
@@ -880,7 +907,10 @@ export class HaScriptEditor extends SubscribeMixin(
updateConfig: async (config, entityRegistryUpdate) => {
this.config = config;
this.entityRegistryUpdate = entityRegistryUpdate;
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.requestUpdate();
resolve(true);
},
@@ -899,7 +929,10 @@ export class HaScriptEditor extends SubscribeMixin(
config: this.config!,
updateConfig: (config) => {
this.config = config;
this._updateDirtyState(config);
this._updateDirtyState({
config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
this.requestUpdate();
resolve();
},
@@ -1046,7 +1079,10 @@ export class HaScriptEditor extends SubscribeMixin(
private _applyUndoRedo(config: ScriptConfig) {
this._manualEditor?.triggerCloseSidebar();
this.config = config;
this._updateDirtyState(this.config);
this._updateDirtyState({
config: this.config,
entityRegistryUpdate: this.entityRegistryUpdate,
});
}
private _undo() {