From 989e7c2c113d4482b78017363619608ec5a33683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 17 Apr 2024 08:05:23 +0200 Subject: [PATCH] DashboardScene: Fixes react panels with old angular options (#86256) * DashboardScene: Fixes react panels with old angular options * Update --- .betterer.results | 3 +++ .../serialization/angularMigration.test.ts | 20 +++++++++++++++++++ .../serialization/angularMigration.ts | 6 ++++++ 3 files changed, 29 insertions(+) diff --git a/.betterer.results b/.betterer.results index 37fd4fbe2bb..12f79bf3cca 100644 --- a/.betterer.results +++ b/.betterer.results @@ -2520,6 +2520,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"] ], + "public/app/features/dashboard-scene/serialization/angularMigration.test.ts:5381": [ + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] + ], "public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts: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/serialization/angularMigration.test.ts b/public/app/features/dashboard-scene/serialization/angularMigration.test.ts index 51f53592fc5..5f5ec560a9d 100644 --- a/public/app/features/dashboard-scene/serialization/angularMigration.test.ts +++ b/public/app/features/dashboard-scene/serialization/angularMigration.test.ts @@ -33,4 +33,24 @@ describe('getAngularPanelMigrationHandler', () => { expect(mutatedModel.fieldConfig).toEqual({ defaults: { unit: 'bytes' }, overrides: [] }); }); }); + + describe('Given a react panel with old angular properties', () => { + it('Should pass panel model with old angular properties', () => { + const reactPlugin = getPanelPlugin({ id: 'dashlist' }); + + const oldModel = new PanelModel({ + angularProp: 'old name', + type: 'dashlist', + }); + + const mutatedModel: any = { + type: 'dashlist', + options: {}, + }; + + getAngularPanelMigrationHandler(oldModel)(mutatedModel, reactPlugin); + + expect(mutatedModel.angularProp).toEqual('old name'); + }); + }); }); diff --git a/public/app/features/dashboard-scene/serialization/angularMigration.ts b/public/app/features/dashboard-scene/serialization/angularMigration.ts index 0eb88a32886..82115f1365f 100644 --- a/public/app/features/dashboard-scene/serialization/angularMigration.ts +++ b/public/app/features/dashboard-scene/serialization/angularMigration.ts @@ -1,3 +1,5 @@ +import { defaults } from 'lodash'; + import { PanelModel as PanelModelFromData, PanelPlugin } from '@grafana/data'; import { autoMigrateAngular, PanelModel } from 'app/features/dashboard/state/PanelModel'; @@ -8,6 +10,10 @@ export function getAngularPanelMigrationHandler(oldModel: PanelModel) { return; } + if (!oldModel.options || Object.keys(oldModel.options).length === 0) { + defaults(panel, oldModel.getOptionsToRemember()); + } + if (oldModel.autoMigrateFrom) { const wasAngular = autoMigrateAngular[oldModel.autoMigrateFrom] != null; const oldOptions = oldModel.getOptionsToRemember();