Commit fb8479988cfd1db1cfe202bda59d7b6e0924ccef

Authored by Sergio Crisostomo
1 parent 109465d3

Improve export to CSV functionality

 - added`callback`option so we can get CSV data in case we do not want
to download
 - added options:
    - `quoted` for cases when we have line breaks in content
    - `separator` for cases when we have commas in content
Showing 2 changed files with 32 additions and 27 deletions   Show diff stats
src/components/table/table.vue
@@ -714,8 +714,9 @@ @@ -714,8 +714,9 @@
714 let noHeader = false; 714 let noHeader = false;
715 if ('noHeader' in params) noHeader = params.noHeader; 715 if ('noHeader' in params) noHeader = params.noHeader;
716 716
717 - const data = Csv(columns, datas, ',', noHeader);  
718 - ExportCsv.download(params.filename, data); 717 + const data = Csv(columns, datas, params, noHeader);
  718 + if (params.callback) params.callback(data);
  719 + else ExportCsv.download(params.filename, data);
719 } 720 }
720 }, 721 },
721 created () { 722 created () {
1 -// https://github.com/Terminux/react-csv-downloader/blob/master/src/lib/csv.js 1 +/*
  2 + inspired by https://www.npmjs.com/package/react-csv-downloader
  3 + now removed from Github
  4 +*/
2 5
3 const newLine = '\r\n'; 6 const newLine = '\r\n';
  7 +const appendLine = (content, row, { separator, quoted }) => {
  8 + const line = row.map(data => {
  9 + if (!quoted) return data;
  10 + // quote data
  11 + data = typeof data === 'string' ? data.replace(/"/g, '"') : data;
  12 + return `"${data}"`;
  13 + });
  14 + content.push(line.join(separator));
  15 +};
4 16
5 -export default function csv(columns, datas, separator = ',', noHeader = false) { 17 +const defaults = {
  18 + separator: ',',
  19 + quoted: false
  20 +};
  21 +
  22 +export default function csv(columns, datas, options, noHeader = false) {
  23 + options = Object.assign({}, defaults, options);
6 let columnOrder; 24 let columnOrder;
7 const content = []; 25 const content = [];
8 const column = []; 26 const column = [];
9 27
10 if (columns) { 28 if (columns) {
11 columnOrder = columns.map(v => { 29 columnOrder = columns.map(v => {
12 - if (typeof v === 'string') {  
13 - return v;  
14 - } 30 + if (typeof v === 'string') return v;
15 if (!noHeader) { 31 if (!noHeader) {
16 - column.push((typeof v.title !== 'undefined') ? v.title : v.key); 32 + column.push(typeof v.title !== 'undefined' ? v.title : v.key);
17 } 33 }
18 return v.key; 34 return v.key;
19 }); 35 });
20 - if (column.length > 0) {  
21 - content.push(column.join(separator));  
22 - } 36 + if (column.length > 0) appendLine(content, column, options);
23 } else { 37 } else {
24 columnOrder = []; 38 columnOrder = [];
25 datas.forEach(v => { 39 datas.forEach(v => {
@@ -29,27 +43,17 @@ export default function csv(columns, datas, separator = ',', noHeader = false) { @@ -29,27 +43,17 @@ export default function csv(columns, datas, separator = ',', noHeader = false) {
29 }); 43 });
30 if (columnOrder.length > 0) { 44 if (columnOrder.length > 0) {
31 columnOrder = columnOrder.filter((value, index, self) => self.indexOf(value) === index); 45 columnOrder = columnOrder.filter((value, index, self) => self.indexOf(value) === index);
32 -  
33 - if (!noHeader) {  
34 - content.push(columnOrder.join(separator));  
35 - } 46 + if (!noHeader) appendLine(content, columnOrder, options);
36 } 47 }
37 } 48 }
38 49
39 if (Array.isArray(datas)) { 50 if (Array.isArray(datas)) {
40 - datas.map(v => {  
41 - if (Array.isArray(v)) {  
42 - return v; 51 + datas.forEach(row => {
  52 + if (!Array.isArray(row)) {
  53 + row = columnOrder.map(k => (typeof row[k] !== 'undefined' ? row[k] : ''));
43 } 54 }
44 - return columnOrder.map(k => {  
45 - if (typeof v[k] !== 'undefined') {  
46 - return v[k];  
47 - }  
48 - return '';  
49 - });  
50 - }).forEach(v => {  
51 - content.push(v.join(separator)); 55 + appendLine(content, row, options);
52 }); 56 });
53 } 57 }
54 return content.join(newLine); 58 return content.join(newLine);
55 -}  
56 \ No newline at end of file 59 \ No newline at end of file
  60 +}