diff --git a/public/app/features/dashboard/components/PanelEditor/state/actions.ts b/public/app/features/dashboard/components/PanelEditor/state/actions.ts index 78541e2260d..3aff52d282c 100644 --- a/public/app/features/dashboard/components/PanelEditor/state/actions.ts +++ b/public/app/features/dashboard/components/PanelEditor/state/actions.ts @@ -58,10 +58,7 @@ export function panelEditorCleanUp(): ThunkResult { // Resend last query result on source panel query runner // But do this after the panel edit editor exit process has completed setTimeout(() => { - const lastResult = panel.getQueryRunner().getLastResult(); - if (lastResult) { - sourcePanel.getQueryRunner().pipeDataToSubject(lastResult); - } + sourcePanel.getQueryRunner().useLastResultFrom(panel.getQueryRunner()); }, 20); } diff --git a/public/app/features/dashboard/dashgrid/PanelChrome.tsx b/public/app/features/dashboard/dashgrid/PanelChrome.tsx index 47602ccfe1b..10ea9d1d7a6 100644 --- a/public/app/features/dashboard/dashgrid/PanelChrome.tsx +++ b/public/app/features/dashboard/dashgrid/PanelChrome.tsx @@ -235,10 +235,6 @@ export class PanelChrome extends PureComponent { return panel.snapshotData && panel.snapshotData.length; } - panelHasLastResult = () => { - return !!this.props.panel.getQueryRunner().getLastResult(); - }; - get wantsQueryExecution() { return !(this.props.plugin.meta.skipDataQuery || this.hasPanelSnapshot); } diff --git a/public/app/features/dashboard/state/PanelModel.test.ts b/public/app/features/dashboard/state/PanelModel.test.ts index d54f51209d1..1f6913fde59 100644 --- a/public/app/features/dashboard/state/PanelModel.test.ts +++ b/public/app/features/dashboard/state/PanelModel.test.ts @@ -6,8 +6,10 @@ import { PanelProps, standardEditorsRegistry, standardFieldConfigEditorRegistry, + PanelData, } from '@grafana/data'; import { ComponentClass } from 'react'; +import { PanelQueryRunner } from './PanelQueryRunner'; class TablePanelCtrl {} @@ -336,5 +338,16 @@ describe('PanelModel', () => { expect(model.thresholds).toBeUndefined(); }); }); + + describe('destroy', () => { + it('Should still preserve last query result', () => { + model.getQueryRunner().useLastResultFrom({ + getLastResult: () => ({} as PanelData), + } as PanelQueryRunner); + + model.destroy(); + expect(model.getQueryRunner().getLastResult()).toBeDefined(); + }); + }); }); }); diff --git a/public/app/features/dashboard/state/PanelModel.ts b/public/app/features/dashboard/state/PanelModel.ts index 042b256726c..452f00f15a6 100644 --- a/public/app/features/dashboard/state/PanelModel.ts +++ b/public/app/features/dashboard/state/PanelModel.ts @@ -422,11 +422,8 @@ export class PanelModel implements DataConfigSource { clone.isEditing = true; const sourceQueryRunner = this.getQueryRunner(); - // pipe last result to new clone query runner - const lastResult = sourceQueryRunner.getLastResult(); - if (lastResult) { - clone.getQueryRunner().pipeDataToSubject(lastResult); - } + // Copy last query result + clone.getQueryRunner().useLastResultFrom(sourceQueryRunner); return clone; } @@ -469,7 +466,6 @@ export class PanelModel implements DataConfigSource { if (this.queryRunner) { this.queryRunner.destroy(); - this.queryRunner = null; } } diff --git a/public/app/features/dashboard/state/PanelQueryRunner.ts b/public/app/features/dashboard/state/PanelQueryRunner.ts index c673e394286..c870f631d32 100644 --- a/public/app/features/dashboard/state/PanelQueryRunner.ts +++ b/public/app/features/dashboard/state/PanelQueryRunner.ts @@ -190,11 +190,6 @@ export class PanelQueryRunner { }); } - pipeDataToSubject = (data: PanelData) => { - this.subject.next(data); - this.lastResult = data; - }; - resendLastResult = () => { if (this.lastResult) { this.subject.next(this.lastResult); @@ -215,6 +210,15 @@ export class PanelQueryRunner { } } + useLastResultFrom(runner: PanelQueryRunner) { + this.lastResult = runner.getLastResult(); + + if (this.lastResult) { + // The subject is a replay subject so anyone subscribing will get this last result + this.subject.next(this.lastResult); + } + } + getLastResult(): PanelData { return this.lastResult; }