From 2997ee4d0727fbd66e9ff98cb661c508b38c4685 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Wed, 18 Dec 2024 16:50:09 +0100 Subject: [PATCH] Serializer: add interface for snapshot url retrieval --- .../dashboard-scene/scene/DashboardScene.tsx | 6 +++- .../scene/NavToolbarActions.tsx | 16 +++------- .../DashboardSceneSerializer.test.ts | 32 +++++++++++++++++++ .../serialization/DashboardSceneSerializer.ts | 12 ++++++- 4 files changed, 52 insertions(+), 14 deletions(-) diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index c4d88ef073d..beb1f7118b9 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(); + private _serializer: DashboardSceneSerializerLike = getDashboardSceneSerializer(true); public constructor(state: Partial) { super({ @@ -646,6 +646,10 @@ export class DashboardScene extends SceneObjectBase { return this._serializer.getInitialVersion(); }; + public getSnapshotUrl = () => { + return this._serializer.getSnapshotUrl(); + }; + /** Hacky temp function until we refactor transformSaveModelToScene a bit */ public setInitialSaveModel(version: number | undefined, 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 87315eef5ec..ffa965dc6d6 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 67e835b5a40..08537215573 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.test.ts @@ -321,6 +321,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', () => { @@ -355,6 +382,11 @@ describe('DashboardSceneSerializer', () => { const serializer = new V2DashboardSerializer(); expect(() => serializer.getTrackingInformation()).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 c1f65fc2d73..2a3790810ed 100644 --- a/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/DashboardSceneSerializer.ts @@ -31,6 +31,7 @@ export interface DashboardSceneSerializerLike { onSaveComplete(saveModel: T, result: SaveDashboardResponseDTO): void; getTrackingInformation: () => DashboardTrackingInfo | undefined; getInitialVersion: () => number | undefined; + getSnapshotUrl: () => string | undefined; } interface DashboardTrackingInfo { @@ -118,6 +119,10 @@ export class V1DashboardSerializer implements DashboardSceneSerializerLike { @@ -152,6 +157,11 @@ export class V2DashboardSerializer implements DashboardSceneSerializerLike