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; 
 |