menus.jsx 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React from 'react';
  2. import { Button, Card, Tree, message } from 'antd';
  3. import useBool from '@/utils/hooks/useBool';
  4. import { arr2Tree, uniq } from '@/utils/array';
  5. import { getResourceList } from '@/services/role';
  6. export default (props) => {
  7. const { role } = props;
  8. const [loading, startLoading, cancelLoading] = useBool();
  9. const [list, setList] = React.useState([]);
  10. const [treeData, setTreeData] = React.useState([]);
  11. const treeDictRef = React.useRef();
  12. const [checkedKeys, setCheckedKeys] = React.useState([]);
  13. const checkedNodesRef = React.useState([]);
  14. const title = role ? `${role.name} - 授权菜单` : '授权菜单';
  15. const onCheck = (keys, info) => {
  16. const { checkedNodes } = info;
  17. checkedNodesRef.current = checkedNodes;
  18. // const keys = checkedNodes.map(node => getKeysWithParent(node, treeDictRef.current));
  19. // setCheckedKeys(uniq(keys));
  20. setCheckedKeys(keys);
  21. };
  22. const onSubmit = () => {
  23. if (!checkedNodesRef.current) {
  24. return;
  25. }
  26. if (checkedNodesRef.current.length !== checkedKeys.length) {
  27. message.warn('未知错误, 请刷新重试');
  28. return;
  29. }
  30. const keys = checkedNodesRef.current.map(node => getKeysWithParent(node, treeDictRef.current));
  31. }
  32. React.useEffect(() => {
  33. startLoading();
  34. getResourceList({ pageSize: 500, type: 'menu' }).then((res) => {
  35. cancelLoading();
  36. setList(res.records || []);
  37. }).catch(() => {
  38. cancelLoading();
  39. })
  40. }, []);
  41. React.useEffect(() => {
  42. if (!role) {
  43. setList([]);
  44. }
  45. }, [role]);
  46. React.useEffect(() => {
  47. // 先转为需要的格式
  48. const arr = list.map(x => ({ title: x.name, key: x.id, parentId: x.parentId }));
  49. // 再转为 tree
  50. const [tree, dict] = arr2Tree(arr);
  51. setTreeData(tree);
  52. treeDictRef.current = dict;
  53. }, [list]);
  54. return (
  55. <Card
  56. loading={loading}
  57. title={title}
  58. extra={<Button type='primary' ghost onClick={onSubmit}>保存</Button>}
  59. >
  60. <Tree
  61. checkable
  62. autoExpandParent
  63. checkStrictly={false}
  64. selectable={false}
  65. checkedKeys={checkedKeys}
  66. onCheck={onCheck}
  67. treeData={treeData}
  68. />
  69. </Card>
  70. )
  71. }
  72. function getKeysWithParent(node, dict) {
  73. if (node.parentId === -1) return [node.key];
  74. const parentKeys = getKeysWithParent(dict[node.parentId], dict);
  75. return parentKeys ? [node.key].concat(parentKeys) : [node.key];
  76. }