From 157235433eb0ef1ae48496fb24a508c5fcc37114 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Fri, 10 Oct 2025 13:14:39 +0700 Subject: [PATCH] feat(FE-62): implement bulk removal functionality for selected products and ekspedisi in MovementForm --- .../inventory/movement/form/MovementForm.tsx | 180 ++++++++++++++++-- 1 file changed, 162 insertions(+), 18 deletions(-) diff --git a/src/components/pages/inventory/movement/form/MovementForm.tsx b/src/components/pages/inventory/movement/form/MovementForm.tsx index d9e1102e..14c6fc45 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.tsx +++ b/src/components/pages/inventory/movement/form/MovementForm.tsx @@ -38,6 +38,8 @@ interface MovementFormProps { const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { const [, setMovementFormErrorMessage] = useState(''); + const [selectedProducts, setSelectedProducts] = useState([]); + const [selectedEkspedisi, setSelectedEkspedisi] = useState([]); const { deleteModal, @@ -120,6 +122,15 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { [formik] ); + const bulkRemoveProduct = useCallback(() => { + const updatedProducts = + formik.values.product?.filter( + (_, idx) => !selectedProducts.includes(idx) + ) ?? []; + formik.setFieldValue('product', updatedProducts); + setSelectedProducts([]); + }, [formik, selectedProducts]); + const addEkspedisi = () => { const newEkspedisi = [ ...(formik.values.ekspedisi || []), @@ -157,6 +168,15 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { [formik] ); + const bulkRemoveEkspedisi = useCallback(() => { + const updatedEkspedisi = + formik.values.ekspedisi?.filter( + (_, idx) => !selectedEkspedisi.includes(idx) + ) ?? []; + formik.setFieldValue('ekspedisi', updatedEkspedisi); + setSelectedEkspedisi([]); + }, [formik, selectedEkspedisi]); + const isRepeaterInputError = ( arrayName: T, column: T extends 'product' ? keyof ProductSchema : keyof EkspedisiSchema, @@ -333,6 +353,29 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { + {type !== 'detail' && ( + + )} {type !== 'detail' && } @@ -341,6 +384,27 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { {formik.values.product?.map((product, idx) => ( + {type !== 'detail' && ( + + )}
+ 0 + } + onChange={(e) => { + if (e.target.checked) { + setSelectedProducts( + formik.values.product?.map((_, idx) => idx) ?? + [] + ); + } else { + setSelectedProducts([]); + } + }} + /> + Produk QtyAksi
+ { + if (e.target.checked) { + setSelectedProducts([ + ...selectedProducts, + idx, + ]); + } else { + setSelectedProducts( + selectedProducts.filter((i) => i !== idx) + ); + } + }} + /> + {
{type !== 'detail' && ( - +
+ {selectedProducts.length > 0 && ( + + )} + +
)} @@ -428,6 +509,30 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { + {type !== 'detail' && ( + + )} @@ -444,6 +549,27 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { + {type !== 'detail' && ( + + )}
+ 0 + } + onChange={(e) => { + if (e.target.checked) { + setSelectedEkspedisi( + formik.values.ekspedisi?.map( + (_, idx) => idx + ) ?? [] + ); + } else { + setSelectedEkspedisi([]); + } + }} + /> + Produk Qty Supplier
+ { + if (e.target.checked) { + setSelectedEkspedisi([ + ...selectedEkspedisi, + idx, + ]); + } else { + setSelectedEkspedisi( + selectedEkspedisi.filter((i) => i !== idx) + ); + } + }} + /> + {
{type !== 'detail' && ( - +
+ {selectedEkspedisi.length > 0 && ( + + )} + +
)}