|
| 1 | +/* eslint no-unneeded-ternary: 0 */ |
| 2 | +import FileSaver from 'file-saver'; |
| 3 | + |
| 4 | +export const getMetaInfo = columns => |
| 5 | + columns |
| 6 | + .map(column => ({ |
| 7 | + field: column.dataField, |
| 8 | + type: column.csvType || String, |
| 9 | + formatter: column.csvFormatter, |
| 10 | + formatExtraData: column.formatExtraData, |
| 11 | + header: column.csvText || column.text, |
| 12 | + export: column.csvExport === false ? false : true, |
| 13 | + row: Number(column.row) || 0, |
| 14 | + rowSpan: Number(column.rowSpan) || 1, |
| 15 | + colSpan: Number(column.colSpan) || 1 |
| 16 | + })) |
| 17 | + .filter(_ => _.export); |
| 18 | + |
| 19 | +export const transform = ( |
| 20 | + data, |
| 21 | + meta, |
| 22 | + { |
| 23 | + separator, |
| 24 | + ignoreHeader |
| 25 | + } |
| 26 | +) => { |
| 27 | + const visibleColumns = meta.filter(m => m.export); |
| 28 | + let content = ''; |
| 29 | + // extract csv header |
| 30 | + if (!ignoreHeader) { |
| 31 | + content += visibleColumns.map(m => `"${m.header}"`).join(separator); |
| 32 | + content += '\n'; |
| 33 | + } |
| 34 | + // extract csv body |
| 35 | + if (data.length === 0) return content; |
| 36 | + content += data |
| 37 | + .map((row, rowIndex) => |
| 38 | + visibleColumns.map((m) => { |
| 39 | + let cellContent = row[m.field]; |
| 40 | + if (m.formatter) { |
| 41 | + cellContent = m.formatter(cellContent, row, rowIndex, m.formatExtraData); |
| 42 | + } |
| 43 | + if (m.type === String) { |
| 44 | + return `"${cellContent}"`; |
| 45 | + } |
| 46 | + return cellContent; |
| 47 | + }).join(separator)).join('\n'); |
| 48 | + |
| 49 | + return content; |
| 50 | +}; |
| 51 | + |
| 52 | +export const save = ( |
| 53 | + content, |
| 54 | + { |
| 55 | + noAutoBOM, |
| 56 | + fileName |
| 57 | + } |
| 58 | +) => { |
| 59 | + FileSaver.saveAs( |
| 60 | + new Blob(['\ufeff', content], { type: 'text/plain;charset=utf-8' }), |
| 61 | + fileName, |
| 62 | + noAutoBOM |
| 63 | + ); |
| 64 | +}; |
0 commit comments