From 9b33f9643cfd175d9c217b274ce3796abf710743 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:23:50 +0200 Subject: [PATCH] [v11.0.x] DashboardScene: Fixes react panels with old angular options (#86411) --- .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 8fa9874bf84..04a7e341bb6 100644 --- a/.betterer.results +++ b/.betterer.results @@ -2418,6 +2418,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();