From 3bd9a55ea61aded5fbf5c6ff4499f4e951494156 Mon Sep 17 00:00:00 2001 From: Malini Date: Fri, 19 Dec 2025 13:16:12 +0530 Subject: [PATCH] added csrf token for rejection --- .../src/components/admin/SubmissionTable.jsx | 6 +- .../src/pages/Admin/ValidationReview.jsx | 4 +- .../src/pages/Admin/Validations.jsx | 4 +- .../pages/Admin/configuration/IsicHsCodes.jsx | 125 +++++++++--------- 4 files changed, 70 insertions(+), 69 deletions(-) diff --git a/ipi-survey-platform/src/components/admin/SubmissionTable.jsx b/ipi-survey-platform/src/components/admin/SubmissionTable.jsx index 0de6052..4e6c5ce 100644 --- a/ipi-survey-platform/src/components/admin/SubmissionTable.jsx +++ b/ipi-survey-platform/src/components/admin/SubmissionTable.jsx @@ -4,6 +4,8 @@ import Table from '@/components/common/Table'; import apiClient from '../../services/api/apiClient.js'; import { CheckCircle2, XCircle, Eye, X } from 'lucide-react'; import { toast } from 'react-toastify'; +import { putRequest } from '@/services/api/CommonService'; + const SubmissionTable = ({ selectedQuarter, selectedYear }) => { const [data, setData] = useState([]); @@ -172,7 +174,7 @@ const handleApproveConfirm = async () => { setIsProcessing(true); try { - const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, { + const response = await putRequest(`/approveOrRejectSubmission/${selectedSubmission.id}`, { approve_reject_status: 1, remarks: '' }); @@ -226,7 +228,7 @@ const handleRejectConfirm = async () => { setIsProcessing(true); try { - const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, { + const response = await putRequest(`/approveOrRejectSubmission/${selectedSubmission.id}`, { approve_reject_status: 0, remarks: rejectionReason.trim() }); diff --git a/ipi-survey-platform/src/pages/Admin/ValidationReview.jsx b/ipi-survey-platform/src/pages/Admin/ValidationReview.jsx index b220377..d18c925 100644 --- a/ipi-survey-platform/src/pages/Admin/ValidationReview.jsx +++ b/ipi-survey-platform/src/pages/Admin/ValidationReview.jsx @@ -695,7 +695,7 @@ const ValidationReview = () => { setActionLoading(true); try { - const response = await apiClient.put(`/approveOrRejectSubmission/${id}`, { + const response = await putRequest(`/approveOrRejectSubmission/${id}`, { approve_reject_status: 1, remarks: '' }); @@ -733,7 +733,7 @@ const ValidationReview = () => { setActionLoading(true); try { - const response = await apiClient.put(`/approveOrRejectSubmission/${id}`, { + const response = await putRequest(`/approveOrRejectSubmission/${id}`, { approve_reject_status: 0, remarks: rejectReason.trim() }); diff --git a/ipi-survey-platform/src/pages/Admin/Validations.jsx b/ipi-survey-platform/src/pages/Admin/Validations.jsx index ada6014..e7e98d0 100644 --- a/ipi-survey-platform/src/pages/Admin/Validations.jsx +++ b/ipi-survey-platform/src/pages/Admin/Validations.jsx @@ -134,7 +134,7 @@ const ManageSubmissions = () => { setIsApproving(true); try { - const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, { + const response = await putRequest(`/approveOrRejectSubmission/${selectedSubmission.id}`, { approve_reject_status: 1, remarks: '' }); @@ -187,7 +187,7 @@ const ManageSubmissions = () => { setIsRejecting(true); try { - const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, { + const response = await putRequest(`/approveOrRejectSubmission/${selectedSubmission.id}`, { approve_reject_status: 0, remarks: rejectReason.trim() }); diff --git a/ipi-survey-platform/src/pages/Admin/configuration/IsicHsCodes.jsx b/ipi-survey-platform/src/pages/Admin/configuration/IsicHsCodes.jsx index 2d620e7..5d2814c 100644 --- a/ipi-survey-platform/src/pages/Admin/configuration/IsicHsCodes.jsx +++ b/ipi-survey-platform/src/pages/Admin/configuration/IsicHsCodes.jsx @@ -741,11 +741,12 @@ const IsicHsCodes = () => { } }; - const [deletingRowIndex, setDeletingRowIndex] = React.useState(null); + const [deletingProductId, setDeletingProductId] = React.useState(null); const handleDelete = async (paginationIndex) => { - const dataIndex = (currentPage - 1) * pageSize + paginationIndex; - const selected = rowsData[dataIndex]; + // Calculate the actual index in the filtered data based on pagination + const actualIndex = (currentPage - 1) * pageSize + paginationIndex; + const selected = filteredData[actualIndex]; if (!selected || !selected.id) { console.error('No product selected or missing ID'); @@ -763,15 +764,8 @@ const IsicHsCodes = () => { throw new Error('Invalid product data received'); } - // Update the local data with the latest information - const updatedRowsData = [...rowsData]; - updatedRowsData[dataIndex] = { - ...selected, - ...response.data - }; - - setRowsData(updatedRowsData); - setDeletingRowIndex(dataIndex); + // Store the product ID for deletion + setDeletingProductId(selected.id); setShowDeleteConfirm(true); } catch (error) { console.error('Error preparing product for deletion:', error); @@ -782,87 +776,92 @@ const IsicHsCodes = () => { }; const deletingCode = React.useMemo(() => { - if (deletingRowIndex === null || deletingRowIndex < 0 || deletingRowIndex >= rowsData.length) - return null; - return rowsData[deletingRowIndex]; - }, [deletingRowIndex, rowsData]); + if (!deletingProductId) return null; + return rowsData.find(item => item.id === deletingProductId) || null; + }, [deletingProductId, rowsData]); const closeDeleteConfirm = () => { setShowDeleteConfirm(false); - setDeletingRowIndex(null); + setDeletingProductId(null); }; const handleDeleteConfirm = async () => { - if (deletingRowIndex === null || deletingRowIndex < 0 || deletingRowIndex >= rowsData.length) { - const errorMsg = 'Invalid row selected for deletion'; - console.error(errorMsg, { deletingRowIndex, rowsDataLength: rowsData.length }); + if (!deletingProductId) { + const errorMsg = 'No product selected for deletion'; + console.error(errorMsg); setToast({ show: true, message: errorMsg, type: 'error' }); setShowDeleteConfirm(false); - setDeletingRowIndex(null); return; } try { setIsLoading(true); - const product = rowsData[deletingRowIndex]; - const productId = product?.id; + // Delete the product by ID + await productService.deleteProduct(deletingProductId); - if (!productId) { - throw new Error('No product ID found for deletion'); + // Update the local state by filtering out the deleted product + const updatedData = rowsData.filter(item => item.id !== deletingProductId); + setRowsData(updatedData); + + // Update filtered data if search is active + if (searchTerm) { + const newFilteredData = updatedData.filter(item => + Object.values(item).some(val => + String(val).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + setFilteredData(newFilteredData); } - - try { - await productService.deleteProduct(productId); + + // Calculate the current page after deletion + const currentItemsCount = updatedData.length; + const maxPage = Math.max(1, Math.ceil(currentItemsCount / pageSize)); + + // If we're on a page that no longer exists after deletion, go to the previous page + if (currentPage > maxPage && maxPage > 0) { + setCurrentPage(maxPage); + } + + setToast({ show: true, message: 'Product deleted successfully!', type: 'success' }); + } catch (error) { + console.error('Error deleting product:', error); + + // Handle 204 No Content response + if (error.response && error.response.status === 204) { + // Update the local state by filtering out the deleted product + const updatedData = rowsData.filter(item => item.id !== deletingProductId); + setRowsData(updatedData); + + // Update filtered data if search is active + if (searchTerm) { + const newFilteredData = updatedData.filter(item => + Object.values(item).some(val => + String(val).toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + setFilteredData(newFilteredData); + } // Calculate the current page after deletion - const currentItemsCount = rowsData.length - 1; // After deletion + const currentItemsCount = updatedData.length; const maxPage = Math.max(1, Math.ceil(currentItemsCount / pageSize)); // If we're on a page that no longer exists after deletion, go to the previous page - // But only if we're not already on the first page if (currentPage > maxPage && maxPage > 0) { setCurrentPage(maxPage); } - const newData = [...rowsData]; - newData.splice(deletingRowIndex, 1); - setRowsData(newData); - setToast({ show: true, message: 'Product deleted successfully!', type: 'success' }); - } catch (apiError) { - console.error('API Error:', apiError); - if (apiError.response && apiError.response.status === 204) { - // Calculate the current page after deletion for 204 response - const currentItemsCount = rowsData.length - 1; // After deletion - const maxPage = Math.max(1, Math.ceil(currentItemsCount / pageSize)); - - // If we're on a page that no longer exists after deletion, go to the previous page - // But only if we're not already on the first page - if (currentPage > maxPage && maxPage > 0) { - setCurrentPage(maxPage); - } - - const newData = [...rowsData]; - newData.splice(deletingRowIndex, 1); - setRowsData(newData); - - setToast({ show: true, message: 'Product deleted successfully!', type: 'success' }); - } else { - const errorMessage = apiError.response?.data?.message || 'Failed to delete product. Please try again.'; - setError(errorMessage); - setToast({ show: true, message: errorMessage, type: 'error' }); - } + } else { + const errorMessage = error.response?.data?.message || 'Failed to delete product. Please try again.'; + setError(errorMessage); + setToast({ show: true, message: errorMessage, type: 'error' }); } - } catch (error) { - console.error('Error in delete process:', error); - const errorMessage = error.message || 'An unexpected error occurred'; - setError(errorMessage); - setToast({ show: true, message: errorMessage, type: 'error' }); } finally { setIsLoading(false); setShowDeleteConfirm(false); - setDeletingRowIndex(null); + setDeletingProductId(null); } };