From 6f90bd604a0d9ff11f44dadaf3ef8b6e13b3defb Mon Sep 17 00:00:00 2001 From: rstubryan Date: Tue, 6 Jan 2026 20:38:51 +0700 Subject: [PATCH] feat(FE): Enforce 2MB file limit and improve FileInput --- src/components/input/FileInput.tsx | 8 ++++++++ .../pages/inventory/movement/form/MovementForm.tsx | 1 + .../form/order/PurchaseOrderAcceptApprovalForm.tsx | 10 ++++++++++ .../purchase/form/order/PurchaseOrderForm.schema.ts | 10 +++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/components/input/FileInput.tsx b/src/components/input/FileInput.tsx index aee7cb78..5f3a8610 100644 --- a/src/components/input/FileInput.tsx +++ b/src/components/input/FileInput.tsx @@ -33,6 +33,7 @@ const FileInput = ({ isError, errorMessage, disabled = false, + required = false, onChange, onBlur, readOnly = false, @@ -56,6 +57,13 @@ const FileInput = ({ )} > {label} + {required && ( + <> + + * + + + )} )} diff --git a/src/components/pages/inventory/movement/form/MovementForm.tsx b/src/components/pages/inventory/movement/form/MovementForm.tsx index 64c87717..d92b14de 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.tsx +++ b/src/components/pages/inventory/movement/form/MovementForm.tsx @@ -1584,6 +1584,7 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { ) : ( { const file = e.target.files?.[0]; diff --git a/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx b/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx index b90a7c91..d39b2e1a 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx +++ b/src/components/pages/purchase/form/order/PurchaseOrderAcceptApprovalForm.tsx @@ -689,6 +689,16 @@ const PurchaseOrderAcceptApprovalForm = ({ accept='.pdf,.jpg,.jpeg,.png' onChange={(e) => { const files = Array.from(e.target.files || []); + const invalidFiles = files.filter( + (file) => file.size > 2 * 1024 * 1024 + ); + + if (invalidFiles.length > 0) { + toast.error('Ukuran dokumen maksimal 2 MB!'); + e.target.value = ''; + return; + } + formik.setFieldValue('travel_documents', files); }} onBlur={formik.handleBlur} diff --git a/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts b/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts index 0d776cb0..07a868a3 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts +++ b/src/components/pages/purchase/form/order/PurchaseOrderForm.schema.ts @@ -392,7 +392,15 @@ export const PurchaseRequestAcceptApprovalFormSchema: Yup.ObjectSchema().required()) + .of( + Yup.mixed() + .required('Dokumen surat jalan wajib diupload!') + .test('fileSize', 'Ukuran dokumen maksimal 2 MB', (value) => { + if (!value) return true; + if (value instanceof File) return value.size <= 2 * 1024 * 1024; + return true; + }) + ) .required('Dokumen surat jalan wajib diupload!') .min(1, 'Minimal upload 1 dokumen surat jalan!') .typeError('Dokumen surat jalan wajib diupload!'),