From bb1eb2838f779103754e082e2e1cde30a0742e5c Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Sun, 23 Jul 2023 15:06:25 +0200 Subject: [PATCH] fix csv export (#466) * style: cleanup formatting * fix: prevent issues with csv export * chore: update test snapshots --- apps/client/src/features/cuesheet/CuesheetWrapper.tsx | 10 ++++++++-- .../src/features/cuesheet/__tests__/utils.test.js | 2 +- apps/client/src/features/cuesheet/cuesheetCols.tsx | 6 +++--- apps/client/src/features/cuesheet/cuesheetUtils.ts | 3 +-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/client/src/features/cuesheet/CuesheetWrapper.tsx b/apps/client/src/features/cuesheet/CuesheetWrapper.tsx index 1f1330df3..c2f92e0ec 100644 --- a/apps/client/src/features/cuesheet/CuesheetWrapper.tsx +++ b/apps/client/src/features/cuesheet/CuesheetWrapper.tsx @@ -76,12 +76,18 @@ export default function CuesheetWrapper() { const sheetData = makeTable(headerData, rundown, userFields); const csvContent = makeCSV(sheetData); - const encodedUri = encodeURI(csvContent); + + const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); - link.setAttribute('href', encodedUri); + link.setAttribute('href', url); link.setAttribute('download', 'ontime export.csv'); document.body.appendChild(link); link.click(); + + // Clean up the URL.createObjectURL to release resources + URL.revokeObjectURL(url); }, [rundown, userFields], ); diff --git a/apps/client/src/features/cuesheet/__tests__/utils.test.js b/apps/client/src/features/cuesheet/__tests__/utils.test.js index 70c68c0b9..1bdf8396c 100644 --- a/apps/client/src/features/cuesheet/__tests__/utils.test.js +++ b/apps/client/src/features/cuesheet/__tests__/utils.test.js @@ -84,7 +84,7 @@ describe('make CSV()', () => { it('joins an array of arrays with commas and newlines', () => { const testdata = [['field'], ['after newline', 'after comma'], ['', 'after empty']]; expect(makeCSV(testdata)).toMatchInlineSnapshot(` -"data:text/csv;charset=utf-8,field +"field after newline,after comma ,after empty " diff --git a/apps/client/src/features/cuesheet/cuesheetCols.tsx b/apps/client/src/features/cuesheet/cuesheetCols.tsx index ae826d329..2061feba1 100644 --- a/apps/client/src/features/cuesheet/cuesheetCols.tsx +++ b/apps/client/src/features/cuesheet/cuesheetCols.tsx @@ -49,13 +49,13 @@ function MakeTimer({ getValue, row: { original } }: CellContext {millisToString(cellValue)} - {(delayValue !== 0 && showDelayedTimes) && {` ${millisToString(cellValue + delayValue)}`}} + {delayValue !== 0 && showDelayedTimes && ( + {` ${millisToString(cellValue + delayValue)}`} + )} ); } diff --git a/apps/client/src/features/cuesheet/cuesheetUtils.ts b/apps/client/src/features/cuesheet/cuesheetUtils.ts index 0b253ad2e..8a1f93ca9 100644 --- a/apps/client/src/features/cuesheet/cuesheetUtils.ts +++ b/apps/client/src/features/cuesheet/cuesheetUtils.ts @@ -108,7 +108,6 @@ export const makeTable = (headerData: EventData, rundown: OntimeRundown, userFie * @return {string} */ export const makeCSV = (arrayOfArrays: string[][]) => { - const csvData = 'data:text/csv;charset=utf-8,'; const stringifiedData = stringify(arrayOfArrays); - return csvData + stringifiedData; + return stringifiedData; };