| import React, { useEffect } from 'react'; | 
| import { useTranslate } from "react-admin"; | 
| import { useForm, Controller } from 'react-hook-form'; | 
| import { | 
|     Button, | 
|     TextField, | 
|     Grid, | 
|     Box, | 
|     ToggleButton, | 
|     ToggleButtonGroup, | 
|     Typography, | 
|     Divider, | 
|     Toolbar, | 
|     useTheme, | 
|     Autocomplete, | 
|     CircularProgress, | 
| } from '@mui/material'; | 
| import CheckOutlinedIcon from '@mui/icons-material/CheckOutlined'; | 
| import RestartAltIcon from '@mui/icons-material/RestartAlt'; | 
| import useCoolHook from './useCoolHook'; | 
| import { handleControlAgv } from '../../http'; | 
|   | 
| function AgvControl(props) { | 
|     const { curAgvNo } = props; | 
|     const theme = useTheme(); | 
|     const translate = useTranslate(); | 
|   | 
|     const { control, handleSubmit, reset, watch, setValue } = useForm({ | 
|         defaultValues: { | 
|             taskMode: 'MOVE', | 
|             startCode: '', | 
|             endCode: '', | 
|             startLocNo: '', | 
|             endLocNo: '', | 
|             startStaNo: '', | 
|             endStaNo: '', | 
|         }, | 
|     }); | 
|   | 
|     const taskModes = [ | 
|         { value: 'MOVE', label: translate('page.map.insight.control.type.MOVE') }, | 
|         { value: 'TO_CHARGE', label: translate('page.map.insight.control.type.TO_CHARGE') }, | 
|         { value: 'TO_STANDBY', label: translate('page.map.insight.control.type.TO_STANDBY') }, | 
|         { value: 'LOC_TO_LOC', label: translate('page.map.insight.control.type.LOC_TO_LOC') }, | 
|         { value: 'LOC_TO_STA', label: translate('page.map.insight.control.type.LOC_TO_STA') }, | 
|         { value: 'STA_TO_LOC', label: translate('page.map.insight.control.type.STA_TO_LOC') }, | 
|         { value: 'STA_TO_STA', label: translate('page.map.insight.control.type.STA_TO_STA') }, | 
|     ]; | 
|   | 
|     useEffect(() => { | 
|         reset(); | 
|     }, [curAgvNo, reset]); | 
|   | 
|     const onSubmit = (data) => { | 
|         if (curAgvNo) { | 
|             handleControlAgv({ agvNo: curAgvNo, ...data }, () => { | 
|   | 
|             }); | 
|         } | 
|     }; | 
|   | 
|     const taskMode = watch('taskMode'); | 
|   | 
|     const showField = (field) => { | 
|         const mode = taskMode; | 
|         switch (field) { | 
|             case 'startCode': | 
|                 return false; | 
|             case 'endCode': | 
|                 return ['MOVE'].includes(mode); | 
|             case 'startLocNo': | 
|                 return ['LOC_TO_LOC', 'LOC_TO_STA'].includes(mode); | 
|             case 'endLocNo': | 
|                 return ['LOC_TO_LOC', 'STA_TO_LOC'].includes(mode); | 
|             case 'startStaNo': | 
|                 return ['STA_TO_LOC', 'STA_TO_STA'].includes(mode); | 
|             case 'endStaNo': | 
|                 return ['LOC_TO_STA', 'STA_TO_STA'].includes(mode); | 
|             default: | 
|                 return false; | 
|         } | 
|     }; | 
|   | 
|     const { | 
|         options: endCodeOptions, | 
|         setInputValue: setEndCodeInputValue, | 
|         resetInput: resetEndCodeInput, | 
|     } = useCoolHook('/code/page', 'data'); | 
|   | 
|     const { | 
|         options: startLocOptions, | 
|         setInputValue: setStartLocInputValue, | 
|         resetInput: resetStartLocInput, | 
|     } = useCoolHook('/loc/page', 'locNo'); | 
|   | 
|     const { | 
|         options: endLocOptions, | 
|         setInputValue: setEndLocInputValue, | 
|         resetInput: resetEndLocInput, | 
|     } = useCoolHook('/loc/page', 'locNo'); | 
|   | 
|     const { | 
|         options: startStaOptions, | 
|         setInputValue: setStartStaInputValue, | 
|         resetInput: resetStartStaInput, | 
|     } = useCoolHook('/sta/page', 'staNo'); | 
|   | 
|     const { | 
|         options: endStaOptions, | 
|         setInputValue: setEndStaInputValue, | 
|         resetInput: resetEndStaInput, | 
|     } = useCoolHook('/sta/page', 'staNo'); | 
|   | 
|     useEffect(() => { | 
|         const fieldsToClear = ['endCode', 'startLocNo', 'endLocNo', 'startStaNo', 'endStaNo']; | 
|   | 
|         fieldsToClear.forEach(field => { | 
|             if (!showField(field)) { | 
|                 setValue(field, ''); | 
|   | 
|                 switch (field) { | 
|                     case 'endCode': | 
|                         resetEndCodeInput(); | 
|                         break; | 
|                     case 'startLocNo': | 
|                         resetStartLocInput(); | 
|                         break; | 
|                     case 'endLocNo': | 
|                         resetEndLocInput(); | 
|                         break; | 
|                     case 'startStaNo': | 
|                         resetStartStaInput(); | 
|                         break; | 
|                     case 'endStaNo': | 
|                         resetEndStaInput(); | 
|                         break; | 
|                     default: | 
|                         break; | 
|                 } | 
|             } | 
|         }); | 
|     }, [ | 
|         taskMode, | 
|         setValue, | 
|         showField, | 
|         resetEndCodeInput, | 
|         resetStartLocInput, | 
|         resetEndLocInput, | 
|         resetStartStaInput, | 
|         resetEndStaInput | 
|     ]); | 
|     return ( | 
|         <> | 
|             <form onSubmit={handleSubmit(onSubmit)}> | 
|                 <Box display="flex" flexDirection="row" height="100%" justifyContent="space-around" p={2}> | 
|                     {/* left */} | 
|                     <Box | 
|                         position="relative" | 
|                         width="35%" | 
|                         height="100%" | 
|                     > | 
|                         <Controller | 
|                             name="taskMode" | 
|                             control={control} | 
|                             render={({ field }) => ( | 
|                                 <ToggleButtonGroup | 
|                                     {...field} | 
|                                     orientation="vertical" | 
|                                     exclusive | 
|                                     fullWidth | 
|                                     color="primary" | 
|                                     onChange={(e, value) => { | 
|                                         if (value !== null) { | 
|                                             field.onChange(value); | 
|                                         } | 
|                                     }} | 
|                                 > | 
|                                     {taskModes.map((mode) => ( | 
|                                         <ToggleButton key={mode.value} value={mode.value} sx={{ textAlign: 'left' }}> | 
|                                             {mode.label} | 
|                                         </ToggleButton> | 
|                                     ))} | 
|                                 </ToggleButtonGroup> | 
|                             )} | 
|                         /> | 
|                     </Box> | 
|   | 
|                     {/* right */} | 
|                     <Box | 
|                         position="relative" | 
|                         width="55%" | 
|                         height="100%" | 
|                     > | 
|                         <Grid container spacing={2}> | 
|                             {showField('startCode') && ( | 
|                                 <Grid item xs={12}> | 
|                                     <Controller | 
|                                         name="startCode" | 
|                                         control={control} | 
|                                         rules={{ required: translate('ra.validation.required') }} | 
|                                         render={({ field, fieldState }) => ( | 
|                                             <TextField | 
|                                                 {...field} | 
|                                                 fullWidth | 
|                                                 label={translate('page.map.insight.control.startCode')} | 
|                                                 error={!!fieldState.error} | 
|                                                 helperText={fieldState.error?.message} | 
|                                             /> | 
|                                         )} | 
|                                     /> | 
|                                 </Grid> | 
|                             )} | 
|   | 
|                             {showField('endCode') && ( | 
|                                 <Grid item xs={12}> | 
|                                     <Controller | 
|                                         name="endCode" | 
|                                         control={control} | 
|                                         rules={{ required: translate('ra.validation.required') }} | 
|                                         render={({ field, fieldState }) => { | 
|                                             const selectedOption = endCodeOptions.find(option => option.id === field.value) || null; | 
|                                             return ( | 
|                                                 <Autocomplete | 
|                                                     options={endCodeOptions} | 
|                                                     getOptionLabel={(option) => option.label} | 
|                                                     isOptionEqualToValue={(option, value) => option.id === value.id} | 
|                                                     value={selectedOption} | 
|                                                     onInputChange={(event, value) => { | 
|                                                         setEndCodeInputValue(value); | 
|                                                     }} | 
|                                                     onChange={(event, value) => { | 
|                                                         field.onChange(value ? value.id : null); | 
|                                                     }} | 
|                                                     renderInput={(params) => ( | 
|                                                         <TextField | 
|                                                             {...params} | 
|                                                             label={translate('page.map.insight.control.endCode')} | 
|                                                             error={!!fieldState.error} | 
|                                                             helperText={fieldState.error?.message} | 
|                                                         /> | 
|                                                     )} | 
|                                                 /> | 
|                                             ); | 
|                                         }} | 
|                                     /> | 
|                                 </Grid> | 
|                             )} | 
|   | 
|                             {showField('startLocNo') && ( | 
|                                 <Grid item xs={12}> | 
|                                     <Controller | 
|                                         name="startLocNo" | 
|                                         control={control} | 
|                                         rules={{ required: translate('ra.validation.required') }} | 
|                                         render={({ field, fieldState }) => { | 
|                                             const selectedOption = startLocOptions.find(option => option.id === field.value) || null; | 
|                                             return ( | 
|                                                 <Autocomplete | 
|                                                     options={startLocOptions} | 
|                                                     getOptionLabel={(option) => option.label} | 
|                                                     isOptionEqualToValue={(option, value) => option.id === value.id} | 
|                                                     value={selectedOption} | 
|                                                     onInputChange={(event, value) => { | 
|                                                         setStartLocInputValue(value); | 
|                                                     }} | 
|                                                     onChange={(event, value) => { | 
|                                                         field.onChange(value ? value.id : null); | 
|                                                     }} | 
|                                                     renderInput={(params) => ( | 
|                                                         <TextField | 
|                                                             {...params} | 
|                                                             label={translate('page.map.insight.control.startLoc')} | 
|                                                             error={!!fieldState.error} | 
|                                                             helperText={fieldState.error?.message} | 
|                                                         /> | 
|                                                     )} | 
|                                                 /> | 
|                                             ); | 
|                                         }} | 
|                                     /> | 
|                                 </Grid> | 
|                             )} | 
|   | 
|                             {showField('startStaNo') && ( | 
|                                 <Grid item xs={12}> | 
|                                     <Controller | 
|                                         name="startStaNo" | 
|                                         control={control} | 
|                                         rules={{ required: translate('ra.validation.required') }} | 
|                                         render={({ field, fieldState }) => { | 
|                                             const selectedOption = startStaOptions.find(option => option.id === field.value) || null; | 
|                                             return ( | 
|                                                 <Autocomplete | 
|                                                     options={startStaOptions} | 
|                                                     getOptionLabel={(option) => option.label} | 
|                                                     isOptionEqualToValue={(option, value) => option.id === value.id} | 
|                                                     value={selectedOption} | 
|                                                     onInputChange={(event, value) => { | 
|                                                         setStartStaInputValue(value); | 
|                                                     }} | 
|                                                     onChange={(event, value) => { | 
|                                                         field.onChange(value ? value.id : null); | 
|                                                     }} | 
|                                                     renderInput={(params) => ( | 
|                                                         <TextField | 
|                                                             {...params} | 
|                                                             label={translate('page.map.insight.control.startSta')} | 
|                                                             error={!!fieldState.error} | 
|                                                             helperText={fieldState.error?.message} | 
|                                                         /> | 
|                                                     )} | 
|                                                 /> | 
|                                             ); | 
|                                         }} | 
|                                     /> | 
|                                 </Grid> | 
|                             )} | 
|   | 
|                             {showField('endLocNo') && ( | 
|                                 <Grid item xs={12}> | 
|                                     <Controller | 
|                                         name="endLocNo" | 
|                                         control={control} | 
|                                         rules={{ required: translate('ra.validation.required') }} | 
|                                         render={({ field, fieldState }) => { | 
|                                             const selectedOption = endLocOptions.find(option => option.id === field.value) || null; | 
|                                             return ( | 
|                                                 <Autocomplete | 
|                                                     options={endLocOptions} | 
|                                                     getOptionLabel={(option) => option.label} | 
|                                                     isOptionEqualToValue={(option, value) => option.id === value.id} | 
|                                                     value={selectedOption} | 
|                                                     onInputChange={(event, value) => { | 
|                                                         setEndLocInputValue(value); | 
|                                                     }} | 
|                                                     onChange={(event, value) => { | 
|                                                         field.onChange(value ? value.id : null); | 
|                                                     }} | 
|                                                     renderInput={(params) => ( | 
|                                                         <TextField | 
|                                                             {...params} | 
|                                                             label={translate('page.map.insight.control.endLoc')} | 
|                                                             error={!!fieldState.error} | 
|                                                             helperText={fieldState.error?.message} | 
|                                                         /> | 
|                                                     )} | 
|                                                 /> | 
|                                             ); | 
|                                         }} | 
|                                     /> | 
|                                 </Grid> | 
|                             )} | 
|   | 
|                             {showField('endStaNo') && ( | 
|                                 <Grid item xs={12}> | 
|                                     <Controller | 
|                                         name="endStaNo" | 
|                                         control={control} | 
|                                         rules={{ required: translate('ra.validation.required') }} | 
|                                         render={({ field, fieldState }) => { | 
|                                             const selectedOption = endStaOptions.find(option => option.id === field.value) || null; | 
|                                             return ( | 
|                                                 <Autocomplete | 
|                                                     options={endStaOptions} | 
|                                                     getOptionLabel={(option) => option.label} | 
|                                                     isOptionEqualToValue={(option, value) => option.id === value.id} | 
|                                                     value={selectedOption} | 
|                                                     onInputChange={(event, value) => { | 
|                                                         setEndStaInputValue(value); | 
|                                                     }} | 
|                                                     onChange={(event, value) => { | 
|                                                         field.onChange(value ? value.id : null); | 
|                                                     }} | 
|                                                     renderInput={(params) => ( | 
|                                                         <TextField | 
|                                                             {...params} | 
|                                                             label={translate('page.map.insight.control.endSta')} | 
|                                                             error={!!fieldState.error} | 
|                                                             helperText={fieldState.error?.message} | 
|                                                         /> | 
|                                                     )} | 
|                                                 /> | 
|                                             ); | 
|                                         }} | 
|                                     /> | 
|                                 </Grid> | 
|                             )} | 
|   | 
|                         </Grid> | 
|                     </Box> | 
|                 </Box> | 
|                 <Box pl={5} pr={5}> | 
|                     <Divider sx={{ | 
|                         marginBottom: '16px' | 
|                     }} /> | 
|                     <Toolbar sx={{ | 
|                         display: 'flex', | 
|                         justifyContent: 'space-between', | 
|                         minHeight: { sm: 0 }, | 
|                     }}> | 
|                         <Button | 
|                             variant="outlined" | 
|                             color="primary" | 
|                             type="submit" | 
|                             sx={{ | 
|                                 borderColor: theme => theme.palette.primary.main, | 
|                                 color: theme => theme.palette.primary.main, | 
|                             }} | 
|                             startIcon={ | 
|                                 <CheckOutlinedIcon sx={{ color: theme => theme.palette.primary.main }} /> | 
|                             } | 
|                         > | 
|                             {translate('ra.action.confirm')} | 
|                         </Button> | 
|   | 
|                         <Button | 
|                             variant="outlined" | 
|                             color="primary" | 
|                             onClick={() => { | 
|                                 reset(); | 
|                             }} | 
|                             sx={{ | 
|                                 borderColor: theme => theme.palette.warning.main, | 
|                                 color: theme => theme.palette.warning.main, | 
|                             }} | 
|                             startIcon={ | 
|                                 <RestartAltIcon sx={{ color: theme => theme.palette.warning.main }} /> | 
|                             } | 
|                         > | 
|                             {translate('common.action.reset')} | 
|                         </Button> | 
|                     </Toolbar> | 
|                 </Box> | 
|             </form> | 
|         </> | 
|     ); | 
| } | 
|   | 
| export default AgvControl; |