From a15b6ec2a264cab9dca592796023008f1c2b63ea Mon Sep 17 00:00:00 2001 From: Victor Marin <36818606+mdvictor@users.noreply.github.com> Date: Tue, 16 Sep 2025 16:30:30 +0300 Subject: [PATCH] PanelOptions: Use existing overrides when changing panel types (#111016) use existing overrides when changing panel types --- .../panel-edit/PanelOptionsPane.test.tsx | 58 +++++++++++++++++++ .../panel-edit/PanelOptionsPane.tsx | 6 +- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.test.tsx b/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.test.tsx index 9af129511f3..36a0908771c 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.test.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.test.tsx @@ -127,6 +127,64 @@ describe('PanelOptionsPane', () => { //removed fieldConfig custom values as well expect(mockFn.mock.calls[0][2].defaults.custom).toStrictEqual({}); }); + + it('Should merge fieldConfig overrides when fieldConfig is provided in options', () => { + const { optionsPane, panel } = setupTest('panel-1'); + + const originalFieldConfig = { + defaults: { unit: 'bytes' }, + overrides: [ + { + matcher: { id: 'byName', options: 'A-series' }, + properties: [{ id: 'displayName', value: 'Original Override' }], + }, + ], + }; + + panel.setState({ fieldConfig: originalFieldConfig }); + + const mockOnFieldConfigChange = jest.fn(); + panel.onFieldConfigChange = mockOnFieldConfigChange; + + // Call onChangePanelPlugin with fieldConfig that has overrides + optionsPane.onChangePanelPlugin({ + pluginId: 'table', + fieldConfig: { + defaults: { unit: 'percent' }, + overrides: [], + }, + }); + + // Verify onFieldConfigChange was called with merged overrides + expect(mockOnFieldConfigChange).toHaveBeenCalled(); + + const mergedConfig = mockOnFieldConfigChange.mock.calls[0][0]; + + // Should have both original and new overrides + expect(mergedConfig.overrides).toHaveLength(1); + + // First override should be from the original (filtered) fieldConfig + expect(mergedConfig.overrides[0].matcher).toEqual({ id: 'byName', options: 'A-series' }); + expect(mergedConfig.overrides[0].properties[0].id).toBe('displayName'); + + // Should use the new fieldConfig defaults + expect(mergedConfig.defaults.unit).toBe('percent'); + }); + + it('Should not call onFieldConfigChange when no fieldConfig provided', () => { + const { optionsPane, panel } = setupTest('panel-1'); + + const mockOnFieldConfigChange = jest.fn(); + panel.onFieldConfigChange = mockOnFieldConfigChange; + + // Call without fieldConfig + optionsPane.onChangePanelPlugin({ + pluginId: 'table', + options: { showHeader: false }, + }); + + expect(mockOnFieldConfigChange).not.toHaveBeenCalled(); + }); }); }); diff --git a/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx b/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx index a2681526328..f71d1238971 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx @@ -92,7 +92,11 @@ export class PanelOptionsPane extends SceneObjectBase { } if (options.fieldConfig) { - panel.onFieldConfigChange(options.fieldConfig, true); + const fieldConfigWithOverrides = { + ...options.fieldConfig, + overrides: newFieldConfig.overrides, + }; + panel.onFieldConfigChange(fieldConfigWithOverrides, true); } this.onToggleVizPicker();