diff --git a/ipi-survey-platform/src/components/admin/SubmissionTable.jsx b/ipi-survey-platform/src/components/admin/SubmissionTable.jsx index 3605606..650b58c 100644 --- a/ipi-survey-platform/src/components/admin/SubmissionTable.jsx +++ b/ipi-survey-platform/src/components/admin/SubmissionTable.jsx @@ -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 || '-', - {formatDate(item?.created_at)}, - renderStatusBadge(item?.status), - userProfile?.name || '-', - {formatDate(item?.created_at)}, - 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 || '-', +// {formatDate(item?.created_at)}, +// renderStatusBadge(item?.status), +// // Reviewer - get from reviewer_name field (person who approved/rejected) +// item?.reviewer_name || '-', +// // Reviewed On - use reviewerOn for reviewed date +// {formatDate(item?.reviewerOn)}, +// 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 || '-', + {formatDate(item?.created_at)}, + 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' + ? {formatDate(item?.reviewerOn)} + : '-', + item, +]); const columnWidths = [220, 150, 100, 100, 130, 150, 180, 150, 150, 180, 120]; return ( diff --git a/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx b/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx index 996f470..3a83cb6 100644 --- a/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx +++ b/ipi-survey-platform/src/pages/Admin/configuration/EditCompanyProfile.jsx @@ -905,11 +905,22 @@ const EditCompanyProfile = () => { return (