if(!app.helpers) app.helpers = {} /** * Helper for data transformation. * @class Translator * @category MyEic * @subcategory Helpers */ app.helpers.translator = { toCSV(collection, options /* keys=null, withHeader=true, quoteChar = '"', delimiter = ';', downloadName=null */) { let defaultOptions = { headers: [], delimiter: ',', quoteCharacter: '"', filename: 'data' } options = {...defaultOptions, ...options} /**/ const _download = function(data, filename) { const blob = new Blob([new Uint8Array([0xEF, 0xBB, 0xBF]), data], { type: 'text/csv; charset=utf-8' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.setAttribute('href', url); a.setAttribute('download', filename + '.csv'); a.click(); } if(!options.keys) { // take min. common set of keys in collection (take 1st then successively intersect to itself) let ids = Object.keys(collection); options.keys = Object.keys(collection[ids[0]]); for(let id of ids) { options.keys = options.keys.filter(x => (collection[id].hasOwnProperty(x))) } } let csv=''; let row=[]; if(options.headers && options.headers.length > 0){ for(let key of options.headers) { row.push(options.quoteCharacter + key + options.quoteCharacter); } csv += row.join(options.delimiter)+'\n'; } else if(Array.isArray(options.headers)) { for(let title of options.headers){ row.push(options.quoteCharacter + title + options.quoteCharacter); } csv += row.join(options.delimiter)+'\n'; } for(let id in collection){ row = []; for(let key of options.keys){ let item = '' if(typeof(key)=='string'){ // normal column item = collection[id] for(let k of key.split('.')) { // Allow for sub-objects with dotted keys notation if(!item) break item = item[k] } } else if(typeof(key)=='function') { // computed column item = key(collection[id]) } else console.warn('CSV: Bad column: ',key) row.push(options.quoteCharacter + item + options.quoteCharacter); } csv += row.join(options.delimiter)+'\n'; } if(options.filename) _download(csv, options.filename); return(csv); }, fromCSV() { } }