diff --git a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts index 71357361..9eff1d26 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.schema.ts +++ b/src/components/pages/expense/form/ExpenseRequestForm.schema.ts @@ -75,7 +75,16 @@ export const ExpenseRequestFormSchema: Yup.ObjectSchema = deleted_documents: Yup.array().of(Yup.number().required()).optional(), - documents: Yup.array().of(Yup.mixed().required()).optional(), + documents: Yup.array() + .of( + Yup.mixed() + .required() + .test('fileSize', 'Ukuran dokumen maksimal 5 MB', (value) => { + if (!value || !(value instanceof File)) return true; + return value.size <= 5 * 1024 * 1024; + }) + ) + .optional(), expense_nonstocks: Yup.array() .of( @@ -104,7 +113,16 @@ export const ExpenseRequestFormSchema: Yup.ObjectSchema = export const UpdateExpenseRequestFormSchema = ExpenseRequestFormSchema; export const UploadRequestDocumentsFormSchema = Yup.object({ - documents: Yup.array().of(Yup.mixed().required()).required(), + documents: Yup.array() + .of( + Yup.mixed() + .required() + .test('fileSize', 'Ukuran dokumen maksimal 5 MB', (value) => { + if (!value || !(value instanceof File)) return true; + return value.size <= 5 * 1024 * 1024; + }) + ) + .required(), }); export type ExpenseRequestFormValues = Yup.InferType< diff --git a/src/components/pages/expense/form/ExpenseRequestForm.tsx b/src/components/pages/expense/form/ExpenseRequestForm.tsx index 60e55397..ebd1b066 100644 --- a/src/components/pages/expense/form/ExpenseRequestForm.tsx +++ b/src/components/pages/expense/form/ExpenseRequestForm.tsx @@ -37,6 +37,8 @@ import { cn, sleep } from '@/lib/helper'; import { LocationApi, SupplierApi } from '@/services/api/master-data'; import { ACCEPTED_FILE_TYPE } from '@/config/constant'; import { Supplier } from '@/types/api/master-data/supplier'; +import { getUniqueFormikErrors } from '@/lib/formik-helper'; +import AlertErrorList from '@/components/helper/form/FormErrors'; interface ExpenseFormProps { type?: 'add' | 'edit' | 'detail'; @@ -55,6 +57,7 @@ const ExpenseRequestForm = ({ const rejectModal = useModal(); const [expenseFormErrorMessage, setExpenseFormErrorMessage] = useState(''); + const [formErrorList, setFormErrorList] = useState([]); const createExpenseHandler = useCallback( async (payload: CreateExpensePayload) => { @@ -322,6 +325,22 @@ const ExpenseRequestForm = ({ router.push('/expense'); }; + const handleValidateForm = async () => { + const errors = await formik.validateForm(); + + if (Object.keys(errors).length > 0) { + const errorMessages = getUniqueFormikErrors(errors); + setFormErrorList(errorMessages); + return; + } + }; + + const handleFormSubmit = (e: React.FormEvent) => { + e.preventDefault(); + handleValidateForm(); + formik.handleSubmit(e); + }; + useEffect(() => { formikSetValues(getExpenseFormInitialValues(initialValues)); }, [formikSetValues, getExpenseFormInitialValues, initialValues]); @@ -347,10 +366,27 @@ const ExpenseRequestForm = ({
+ {expenseFormErrorMessage && ( +
+ + {expenseFormErrorMessage} +
+ )} + + {formErrorList.length > 0 && ( + setFormErrorList([])} + /> + )}
)} - {expenseFormErrorMessage && ( -
- - {expenseFormErrorMessage} -
- )} - {type !== 'detail' && (