Compare commits

...

4 Commits

Author SHA1 Message Date
Collin Fingar b3ab2959ae All saved queries now default open table view 2026-01-09 13:22:42 -05:00
Collin Fingar ebccb5abb3 Merge branch 'main' of github.com:grafana/grafana into collinfingar/saved-queries-configure-with-saved-query-db 2026-01-09 12:27:59 -05:00
Collin Fingar 595d8988c5 small tweaks 2026-01-07 15:43:05 -05:00
Collin Fingar 8e502046c1 SavedQueries: Added option to Panel configure to use SQ 2026-01-07 15:18:48 -05:00
2 changed files with 85 additions and 3 deletions
@@ -3,8 +3,9 @@ import { useCallback, useEffect, useState } from 'react';
import { CoreApp, GrafanaTheme2, PanelPlugin, PanelProps } from '@grafana/data';
import { Trans, t } from '@grafana/i18n';
import { config, locationService } from '@grafana/runtime';
import { sceneUtils } from '@grafana/scenes';
import { config, getDataSourceSrv, locationService } from '@grafana/runtime';
import { SceneDataTransformer, SceneQueryRunner, sceneUtils } from '@grafana/scenes';
import { DataQuery } from '@grafana/schema';
import {
Box,
Button,
@@ -18,10 +19,11 @@ import {
usePanelContext,
useStyles2,
} from '@grafana/ui';
import { useQueryLibraryContext } from 'app/features/explore/QueryLibrary/QueryLibraryContext';
import { NEW_PANEL_TITLE } from '../../dashboard/utils/dashboard';
import { DashboardInteractions } from '../utils/interactions';
import { findVizPanelByKey, getVizPanelKeyForPanelId } from '../utils/utils';
import { findVizPanelByKey, getVizPanelKeyForPanelId, getQueryRunnerFor } from '../utils/utils';
import { DashboardScene } from './DashboardScene';
@@ -32,6 +34,7 @@ function UnconfiguredPanelComp(props: PanelProps) {
const [isOpen, setIsOpen] = useState(false);
const panelContext = usePanelContext();
const styles = useStyles2(getStyles);
const { openDrawer: openQueryLibraryDrawer, queryLibraryEnabled } = useQueryLibraryContext();
const onMenuClick = useCallback((isOpen: boolean) => {
setIsOpen(isOpen);
@@ -58,6 +61,77 @@ function UnconfiguredPanelComp(props: PanelProps) {
dashboard.onShowAddLibraryPanelDrawer(panel.getRef());
};
const onUseSavedQuery = useCallback(async () => {
if (!queryLibraryEnabled) {
return;
}
if (!dashboard || !(dashboard instanceof DashboardScene) || !panel) {
return;
}
openQueryLibraryDrawer({
onSelectQuery: async (query: DataQuery) => {
try {
let queryRunner = getQueryRunnerFor(panel);
// If panel doesn't have a query runner yet, create one
if (!queryRunner && !panel.state.$data) {
const defaultDatasource = config.defaultDatasource;
panel.setState({
$data: new SceneDataTransformer({
$data: new SceneQueryRunner({
datasource: {
uid: defaultDatasource,
},
queries: [],
}),
transformations: [],
}),
});
queryRunner = getQueryRunnerFor(panel);
}
if (!queryRunner) {
console.error('Failed to get or create query runner for panel');
return;
}
const enrichedQuery = query.datasource
? query
: {
...query,
datasource: queryRunner.state.datasource || { uid: config.defaultDatasource },
};
// Set the query in the panel
queryRunner.setState({ queries: [enrichedQuery] });
// TODO: Update this to utilize viz suggestions
panel.changePluginType('table');
// Update datasource if needed
if (enrichedQuery.datasource?.uid) {
const dsSettings = await getDataSourceSrv().get({ uid: enrichedQuery.datasource.uid });
queryRunner.setState({ datasource: { uid: dsSettings.uid, type: dsSettings.type } });
}
locationService.partial({ editPanel: props.id });
// This is needed to ensure the query runner is initialized before running queries
setTimeout(() => {
queryRunner.runQueries();
}, 0);
} catch (error) {
console.error('Failed to set query from library:', error);
}
},
options: {
context: CoreApp.Dashboard,
},
});
}, [dashboard, panel, props.id, openQueryLibraryDrawer, queryLibraryEnabled]);
useEffect(() => {
if (!panel || !config.featureToggles.newVizSuggestions) {
return;
@@ -77,6 +151,13 @@ function UnconfiguredPanelComp(props: PanelProps) {
label={t('dashboard.new-panel.menu-open-panel-editor', 'Configure')}
onClick={onConfigure}
></Menu.Item>
{queryLibraryEnabled && (
<Menu.Item
icon="book-open"
label={t('dashboard.new-panel.menu-use-saved-query', 'Use saved query')}
onClick={onUseSavedQuery}
></Menu.Item>
)}
<Menu.Item
icon="library-panel"
label={t('dashboard.new-panel.menu-use-library-panel', 'Use library panel')}
+1
View File
@@ -5187,6 +5187,7 @@
"empty-state-message": "Run a query to visualize it here or go to all visualizations to add other panel types",
"menu-open-panel-editor": "Configure",
"menu-use-library-panel": "Use library panel",
"menu-use-saved-query": "Use saved query",
"missing-config": "Missing panel configuration",
"suggestions": {
"empty-state-message": "Run a query to start seeing suggested visualizations"