diff --git a/components/ReportsSection.jsx b/components/ReportsSection.jsx
index 079c864..4a4204a 100644
--- a/components/ReportsSection.jsx
+++ b/components/ReportsSection.jsx
@@ -406,6 +406,101 @@ const ReportsSection = ({
setLoadedReports(sortedReports)
}
+ // Dynamically extract all unique keys from the JSON objects
+ const extractHeaders = (jsonArray) => {
+ const headersSet = new Set()
+
+ jsonArray.forEach((report) => {
+ Object.keys(report).forEach((key) => {
+ // Handle nested objects like 'createdDate'
+ if (typeof report[key] === 'object' && !Array.isArray(report[key])) {
+ if (key !== 'createdDate') {
+ Object.keys(report[key]).forEach((nestedKey) => {
+ headersSet.add(`${key}.${nestedKey}`)
+ })
+ }
+ } else {
+ headersSet.add(key)
+ }
+ })
+ })
+
+ // Replace createdDate.seconds with a combined createdDate field
+ headersSet.add('createdDate')
+ headersSet.delete('createdDate.seconds')
+ headersSet.delete('createdDate.nanoseconds')
+
+ return Array.from(headersSet) // Convert Set to Array
+ }
+
+ // Convert JSON array to CSV
+ const convertToCSV = (jsonArray) => {
+ const headers = extractHeaders(jsonArray)
+
+ const csvRows = []
+
+ // Add headers row
+ csvRows.push(headers.join(','))
+
+ // Function to convert `createdDate` to ISO 8601 format
+ const formatDateToISO = (createdDate) => {
+ if (createdDate && createdDate.seconds) {
+ const date = new Date(
+ createdDate.seconds * 1000 +
+ Math.floor(createdDate.nanoseconds / 1e6),
+ )
+ return date.toISOString()
+ }
+ return ''
+ }
+
+ // Loop through each report and convert to CSV row
+ jsonArray.forEach((report) => {
+ const row = headers.map((header) => {
+ let value
+
+ // Special case for the `createdDate`
+ if (header === 'createdDate') {
+ value = formatDateToISO(report.createdDate)
+ } else {
+ const keys = header.split('.')
+ value = report
+ keys.forEach((key) => {
+ value = value[key] !== undefined ? value[key] : '' // Safely access nested values
+ })
+
+ // Handle commas and newlines in CSV fields
+ if (typeof value === 'string') {
+ value = value.replace(/"/g, '""') // Escape double quotes
+ if (value.includes(',') || value.includes('\n')) {
+ value = `"${value}"` // Wrap in double quotes if necessary
+ }
+ }
+ }
+
+ return value
+ })
+ csvRows.push(row.join(','))
+ })
+
+ return csvRows.join('\n')
+ }
+
+ // Trigger download of CSV file
+ const downloadCSV = () => {
+ const csvData = convertToCSV(reports)
+ const blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' })
+ const url = URL.createObjectURL(blob)
+
+ // Create a link and trigger the download
+ const link = document.createElement('a')
+ link.href = url
+ link.setAttribute('download', 'reports.csv')
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ }
+
useEffect(() => {
if (isAgency && user.email) {
firebaseHelper.fetchAgencyByUserEmail(user.email, (response) => {
@@ -606,6 +701,17 @@ const ReportsSection = ({
List of Reports
+ {!isAgency && (
+
+
+
+ )}
+