feat(FE-208): add refetchData prop to PurchaseOrderDetail and related forms for improved data synchronization

This commit is contained in:
rstubryan
2025-11-21 18:18:40 +07:00
parent c74733430b
commit 95a7afdaa6
4 changed files with 45 additions and 15 deletions
+6 -2
View File
@@ -12,7 +12,7 @@ const PurchaseDetail = () => {
const purchaseId = searchParams.get('purchaseId'); const purchaseId = searchParams.get('purchaseId');
const { data: purchase, isLoading: isLoadingPurchase } = useSWR( const { data: purchase, isLoading: isLoadingPurchase, mutate: mutatePurchase } = useSWR(
purchaseId, purchaseId,
(id: number) => PurchaseApi.getSingle(id) (id: number) => PurchaseApi.getSingle(id)
); );
@@ -40,7 +40,11 @@ const PurchaseDetail = () => {
</div> </div>
)} )}
{!isLoadingPurchase && isResponseSuccess(purchase) && ( {!isLoadingPurchase && isResponseSuccess(purchase) && (
<PurchaseOrderDetail type='detail' initialValues={purchase.data} /> <PurchaseOrderDetail
type='detail'
initialValues={purchase.data}
refetchData={mutatePurchase}
/>
)} )}
</div> </div>
); );
@@ -9,6 +9,7 @@ import Button from '@/components/Button';
import TextInput from '@/components/input/TextInput'; import TextInput from '@/components/input/TextInput';
import NumberInput from '@/components/input/NumberInput'; import NumberInput from '@/components/input/NumberInput';
import SelectInput, { OptionType } from '@/components/input/SelectInput'; import SelectInput, { OptionType } from '@/components/input/SelectInput';
import { useRouter } from 'next/navigation';
import { import {
PurchaseRequestAcceptApprovalFormDefaultValues, PurchaseRequestAcceptApprovalFormDefaultValues,
@@ -30,6 +31,7 @@ interface PurchaseOrderAcceptApprovalFormProps {
onCancel?: () => void; onCancel?: () => void;
refreshApprovals?: () => void; refreshApprovals?: () => void;
onModalClose?: () => void; onModalClose?: () => void;
onRefetchData?: () => void;
} }
const PurchaseOrderAcceptApprovalForm = ({ const PurchaseOrderAcceptApprovalForm = ({
@@ -38,7 +40,9 @@ const PurchaseOrderAcceptApprovalForm = ({
onCancel, onCancel,
refreshApprovals, refreshApprovals,
onModalClose, onModalClose,
onRefetchData,
}: PurchaseOrderAcceptApprovalFormProps) => { }: PurchaseOrderAcceptApprovalFormProps) => {
const router = useRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const [purchaseOrderFormErrorMessage, setPurchaseOrderFormErrorMessage] = const [purchaseOrderFormErrorMessage, setPurchaseOrderFormErrorMessage] =
useState(''); useState('');
@@ -105,11 +109,13 @@ const PurchaseOrderAcceptApprovalForm = ({
} }
toast.success(res?.message as string); toast.success(res?.message as string);
refreshApprovals?.(); refreshApprovals?.();
onRefetchData?.();
formik.resetForm(); formik.resetForm();
onCancel?.(); onCancel?.();
onModalClose?.(); onModalClose?.();
router.refresh();
}, },
[initialValues?.id, searchParams, refreshApprovals, onModalClose] [initialValues?.id, searchParams, refreshApprovals, onModalClose, onRefetchData]
); );
const updateAcceptApprovalHandler = useCallback( const updateAcceptApprovalHandler = useCallback(
@@ -121,12 +127,13 @@ const PurchaseOrderAcceptApprovalForm = ({
} }
toast.success(res?.message as string); toast.success(res?.message as string);
refreshApprovals?.(); refreshApprovals?.();
onRefetchData?.();
formik.resetForm(); formik.resetForm();
onCancel?.(); onCancel?.();
onModalClose?.(); onModalClose?.();
window.location.href = '/purchase'; router.refresh();
}, },
[refreshApprovals, onModalClose] [refreshApprovals, onModalClose, onRefetchData]
); );
// ===== FORM CONFIGURATION ===== // ===== FORM CONFIGURATION =====
@@ -8,7 +8,7 @@ import { useSearchParams } from 'next/navigation';
import Button from '@/components/Button'; import Button from '@/components/Button';
import TextInput from '@/components/input/TextInput'; import TextInput from '@/components/input/TextInput';
import NumberInput from '@/components/input/NumberInput'; import NumberInput from '@/components/input/NumberInput';
import SelectInput, { OptionType } from '@/components/input/SelectInput'; import SelectInput from '@/components/input/SelectInput';
import { import {
PurchaseRequestStaffApprovalFormDefaultValues, PurchaseRequestStaffApprovalFormDefaultValues,
@@ -22,7 +22,7 @@ import {
UpdateStaffApprovalRequestPayload, UpdateStaffApprovalRequestPayload,
Purchase, Purchase,
} from '@/types/api/purchase/purchase'; } from '@/types/api/purchase/purchase';
import { router } from 'next/client'; import { useRouter } from 'next/navigation';
interface PurchaseOrderStaffApprovalFormProps { interface PurchaseOrderStaffApprovalFormProps {
type?: 'add' | 'edit'; type?: 'add' | 'edit';
@@ -30,6 +30,7 @@ interface PurchaseOrderStaffApprovalFormProps {
onCancel?: () => void; onCancel?: () => void;
refreshApprovals?: () => void; refreshApprovals?: () => void;
onModalClose?: () => void; onModalClose?: () => void;
onRefetchData?: () => void;
} }
const PurchaseOrderStaffApprovalForm = ({ const PurchaseOrderStaffApprovalForm = ({
@@ -38,7 +39,9 @@ const PurchaseOrderStaffApprovalForm = ({
onCancel, onCancel,
refreshApprovals, refreshApprovals,
onModalClose, onModalClose,
onRefetchData,
}: PurchaseOrderStaffApprovalFormProps) => { }: PurchaseOrderStaffApprovalFormProps) => {
const router = useRouter();
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const [purchaseOrderFormErrorMessage, setPurchaseOrderFormErrorMessage] = const [purchaseOrderFormErrorMessage, setPurchaseOrderFormErrorMessage] =
useState(''); useState('');
@@ -104,11 +107,13 @@ const PurchaseOrderStaffApprovalForm = ({
} }
toast.success(res?.message as string); toast.success(res?.message as string);
refreshApprovals?.(); refreshApprovals?.();
onRefetchData?.();
formik.resetForm(); formik.resetForm();
onCancel?.(); onCancel?.();
onModalClose?.(); onModalClose?.();
router.refresh();
}, },
[initialValues?.id, searchParams, refreshApprovals, onModalClose] [initialValues?.id, searchParams, refreshApprovals, onModalClose, onRefetchData]
); );
const updateStaffApprovalHandler = useCallback( const updateStaffApprovalHandler = useCallback(
@@ -120,12 +125,13 @@ const PurchaseOrderStaffApprovalForm = ({
} }
toast.success(res?.message as string); toast.success(res?.message as string);
refreshApprovals?.(); refreshApprovals?.();
onRefetchData?.();
formik.resetForm(); formik.resetForm();
onCancel?.(); onCancel?.();
onModalClose?.(); onModalClose?.();
await router.push(`/purchase/detail?purchaseId=${purchaseId}`); router.refresh();
}, },
[refreshApprovals, onModalClose] [refreshApprovals, onModalClose, onRefetchData]
); );
// ===== FORM CONFIGURATION ===== // ===== FORM CONFIGURATION =====
@@ -69,11 +69,13 @@ const PenerimaanBarangDropdown = ({ onEdit }: { onEdit: () => void }) => {
interface PurchaseOrderDetailProps { interface PurchaseOrderDetailProps {
type?: 'detail' | 'edit'; type?: 'detail' | 'edit';
initialValues?: Purchase; initialValues?: Purchase;
refetchData?: () => void;
} }
const PurchaseOrderDetail = ({ const PurchaseOrderDetail = ({
type = 'detail', type = 'detail',
initialValues, initialValues,
refetchData,
}: PurchaseOrderDetailProps) => { }: PurchaseOrderDetailProps) => {
// ===== MODAL HOOKS ===== // ===== MODAL HOOKS =====
const searchParams = useSearchParams(); const searchParams = useSearchParams();
@@ -251,8 +253,9 @@ const PurchaseOrderDetail = ({
} }
toast.success(res?.message as string); toast.success(res?.message as string);
refreshApprovals(); refreshApprovals();
refetchData?.();
}, },
[initialValues?.id, searchParams, refreshApprovals] [initialValues?.id, searchParams, refreshApprovals, refetchData]
); );
const createManagerApprovalHandler = useCallback( const createManagerApprovalHandler = useCallback(
@@ -276,20 +279,23 @@ const PurchaseOrderDetail = ({
return; return;
} }
toast.success(res?.message as string); toast.success(res?.message as string);
refetchData?.();
}, },
[initialValues?.id, searchParams] [initialValues?.id, searchParams, refetchData]
); );
// ===== MODAL HANDLERS ===== // ===== MODAL HANDLERS =====
const handleStaffApprovalModalClose = useCallback(() => { const handleStaffApprovalModalClose = useCallback(() => {
refreshApprovals(); refreshApprovals();
refetchData?.();
staffApprovalModal.closeModal(); staffApprovalModal.closeModal();
}, [refreshApprovals]); }, [refreshApprovals, refetchData]);
const handleEditModalClose = useCallback(() => { const handleEditModalClose = useCallback(() => {
refreshApprovals(); refreshApprovals();
refetchData?.();
editModal.closeModal(); editModal.closeModal();
}, [refreshApprovals]); }, [refreshApprovals, refetchData]);
// ===== DELETE HANDLER ===== // ===== DELETE HANDLER =====
const deleteItemsHandler = useCallback(async () => { const deleteItemsHandler = useCallback(async () => {
@@ -327,6 +333,7 @@ const PurchaseOrderDetail = ({
toast.success(successMessage); toast.success(successMessage);
refreshApprovals(); refreshApprovals();
refetchData?.();
deleteModal.closeModal(); deleteModal.closeModal();
setSelectedItem(null); setSelectedItem(null);
setRowSelection({}); setRowSelection({});
@@ -335,7 +342,7 @@ const PurchaseOrderDetail = ({
} finally { } finally {
setIsDeleteLoading(false); setIsDeleteLoading(false);
} }
}, [initialValues?.id, searchParams, selectedItem, selectedRowIds]); }, [initialValues?.id, searchParams, selectedItem, selectedRowIds, refetchData]);
if (!initialValues) { if (!initialValues) {
return null; return null;
@@ -901,6 +908,7 @@ const PurchaseOrderDetail = ({
await createManagerApprovalHandler(payload); await createManagerApprovalHandler(payload);
await refreshApprovals(); await refreshApprovals();
await refetchData?.();
confirmationModalWithNotes.closeModal(); confirmationModalWithNotes.closeModal();
}, },
}} }}
@@ -923,6 +931,7 @@ const PurchaseOrderDetail = ({
onCancel={handleStaffApprovalModalClose} onCancel={handleStaffApprovalModalClose}
refreshApprovals={refreshApprovals} refreshApprovals={refreshApprovals}
onModalClose={staffApprovalModal.closeModal} onModalClose={staffApprovalModal.closeModal}
onRefetchData={refetchData}
/> />
</Modal> </Modal>
@@ -940,6 +949,7 @@ const PurchaseOrderDetail = ({
onCancel={acceptApprovalModal.closeModal} onCancel={acceptApprovalModal.closeModal}
refreshApprovals={refreshApprovals} refreshApprovals={refreshApprovals}
onModalClose={acceptApprovalModal.closeModal} onModalClose={acceptApprovalModal.closeModal}
onRefetchData={refetchData}
/> />
</Modal> </Modal>
@@ -957,6 +967,7 @@ const PurchaseOrderDetail = ({
onCancel={handleEditModalClose} onCancel={handleEditModalClose}
refreshApprovals={refreshApprovals} refreshApprovals={refreshApprovals}
onModalClose={editModal.closeModal} onModalClose={editModal.closeModal}
onRefetchData={refetchData}
/> />
</Modal> </Modal>
@@ -974,6 +985,7 @@ const PurchaseOrderDetail = ({
onCancel={penerimaanBarangModal.closeModal} onCancel={penerimaanBarangModal.closeModal}
refreshApprovals={refreshApprovals} refreshApprovals={refreshApprovals}
onModalClose={penerimaanBarangModal.closeModal} onModalClose={penerimaanBarangModal.closeModal}
onRefetchData={refetchData}
/> />
</Modal> </Modal>
@@ -996,6 +1008,7 @@ const PurchaseOrderDetail = ({
}; };
await createStaffApprovalHandler(payload); await createStaffApprovalHandler(payload);
await refetchData?.();
staffRejectionModal.closeModal(); staffRejectionModal.closeModal();
}, },
}} }}