2022-08-10 03:24:21 -05:00
|
|
|
import { NavModelItem } from '@grafana/data';
|
|
|
|
|
|
|
|
import { Breadcrumb } from './types';
|
|
|
|
|
2022-11-22 10:48:07 -06:00
|
|
|
export function buildBreadcrumbs(sectionNav: NavModelItem, pageNav?: NavModelItem, homeNav?: NavModelItem) {
|
2022-10-03 09:05:19 -05:00
|
|
|
const crumbs: Breadcrumb[] = [];
|
|
|
|
let foundHome = false;
|
2022-08-10 03:24:21 -05:00
|
|
|
|
|
|
|
function addCrumbs(node: NavModelItem) {
|
2022-10-03 09:05:19 -05:00
|
|
|
// construct the URL to match
|
|
|
|
// we want to ignore query params except for the editview query param
|
|
|
|
const urlSearchParams = new URLSearchParams(node.url?.split('?')[1]);
|
|
|
|
let urlToMatch = `${node.url?.split('?')[0]}`;
|
|
|
|
if (urlSearchParams.has('editview')) {
|
|
|
|
urlToMatch += `?editview=${urlSearchParams.get('editview')}`;
|
|
|
|
}
|
2023-01-23 04:03:28 -06:00
|
|
|
|
2022-10-03 09:05:19 -05:00
|
|
|
if (!foundHome && !node.hideFromBreadcrumbs) {
|
2022-11-22 10:48:07 -06:00
|
|
|
if (homeNav && urlToMatch === homeNav.url) {
|
2023-02-08 07:15:37 -06:00
|
|
|
crumbs.unshift({ text: homeNav.text, href: node.url ?? '' });
|
2022-10-03 09:05:19 -05:00
|
|
|
foundHome = true;
|
|
|
|
} else {
|
2023-02-08 07:15:37 -06:00
|
|
|
crumbs.unshift({ text: node.text, href: node.url ?? '' });
|
2022-10-03 09:05:19 -05:00
|
|
|
}
|
2022-08-10 03:24:21 -05:00
|
|
|
}
|
|
|
|
|
2022-10-03 09:05:19 -05:00
|
|
|
if (node.parentItem) {
|
|
|
|
addCrumbs(node.parentItem);
|
2022-08-24 11:05:12 -05:00
|
|
|
}
|
2022-08-10 03:24:21 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (pageNav) {
|
2023-05-11 08:16:42 -05:00
|
|
|
addCrumbs(pageNav);
|
2022-08-10 03:24:21 -05:00
|
|
|
}
|
|
|
|
|
2022-10-03 09:05:19 -05:00
|
|
|
addCrumbs(sectionNav);
|
|
|
|
|
2022-08-10 03:24:21 -05:00
|
|
|
return crumbs;
|
|
|
|
}
|