From 746bde0face71cbe6d3dec24bee173177a4ba7e6 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Thu, 19 Dec 2024 16:09:19 +0100 Subject: [PATCH] DashboardSceneSerializerLike: Update interface to support initial version and snapshot url (#98206) * Make dashboard prompt ignoreChanges schema version independent * Serializer: add interface for snapshot url retrieval * Revert "Make dashboard prompt ignoreChanges schema version independent" This reverts commit 65466c2ef16bdbec80a633d832e9f2e07891321e. * Add dashbaord version to scene metadata * Add tracking info * Revert "Add tracking info" This reverts commit 4c58c6687b4b95c073fc92d4ee09426b17d7577a. --------- Co-authored-by: Ivan Ortega --- .../saving/DashboardPrompt.tsx | 8 ++--- .../scene/DashboardScene.test.tsx | 1 + .../dashboard-scene/scene/DashboardScene.tsx | 5 +++ .../scene/NavToolbarActions.tsx | 16 +++------- .../DashboardSceneSerializer.test.ts | 32 +++++++++++++++++++ .../serialization/DashboardSceneSerializer.ts | 10 ++++++ .../transformSaveModelSchemaV2ToScene.ts | 4 ++- .../dashboard/api/ResponseTransformers.ts | 1 + public/app/features/dashboard/api/v0.ts | 1 + public/app/types/dashboard.ts | 1 + 10 files changed, 60 insertions(+), 19 deletions(-) diff --git a/public/app/features/dashboard-scene/saving/DashboardPrompt.tsx b/public/app/features/dashboard-scene/saving/DashboardPrompt.tsx index 3b0760001c6..0ed64141ee3 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 { @@ -155,16 +155,12 @@ const getStyles = () => ({ export function ignoreChanges(scene: DashboardScene | null) { const original = scene?.getInitialSaveModel(); - if (original && isV2Dashboard(original)) { - throw new Error('isV2Dashboard is not implemented'); - } - if (!original) { return true; } // Ignore changes if original is unsaved - if (original.version === 0) { + if (scene?.state.meta.version === 0) { return true; } diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx index 8e70170c3ff..c0ac4ea98c7 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx @@ -168,6 +168,7 @@ describe('DashboardScene', () => { expect(scene.state.isDirty).toBe(false); scene.exitEditMode({ skipConfirm: true }); expect(scene.state.title).toEqual('Updated title'); + expect(scene.state.meta.version).toEqual(2); }); it('Should start the detect changes worker', () => { diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index 91ea9ad323b..f74ea567741 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -281,6 +281,7 @@ export class DashboardScene extends SceneObjectBase { slug: result.slug, folderUid: folderUid, isNew: false, + version: result.version, }, }); @@ -642,6 +643,10 @@ export class DashboardScene extends SceneObjectBase { return this._serializer.initialSaveModel; } + public getSnapshotUrl = () => { + return this._serializer.getSnapshotUrl(); + }; + /** Hacky temp function until we refactor transformSaveModelToScene a bit */ public setInitialSaveModel(saveModel?: Dashboard | DashboardV2Spec) { this._serializer.initialSaveModel = saveModel; diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx index 0c5cb166c51..ad32cd854f0 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx @@ -34,7 +34,7 @@ import { DashboardInteractions } from '../utils/interactions'; import { DynamicDashNavButtonModel, dynamicDashNavActions } from '../utils/registerDynamicDashNavAction'; import { isLibraryPanel } from '../utils/utils'; -import { DashboardScene, isV2Dashboard } from './DashboardScene'; +import { DashboardScene } from './DashboardScene'; import { GoToSnapshotOriginButton } from './GoToSnapshotOriginButton'; interface Props { @@ -140,17 +140,9 @@ export function ToolbarActions({ dashboard }: Props) { toolbarActions.push({ group: 'icon-actions', condition: meta.isSnapshot && !meta.dashboardNotFound && !isEditing, - render: () => { - const saveModel = dashboard.getInitialSaveModel(); - - if (saveModel && isV2Dashboard(saveModel)) { - throw new Error('v2 schema not implemented'); - } - - return ( - - ); - }, + render: () => ( + + ), }); if (!isEditingPanel && !isEditing) { diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts index 35a28c3e0b3..7683b9655ae 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts @@ -326,6 +326,33 @@ describe('DashboardSceneSerializer', () => { }); }); }); + + it('should allow retrieving snapshot url', () => { + const initialSaveModel: Dashboard = { + snapshot: { + originalUrl: 'originalUrl/snapshot', + created: '2023-01-01T00:00:00Z', + expires: '2023-12-31T23:59:59Z', + external: false, + externalUrl: '', + id: 1, + key: 'snapshot-key', + name: 'snapshot-name', + orgId: 1, + updated: '2023-01-01T00:00:00Z', + userId: 1, + }, + title: 'hello', + uid: 'my-uid', + schemaVersion: 30, + version: 10, + }; + + const serializer = new V1DashboardSerializer(); + serializer.initialSaveModel = initialSaveModel; + + expect(serializer.getSnapshotUrl()).toBe('originalUrl/snapshot'); + }); }); describe('v2 schema', () => { @@ -563,6 +590,11 @@ describe('DashboardSceneSerializer', () => { }) ).toThrow('Method not implemented.'); }); + + it('should throw on getSnapshotUrl', () => { + const serializer = new V2DashboardSerializer(); + expect(() => serializer.getSnapshotUrl()).toThrow('Method not implemented.'); + }); }); }); diff --git a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts index c5491887ec3..333ed4ee1dc 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts @@ -29,6 +29,7 @@ export interface DashboardSceneSerializerLike { ) => DashboardChangeInfo; onSaveComplete(saveModel: T, result: SaveDashboardResponseDTO): void; getTrackingInformation: () => DashboardTrackingInfo | undefined; + getSnapshotUrl: () => string | undefined; } interface DashboardTrackingInfo { @@ -111,6 +112,10 @@ export class V1DashboardSerializer implements DashboardSceneSerializerLike { @@ -158,6 +163,11 @@ export class V2DashboardSerializer implements DashboardSceneSerializerLike { diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts index 5eaae2ef633..5d2410299c6 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.ts @@ -120,7 +120,9 @@ export function transformSaveModelSchemaV2ToScene(dto: DashboardWithAccessInfo { isFolder: false, uid: dash.metadata.name, k8s: dash.metadata, + version: parseInt(dash.metadata.resourceVersion, 10), }, dashboard: dash.spec, }; diff --git a/public/app/types/dashboard.ts b/public/app/types/dashboard.ts index 06a823d3025..d79e7a5a382 100644 --- a/public/app/types/dashboard.ts +++ b/public/app/types/dashboard.ts @@ -69,6 +69,7 @@ export interface DashboardMeta { dashboardNotFound?: boolean; isEmbedded?: boolean; isNew?: boolean; + version?: number; // When loaded from kubernetes, we stick the raw metadata here // yes weird, but this means all the editor structures can exist unchanged