import * as React from 'react'; import PropTypes from 'prop-types'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Checkbox from '@mui/material/Checkbox'; import FormControl from '@mui/material/FormControl'; import FormControlLabel from '@mui/material/FormControlLabel'; import FormGroup from '@mui/material/FormGroup'; import FormHelperText from '@mui/material/FormHelperText'; import Grid from '@mui/material/Grid'; import InputLabel from '@mui/material/InputLabel'; import MenuItem from '@mui/material/MenuItem'; import Select from '@mui/material/Select'; import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import { useNavigate } from 'react-router'; import dayjs from 'dayjs'; function EmployeeForm(props) { const { formState, onFieldChange, onSubmit, onReset, submitButtonLabel, backButtonPath, } = props; const formValues = formState.values; const formErrors = formState.errors; const navigate = useNavigate(); const [isSubmitting, setIsSubmitting] = React.useState(false); const handleSubmit = React.useCallback( async (event) => { event.preventDefault(); setIsSubmitting(true); try { await onSubmit(formValues); } finally { setIsSubmitting(false); } }, [formValues, onSubmit], ); const handleTextFieldChange = React.useCallback( (event) => { onFieldChange(event.target.name, event.target.value); }, [onFieldChange], ); const handleNumberFieldChange = React.useCallback( (event) => { onFieldChange(event.target.name, Number(event.target.value)); }, [onFieldChange], ); const handleCheckboxFieldChange = React.useCallback( (event, checked) => { onFieldChange(event.target.name, checked); }, [onFieldChange], ); const handleDateFieldChange = React.useCallback( (fieldName) => (value) => { if (value?.isValid()) { onFieldChange(fieldName, value.toISOString() ?? null); } else if (formValues[fieldName]) { onFieldChange(fieldName, null); } }, [formValues, onFieldChange], ); const handleSelectFieldChange = React.useCallback( (event) => { onFieldChange(event.target.name, event.target.value); }, [onFieldChange], ); const handleReset = React.useCallback(() => { if (onReset) { onReset(formValues); } }, [formValues, onReset]); const handleBack = React.useCallback(() => { navigate(backButtonPath ?? '/employees'); }, [navigate, backButtonPath]); return ( Department {formErrors.role ?? ' '} } label="Full-time" /> {formErrors.isFullTime ?? ' '} ); } EmployeeForm.propTypes = { backButtonPath: PropTypes.string, formState: PropTypes.shape({ errors: PropTypes.shape({ age: PropTypes.string, isFullTime: PropTypes.string, joinDate: PropTypes.string, name: PropTypes.string, role: PropTypes.string, }).isRequired, values: PropTypes.shape({ age: PropTypes.number, isFullTime: PropTypes.bool, joinDate: PropTypes.string, name: PropTypes.string, role: PropTypes.oneOf(['Development', 'Finance', 'Market']), }).isRequired, }).isRequired, onFieldChange: PropTypes.func.isRequired, onReset: PropTypes.func, onSubmit: PropTypes.func.isRequired, submitButtonLabel: PropTypes.string.isRequired, }; export default EmployeeForm;