UNPKG

tabulator-tables

Version:

Interactive table generation JavaScript library

433 lines (339 loc) 10.3 kB
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /* Tabulator v4.9.3 (c) Oliver Folkerd */ var Download = function Download(table) { this.table = table; //hold Tabulator object }; //trigger file download Download.prototype.download = function (type, filename, options, range, interceptCallback) { var self = this, downloadFunc = false; function buildLink(data, mime) { if (interceptCallback) { if (interceptCallback === true) { self.triggerDownload(data, mime, type, filename, true); } else { interceptCallback(data); } } else { self.triggerDownload(data, mime, type, filename); } } if (typeof type == "function") { downloadFunc = type; } else { if (self.downloaders[type]) { downloadFunc = self.downloaders[type]; } else { console.warn("Download Error - No such download type found: ", type); } } if (downloadFunc) { var list = this.generateExportList(range); downloadFunc.call(this.table, list, options || {}, buildLink); } }; Download.prototype.generateExportList = function (range) { var list = this.table.modules.export.generateExportList(this.table.options.downloadConfig, false, range || this.table.options.downloadRowRange, "download"); //assign group header formatter var groupHeader = this.table.options.groupHeaderDownload; if (groupHeader && !Array.isArray(groupHeader)) { groupHeader = [groupHeader]; } list.forEach(function (row) { var group; if (row.type === "group") { group = row.columns[0]; if (groupHeader && groupHeader[row.indent]) { group.value = groupHeader[row.indent](group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component); } } }); return list; }; Download.prototype.triggerDownload = function (data, mime, type, filename, newTab) { var element = document.createElement('a'), blob = new Blob([data], { type: mime }), filename = filename || "Tabulator." + (typeof type === "function" ? "txt" : type); blob = this.table.options.downloadReady.call(this.table, data, blob); if (blob) { if (newTab) { window.open(window.URL.createObjectURL(blob)); } else { if (navigator.msSaveOrOpenBlob) { navigator.msSaveOrOpenBlob(blob, filename); } else { element.setAttribute('href', window.URL.createObjectURL(blob)); //set file title element.setAttribute('download', filename); //trigger download element.style.display = 'none'; document.body.appendChild(element); element.click(); //remove temporary link element document.body.removeChild(element); } } if (this.table.options.downloadComplete) { this.table.options.downloadComplete(); } } }; Download.prototype.commsReceived = function (table, action, data) { switch (action) { case "intercept": this.download(data.type, "", data.options, data.active, data.intercept); break; } }; //downloaders Download.prototype.downloaders = { csv: function csv(list, options, setFileContents) { var delimiter = options && options.delimiter ? options.delimiter : ",", fileContents = [], headers = []; list.forEach(function (row) { var item = []; switch (row.type) { case "group": console.warn("Download Warning - CSV downloader cannot process row groups"); break; case "calc": console.warn("Download Warning - CSV downloader cannot process column calculations"); break; case "header": row.columns.forEach(function (col, i) { if (col && col.depth === 1) { headers[i] = typeof col.value == "undefined" || col.value === null ? "" : '"' + String(col.value).split('"').join('""') + '"'; } }); break; case "row": row.columns.forEach(function (col) { if (col) { switch (_typeof(col.value)) { case "object": col.value = JSON.stringify(col.value); break; case "undefined": case "null": col.value = ""; break; } item.push('"' + String(col.value).split('"').join('""') + '"'); } }); fileContents.push(item.join(delimiter)); break; } }); if (headers.length) { fileContents.unshift(headers.join(delimiter)); } fileContents = fileContents.join("\n"); if (options.bom) { fileContents = "\uFEFF" + fileContents; } setFileContents(fileContents, "text/csv"); }, json: function json(list, options, setFileContents) { var fileContents = []; list.forEach(function (row) { var item = {}; switch (row.type) { case "header": break; case "group": console.warn("Download Warning - JSON downloader cannot process row groups"); break; case "calc": console.warn("Download Warning - JSON downloader cannot process column calculations"); break; case "row": row.columns.forEach(function (col) { if (col) { item[col.component.getField()] = col.value; } }); fileContents.push(item); break; } }); fileContents = JSON.stringify(fileContents, null, '\t'); setFileContents(fileContents, "application/json"); }, pdf: function pdf(list, options, setFileContents) { var header = [], body = [], autoTableParams = {}, rowGroupStyles = options.rowGroupStyles || { fontStyle: "bold", fontSize: 12, cellPadding: 6, fillColor: 220 }, rowCalcStyles = options.rowCalcStyles || { fontStyle: "bold", fontSize: 10, cellPadding: 4, fillColor: 232 }, jsPDFParams = options.jsPDF || {}, title = options && options.title ? options.title : ""; if (!jsPDFParams.orientation) { jsPDFParams.orientation = options.orientation || "landscape"; } if (!jsPDFParams.unit) { jsPDFParams.unit = "pt"; } //parse row list list.forEach(function (row) { var item = {}; switch (row.type) { case "header": header.push(parseRow(row)); break; case "group": body.push(parseRow(row, rowGroupStyles)); break; case "calc": body.push(parseRow(row, rowCalcStyles)); break; case "row": body.push(parseRow(row)); break; } }); function parseRow(row, styles) { var rowData = []; row.columns.forEach(function (col) { var cell; if (col) { switch (_typeof(col.value)) { case "object": col.value = JSON.stringify(col.value); break; case "undefined": case "null": col.value = ""; break; } cell = { content: col.value, colSpan: col.width, rowSpan: col.height }; if (styles) { cell.styles = styles; } rowData.push(cell); } else { rowData.push(""); } }); return rowData; } //configure PDF var doc = new jsPDF(jsPDFParams); //set document to landscape, better for most tables if (options && options.autoTable) { if (typeof options.autoTable === "function") { autoTableParams = options.autoTable(doc) || {}; } else { autoTableParams = options.autoTable; } } if (title) { autoTableParams.addPageContent = function (data) { doc.text(title, 40, 30); }; } autoTableParams.head = header; autoTableParams.body = body; doc.autoTable(autoTableParams); if (options && options.documentProcessing) { options.documentProcessing(doc); } setFileContents(doc.output("arraybuffer"), "application/pdf"); }, xlsx: function xlsx(list, options, setFileContents) { var self = this, sheetName = options.sheetName || "Sheet1", workbook = XLSX.utils.book_new(), output; workbook.SheetNames = []; workbook.Sheets = {}; function generateSheet() { var rows = [], merges = [], worksheet = {}, range = { s: { c: 0, r: 0 }, e: { c: list[0] ? list[0].columns.reduce(function (a, b) { return a + (b && b.width ? b.width : 1); }, 0) : 0, r: list.length } }; //parse row list list.forEach(function (row, i) { var rowData = []; row.columns.forEach(function (col, j) { if (col) { rowData.push(!(col.value instanceof Date) && _typeof(col.value) === "object" ? JSON.stringify(col.value) : col.value); if (col.width > 1 || col.height > -1) { merges.push({ s: { r: i, c: j }, e: { r: i + col.height - 1, c: j + col.width - 1 } }); } } else { rowData.push(""); } }); rows.push(rowData); }); //convert rows to worksheet XLSX.utils.sheet_add_aoa(worksheet, rows); worksheet['!ref'] = XLSX.utils.encode_range(range); if (merges.length) { worksheet["!merges"] = merges; } return worksheet; } if (options.sheetOnly) { setFileContents(generateSheet()); return; } if (options.sheets) { for (var sheet in options.sheets) { if (options.sheets[sheet] === true) { workbook.SheetNames.push(sheet); workbook.Sheets[sheet] = generateSheet(); } else { workbook.SheetNames.push(sheet); this.modules.comms.send(options.sheets[sheet], "download", "intercept", { type: "xlsx", options: { sheetOnly: true }, active: self.active, intercept: function intercept(data) { workbook.Sheets[sheet] = data; } }); } } } else { workbook.SheetNames.push(sheetName); workbook.Sheets[sheetName] = generateSheet(); } if (options.documentProcessing) { workbook = options.documentProcessing(workbook); } //convert workbook to binary array function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i = 0; i != s.length; ++i) { view[i] = s.charCodeAt(i) & 0xFF; }return buf; } output = XLSX.write(workbook, { bookType: 'xlsx', bookSST: true, type: 'binary' }); setFileContents(s2ab(output), "application/octet-stream"); }, html: function html(list, options, setFileContents) { if (this.modExists("export", true)) { setFileContents(this.modules.export.genereateHTMLTable(list), "text/html"); } } }; Tabulator.prototype.registerModule("download", Download);