|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React, { useState, useRef } from 'react'; |
|
|
import { API, showError, showSuccess } from '../../../../helpers'; |
|
|
import { useIsMobile } from '../../../../hooks/common/useIsMobile'; |
|
|
import { |
|
|
Button, |
|
|
SideSheet, |
|
|
Space, |
|
|
Spin, |
|
|
Typography, |
|
|
Card, |
|
|
Tag, |
|
|
Avatar, |
|
|
Form, |
|
|
Row, |
|
|
Col, |
|
|
} from '@douyinfe/semi-ui'; |
|
|
import { IconSave, IconClose, IconUserAdd } from '@douyinfe/semi-icons'; |
|
|
import { useTranslation } from 'react-i18next'; |
|
|
|
|
|
const { Text, Title } = Typography; |
|
|
|
|
|
const AddUserModal = (props) => { |
|
|
const { t } = useTranslation(); |
|
|
const formApiRef = useRef(null); |
|
|
const [loading, setLoading] = useState(false); |
|
|
const isMobile = useIsMobile(); |
|
|
|
|
|
const getInitValues = () => ({ |
|
|
username: '', |
|
|
display_name: '', |
|
|
password: '', |
|
|
remark: '', |
|
|
}); |
|
|
|
|
|
const submit = async (values) => { |
|
|
setLoading(true); |
|
|
const res = await API.post(`/api/user/`, values); |
|
|
const { success, message } = res.data; |
|
|
if (success) { |
|
|
showSuccess(t('用户账户创建成功!')); |
|
|
formApiRef.current?.setValues(getInitValues()); |
|
|
props.refresh(); |
|
|
props.handleClose(); |
|
|
} else { |
|
|
showError(message); |
|
|
} |
|
|
setLoading(false); |
|
|
}; |
|
|
|
|
|
const handleCancel = () => { |
|
|
props.handleClose(); |
|
|
}; |
|
|
|
|
|
return ( |
|
|
<> |
|
|
<SideSheet |
|
|
placement={'left'} |
|
|
title={ |
|
|
<Space> |
|
|
<Tag color='green' shape='circle'> |
|
|
{t('新建')} |
|
|
</Tag> |
|
|
<Title heading={4} className='m-0'> |
|
|
{t('添加用户')} |
|
|
</Title> |
|
|
</Space> |
|
|
} |
|
|
bodyStyle={{ padding: '0' }} |
|
|
visible={props.visible} |
|
|
width={isMobile ? '100%' : 600} |
|
|
footer={ |
|
|
<div className='flex justify-end bg-white'> |
|
|
<Space> |
|
|
<Button |
|
|
theme='solid' |
|
|
onClick={() => formApiRef.current?.submitForm()} |
|
|
icon={<IconSave />} |
|
|
loading={loading} |
|
|
> |
|
|
{t('提交')} |
|
|
</Button> |
|
|
<Button |
|
|
theme='light' |
|
|
type='primary' |
|
|
onClick={handleCancel} |
|
|
icon={<IconClose />} |
|
|
> |
|
|
{t('取消')} |
|
|
</Button> |
|
|
</Space> |
|
|
</div> |
|
|
} |
|
|
closeIcon={null} |
|
|
onCancel={() => handleCancel()} |
|
|
> |
|
|
<Spin spinning={loading}> |
|
|
<Form |
|
|
initValues={getInitValues()} |
|
|
getFormApi={(api) => (formApiRef.current = api)} |
|
|
onSubmit={submit} |
|
|
onSubmitFail={(errs) => { |
|
|
const first = Object.values(errs)[0]; |
|
|
if (first) showError(Array.isArray(first) ? first[0] : first); |
|
|
formApiRef.current?.scrollToError(); |
|
|
}} |
|
|
> |
|
|
<div className='p-2'> |
|
|
<Card className='!rounded-2xl shadow-sm border-0'> |
|
|
<div className='flex items-center mb-2'> |
|
|
<Avatar size='small' color='blue' className='mr-2 shadow-md'> |
|
|
<IconUserAdd size={16} /> |
|
|
</Avatar> |
|
|
<div> |
|
|
<Text className='text-lg font-medium'>{t('用户信息')}</Text> |
|
|
<div className='text-xs text-gray-600'> |
|
|
{t('创建新用户账户')} |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<Row gutter={12}> |
|
|
<Col span={24}> |
|
|
<Form.Input |
|
|
field='username' |
|
|
label={t('用户名')} |
|
|
placeholder={t('请输入用户名')} |
|
|
rules={[{ required: true, message: t('请输入用户名') }]} |
|
|
showClear |
|
|
/> |
|
|
</Col> |
|
|
<Col span={24}> |
|
|
<Form.Input |
|
|
field='display_name' |
|
|
label={t('显示名称')} |
|
|
placeholder={t('请输入显示名称')} |
|
|
showClear |
|
|
/> |
|
|
</Col> |
|
|
<Col span={24}> |
|
|
<Form.Input |
|
|
field='password' |
|
|
label={t('密码')} |
|
|
type='password' |
|
|
placeholder={t('请输入密码')} |
|
|
rules={[{ required: true, message: t('请输入密码') }]} |
|
|
showClear |
|
|
/> |
|
|
</Col> |
|
|
<Col span={24}> |
|
|
<Form.Input |
|
|
field='remark' |
|
|
label={t('备注')} |
|
|
placeholder={t('请输入备注(仅管理员可见)')} |
|
|
showClear |
|
|
/> |
|
|
</Col> |
|
|
</Row> |
|
|
</Card> |
|
|
</div> |
|
|
</Form> |
|
|
</Spin> |
|
|
</SideSheet> |
|
|
</> |
|
|
); |
|
|
}; |
|
|
|
|
|
export default AddUserModal; |
|
|
|