feat(FE-311): Add rejection modals and accept handler

This commit is contained in:
rstubryan
2025-12-10 13:30:40 +07:00
parent 48f228de1c
commit 429f5ffb62
2 changed files with 92 additions and 1 deletions
@@ -27,6 +27,7 @@ import PurchaseOrderInvoice from '@/components/pages/purchase/order/PurchaseOrde
import Card from '@/components/Card';
import {
CreateAcceptApprovalRequestPayload,
CreateManagerApprovalRequestPayload,
CreateStaffApprovalRequestPayload,
Purchase,
@@ -88,6 +89,8 @@ const PurchaseOrderDetail = ({
const staffApprovalModal = useModal();
const staffRejectionModal = useModal();
const acceptApprovalModal = useModal();
const acceptRejectionModal = useModal();
const managerRejectionModal = useModal();
const editModal = useModal();
const penerimaanBarangModal = useModal();
const deleteModal = useModal();
@@ -216,6 +219,12 @@ const PurchaseOrderDetail = ({
case 1:
staffRejectionModal.openModal();
break;
case 2:
managerRejectionModal.openModal();
break;
case 3:
acceptRejectionModal.openModal();
break;
default:
break;
}
@@ -296,6 +305,33 @@ const PurchaseOrderDetail = ({
[initialValues?.id, searchParams, refetchData]
);
const createAcceptApprovalHandler = useCallback(
async (payload: CreateAcceptApprovalRequestPayload) => {
const purchaseRequestId = searchParams.get('purchaseId')
? parseInt(searchParams.get('purchaseId')!)
: initialValues?.id || 1;
if (!purchaseRequestId) {
toast.error('Purchase Request ID is required');
return;
}
const res = await PurchaseApi.acceptApproval.create(
purchaseRequestId,
payload
);
if (isResponseError(res)) {
toast.error(res.message);
return;
}
toast.success(res?.message as string);
refreshApprovals();
refetchData?.();
},
[initialValues?.id, searchParams, refreshApprovals, refetchData]
);
// ===== MODAL HANDLERS =====
const handleStaffApprovalModalClose = useCallback(() => {
refreshApprovals();
@@ -1026,6 +1062,61 @@ const PurchaseOrderDetail = ({
}}
/>
{/* Accept Rejection Modal */}
<ConfirmationModalWithNotes
ref={acceptRejectionModal.ref}
type='error'
text='Apakah Anda yakin ingin menolak (reject) penerimaan barang ini?'
placeholder='(Opsional) Masukkan alasan penolakan...'
rows={4}
closeOnBackdrop
primaryButton={{
text: 'Ya, Tolak',
color: 'error',
onClick: async (notes) => {
const payload: CreateAcceptApprovalRequestPayload = {
action: 'REJECTED',
notes: notes || null,
items: [],
};
await createAcceptApprovalHandler(payload);
await refetchData?.();
acceptRejectionModal.closeModal();
},
}}
secondaryButton={{
text: 'Batal',
}}
/>
{/* Manager Rejection Modal */}
<ConfirmationModalWithNotes
ref={managerRejectionModal.ref}
type='error'
text='Apakah Anda yakin ingin menolak (reject) approval manajer untuk permintaan pembelian ini?'
placeholder='(Opsional) Masukkan alasan penolakan...'
rows={4}
closeOnBackdrop
primaryButton={{
text: 'Ya, Tolak',
color: 'error',
onClick: async (notes) => {
const payload: CreateManagerApprovalRequestPayload = {
action: 'REJECTED',
notes: notes || null,
};
await createManagerApprovalHandler(payload);
await refetchData?.();
managerRejectionModal.closeModal();
},
}}
secondaryButton={{
text: 'Batal',
}}
/>
{/* Delete Confirmation Modal */}
<ConfirmationModal
ref={deleteModal.ref}
+1 -1
View File
@@ -105,7 +105,7 @@ export type CreateManagerApprovalRequestPayload = {
export type CreateAcceptApprovalRequestPayload = {
action: 'APPROVED' | 'REJECTED';
notes?: string;
notes?: string | null;
items: {
purchase_item_id: number;
received_date: string;