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 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  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.6.3 (c) Oliver Folkerd */
  3. var Download = function Download(table) {
  4. this.table = table; //hold Tabulator object
  5. this.fields = {}; //hold filed multi dimension arrays
  6. this.columnsByIndex = []; //hold columns in their order in the table
  7. this.columnsByField = {}; //hold columns with lookup by field name
  8. this.config = {};
  9. this.active = false;
  10. };
  11. //trigger file download
  12. Download.prototype.download = function (type, filename, options, active, interceptCallback) {
  13. var self = this,
  14. downloadFunc = false;
  15. this.processConfig();
  16. this.active = active;
  17. function buildLink(data, mime) {
  18. if (interceptCallback) {
  19. if (interceptCallback === true) {
  20. self.triggerDownload(data, mime, type, filename, true);
  21. } else {
  22. interceptCallback(data);
  23. }
  24. } else {
  25. self.triggerDownload(data, mime, type, filename);
  26. }
  27. }
  28. if (typeof type == "function") {
  29. downloadFunc = type;
  30. } else {
  31. if (self.downloaders[type]) {
  32. downloadFunc = self.downloaders[type];
  33. } else {
  34. console.warn("Download Error - No such download type found: ", type);
  35. }
  36. }
  37. this.processColumns();
  38. if (downloadFunc) {
  39. downloadFunc.call(this, self.processDefinitions(), self.processData(active || "active"), options || {}, buildLink, this.config);
  40. }
  41. };
  42. Download.prototype.processConfig = function () {
  43. var config = { //download config
  44. columnGroups: true,
  45. rowGroups: true,
  46. columnCalcs: true,
  47. dataTree: true
  48. };
  49. if (this.table.options.downloadConfig) {
  50. for (var key in this.table.options.downloadConfig) {
  51. config[key] = this.table.options.downloadConfig[key];
  52. }
  53. }
  54. this.config.rowGroups = config.rowGroups && this.table.options.groupBy && this.table.modExists("groupRows");
  55. if (config.columnGroups && this.table.columnManager.columns.length != this.table.columnManager.columnsByIndex.length) {
  56. this.config.columnGroups = true;
  57. }
  58. if (config.columnCalcs && this.table.modExists("columnCalcs")) {
  59. this.config.columnCalcs = true;
  60. }
  61. if (config.dataTree && this.table.options.dataTree && this.table.modExists("dataTree")) {
  62. this.config.dataTree = true;
  63. }
  64. };
  65. Download.prototype.processColumns = function () {
  66. var self = this;
  67. self.columnsByIndex = [];
  68. self.columnsByField = {};
  69. self.table.columnManager.columnsByIndex.forEach(function (column) {
  70. if (column.field && column.definition.download !== false && (column.visible || !column.visible && column.definition.download)) {
  71. self.columnsByIndex.push(column);
  72. self.columnsByField[column.field] = column;
  73. }
  74. });
  75. };
  76. Download.prototype.processDefinitions = function () {
  77. var self = this,
  78. processedDefinitions = [];
  79. if (this.config.columnGroups) {
  80. self.table.columnManager.columns.forEach(function (column) {
  81. var colData = self.processColumnGroup(column);
  82. if (colData) {
  83. processedDefinitions.push(colData);
  84. }
  85. });
  86. } else {
  87. self.columnsByIndex.forEach(function (column) {
  88. if (column.download !== false) {
  89. //isolate definiton from defintion object
  90. processedDefinitions.push(self.processDefinition(column));
  91. }
  92. });
  93. }
  94. return processedDefinitions;
  95. };
  96. Download.prototype.processColumnGroup = function (column) {
  97. var _this = this;
  98. var subGroups = column.columns,
  99. maxDepth = 0;
  100. var processedColumn = this.processDefinition(column);
  101. var groupData = {
  102. type: "group",
  103. title: processedColumn.title,
  104. depth: 1
  105. };
  106. if (subGroups.length) {
  107. groupData.subGroups = [];
  108. groupData.width = 0;
  109. subGroups.forEach(function (subGroup) {
  110. var subGroupData = _this.processColumnGroup(subGroup);
  111. if (subGroupData.depth > maxDepth) {
  112. maxDepth = subGroupData.depth;
  113. }
  114. if (subGroupData) {
  115. groupData.width += subGroupData.width;
  116. groupData.subGroups.push(subGroupData);
  117. }
  118. });
  119. groupData.depth += maxDepth;
  120. if (!groupData.width) {
  121. return false;
  122. }
  123. } else {
  124. if (column.field && column.definition.download !== false && (column.visible || !column.visible && column.definition.download)) {
  125. groupData.width = 1;
  126. groupData.definition = processedColumn;
  127. } else {
  128. return false;
  129. }
  130. }
  131. return groupData;
  132. };
  133. Download.prototype.processDefinition = function (column) {
  134. var def = {};
  135. for (var key in column.definition) {
  136. def[key] = column.definition[key];
  137. }
  138. if (typeof column.definition.downloadTitle != "undefined") {
  139. def.title = column.definition.downloadTitle;
  140. }
  141. return def;
  142. };
  143. Download.prototype.processData = function (active) {
  144. var _this2 = this;
  145. var self = this,
  146. data = [],
  147. groups = [],
  148. rows = false,
  149. calcs = {};
  150. if (this.config.rowGroups) {
  151. if (active == "visible") {
  152. rows = self.table.rowManager.getRows(active);
  153. rows.forEach(function (row) {
  154. if (row.type == "row") {
  155. var group = row.getGroup();
  156. if (groups.indexOf(group) === -1) {
  157. groups.push(group);
  158. }
  159. }
  160. });
  161. } else {
  162. groups = this.table.modules.groupRows.getGroups();
  163. }
  164. groups.forEach(function (group) {
  165. data.push(_this2.processGroupData(group, rows));
  166. });
  167. } else {
  168. if (this.config.dataTree) {
  169. active = active = "active" ? "display" : active;
  170. }
  171. data = self.table.rowManager.getData(active, "download");
  172. }
  173. if (this.config.columnCalcs) {
  174. calcs = this.table.getCalcResults();
  175. data = {
  176. calcs: calcs,
  177. data: data
  178. };
  179. }
  180. //bulk data processing
  181. if (typeof self.table.options.downloadDataFormatter == "function") {
  182. data = self.table.options.downloadDataFormatter(data);
  183. }
  184. return data;
  185. };
  186. Download.prototype.processGroupData = function (group, visRows) {
  187. var _this3 = this;
  188. var subGroups = group.getSubGroups();
  189. var groupData = {
  190. type: "group",
  191. key: group.key
  192. };
  193. if (subGroups.length) {
  194. groupData.subGroups = [];
  195. subGroups.forEach(function (subGroup) {
  196. groupData.subGroups.push(_this3.processGroupData(subGroup, visRows));
  197. });
  198. } else {
  199. if (visRows) {
  200. groupData.rows = [];
  201. group.rows.forEach(function (row) {
  202. if (visRows.indexOf(row) > -1) {
  203. groupData.rows.push(row.getData("download"));
  204. }
  205. });
  206. } else {
  207. groupData.rows = group.getData(true, "download");
  208. }
  209. }
  210. return groupData;
  211. };
  212. Download.prototype.triggerDownload = function (data, mime, type, filename, newTab) {
  213. var element = document.createElement('a'),
  214. blob = new Blob([data], { type: mime }),
  215. filename = filename || "Tabulator." + (typeof type === "function" ? "txt" : type);
  216. blob = this.table.options.downloadReady.call(this.table, data, blob);
  217. if (blob) {
  218. if (newTab) {
  219. window.open(window.URL.createObjectURL(blob));
  220. } else {
  221. if (navigator.msSaveOrOpenBlob) {
  222. navigator.msSaveOrOpenBlob(blob, filename);
  223. } else {
  224. element.setAttribute('href', window.URL.createObjectURL(blob));
  225. //set file title
  226. element.setAttribute('download', filename);
  227. //trigger download
  228. element.style.display = 'none';
  229. document.body.appendChild(element);
  230. element.click();
  231. //remove temporary link element
  232. document.body.removeChild(element);
  233. }
  234. }
  235. if (this.table.options.downloadComplete) {
  236. this.table.options.downloadComplete();
  237. }
  238. }
  239. };
  240. //nested field lookup
  241. Download.prototype.getFieldValue = function (field, data) {
  242. var column = this.columnsByField[field];
  243. if (column) {
  244. return column.getFieldValue(data);
  245. }
  246. return false;
  247. };
  248. Download.prototype.commsReceived = function (table, action, data) {
  249. switch (action) {
  250. case "intercept":
  251. this.download(data.type, "", data.options, data.active, data.intercept);
  252. break;
  253. }
  254. };
  255. //downloaders
  256. Download.prototype.downloaders = {
  257. csv: function csv(columns, data, options, setFileContents, config) {
  258. var self = this,
  259. titles = [],
  260. fields = [],
  261. delimiter = options && options.delimiter ? options.delimiter : ",",
  262. fileContents,
  263. output;
  264. //build column headers
  265. function parseSimpleTitles() {
  266. columns.forEach(function (column) {
  267. titles.push('"' + String(column.title).split('"').join('""') + '"');
  268. fields.push(column.field);
  269. });
  270. }
  271. function parseColumnGroup(column, level) {
  272. if (column.subGroups) {
  273. column.subGroups.forEach(function (subGroup) {
  274. parseColumnGroup(subGroup, level + 1);
  275. });
  276. } else {
  277. titles.push('"' + String(column.title).split('"').join('""') + '"');
  278. fields.push(column.definition.field);
  279. }
  280. }
  281. if (config.columnGroups) {
  282. console.warn("Download Warning - CSV downloader cannot process column groups");
  283. columns.forEach(function (column) {
  284. parseColumnGroup(column, 0);
  285. });
  286. } else {
  287. parseSimpleTitles();
  288. }
  289. //generate header row
  290. fileContents = [titles.join(delimiter)];
  291. function parseRows(data) {
  292. //generate each row of the table
  293. data.forEach(function (row) {
  294. var rowData = [];
  295. fields.forEach(function (field) {
  296. var value = self.getFieldValue(field, row);
  297. switch (typeof value === "undefined" ? "undefined" : _typeof(value)) {
  298. case "object":
  299. value = JSON.stringify(value);
  300. break;
  301. case "undefined":
  302. case "null":
  303. value = "";
  304. break;
  305. default:
  306. value = value;
  307. }
  308. //escape quotation marks
  309. rowData.push('"' + String(value).split('"').join('""') + '"');
  310. });
  311. fileContents.push(rowData.join(delimiter));
  312. });
  313. }
  314. function parseGroup(group) {
  315. if (group.subGroups) {
  316. group.subGroups.forEach(function (subGroup) {
  317. parseGroup(subGroup);
  318. });
  319. } else {
  320. parseRows(group.rows);
  321. }
  322. }
  323. if (config.columnCalcs) {
  324. console.warn("Download Warning - CSV downloader cannot process column calculations");
  325. data = data.data;
  326. }
  327. if (config.rowGroups) {
  328. console.warn("Download Warning - CSV downloader cannot process row groups");
  329. data.forEach(function (group) {
  330. parseGroup(group);
  331. });
  332. } else {
  333. parseRows(data);
  334. }
  335. output = fileContents.join("\n");
  336. if (options.bom) {
  337. output = "\uFEFF" + output;
  338. }
  339. setFileContents(output, "text/csv");
  340. },
  341. json: function json(columns, data, options, setFileContents, config) {
  342. var fileContents;
  343. if (config.columnCalcs) {
  344. console.warn("Download Warning - CSV downloader cannot process column calculations");
  345. data = data.data;
  346. }
  347. fileContents = JSON.stringify(data, null, '\t');
  348. setFileContents(fileContents, "application/json");
  349. },
  350. pdf: function pdf(columns, data, options, setFileContents, config) {
  351. var self = this,
  352. fields = [],
  353. header = [],
  354. body = [],
  355. calcs = {},
  356. headerDepth = 1,
  357. table = "",
  358. autoTableParams = {},
  359. rowGroupStyles = options.rowGroupStyles || {
  360. fontStyle: "bold",
  361. fontSize: 12,
  362. cellPadding: 6,
  363. fillColor: 220
  364. },
  365. rowCalcStyles = options.rowCalcStyles || {
  366. fontStyle: "bold",
  367. fontSize: 10,
  368. cellPadding: 4,
  369. fillColor: 232
  370. },
  371. jsPDFParams = options.jsPDF || {},
  372. title = options && options.title ? options.title : "";
  373. if (config.columnCalcs) {
  374. calcs = data.calcs;
  375. data = data.data;
  376. }
  377. if (!jsPDFParams.orientation) {
  378. jsPDFParams.orientation = options.orientation || "landscape";
  379. }
  380. if (!jsPDFParams.unit) {
  381. jsPDFParams.unit = "pt";
  382. }
  383. //build column headers
  384. function parseSimpleTitles() {
  385. columns.forEach(function (column) {
  386. if (column.field) {
  387. header.push(column.title || "");
  388. fields.push(column.field);
  389. }
  390. });
  391. header = [header];
  392. }
  393. function parseColumnGroup(column, level) {
  394. var colSpan = column.width,
  395. rowSpan = 1,
  396. col = {
  397. content: column.title || ""
  398. };
  399. if (column.subGroups) {
  400. column.subGroups.forEach(function (subGroup) {
  401. parseColumnGroup(subGroup, level + 1);
  402. });
  403. rowSpan = 1;
  404. } else {
  405. fields.push(column.definition.field);
  406. rowSpan = headerDepth - level;
  407. }
  408. col.rowSpan = rowSpan;
  409. // col.colSpan = colSpan;
  410. header[level].push(col);
  411. colSpan--;
  412. if (rowSpan > 1) {
  413. for (var i = level + 1; i < headerDepth; i++) {
  414. header[i].push("");
  415. }
  416. }
  417. for (var i = 0; i < colSpan; i++) {
  418. header[level].push("");
  419. }
  420. }
  421. if (config.columnGroups) {
  422. columns.forEach(function (column) {
  423. if (column.depth > headerDepth) {
  424. headerDepth = column.depth;
  425. }
  426. });
  427. for (var i = 0; i < headerDepth; i++) {
  428. header.push([]);
  429. }
  430. columns.forEach(function (column) {
  431. parseColumnGroup(column, 0);
  432. });
  433. } else {
  434. parseSimpleTitles();
  435. }
  436. function parseValue(value) {
  437. switch (typeof value === "undefined" ? "undefined" : _typeof(value)) {
  438. case "object":
  439. value = JSON.stringify(value);
  440. break;
  441. case "undefined":
  442. case "null":
  443. value = "";
  444. break;
  445. default:
  446. value = value;
  447. }
  448. return value;
  449. }
  450. function parseRows(data) {
  451. //build table rows
  452. data.forEach(function (row) {
  453. body.push(parseRow(row));
  454. });
  455. }
  456. function parseRow(row, styles) {
  457. var rowData = [];
  458. fields.forEach(function (field) {
  459. var value = self.getFieldValue(field, row);
  460. value = parseValue(value);
  461. if (styles) {
  462. rowData.push({
  463. content: value,
  464. styles: styles
  465. });
  466. } else {
  467. rowData.push(value);
  468. }
  469. });
  470. return rowData;
  471. }
  472. function parseGroup(group, calcObj) {
  473. var groupData = [];
  474. groupData.push({ content: parseValue(group.key), colSpan: fields.length, styles: rowGroupStyles });
  475. body.push(groupData);
  476. if (group.subGroups) {
  477. group.subGroups.forEach(function (subGroup) {
  478. parseGroup(subGroup, calcObj[group.key] ? calcObj[group.key].groups || {} : {});
  479. });
  480. } else {
  481. if (config.columnCalcs) {
  482. addCalcRow(calcObj, group.key, "top");
  483. }
  484. parseRows(group.rows);
  485. if (config.columnCalcs) {
  486. addCalcRow(calcObj, group.key, "bottom");
  487. }
  488. }
  489. }
  490. function addCalcRow(calcs, selector, pos) {
  491. var calcData = calcs[selector];
  492. if (calcData) {
  493. if (pos) {
  494. calcData = calcData[pos];
  495. }
  496. if (Object.keys(calcData).length) {
  497. body.push(parseRow(calcData, rowCalcStyles));
  498. }
  499. }
  500. }
  501. if (config.rowGroups) {
  502. data.forEach(function (group) {
  503. parseGroup(group, calcs);
  504. });
  505. } else {
  506. if (config.columnCalcs) {
  507. addCalcRow(calcs, "top");
  508. }
  509. parseRows(data);
  510. if (config.columnCalcs) {
  511. addCalcRow(calcs, "bottom");
  512. }
  513. }
  514. var doc = new jsPDF(jsPDFParams); //set document to landscape, better for most tables
  515. if (options && options.autoTable) {
  516. if (typeof options.autoTable === "function") {
  517. autoTableParams = options.autoTable(doc) || {};
  518. } else {
  519. autoTableParams = options.autoTable;
  520. }
  521. }
  522. if (title) {
  523. autoTableParams.addPageContent = function (data) {
  524. doc.text(title, 40, 30);
  525. };
  526. }
  527. autoTableParams.head = header;
  528. autoTableParams.body = body;
  529. doc.autoTable(autoTableParams);
  530. if (options && options.documentProcessing) {
  531. options.documentProcessing(doc);
  532. }
  533. setFileContents(doc.output("arraybuffer"), "application/pdf");
  534. },
  535. xlsx: function xlsx(columns, data, options, setFileContents, config) {
  536. var self = this,
  537. sheetName = options.sheetName || "Sheet1",
  538. workbook = XLSX.utils.book_new(),
  539. calcs = {},
  540. groupRowIndexs = [],
  541. groupColumnIndexs = [],
  542. calcRowIndexs = [],
  543. output;
  544. workbook.SheetNames = [];
  545. workbook.Sheets = {};
  546. if (config.columnCalcs) {
  547. calcs = data.calcs;
  548. data = data.data;
  549. }
  550. function generateSheet() {
  551. var titles = [],
  552. fields = [],
  553. rows = [],
  554. worksheet;
  555. //convert rows to worksheet
  556. function rowsToSheet() {
  557. var sheet = {};
  558. var range = { s: { c: 0, r: 0 }, e: { c: fields.length, r: rows.length } };
  559. XLSX.utils.sheet_add_aoa(sheet, rows);
  560. sheet['!ref'] = XLSX.utils.encode_range(range);
  561. var merges = generateMerges();
  562. if (merges.length) {
  563. sheet["!merges"] = merges;
  564. }
  565. return sheet;
  566. }
  567. function parseSimpleTitles() {
  568. //get field lists
  569. columns.forEach(function (column) {
  570. titles.push(column.title);
  571. fields.push(column.field);
  572. });
  573. rows.push(titles);
  574. }
  575. function parseColumnGroup(column, level) {
  576. if (typeof titles[level] === "undefined") {
  577. titles[level] = [];
  578. }
  579. if (typeof groupColumnIndexs[level] === "undefined") {
  580. groupColumnIndexs[level] = [];
  581. }
  582. if (column.width > 1) {
  583. groupColumnIndexs[level].push({
  584. type: "hoz",
  585. start: titles[level].length,
  586. end: titles[level].length + column.width - 1
  587. });
  588. }
  589. titles[level].push(column.title);
  590. if (column.subGroups) {
  591. column.subGroups.forEach(function (subGroup) {
  592. parseColumnGroup(subGroup, level + 1);
  593. });
  594. } else {
  595. fields.push(column.definition.field);
  596. padColumnTitles(fields.length - 1, level);
  597. groupColumnIndexs[level].push({
  598. type: "vert",
  599. start: fields.length - 1
  600. });
  601. }
  602. }
  603. function padColumnTitles() {
  604. var max = 0;
  605. titles.forEach(function (title) {
  606. var len = title.length;
  607. if (len > max) {
  608. max = len;
  609. }
  610. });
  611. titles.forEach(function (title) {
  612. var len = title.length;
  613. if (len < max) {
  614. for (var i = len; i < max; i++) {
  615. title.push("");
  616. }
  617. }
  618. });
  619. }
  620. if (config.columnGroups) {
  621. columns.forEach(function (column) {
  622. parseColumnGroup(column, 0);
  623. });
  624. titles.forEach(function (title) {
  625. rows.push(title);
  626. });
  627. } else {
  628. parseSimpleTitles();
  629. }
  630. function generateMerges() {
  631. var output = [];
  632. groupRowIndexs.forEach(function (index) {
  633. output.push({ s: { r: index, c: 0 }, e: { r: index, c: fields.length - 1 } });
  634. });
  635. groupColumnIndexs.forEach(function (merges, level) {
  636. merges.forEach(function (merge) {
  637. if (merge.type === "hoz") {
  638. output.push({ s: { r: level, c: merge.start }, e: { r: level, c: merge.end } });
  639. } else {
  640. if (level != titles.length - 1) {
  641. output.push({ s: { r: level, c: merge.start }, e: { r: titles.length - 1, c: merge.start } });
  642. }
  643. }
  644. });
  645. });
  646. return output;
  647. }
  648. //generate each row of the table
  649. function parseRows(data) {
  650. data.forEach(function (row) {
  651. rows.push(parseRow(row));
  652. });
  653. }
  654. function parseRow(row) {
  655. var rowData = [];
  656. fields.forEach(function (field) {
  657. var value = self.getFieldValue(field, row);
  658. rowData.push(!(value instanceof Date) && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" ? JSON.stringify(value) : value);
  659. });
  660. return rowData;
  661. }
  662. function addCalcRow(calcs, selector, pos) {
  663. var calcData = calcs[selector];
  664. if (calcData) {
  665. if (pos) {
  666. calcData = calcData[pos];
  667. }
  668. if (Object.keys(calcData).length) {
  669. calcRowIndexs.push(rows.length);
  670. rows.push(parseRow(calcData));
  671. }
  672. }
  673. }
  674. function parseGroup(group, calcObj) {
  675. var groupData = [];
  676. groupData.push(group.key);
  677. groupRowIndexs.push(rows.length);
  678. rows.push(groupData);
  679. if (group.subGroups) {
  680. group.subGroups.forEach(function (subGroup) {
  681. parseGroup(subGroup, calcObj[group.key] ? calcObj[group.key].groups || {} : {});
  682. });
  683. } else {
  684. if (config.columnCalcs) {
  685. addCalcRow(calcObj, group.key, "top");
  686. }
  687. parseRows(group.rows);
  688. if (config.columnCalcs) {
  689. addCalcRow(calcObj, group.key, "bottom");
  690. }
  691. }
  692. }
  693. if (config.rowGroups) {
  694. data.forEach(function (group) {
  695. parseGroup(group, calcs);
  696. });
  697. } else {
  698. if (config.columnCalcs) {
  699. addCalcRow(calcs, "top");
  700. }
  701. parseRows(data);
  702. if (config.columnCalcs) {
  703. addCalcRow(calcs, "bottom");
  704. }
  705. }
  706. worksheet = rowsToSheet();
  707. return worksheet;
  708. }
  709. if (options.sheetOnly) {
  710. setFileContents(generateSheet());
  711. return;
  712. }
  713. if (options.sheets) {
  714. for (var sheet in options.sheets) {
  715. if (options.sheets[sheet] === true) {
  716. workbook.SheetNames.push(sheet);
  717. workbook.Sheets[sheet] = generateSheet();
  718. } else {
  719. workbook.SheetNames.push(sheet);
  720. this.table.modules.comms.send(options.sheets[sheet], "download", "intercept", {
  721. type: "xlsx",
  722. options: { sheetOnly: true },
  723. active: self.active,
  724. intercept: function intercept(data) {
  725. workbook.Sheets[sheet] = data;
  726. }
  727. });
  728. }
  729. }
  730. } else {
  731. workbook.SheetNames.push(sheetName);
  732. workbook.Sheets[sheetName] = generateSheet();
  733. }
  734. if (options.documentProcessing) {
  735. workbook = options.documentProcessing(workbook);
  736. }
  737. //convert workbook to binary array
  738. function s2ab(s) {
  739. var buf = new ArrayBuffer(s.length);
  740. var view = new Uint8Array(buf);
  741. for (var i = 0; i != s.length; ++i) {
  742. view[i] = s.charCodeAt(i) & 0xFF;
  743. }return buf;
  744. }
  745. output = XLSX.write(workbook, { bookType: 'xlsx', bookSST: true, type: 'binary' });
  746. setFileContents(s2ab(output), "application/octet-stream");
  747. },
  748. html: function html(columns, data, options, setFileContents, config) {
  749. if (this.table.modExists("export", true)) {
  750. setFileContents(this.table.modules.export.getHtml(true, options.style, config), "text/html");
  751. }
  752. }
  753. };
  754. Tabulator.prototype.registerModule("download", Download);