123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import { DataFrame, DataQuery, DataSourceRef } from '@grafana/data';
- import { backendSrv } from 'app/core/services/backend_srv';
- import {
- getNewDashboardModelData,
- setDashboardToFetchFromLocalStorage,
- } from 'app/features/dashboard/state/initDashboard';
- import { DashboardDTO, ExplorePanelData } from 'app/types';
- export enum AddToDashboardError {
- FETCH_DASHBOARD = 'fetch-dashboard',
- SET_DASHBOARD_LS = 'set-dashboard-ls-error',
- }
- interface AddPanelToDashboardOptions {
- queries: DataQuery[];
- queryResponse: ExplorePanelData;
- datasource?: DataSourceRef;
- dashboardUid?: string;
- }
- function createDashboard(): DashboardDTO {
- const dto = getNewDashboardModelData();
- // getNewDashboardModelData adds by default the "add-panel" panel. We don't want that.
- dto.dashboard.panels = [];
- return dto;
- }
- export async function setDashboardInLocalStorage(options: AddPanelToDashboardOptions) {
- const panelType = getPanelType(options.queries, options.queryResponse);
- const panel = {
- targets: options.queries,
- type: panelType,
- title: 'New Panel',
- gridPos: { x: 0, y: 0, w: 12, h: 8 },
- datasource: options.datasource,
- };
- let dto: DashboardDTO;
- if (options.dashboardUid) {
- try {
- dto = await backendSrv.getDashboardByUid(options.dashboardUid);
- } catch (e) {
- throw AddToDashboardError.FETCH_DASHBOARD;
- }
- } else {
- dto = createDashboard();
- }
- dto.dashboard.panels = [panel, ...(dto.dashboard.panels ?? [])];
- try {
- setDashboardToFetchFromLocalStorage(dto);
- } catch {
- throw AddToDashboardError.SET_DASHBOARD_LS;
- }
- }
- const isVisible = (query: DataQuery) => !query.hide;
- const hasRefId = (refId: DataFrame['refId']) => (frame: DataFrame) => frame.refId === refId;
- function getPanelType(queries: DataQuery[], queryResponse: ExplorePanelData) {
- for (const { refId } of queries.filter(isVisible)) {
- // traceview is not supported in dashboards, skipping it for now.
- const hasQueryRefId = hasRefId(refId);
- if (queryResponse.graphFrames.some(hasQueryRefId)) {
- return 'timeseries';
- }
- if (queryResponse.logsFrames.some(hasQueryRefId)) {
- return 'logs';
- }
- if (queryResponse.nodeGraphFrames.some(hasQueryRefId)) {
- return 'nodeGraph';
- }
- if (queryResponse.traceFrames.some(hasQueryRefId)) {
- return 'traces';
- }
- }
- // falling back to table
- return 'table';
- }
|