Browse Source
* Close: https://github.com/ant-design/ant-design-pro/issues/2910 * remove menu authorized to menu-modelpull/2966/head
committed by
GitHub
5 changed files with 116 additions and 71 deletions
@ -0,0 +1,99 @@ |
|||||
|
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 => { |
||||
|
// doc: add hideChildrenInMenu
|
||||
|
if (item.children && !item.hideChildrenInMenu && item.children.some(child => child.name)) { |
||||
|
return { |
||||
|
...item, |
||||
|
children: filterMenuData(item.children), // eslint-disable-line
|
||||
|
}; |
||||
|
} |
||||
|
return item; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* filter menuData |
||||
|
*/ |
||||
|
const filterMenuData = menuData => { |
||||
|
if (!menuData) { |
||||
|
return []; |
||||
|
} |
||||
|
return menuData |
||||
|
.filter(item => item.name && !item.hideInMenu) |
||||
|
.map(item => { |
||||
|
// make dom
|
||||
|
const ItemDom = getSubMenu(item); |
||||
|
const data = check(item.authority, ItemDom); |
||||
|
return data; |
||||
|
}) |
||||
|
.filter(item => item); |
||||
|
}; |
||||
|
|
||||
|
export default { |
||||
|
namespace: 'menu', |
||||
|
|
||||
|
state: { |
||||
|
menuData: [], |
||||
|
}, |
||||
|
|
||||
|
effects: { |
||||
|
*getMenuData({ payload }, { put }) { |
||||
|
const { routes, authority } = payload; |
||||
|
yield put({ |
||||
|
type: 'save', |
||||
|
payload: filterMenuData(memoizeOneFormatter(routes, authority)), |
||||
|
}); |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
reducers: { |
||||
|
save(state, action) { |
||||
|
return { |
||||
|
...state, |
||||
|
menuData: action.payload, |
||||
|
}; |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
Loading…
Reference in new issue