blob: a3dcce08b7d97093136942ea454b41cfdd8048fd [file] [log] [blame]
import React, { useEffect, useState } from 'react';
import { Checkbox, Col, Form, Modal, Row, Tree } from 'antd';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Key, ProForm, ProFormDigit, ProFormSelect, ProFormText } from '@ant-design/pro-components';
import { DataNode } from 'antd/es/tree';
import { CheckboxValueType } from 'antd/es/checkbox/Group';
/* *
*
* @author whiteshader@163.com
* @datetime 2023/02/06
*
* */
export type FormValueType = any & Partial<API.System.Dept>;
export type DataScopeFormProps = {
onCancel: (flag?: boolean, formVals?: FormValueType) => void;
onSubmit: (values: FormValueType) => Promise<void>;
open: boolean;
values: Partial<API.System.Role>;
deptTree: DataNode[];
deptCheckedKeys: string[];
};
const DataScopeForm: React.FC<DataScopeFormProps> = (props) => {
const [form] = Form.useForm();
const { deptTree, deptCheckedKeys } = props;
const [dataScopeType, setDataScopeType] = useState<string | undefined>('1');
const [deptIds, setDeptIds] = useState<string[] | {checked: string[], halfChecked: string[]}>([]);
const [deptTreeExpandKey, setDeptTreeExpandKey] = useState<Key[]>([]);
const [checkStrictly, setCheckStrictly] = useState<boolean>(true);
useEffect(() => {
setDeptIds(deptCheckedKeys);
form.resetFields();
form.setFieldsValue({
roleId: props.values.roleId,
roleName: props.values.roleName,
roleKey: props.values.roleKey,
dataScope: props.values.dataScope,
});
setDataScopeType(props.values.dataScope);
}, [props.values]);
const intl = useIntl();
const handleOk = () => {
form.submit();
};
const handleCancel = () => {
props.onCancel();
};
const handleFinish = async (values: Record<string, any>) => {
props.onSubmit({ ...values, deptIds } as FormValueType);
};
const getAllDeptNode = (node: DataNode[]) => {
let keys: any[] = [];
node.forEach(value => {
keys.push(value.key);
if(value.children) {
keys = keys.concat(getAllDeptNode(value.children));
}
});
return keys;
}
const deptAllNodes = getAllDeptNode(deptTree);
const onDeptOptionChange = (checkedValues: CheckboxValueType[]) => {
if(checkedValues.includes('deptExpand')) {
setDeptTreeExpandKey(deptAllNodes);
} else {
setDeptTreeExpandKey([]);
}
if(checkedValues.includes('deptNodeAll')) {
setDeptIds(deptAllNodes);
} else {
setDeptIds([]);
}
if(checkedValues.includes('deptCheckStrictly')) {
setCheckStrictly(false);
} else {
setCheckStrictly(true);
}
};
return (
<Modal
width={640}
title={intl.formatMessage({
id: 'system.user.auth.role',
defaultMessage: '分配角色',
})}
open={props.open}
destroyOnClose
forceRender
onOk={handleOk}
onCancel={handleCancel}
>
<ProForm
form={form}
grid={true}
layout="horizontal"
onFinish={handleFinish}
initialValues={{
login_password: '',
confirm_password: '',
}}
>
<ProFormDigit
name="roleId"
label={intl.formatMessage({
id: 'system.role.role_id',
defaultMessage: '角色编号',
})}
colProps={{ md: 12, xl: 12 }}
placeholder="请输入角色编号"
disabled
hidden={true}
rules={[
{
required: false,
message: <FormattedMessage id="请输入角色编号!" defaultMessage="请输入角色编号!" />,
},
]}
/>
<ProFormText
name="roleName"
label={intl.formatMessage({
id: 'system.role.role_name',
defaultMessage: '角色名称',
})}
disabled
placeholder="请输入角色名称"
rules={[
{
required: true,
message: <FormattedMessage id="请输入角色名称!" defaultMessage="请输入角色名称!" />,
},
]}
/>
<ProFormText
name="roleKey"
label={intl.formatMessage({
id: 'system.role.role_key',
defaultMessage: '权限字符串',
})}
disabled
placeholder="请输入角色权限字符串"
rules={[
{
required: true,
message: <FormattedMessage id="请输入角色权限字符串!" defaultMessage="请输入角色权限字符串!" />,
},
]}
/>
<ProFormSelect
name="dataScope"
label='权限范围'
initialValue={'1'}
placeholder="请输入用户性别"
valueEnum={{
"1": "全部数据权限",
"2": "自定数据权限",
"3": "本部门数据权限",
"4": "本部门及以下数据权限",
"5": "仅本人数据权限"
}}
rules={[
{
required: true,
},
]}
fieldProps={{
onChange: (value) => {
setDataScopeType(value);
},
}}
/>
<ProForm.Item
name="deptIds"
label={intl.formatMessage({
id: 'system.role.auth',
defaultMessage: '菜单权限',
})}
required={dataScopeType === '1'}
hidden={dataScopeType !== '1'}
>
<Row gutter={[16, 16]}>
<Col md={24}>
<Checkbox.Group
options={[
{ label: '展开/折叠', value: 'deptExpand' },
{ label: '全选/全不选', value: 'deptNodeAll' },
// { label: '父子联动', value: 'deptCheckStrictly' },
]}
onChange={onDeptOptionChange} />
</Col>
<Col md={24}>
<Tree
checkable={true}
checkStrictly={checkStrictly}
expandedKeys={deptTreeExpandKey}
treeData={deptTree}
checkedKeys={deptIds}
defaultCheckedKeys={deptCheckedKeys}
onCheck={(checkedKeys: any, checkInfo: any) => {
console.log(checkedKeys, checkInfo);
if(checkStrictly) {
return setDeptIds(checkedKeys.checked);
} else {
return setDeptIds({checked: checkedKeys, halfChecked: checkInfo.halfCheckedKeys});
}
}}
onExpand={(expandedKeys: Key[]) => {
setDeptTreeExpandKey(deptTreeExpandKey.concat(expandedKeys));
}}
/>
</Col>
</Row>
</ProForm.Item>
</ProForm>
</Modal>
);
};
export default DataScopeForm;