2022-01-06 02:00:42 +08:00
|
|
|
import { iconifyRender } from '../common';
|
|
|
|
|
|
|
|
/** 路由不转换菜单 */
|
|
|
|
function hideInMenu(route: AuthRoute.Route) {
|
|
|
|
return Boolean(route.meta.hide);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** 给菜单添加可选属性 */
|
|
|
|
function addPartialProps(menuItem: GlobalMenuOption, icon?: string, children?: GlobalMenuOption[]) {
|
|
|
|
const item = { ...menuItem };
|
|
|
|
if (icon) {
|
|
|
|
Object.assign(item, { icon: iconifyRender(icon) });
|
|
|
|
}
|
|
|
|
if (children) {
|
|
|
|
Object.assign(item, { children });
|
|
|
|
}
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 将权限路由转换成菜单
|
|
|
|
* @param routes - 路由
|
|
|
|
*/
|
2022-01-16 20:13:11 +08:00
|
|
|
export function transformAuthRouteToMenu(routes: AuthRoute.Route[]): GlobalMenuOption[] {
|
2022-01-06 02:00:42 +08:00
|
|
|
const globalMenu: GlobalMenuOption[] = [];
|
2022-03-12 16:21:40 +08:00
|
|
|
routes.forEach((route) => {
|
2022-01-06 02:00:42 +08:00
|
|
|
const { name, path, meta } = route;
|
|
|
|
const routeName = name as string;
|
|
|
|
let menuChildren: GlobalMenuOption[] | undefined;
|
|
|
|
if (route.children) {
|
|
|
|
menuChildren = transformAuthRouteToMenu(route.children);
|
|
|
|
}
|
|
|
|
const menuItem: GlobalMenuOption = addPartialProps(
|
|
|
|
{
|
|
|
|
key: routeName,
|
|
|
|
label: meta.title,
|
|
|
|
routeName,
|
2022-03-12 16:21:40 +08:00
|
|
|
routePath: path,
|
2022-01-06 02:00:42 +08:00
|
|
|
},
|
|
|
|
meta?.icon,
|
|
|
|
menuChildren
|
|
|
|
);
|
|
|
|
|
|
|
|
if (!hideInMenu(route)) {
|
|
|
|
globalMenu.push(menuItem);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return globalMenu;
|
|
|
|
}
|
2022-01-18 01:17:09 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取当前路由所在菜单数据的paths
|
|
|
|
* @param activeKey - 当前路由的key
|
|
|
|
* @param menus - 菜单数据
|
|
|
|
*/
|
|
|
|
export function getActiveKeyPathsOfMenus(activeKey: string, menus: GlobalMenuOption[]) {
|
2022-03-12 16:21:40 +08:00
|
|
|
const keys = menus.map((menu) => getActiveKeyPathsOfMenu(activeKey, menu)).flat(1);
|
2022-01-18 01:17:09 +08:00
|
|
|
return keys;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getActiveKeyPathsOfMenu(activeKey: string, menu: GlobalMenuOption) {
|
|
|
|
const keys: string[] = [];
|
|
|
|
if (activeKey.includes(menu.routeName)) {
|
|
|
|
keys.push(menu.routeName);
|
|
|
|
}
|
|
|
|
if (menu.children) {
|
2022-03-12 16:21:40 +08:00
|
|
|
keys.push(...menu.children.map((item) => getActiveKeyPathsOfMenu(activeKey, item)).flat(1));
|
2022-01-18 01:17:09 +08:00
|
|
|
}
|
|
|
|
return keys;
|
|
|
|
}
|