added csrf token for rejection
This commit is contained in:
parent
89e2bd3785
commit
3bd9a55ea6
@ -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()
|
||||
});
|
||||
|
||||
@ -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()
|
||||
});
|
||||
|
||||
@ -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()
|
||||
});
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user