diff --git a/public/app/features/dashboard-scene/saving/DashboardPrompt.test.tsx b/public/app/features/dashboard-scene/saving/DashboardPrompt.test.tsx index 2b7624b779a..2077905a0f1 100644 --- a/public/app/features/dashboard-scene/saving/DashboardPrompt.test.tsx +++ b/public/app/features/dashboard-scene/saving/DashboardPrompt.test.tsx @@ -24,7 +24,7 @@ describe('DashboardPrompt', () => { describe('when called without original dashboard', () => { it('then it should return true', () => { const scene = buildTestScene(); - scene.setInitialSaveModel(undefined); + scene.setInitialSaveModel(undefined, undefined); expect(ignoreChanges(scene)).toBe(true); }); }); @@ -59,7 +59,7 @@ describe('DashboardPrompt', () => { }, }); const initialSaveModel = transformSceneToSaveModel(scene); - scene.setInitialSaveModel(initialSaveModel); + scene.setInitialSaveModel(initialSaveModel.version, initialSaveModel); contextSrv.isEditor = false; @@ -76,7 +76,7 @@ describe('DashboardPrompt', () => { }, }); const initialSaveModel = transformSceneToSaveModel(scene); - scene.setInitialSaveModel(initialSaveModel); + scene.setInitialSaveModel(initialSaveModel.version, initialSaveModel); contextSrv.isSignedIn = false; expect(ignoreChanges(scene)).toBe(true); @@ -92,7 +92,7 @@ describe('DashboardPrompt', () => { }, }); const initialSaveModel = transformSceneToSaveModel(scene); - scene.setInitialSaveModel(initialSaveModel); + scene.setInitialSaveModel(initialSaveModel.version, initialSaveModel); expect(ignoreChanges(scene)).toBe(true); }); @@ -108,7 +108,7 @@ describe('DashboardPrompt', () => { }, }); const initialSaveModel = transformSceneToSaveModel(scene); - scene.setInitialSaveModel(initialSaveModel); + scene.setInitialSaveModel(initialSaveModel.version, initialSaveModel); expect(ignoreChanges(scene)).toBe(true); }); @@ -124,7 +124,7 @@ describe('DashboardPrompt', () => { }, }); const initialSaveModel = transformSceneToSaveModel(scene); - scene.setInitialSaveModel(initialSaveModel); + scene.setInitialSaveModel(initialSaveModel.version, initialSaveModel); expect(ignoreChanges(scene)).toBe(undefined); }); diff --git a/public/app/features/dashboard-scene/saving/DashboardPrompt.tsx b/public/app/features/dashboard-scene/saving/DashboardPrompt.tsx index 3b0760001c6..64f7d6d698f 100644 --- a/public/app/features/dashboard-scene/saving/DashboardPrompt.tsx +++ b/public/app/features/dashboard-scene/saving/DashboardPrompt.tsx @@ -8,7 +8,7 @@ import { Prompt } from 'app/core/components/FormPrompt/Prompt'; import { contextSrv } from 'app/core/services/context_srv'; import { SaveLibraryVizPanelModal } from '../panel-edit/SaveLibraryVizPanelModal'; -import { DashboardScene, isV2Dashboard } from '../scene/DashboardScene'; +import { DashboardScene } from '../scene/DashboardScene'; import { getLibraryPanelBehavior, isLibraryPanel } from '../utils/utils'; interface DashboardPromptProps { @@ -154,17 +154,14 @@ const getStyles = () => ({ */ export function ignoreChanges(scene: DashboardScene | null) { const original = scene?.getInitialSaveModel(); - - if (original && isV2Dashboard(original)) { - throw new Error('isV2Dashboard is not implemented'); - } + const originalVersion = scene?.getInitialVersion(); if (!original) { return true; } // Ignore changes if original is unsaved - if (original.version === 0) { + if (originalVersion === 0) { return true; } diff --git a/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.test.tsx b/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.test.tsx index 7d99dea4247..23b2f38f9b5 100644 --- a/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.test.tsx +++ b/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.test.tsx @@ -215,7 +215,7 @@ function setup() { dashboard.setState({ $data: undefined }); const initialSaveModel = transformSceneToSaveModel(dashboard); - dashboard.setInitialSaveModel(initialSaveModel); + dashboard.setInitialSaveModel(initialSaveModel.version, initialSaveModel); cleanUp(); cleanUp = dashboard.activate(); diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index edb9303fa1f..c4d88ef073d 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -173,7 +173,7 @@ export class DashboardScene extends SceneObjectBase { private _prevScrollPos?: number; // TODO: use feature toggle to allow v2 serializer - private _serializer: DashboardSceneSerializerLike = getDashboardSceneSerializer(true); + private _serializer: DashboardSceneSerializerLike = getDashboardSceneSerializer(); public constructor(state: Partial) { super({ @@ -642,9 +642,14 @@ export class DashboardScene extends SceneObjectBase { return this._serializer.initialSaveModel; } + public getInitialVersion = () => { + return this._serializer.getInitialVersion(); + }; + /** Hacky temp function until we refactor transformSaveModelToScene a bit */ - public setInitialSaveModel(saveModel?: Dashboard | DashboardV2Spec) { + public setInitialSaveModel(version: number | undefined, saveModel?: Dashboard | DashboardV2Spec) { this._serializer.initialSaveModel = saveModel; + this._serializer.initialVersion = version; } public getTrackingInformation() { diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts index 4d03005c5cb..67e835b5a40 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts @@ -17,6 +17,21 @@ import { findVizPanelByKey } from '../utils/utils'; import { V1DashboardSerializer, V2DashboardSerializer } from './DashboardSceneSerializer'; describe('DashboardSceneSerializer', () => { + it('should allow retrieving initial dashboard version', () => { + const dashboard = transformSaveModelToScene({ + dashboard: { + title: 'hello', + uid: 'my-uid', + schemaVersion: 30, + version: 10, + }, + meta: {}, + }); + const initialSaveModel = transformSceneToSaveModel(dashboard); + dashboard.setInitialSaveModel(initialSaveModel.version, initialSaveModel); + expect(dashboard.getInitialVersion()).toBe(10); + }); + describe('v1 schema', () => { it('Can detect no changes', () => { const dashboard = setup(); @@ -160,7 +175,7 @@ describe('DashboardSceneSerializer', () => { meta: {}, }); const initialSaveModel = transformSceneToSaveModel(dashboard); - dashboard.setInitialSaveModel(initialSaveModel); + dashboard.setInitialSaveModel(initialSaveModel.version, initialSaveModel); const variable = sceneGraph.lookupVariable('GroupBy', dashboard) as GroupByVariable; variable.setState({ defaultOptions: [{ text: 'Host', value: 'host' }] }); @@ -217,7 +232,7 @@ describe('DashboardSceneSerializer', () => { }); const initialSaveModel = transformSceneToSaveModel(dashboard); - dashboard.setInitialSaveModel(initialSaveModel); + dashboard.setInitialSaveModel(initialSaveModel.version, initialSaveModel); const variable = sceneGraph.lookupVariable('adhoc', dashboard) as AdHocFiltersVariable; variable.setState({ defaultKeys: [{ text: 'Host', value: 'host' }] }); @@ -378,7 +393,7 @@ function setup(options: ScenarioOptions = {}) { }); const initialSaveModel = transformSceneToSaveModel(dashboard); - dashboard.setInitialSaveModel(initialSaveModel); + dashboard.setInitialSaveModel(initialSaveModel.version, initialSaveModel); return dashboard; } diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts index 5edefb6d1c6..c1f65fc2d73 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts @@ -17,6 +17,7 @@ export interface DashboardSceneSerializerLike { * The save model which the dashboard scene was originally created from */ initialSaveModel?: T; + initialVersion?: number; getSaveModel: (s: DashboardScene) => T; getSaveAsModel: (s: DashboardScene, options: SaveDashboardAsOptions) => T; getDashboardChangesFromScene: ( @@ -29,6 +30,7 @@ export interface DashboardSceneSerializerLike { ) => DashboardChangeInfo; onSaveComplete(saveModel: T, result: SaveDashboardResponseDTO): void; getTrackingInformation: () => DashboardTrackingInfo | undefined; + getInitialVersion: () => number | undefined; } interface DashboardTrackingInfo { @@ -43,6 +45,7 @@ interface DashboardTrackingInfo { export class V1DashboardSerializer implements DashboardSceneSerializerLike { initialSaveModel?: Dashboard; + initialVersion?: number | undefined; getSaveModel(s: DashboardScene) { return transformSceneToSaveModel(s); @@ -111,10 +114,15 @@ export class V1DashboardSerializer implements DashboardSceneSerializerLike { initialSaveModel?: DashboardV2Spec; + initialVersion?: number | undefined; getSaveModel(s: DashboardScene) { return transformSceneToSaveModelSchemaV2(s); @@ -140,6 +148,10 @@ export class V2DashboardSerializer implements DashboardSceneSerializerLike i const newState = sceneUtils.cloneSceneObjectState(newDashboardScene.state); dashboard.pauseTrackingChanges(); - dashboard.setInitialSaveModel(rsp.dashboard); + dashboard.setInitialSaveModel(rsp.dashboard.version, rsp.dashboard); dashboard.setState(newState); this.setState({ jsonText: this.getJsonText() });