mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
refactor(FE): Refactor form handlers to use consistent formik utilities
This commit is contained in:
@@ -95,62 +95,6 @@ const PurchaseOrderAcceptApprovalForm = ({
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// ===== SUBMISSION HANDLERS =====
|
|
||||||
const createAcceptApprovalHandler = useCallback(
|
|
||||||
async (payload: CreateAcceptApprovalRequestPayload) => {
|
|
||||||
const purchaseRequestId = searchParams.get('purchaseId')
|
|
||||||
? parseInt(searchParams.get('purchaseId')!)
|
|
||||||
: initialValues?.id || 1;
|
|
||||||
|
|
||||||
if (!purchaseRequestId) {
|
|
||||||
setPurchaseOrderFormErrorMessage('Purchase Request ID is required');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await PurchaseApi.acceptApproval.create(
|
|
||||||
purchaseRequestId,
|
|
||||||
payload
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isResponseError(res)) {
|
|
||||||
setPurchaseOrderFormErrorMessage(res.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
toast.success(res?.message as string);
|
|
||||||
refreshApprovals?.();
|
|
||||||
onRefetchData?.();
|
|
||||||
formik.resetForm();
|
|
||||||
onCancel?.();
|
|
||||||
onModalClose?.();
|
|
||||||
router.refresh();
|
|
||||||
},
|
|
||||||
[
|
|
||||||
initialValues?.id,
|
|
||||||
searchParams,
|
|
||||||
refreshApprovals,
|
|
||||||
onModalClose,
|
|
||||||
onRefetchData,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
const updateAcceptApprovalHandler = useCallback(
|
|
||||||
async (purchaseId: number, payload: CreateAcceptApprovalRequestPayload) => {
|
|
||||||
const res = await PurchaseApi.acceptApproval.create(purchaseId, payload);
|
|
||||||
if (isResponseError(res)) {
|
|
||||||
setPurchaseOrderFormErrorMessage(res.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
toast.success(res?.message as string);
|
|
||||||
refreshApprovals?.();
|
|
||||||
onRefetchData?.();
|
|
||||||
formik.resetForm();
|
|
||||||
onCancel?.();
|
|
||||||
onModalClose?.();
|
|
||||||
router.refresh();
|
|
||||||
},
|
|
||||||
[refreshApprovals, onModalClose, onRefetchData]
|
|
||||||
);
|
|
||||||
|
|
||||||
// ===== SELECT INPUT DATA =====
|
// ===== SELECT INPUT DATA =====
|
||||||
const {
|
const {
|
||||||
options: expeditionVendors,
|
options: expeditionVendors,
|
||||||
@@ -244,6 +188,67 @@ const PurchaseOrderAcceptApprovalForm = ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { resetForm, setFieldValue } = formik;
|
||||||
|
|
||||||
|
// ===== SUBMISSION HANDLERS =====
|
||||||
|
const createAcceptApprovalHandler = useCallback(
|
||||||
|
async (payload: CreateAcceptApprovalRequestPayload) => {
|
||||||
|
const purchaseRequestId = searchParams.get('purchaseId')
|
||||||
|
? parseInt(searchParams.get('purchaseId')!)
|
||||||
|
: initialValues?.id || 1;
|
||||||
|
|
||||||
|
if (!purchaseRequestId) {
|
||||||
|
setPurchaseOrderFormErrorMessage('Purchase Request ID is required');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await PurchaseApi.acceptApproval.create(
|
||||||
|
purchaseRequestId,
|
||||||
|
payload
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isResponseError(res)) {
|
||||||
|
setPurchaseOrderFormErrorMessage(res.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toast.success(res?.message as string);
|
||||||
|
refreshApprovals?.();
|
||||||
|
onRefetchData?.();
|
||||||
|
resetForm();
|
||||||
|
onCancel?.();
|
||||||
|
onModalClose?.();
|
||||||
|
router.refresh();
|
||||||
|
},
|
||||||
|
[
|
||||||
|
initialValues?.id,
|
||||||
|
searchParams,
|
||||||
|
refreshApprovals,
|
||||||
|
onModalClose,
|
||||||
|
onRefetchData,
|
||||||
|
onCancel,
|
||||||
|
router,
|
||||||
|
resetForm,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
const updateAcceptApprovalHandler = useCallback(
|
||||||
|
async (purchaseId: number, payload: CreateAcceptApprovalRequestPayload) => {
|
||||||
|
const res = await PurchaseApi.acceptApproval.create(purchaseId, payload);
|
||||||
|
if (isResponseError(res)) {
|
||||||
|
setPurchaseOrderFormErrorMessage(res.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toast.success(res?.message as string);
|
||||||
|
refreshApprovals?.();
|
||||||
|
onRefetchData?.();
|
||||||
|
resetForm();
|
||||||
|
onCancel?.();
|
||||||
|
onModalClose?.();
|
||||||
|
router.refresh();
|
||||||
|
},
|
||||||
|
[refreshApprovals, onModalClose, onRefetchData, onCancel, router, resetForm]
|
||||||
|
);
|
||||||
|
|
||||||
const handleValidateForm = async () => {
|
const handleValidateForm = async () => {
|
||||||
const errors = await formik.validateForm();
|
const errors = await formik.validateForm();
|
||||||
|
|
||||||
@@ -307,9 +312,9 @@ const PurchaseOrderAcceptApprovalForm = ({
|
|||||||
transport_per_item: item.transport_per_item || '',
|
transport_per_item: item.transport_per_item || '',
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
formik.setFieldValue('items', updatedItems);
|
setFieldValue('items', updatedItems);
|
||||||
}
|
}
|
||||||
}, [purchaseItems, initialValues, key]);
|
}, [purchaseItems, initialValues, key, setFieldValue]);
|
||||||
|
|
||||||
// ===== HELPER FUNCTIONS =====
|
// ===== HELPER FUNCTIONS =====
|
||||||
const getQuantityExceededError = useCallback(
|
const getQuantityExceededError = useCallback(
|
||||||
|
|||||||
@@ -146,120 +146,6 @@ const PurchaseOrderStaffApprovalForm = ({
|
|||||||
return !item.purchase_item_id || item.purchase_item_id === 0;
|
return !item.purchase_item_id || item.purchase_item_id === 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ===== SUBMISSION HANDLERS =====
|
|
||||||
const createStaffApprovalHandler = useCallback(
|
|
||||||
async (payload: CreateStaffApprovalRequestPayload) => {
|
|
||||||
const purchaseRequestId = searchParams.get('purchaseId')
|
|
||||||
? parseInt(searchParams.get('purchaseId')!)
|
|
||||||
: initialValues?.id || 1;
|
|
||||||
|
|
||||||
if (!purchaseRequestId) {
|
|
||||||
setPurchaseOrderFormErrorMessage('Purchase Request ID is required');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await PurchaseApi.staffApproval.create(
|
|
||||||
purchaseRequestId,
|
|
||||||
payload
|
|
||||||
);
|
|
||||||
|
|
||||||
if (isResponseError(res)) {
|
|
||||||
setPurchaseOrderFormErrorMessage(res.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
toast.success(res?.message as string);
|
|
||||||
refreshApprovals?.();
|
|
||||||
onRefetchData?.();
|
|
||||||
formik.resetForm();
|
|
||||||
onCancel?.();
|
|
||||||
onModalClose?.();
|
|
||||||
router.refresh();
|
|
||||||
},
|
|
||||||
[
|
|
||||||
initialValues?.id,
|
|
||||||
searchParams,
|
|
||||||
refreshApprovals,
|
|
||||||
onModalClose,
|
|
||||||
onRefetchData,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
const updateStaffApprovalHandler = useCallback(
|
|
||||||
async (purchaseId: number, payload: UpdateStaffApprovalRequestPayload) => {
|
|
||||||
const res = await PurchaseApi.staffApproval.update(purchaseId, payload);
|
|
||||||
if (isResponseError(res)) {
|
|
||||||
setPurchaseOrderFormErrorMessage(res.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
toast.success(res?.message as string);
|
|
||||||
refreshApprovals?.();
|
|
||||||
onRefetchData?.();
|
|
||||||
formik.resetForm();
|
|
||||||
onCancel?.();
|
|
||||||
onModalClose?.();
|
|
||||||
router.refresh();
|
|
||||||
},
|
|
||||||
[refreshApprovals, onModalClose, onRefetchData]
|
|
||||||
);
|
|
||||||
|
|
||||||
// ===== DELETE HANDLER =====
|
|
||||||
const deleteItemsHandler = useCallback(async () => {
|
|
||||||
const purchaseRequestId = searchParams.get('purchaseId')
|
|
||||||
? parseInt(searchParams.get('purchaseId')!)
|
|
||||||
: initialValues?.id || 1;
|
|
||||||
|
|
||||||
if (!purchaseRequestId) {
|
|
||||||
toast.error('Purchase Request ID is required');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const itemIdsToDelete = selectedItemForDelete
|
|
||||||
? [selectedItemForDelete]
|
|
||||||
: [];
|
|
||||||
|
|
||||||
if (itemIdsToDelete.length === 0) {
|
|
||||||
toast.error('Tidak ada item yang dipilih untuk dihapus');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const res = await PurchaseApi.items.delete(purchaseRequestId, {
|
|
||||||
item_ids: itemIdsToDelete,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (isResponseError(res)) {
|
|
||||||
toast.error(res.message || 'Gagal menghapus item pembelian');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const successMessage = 'Item pembelian berhasil dihapus';
|
|
||||||
toast.success(successMessage);
|
|
||||||
|
|
||||||
refreshApprovals?.();
|
|
||||||
onRefetchData?.();
|
|
||||||
deleteModal.closeModal();
|
|
||||||
setSelectedItemForDelete(null);
|
|
||||||
setSelectedItemIndex(null);
|
|
||||||
|
|
||||||
if (selectedItemIndex !== null) {
|
|
||||||
const updatedPurchaseItems = formik.values.items?.filter(
|
|
||||||
(_, i) => i !== selectedItemIndex
|
|
||||||
);
|
|
||||||
formik.setFieldValue('items', updatedPurchaseItems);
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
toast.error('Terjadi kesalahan saat menghapus item pembelian');
|
|
||||||
}
|
|
||||||
}, [
|
|
||||||
initialValues?.id,
|
|
||||||
searchParams,
|
|
||||||
selectedItemForDelete,
|
|
||||||
selectedItemIndex,
|
|
||||||
refreshApprovals,
|
|
||||||
onRefetchData,
|
|
||||||
deleteModal,
|
|
||||||
]);
|
|
||||||
|
|
||||||
// ===== API DATA FETCHING FOR SUPPLIER PRODUCTS =====
|
// ===== API DATA FETCHING FOR SUPPLIER PRODUCTS =====
|
||||||
const { data: supplierData, isLoading: isLoadingSupplierProducts } = useSWR(
|
const { data: supplierData, isLoading: isLoadingSupplierProducts } = useSWR(
|
||||||
initialValues?.supplier?.id
|
initialValues?.supplier?.id
|
||||||
@@ -418,6 +304,127 @@ const PurchaseOrderStaffApprovalForm = ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { resetForm, setFieldValue } = formik;
|
||||||
|
|
||||||
|
// ===== SUBMISSION HANDLERS =====
|
||||||
|
const createStaffApprovalHandler = useCallback(
|
||||||
|
async (payload: CreateStaffApprovalRequestPayload) => {
|
||||||
|
const purchaseRequestId = searchParams.get('purchaseId')
|
||||||
|
? parseInt(searchParams.get('purchaseId')!)
|
||||||
|
: initialValues?.id || 1;
|
||||||
|
|
||||||
|
if (!purchaseRequestId) {
|
||||||
|
setPurchaseOrderFormErrorMessage('Purchase Request ID is required');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await PurchaseApi.staffApproval.create(
|
||||||
|
purchaseRequestId,
|
||||||
|
payload
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isResponseError(res)) {
|
||||||
|
setPurchaseOrderFormErrorMessage(res.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toast.success(res?.message as string);
|
||||||
|
refreshApprovals?.();
|
||||||
|
onRefetchData?.();
|
||||||
|
resetForm();
|
||||||
|
onCancel?.();
|
||||||
|
onModalClose?.();
|
||||||
|
router.refresh();
|
||||||
|
},
|
||||||
|
[
|
||||||
|
initialValues?.id,
|
||||||
|
searchParams,
|
||||||
|
refreshApprovals,
|
||||||
|
onModalClose,
|
||||||
|
onRefetchData,
|
||||||
|
resetForm,
|
||||||
|
onCancel,
|
||||||
|
router,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
const updateStaffApprovalHandler = useCallback(
|
||||||
|
async (purchaseId: number, payload: UpdateStaffApprovalRequestPayload) => {
|
||||||
|
const res = await PurchaseApi.staffApproval.update(purchaseId, payload);
|
||||||
|
if (isResponseError(res)) {
|
||||||
|
setPurchaseOrderFormErrorMessage(res.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toast.success(res?.message as string);
|
||||||
|
refreshApprovals?.();
|
||||||
|
onRefetchData?.();
|
||||||
|
resetForm();
|
||||||
|
onCancel?.();
|
||||||
|
onModalClose?.();
|
||||||
|
router.refresh();
|
||||||
|
},
|
||||||
|
[refreshApprovals, onModalClose, onRefetchData, resetForm, onCancel, router]
|
||||||
|
);
|
||||||
|
|
||||||
|
// ===== DELETE HANDLER =====
|
||||||
|
const deleteItemsHandler = useCallback(async () => {
|
||||||
|
const purchaseRequestId = searchParams.get('purchaseId')
|
||||||
|
? parseInt(searchParams.get('purchaseId')!)
|
||||||
|
: initialValues?.id || 1;
|
||||||
|
|
||||||
|
if (!purchaseRequestId) {
|
||||||
|
toast.error('Purchase Request ID is required');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const itemIdsToDelete = selectedItemForDelete
|
||||||
|
? [selectedItemForDelete]
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (itemIdsToDelete.length === 0) {
|
||||||
|
toast.error('Tidak ada item yang dipilih untuk dihapus');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await PurchaseApi.items.delete(purchaseRequestId, {
|
||||||
|
item_ids: itemIdsToDelete,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isResponseError(res)) {
|
||||||
|
toast.error(res.message || 'Gagal menghapus item pembelian');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const successMessage = 'Item pembelian berhasil dihapus';
|
||||||
|
toast.success(successMessage);
|
||||||
|
|
||||||
|
refreshApprovals?.();
|
||||||
|
onRefetchData?.();
|
||||||
|
deleteModal.closeModal();
|
||||||
|
setSelectedItemForDelete(null);
|
||||||
|
setSelectedItemIndex(null);
|
||||||
|
|
||||||
|
if (selectedItemIndex !== null) {
|
||||||
|
const updatedPurchaseItems = formik.values.items?.filter(
|
||||||
|
(_, i) => i !== selectedItemIndex
|
||||||
|
);
|
||||||
|
setFieldValue('items', updatedPurchaseItems);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
toast.error('Terjadi kesalahan saat menghapus item pembelian');
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
initialValues?.id,
|
||||||
|
searchParams,
|
||||||
|
selectedItemForDelete,
|
||||||
|
selectedItemIndex,
|
||||||
|
refreshApprovals,
|
||||||
|
onRefetchData,
|
||||||
|
deleteModal,
|
||||||
|
setFieldValue,
|
||||||
|
formik.values.items,
|
||||||
|
]);
|
||||||
|
|
||||||
const handleValidateForm = async () => {
|
const handleValidateForm = async () => {
|
||||||
const errors = await formik.validateForm();
|
const errors = await formik.validateForm();
|
||||||
|
|
||||||
@@ -519,9 +526,9 @@ const PurchaseOrderStaffApprovalForm = ({
|
|||||||
};
|
};
|
||||||
return itemData;
|
return itemData;
|
||||||
});
|
});
|
||||||
formik.setFieldValue('items', updatedItems);
|
setFieldValue('items', updatedItems);
|
||||||
}
|
}
|
||||||
}, [purchaseItems, type, initialValues]);
|
}, [purchaseItems, type, initialValues, setFieldValue]);
|
||||||
|
|
||||||
// ===== PURCHASE ITEM OPERATIONS =====
|
// ===== PURCHASE ITEM OPERATIONS =====
|
||||||
const addPurchaseItem = () => {
|
const addPurchaseItem = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user