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 'antd-pro-merge-less'; |
|||
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