added csrf token for rejection

This commit is contained in:
Malini 2025-12-19 13:16:12 +05:30
parent 89e2bd3785
commit 3bd9a55ea6
4 changed files with 70 additions and 69 deletions

View File

@ -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()
});

View File

@ -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()
});

View File

@ -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()
});

View File

@ -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);
}
};