diff --git a/ipi-survey-platform/src/components/dashboard/SubmissionHistory.jsx b/ipi-survey-platform/src/components/dashboard/SubmissionHistory.jsx index 402acfa..b8b1f60 100644 --- a/ipi-survey-platform/src/components/dashboard/SubmissionHistory.jsx +++ b/ipi-survey-platform/src/components/dashboard/SubmissionHistory.jsx @@ -53,18 +53,29 @@ const getStatusBadge = (status) => { const downloadCsv = (data) => { if (!data.length) return; + const headers = ['Survey Name', 'Year', 'Quarter', 'Status', 'Submission On', 'Products']; + const csvRows = [headers.join(',')]; data.forEach((item) => { + const statusText = (() => { + const normalized = String(item.status || '').toLowerCase(); + if (normalized === 'approved') return 'Approved'; + if (['pending', 'under review', 'in-progress'].includes(normalized)) return 'Under Review'; + if (['rejected', 'returned'].includes(normalized)) return 'Returned'; + return item.status || '—'; + })(); + const row = [ item.survey_name || '—', item.year || '—', item.quarter || '—', - item.status || '—', + statusText, item.submission_on || '—', - item.products || '—', + `${item.products || 0} ${item.products === 1 ? 'product' : 'products'}`, ]; + csvRows.push(row.map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(',')); }); @@ -79,6 +90,7 @@ const downloadCsv = (data) => { URL.revokeObjectURL(url); }; + export const SubmissionHistory = ({ history = [], loading = false, error = '' }) => { const [searchTerm, setSearchTerm] = React.useState(''); const [selectedSubmission, setSelectedSubmission] = React.useState(null); diff --git a/ipi-survey-platform/src/pages/Admin/Validations.jsx b/ipi-survey-platform/src/pages/Admin/Validations.jsx index c587f16..e0d101d 100644 --- a/ipi-survey-platform/src/pages/Admin/Validations.jsx +++ b/ipi-survey-platform/src/pages/Admin/Validations.jsx @@ -239,38 +239,59 @@ const ManageSubmissions = () => { const downloadCsv = (data) => { if (!data.length) return; - const headers = ['Establishment', 'Year', 'Quarter', 'Status', 'Submission On', 'Products']; + const headers = [ + 'Establishment', + 'Emirates', + 'Year', + 'Quarter', + 'Products', + 'Submitted By', + 'Submission Date & Time', + 'Status', + 'Reviewer', + 'Reviewed On', + ]; + const csvRows = [headers.join(',')]; data.forEach((item) => { - const establishment = item.establishment || '—'; - const year = item.year || '—'; - const quarter = item.quarter || '—'; - const normalized = String(item.status || '').toLowerCase(); let status = '—'; if (normalized === 'pending') status = 'Under Review'; else if (normalized === 'rejected') status = 'Returned'; else if (['submitted', 'approved'].includes(normalized)) status = 'Approved'; + else status = item.status || '—'; - const submissionOn = item.submittedAt || '—'; const productCount = Number(item.products) || 0; const products = `${productCount} ${productCount === 1 ? 'product' : 'products'}`; - const row = [establishment, year, quarter, status, submissionOn, products]; + const row = [ + item.establishment || '—', + item.emirate || '—', + item.year || '—', + item.quarter || '—', + products, + item.submittedBy || '—', + item.submittedAt || '—', + status, + item.reviewer || '—', + item.reviewerOn || '—', + ]; + csvRows.push(row.map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(',')); }); const blob = new Blob([csvRows.join('\n')], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); + const timestamp = new Date().toISOString().split('T')[0]; link.href = url; - link.setAttribute('download', 'submissions.csv'); + link.setAttribute('download', `manage-submissions-${timestamp}.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); - }; + }; return ( <>