| | |
| | | import React, { useState, useRef, useEffect } from 'react'; |
| | | import { |
| | | ProForm, |
| | | ProFormDigit, |
| | | } from '@ant-design/pro-components'; |
| | | import { DownOutlined } from '@ant-design/icons'; |
| | | import { Col, Form, Modal, Row, Checkbox, Skeleton, Tree, Drawer, Space, Button, Card } from 'antd'; |
| | | import Http from '@/utils/http'; |
| | | import { FormattedMessage, useIntl } from '@umijs/max'; |
| | | import { transformTreeData, getTreeAllKeys } from '@/utils/tree-util' |
| | | |
| | | const Scope = (props) => { |
| | | const intl = useIntl(); |
| | | const [form] = Form.useForm(); |
| | | const { originMenuIds, values: { name } } = props; |
| | | const [menuTreeLoading, setMenuTreeLoading] = useState(false); |
| | | const [menuTreeData, setMenuTreeData] = useState([]); |
| | | const [menuExpandedKeys, setMenuExpandedKeys] = useState([]); |
| | | const [menuIds, setMenuIds] = useState([]); |
| | | |
| | | const [menuTreeAllKeys, setMenuTreeAllKeys] = useState([]); |
| | | |
| | | const loadMenuTree = (param) => { |
| | | setMenuTreeLoading(true); |
| | | Http.doPostPromise('/api/menu/tree', param, (res) => { |
| | | setMenuTreeLoading(false); |
| | | const treeData = transformTreeData(res.data); |
| | | setMenuTreeData(treeData); |
| | | const treeAllKeys = getTreeAllKeys(treeData); |
| | | setMenuTreeAllKeys(treeAllKeys); |
| | | setMenuExpandedKeys(treeAllKeys); |
| | | }).catch((err) => { |
| | | console.error(err); |
| | | setMenuTreeLoading(false); |
| | | }) |
| | | } |
| | | |
| | | useEffect(() => { |
| | | setMenuIds(originMenuIds); |
| | | form.resetFields(); |
| | | form.setFieldsValue({ |
| | | ...props.values |
| | | }) |
| | | |
| | | loadMenuTree(); |
| | | }, [form, props]) |
| | | |
| | | const handleCancel = () => { |
| | | props.onCancel(); |
| | | }; |
| | | |
| | | const handleOk = () => { |
| | | form.submit(); |
| | | } |
| | | |
| | | const handleFinish = async (values) => { |
| | | props.onSubmit({ ...values, menuIds }); |
| | | } |
| | | |
| | | return ( |
| | | <> |
| | | <Drawer |
| | | title={`${intl.formatMessage({ id: 'page.assign.permission', defaultMessage: '分配权限' })} - ${name ? name : '-'}`} |
| | | width={640} |
| | | forceRender |
| | | destroyOnClose |
| | | open={props.open} |
| | | onClose={handleCancel} |
| | | styles={{ |
| | | body: { |
| | | paddingBottom: 80, |
| | | }, |
| | | }} |
| | | extra={ |
| | | <Space> |
| | | <Button onClick={handleCancel}>Cancel</Button> |
| | | <Button onClick={handleOk} type="primary"> |
| | | Submit |
| | | </Button> |
| | | </Space> |
| | | } |
| | | > |
| | | <Card> |
| | | <ProForm |
| | | form={form} |
| | | submitter={false} |
| | | onFinish={handleFinish} |
| | | layout="horizontal" |
| | | grid={true} |
| | | > |
| | | <ProFormDigit |
| | | name="id" |
| | | disabled |
| | | hidden={true} |
| | | /> |
| | | |
| | | <ProForm.Item |
| | | name="deptIds" |
| | | label={intl.formatMessage({ id: 'page.permission.menu', defaultMessage: '权限菜单' })} |
| | | colProps={{ md: 24, xl: 24 }} |
| | | > |
| | | <Row gutter={[16, 16]}> |
| | | <Col md={24}> |
| | | <Checkbox.Group |
| | | options={[ |
| | | { label: intl.formatMessage({ id: 'page.role.assign.ec', defaultMessage: '展开/折叠' }), value: 'expandAll' }, |
| | | { label: intl.formatMessage({ id: 'page.role.assign.sd', defaultMessage: '全选/全不选' }), value: 'checkAll' }, |
| | | ]} |
| | | defaultValue={['expandAll']} |
| | | onChange={(values) => { |
| | | if (values.includes('expandAll')) { |
| | | setMenuExpandedKeys(menuTreeAllKeys); |
| | | } else { |
| | | setMenuExpandedKeys([]); |
| | | } |
| | | if (values.includes('checkAll')) { |
| | | setMenuIds(menuTreeAllKeys) |
| | | } else { |
| | | setMenuIds([]); |
| | | } |
| | | }} /> |
| | | </Col> |
| | | <Col md={24}> |
| | | {menuTreeLoading ? ( |
| | | <Skeleton active /> |
| | | ) : ( |
| | | <Tree |
| | | showLine |
| | | blockNode |
| | | checkable |
| | | switcherIcon={<DownOutlined />} |
| | | treeData={menuTreeData} |
| | | expandedKeys={menuExpandedKeys} |
| | | onExpand={(expandedKeys) => { |
| | | setMenuExpandedKeys(expandedKeys) |
| | | }} |
| | | checkedKeys={menuIds} |
| | | onCheck={(checkedKeys, checkInfo) => { |
| | | return setMenuIds({ |
| | | checked: checkedKeys, |
| | | halfChecked: checkInfo.halfCheckedKeys // 父节点 |
| | | }); |
| | | }} |
| | | /> |
| | | )} |
| | | </Col> |
| | | </Row> |
| | | </ProForm.Item> |
| | | </ProForm> |
| | | </Card> |
| | | </Drawer> |
| | | </> |
| | | ) |
| | | } |
| | | |
| | | import React, { useState, useRef, useEffect } from 'react';
|
| | | import {
|
| | | ProForm,
|
| | | ProFormDigit,
|
| | | } from '@ant-design/pro-components';
|
| | | import { DownOutlined } from '@ant-design/icons';
|
| | | import { Col, Form, Modal, Row, Checkbox, Skeleton, Tree, Drawer, Space, Button, Card } from 'antd';
|
| | | import Http from '@/utils/http';
|
| | | import { FormattedMessage, useIntl } from '@umijs/max';
|
| | | import { transformTreeData, getTreeAllKeys } from '@/utils/tree-util'
|
| | |
|
| | | const Scope = (props) => {
|
| | | const intl = useIntl();
|
| | | const [form] = Form.useForm();
|
| | | const { originMenuIds, values: { name } } = props;
|
| | | const [menuTreeLoading, setMenuTreeLoading] = useState(false);
|
| | | const [menuTreeData, setMenuTreeData] = useState([]);
|
| | | const [menuExpandedKeys, setMenuExpandedKeys] = useState([]);
|
| | | const [menuIds, setMenuIds] = useState([]);
|
| | |
|
| | | const [menuTreeAllKeys, setMenuTreeAllKeys] = useState([]);
|
| | |
|
| | | const loadMenuTree = (param) => {
|
| | | setMenuTreeLoading(true);
|
| | | Http.doPostPromise('/api/menu/tree', param, (res) => {
|
| | | setMenuTreeLoading(false);
|
| | | const treeData = transformTreeData(res.data);
|
| | | setMenuTreeData(treeData);
|
| | | const treeAllKeys = getTreeAllKeys(treeData);
|
| | | setMenuTreeAllKeys(treeAllKeys);
|
| | | setMenuExpandedKeys(treeAllKeys);
|
| | | }).catch((err) => {
|
| | | console.error(err);
|
| | | setMenuTreeLoading(false);
|
| | | })
|
| | | }
|
| | |
|
| | | useEffect(() => {
|
| | | setMenuIds(originMenuIds);
|
| | | form.resetFields();
|
| | | form.setFieldsValue({
|
| | | ...props.values
|
| | | })
|
| | |
|
| | | loadMenuTree();
|
| | | }, [form, props])
|
| | |
|
| | | const handleCancel = () => {
|
| | | props.onCancel();
|
| | | };
|
| | |
|
| | | const handleOk = () => {
|
| | | form.submit();
|
| | | }
|
| | |
|
| | | const handleFinish = async (values) => {
|
| | | props.onSubmit({ ...values, menuIds });
|
| | | }
|
| | |
|
| | | return (
|
| | | <>
|
| | | <Drawer
|
| | | title={`${intl.formatMessage({ id: 'page.assign.permission', defaultMessage: '分配权限' })} - ${name ? name : '-'}`}
|
| | | width={640}
|
| | | forceRender
|
| | | destroyOnClose
|
| | | open={props.open}
|
| | | onClose={handleCancel}
|
| | | styles={{
|
| | | body: {
|
| | | paddingBottom: 80,
|
| | | },
|
| | | }}
|
| | | extra={
|
| | | <Space>
|
| | | <Button onClick={handleCancel}>Cancel</Button>
|
| | | <Button onClick={handleOk} type="primary">
|
| | | Submit
|
| | | </Button>
|
| | | </Space>
|
| | | }
|
| | | >
|
| | | <Card>
|
| | | <ProForm
|
| | | form={form}
|
| | | submitter={false}
|
| | | onFinish={handleFinish}
|
| | | layout="horizontal"
|
| | | grid={true}
|
| | | >
|
| | | <ProFormDigit
|
| | | name="id"
|
| | | disabled
|
| | | hidden={true}
|
| | | />
|
| | |
|
| | | <ProForm.Item
|
| | | name="deptIds"
|
| | | label={intl.formatMessage({ id: 'page.permission.menu', defaultMessage: '权限菜单' })}
|
| | | colProps={{ md: 24, xl: 24 }}
|
| | | >
|
| | | <Row gutter={[16, 16]}>
|
| | | <Col md={24}>
|
| | | <Checkbox.Group
|
| | | options={[
|
| | | { label: intl.formatMessage({ id: 'page.role.assign.ec', defaultMessage: '展开/折叠' }), value: 'expandAll' },
|
| | | { label: intl.formatMessage({ id: 'page.role.assign.sd', defaultMessage: '全选/全不选' }), value: 'checkAll' },
|
| | | ]}
|
| | | defaultValue={['expandAll']}
|
| | | onChange={(values) => {
|
| | | if (values.includes('expandAll')) {
|
| | | setMenuExpandedKeys(menuTreeAllKeys);
|
| | | } else {
|
| | | setMenuExpandedKeys([]);
|
| | | }
|
| | | if (values.includes('checkAll')) {
|
| | | setMenuIds(menuTreeAllKeys)
|
| | | } else {
|
| | | setMenuIds([]);
|
| | | }
|
| | | }} />
|
| | | </Col>
|
| | | <Col md={24}>
|
| | | {menuTreeLoading ? (
|
| | | <Skeleton active />
|
| | | ) : (
|
| | | <Tree
|
| | | showLine
|
| | | blockNode
|
| | | checkable
|
| | | switcherIcon={<DownOutlined />}
|
| | | treeData={menuTreeData}
|
| | | expandedKeys={menuExpandedKeys}
|
| | | onExpand={(expandedKeys) => {
|
| | | setMenuExpandedKeys(expandedKeys)
|
| | | }}
|
| | | checkedKeys={menuIds}
|
| | | onCheck={(checkedKeys, checkInfo) => {
|
| | | return setMenuIds({
|
| | | checked: checkedKeys,
|
| | | halfChecked: checkInfo.halfCheckedKeys // 父节点
|
| | | });
|
| | | }}
|
| | | />
|
| | | )}
|
| | | </Col>
|
| | | </Row>
|
| | | </ProForm.Item>
|
| | | </ProForm>
|
| | | </Card>
|
| | | </Drawer>
|
| | | </>
|
| | | )
|
| | | }
|
| | |
|
| | | export default Scope; |