bug fixed

This commit is contained in:
Malini 2025-11-26 17:44:51 +05:30
parent 7958fff5e9
commit 398652e213
3 changed files with 185 additions and 105 deletions

View File

@ -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 (

View File

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

View File

@ -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>