From c74733430bd493f4b6fb5c291d277241333f0131 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Fri, 21 Nov 2025 13:26:34 +0700 Subject: [PATCH] feat(FE-208): implement conditional item deletion in PurchaseOrderDetail and update form handling in PurchaseOrderStaffApprovalForm --- .../order/PurchaseOrderStaffApprovalForm.tsx | 43 +++++------ .../purchase/order/PurchaseOrderDetail.tsx | 77 ++++++++++--------- 2 files changed, 59 insertions(+), 61 deletions(-) diff --git a/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx b/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx index a1d4fae1..5717f4c1 100644 --- a/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx +++ b/src/components/pages/purchase/form/order/PurchaseOrderStaffApprovalForm.tsx @@ -252,7 +252,7 @@ const PurchaseOrderStaffApprovalForm = ({ (item) => item.id === purchaseItem.id ); return { - purchase_item_id: type === 'edit' ? purchaseItem.value : undefined, + purchase_item_id: purchaseItem.id, product_id: purchaseItem.product_id || 0, warehouse_id: purchaseItem.warehouse_id || 0, qty: purchaseItem.quantity || 0, @@ -266,36 +266,27 @@ const PurchaseOrderStaffApprovalForm = ({ }, [purchaseItems, type, initialValues]); // ===== PURCHASE ITEM OPERATIONS ===== - const findItemIndex = (purchaseItemId: number) => { - return purchaseItems.findIndex((item) => item.id === purchaseItemId); - }; - const handlePurchaseItemChange = ( purchaseItemId: number, field: 'price' | 'total_price', value: string | number ) => { - const itemIndex = findItemIndex(purchaseItemId); const formItemIndex = formik.values.items?.findIndex( (item) => item.purchase_item_id === purchaseItemId ); + const purchaseItem = purchaseItems.find( + (item) => item.id === purchaseItemId + ); - if (itemIndex === -1 || formItemIndex === -1) return; + if (formItemIndex === -1 || !purchaseItem) return; if (field === 'price' || field === 'total_price') { const numValue = typeof value === 'string' ? parseFloat(value) || 0 : value; formik.setFieldValue(`items.${formItemIndex}.${field}`, numValue); - const selectedItem = purchaseItems[itemIndex]; - - if ( - field === 'price' && - selectedItem && - selectedItem.quantity > 0 && - numValue >= 0 - ) { - const calculatedTotal = numValue * selectedItem.quantity; + if (field === 'price' && purchaseItem.quantity > 0 && numValue >= 0) { + const calculatedTotal = numValue * purchaseItem.quantity; formik.setFieldValue( `items.${formItemIndex}.total_price`, calculatedTotal @@ -304,11 +295,10 @@ const PurchaseOrderStaffApprovalForm = ({ if ( field === 'total_price' && - selectedItem && - selectedItem.quantity > 0 && + purchaseItem.quantity > 0 && numValue >= 0 ) { - const calculatedPrice = numValue / selectedItem.quantity; + const calculatedPrice = numValue / purchaseItem.quantity; formik.setFieldValue(`items.${formItemIndex}.price`, calculatedPrice); } } @@ -362,6 +352,11 @@ const PurchaseOrderStaffApprovalForm = ({ (item) => item.purchase_item_id === purchaseItem.id ); + const formItemIndex = + formik.values.items?.findIndex( + (item) => + item.purchase_item_id === purchaseItem.id + ); return ( @@ -383,7 +378,7 @@ const PurchaseOrderStaffApprovalForm = ({ handlePurchaseItemChange( @@ -473,7 +468,7 @@ const PurchaseOrderStaffApprovalForm = ({ handlePurchaseItemChange( diff --git a/src/components/pages/purchase/order/PurchaseOrderDetail.tsx b/src/components/pages/purchase/order/PurchaseOrderDetail.tsx index 242abf58..88f622b5 100644 --- a/src/components/pages/purchase/order/PurchaseOrderDetail.tsx +++ b/src/components/pages/purchase/order/PurchaseOrderDetail.tsx @@ -1,7 +1,7 @@ 'use client'; import { useCallback, useMemo, useState } from 'react'; -import { ColumnDef, SortingState } from '@tanstack/react-table'; +import { ColumnDef, SortingState, Row, Table as TableType } from '@tanstack/react-table'; import ApprovalSteps, { useApprovalSteps, @@ -156,6 +156,11 @@ const PurchaseOrderDetail = ({ const showApprovalButton = approvalStep !== null && approvalStep >= 1 && approvalStep <= 3; + const canDeleteItems = useMemo(() => { + if (!initialValues?.approval) return false; + return initialValues.approval.step_number >= 3; + }, [initialValues?.approval]); + const handleApprovalClick = () => { if (!approvalStep) return; @@ -186,12 +191,6 @@ const PurchaseOrderDetail = ({ } }; - useMemo(() => { - if (!initialValues?.approval) return false; - - const currentStep = initialValues.approval.step_number; - return currentStep >= 4; - }, [initialValues?.approval]); const canShowPurchaseOrderInvoice = useMemo(() => { if (!initialValues?.approval) return false; @@ -345,32 +344,36 @@ const PurchaseOrderDetail = ({ const purchaseData = initialValues; const purchaseOrderColumns: ColumnDef[] = [ - { - id: 'select', - header: ({ table }) => ( -
- -
- ), - cell: ({ row }) => { - return ( -
- -
- ); - }, - }, + ...(canDeleteItems + ? [ + { + id: 'select', + header: ({ table }: { table: TableType }) => ( +
+ +
+ ), + cell: ({ row }: { row: Row }) => { + return ( +
+ +
+ ); + }, + }, + ] + : []), { header: 'No', cell: (props) => props.row.index + 1, @@ -426,7 +429,7 @@ const PurchaseOrderDetail = ({ deleteModal.openModal(); }; - return ( + return canDeleteItems ? ( - ); + ) : null; }, }, ]; @@ -738,7 +741,7 @@ const PurchaseOrderDetail = ({ setSorting={setSorting} rowSelection={rowSelection} setRowSelection={setRowSelection} - enableRowSelection={() => true} + enableRowSelection={() => canDeleteItems} className={{ containerClassName: 'm-0', tableWrapperClassName: 'overflow-x-auto', @@ -755,7 +758,7 @@ const PurchaseOrderDetail = ({ {/* Bulk Action Buttons */} - {selectedRowIds.length > 0 && ( + {selectedRowIds.length > 0 && canDeleteItems && (