@@ -4,14 +4,52 @@ const formatValue = value => {
4
4
return value
5
5
}
6
6
7
- const convertToCSV = data => data . reduce ( ( h , row ) => h + row . map ( formatValue ) . join ( "," ) + "\n" , "" )
7
+ const escapeForCSV = value => {
8
+ const str = String ( value )
9
+
10
+ if ( / [ " , \n \r ] / . test ( str ) ) return `"${ str . replace ( / " / g, '""' ) } "`
11
+
12
+ return str
13
+ }
14
+
15
+ const convertToCSV = data =>
16
+ data . reduce ( ( h , row ) => h + row . map ( v => escapeForCSV ( formatValue ( v ) ) ) . join ( "," ) + "\n" , "" )
8
17
9
18
export default ( name = "netdata" ) =>
10
19
( _ , table ) => {
11
- let data = [ table . getFlatHeaders ( ) . map ( header => header . id ) ]
12
- table . getRowModel ( ) . rows . forEach ( row => {
13
- data . push ( table . getFlatHeaders ( ) . map ( header => row . renderValue ( header . id ) ) )
14
- } )
20
+ const headers = table . getFlatHeaders ( ) . filter ( header => ! header . subHeaders ?. length )
21
+
22
+ let data = [
23
+ headers . map ( header => {
24
+ const parentLabel = header . column . parent
25
+ ? typeof header . column . parent . columnDef . headerString === "function"
26
+ ? header . column . parent . columnDef . headerString ( )
27
+ : header . column . parent . id
28
+ : null
29
+
30
+ const label =
31
+ typeof header . column . columnDef . headerString === "function"
32
+ ? header . column . columnDef . headerString ( )
33
+ : header . id
34
+
35
+ return parentLabel ? `${ parentLabel } ${ label } ` : label
36
+ } ) ,
37
+ ]
38
+ table . getRowModel ( ) . rows . forEach ( row =>
39
+ data . push (
40
+ headers . map ( header => {
41
+ const value = row . getValue ( header . id )
42
+
43
+ if ( value ) return value
44
+
45
+ if ( typeof header . column . columnDef . renderString !== "function" ) return value
46
+
47
+ const cell = row . getAllCells ( ) . find ( cell => cell . column . id === header . id )
48
+
49
+ return header . column . columnDef . renderString ( cell . row )
50
+ } )
51
+ )
52
+ )
15
53
16
54
const url = window . URL . createObjectURL (
17
55
new Blob ( [ convertToCSV ( data ) ] , { type : "text/csv;charset=utf-8;" } )
0 commit comments