From 89638238e5ea4a65854c8057301e3dcf1549add2 Mon Sep 17 00:00:00 2001 From: Ivan Ortega Alba Date: Wed, 3 Apr 2024 13:22:10 +0200 Subject: [PATCH] DashboardScene: Detect changes when live is enabled from settings (#85409) * Adapt the code to the new live timer API * Update scenes --- package.json | 2 +- .../saving/DashboardSceneChangeTracker.ts | 3 +++ .../scene/DashboardScene.test.tsx | 17 ++++++++++++++++- .../serialization/transformSaveModelToScene.ts | 2 +- yarn.lock | 10 +++++----- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 716ebae7447..4e197870fd6 100644 --- a/package.json +++ b/package.json @@ -255,7 +255,7 @@ "@grafana/prometheus": "workspace:*", "@grafana/runtime": "workspace:*", "@grafana/saga-icons": "workspace:*", - "@grafana/scenes": "^4.2.0", + "@grafana/scenes": "^4.2.1", "@grafana/schema": "workspace:*", "@grafana/sql": "workspace:*", "@grafana/ui": "workspace:*", diff --git a/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts b/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts index 09640d8b300..2e04e4d0d25 100644 --- a/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts +++ b/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts @@ -68,6 +68,9 @@ export class DashboardSceneChangeTracker { this.detectChanges(); } } + if (payload.changedObject instanceof behaviors.LiveNowTimer) { + this.detectChanges(); + } if (isSceneVariableInstance(payload.changedObject)) { this.detectChanges(); } diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx index bd9a0644cd3..42a916b3f6a 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.test.tsx @@ -200,6 +200,21 @@ describe('DashboardScene', () => { expect(dashboardSceneGraph.getRefreshPicker(scene)!.state.intervals).toEqual(prevState); }); + it('A enabling/disabling live now setting should set isDirty true', () => { + const liveNowTimer = scene.state.$behaviors?.find( + (b) => b instanceof behaviors.LiveNowTimer + ) as behaviors.LiveNowTimer; + liveNowTimer.enable(); + + expect(scene.state.isDirty).toBe(true); + + scene.exitEditMode({ skipConfirm: true }); + const restoredLiveNowTimer = scene.state.$behaviors?.find( + (b) => b instanceof behaviors.LiveNowTimer + ) as behaviors.LiveNowTimer; + expect(restoredLiveNowTimer.state.enabled).toBeFalsy(); + }); + it('A change to time picker visibility settings should set isDirty true', () => { const dashboardControls = scene.state.controls!; const prevState = dashboardControls.state.hideTimeControls; @@ -923,7 +938,7 @@ function buildTestScene(overrides?: Partial) { timeZone: 'browser', }), controls: new DashboardControls({}), - $behaviors: [new behaviors.CursorSync({})], + $behaviors: [new behaviors.CursorSync({}), new behaviors.LiveNowTimer({})], body: new SceneGridLayout({ children: [ new DashboardGridItem({ diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts index 11cd3ffcf79..8a7bd3de4ed 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts @@ -304,7 +304,7 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) registerDashboardMacro, registerDashboardSceneTracking(oldModel), registerPanelInteractionsReporter, - new behaviors.LiveNowTimer(oldModel.liveNow), + new behaviors.LiveNowTimer({ enabled: oldModel.liveNow }), ], $data: new DashboardDataLayerSet({ annotationLayers, alertStatesLayer }), controls: new DashboardControls({ diff --git a/yarn.lock b/yarn.lock index aab3b712a56..099b0976e79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4170,9 +4170,9 @@ __metadata: languageName: unknown linkType: soft -"@grafana/scenes@npm:^4.2.0": - version: 4.2.0 - resolution: "@grafana/scenes@npm:4.2.0" +"@grafana/scenes@npm:^4.2.1": + version: 4.2.1 + resolution: "@grafana/scenes@npm:4.2.1" dependencies: "@grafana/e2e-selectors": "npm:10.3.3" react-grid-layout: "npm:1.3.4" @@ -4186,7 +4186,7 @@ __metadata: "@grafana/ui": ^10.0.3 react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10/546bc27da9bde69dce23da4907014b8e0ff630a1dd43c87152f6537cebfeb31c4b3c475d05db7a93d241f7c9865cc0b1a16cc068c48dac2f4d589ecca11362de + checksum: 10/bebf65762a05c68902cd5bb1f372dd6434eaca99bb2f937dfa10767f59f0d5de196e545855012431c8bbd2e99753a3950506f6d1ec52be1cbd546ff3c56a8045 languageName: node linkType: hard @@ -18652,7 +18652,7 @@ __metadata: "@grafana/prometheus": "workspace:*" "@grafana/runtime": "workspace:*" "@grafana/saga-icons": "workspace:*" - "@grafana/scenes": "npm:^4.2.0" + "@grafana/scenes": "npm:^4.2.1" "@grafana/schema": "workspace:*" "@grafana/sql": "workspace:*" "@grafana/tsconfig": "npm:^1.3.0-rc1"