AngularPanels: Fixing changing angular panel options not taking having affect when coming back from panel edit (#54087)

This commit is contained in:
Torkel Ödegaard 2022-08-24 08:35:44 +02:00 committed by GitHub
parent 4dbe0b4f02
commit 8880cbd7f6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 1 deletions

View File

@ -138,6 +138,7 @@ describe('panelEditor actions', () => {
it('should not increment configRev when no changes made and leaving panel edit', async () => { it('should not increment configRev when no changes made and leaving panel edit', async () => {
const sourcePanel = new PanelModel({ id: 12, type: 'graph' }); const sourcePanel = new PanelModel({ id: 12, type: 'graph' });
sourcePanel.plugin = getPanelPlugin({}); sourcePanel.plugin = getPanelPlugin({});
sourcePanel.plugin.angularPanelCtrl = undefined;
const dashboard = new DashboardModel({ const dashboard = new DashboardModel({
panels: [{ id: 12, type: 'graph' }], panels: [{ id: 12, type: 'graph' }],
@ -163,6 +164,41 @@ describe('panelEditor actions', () => {
expect(sourcePanel.configRev).toEqual(0); expect(sourcePanel.configRev).toEqual(0);
}); });
it('should apply changes when leaving panel edit with angular panel', async () => {
const sourcePanel = new PanelModel({ id: 12, type: 'graph' });
sourcePanel.plugin = getPanelPlugin({});
sourcePanel.plugin.angularPanelCtrl = {};
const dashboard = new DashboardModel({
panels: [{ id: 12, type: 'graph' }],
});
const panel = dashboard.initEditPanel(sourcePanel);
const state: PanelEditorState = {
...initialState(),
getPanel: () => panel,
getSourcePanel: () => sourcePanel,
};
// not using panel.setProperty here to simulate any prop change done from angular
panel.title = 'Changed title';
await thunkTester({
panelEditor: state,
panels: {},
dashboard: {
getModel: () => dashboard,
},
})
.givenThunk(exitPanelEditor)
.whenThunkIsDispatched();
expect(sourcePanel.isAngularPlugin()).toBe(true);
expect(sourcePanel.title).toEqual('Changed title');
expect(sourcePanel.configRev).toEqual(1);
});
}); });
describe('skipPanelUpdate', () => { describe('skipPanelUpdate', () => {

View File

@ -116,7 +116,10 @@ export function exitPanelEditor(): ThunkResult<void> {
dashboard.exitPanelEditor(); dashboard.exitPanelEditor();
} }
if (panel.hasChanged && !shouldDiscardChanges) { // For angular panels we always commit as panel.hasChanged will not have picked up changes done from angular
const commitChanges = !shouldDiscardChanges && (panel.hasChanged || panel.isAngularPlugin());
if (commitChanges) {
const modifiedSaveModel = panel.getSaveModel(); const modifiedSaveModel = panel.getSaveModel();
const sourcePanel = getSourcePanel(); const sourcePanel = getSourcePanel();
const panelTypeChanged = sourcePanel.type !== panel.type; const panelTypeChanged = sourcePanel.type !== panel.type;

View File

@ -544,6 +544,7 @@ export class PanelModel implements DataConfigSource, IPanelModel {
const clone = new PanelModel(sourceModel); const clone = new PanelModel(sourceModel);
clone.isEditing = true; clone.isEditing = true;
clone.plugin = this.plugin;
const sourceQueryRunner = this.getQueryRunner(); const sourceQueryRunner = this.getQueryRunner();