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 714 let noHeader = false;
715 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 722 created () {
... ...
src/utils/csv.js
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 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 24 let columnOrder;
7 25 const content = [];
8 26 const column = [];
9 27  
10 28 if (columns) {
11 29 columnOrder = columns.map(v => {
12   - if (typeof v === 'string') {
13   - return v;
14   - }
  30 + if (typeof v === 'string') return v;
15 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 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 37 } else {
24 38 columnOrder = [];
25 39 datas.forEach(v => {
... ... @@ -29,27 +43,17 @@ export default function csv(columns, datas, separator = ',', noHeader = false) {
29 43 });
30 44 if (columnOrder.length > 0) {
31 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 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 58 return content.join(newLine);
55   -}
56 59 \ No newline at end of file
  60 +}
... ...