From e32b9ddcb29cdd1edffd63fe31022f812b5d2bf5 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Wed, 31 Dec 2025 10:37:21 +0700 Subject: [PATCH] feat(FE-316): Display created uniformity in confirmation preview --- .../pages/uniformity/UniformityTable.tsx | 118 ++++++++++++++---- .../uniformity/form/UniformityResultForm.tsx | 8 +- src/services/api/uniformity.ts | 7 +- .../uniformity/slices/uniformity.slice.ts | 4 + src/types/stores.d.ts | 3 + 5 files changed, 110 insertions(+), 30 deletions(-) diff --git a/src/components/pages/uniformity/UniformityTable.tsx b/src/components/pages/uniformity/UniformityTable.tsx index 78611730..be9fa1b0 100644 --- a/src/components/pages/uniformity/UniformityTable.tsx +++ b/src/components/pages/uniformity/UniformityTable.tsx @@ -61,50 +61,42 @@ interface UniformityPreviewData { } const UniformityConfirmationPreview = ({ - tanggal = '28 Desember 2025', - lokasiFarm = 'Farm A', - projectFlock = 'Flock 2025-01', - kandang = 'Kandang 1', - file_name = 'uniformity_data.xlsx', - status = 'APPROVED', + uniformity, }: { - tanggal?: string; - lokasiFarm?: string; - projectFlock?: string; - kandang?: string; - file_name?: string; - status?: string; + uniformity?: Uniformity; }) => { const data: UniformityPreviewData[] = [ { id: 'tanggal', label: 'Tanggal', - value: tanggal, + value: uniformity + ? formatDate(uniformity.applied_at, 'DD MMM YYYY') + : '-', }, { id: 'lokasi-farm', label: 'Lokasi Farm', - value: lokasiFarm, + value: uniformity?.location_name || '-', }, { id: 'project-flock', label: 'Project Flock', - value: projectFlock, + value: uniformity?.flock_name || '-', }, { id: 'kandang', label: 'Kandang', - value: kandang, + value: uniformity?.kandang_name || '-', }, { id: 'file-uniformity', label: 'File Uniformity', - value: file_name, + value: '-', // File name tidak tersedia di GET ALL response }, { id: 'status', label: 'Status', - value: status, + value: uniformity?.status || '-', }, ]; @@ -161,6 +153,10 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { const searchParams = useSearchParams(); const isSuccess = useUniformityStore((s) => s.isSuccess); const setIsSuccess = useUniformityStore((s) => s.setIsSuccess); + const createdUniformity = useUniformityStore((s) => s.createdUniformity); + const setCreatedUniformity = useUniformityStore( + (s) => s.setCreatedUniformity + ); const { state: tableFilterState, @@ -449,6 +445,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { const handleSuccessModalClose = () => { successModal.closeModal(); setIsSuccess(false); + setCreatedUniformity(null); }; const singleDeleteHandler = useCallback(async () => { @@ -507,12 +504,18 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }, [selectedRowIds, selectedUniformities, singleDeleteModal]); const handleBulkApprove = useCallback(() => { + if (selectedRowIds.length === 1) { + setSelectedUniformity(selectedUniformities[0]); + } bulkApproveModal.openModal(); - }, [bulkApproveModal]); + }, [bulkApproveModal, selectedRowIds, selectedUniformities]); const handleBulkReject = useCallback(() => { + if (selectedRowIds.length === 1) { + setSelectedUniformity(selectedUniformities[0]); + } bulkRejectModal.openModal(); - }, [bulkRejectModal]); + }, [bulkRejectModal, selectedRowIds, selectedUniformities]); const bulkApproveHandler = useCallback(async () => { setIsBulkActionLoading(true); @@ -899,7 +902,46 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }} >
- + {createdUniformity ? ( + + ) : selectedRowIds.length === 1 ? ( + + ) : ( +
+ {selectedRowIds.length} data dipilih +
+ )}
@@ -923,7 +965,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }} >
- +
@@ -947,7 +989,15 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }} >
- + {selectedRowIds.length === 1 ? ( + + ) : ( +
+ {selectedRowIds.length} data dipilih +
+ )}
@@ -971,7 +1021,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }} >
- +
@@ -995,7 +1045,15 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }} >
- + {selectedRowIds.length === 1 ? ( + + ) : ( +
+ {selectedRowIds.length} data dipilih +
+ )}
@@ -1018,7 +1076,15 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => { }} >
- + {selectedRowIds.length === 1 ? ( + + ) : ( +
+ {selectedRowIds.length} data dipilih +
+ )}
diff --git a/src/components/pages/uniformity/form/UniformityResultForm.tsx b/src/components/pages/uniformity/form/UniformityResultForm.tsx index ad2402ea..446e0a91 100644 --- a/src/components/pages/uniformity/form/UniformityResultForm.tsx +++ b/src/components/pages/uniformity/form/UniformityResultForm.tsx @@ -40,6 +40,9 @@ const UniformityResultForm = () => { ); const uniformityFormData = useUniformityStore((s) => s.uniformityFormData); const setIsSuccess = useUniformityStore((s) => s.setIsSuccess); + const setCreatedUniformity = useUniformityStore( + (s) => s.setCreatedUniformity + ); const [isSubmitting, setIsSubmitting] = React.useState(false); @@ -68,11 +71,12 @@ const UniformityResultForm = () => { const res = await UniformityApi.createUniformity(payload); - if (isResponseError(res)) { - toast.error(res.message); + if (!res || isResponseError(res)) { + toast.error(res?.message || 'Failed to create uniformity'); return; } + setCreatedUniformity(res.data); setIsSuccess(true); setExpandedDrawerOpen(false); setIsNextStep(false); diff --git a/src/services/api/uniformity.ts b/src/services/api/uniformity.ts index 57c19436..2ee1ee15 100644 --- a/src/services/api/uniformity.ts +++ b/src/services/api/uniformity.ts @@ -53,7 +53,7 @@ export class UniformityApiService extends BaseApiService< async createUniformity( payload: CreateUniformityPayload - ): Promise | undefined> { + ): Promise | undefined> { const formData = new FormData(); formData.append('date', payload.date); formData.append('week', payload.week.toString()); @@ -66,7 +66,10 @@ export class UniformityApiService extends BaseApiService< formData.append('document', payload.document); } - return await this.create(formData as unknown as CreateUniformityPayload); + return await this.customRequest>('', { + method: 'POST', + payload: formData as unknown as Record, + }); } async verifyUniformity( diff --git a/src/stores/uniformity/slices/uniformity.slice.ts b/src/stores/uniformity/slices/uniformity.slice.ts index 244ca94e..d95b6388 100644 --- a/src/stores/uniformity/slices/uniformity.slice.ts +++ b/src/stores/uniformity/slices/uniformity.slice.ts @@ -12,6 +12,7 @@ export const createUniformitySlice: StateCreator< verifyUniformityResult: null, uniformityFormData: null, isSuccess: false, + createdUniformity: null, // Actions setUniformityStep: (step) => set({ uniformityStep: step }), @@ -23,11 +24,14 @@ export const createUniformitySlice: StateCreator< setIsSuccess: (success) => set({ isSuccess: success }), + setCreatedUniformity: (data) => set({ createdUniformity: data }), + resetUniformity: () => set({ uniformityStep: 'preview', verifyUniformityResult: null, uniformityFormData: null, isSuccess: false, + createdUniformity: null, }), }); diff --git a/src/types/stores.d.ts b/src/types/stores.d.ts index 29878570..96a3c48b 100644 --- a/src/types/stores.d.ts +++ b/src/types/stores.d.ts @@ -1,6 +1,7 @@ import type { ProductionStandardRepeaterFormSchemaValues } from '@/components/pages/master-data/production-standard/form/ProductionStandardForm.schema'; import type { UniformityFormData, + UniformityDetail, VerifyUniformityResponse, } from '@/types/api/uniformity/uniformity'; @@ -59,11 +60,13 @@ export type UniformitySlice = { verifyUniformityResult: VerifyUniformityResponse | null; uniformityFormData: UniformityFormData | null; isSuccess: boolean; + createdUniformity: UniformityDetail | null; // Actions setUniformityStep: (step: UniformityStep) => void; setVerifyUniformityResult: (result: VerifyUniformityResponse | null) => void; setUniformityFormData: (data: UniformityFormData | null) => void; setIsSuccess: (success: boolean) => void; + setCreatedUniformity: (data: UniformityDetail | null) => void; resetUniformity: () => void; };