81 lines
2.4 KiB
JavaScript
81 lines
2.4 KiB
JavaScript
import React from "react";
|
|
import * as AntIcons from "@ant-design/icons";
|
|
import { ColorIcon } from "@/components/Layout/ColorIcon";
|
|
import { allRoutes } from "@/routes/routes";
|
|
|
|
const getAntIcon = (iconName) => {
|
|
const iconKey = `${iconName.charAt(0).toUpperCase()}${iconName.slice(
|
|
1
|
|
)}Outlined`;
|
|
return AntIcons[iconKey] ? React.createElement(AntIcons[iconKey]) : null;
|
|
};
|
|
|
|
const generateMenuItems = (routes, menuKeys = [], parentPath = "") => {
|
|
return routes
|
|
.filter((route) => {
|
|
if (route.hidden) return false;
|
|
|
|
if (!menuKeys.length) return true;
|
|
|
|
const isRouteAllowed = menuKeys.includes(route.key);
|
|
|
|
// 如果有子路由,只要子路由中有被授权的,父路由就应该显示
|
|
if (route.children) {
|
|
const hasAllowedChildren = route.children.some(child =>
|
|
!child.hidden && (
|
|
menuKeys.includes(child.key) ||
|
|
(child.children && child.children.some(grandChild =>
|
|
!grandChild.hidden && menuKeys.includes(grandChild.key)
|
|
))
|
|
)
|
|
);
|
|
return hasAllowedChildren || isRouteAllowed;
|
|
}
|
|
|
|
return isRouteAllowed;
|
|
})
|
|
.map((route) => {
|
|
const fullPath = `${parentPath}/${route.path}`.replace(/\/+/g, "/");
|
|
const icon = route.icon && <ColorIcon icon={getAntIcon(route.icon)} />;
|
|
|
|
const menuItem = {
|
|
key: fullPath,
|
|
icon,
|
|
label: route.name,
|
|
};
|
|
|
|
if (route.children) {
|
|
const filteredChildren = generateMenuItems(route.children, menuKeys, fullPath);
|
|
if (filteredChildren.length > 0) {
|
|
menuItem.children = filteredChildren;
|
|
}
|
|
}
|
|
|
|
return menuItem;
|
|
});
|
|
};
|
|
|
|
|
|
export const getMenuItems = (menuKeys = []) => generateMenuItems(allRoutes, menuKeys);
|
|
export const filterRoutesByMenuKeys = (routes, menuKeys) => {
|
|
if (!Array.isArray(routes) || !Array.isArray(menuKeys)) {
|
|
return [];
|
|
}
|
|
return routes.reduce((acc, route) => {
|
|
const isRouteAllowed = menuKeys.includes(route.key);
|
|
|
|
let filteredChildren = [];
|
|
if (route.children) {
|
|
filteredChildren = filterRoutesByMenuKeys(route.children, menuKeys);
|
|
}
|
|
if (isRouteAllowed || filteredChildren.length > 0) {
|
|
acc.push({
|
|
...route,
|
|
children: filteredChildren.length > 0 ? filteredChildren : undefined
|
|
});
|
|
}
|
|
return acc;
|
|
}, []);
|
|
};
|
|
export { generateMenuItems, getAntIcon };
|