From 60becfe67d4d73e5bb5ca4fd1fccf9bf3e8f2224 Mon Sep 17 00:00:00 2001 From: Eldergenix <89941175+Eldergenix@users.noreply.github.com> Date: Wed, 13 May 2026 20:25:17 -0400 Subject: [PATCH] Deduplicate CSV export logic --- .../ExportCopyNumberVariantsButton.tsx | 44 +------------ .../ExportMitochondrialVariantsButton.tsx | 44 ++----------- .../ExportStructuralVariantsButton.tsx | 44 +------------ .../src/VariantList/ExportVariantsButton.tsx | 45 +------------ browser/src/exportTableToCsv.spec.ts | 63 +++++++++++++++++++ browser/src/exportTableToCsv.ts | 53 ++++++++++++++++ 6 files changed, 127 insertions(+), 166 deletions(-) create mode 100644 browser/src/exportTableToCsv.spec.ts create mode 100644 browser/src/exportTableToCsv.ts diff --git a/browser/src/CopyNumberVariantList/ExportCopyNumberVariantsButton.tsx b/browser/src/CopyNumberVariantList/ExportCopyNumberVariantsButton.tsx index cde55642b..052b3758d 100644 --- a/browser/src/CopyNumberVariantList/ExportCopyNumberVariantsButton.tsx +++ b/browser/src/CopyNumberVariantList/ExportCopyNumberVariantsButton.tsx @@ -5,6 +5,7 @@ import { Button } from '@gnomad/ui' import { cnvTypeLabels } from './copyNumberVariantTypes' import { CopyNumberVariant } from '../CopyNumberVariantPage/CopyNumberVariantPage' import { logButtonClick } from '../analytics' +import { exportTableToCsv } from '../exportTableToCsv' const columns = [ { @@ -42,47 +43,6 @@ const columns = [ }, ] -const exportVariantsToCsv = (variants: CopyNumberVariant[], baseFileName: any) => { - const headerRow = columns.map((c) => c.label) - - const csv = `${headerRow}\r\n${variants - .map((variant: CopyNumberVariant) => - columns - .map((c) => c.getValue(variant)) - .map((val) => - val.includes(',') || val.includes('"') || val.includes("'") - ? `"${val.replace('"', '""')}"` - : val - ) - .join(',') - ) - .join('\r\n')}\r\n` - - const date = new Date() - const timestamp = `${date.getFullYear()}_${(date.getMonth() + 1) - .toString() - .padStart(2, '0')}_${date.getDate().toString().padStart(2, '0')}_${date - .getHours() - .toString() - .padStart(2, '0')}_${date.getMinutes().toString().padStart(2, '0')}_${date - .getSeconds() - .toString() - .padStart(2, '0')}` - - const blob = new Blob([csv], { type: 'text/csv' }) - const url = URL.createObjectURL(blob) - const link = document.createElement('a') - link.setAttribute('href', url) - link.setAttribute('download', `${baseFileName.replace(/\s+/g, '_')}_${timestamp}.csv`) - // @ts-expect-error TS(2551) FIXME: Property 'onClick' does not exist on type 'HTMLAnc... Remove this comment to see the full error message - link.onClick = () => { - URL.revokeObjectURL(url) - link.remove() - } - document.body.appendChild(link) - link.click() -} - type ExportCopyNumberVariantsButtonProps = { exportFileName: string variants: any[] @@ -96,7 +56,7 @@ const ExportCopyNumberVariantsButton = ({