diff --git a/src/app/portfolio/[slug]/components/RemoteAssessmentModal.tsx b/src/app/portfolio/[slug]/components/RemoteAssessmentModal.tsx index 0a46857c..8b119d9d 100644 --- a/src/app/portfolio/[slug]/components/RemoteAssessmentModal.tsx +++ b/src/app/portfolio/[slug]/components/RemoteAssessmentModal.tsx @@ -288,8 +288,7 @@ async function uploadCsvToS3({ console.error(error); throw new Error("Upload failed."); } - - console.log("S3 got the stuff"); + console.log("File uploaded successfully"); return { success: true }; } @@ -332,16 +331,29 @@ function generateS3Keys(userId: string, portfolioId: string) { type GenericObject = Record; -const convertToCSV = (data: T[]): string => { - // Get headers (keys from the first object) +const convertToCSV = >(data: T[]): string => { + if (data.length === 0) return ""; + const headers = Object.keys(data[0]) as (keyof T)[]; - // Create CSV rows + const escape = (value: any): string => { + if (value == null) return ""; + + const str = String(value); + + // Check if field contains special characters + if (/[",\n]/.test(str)) { + // Escape double quotes and wrap in quotes + return `"${str.replace(/"/g, '""')}"`; + } + + return str; + }; + const rows = data.map((row) => - headers.map((header) => row[header]).join(",") + headers.map((header) => escape(row[header])).join(",") ); - // Combine headers and rows into CSV string return [headers.join(","), ...rows].join("\n"); };