85 lines
1.9 KiB
TypeScript
85 lines
1.9 KiB
TypeScript
import { UrlQueryMap, urlUtil } from '@grafana/data';
|
|
import { config, locationSearchToObject } from '@grafana/runtime';
|
|
|
|
export interface DashboardUrlOptions {
|
|
uid?: string;
|
|
slug?: string;
|
|
subPath?: string;
|
|
updateQuery?: UrlQueryMap;
|
|
/** Set to location.search to preserve current params */
|
|
currentQueryParams: string;
|
|
/** * Returns solo panel route instead */
|
|
soloRoute?: boolean;
|
|
/** return render url */
|
|
render?: boolean;
|
|
/** Return an absolute URL */
|
|
absolute?: boolean;
|
|
// Add tz to query params
|
|
timeZone?: string;
|
|
// Check if we are on the home dashboard
|
|
isHomeDashboard?: boolean;
|
|
isSnapshot?: boolean;
|
|
}
|
|
|
|
export function getDashboardUrl(options: DashboardUrlOptions) {
|
|
let path = `/d/${options.uid}`;
|
|
|
|
if (!options.uid) {
|
|
path = '/dashboard/new';
|
|
}
|
|
|
|
if (options.isSnapshot) {
|
|
path = `/dashboard/snapshot/${options.uid}`;
|
|
}
|
|
|
|
if (options.soloRoute) {
|
|
path = `/d-solo/${options.uid}`;
|
|
}
|
|
|
|
if (options.slug) {
|
|
path += `/${options.slug}`;
|
|
}
|
|
|
|
if (options.subPath) {
|
|
path += options.subPath;
|
|
}
|
|
|
|
if (options.render) {
|
|
path = '/render' + path;
|
|
|
|
options.updateQuery = {
|
|
...options.updateQuery,
|
|
width: options.updateQuery?.width || 1000,
|
|
height: options.updateQuery?.height || 500,
|
|
tz: options.timeZone,
|
|
};
|
|
}
|
|
|
|
if (options.isHomeDashboard) {
|
|
path = '/';
|
|
}
|
|
|
|
const params = options.currentQueryParams ? locationSearchToObject(options.currentQueryParams) : {};
|
|
|
|
delete params['shareView'];
|
|
|
|
if (options.updateQuery) {
|
|
for (const key in options.updateQuery) {
|
|
// removing params with null | undefined
|
|
if (options.updateQuery[key] === null || options.updateQuery[key] === undefined) {
|
|
delete params[key];
|
|
} else {
|
|
params[key] = options.updateQuery[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
const relativeUrl = urlUtil.renderUrl(path, params);
|
|
|
|
if (options.absolute) {
|
|
return config.appUrl + relativeUrl.slice(1);
|
|
}
|
|
|
|
return relativeUrl;
|
|
}
|