From d983629650885ea480c00e2e0f83e9281cc42d72 Mon Sep 17 00:00:00 2001 From: Ivan Ortega Alba Date: Mon, 8 Apr 2024 12:06:50 +0200 Subject: [PATCH] Detect folder changes when saving a dashboard (#85378) --- .betterer.results | 4 - .../saving/DashboardSceneChangeTracker.ts | 32 ++++--- .../saving/SaveDashboardAsForm.tsx | 4 +- .../saving/SaveDashboardDrawer.tsx | 23 +++-- .../saving/SaveDashboardForm.tsx | 1 - .../getDashboardChangesFromScene.test.ts | 11 +++ .../saving/getDashboardChangesFromScene.ts | 21 +++- .../saving/getSaveDashboardChange.ts | 95 ------------------- .../dashboard-scene/saving/shared.tsx | 1 + .../scene/DashboardScene.test.tsx | 21 +++- .../settings/GeneralSettingsEditView.tsx | 1 - .../SaveDashboard/SaveDashboardDiff.tsx | 46 ++++++--- 12 files changed, 117 insertions(+), 143 deletions(-) delete mode 100644 public/app/features/dashboard-scene/saving/getSaveDashboardChange.ts diff --git a/.betterer.results b/.betterer.results index a316ba2da3a..a6e30ae9f67 100644 --- a/.betterer.results +++ b/.betterer.results @@ -2489,10 +2489,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "public/app/features/dashboard-scene/saving/getSaveDashboardChange.ts:5381": [ - [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"] - ], "public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], diff --git a/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts b/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts index 26991da1f77..6fd1df0bc81 100644 --- a/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts +++ b/public/app/features/dashboard-scene/saving/DashboardSceneChangeTracker.ts @@ -35,61 +35,65 @@ export class DashboardSceneChangeTracker { Object.prototype.hasOwnProperty.call(payload.partialUpdate, 'intervals') || Object.prototype.hasOwnProperty.call(payload.partialUpdate, 'refresh') ) { - this.detectChanges(); + this.detectSaveModelChanges(); } } if (payload.changedObject instanceof behaviors.CursorSync) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (payload.changedObject instanceof SceneDataLayerSet) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (payload.changedObject instanceof DashboardGridItem) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (payload.changedObject instanceof SceneGridLayout) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (payload.changedObject instanceof DashboardScene) { if (Object.keys(payload.partialUpdate).some((key) => PERSISTED_PROPS.includes(key))) { - this.detectChanges(); + this.detectSaveModelChanges(); } } if (payload.changedObject instanceof SceneTimeRange) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (payload.changedObject instanceof DashboardControls) { if (Object.prototype.hasOwnProperty.call(payload.partialUpdate, 'hideTimeControls')) { - this.detectChanges(); + this.detectSaveModelChanges(); } } if (payload.changedObject instanceof SceneVariableSet) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (payload.changedObject instanceof DashboardAnnotationsDataLayer) { if (!Object.prototype.hasOwnProperty.call(payload.partialUpdate, 'data')) { - this.detectChanges(); + this.detectSaveModelChanges(); } } if (payload.changedObject instanceof behaviors.LiveNowTimer) { - this.detectChanges(); + this.detectSaveModelChanges(); } if (isSceneVariableInstance(payload.changedObject)) { - this.detectChanges(); + this.detectSaveModelChanges(); } } - private detectChanges() { + private detectSaveModelChanges() { this._changesWorker?.postMessage({ changed: transformSceneToSaveModel(this._dashboard), initial: this._dashboard.getInitialSaveModel(), }); } + private hasMetadataChanges() { + return this._dashboard.state.meta.folderUid !== this._dashboard.getInitialState()?.meta.folderUid; + } + private updateIsDirty(result: DashboardChangeInfo) { const { hasChanges } = result; - if (hasChanges) { + if (hasChanges || this.hasMetadataChanges()) { if (!this._dashboard.state.isDirty) { this._dashboard.setState({ isDirty: true }); } diff --git a/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx b/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx index 5f201c9f6a1..29263390f67 100644 --- a/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx +++ b/public/app/features/dashboard-scene/saving/SaveDashboardAsForm.tsx @@ -9,7 +9,6 @@ import { validationSrv } from 'app/features/manage-dashboards/services/Validatio import { DashboardScene } from '../scene/DashboardScene'; -import { SaveDashboardDrawer } from './SaveDashboardDrawer'; import { DashboardChangeInfo, NameAlreadyExistsError, SaveButton, isNameExistsError } from './shared'; import { useSaveDashboard } from './useSaveDashboard'; @@ -23,11 +22,10 @@ interface SaveDashboardAsFormDTO { export interface Props { dashboard: DashboardScene; - drawer: SaveDashboardDrawer; changeInfo: DashboardChangeInfo; } -export function SaveDashboardAsForm({ dashboard, drawer, changeInfo }: Props) { +export function SaveDashboardAsForm({ dashboard, changeInfo }: Props) { const { changedSaveModel } = changeInfo; const { register, handleSubmit, setValue, formState, getValues, watch, trigger } = useForm({ diff --git a/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.tsx b/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.tsx index 26c08217605..9e25e914f07 100644 --- a/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.tsx +++ b/public/app/features/dashboard-scene/saving/SaveDashboardDrawer.tsx @@ -46,19 +46,21 @@ export class SaveDashboardDrawer extends SceneObjectBase model.setState({ showDiff: false })} /> - {diffCount > 0 && ( + {changesCount > 0 && ( model.setState({ showDiff: true })} - counter={diffCount} + counter={changesCount} /> )} @@ -73,11 +75,20 @@ export class SaveDashboardDrawer extends SceneObjectBase { if (showDiff) { - return ; + return ( + + ); } if (saveAsCopy || changeInfo.isNew) { - return ; + return ; } if (isProvisioned) { diff --git a/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx b/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx index 3de8731f875..2ebef87618d 100644 --- a/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx +++ b/public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx @@ -104,7 +104,6 @@ export function SaveDashboardForm({ dashboard, drawer, changeInfo }: Props) { - {/* config.featureToggles.dashgpt * TOOD GenAIDashboardChangesButton */}