Built files from Bizgaze WebServer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

download.js 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. 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; };
  2. /* Tabulator v4.8.2 (c) Oliver Folkerd */
  3. var Download = function Download(table) {
  4. this.table = table; //hold Tabulator object
  5. };
  6. //trigger file download
  7. Download.prototype.download = function (type, filename, options, range, interceptCallback) {
  8. var self = this,
  9. downloadFunc = false;
  10. function buildLink(data, mime) {
  11. if (interceptCallback) {
  12. if (interceptCallback === true) {
  13. self.triggerDownload(data, mime, type, filename, true);
  14. } else {
  15. interceptCallback(data);
  16. }
  17. } else {
  18. self.triggerDownload(data, mime, type, filename);
  19. }
  20. }
  21. if (typeof type == "function") {
  22. downloadFunc = type;
  23. } else {
  24. if (self.downloaders[type]) {
  25. downloadFunc = self.downloaders[type];
  26. } else {
  27. console.warn("Download Error - No such download type found: ", type);
  28. }
  29. }
  30. if (downloadFunc) {
  31. var list = this.generateExportList(range);
  32. downloadFunc.call(this.table, list, options || {}, buildLink);
  33. }
  34. };
  35. Download.prototype.generateExportList = function (range) {
  36. var list = this.table.modules.export.generateExportList(this.table.options.downloadConfig, false, range || this.table.options.downloadRowRange, "download");
  37. //assign group header formatter
  38. var groupHeader = this.table.options.groupHeaderDownload;
  39. if (groupHeader && !Array.isArray(groupHeader)) {
  40. groupHeader = [groupHeader];
  41. }
  42. list.forEach(function (row) {
  43. var group;
  44. if (row.type === "group") {
  45. group = row.columns[0];
  46. if (groupHeader && groupHeader[row.indent]) {
  47. group.value = groupHeader[row.indent](group.value, row.component._group.getRowCount(), row.component._group.getData(), row.component);
  48. }
  49. }
  50. });
  51. return list;
  52. };
  53. Download.prototype.triggerDownload = function (data, mime, type, filename, newTab) {
  54. var element = document.createElement('a'),
  55. blob = new Blob([data], { type: mime }),
  56. filename = filename || "Tabulator." + (typeof type === "function" ? "txt" : type);
  57. blob = this.table.options.downloadReady.call(this.table, data, blob);
  58. if (blob) {
  59. if (newTab) {
  60. window.open(window.URL.createObjectURL(blob));
  61. } else {
  62. if (navigator.msSaveOrOpenBlob) {
  63. navigator.msSaveOrOpenBlob(blob, filename);
  64. } else {
  65. element.setAttribute('href', window.URL.createObjectURL(blob));
  66. //set file title
  67. element.setAttribute('download', filename);
  68. //trigger download
  69. element.style.display = 'none';
  70. document.body.appendChild(element);
  71. element.click();
  72. //remove temporary link element
  73. document.body.removeChild(element);
  74. }
  75. }
  76. if (this.table.options.downloadComplete) {
  77. this.table.options.downloadComplete();
  78. }
  79. }
  80. };
  81. Download.prototype.commsReceived = function (table, action, data) {
  82. switch (action) {
  83. case "intercept":
  84. this.download(data.type, "", data.options, data.active, data.intercept);
  85. break;
  86. }
  87. };
  88. //downloaders
  89. Download.prototype.downloaders = {
  90. csv: function csv(list, options, setFileContents) {
  91. var delimiter = options && options.delimiter ? options.delimiter : ",",
  92. fileContents = [],
  93. headers = [];
  94. list.forEach(function (row) {
  95. var item = [];
  96. switch (row.type) {
  97. case "group":
  98. console.warn("Download Warning - CSV downloader cannot process row groups");
  99. break;
  100. case "calc":
  101. console.warn("Download Warning - CSV downloader cannot process column calculations");
  102. break;
  103. case "header":
  104. row.columns.forEach(function (col, i) {
  105. if (col && col.depth === 1) {
  106. headers[i] = typeof col.value == "undefined" || col.value === null ? "" : '"' + String(col.value).split('"').join('""') + '"';
  107. }
  108. });
  109. break;
  110. case "row":
  111. row.columns.forEach(function (col) {
  112. if (col) {
  113. switch (_typeof(col.value)) {
  114. case "object":
  115. col.value = JSON.stringify(col.value);
  116. break;
  117. case "undefined":
  118. case "null":
  119. col.value = "";
  120. break;
  121. }
  122. item.push('"' + String(col.value).split('"').join('""') + '"');
  123. }
  124. });
  125. fileContents.push(item.join(delimiter));
  126. break;
  127. }
  128. });
  129. if (headers.length) {
  130. fileContents.unshift(headers.join(delimiter));
  131. }
  132. fileContents = fileContents.join("\n");
  133. if (options.bom) {
  134. fileContents = "\uFEFF" + fileContents;
  135. }
  136. setFileContents(fileContents, "text/csv");
  137. },
  138. json: function json(list, options, setFileContents) {
  139. var fileContents = [];
  140. list.forEach(function (row) {
  141. var item = {};
  142. switch (row.type) {
  143. case "header":
  144. break;
  145. case "group":
  146. console.warn("Download Warning - JSON downloader cannot process row groups");
  147. break;
  148. case "calc":
  149. console.warn("Download Warning - JSON downloader cannot process column calculations");
  150. break;
  151. case "row":
  152. row.columns.forEach(function (col) {
  153. if (col) {
  154. item[col.component.getField()] = col.value;
  155. }
  156. });
  157. fileContents.push(item);
  158. break;
  159. }
  160. });
  161. fileContents = JSON.stringify(fileContents, null, '\t');
  162. setFileContents(fileContents, "application/json");
  163. },
  164. pdf: function pdf(list, options, setFileContents) {
  165. var header = [],
  166. body = [],
  167. autoTableParams = {},
  168. rowGroupStyles = options.rowGroupStyles || {
  169. fontStyle: "bold",
  170. fontSize: 12,
  171. cellPadding: 6,
  172. fillColor: 220
  173. },
  174. rowCalcStyles = options.rowCalcStyles || {
  175. fontStyle: "bold",
  176. fontSize: 10,
  177. cellPadding: 4,
  178. fillColor: 232
  179. },
  180. jsPDFParams = options.jsPDF || {},
  181. title = options && options.title ? options.title : "";
  182. if (!jsPDFParams.orientation) {
  183. jsPDFParams.orientation = options.orientation || "landscape";
  184. }
  185. if (!jsPDFParams.unit) {
  186. jsPDFParams.unit = "pt";
  187. }
  188. //parse row list
  189. list.forEach(function (row) {
  190. var item = {};
  191. switch (row.type) {
  192. case "header":
  193. header.push(parseRow(row));
  194. break;
  195. case "group":
  196. body.push(parseRow(row, rowGroupStyles));
  197. break;
  198. case "calc":
  199. body.push(parseRow(row, rowCalcStyles));
  200. break;
  201. case "row":
  202. body.push(parseRow(row));
  203. break;
  204. }
  205. });
  206. function parseRow(row, styles) {
  207. var rowData = [];
  208. row.columns.forEach(function (col) {
  209. var cell;
  210. if (col) {
  211. switch (_typeof(col.value)) {
  212. case "object":
  213. col.value = JSON.stringify(col.value);
  214. break;
  215. case "undefined":
  216. case "null":
  217. col.value = "";
  218. break;
  219. }
  220. cell = {
  221. content: col.value,
  222. colSpan: col.width,
  223. rowSpan: col.height
  224. };
  225. if (styles) {
  226. cell.styles = styles;
  227. }
  228. rowData.push(cell);
  229. } else {
  230. rowData.push("");
  231. }
  232. });
  233. return rowData;
  234. }
  235. //configure PDF
  236. var doc = new jsPDF(jsPDFParams); //set document to landscape, better for most tables
  237. if (options && options.autoTable) {
  238. if (typeof options.autoTable === "function") {
  239. autoTableParams = options.autoTable(doc) || {};
  240. } else {
  241. autoTableParams = options.autoTable;
  242. }
  243. }
  244. if (title) {
  245. autoTableParams.addPageContent = function (data) {
  246. doc.text(title, 40, 30);
  247. };
  248. }
  249. autoTableParams.head = header;
  250. autoTableParams.body = body;
  251. doc.autoTable(autoTableParams);
  252. if (options && options.documentProcessing) {
  253. options.documentProcessing(doc);
  254. }
  255. setFileContents(doc.output("arraybuffer"), "application/pdf");
  256. },
  257. xlsx: function xlsx(list, options, setFileContents) {
  258. var self = this,
  259. sheetName = options.sheetName || "Sheet1",
  260. workbook = XLSX.utils.book_new(),
  261. output;
  262. workbook.SheetNames = [];
  263. workbook.Sheets = {};
  264. function generateSheet() {
  265. var rows = [],
  266. merges = [],
  267. worksheet = {},
  268. range = { s: { c: 0, r: 0 }, e: { c: list[0] ? list[0].columns.reduce(function (a, b) {
  269. return a + (b && b.width ? b.width : 1);
  270. }, 0) : 0, r: list.length } };
  271. //parse row list
  272. list.forEach(function (row, i) {
  273. var rowData = [];
  274. row.columns.forEach(function (col, j) {
  275. if (col) {
  276. rowData.push(!(col.value instanceof Date) && _typeof(col.value) === "object" ? JSON.stringify(col.value) : col.value);
  277. if (col.width > 1 || col.height > -1) {
  278. merges.push({ s: { r: i, c: j }, e: { r: i + col.height - 1, c: j + col.width - 1 } });
  279. }
  280. } else {
  281. rowData.push("");
  282. }
  283. });
  284. rows.push(rowData);
  285. });
  286. //convert rows to worksheet
  287. XLSX.utils.sheet_add_aoa(worksheet, rows);
  288. worksheet['!ref'] = XLSX.utils.encode_range(range);
  289. if (merges.length) {
  290. worksheet["!merges"] = merges;
  291. }
  292. return worksheet;
  293. }
  294. if (options.sheetOnly) {
  295. setFileContents(generateSheet());
  296. return;
  297. }
  298. if (options.sheets) {
  299. for (var sheet in options.sheets) {
  300. if (options.sheets[sheet] === true) {
  301. workbook.SheetNames.push(sheet);
  302. workbook.Sheets[sheet] = generateSheet();
  303. } else {
  304. workbook.SheetNames.push(sheet);
  305. this.modules.comms.send(options.sheets[sheet], "download", "intercept", {
  306. type: "xlsx",
  307. options: { sheetOnly: true },
  308. active: self.active,
  309. intercept: function intercept(data) {
  310. workbook.Sheets[sheet] = data;
  311. }
  312. });
  313. }
  314. }
  315. } else {
  316. workbook.SheetNames.push(sheetName);
  317. workbook.Sheets[sheetName] = generateSheet();
  318. }
  319. if (options.documentProcessing) {
  320. workbook = options.documentProcessing(workbook);
  321. }
  322. //convert workbook to binary array
  323. function s2ab(s) {
  324. var buf = new ArrayBuffer(s.length);
  325. var view = new Uint8Array(buf);
  326. for (var i = 0; i != s.length; ++i) {
  327. view[i] = s.charCodeAt(i) & 0xFF;
  328. }return buf;
  329. }
  330. output = XLSX.write(workbook, { bookType: 'xlsx', bookSST: true, type: 'binary' });
  331. setFileContents(s2ab(output), "application/octet-stream");
  332. },
  333. html: function html(list, options, setFileContents) {
  334. if (this.modExists("export", true)) {
  335. setFileContents(this.modules.export.genereateHTMLTable(list), "text/html");
  336. }
  337. }
  338. };
  339. Tabulator.prototype.registerModule("download", Download);