From ecdd8ae49c6d3eccfb663f9823a92522ed08d4c2 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Mon, 3 Nov 2025 15:19:19 +0700 Subject: [PATCH] refactor(FE-208,212): update PurchaseRequestForm schema and validation, improve credit term handling and reset logic for supplier changes --- .../form/PurchaseRequestForm.schema.ts | 27 +++++++++---------- .../purchase/form/PurchaseRequestForm.tsx | 13 ++++++--- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/components/pages/purchase/form/PurchaseRequestForm.schema.ts b/src/components/pages/purchase/form/PurchaseRequestForm.schema.ts index 27cbdf5a..d496308f 100644 --- a/src/components/pages/purchase/form/PurchaseRequestForm.schema.ts +++ b/src/components/pages/purchase/form/PurchaseRequestForm.schema.ts @@ -17,7 +17,7 @@ type PurchaseRequestFormSchemaType = { label: string; } | null; location_id: number; - credit_term: number | string | null; + credit_term: number | string | undefined; notes: string | null; purchase_items: { warehouse?: { @@ -85,7 +85,7 @@ const PurchaseItemObjectSchema: Yup.ObjectSchema = .min(1, 'Produk wajib dipilih!') .typeError('Produk wajib dipilih!'), sub_qty: Yup.mixed() - .required('Sub Qty wajib diisi!') + .required('Kuantitas wajib diisi!') .test( 'is-valid-sub-qty', 'Kuantitas harus berupa angka lebih dari 0!', @@ -134,21 +134,18 @@ export const PurchaseRequestFormSchema: Yup.ObjectSchema 0); }) .typeError('Lokasi wajib dipilih!'), - credit_term: Yup.lazy((value, context) => { - const supplier_id = context.parent.supplier_id; - const hasSupplier = supplier_id && supplier_id > 0; - - if (!hasSupplier) { - return Yup.mixed() + credit_term: Yup.mixed().when('supplier_id', { + is: (supplier_id: number) => supplier_id && supplier_id > 0, + then: () => + Yup.number() + .required('Jumlah hari jatuh tempo wajib diisi!') + .min(1, 'Jumlah hari jatuh tempo minimal 1 hari!') + .typeError('Jumlah hari jatuh tempo harus berupa angka!'), + otherwise: () => + Yup.mixed() .nullable() .default(null) - .transform(() => null); - } - - return Yup.number() - .required('Jumlah hari jatuh tempo wajib diisi!') - .min(1, 'Jumlah hari jatuh tempo minimal 1 hari!') - .typeError('Jumlah hari jatuh tempo harus berupa angka!'); + .transform(() => null), }), notes: Yup.string().nullable().default(null), purchase_items: Yup.array() diff --git a/src/components/pages/purchase/form/PurchaseRequestForm.tsx b/src/components/pages/purchase/form/PurchaseRequestForm.tsx index a6ef549f..3607d1a1 100644 --- a/src/components/pages/purchase/form/PurchaseRequestForm.tsx +++ b/src/components/pages/purchase/form/PurchaseRequestForm.tsx @@ -85,7 +85,7 @@ const PurchaseRequestForm = ({ | Record | undefined; - if (!touchedItem || !errorItem) { + if (!touchedItem) { return { isError: false, errorMessage: '' }; } @@ -377,6 +377,8 @@ const PurchaseRequestForm = ({ formik.setFieldValue('credit_term', supplierData.due_date.toString()); } } else { + // Reset credit_term field and its touched state when supplier is cleared + formik.setFieldTouched('credit_term', false); formik.setFieldValue('credit_term', ''); } }; @@ -787,7 +789,7 @@ const PurchaseRequestForm = ({ /> -