123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import memoizeOne from 'memoize-one';
- import isEqual from 'lodash/isEqual';
- import { formatMessage } from 'umi/locale';
- import Authorized from '@/utils/Authorized';
- const { check } = Authorized;
- // Conversion router to menu.
- function formatter(data, parentAuthority, parentName) {
- return data
- .map(item => {
- if (!item.name || !item.path) {
- return null;
- }
- let locale = 'menu';
- if (parentName) {
- locale = `${parentName}.${item.name}`;
- } else {
- locale = `menu.${item.name}`;
- }
- const result = {
- ...item,
- name: formatMessage({ id: locale, defaultMessage: item.name }),
- locale,
- authority: item.authority || parentAuthority,
- };
- if (item.routes) {
- const children = formatter(item.routes, item.authority, locale);
- // Reduce memory usage
- result.children = children;
- }
- delete result.routes;
- return result;
- })
- .filter(item => item);
- }
- const memoizeOneFormatter = memoizeOne(formatter, isEqual);
- /**
- * get SubMenu or Item
- */
- const getSubMenu = (item, blackList = []) => {
- // doc: add hideChildrenInMenu
- if (item.children && !item.hideChildrenInMenu && item.children.some(child => child.name)) {
- return {
- ...item,
- children: filterMenuData(item.children, blackList), // eslint-disable-line
- };
- }
- return item;
- };
- /**
- * filter menuData
- */
- const filterMenuData = (menuData, blackList = []) => {
- if (!menuData) {
- return [];
- }
- return menuData
- .filter(item => item.name && !item.hideInMenu)
- .map(item => check(item.authority, getSubMenu(item, blackList)))
- .filter(item => !blackList.includes(item.path));
- };
- /**
- * 获取面包屑映射
- * @param {Object} menuData 菜单配置
- */
- const getBreadcrumbNameMap = menuData => {
- const routerMap = {};
- const flattenMenuData = data => {
- data.forEach(menuItem => {
- if (menuItem.children) {
- flattenMenuData(menuItem.children);
- }
- // Reduce memory usage
- routerMap[menuItem.path] = menuItem;
- });
- };
- flattenMenuData(menuData);
- return routerMap;
- };
- const memoizeOneGetBreadcrumbNameMap = memoizeOne(getBreadcrumbNameMap, isEqual);
- export default {
- namespace: 'menu',
- state: {
- menuData: [],
- breadcrumbNameMap: {},
- },
- effects: {
- * getMenuData({ payload }, { put, select }) {
- let { routes, authority } = payload;
- let routes_copy = JSON.parse(JSON.stringify(routes));
- //根据接口返回数据组装菜单
- var tmp_data = JSON.parse(localStorage.getItem('sld_menu_data'));
- if(tmp_data&&tmp_data.length!=undefined&&tmp_data.length){
- for (var i = 0; i < routes.length; i++) {
- var item = tmp_data.filter(item => item.frontPath == routes[i].path);
- if (item.length > 0) {
- var item_child = item[0];
- if (item_child.children != undefined && item_child.children.length > 0) {
- for (var j = 0; j < routes[i]['routes'].length; j++) {
- var child_item = item_child.children.filter(citem => citem.frontPath == routes[i]['routes'][j].path);
- if (child_item.length == 0) {
- routes_copy[i]['routes'][j].name = '';
- }
- }
- }
- } else {
- routes_copy[i].name = '';
- }
- }
- }
- const currentSite = yield select(state => state.global.currentSite);
- const blackList = currentSite === '1' ? ['/manage_order/ai_business_intelligence'] : ['/manage_neworder/order_manage_list']
- const menuData = filterMenuData(memoizeOneFormatter(routes_copy, authority), blackList);
- const breadcrumbNameMap = memoizeOneGetBreadcrumbNameMap(menuData);
- yield put({
- type: 'save',
- payload: { menuData, breadcrumbNameMap },
- });
- },
- },
- reducers: {
- save(state, action) {
- return {
- ...state,
- ...action.payload,
- };
- },
- },
- };
|