From c13e2483840438f4d4bd9a9921a090be7c8668b8 Mon Sep 17 00:00:00 2001 From: kay delaney <45561153+kaydelaney@users.noreply.github.com> Date: Fri, 15 Mar 2024 09:58:08 +0000 Subject: [PATCH] Scenes: Fix issue with discarding unsaved changes modal in new dashboards (#84369) --- .../pages/DashboardScenePageStateManager.test.ts | 4 ++-- .../dashboard-scene/scene/DashboardScene.tsx | 16 +++++++++++----- .../transformSaveModelToScene.test.ts | 5 ++--- .../serialization/transformSaveModelToScene.ts | 13 ++++++------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts index c711e0723fa..9c64f4251cc 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts +++ b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.test.ts @@ -108,8 +108,8 @@ describe('DashboardScenePageStateManager', () => { const dashboard = loader.state.dashboard!; expect(dashboard.state.meta.isNew).toBe(true); - expect(dashboard.state.isEditing).toBe(true); - expect(dashboard.state.isDirty).toBe(true); + expect(dashboard.state.isEditing).toBe(undefined); + expect(dashboard.state.isDirty).toBe(false); dashboard.setState({ title: 'Changed' }); diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index 8c9d84bf950..6f81fe05b19 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -165,9 +165,15 @@ export class DashboardScene extends SceneObjectBase { window.__grafanaSceneContext = this; if (this.state.isEditing) { + this._initialUrlState = locationService.getLocation(); this._changeTracker.startTrackingChanges(); } + if (this.state.meta.isNew) { + this.onEnterEditMode(); + this.setState({ isDirty: true }); + } + if (!this.state.meta.isEmbedded && this.state.uid) { dashboardWatcher.watch(this.state.uid); } @@ -246,14 +252,14 @@ export class DashboardScene extends SceneObjectBase { } } - public exitEditMode({ skipConfirm, restoreIntialState }: { skipConfirm: boolean; restoreIntialState?: boolean }) { + public exitEditMode({ skipConfirm, restoreInitialState }: { skipConfirm: boolean; restoreInitialState?: boolean }) { if (!this.canDiscard()) { console.error('Trying to discard back to a state that does not exist, initialState undefined'); return; } if (!this.state.isDirty || skipConfirm) { - this.exitEditModeConfirmed(restoreIntialState || this.state.isDirty); + this.exitEditModeConfirmed(restoreInitialState || this.state.isDirty); return; } @@ -268,7 +274,7 @@ export class DashboardScene extends SceneObjectBase { ); } - private exitEditModeConfirmed(restoreIntialState = true) { + private exitEditModeConfirmed(restoreInitialState = true) { // No need to listen to changes anymore this._changeTracker.stopTrackingChanges(); // Stop url sync before updating url @@ -287,7 +293,7 @@ export class DashboardScene extends SceneObjectBase { }) ); - if (restoreIntialState) { + if (restoreInitialState) { // Restore initial state and disable editing this.setState({ ...this._initialState, isEditing: false }); } else { @@ -328,7 +334,7 @@ export class DashboardScene extends SceneObjectBase { newState.version = versionRsp.version; this.setState(newState); - this.exitEditMode({ skipConfirm: true, restoreIntialState: false }); + this.exitEditMode({ skipConfirm: true, restoreInitialState: false }); return true; }; diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index 212dbfbb7bf..2d5d1fe1b0c 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -173,9 +173,8 @@ describe('transformSaveModelToScene', () => { it('should initialize the DashboardScene in edit mode and dirty', () => { const rsp = buildNewDashboardSaveModel(); const scene = transformSaveModelToScene(rsp); - - expect(scene.state.isEditing).toBe(true); - expect(scene.state.isDirty).toBe(true); + expect(scene.state.isEditing).toBe(undefined); + expect(scene.state.isDirty).toBe(false); }); }); diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts index 8609ff8f98f..d2c415eced9 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts @@ -274,16 +274,15 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) } const dashboardScene = new DashboardScene({ - title: oldModel.title, - tags: oldModel.tags || [], - links: oldModel.links || [], - uid: oldModel.uid, - id: oldModel.id, description: oldModel.description, editable: oldModel.editable, - isDirty: oldModel.meta.isNew, - isEditing: oldModel.meta.isNew, + id: oldModel.id, + isDirty: false, + links: oldModel.links || [], meta: oldModel.meta, + tags: oldModel.tags || [], + title: oldModel.title, + uid: oldModel.uid, version: oldModel.version, body: new SceneGridLayout({ isLazy: true,