From bc2c2cc34d4d8117dde44dbb1310fad098edca5b Mon Sep 17 00:00:00 2001 From: Rajat Date: Sun, 11 Aug 2024 14:14:33 +0530 Subject: [PATCH 1/6] don't conver null and undefined values to string --- .../hooks/features/export/serializers/csvSerializer.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts index 0589aba5d3462..a1ba3a37bbfc8 100644 --- a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts +++ b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts @@ -5,8 +5,11 @@ import type { GridStateColDef } from '../../../../models/colDef/gridColDef'; import type { GridApiCommunity } from '../../../../models/api/gridApiCommunity'; import { warnOnce } from '../../../../internals/utils/warning'; -function sanitizeCellValue(value: unknown, csvOptions: CSVOptions): string { - const valueStr = typeof value === 'string' ? value : `${value}`; +function sanitizeCellValue(value: unknown, csvOptions: CSVOptions):string{ + if (value === null || value === undefined) { + return ''; + } + const valueStr = typeof value === 'string' ? value :`${value}`; if (csvOptions.shouldAppendQuotes || csvOptions.escapeFormulas) { const escapedValue = valueStr.replace(/"/g, '""'); @@ -58,7 +61,7 @@ type CSVOptions = Required< >; type CSVRowOptions = { - sanitizeCellValue?: (value: any, csvOptions: CSVOptions) => any; + sanitizeCellValue?: (value: unknown, csvOptions: CSVOptions) => string; csvOptions: CSVOptions; }; class CSVRow { From 765738ed8761835f90e34c9879043a9b787ab120 Mon Sep 17 00:00:00 2001 From: Armin Mehinovic Date: Mon, 12 Aug 2024 22:17:11 +0200 Subject: [PATCH 2/6] Run prettier --- .../src/hooks/features/export/serializers/csvSerializer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts index a1ba3a37bbfc8..a53df6f6a51e0 100644 --- a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts +++ b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts @@ -5,11 +5,11 @@ import type { GridStateColDef } from '../../../../models/colDef/gridColDef'; import type { GridApiCommunity } from '../../../../models/api/gridApiCommunity'; import { warnOnce } from '../../../../internals/utils/warning'; -function sanitizeCellValue(value: unknown, csvOptions: CSVOptions):string{ +function sanitizeCellValue(value: unknown, csvOptions: CSVOptions): string { if (value === null || value === undefined) { return ''; } - const valueStr = typeof value === 'string' ? value :`${value}`; + const valueStr = typeof value === 'string' ? value : `${value}`; if (csvOptions.shouldAppendQuotes || csvOptions.escapeFormulas) { const escapedValue = valueStr.replace(/"/g, '""'); From 5b33c6466b061d7ecb57185eb281841d9673e01d Mon Sep 17 00:00:00 2001 From: Armin Mehinovic Date: Mon, 12 Aug 2024 22:47:19 +0200 Subject: [PATCH 3/6] Add test --- .../src/tests/export.DataGrid.test.tsx | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx index 76852db959277..33796bd7d472c 100644 --- a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx @@ -117,6 +117,31 @@ describe(' - Export', () => { ].join('\r\n'), ); }); + + it('should export `undefined` and `null` values as blank', async () => { + render( +
+ +
, + ); + fireEvent.click(screen.getByRole('button', { name: 'Export' })); + clock.runToLast(); + expect(screen.queryByRole('menu')).not.to.equal(null); + fireEvent.click(screen.getByRole('menuitem', { name: 'Download as CSV' })); + expect(spyCreateObjectURL.callCount).to.equal(1); + const csv = await spyCreateObjectURL.lastCall.firstArg.text(); + + expect(csv).to.equal(['Name', '', '', '1234'].join('\r\n')); + }); }); describe('component: GridToolbarExport', () => { @@ -160,4 +185,6 @@ describe(' - Export', () => { expect(screen.queryByRole('menuitem', { name: 'Download as CSV' })).to.equal(null); }); }); + + describe('serializeCellValue', () => {}); }); From ee2d51da772cadb4389a7ba7f4d5690ba9ca3c6a Mon Sep 17 00:00:00 2001 From: Armin Mehinovic Date: Mon, 12 Aug 2024 22:48:00 +0200 Subject: [PATCH 4/6] Remove value check that is not needed anymore --- .../src/hooks/features/export/serializers/csvSerializer.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts index a53df6f6a51e0..385b5a41cf43f 100644 --- a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts +++ b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts @@ -79,9 +79,7 @@ class CSVRow { if (!this.isEmpty) { this.rowString += this.options.csvOptions.delimiter; } - if (value === null || value === undefined) { - this.rowString += ''; - } else if (typeof this.options.sanitizeCellValue === 'function') { + if (typeof this.options.sanitizeCellValue === 'function') { this.rowString += this.options.sanitizeCellValue(value, this.options.csvOptions); } else { this.rowString += value; From 657fa6cf069b9e610324c664b22eef8131c94f16 Mon Sep 17 00:00:00 2001 From: Armin Mehinovic Date: Mon, 12 Aug 2024 22:52:07 +0200 Subject: [PATCH 5/6] Remove old block --- packages/x-data-grid/src/tests/export.DataGrid.test.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx index 33796bd7d472c..b6e05e781a30a 100644 --- a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx @@ -185,6 +185,4 @@ describe(' - Export', () => { expect(screen.queryByRole('menuitem', { name: 'Download as CSV' })).to.equal(null); }); }); - - describe('serializeCellValue', () => {}); }); From d03e60148e1ec70a49cf8f4b243f9225d4b10604 Mon Sep 17 00:00:00 2001 From: Armin Mehinovic Date: Tue, 13 Aug 2024 06:26:33 +0200 Subject: [PATCH 6/6] Add column header name to the test assertion --- packages/x-data-grid/src/tests/export.DataGrid.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx index b6e05e781a30a..fd39af7dd1ad2 100644 --- a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx @@ -140,7 +140,7 @@ describe(' - Export', () => { expect(spyCreateObjectURL.callCount).to.equal(1); const csv = await spyCreateObjectURL.lastCall.firstArg.text(); - expect(csv).to.equal(['Name', '', '', '1234'].join('\r\n')); + expect(csv).to.equal(['name', 'Name', '', '', '1234'].join('\r\n')); }); });