86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import { locationUtil, TimeRange } from '@grafana/data';
|
|
import { config, locationService } from '@grafana/runtime';
|
|
import { Panel } from '@grafana/schema';
|
|
import store from 'app/core/store';
|
|
import { DASHBOARD_SCHEMA_VERSION } from 'app/features/dashboard/state/DashboardMigrator';
|
|
import { DASHBOARD_FROM_LS_KEY, DashboardDTO } from 'app/types';
|
|
|
|
export enum GenericError {
|
|
UNKNOWN = 'unknown-error',
|
|
NAVIGATION = 'navigation-error',
|
|
}
|
|
|
|
export interface SubmissionError {
|
|
error: AddToDashboardError | GenericError;
|
|
message: string;
|
|
}
|
|
|
|
export enum AddToDashboardError {
|
|
FETCH_DASHBOARD = 'fetch-dashboard',
|
|
SET_DASHBOARD_LS = 'set-dashboard-ls-error',
|
|
}
|
|
|
|
interface AddPanelToDashboardOptions {
|
|
panel: Panel;
|
|
dashboardUid?: string;
|
|
openInNewTab?: boolean;
|
|
timeRange?: TimeRange;
|
|
}
|
|
|
|
export function addToDashboard({
|
|
panel,
|
|
dashboardUid,
|
|
openInNewTab,
|
|
timeRange,
|
|
}: AddPanelToDashboardOptions): SubmissionError | undefined {
|
|
let dto: DashboardDTO = {
|
|
meta: {},
|
|
dashboard: {
|
|
title: '',
|
|
uid: '',
|
|
panels: [panel],
|
|
schemaVersion: DASHBOARD_SCHEMA_VERSION,
|
|
},
|
|
};
|
|
|
|
if (timeRange) {
|
|
const raw = timeRange.raw;
|
|
dto.dashboard.time = {
|
|
from: typeof raw.from === 'string' ? raw.from : raw.from.toISOString(),
|
|
to: typeof raw.to === 'string' ? raw.to : raw.to.toISOString(),
|
|
};
|
|
}
|
|
|
|
try {
|
|
store.setObject(DASHBOARD_FROM_LS_KEY, dto);
|
|
} catch {
|
|
return {
|
|
error: AddToDashboardError.SET_DASHBOARD_LS,
|
|
message: 'Could not add panel to dashboard. Please try again.',
|
|
};
|
|
}
|
|
|
|
const dashboardURL = getDashboardURL(dashboardUid);
|
|
|
|
if (openInNewTab) {
|
|
const didTabOpen = !!global.open(config.appUrl + dashboardURL, '_blank');
|
|
|
|
if (!didTabOpen) {
|
|
store.delete(DASHBOARD_FROM_LS_KEY);
|
|
return {
|
|
error: GenericError.NAVIGATION,
|
|
message: 'Could not navigate to the selected dashboard. Please try again.',
|
|
};
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
locationService.push(locationUtil.stripBaseFromUrl(dashboardURL));
|
|
return;
|
|
}
|
|
|
|
function getDashboardURL(dashboardUid?: string) {
|
|
return dashboardUid ? `d/${dashboardUid}` : 'dashboard/new';
|
|
}
|