PanelEditor: add data provider when switching from non data panel (#94220)

* add data provider when switching from non data panel

* handle adding and cleaning up data provider in panel editor on panel switch

* add data provider check sin panel  editor tests
This commit is contained in:
Sergej-Vlasov 2024-10-04 15:05:52 +01:00 committed by GitHub
parent b2d930e079
commit f32fe9a846
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 8 deletions

View File

@ -277,13 +277,17 @@ describe('PanelEditor', () => {
describe('PanelDataPane', () => { describe('PanelDataPane', () => {
it('should not exist if panel is skipDataQuery', async () => { it('should not exist if panel is skipDataQuery', async () => {
const { panelEditor } = await setup({ pluginSkipDataQuery: true }); const { panelEditor, panel } = await setup({ pluginSkipDataQuery: true });
expect(panelEditor.state.dataPane).toBeUndefined(); expect(panelEditor.state.dataPane).toBeUndefined();
expect(panel.state.$data).toBeUndefined();
}); });
it('should exist if panel is supporting querying', async () => { it('should exist if panel is supporting querying', async () => {
const { panelEditor } = await setup({ pluginSkipDataQuery: false }); const { panelEditor, panel } = await setup({ pluginSkipDataQuery: false });
expect(panelEditor.state.dataPane).toBeDefined(); expect(panelEditor.state.dataPane).toBeDefined();
expect(panel.state.$data).toBeDefined();
}); });
}); });
}); });

View File

@ -2,18 +2,21 @@ import * as H from 'history';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { NavIndex, PanelPlugin } from '@grafana/data'; import { NavIndex, PanelPlugin } from '@grafana/data';
import { locationService } from '@grafana/runtime'; import { config, locationService } from '@grafana/runtime';
import { import {
PanelBuilders, PanelBuilders,
SceneDataTransformer,
SceneObjectBase, SceneObjectBase,
SceneObjectRef, SceneObjectRef,
SceneObjectState, SceneObjectState,
SceneObjectStateChangedEvent, SceneObjectStateChangedEvent,
SceneQueryRunner,
sceneUtils, sceneUtils,
VizPanel, VizPanel,
} from '@grafana/scenes'; } from '@grafana/scenes';
import { Panel } from '@grafana/schema/dist/esm/index.gen'; import { Panel } from '@grafana/schema/dist/esm/index.gen';
import { OptionFilter } from 'app/features/dashboard/components/PanelEditor/OptionsPaneOptions'; import { OptionFilter } from 'app/features/dashboard/components/PanelEditor/OptionsPaneOptions';
import { getLastUsedDatasourceFromStorage } from 'app/features/dashboard/utils/dashboard';
import { saveLibPanel } from 'app/features/library-panels/state/api'; import { saveLibPanel } from 'app/features/library-panels/state/api';
import { DashboardSceneChangeTracker } from '../saving/DashboardSceneChangeTracker'; import { DashboardSceneChangeTracker } from '../saving/DashboardSceneChangeTracker';
@ -183,13 +186,46 @@ export class PanelEditor extends SceneObjectBase<PanelEditorState> {
private _updateDataPane(plugin: PanelPlugin) { private _updateDataPane(plugin: PanelPlugin) {
const skipDataQuery = plugin.meta.skipDataQuery; const skipDataQuery = plugin.meta.skipDataQuery;
if (skipDataQuery && this.state.dataPane) { const panel = this.state.panelRef.resolve();
locationService.partial({ tab: null }, true);
this.setState({ dataPane: undefined }); if (skipDataQuery) {
if (this.state.dataPane) {
locationService.partial({ tab: null }, true);
this.setState({ dataPane: undefined });
}
// clean up data provider when switching from data to non data panel
if (panel.state.$data) {
panel.setState({
$data: undefined,
});
}
} }
if (!skipDataQuery && !this.state.dataPane) { if (!skipDataQuery) {
this.setState({ dataPane: PanelDataPane.createFor(this.getPanel()) }); if (!this.state.dataPane) {
this.setState({ dataPane: PanelDataPane.createFor(this.getPanel()) });
}
// add data provider when switching from non data to data panel
if (!panel.state.$data) {
let ds = getLastUsedDatasourceFromStorage(getDashboardSceneFor(this).state.uid!)?.datasourceUid;
if (!ds) {
ds = config.defaultDatasource;
}
panel.setState({
$data: new SceneDataTransformer({
$data: new SceneQueryRunner({
datasource: {
uid: ds,
},
queries: [{ refId: 'A' }],
}),
transformations: [],
}),
});
}
} }
} }