grafana/public/app/core/selectors/navModel.ts
Ashley Harrison ebe13a53f7
Browse Dashboards: Split new browse UI from nested folders backend (#74435)
* create new feature toggle + start to put stuff behind it

* block move, tidy up interfaces

* fix new/folder actions buttons

* show warning when deleting library panels/alert rules + run i18n:extract

* pseudo

* update unit tests

* pass alert in description
2023-09-07 11:41:00 +01:00

68 lines
1.8 KiB
TypeScript

import { NavModel, NavModelItem, NavIndex } from '@grafana/data';
import { newBrowseDashboardsEnabled } from 'app/features/browse-dashboards/featureFlag';
import { FOLDER_ID } from 'app/features/folders/state/navModel';
import { HOME_NAV_ID } from '../reducers/navModel';
const getNotFoundModel = (): NavModel => {
const node: NavModelItem = {
id: 'not-found',
text: 'Page not found',
icon: 'exclamation-triangle',
subTitle: '404 Error',
url: 'not-found',
};
return {
node: node,
main: node,
};
};
export const getNavModel = (navIndex: NavIndex, id: string, fallback?: NavModel, onlyChild = false): NavModel => {
if (navIndex[id]) {
const node = navIndex[id];
const main = onlyChild ? node : getRootSectionForNode(node);
const mainWithActive = enrichNodeWithActiveState(main, id);
return {
node: node,
main: mainWithActive,
};
}
if (fallback) {
return fallback;
}
return getNotFoundModel();
};
export function getRootSectionForNode(node: NavModelItem): NavModelItem {
// Don't recurse fully up the folder tree when nested folders is enabled
if (newBrowseDashboardsEnabled() && node.id === FOLDER_ID) {
return node;
} else {
return node.parentItem && node.parentItem.id !== HOME_NAV_ID ? getRootSectionForNode(node.parentItem) : node;
}
}
function enrichNodeWithActiveState(node: NavModelItem, activeId: string): NavModelItem {
if (node.id === activeId) {
return { ...node, active: true };
}
if (node.children && node.children.length > 0) {
return {
...node,
children: node.children.map((child) => enrichNodeWithActiveState(child, activeId)),
};
}
return node;
}
export const getTitleFromNavModel = (navModel: NavModel) => {
return `${navModel.main.text}${navModel.node.text ? ': ' + navModel.node.text : ''}`;
};