21 changed files with 77 additions and 272 deletions
@ -1,18 +0,0 @@ |
|||||
import 'jest'; |
|
||||
import { urlToList } from './pathTools'; |
|
||||
|
|
||||
describe('test urlToList', () => { |
|
||||
it('A path', () => { |
|
||||
expect(urlToList('/userinfo')).toEqual(['/userinfo']); |
|
||||
}); |
|
||||
it('Secondary path', () => { |
|
||||
expect(urlToList('/userinfo/2144')).toEqual(['/userinfo', '/userinfo/2144']); |
|
||||
}); |
|
||||
it('Three paths', () => { |
|
||||
expect(urlToList('/userinfo/2144/addr')).toEqual([ |
|
||||
'/userinfo', |
|
||||
'/userinfo/2144', |
|
||||
'/userinfo/2144/addr', |
|
||||
]); |
|
||||
}); |
|
||||
}); |
|
||||
@ -1,6 +0,0 @@ |
|||||
// /userinfo/2144/id => ['/userinfo','/useinfo/2144,'/userindo/2144/id']
|
|
||||
// eslint-disable-next-line import/prefer-default-export
|
|
||||
export function urlToList(url: string) { |
|
||||
const urllist = url.split('/').filter(i => i); |
|
||||
return urllist.map((urlItem, index) => `/${urllist.slice(0, index + 1).join('/')}`); |
|
||||
} |
|
||||
@ -1,139 +0,0 @@ |
|||||
import { MenuDataItem } from '@ant-design/pro-layout'; |
|
||||
import Authorized from '@/utils/Authorized'; |
|
||||
import { Effect } from 'dva'; |
|
||||
import isEqual from 'lodash/isEqual'; |
|
||||
import memoizeOne from 'memoize-one'; |
|
||||
import { Reducer } from 'redux'; |
|
||||
import { formatMessage } from 'umi-plugin-react/locale'; |
|
||||
import { IRoute } from 'umi-types'; |
|
||||
import defaultSettings from '../../config/defaultSettings'; |
|
||||
|
|
||||
// Conversion router to menu.
|
|
||||
function formatter( |
|
||||
data: MenuDataItem[], |
|
||||
parentAuthority?: string[] | string, |
|
||||
parentName?: string, |
|
||||
): MenuDataItem[] { |
|
||||
return data |
|
||||
.filter(item => item.name && item.path) |
|
||||
.map(item => { |
|
||||
const locale = `${parentName || 'menu'}.${item.name!}`; |
|
||||
// if enableMenuLocale use item.name,
|
|
||||
// close menu international
|
|
||||
const name = defaultSettings.menu.disableLocal |
|
||||
? item.name! |
|
||||
: formatMessage({ id: locale, defaultMessage: item.name! }); |
|
||||
const result: MenuDataItem = { |
|
||||
...item, |
|
||||
name, |
|
||||
locale, |
|
||||
routes: void 0, |
|
||||
authority: item.authority || parentAuthority, |
|
||||
}; |
|
||||
if (item.routes) { |
|
||||
const children = formatter(item.routes, item.authority, locale); |
|
||||
// Reduce memory usage
|
|
||||
result.children = children; |
|
||||
} |
|
||||
return result; |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
const memoizeOneFormatter = memoizeOne(formatter, isEqual); |
|
||||
|
|
||||
/** |
|
||||
* get SubMenu or Item |
|
||||
*/ |
|
||||
const getSubMenu: (item: MenuDataItem) => MenuDataItem = item => { |
|
||||
if ( |
|
||||
Array.isArray(item.children) && |
|
||||
!item.hideChildrenInMenu && |
|
||||
item.children.some(child => (child.name ? true : false)) |
|
||||
) { |
|
||||
const children = filterMenuData(item.children); |
|
||||
if (children.length) return { ...item, children }; |
|
||||
} |
|
||||
return { ...item, children: void 0 }; |
|
||||
}; |
|
||||
|
|
||||
/** |
|
||||
* filter menuData |
|
||||
*/ |
|
||||
const filterMenuData = (menuData: MenuDataItem[] = []): MenuDataItem[] => { |
|
||||
return menuData |
|
||||
.filter(item => item.name && !item.hideInMenu) |
|
||||
.map(item => Authorized.check<any, any>(item.authority!, getSubMenu(item), null)) |
|
||||
.filter(item => item); |
|
||||
}; |
|
||||
|
|
||||
/** |
|
||||
* 获取面包屑映射 |
|
||||
* @param MenuDataItem[] menuData 菜单配置 |
|
||||
*/ |
|
||||
const getBreadcrumbNameMap = (menuData: MenuDataItem[]) => { |
|
||||
const routerMap: { [key: string]: MenuDataItem } = {}; |
|
||||
const flattenMenuData: (data: MenuDataItem[]) => void = 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 interface MenuModelState { |
|
||||
menuData: MenuDataItem[]; |
|
||||
routerData: IRoute[]; |
|
||||
breadcrumbNameMap: object; |
|
||||
} |
|
||||
|
|
||||
export interface MenuModelType { |
|
||||
namespace: 'menu'; |
|
||||
state: MenuModelState; |
|
||||
effects: { |
|
||||
getMenuData: Effect; |
|
||||
}; |
|
||||
reducers: { |
|
||||
save: Reducer<MenuModelState>; |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
const MenuModel: MenuModelType = { |
|
||||
namespace: 'menu', |
|
||||
|
|
||||
state: { |
|
||||
menuData: [], |
|
||||
routerData: [], |
|
||||
breadcrumbNameMap: {}, |
|
||||
}, |
|
||||
|
|
||||
effects: { |
|
||||
*getMenuData({ payload }, { put }) { |
|
||||
const { routes, authority } = payload; |
|
||||
const originalMenuData = memoizeOneFormatter(routes, authority); |
|
||||
const menuData = filterMenuData(originalMenuData); |
|
||||
const breadcrumbNameMap = memoizeOneGetBreadcrumbNameMap(originalMenuData); |
|
||||
yield put({ |
|
||||
type: 'save', |
|
||||
payload: { menuData, breadcrumbNameMap, routerData: routes }, |
|
||||
}); |
|
||||
}, |
|
||||
}, |
|
||||
|
|
||||
reducers: { |
|
||||
save(state, action) { |
|
||||
return { |
|
||||
...state, |
|
||||
...action.payload, |
|
||||
}; |
|
||||
}, |
|
||||
}, |
|
||||
}; |
|
||||
|
|
||||
export default MenuModel; |
|
||||
@ -1,36 +0,0 @@ |
|||||
import isEqual from 'lodash/isEqual'; |
|
||||
import memoizeOne from 'memoize-one'; |
|
||||
import pathToRegexp from 'path-to-regexp'; |
|
||||
import { formatMessage } from 'umi-plugin-react/locale'; |
|
||||
import defaultSettings from '../../config/defaultSettings'; |
|
||||
import { MenuDataItem } from '@/components/SiderMenu/BaseMenu'; |
|
||||
|
|
||||
const { menu, title } = defaultSettings; |
|
||||
|
|
||||
export const matchParamsPath = ( |
|
||||
pathname: string, |
|
||||
breadcrumbNameMap: { [path: string]: MenuDataItem }, |
|
||||
): MenuDataItem => { |
|
||||
const pathKey = Object.keys(breadcrumbNameMap).find(key => pathToRegexp(key).test(pathname)); |
|
||||
return breadcrumbNameMap[pathKey!]; |
|
||||
}; |
|
||||
|
|
||||
const getPageTitle = ( |
|
||||
pathname: string, |
|
||||
breadcrumbNameMap: { [path: string]: MenuDataItem }, |
|
||||
): string => { |
|
||||
const currRouterData = matchParamsPath(pathname, breadcrumbNameMap); |
|
||||
if (!currRouterData) { |
|
||||
return title; |
|
||||
} |
|
||||
const pageName = menu.disableLocal |
|
||||
? currRouterData.name |
|
||||
: formatMessage({ |
|
||||
id: currRouterData.locale || currRouterData.name!, |
|
||||
defaultMessage: currRouterData.name, |
|
||||
}); |
|
||||
|
|
||||
return `${pageName} - ${title}`; |
|
||||
}; |
|
||||
|
|
||||
export default memoizeOne(getPageTitle, isEqual); |
|
||||
@ -1,3 +1,5 @@ |
|||||
declare module 'slash2'; |
declare module 'slash2'; |
||||
declare module 'antd-pro-merge-less'; |
declare module 'antd-pro-merge-less'; |
||||
declare module 'antd-theme-webpack-plugin'; |
declare module 'antd-theme-webpack-plugin'; |
||||
|
|
||||
|
declare let ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: 'site' | undefined; |
||||
|
|||||
Loading…
Reference in new issue