From 4e621eb19e03c2de50a7efeb2e7b4adac6faa294 Mon Sep 17 00:00:00 2001 From: Wikzyy Date: Thu, 8 May 2025 15:06:05 +0700 Subject: [PATCH] fix alert empty validation on manage menu --- .../menu/manage-menu/blocks/AddDIalog.tsx | 252 +++++++++--------- .../menu/manage-menu/blocks/EditDialog.tsx | 250 ++++++++--------- src/pages/menu/manage-menu/blocks/Types.ts | 49 ++++ 3 files changed, 281 insertions(+), 270 deletions(-) create mode 100644 src/pages/menu/manage-menu/blocks/Types.ts diff --git a/src/pages/menu/manage-menu/blocks/AddDIalog.tsx b/src/pages/menu/manage-menu/blocks/AddDIalog.tsx index 70d2f69..5ba8343 100644 --- a/src/pages/menu/manage-menu/blocks/AddDIalog.tsx +++ b/src/pages/menu/manage-menu/blocks/AddDIalog.tsx @@ -23,41 +23,24 @@ import { } from '@/components/ui/select'; import { doSaveLogActivity } from '@/actions/GlobalActions'; import { RefreshCw } from 'lucide-react'; +import { initialStateMenu, validateFormsMenu } from './Types'; +import { NumericFormat } from 'react-number-format'; const API_URL = apiConfig.service_dashboard; const AddDialog = () => { const { showAddDialog, handleAddDialog, parents, selectedMenu } = useManageMenusContext(); const { reload } = useDataGrid(); const { PostData } = useCallApi(); - const [open, setOpen] = useState(false); - const [alert, setAlert] = useState({ - show: false, - message: '' - }); - const initialState = { - module: '', - name: '', - link: '', - id_parent: '', - order_number: 0, - icon: '', - status: '' - }; - const [formField, setFormField] = useState(initialState); + const [errors, setErrors] = useState>({}); + + const [formField, setFormField] = useState(initialStateMenu); const [isSubmitting, setIsSubmitting] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); - if ( - formField.module.trim() === '' || - formField.name.trim() === '' || - formField.link.trim() === '' || - formField.order_number === 0 || - formField.status.trim() === '' - ) { - setAlert({ show: true, message: 'Please fill in all required fields.' }); + if (!validateFormsMenu(formField, setErrors)) { setIsSubmitting(false); return; } @@ -78,32 +61,27 @@ const AddDialog = () => { doSaveLogActivity(createActivity); reload(); } else { - toast.error('Failed Create Menu'); - setAlert({ show: true, message: response?.message }); + toast.error(response?.message); } } catch (error) { toast.error('Something went wrong, please try again'); } finally { setIsSubmitting(false); + resetForm(); } - - setAlert({ show: false, message: '' }); }; const handleAddDialogChange = (open: boolean) => { handleAddDialog(open); - if(!open) { + if (!open) { resetForm(); } - } + }; const resetForm = () => { - setFormField({ - ...initialState, - status: formField.status - }); - setAlert({ show: false, message: '' }); + setFormField(initialStateMenu); + setErrors({}); }; return ( @@ -115,126 +93,134 @@ const AddDialog = () => {
- {alert.show && ( - -

{alert.message}

-
- )} -
-
- - setFormField({ ...formField, module: e.target.value })} - /> -
+ {/*
*/} + + { + setFormField({ ...formField, module: e.target.value }); + setErrors({ ...errors, module: '' }); + }} + /> + {/*
*/} + {errors.module && ( + {errors.module} + )}
-
- - setFormField({ ...formField, name: e.target.value })} - /> -
+ + { + setFormField({ ...formField, name: e.target.value }); + setErrors({ ...errors, name: '' }); + }} + /> + + {errors.name && {errors.name}}
-
- - setFormField({ ...formField, link: e.target.value })} - /> -
+ + { + setFormField({ ...formField, link: e.target.value }); + setErrors({ ...errors, link: '' }); + }} + /> + {errors.link && {errors.link}}
-
- - -
+ +
-
- - { - const value = parseInt(e.target.value, 10); - setFormField({ ...formField, order_number: isNaN(value) ? 0 : value }); - }} - /> -
+ + + setFormField({ ...formField, order_number: e.floatValue ?? null }) + } + />
-
- - setFormField({ ...formField, name: e.target.value })} - /> -
+ + { + setFormField({ ...formField, icon: e.target.value }); + setErrors({ ...errors, icon: '' }); + }} + />
-
- - -
+ + + {errors.status && ( + {errors.status} + )}
diff --git a/src/pages/menu/manage-menu/blocks/EditDialog.tsx b/src/pages/menu/manage-menu/blocks/EditDialog.tsx index 44d9a19..f4552f9 100644 --- a/src/pages/menu/manage-menu/blocks/EditDialog.tsx +++ b/src/pages/menu/manage-menu/blocks/EditDialog.tsx @@ -12,7 +12,6 @@ import { DialogHeader, DialogTitle } from '@/components/ui/dialog'; -import { FormControl, NativeSelect } from '@mui/material'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { @@ -23,6 +22,8 @@ import { SelectValue } from '@/components/ui/select'; import { doSaveLogActivity } from '@/actions/GlobalActions'; +import { initialStateMenu, validateFormsMenu } from './Types'; +import { NumericFormat } from 'react-number-format'; const API_URL = apiConfig.service_dashboard; @@ -31,36 +32,15 @@ const EditDialog = () => { useManageMenusContext(); const { reload } = useDataGrid(); const { PutData } = useCallApi(); - const [open, setOpen] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); - const [alert, setAlert] = useState({ - show: false, - message: '' - }); - const initialState = { - id: '', - module: '', - name: '', - link: '', - id_parent: '', - order_number: 0, - icon: '', - status: '' - }; + const [errors, setErrors] = useState>({}); const handleUpdate = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); - if ( - selectedMenu.module === '' || - selectedMenu.name === '' || - selectedMenu.link === '' || - selectedMenu.id_parent === '' || - selectedMenu.order_number === 0 || - selectedMenu.status === '' - ) { - setAlert({ show: true, message: 'Please fill in all required fields.' }); + if (!validateFormsMenu(selectedMenu, setErrors)) { + setIsSubmitting(false); return; } @@ -82,21 +62,19 @@ const EditDialog = () => { doSaveLogActivity(createActivity); reload(); } else { - toast.error('Failed Update Menu'); - setAlert({ show: true, message: response?.message }); + toast.error(response?.message); } } catch (error) { toast.error('Something went wrong, please trt again.'); } finally { setIsSubmitting(false); + setErrors({}); } - - setAlert({ show: false, message: '' }); }; const resetForm = () => { - setSelectedMenu(initialState); - setAlert({ show: false, message: '' }); + setSelectedMenu(initialStateMenu); + setErrors({}); }; return ( @@ -108,133 +86,131 @@ const EditDialog = () => {
- {alert.show && ( - -

{alert.message}

-
- )} -
-
- - setSelectedMenu({ ...selectedMenu, module: e.target.value })} - /> -
+ {/*
*/} + + { + setSelectedMenu({ ...selectedMenu, module: e.target.value }); + setErrors({ ...errors, module: '' }); + }} + /> + {errors.module && ( + {errors.module} + )} + {/*
*/}
-
- - setSelectedMenu({ ...selectedMenu, name: e.target.value })} - /> -
+ + { + setSelectedMenu({ ...selectedMenu, name: e.target.value }); + setErrors({ ...errors, name: '' }); + }} + /> + {errors.name && {errors.name}}
-
- - setSelectedMenu({ ...selectedMenu, link: e.target.value })} - /> -
+ + setSelectedMenu({ ...selectedMenu, link: e.target.value })} + /> + {errors.link && {errors.link}}
-
- - -
+ + + {errors.id_parent && ( + {errors.id_parent} + )}
-
- - { - const value = parseInt(e.target.value, 10); - setSelectedMenu({ - ...selectedMenu, - order_number: isNaN(value) ? 0 : value - }); - }} - /> -
+ + + setSelectedMenu({ ...selectedMenu, order_number: e.floatValue ?? null }) + } + />
-
- - setSelectedMenu({ ...selectedMenu, icon: e.target.value })} - /> -
+ + setSelectedMenu({ ...selectedMenu, icon: e.target.value })} + />
-
- - -
+ + + {errors.status && ( + {errors.status} + )}
{/*
diff --git a/src/pages/menu/manage-menu/blocks/Types.ts b/src/pages/menu/manage-menu/blocks/Types.ts new file mode 100644 index 0000000..fae3042 --- /dev/null +++ b/src/pages/menu/manage-menu/blocks/Types.ts @@ -0,0 +1,49 @@ +import { toast } from 'sonner'; + +export const initialStateMenu: { + module: string; + name: string; + link: string; + id_parent: string; + order_number: string | number | null; + icon: string; + status: string; +} = { + module: '', + name: '', + link: '', + id_parent: '', + order_number: null, + icon: '', + status: '' +}; + +export const validateFormsMenu = ( + formField: typeof initialStateMenu, + setErrors: React.Dispatch>> +) => { + const requiredFields = [ + { key: 'module', label: 'Module' }, + { key: 'name', label: 'Name' }, + { key: 'link', label: 'Link' }, + { key: 'status', label: 'Status' } + ]; + + const newErrors: Record = {}; + let isValid = true; + + requiredFields.forEach(({ key, label }) => { + if ( + formField[key as keyof typeof formField] === '' || + formField[key as keyof typeof formField] === null || + formField[key as keyof typeof formField] === undefined + ) { + newErrors[key] = `${label} is required`; + toast.error(`${label} is required`); + isValid = false; + } + }); + + setErrors(newErrors); + return isValid; +};