import * as React from 'react'; 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, { SelectChangeEvent, SelectProps } 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, { Dayjs } from 'dayjs'; import type { Employee } from '../data/employees'; export interface EmployeeFormState { values: Partial>; errors: Partial>; } export type FormFieldValue = string | string[] | number | boolean | File | null; export interface EmployeeFormProps { formState: EmployeeFormState; onFieldChange: ( name: keyof EmployeeFormState['values'], value: FormFieldValue, ) => void; onSubmit: (formValues: Partial) => Promise; onReset?: (formValues: Partial) => void; submitButtonLabel: string; backButtonPath?: string; } export default function EmployeeForm(props: EmployeeFormProps) { 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: React.FormEvent) => { event.preventDefault(); setIsSubmitting(true); try { await onSubmit(formValues); } finally { setIsSubmitting(false); } }, [formValues, onSubmit], ); const handleTextFieldChange = React.useCallback( (event: React.ChangeEvent) => { onFieldChange( event.target.name as keyof EmployeeFormState['values'], event.target.value, ); }, [onFieldChange], ); const handleNumberFieldChange = React.useCallback( (event: React.ChangeEvent) => { onFieldChange( event.target.name as keyof EmployeeFormState['values'], Number(event.target.value), ); }, [onFieldChange], ); const handleCheckboxFieldChange = React.useCallback( (event: React.ChangeEvent, checked: boolean) => { onFieldChange(event.target.name as keyof EmployeeFormState['values'], checked); }, [onFieldChange], ); const handleDateFieldChange = React.useCallback( (fieldName: keyof EmployeeFormState['values']) => (value: Dayjs | null) => { if (value?.isValid()) { onFieldChange(fieldName, value.toISOString() ?? null); } else if (formValues[fieldName]) { onFieldChange(fieldName, null); } }, [formValues, onFieldChange], ); const handleSelectFieldChange = React.useCallback( (event: SelectChangeEvent) => { onFieldChange( event.target.name as keyof EmployeeFormState['values'], 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 ?? ' '} ); }