| import React, { useState, useRef, useEffect, useMemo } from "react"; | 
| import { | 
|     Edit, | 
|     SimpleForm, | 
|     FormDataConsumer, | 
|     useTranslate, | 
|     TextInput, | 
|     NumberInput, | 
|     BooleanInput, | 
|     DateInput, | 
|     SelectInput, | 
|     ReferenceInput, | 
|     ReferenceArrayInput, | 
|     AutocompleteInput, | 
|     SaveButton, | 
|     Toolbar, | 
|     Labeled, | 
|     NumberField, | 
|     required, | 
|     useRecordContext, | 
|     DeleteButton, | 
|     PasswordInput, | 
|     email, | 
| } from 'react-admin'; | 
| import { useFormContext } from 'react-hook-form'; | 
| import { Stack, Grid, Box, Typography } from '@mui/material'; | 
| import * as Common from '@/utils/common'; | 
| import { EDIT_MODE } from '@/config/setting'; | 
| import EditBaseAside from "@/page/components/EditBaseAside"; | 
| import CustomerTopToolBar from "@/page/components/EditTopToolBar"; | 
| import MemoInput from "@/page/components/MemoInput"; | 
| import StatusSelectInput from "@/page/components/StatusSelectInput"; | 
| import RolesSelect from "./RolesSelect"; | 
| import TreeSelectInput from "@/page/components/TreeSelectInput"; | 
|   | 
| const FormToolbar = () => { | 
|     const { setValue, getValues } = useFormContext(); | 
|   | 
|     return ( | 
|         <Toolbar sx={{ justifyContent: 'space-between' }}> | 
|             <SaveButton /> | 
|             <DeleteButton mutationMode="optimistic" /> | 
|         </Toolbar> | 
|     ) | 
| } | 
|   | 
| const PasswordInputContainer = () => { | 
|     const translate = useTranslate(); | 
|     const { setValue } = useFormContext(); | 
|     const record = useRecordContext(); | 
|   | 
|     useEffect(() => { | 
|         setTimeout(() => { | 
|             if (record && record.password) { | 
|                 setValue('password', ''); | 
|             } | 
|         }, 200) | 
|     }, [setValue, record]); | 
|   | 
|     return ( | 
|         <> | 
|             <Typography variant="h6" gutterBottom> | 
|                 {translate('common.edit.title.changePwd')} | 
|             </Typography> | 
|             <Stack direction='row' gap={2}> | 
|                 <PasswordInput | 
|                     label="table.field.user.password" | 
|                     source="password" | 
|                 /> | 
|                 <PasswordInput | 
|                     label="table.field.user.confirmPwd" | 
|                     source="confirmPassword" | 
|                 /> | 
|             </Stack> | 
|         </> | 
|     ) | 
| } | 
|   | 
| const UserEdit = () => { | 
|     const translate = useTranslate(); | 
|     const record = useRecordContext(); | 
|   | 
|     return ( | 
|         <SimpleForm | 
|             shouldUnregister | 
|             warnWhenUnsavedChanges | 
|             toolbar={<FormToolbar />} | 
|             mode="onTouched" | 
|             validate={(values) => { | 
|                 const errors = {}; | 
|                 if (!values.username) { | 
|                     errors.username = 'ra.validation.required'; | 
|                 } | 
|                 if (!values.nickname) { | 
|                     errors.nickname = 'ra.validation.required'; | 
|                 } | 
|                 if (!values.userRoleIds) { | 
|                     errors.userRoleIds = 'ra.validation.required'; | 
|                 } | 
|                 if (!values.email) { | 
|                 } else { | 
|                     const error = email()(values.email); | 
|                     if (error) { | 
|                         errors.email = error; | 
|                     } | 
|                 } | 
|                 if (values.password && values.password !== values.confirmPassword) { | 
|                     errors.confirmPassword = 'validate.pwdMisMatch'; | 
|                 } | 
|                 return errors; | 
|             }} | 
|         > | 
|             <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> | 
|                 <Grid item xs={12} md={8}> | 
|                     <Typography variant="h6" gutterBottom> | 
|                         {translate('common.edit.title.main')} | 
|                     </Typography> | 
|                     <Stack direction='row' gap={2}> | 
|                         <TextInput | 
|                             label="table.field.user.username" | 
|                             source="username" | 
|                             parse={v => v} | 
|                             autoFocus | 
|                             validate={required()} | 
|                         /> | 
|                         <TextInput | 
|                             label="table.field.user.nickname" | 
|                             source="nickname" | 
|                             parse={v => v} | 
|                         /> | 
|                     </Stack> | 
|                     <Stack direction='row' gap={2}> | 
|                         <SelectInput | 
|                             label="table.field.user.sex" | 
|                             source="sex" | 
|                             choices={[ | 
|                                 { id: 0, name: 'table.field.user.sexes.unknown' }, | 
|                                 { id: 1, name: 'table.field.user.sexes.male' }, | 
|                                 { id: 2, name: 'table.field.user.sexes.female' }, | 
|                             ]} | 
|                         /> | 
|                         <TextInput | 
|                             label="table.field.user.code" | 
|                             source="code" | 
|                             parse={v => v} | 
|                         /> | 
|                     </Stack> | 
|                     <Stack direction='row' gap={2}> | 
|                         <TextInput | 
|                             label="table.field.user.phone" | 
|                             source="phone" | 
|                             parse={v => v} | 
|                         /> | 
|                         <TextInput | 
|                             label="table.field.user.email" | 
|                             source="email" | 
|                             parse={v => v} | 
|                         /> | 
|                     </Stack> | 
|                     <Stack direction='row' gap={2}> | 
|                         <TextInput | 
|                             label="table.field.user.realName" | 
|                             source="realName" | 
|                             parse={v => v} | 
|                         /> | 
|                         <TextInput | 
|                             label="table.field.user.idCard" | 
|                             source="idCard" | 
|                             parse={v => v} | 
|                         /> | 
|                     </Stack> | 
|                     <Stack direction='row' gap={2}> | 
|                         <TextInput | 
|                             label="table.field.user.birthday" | 
|                             source="birthday" | 
|                             parse={v => v} | 
|                         /> | 
|                         <TextInput | 
|                             label="table.field.user.introduction" | 
|                             multiline | 
|                             source="introduction" | 
|                             parse={v => v} | 
|                         /> | 
|                     </Stack> | 
|                     <PasswordInputContainer /> | 
|                 </Grid> | 
|                 <Grid item xs={12} md={4}> | 
|                     <Typography variant="h6" gutterBottom> | 
|                         {translate('common.edit.title.common')} | 
|                     </Typography> | 
|                     <Stack direction='row' gap={2}> | 
|                         <TreeSelectInput | 
|                             label="table.field.user.deptId" | 
|                             value={record?.deptId} | 
|                             resource={'dept'} | 
|                             source="deptId" | 
|                         /> | 
|                     </Stack> | 
|                     <Stack direction='row' gap={2}> | 
|                         <RolesSelect | 
|                             label="table.field.user.role" | 
|                             source="userRoleIds" | 
|                         /> | 
|                     </Stack> | 
|                     <Stack direction='row' gap={2}> | 
|                         <StatusSelectInput /> | 
|                     </Stack> | 
|                     <Box mt="2em" /> | 
|                     <MemoInput /> | 
|                 </Grid> | 
|             </Grid> | 
|         </SimpleForm> | 
|     ) | 
| } | 
|   | 
| export default function () { | 
|     return ( | 
|         <Edit | 
|             redirect="list" | 
|             mutationMode={EDIT_MODE} | 
|             actions={<CustomerTopToolBar />} | 
|             aside={<EditBaseAside />} | 
|             transform={(data) => { | 
|                 return { | 
|                     ...data, | 
|                     roleIds: data['userRoleIds'] || [] | 
|                 }; | 
|             }} | 
|         > | 
|             <UserEdit /> | 
|         </Edit> | 
|     ) | 
| }; |