PanelEdit: Fixed re-using query result after leaving panel edit (#24340)

This commit is contained in:
Torkel Ödegaard 2020-05-06 16:06:21 +02:00 committed by GitHub
parent 8de6ef473f
commit 33123c7e7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 19 deletions

View File

@ -58,10 +58,7 @@ export function panelEditorCleanUp(): ThunkResult<void> {
// 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);
}

View File

@ -235,10 +235,6 @@ export class PanelChrome extends PureComponent<Props, State> {
return panel.snapshotData && panel.snapshotData.length;
}
panelHasLastResult = () => {
return !!this.props.panel.getQueryRunner().getLastResult();
};
get wantsQueryExecution() {
return !(this.props.plugin.meta.skipDataQuery || this.hasPanelSnapshot);
}

View File

@ -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();
});
});
});
});

View File

@ -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;
}
}

View File

@ -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;
}