| import React, { useState, useRef, useEffect } from 'react'; | 
| import { Button, message, Modal, Row, Col, Card, Tree, Input, Tag, Skeleton } from 'antd'; | 
| import { | 
|     FooterToolbar, | 
|     PageContainer, | 
|     ProTable, | 
|     LightFilter, | 
|     TableDropdown | 
| } from '@ant-design/pro-components'; | 
| import { FormattedMessage, useIntl } from '@umijs/max'; | 
| import { PlusOutlined, ExportOutlined, DownOutlined, DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons'; | 
| import Http from '@/utils/http'; | 
| import Edit from './components/edit' | 
| import Pwd from './components/pwd' | 
| import AssignRole from './components/assignRole' | 
| import { TextFilter, SelectFilter, DatetimeRangeFilter, LinkFilter } from '@/components/TableSearch' | 
| import { transformTreeData, getTreeAllKeys } from '@/utils/tree-util' | 
| import { statusMap } from '@/utils/enum-util' | 
| import { repairBug } from '@/utils/common-util'; | 
|   | 
| const TABLE_KEY = "pro-table-user"; | 
|   | 
| const handleSave = async (val, intl) => { | 
|     const hide = message.loading(intl.formatMessage({ id: 'page.adding', defaultMessage: '正在添加' })); | 
|     try { | 
|         const resp = await Http.doPost('api/user/save', val); | 
|         if (resp.code === 200) { | 
|             message.success(intl.formatMessage({ id: 'page.add.success', defaultMessage: '添加成功' })); | 
|             return true; | 
|         } else { | 
|             message.error(resp.msg); | 
|             return false; | 
|         } | 
|     } catch (error) { | 
|         message.error(intl.formatMessage({ id: 'page.add.fail', defaultMessage: '添加失败请重试!' })); | 
|         return false; | 
|     } finally { | 
|         hide(); | 
|     } | 
| }; | 
|   | 
| const handleUpdate = async (val, intl) => { | 
|     const hide = message.loading(intl.formatMessage({ id: 'page.updating', defaultMessage: '正在更新' })); | 
|     try { | 
|         const resp = await Http.doPost('api/user/update', val); | 
|         if (resp.code === 200) { | 
|             message.success(intl.formatMessage({ id: 'page.update.success', defaultMessage: '更新成功' })); | 
|             return true; | 
|         } else { | 
|             message.error(resp.msg); | 
|             return false; | 
|         } | 
|     } catch (error) { | 
|         message.error(intl.formatMessage({ id: 'page.update.fail', defaultMessage: '更新失败请重试!' })); | 
|         return false; | 
|     } finally { | 
|         hide(); | 
|     } | 
| }; | 
|   | 
| const handleRemove = async (rows, intl) => { | 
|     if (!rows) return true; | 
|     const hide = message.loading(intl.formatMessage({ id: 'page.deleting', defaultMessage: '正在删除' })); | 
|     try { | 
|         const resp = await Http.doPost('api/user/remove/' + rows.map((row) => row.id).join(',')); | 
|         if (resp.code === 200) { | 
|             message.success(intl.formatMessage({ id: 'page.delete.success', defaultMessage: '删除成功' })); | 
|             return true; | 
|         } else { | 
|             message.error(resp.msg); | 
|             return false; | 
|         } | 
|     } catch (error) { | 
|         message.error(intl.formatMessage({ id: 'page.delete.fail', defaultMessage: '删除失败,请重试!' })); | 
|         return false; | 
|     } finally { | 
|         hide(); | 
|     } | 
| }; | 
|   | 
| const handleExport = async (intl) => { | 
|     const hide = message.loading(intl.formatMessage({ id: 'page.exporting', defaultMessage: '正在导出' })); | 
|     try { | 
|         const resp = await Http.doPostBlob('api/user/export'); | 
|         const blob = new Blob([resp], { type: 'application/vnd.ms-excel' }); | 
|         window.location.href = window.URL.createObjectURL(blob); | 
|         message.success(intl.formatMessage({ id: 'page.export.success', defaultMessage: '导出成功' })); | 
|         return true; | 
|     } catch (error) { | 
|         message.error(intl.formatMessage({ id: 'page.export.fail', defaultMessage: '导出失败,请重试' })); | 
|         return false; | 
|     } finally { | 
|         hide(); | 
|     } | 
| }; | 
|   | 
| const handlePwd = async (val, intl) => { | 
|     const hide = message.loading(intl.formatMessage({ id: 'page.resetting', defaultMessage: '正在重置' })); | 
|     try { | 
|         const resp = await Http.doPost('api/user/reset/pwd', val); | 
|         if (resp.code === 200) { | 
|             message.success(intl.formatMessage({ id: 'page.reset.success', defaultMessage: '重置成功' })); | 
|             return true; | 
|         } else { | 
|             message.error(resp.msg); | 
|             return false; | 
|         } | 
|     } catch (error) { | 
|         message.error(intl.formatMessage({ id: 'page.reset.fail', defaultMessage: '重置失败请重试!' })); | 
|         return false; | 
|     } finally { | 
|         hide(); | 
|     } | 
| }; | 
|   | 
|   | 
| const Main = () => { | 
|     const intl = useIntl(); | 
|     const formTableRef = useRef(); | 
|     const actionRef = useRef(); | 
|     const [selectedRows, setSelectedRows] = useState([]); | 
|     const [modalVisible, setModalVisible] = useState(false); | 
|     const [currentRow, setCurrentRow] = useState(); | 
|     const [searchParam, setSearchParam] = useState({}); | 
|   | 
|     const [boxHeight, setBoxHeight] = useState(); | 
|     const [deptTreeLoading, setDeptTreeLoading] = useState(false); | 
|     const [deptTreeData, setDeptTreeData] = useState([]); | 
|     const [deptExpandedKeys, setDeptExpandedKeys] = useState([]); | 
|   | 
|     const [pwdModalVisible, setPwdModalVisible] = useState(false); | 
|   | 
|     const [assignModalVisible, setAssignModalVisible] = useState(false); | 
|   | 
|     const loadDeptTreeData = (param) => { | 
|         setDeptTreeLoading(true); | 
|         Http.doPostPromise('/api/dept/tree', param, (res) => { | 
|             setDeptTreeLoading(false); | 
|             const rootMenu = { id: 0, name: '全部', value: 0, children: [] }; | 
|             rootMenu.children = res.data; | 
|             // const treeData = transformTreeData([rootMenu]); | 
|             const treeData = transformTreeData(res.data); | 
|             setDeptTreeData(treeData); | 
|             const treeAllKeys = getTreeAllKeys(treeData); | 
|             setDeptExpandedKeys(treeAllKeys); | 
|         }).catch((err) => { | 
|             console.error(err); | 
|             setDeptTreeLoading(false); | 
|         }) | 
|     } | 
|   | 
|     useEffect(() => { | 
|         const handleResize = () => setBoxHeight(window.innerHeight - 320); | 
|         window.addEventListener('resize', handleResize); | 
|         handleResize(); | 
|   | 
|         loadDeptTreeData(); | 
|   | 
|         return () => window.removeEventListener('resize', handleResize); | 
|     }, []); | 
|   | 
|     const columns = [ | 
|         { | 
|             title: intl.formatMessage({ | 
|                 id: 'page.table.no', | 
|                 defaultMessage: 'No' | 
|             }), | 
|             dataIndex: 'index', | 
|             valueType: 'indexBorder', | 
|             width: 48, | 
|         }, | 
|         { | 
|             title: '部门', | 
|             dataIndex: 'deptId$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             render: (_, record) => { | 
|                 if (_ && _ !== '-') { | 
|                     return <Tag color={""}>{_}</Tag> | 
|                 } else { | 
|                     return '-' | 
|                 } | 
|             }, | 
|             // filterDropdown: (props) => <LinkFilter | 
|             //     name='deptId' | 
|             //     major='dept' | 
|             //     {...props} | 
|             //     actionRef={actionRef} | 
|             //     setSearchParam={setSearchParam} | 
|             // />, | 
|         }, | 
|         { | 
|             title: '登录账号', | 
|             dataIndex: 'username', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             copyable: true, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='username' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|             render: (_, record) => { | 
|                 return <span style={{ fontWeight: "bold" }}>{_}</span> | 
|             } | 
|         }, | 
|         { | 
|             title: '名称', | 
|             dataIndex: 'nickname', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='nickname' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|             render: (_, record) => { | 
|                 return <span style={{ fontWeight: "bold" }}>{_}</span> | 
|             } | 
|         }, | 
|         { | 
|             title: '密码', | 
|             dataIndex: 'password', | 
|             valueType: 'password', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='password' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '头像', | 
|             dataIndex: 'avatar', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='avatar' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '工号', | 
|             dataIndex: 'code', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='code' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '性别', | 
|             dataIndex: 'sex$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <SelectFilter | 
|                 name='sex' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|                 data={[ | 
|                     { label: '未知', value: 0 }, | 
|                     { label: '男', value: 1 }, | 
|                     { label: '女', value: 2 }, | 
|                 ]} | 
|             />, | 
|         }, | 
|         { | 
|             title: '手机号', | 
|             dataIndex: 'phone', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='phone' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '邮箱', | 
|             dataIndex: 'email', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='email' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '邮箱验证', | 
|             dataIndex: 'emailVerified$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <SelectFilter | 
|                 name='emailVerified' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|                 data={[ | 
|                     { label: '否', value: 0 }, | 
|                     { label: '是', value: 1 }, | 
|                 ]} | 
|             />, | 
|         }, | 
|         { | 
|             title: '真实姓名', | 
|             dataIndex: 'realName', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='realName' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '身份证号', | 
|             dataIndex: 'idCard', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='idCard' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '出生日期', | 
|             dataIndex: 'birthday', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='birthday' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '个人简介', | 
|             dataIndex: 'introduction', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='introduction' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '状态', | 
|             dataIndex: 'status$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             render: (_, record) => { | 
|                 const status = statusMap[record.status] | 
|                 return <Tag color={status.color}>{status.text}</Tag> | 
|             }, | 
|             filterDropdown: (props) => <SelectFilter | 
|                 name='status' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|                 data={[ | 
|                     { label: '正常', value: 1 }, | 
|                     { label: '禁用', value: 0 }, | 
|                 ]} | 
|             />, | 
|         }, | 
|         { | 
|             title: '添加时间', | 
|             dataIndex: 'createTime$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <DatetimeRangeFilter | 
|                 name='createTime' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '修改时间', | 
|             dataIndex: 'updateTime$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <DatetimeRangeFilter | 
|                 name='updateTime' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '修改人员', | 
|             dataIndex: 'updateBy$', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <LinkFilter | 
|                 name='updateBy' | 
|                 major='user' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|         { | 
|             title: '备注', | 
|             dataIndex: 'memo', | 
|             valueType: 'text', | 
|             hidden: false, | 
|             filterDropdown: (props) => <TextFilter | 
|                 name='memo' | 
|                 {...props} | 
|                 actionRef={actionRef} | 
|                 setSearchParam={setSearchParam} | 
|             />, | 
|         }, | 
|   | 
|         { | 
|             title: '操作', | 
|             dataIndex: 'option', | 
|             valueType: 'option', | 
|             width: 180, | 
|             render: (_, record) => [ | 
|                 <Button | 
|                     type="link" | 
|                     key="edit" | 
|                     style={{ padding: '2px 3px' }} | 
|                     onClick={() => { | 
|                         setModalVisible(true); | 
|                         setCurrentRow(record); | 
|                     }} | 
|                 > | 
|                     <FormattedMessage id='page.edit' defaultMessage='编辑' /> | 
|                 </Button>, | 
|                 <Button | 
|                     type="link" | 
|                     key="pwd" | 
|                     style={{ padding: '2px 2px' }} | 
|                     onClick={() => { | 
|                         setPwdModalVisible(true); | 
|                         setCurrentRow(record); | 
|                     }} | 
|                 > | 
|                     <FormattedMessage id='page.reset.pwd' defaultMessage='重置密码' /> | 
|                 </Button>, | 
|                 <Button | 
|                     type="link" | 
|                     danger | 
|                     style={{ padding: '4px' }} | 
|                     key="remove" | 
|                     onClick={async () => { | 
|                         Modal.confirm({ | 
|                             title: intl.formatMessage({ id: 'page.delete', defaultMessage: '删除' }), | 
|                             content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '确定删除该项吗?' }), | 
|                             onOk: async () => { | 
|                                 const success = await handleRemove([record], intl); | 
|                                 if (success) { | 
|                                     if (actionRef.current) { | 
|                                         actionRef.current.reload(); | 
|                                     } | 
|                                 } | 
|                             }, | 
|                         }); | 
|                     }} | 
|                 > | 
|                     <FormattedMessage id='page.delete' defaultMessage='删除' /> | 
|                 </Button>, | 
|                 <TableDropdown | 
|                     key="actionGroup" | 
|                     name="dropdown" | 
|                     onSelect={(key) => { | 
|                         if (key === 'assign') { | 
|                             setAssignModalVisible(true); | 
|                             setCurrentRow(record); | 
|                         } | 
|                     }} | 
|                     menus={[ | 
|                         { key: 'assign', name: intl.formatMessage({ id: 'page.assign.role', defaultMessage: '分配角色' }) }, | 
|                     ]} | 
|                 />, | 
|             ], | 
|         }, | 
|     ]; | 
|   | 
|     return ( | 
|         <PageContainer | 
|             header={{ | 
|                 breadcrumb: {}, | 
|             }} | 
|         > | 
|             <Row gutter={[16, 24]}> | 
|                 <Col lg={6} md={24}> | 
|                     <Card | 
|                         title={intl.formatMessage({ id: 'system.dept', defaultMessage: '部门' })} | 
|                         style={{ width: '100%', height: 'calc(100vh - 160px)' }} | 
|                     > | 
|                         <Input | 
|                             style={{ marginBottom: 10 }} | 
|                             placeholder={intl.formatMessage({ id: 'commont.enter', defaultMessage: '请输入' })} | 
|                             onChange={(e) => { | 
|                                 const { value } = e.target; | 
|                                 loadDeptTreeData({ | 
|                                     condition: value | 
|                                 }) | 
|                             }} | 
|                         /> | 
|                         <div style={{ height: 'calc(100vh - 325px)', overflowY: 'auto' }}> | 
|                             {deptTreeLoading ? ( | 
|                                 <Skeleton active /> | 
|                             ) : ( | 
|                                 <Tree | 
|                                     showLine | 
|                                     blockNode | 
|                                     defaultExpandAll    // 异步加载失效 | 
|                                     expandedKeys={deptExpandedKeys} | 
|                                     onExpand={setDeptExpandedKeys} | 
|                                     treeData={deptTreeData} | 
|                                     switcherIcon={<DownOutlined />} | 
|                                     onSelect={(selectedKeys, info) => { | 
|                                         const deptId = selectedKeys[0]; | 
|                                         setSearchParam(prevState => ({ | 
|                                             ...prevState, | 
|                                             deptId: deptId | 
|                                         })); | 
|                                         actionRef.current?.reload(); | 
|                                     }} | 
|                                 /> | 
|                             )} | 
|                         </div> | 
|                     </Card> | 
|                 </Col> | 
|                 <Col lg={18} md={24}> | 
|                     <ProTable | 
|                         key="user" | 
|                         rowKey="id" | 
|                         actionRef={actionRef} | 
|                         formRef={formTableRef} | 
|                         columns={columns} | 
|                         cardBordered | 
|                         size='small' | 
|                         // scroll={{ y: boxHeight }} | 
|                         dateFormatter="string" | 
|                         pagination={{ pageSize: 12 }} | 
|                         search={false} | 
|                         toolbar={{ | 
|                             search: { | 
|                                 onSearch: (value) => { | 
|                                     setSearchParam(prevState => ({ | 
|                                         ...prevState, | 
|                                         condition: value | 
|                                     })); | 
|                                     actionRef.current?.reload(); | 
|                                 }, | 
|                             }, | 
|                             filter: ( | 
|                                 <LightFilter | 
|                                     onValuesChange={(val) => { | 
|                                     }} | 
|                                 > | 
|                                 </LightFilter> | 
|                             ), | 
|                             actions: [ | 
|                                 <Button | 
|                                     type="primary" | 
|                                     danger | 
|                                     key="removeBatch" | 
|                                     hidden={selectedRows?.length === 0} | 
|                                     onClick={async () => { | 
|                                         Modal.confirm({ | 
|                                             title: intl.formatMessage({ id: 'page.delete', defaultMessage: '删除' }), | 
|                                             content: intl.formatMessage({ id: 'page.delete.confirm', defaultMessage: '确定删除该项吗?' }), | 
|                                             icon: <ExclamationCircleOutlined />, | 
|                                             async onOk() { | 
|                                                 const success = await handleRemove(selectedRows, intl); | 
|                                                 if (success) { | 
|                                                     setSelectedRows([]); | 
|                                                     actionRef.current.reload(); | 
|                                                 } | 
|                                             }, | 
|                                             onCancel() { }, | 
|                                         }); | 
|                                     }} | 
|                                 > | 
|                                     <DeleteOutlined /> | 
|                                     <FormattedMessage id='page.delete' defaultMessage='删除' /> | 
|                                 </Button>, | 
|                                 <Button | 
|                                     type="primary" | 
|                                     key="save" | 
|                                     onClick={async () => { | 
|                                         setModalVisible(true) | 
|                                     }} | 
|                                 > | 
|                                     <PlusOutlined /> | 
|                                     <FormattedMessage id='page.add' defaultMessage='添加' /> | 
|                                 </Button>, | 
|                                 <Button | 
|                                     key="export" | 
|                                     onClick={async () => { | 
|                                         handleExport(intl); | 
|                                     }} | 
|                                 > | 
|                                     <ExportOutlined /> | 
|                                     <FormattedMessage id='page.export' defaultMessage='导出' /> | 
|                                 </Button>, | 
|                             ], | 
|                         }} | 
|                         request={(params, sorter, filter) => | 
|                             Http.doPostPromise('/api/user/page1', { ...params, ...searchParam }, (res) => { | 
|                                 return { | 
|                                     data: res.data.records, | 
|                                     total: res.data.total, | 
|                                     success: true, | 
|                                 } | 
|                             }) | 
|                         } | 
|                         tableAlertRender={false} | 
|                         rowSelection={{ | 
|                             onChange: (ids, rows) => { | 
|                                 setSelectedRows(rows); | 
|                             } | 
|                         }} | 
|                         columnsState={{ | 
|                             persistenceKey: TABLE_KEY, | 
|                             persistenceType: 'localStorage', | 
|                             defaultValue: { | 
|                                 password: { show: repairBug(TABLE_KEY, 'password', false) }, | 
|                                 avatar: { show: repairBug(TABLE_KEY, 'avatar', false) }, | 
|                                 code: { show: repairBug(TABLE_KEY, 'code', false) }, | 
|                                 phone: { show: repairBug(TABLE_KEY, 'phone', false) }, | 
|                                 email: { show: repairBug(TABLE_KEY, 'email', false) }, | 
|                                 emailVerified$: { show: repairBug(TABLE_KEY, 'emailVerified$', false) }, | 
|                                 realName: { show: repairBug(TABLE_KEY, 'realName', false) }, | 
|                                 idCard: { show: repairBug(TABLE_KEY, 'idCard', false) }, | 
|                                 birthday: { show: repairBug(TABLE_KEY, 'birthday', false) }, | 
|                                 introduction: { show: repairBug(TABLE_KEY, 'introduction', false) }, | 
|                                 createTime$: { show: repairBug(TABLE_KEY, 'createTime$', false) }, | 
|                                 updateTime$: { show: repairBug(TABLE_KEY, 'updateTime$', false) }, | 
|                                 updateBy$: { show: repairBug(TABLE_KEY, 'updateBy$', false) }, | 
|                                 memo: { show: repairBug(TABLE_KEY, 'memo', false) }, | 
|                                 option: { fixed: 'right', disable: true }, | 
|                             }, | 
|                             onChange(value) { | 
|                             }, | 
|                         }} | 
|                     /> | 
|                 </Col> | 
|             </Row> | 
|   | 
|             <Edit | 
|                 open={modalVisible} | 
|                 values={currentRow || {}} | 
|                 treeData={deptTreeData} | 
|                 onCancel={ | 
|                     () => { | 
|                         setModalVisible(false); | 
|                         setCurrentRow(undefined); | 
|                     } | 
|                 } | 
|                 onSubmit={async (values) => { | 
|                     let ok = false; | 
|                     if (values.id) { | 
|                         ok = await handleUpdate({ ...values }, intl) | 
|                     } else { | 
|                         ok = await handleSave({ ...values }, intl) | 
|                     } | 
|                     if (ok) { | 
|                         setModalVisible(false); | 
|                         setCurrentRow(undefined); | 
|                         if (actionRef.current) { | 
|                             actionRef.current.reload(); | 
|                         } | 
|                     } | 
|                 } | 
|                 } | 
|             /> | 
|   | 
|             <Pwd | 
|                 open={pwdModalVisible} | 
|                 values={currentRow || {}} | 
|                 onCancel={ | 
|                     () => { | 
|                         setPwdModalVisible(false); | 
|                         setCurrentRow(undefined); | 
|                     } | 
|                 } | 
|                 onSubmit={async (values) => { | 
|                     let ok = false; | 
|                     if (values.id) { | 
|                         ok = await handlePwd({ ...values }, intl) | 
|                     } | 
|                     if (ok) { | 
|                         setPwdModalVisible(false); | 
|                         setCurrentRow(undefined); | 
|                         if (actionRef.current) { | 
|                             actionRef.current.reload(); | 
|                         } | 
|                     } | 
|                 } | 
|                 } | 
|             /> | 
|   | 
|             <AssignRole | 
|                 open={assignModalVisible} | 
|                 values={currentRow || {}} | 
|                 onCancel={ | 
|                     () => { | 
|                         setAssignModalVisible(false); | 
|                         setCurrentRow(undefined); | 
|                     } | 
|                 } | 
|                 onSubmit={async (values) => { | 
|                     let ok = false; | 
|                     if (values.id) { | 
|                         ok = await handleUpdate({ ...values }, intl) | 
|                     } | 
|                     if (ok) { | 
|                         setAssignModalVisible(false); | 
|                         setCurrentRow(undefined); | 
|                         if (actionRef.current) { | 
|                             actionRef.current.reload(); | 
|                         } | 
|                     } | 
|                 }} | 
|             /> | 
|   | 
|         </PageContainer> | 
|     ); | 
| }; | 
|   | 
| export default Main; |