bug fixed
This commit is contained in:
parent
7958fff5e9
commit
398652e213
@ -161,99 +161,106 @@ const SubmissionTable = ({ selectedQuarter, selectedYear }) => {
|
||||
setShowRejectError(false);
|
||||
};
|
||||
|
||||
const handleApproveConfirm = async () => {
|
||||
if (!selectedSubmission || isProcessing) return;
|
||||
|
||||
setIsProcessing(true);
|
||||
try {
|
||||
const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, {
|
||||
approve_reject_status: 1,
|
||||
remarks: ''
|
||||
});
|
||||
const handleApproveConfirm = async () => {
|
||||
if (!selectedSubmission || isProcessing) return;
|
||||
|
||||
setIsProcessing(true);
|
||||
try {
|
||||
const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, {
|
||||
approve_reject_status: 1,
|
||||
remarks: ''
|
||||
});
|
||||
|
||||
const ok = (response && response.data) || response?.status === 200 || response?.status === 'success';
|
||||
const ok = (response && response.data) || response?.status === 200 || response?.status === 'success';
|
||||
|
||||
if (ok) {
|
||||
toast.success('Submission approved successfully');
|
||||
|
||||
// Update the status of the current item in the data array
|
||||
setData(prevData =>
|
||||
prevData.map(item =>
|
||||
item.id === selectedSubmission.id
|
||||
? {
|
||||
...item,
|
||||
status: 'Approved',
|
||||
reviewer: JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin',
|
||||
reviewerOn: new Date().toISOString()
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
} else {
|
||||
throw new Error('Failed to approve submission');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error approving submission:', error);
|
||||
toast.error(error.message || 'Failed to approve submission');
|
||||
} finally {
|
||||
setIsProcessing(false);
|
||||
setShowApproveModal(false);
|
||||
setSelectedSubmission(null);
|
||||
if (ok) {
|
||||
toast.success('Submission approved successfully');
|
||||
|
||||
const currentUser = JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin';
|
||||
const currentTime = new Date().toISOString();
|
||||
const updatedAt = response?.data?.updated_at || new Date().toISOString();
|
||||
|
||||
// Update the status of the current item in the data array
|
||||
setData(prevData =>
|
||||
prevData.map(item =>
|
||||
item.id === selectedSubmission.id
|
||||
? {
|
||||
...item,
|
||||
status: 'Approved',
|
||||
reviewer_name: currentUser,
|
||||
reviewerOn: updatedAt
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
} else {
|
||||
throw new Error('Failed to approve submission');
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Error approving submission:', error);
|
||||
toast.error(error.message || 'Failed to approve submission');
|
||||
} finally {
|
||||
setIsProcessing(false);
|
||||
setShowApproveModal(false);
|
||||
setSelectedSubmission(null);
|
||||
}
|
||||
};
|
||||
|
||||
const handleRejectConfirm = async () => {
|
||||
if (!selectedSubmission || isProcessing) {
|
||||
return;
|
||||
const handleRejectConfirm = async () => {
|
||||
if (!selectedSubmission || isProcessing) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Validate the rejection reason
|
||||
if (!rejectionReason.trim()) {
|
||||
setShowRejectError(true);
|
||||
toast.error('Please provide a reason for rejection');
|
||||
return;
|
||||
}
|
||||
|
||||
setIsProcessing(true);
|
||||
try {
|
||||
const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, {
|
||||
approve_reject_status: 0,
|
||||
remarks: rejectionReason.trim()
|
||||
});
|
||||
|
||||
const ok = (response && response.data) || response?.status === 200 || response?.status === 'success';
|
||||
|
||||
if (ok) {
|
||||
toast.error('Submission has been rejected');
|
||||
|
||||
const currentUser = JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin';
|
||||
const currentTime = new Date().toISOString();
|
||||
const updatedAt = response?.data?.updated_at || new Date().toISOString();
|
||||
|
||||
// Update the status of the current item in the data array
|
||||
setData(prevData =>
|
||||
prevData.map(item =>
|
||||
item.id === selectedSubmission.id
|
||||
? {
|
||||
...item,
|
||||
status: 'Rejected',
|
||||
reviewer_name: currentUser,
|
||||
reviewerOn: updatedAt
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
|
||||
setRejectionReason('');
|
||||
} else {
|
||||
throw new Error('Failed to reject submission');
|
||||
}
|
||||
|
||||
// Validate the rejection reason
|
||||
if (!rejectionReason.trim()) {
|
||||
setShowRejectError(true);
|
||||
toast.error('Please provide a reason for rejection');
|
||||
return;
|
||||
}
|
||||
|
||||
setIsProcessing(true);
|
||||
try {
|
||||
const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, {
|
||||
approve_reject_status: 0,
|
||||
remarks: rejectionReason.trim()
|
||||
});
|
||||
|
||||
const ok = (response && response.data) || response?.status === 200 || response?.status === 'success';
|
||||
|
||||
if (ok) {
|
||||
toast.error('Submission has been rejected');
|
||||
|
||||
// Update the status of the current item in the data array
|
||||
setData(prevData =>
|
||||
prevData.map(item =>
|
||||
item.id === selectedSubmission.id
|
||||
? {
|
||||
...item,
|
||||
status: 'Rejected',
|
||||
reviewer: JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin',
|
||||
reviewerOn: new Date().toISOString()
|
||||
}
|
||||
: item
|
||||
)
|
||||
);
|
||||
|
||||
setRejectionReason('');
|
||||
} else {
|
||||
throw new Error('Failed to reject submission');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error rejecting submission:', error);
|
||||
toast.error(error.message || 'Failed to reject submission');
|
||||
} finally {
|
||||
setIsProcessing(false);
|
||||
setShowRejectModal(false);
|
||||
setSelectedSubmission(null);
|
||||
}
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error rejecting submission:', error);
|
||||
toast.error(error.message || 'Failed to reject submission');
|
||||
} finally {
|
||||
setIsProcessing(false);
|
||||
setShowRejectModal(false);
|
||||
setSelectedSubmission(null);
|
||||
}
|
||||
};
|
||||
const headers = [
|
||||
'Establishment',
|
||||
'Emirates',
|
||||
@ -268,20 +275,43 @@ const SubmissionTable = ({ selectedQuarter, selectedYear }) => {
|
||||
'Actions',
|
||||
];
|
||||
|
||||
const tableRows = filtered.map((item) => [
|
||||
item?.establishment?.factory_name || '-',
|
||||
item?.establishment?.establishment_emirate?.name || '-',
|
||||
item?.year || '-',
|
||||
item?.quarter || '-',
|
||||
item?.product_count || '-',
|
||||
userProfile?.name || '-',
|
||||
<span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>,
|
||||
renderStatusBadge(item?.status),
|
||||
userProfile?.name || '-',
|
||||
<span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>,
|
||||
item,
|
||||
]);
|
||||
// const tableRows = filtered.map((item) => [
|
||||
// item?.establishment?.factory_name || '-',
|
||||
// item?.establishment?.establishment_emirate?.name || '-',
|
||||
// item?.year || '-',
|
||||
// item?.quarter || '-',
|
||||
// item?.product_count || '-',
|
||||
// // Submitted By - get from created_by_name field
|
||||
// item?.created_by_name || '-',
|
||||
// <span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>,
|
||||
// renderStatusBadge(item?.status),
|
||||
// // Reviewer - get from reviewer_name field (person who approved/rejected)
|
||||
// item?.reviewer_name || '-',
|
||||
// // Reviewed On - use reviewerOn for reviewed date
|
||||
// <span className="whitespace-nowrap">{formatDate(item?.reviewerOn)}</span>,
|
||||
// item,
|
||||
// ]);
|
||||
|
||||
const tableRows = filtered.map((item) => [
|
||||
item?.establishment?.factory_name || '-',
|
||||
item?.establishment?.establishment_emirate?.name || '-',
|
||||
item?.year || '-',
|
||||
item?.quarter || '-',
|
||||
item?.product_count || '-',
|
||||
// Submitted By - get from created_by_name field
|
||||
item?.created_by_name || '-',
|
||||
<span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>,
|
||||
renderStatusBadge(item?.status),
|
||||
// Reviewer - show reviewer_name after approval/rejection, otherwise show '-'
|
||||
item?.status?.toLowerCase() === 'approved' || item?.status?.toLowerCase() === 'rejected'
|
||||
? (item?.reviewer_name || JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin')
|
||||
: '-',
|
||||
// Reviewed On - show reviewerOn after approval/rejection, otherwise show '-'
|
||||
item?.status?.toLowerCase() === 'approved' || item?.status?.toLowerCase() === 'rejected'
|
||||
? <span className="whitespace-nowrap">{formatDate(item?.reviewerOn)}</span>
|
||||
: '-',
|
||||
item,
|
||||
]);
|
||||
const columnWidths = [220, 150, 100, 100, 130, 150, 180, 150, 150, 180, 120];
|
||||
|
||||
return (
|
||||
|
||||
@ -905,11 +905,22 @@ const EditCompanyProfile = () => {
|
||||
return (
|
||||
<li key={product.value} className="p-3 hover:bg-[#F9FAFB] flex justify-between items-center">
|
||||
<div className="flex items-center gap-2">
|
||||
{product.action_done_by === "admin_users" ? (
|
||||
{/* {product.action_done_by === "admin_users" ? (
|
||||
<MdAdminPanelSettings className="text-[#92722A] text-lg" title="Added by Admin" />
|
||||
) : (
|
||||
<FaBuilding className="text-[#92722A]" title="Added by Establishment" />
|
||||
)}
|
||||
)} */}
|
||||
{product.action_done_by === "admin_users" ? (
|
||||
<MdAdminPanelSettings
|
||||
className="text-[#92722A] text-lg flex-shrink-0 w-6 h-6"
|
||||
title="Added by Admin"
|
||||
/>
|
||||
) : (
|
||||
<FaBuilding
|
||||
className="text-[#92722A] flex-shrink-0 w-6 h-5"
|
||||
title="Added by Establishment"
|
||||
/>
|
||||
)}
|
||||
<div>
|
||||
<div className="text-sm font-medium text-[#111827]">
|
||||
{product.label}
|
||||
|
||||
@ -1027,7 +1027,7 @@ const Survey = () => {
|
||||
onRemarksChange={setRemarks}
|
||||
/>
|
||||
)}
|
||||
{step === 3 && (
|
||||
{/* {step === 3 && (
|
||||
<ReviewSubmit
|
||||
establishment={establishmentData}
|
||||
products={productsData}
|
||||
@ -1046,7 +1046,46 @@ const Survey = () => {
|
||||
hasSubmitted={false}
|
||||
remarks={remarks}
|
||||
/>
|
||||
)}
|
||||
)} */}
|
||||
{step === 3 && (
|
||||
<div className="relative">
|
||||
|
||||
{/* 🔄 Loader Overlay */}
|
||||
{isSubmitting && (
|
||||
<div className="absolute inset-0 bg-black/30 flex items-center justify-center z-50 rounded">
|
||||
<div className="bg-white px-6 py-4 rounded shadow-md flex flex-col items-center">
|
||||
<div className="animate-spin h-8 w-8 border-4 border-[#92722A] border-t-transparent rounded-full"></div>
|
||||
<span className="text-sm text-[#92722A] mt-2">
|
||||
Submitting, please wait...
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/*Your Existing Component */}
|
||||
<div className={isSubmitting ? "pointer-events-none opacity-70" : ""}>
|
||||
<ReviewSubmit
|
||||
establishment={establishmentData}
|
||||
products={productsData}
|
||||
onBack={() => setStep(2)}
|
||||
onSubmit={handleFinalSubmit}
|
||||
submitButtonText={isResubmit ? 'Resubmit' : 'Submit'}
|
||||
toast={toast}
|
||||
onToastClose={() => {
|
||||
if (toastTimeoutRef.current) {
|
||||
window.clearTimeout(toastTimeoutRef.current);
|
||||
toastTimeoutRef.current = null;
|
||||
}
|
||||
setToast(null);
|
||||
}}
|
||||
isSubmitting={isSubmitting}
|
||||
hasSubmitted={false}
|
||||
remarks={remarks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user