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); setShowRejectError(false);
}; };
const handleApproveConfirm = async () => { const handleApproveConfirm = async () => {
if (!selectedSubmission || isProcessing) return; if (!selectedSubmission || isProcessing) return;
setIsProcessing(true); setIsProcessing(true);
try { try {
const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, { const response = await apiClient.put(`/approveOrRejectSubmission/${selectedSubmission.id}`, {
approve_reject_status: 1, approve_reject_status: 1,
remarks: '' 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) { if (ok) {
toast.success('Submission approved successfully'); toast.success('Submission approved successfully');
// Update the status of the current item in the data array const currentUser = JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin';
setData(prevData => const currentTime = new Date().toISOString();
prevData.map(item => const updatedAt = response?.data?.updated_at || new Date().toISOString();
item.id === selectedSubmission.id
? { // Update the status of the current item in the data array
...item, setData(prevData =>
status: 'Approved', prevData.map(item =>
reviewer: JSON.parse(sessionStorage.getItem("user_profile"))?.name || 'Admin', item.id === selectedSubmission.id
reviewerOn: new Date().toISOString() ? {
} ...item,
: item status: 'Approved',
) reviewer_name: currentUser,
); reviewerOn: updatedAt
} else { }
throw new Error('Failed to approve submission'); : item
} )
} catch (error) { );
console.error('Error approving submission:', error); } else {
toast.error(error.message || 'Failed to approve submission'); throw new Error('Failed to approve submission');
} finally {
setIsProcessing(false);
setShowApproveModal(false);
setSelectedSubmission(null);
} }
}; } 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 () => { const handleRejectConfirm = async () => {
if (!selectedSubmission || isProcessing) { if (!selectedSubmission || isProcessing) {
return; 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');
} }
} catch (error) {
// Validate the rejection reason console.error('Error rejecting submission:', error);
if (!rejectionReason.trim()) { toast.error(error.message || 'Failed to reject submission');
setShowRejectError(true); } finally {
toast.error('Please provide a reason for rejection'); setIsProcessing(false);
return; setShowRejectModal(false);
} setSelectedSubmission(null);
}
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);
}
};
const headers = [ const headers = [
'Establishment', 'Establishment',
'Emirates', 'Emirates',
@ -268,20 +275,43 @@ const SubmissionTable = ({ selectedQuarter, selectedYear }) => {
'Actions', 'Actions',
]; ];
const tableRows = filtered.map((item) => [ // const tableRows = filtered.map((item) => [
item?.establishment?.factory_name || '-', // item?.establishment?.factory_name || '-',
item?.establishment?.establishment_emirate?.name || '-', // item?.establishment?.establishment_emirate?.name || '-',
item?.year || '-', // item?.year || '-',
item?.quarter || '-', // item?.quarter || '-',
item?.product_count || '-', // item?.product_count || '-',
userProfile?.name || '-', // // Submitted By - get from created_by_name field
<span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>, // item?.created_by_name || '-',
renderStatusBadge(item?.status), // <span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>,
userProfile?.name || '-', // renderStatusBadge(item?.status),
<span className="whitespace-nowrap">{formatDate(item?.created_at)}</span>, // // Reviewer - get from reviewer_name field (person who approved/rejected)
item, // 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]; const columnWidths = [220, 150, 100, 100, 130, 150, 180, 150, 150, 180, 120];
return ( return (

View File

@ -905,11 +905,22 @@ const EditCompanyProfile = () => {
return ( return (
<li key={product.value} className="p-3 hover:bg-[#F9FAFB] flex justify-between items-center"> <li key={product.value} className="p-3 hover:bg-[#F9FAFB] flex justify-between items-center">
<div className="flex items-center gap-2"> <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" /> <MdAdminPanelSettings className="text-[#92722A] text-lg" title="Added by Admin" />
) : ( ) : (
<FaBuilding className="text-[#92722A]" title="Added by Establishment" /> <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>
<div className="text-sm font-medium text-[#111827]"> <div className="text-sm font-medium text-[#111827]">
{product.label} {product.label}

View File

@ -1027,7 +1027,7 @@ const Survey = () => {
onRemarksChange={setRemarks} onRemarksChange={setRemarks}
/> />
)} )}
{step === 3 && ( {/* {step === 3 && (
<ReviewSubmit <ReviewSubmit
establishment={establishmentData} establishment={establishmentData}
products={productsData} products={productsData}
@ -1046,7 +1046,46 @@ const Survey = () => {
hasSubmitted={false} hasSubmitted={false}
remarks={remarks} 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> </div>
</main> </main>