2025-04-01 10:38:02 +09:00

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;
}