Files
ruoyi-plus-soybean/src/utils/router/breadcrumb.ts
J.S.Patrick 5b8af29496 Update breadcrumb.ts
防止找不到顶级路由时报错
2023-09-26 13:50:04 +08:00

72 lines
2.4 KiB
TypeScript

import { getTopLevelMenu } from './helpers';
/**
* 获取面包屑数据
* @param activeKey - 当前页面路由的key
* @param menus - 菜单数据
* @param rootPath - 根路由路径
*/
export function getBreadcrumbByRouteKey(activeKey: string, menus: App.GlobalMenuOption[], rootPath: string) {
const breadcrumbMenu = getBreadcrumbMenu(activeKey, menus);
const breadcrumb = breadcrumbMenu.map(item => transformBreadcrumbMenuToBreadcrumb(item, rootPath));
return breadcrumb;
}
/**
* 根据菜单数据获取面包屑格式的菜单
* @param activeKey - 当前页面路由的key
* @param menus - 菜单数据
*/
function getBreadcrumbMenu(activeKey: string, menus: App.GlobalMenuOption[]) {
const breadcrumbMenu: App.GlobalMenuOption[] = [];
const topLevelMenu = getTopLevelMenu(activeKey, menus);
const options = topLevelMenu ? getBreadcrumbMenuItem(activeKey, topLevelMenu as App.GlobalMenuOption) : [];
breadcrumbMenu.push(...options);
return breadcrumbMenu;
}
/**
* 根据单个菜单数据获取面包屑格式的菜单
* @param activeKey - 当前页面路由的key
* @param menu - 单个菜单数据
*/
function getBreadcrumbMenuItem(activeKey: string, menu: App.GlobalMenuOption) {
const breadcrumbMenu: App.GlobalMenuOption[] = [];
if (activeKey === menu.routeName) {
breadcrumbMenu.push(menu);
}
if (activeKey.includes(menu.routeName) && menu.children && menu.children.length) {
breadcrumbMenu.push(menu);
breadcrumbMenu.push(
...menu.children.map(item => getBreadcrumbMenuItem(activeKey, item as App.GlobalMenuOption)).flat(1)
);
}
return breadcrumbMenu;
}
/**
* 将面包屑格式的菜单数据转换成面包屑数据
* @param menu - 单个菜单数据
* @param rootPath - 根路由路径
*/
function transformBreadcrumbMenuToBreadcrumb(menu: App.GlobalMenuOption, rootPath: string) {
const hasChildren = Boolean(menu.children && menu.children.length);
const breadcrumb: App.GlobalBreadcrumb = {
key: menu.routeName,
label: menu.label as string,
routeName: menu.routeName,
disabled: menu.routePath === rootPath,
hasChildren,
i18nTitle: menu.i18nTitle
};
if (menu.icon) {
breadcrumb.icon = menu.icon;
}
if (hasChildren) {
breadcrumb.options = menu.children?.map(item =>
transformBreadcrumbMenuToBreadcrumb(item as App.GlobalMenuOption, rootPath)
) as NonNullable<App.GlobalBreadcrumb['options']>;
}
return breadcrumb;
}