From 41d2e8737b96e04a8edb14f3388995c7e3fc7c68 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Sun, 8 Mar 2026 21:54:55 +0700 Subject: [PATCH] feat(FE): Add chickin delete functionality with modal confirmation --- .../chickin/form/tabs/ChickLogsView.tsx | 50 +++++++++++++--- .../project-flock/ProjectFlockTable.tsx | 46 +++++++++++++++ .../production/chickin/chickin.store.ts | 5 +- .../chickin/slices/chickin-delete.slice.ts | 57 +++++++++++++++++++ 4 files changed, 148 insertions(+), 10 deletions(-) create mode 100644 src/stores/production/chickin/slices/chickin-delete.slice.ts diff --git a/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx b/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx index bdffda33..ba489b89 100644 --- a/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx +++ b/src/components/pages/production/chickin/form/tabs/ChickLogsView.tsx @@ -23,7 +23,7 @@ const ChickinLogsView = ({ rawDataApprovals: BaseApproval[]; }) => { const [chickinErrorMessage, setChickinErrorMessage] = useState(''); - const { openChickinApproveModal } = useChickinStore(); + const { openChickinApproveModal, openChickinDeleteModal } = useChickinStore(); const handleClickApprove = () => { openChickinApproveModal(initialValues, async (notes?: string) => { @@ -44,6 +44,21 @@ const ChickinLogsView = ({ }); }; + const handleDeleteChickin = (chickinId: number) => { + openChickinDeleteModal(chickinId, async () => { + const deleteRes = await ChickinApi.delete(chickinId); + + if (isResponseSuccess(deleteRes)) { + toast.success(deleteRes?.message || 'Chickin berhasil dihapus'); + afterSubmit && afterSubmit(); + } + + if (isResponseError(deleteRes)) { + toast.error(deleteRes?.message || 'Gagal menghapus chickin'); + } + }); + }; + return ( <>
@@ -86,14 +101,30 @@ const ChickinLogsView = ({
Chick In #{index + 1} - {latestApproval?.step_number}
- +
+ + + {isApproved && ( + + )} +
{/* Tanggal Chick In */} @@ -169,6 +200,7 @@ const ChickinLogsView = ({ )} + ); }; diff --git a/src/components/pages/production/project-flock/ProjectFlockTable.tsx b/src/components/pages/production/project-flock/ProjectFlockTable.tsx index 1ae56fa2..bdc271a6 100644 --- a/src/components/pages/production/project-flock/ProjectFlockTable.tsx +++ b/src/components/pages/production/project-flock/ProjectFlockTable.tsx @@ -200,6 +200,7 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { const confirmModal = useModal(); const successModal = useModal(); const chickinApproveModal = useModal(); + const chickinDeleteModal = useModal(); const closingModal = useModal(); const [approvalAction, setApprovalAction] = useState<'APPROVED' | 'REJECTED'>( 'APPROVED' @@ -214,6 +215,11 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { chickinApproveCallback, closeChickinApproveModal, setChickinApproveLoading, + isChickinDeleteModalOpen, + isChickinDeleteLoading, + chickinDeleteCallback, + closeChickinDeleteModal, + setChickinDeleteLoading, } = useChickinStore(); const { @@ -478,6 +484,14 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { } }, [isChickinApproveModalOpen, chickinApproveModal]); + useEffect(() => { + if (isChickinDeleteModalOpen) { + chickinDeleteModal.openModal(); + } else { + chickinDeleteModal.closeModal(); + } + }, [isChickinDeleteModalOpen, chickinDeleteModal]); + useEffect(() => { if (isClosingModalOpen) { closingModal.openModal(); @@ -1208,6 +1222,38 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => { }} /> + {/* Chickin Delete Modal */} + { + closeChickinDeleteModal(); + }, + }} + className={{ + modal: 'z-9999', + }} + primaryButton={{ + text: 'Ya', + color: 'error', + isLoading: isChickinDeleteLoading, + onClick: async () => { + if (chickinDeleteCallback) { + setChickinDeleteLoading(true); + try { + await chickinDeleteCallback(); + } finally { + setChickinDeleteLoading(false); + closeChickinDeleteModal(); + } + } + }, + }} + /> + {/* Filter Modal */} ()( devtools( (...args) => ({ ...createChickinApprovalSlice(...args), + ...createChickinDeleteSlice(...args), }), { name: 'ChickinStore', diff --git a/src/stores/production/chickin/slices/chickin-delete.slice.ts b/src/stores/production/chickin/slices/chickin-delete.slice.ts new file mode 100644 index 00000000..5f110b85 --- /dev/null +++ b/src/stores/production/chickin/slices/chickin-delete.slice.ts @@ -0,0 +1,57 @@ +import { StateCreator } from 'zustand'; + +export type ChickinDeleteSlice = { + // State + isChickinDeleteModalOpen: boolean; + selectedChickinIdForDelete: number | null; + isChickinDeleteLoading: boolean; + chickinDeleteCallback: (() => Promise) | null; + + // Actions + openChickinDeleteModal: ( + chickinId: number, + callback: () => Promise + ) => void; + closeChickinDeleteModal: () => void; + setChickinDeleteLoading: (loading: boolean) => void; + resetChickinDelete: () => void; +}; + +export const createChickinDeleteSlice: StateCreator< + ChickinDeleteSlice, + [], + [], + ChickinDeleteSlice +> = (set) => ({ + // Initial state + isChickinDeleteModalOpen: false, + selectedChickinIdForDelete: null, + isChickinDeleteLoading: false, + chickinDeleteCallback: null, + + // Actions + openChickinDeleteModal: (chickinId, callback) => + set({ + isChickinDeleteModalOpen: true, + selectedChickinIdForDelete: chickinId, + chickinDeleteCallback: callback, + }), + + closeChickinDeleteModal: () => + set({ + isChickinDeleteModalOpen: false, + selectedChickinIdForDelete: null, + chickinDeleteCallback: null, + }), + + setChickinDeleteLoading: (loading) => + set({ isChickinDeleteLoading: loading }), + + resetChickinDelete: () => + set({ + isChickinDeleteModalOpen: false, + selectedChickinIdForDelete: null, + isChickinDeleteLoading: false, + chickinDeleteCallback: null, + }), +});