mirror of
https://github.com/m-xlsea/ruoyi-plus-soybean.git
synced 2025-09-24 07:49:47 +08:00
72 lines
2.4 KiB
TypeScript
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;
|
|
}
|