UNPKG

jspdf-autotable

Version:

Generate pdf tables with javascript (jsPDF plugin)

1,354 lines (1,317 loc) 67 kB
/*! * * jsPDF AutoTable plugin v3.0.0 * * Copyright (c) 2014 Simon Bengtsson, https://github.com/simonbengtsson/jsPDF-AutoTable * Licensed under the MIT License. * http://opensource.org/licenses/mit-license * * * /if (typeof window === 'object') window.jspdfAutoTableVersion = '" + newVersion + "';/*" * */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("jspdf")); else if(typeof define === 'function' && define.amd) define(["jspdf"], factory); else { var a = typeof exports === 'object' ? factory(require("jspdf")) : factory(root["jsPDF"]); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(window, function(__WEBPACK_EXTERNAL_MODULE__4__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 5); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var defaultsDocument = null; var previousTableState; var tableState = null; exports.globalDefaults = {}; exports.documentDefaults = {}; function default_1() { return tableState; } exports.default = default_1; function getGlobalOptions() { return exports.globalDefaults; } exports.getGlobalOptions = getGlobalOptions; function getDocumentOptions() { return exports.documentDefaults; } exports.getDocumentOptions = getDocumentOptions; var TableState = /** @class */ (function () { function TableState(doc) { this.doc = doc; } TableState.prototype.pageHeight = function () { return this.pageSize().height; }; ; TableState.prototype.pageWidth = function () { return this.pageSize().width; }; ; TableState.prototype.pageSize = function () { var pageSize = this.doc.internal.pageSize; // JSPDF 1.4 uses get functions instead of properties on pageSize if (pageSize.width == null) { pageSize = { width: pageSize.getWidth(), height: pageSize.getHeight() }; } return pageSize; }; ; TableState.prototype.scaleFactor = function () { return this.doc.internal.scaleFactor; }; ; TableState.prototype.pageNumber = function () { return this.doc.internal.getNumberOfPages(); }; return TableState; }()); function setupState(doc) { previousTableState = tableState; tableState = new TableState(doc); if (doc !== defaultsDocument) { defaultsDocument = doc; exports.documentDefaults = {}; } } exports.setupState = setupState; function resetState() { tableState = previousTableState; } exports.resetState = resetState; function setDefaults(defaults, doc) { if (doc === void 0) { doc = null; } if (doc) { exports.documentDefaults = defaults || {}; defaultsDocument = doc; } else { exports.globalDefaults = defaults || {}; } } exports.setDefaults = setDefaults; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var config_1 = __webpack_require__(2); var state_1 = __webpack_require__(0); var polyfills_1 = __webpack_require__(3); function getStringWidth(text, styles) { var fontSize = styles.fontSize / state_1.default().scaleFactor(); applyStyles(styles); text = Array.isArray(text) ? text : [text]; var maxWidth = 0; text.forEach(function (line) { var width = state_1.default().doc.getStringUnitWidth(line); if (width > maxWidth) { maxWidth = width; } }); var precision = 10000 * state_1.default().scaleFactor(); maxWidth = Math.floor(maxWidth * precision) / precision; return maxWidth * fontSize; } exports.getStringWidth = getStringWidth; /** * Ellipsize the text to fit in the width */ function ellipsize(text, width, styles, ellipsizeStr) { if (ellipsizeStr === void 0) { ellipsizeStr = '...'; } if (Array.isArray(text)) { var value_1 = []; text.forEach(function (str, i) { value_1[i] = ellipsize(str, width, styles, ellipsizeStr); }); return value_1; } var precision = 10000 * state_1.default().scaleFactor(); width = Math.ceil(width * precision) / precision; if (width >= getStringWidth(text, styles)) { return text; } while (width < getStringWidth(text + ellipsizeStr, styles)) { if (text.length <= 1) { break; } text = text.substring(0, text.length - 1); } return text.trim() + ellipsizeStr; } exports.ellipsize = ellipsize; function addTableBorder() { var table = state_1.default().table; var styles = { lineWidth: table.settings.tableLineWidth, lineColor: table.settings.tableLineColor }; applyStyles(styles); var fs = getFillStyle(styles); if (fs) { state_1.default().doc.rect(table.pageStartX, table.pageStartY, table.width, table.cursor.y - table.pageStartY, fs); } } exports.addTableBorder = addTableBorder; function getFillStyle(styles) { var drawLine = styles.lineWidth > 0; var drawBackground = styles.fillColor || styles.fillColor === 0; if (drawLine && drawBackground) { return 'DF'; // Fill then stroke } else if (drawLine) { return 'S'; // Only stroke (transparent background) } else if (drawBackground) { return 'F'; // Only fill, no stroke } else { return false; } } exports.getFillStyle = getFillStyle; function applyUserStyles() { applyStyles(state_1.default().table.userStyles); } exports.applyUserStyles = applyUserStyles; function applyStyles(styles) { var doc = state_1.default().doc; var styleModifiers = { fillColor: doc.setFillColor, textColor: doc.setTextColor, fontStyle: doc.setFontStyle, lineColor: doc.setDrawColor, lineWidth: doc.setLineWidth, font: doc.setFont, fontSize: doc.setFontSize }; Object.keys(styleModifiers).forEach(function (name) { var style = styles[name]; var modifier = styleModifiers[name]; if (typeof style !== 'undefined') { if (Array.isArray(style)) { modifier.apply(this, style); } else { modifier(style); } } }); } exports.applyStyles = applyStyles; // This is messy, only keep array and number format the next major version function marginOrPadding(value, defaultValue) { var newValue = {}; if (Array.isArray(value)) { if (value.length >= 4) { newValue = { 'top': value[0], 'right': value[1], 'bottom': value[2], 'left': value[3] }; } else if (value.length === 3) { newValue = { 'top': value[0], 'right': value[1], 'bottom': value[2], 'left': value[1] }; } else if (value.length === 2) { newValue = { 'top': value[0], 'right': value[1], 'bottom': value[0], 'left': value[1] }; } else if (value.length === 1) { value = value[0]; } else { value = defaultValue; } } else if (typeof value === 'object') { if (value['vertical']) { value['top'] = value['vertical']; value['bottom'] = value['vertical']; } if (value['horizontal']) { value['right'] = value['horizontal']; value['left'] = value['horizontal']; } for (var _i = 0, _a = ['top', 'right', 'bottom', 'left']; _i < _a.length; _i++) { var side = _a[_i]; newValue[side] = (value[side] || value[side] === 0) ? value[side] : defaultValue; } } if (typeof value === 'number') { newValue = { 'top': value, 'right': value, 'bottom': value, 'left': value }; } return newValue; } exports.marginOrPadding = marginOrPadding; function styles(styles) { styles = Array.isArray(styles) ? styles : [styles]; return polyfills_1.assign.apply(void 0, [config_1.defaultStyles()].concat(styles)); } exports.styles = styles; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * Ratio between font size and font height. The number comes from jspdf's source code */ exports.FONT_ROW_RATIO = 1.15; var state_1 = __webpack_require__(0); function defaultConfig() { return { // Html content html: null, // Custom content head: null, body: null, foot: null, // Properties includeHiddenHtml: false, startY: null, margin: 40 / state_1.default().scaleFactor(), pageBreak: 'auto', rowPageBreak: 'auto', tableWidth: 'auto', showHead: 'everyPage', showFoot: 'everyPage', tableLineWidth: 0, tableLineColor: 200, tableId: null, // Styling theme: 'striped', useCss: false, styles: {}, headStyles: {}, bodyStyles: {}, footStyles: {}, alternateRowStyles: {}, columnStyles: {}, // Hooks // Use to change the content of the cell before width calculations etc are performed didParseCell: function (data) { }, willDrawCell: function (data) { }, // Use to draw additional content such as images in table cells didDrawCell: function (data) { }, // Use to draw additional content to each page such as headers and footers didDrawPage: function (data) { }, }; } exports.defaultConfig = defaultConfig; // Base style for all themes function defaultStyles() { return { font: "helvetica", fontStyle: 'normal', overflow: 'linebreak', fillColor: false, textColor: 20, halign: 'left', valign: 'top', fontSize: 10, cellPadding: 5 / state_1.default().scaleFactor(), lineColor: 200, lineWidth: 0 / state_1.default().scaleFactor(), cellWidth: 'auto', minCellHeight: 0 }; } exports.defaultStyles = defaultStyles; /** * Styles for the themes (overriding the default styles) */ function getTheme(name) { var themes = { 'striped': { table: { fillColor: 255, textColor: 80, fontStyle: 'normal' }, head: { textColor: 255, fillColor: [41, 128, 185], fontStyle: 'bold' }, body: {}, foot: { textColor: 255, fillColor: [41, 128, 185], fontStyle: 'bold' }, alternateRow: { fillColor: 245 } }, 'grid': { table: { fillColor: 255, textColor: 80, fontStyle: 'normal', lineWidth: 0.1 }, head: { textColor: 255, fillColor: [26, 188, 156], fontStyle: 'bold', lineWidth: 0 }, body: {}, foot: { textColor: 255, fillColor: [26, 188, 156], fontStyle: 'bold', lineWidth: 0 }, alternateRow: {} }, 'plain': { head: { fontStyle: 'bold' }, foot: { fontStyle: 'bold' } } }; return themes[name]; } exports.getTheme = getTheme; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* * Include common small polyfills instead of requiring the user to to do it */ Object.defineProperty(exports, "__esModule", { value: true }); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign function assign(target) { 'use strict'; var varArgs = []; for (var _i = 1; _i < arguments.length; _i++) { varArgs[_i - 1] = arguments[_i]; } if (target == null) { // TypeError if undefined or null throw new TypeError('Cannot convert undefined or null to object'); } var to = Object(target); for (var index = 1; index < arguments.length; index++) { var nextSource = arguments[index]; if (nextSource != null) { // Skip over if undefined or null for (var nextKey in nextSource) { // Avoid bugs when hasOwnProperty is shadowed if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { to[nextKey] = nextSource[nextKey]; } } } } return to; } exports.assign = assign; /***/ }), /* 4 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE__4__; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tableDrawer_1 = __webpack_require__(6); var widthCalculator_1 = __webpack_require__(7); var inputParser_1 = __webpack_require__(8); var state_1 = __webpack_require__(0); __webpack_require__(15); var common_1 = __webpack_require__(1); var jsPDF = __webpack_require__(4); jsPDF.API.autoTable = function () { state_1.setupState(this); // 1. Parse and unify user input var table = inputParser_1.parseInput(arguments); // 2. Calculate preliminary table, column, row and cell dimensions widthCalculator_1.calculateWidths(table); // 3. Output table to pdf tableDrawer_1.drawTable(table); table.finalY = table.cursor.y; this.previousAutoTable = table; this.lastAutoTable = table; this.autoTable.previous = table; // Deprecated common_1.applyUserStyles(); state_1.resetState(); return this; }; // Assign false to enable `doc.lastAutoTable.finalY || 40` sugar; jsPDF.API.lastAutoTable = false; jsPDF.API.previousAutoTable = false; // deprecated in v3 jsPDF.API.autoTable.previous = false; // deprecated in v3 jsPDF.API.autoTableSetDefaults = function (defaults) { state_1.setDefaults(defaults, this); return this; }; jsPDF.autoTableSetDefaults = function (defaults, doc) { state_1.setDefaults(defaults, doc); return this; }; /** * @Deprecated. Use html option instead doc.autoTable(html: '#table') */ jsPDF.API.autoTableHtmlToJson = function (tableElem, includeHiddenElements) { console.error("Use of deprecated function: autoTableHtmlToJson. Use html option instead."); includeHiddenElements = includeHiddenElements || false; if (!tableElem || !(tableElem instanceof HTMLTableElement)) { console.error("A HTMLTableElement has to be sent to autoTableHtmlToJson"); return null; } var columns = {}, rows = []; var header = tableElem.rows[0]; for (var i = 0; i < header.cells.length; i++) { var cell = header.cells[i]; var style = window.getComputedStyle(cell); if (includeHiddenElements || style.display !== 'none') { columns[i] = cell; } } var _loop_1 = function (i) { var tableRow = tableElem.rows[i]; var style = window.getComputedStyle(tableRow); if (includeHiddenElements || style.display !== 'none') { var rowData_1 = []; Object.keys(columns).forEach(function (key) { var cell = tableRow.cells[key]; rowData_1.push(cell); }); rows.push(rowData_1); } }; for (var i = 1; i < tableElem.rows.length; i++) { _loop_1(i); } var values = Object.keys(columns).map(function (key) { return columns[key]; }); return { columns: values, rows: rows, data: rows }; }; /** * @deprecated */ jsPDF.API.autoTableEndPosY = function () { console.error("Use of deprecated function: autoTableEndPosY. Use doc.previousAutoTable.finalY instead."); var prev = this.previousAutoTable; if (prev.cursor && typeof prev.cursor.y === 'number') { return prev.cursor.y; } else { return 0; } }; /** * @deprecated */ jsPDF.API.autoTableAddPageContent = function (hook) { console.error("Use of deprecated function: autoTableAddPageContent. Use jsPDF.autoTableSetDefaults({didDrawPage: () => {}}) instead."); if (!jsPDF.API.autoTable.globalDefaults) { jsPDF.API.autoTable.globalDefaults = {}; } jsPDF.API.autoTable.globalDefaults.addPageContent = hook; return this; }; /** * @deprecated */ jsPDF.API.autoTableAddPage = function () { console.error("Use of deprecated function: autoTableAddPage. Use doc.addPage()"); this.addPage(); return this; }; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var config_1 = __webpack_require__(2); var common_1 = __webpack_require__(1); var state_1 = __webpack_require__(0); function drawTable(table) { var settings = table.settings; table.cursor = { x: table.margin('left'), y: settings.startY == null ? table.margin('top') : settings.startY }; var minTableBottomPos = settings.startY + table.margin('bottom') + table.headHeight + table.footHeight; if (settings.pageBreak === 'avoid') { minTableBottomPos += table.height; } if (settings.pageBreak === 'always' || settings.startY != null && settings.startY !== false && minTableBottomPos > state_1.default().pageHeight()) { nextPage(state_1.default().doc); table.cursor.y = table.margin('top'); } table.pageStartX = table.cursor.x; table.pageStartY = table.cursor.y; table.startPageNumber = state_1.default().pageNumber(); common_1.applyUserStyles(); if (settings.showHead === true || settings.showHead === 'firstPage' || settings.showHead === 'everyPage') { table.head.forEach(function (row) { return printRow(row); }); } common_1.applyUserStyles(); table.body.forEach(function (row) { printFullRow(row); }); common_1.applyUserStyles(); if (settings.showFoot === true || settings.showFoot === 'lastPage' || settings.showFoot === 'everyPage') { table.foot.forEach(function (row) { return printRow(row); }); } common_1.addTableBorder(); table.callEndPageHooks(); } exports.drawTable = drawTable; function printFullRow(row) { var remainingRowHeight = 0; var remainingTexts = {}; var table = state_1.default().table; if (!canFitOnPage(row.maxCellHeight)) { if (row.maxCellLineCount <= 1 || (table.settings.rowPageBreak === 'avoid' && !rowHeightGreaterThanMaxTableHeight(row))) { addPage(); } else { // Modify the row to fit the current page and calculate text and height of partial row row.spansMultiplePages = true; var maxCellHeight = 0; var maxRowSpanCellHeight = 0; for (var j = 0; j < table.columns.length; j++) { var column = table.columns[j]; var cell = row.cells[column.dataKey]; if (!cell) { continue; } var fontHeight = cell.styles.fontSize / state_1.default().scaleFactor() * config_1.FONT_ROW_RATIO; var vPadding = cell.padding('vertical'); var pageHeight = state_1.default().pageHeight(); var remainingPageSpace = pageHeight - table.cursor.y - table.margin('bottom'); var remainingLineCount = Math.floor((remainingPageSpace - vPadding) / fontHeight); if (Array.isArray(cell.text) && cell.text.length > remainingLineCount) { var remainingLines = cell.text.splice(remainingLineCount, cell.text.length); remainingTexts[column.dataKey] = remainingLines; var cellHeight = cell.text.length * fontHeight + vPadding; if (cellHeight > maxCellHeight) { maxCellHeight = cellHeight; } var rCellHeight = remainingLines.length * fontHeight + vPadding; if (rCellHeight > remainingRowHeight) { remainingRowHeight = rCellHeight; } } } for (var j = 0; j < table.columns.length; j++) { var column = table.columns[j]; var cell = row.cells[column.dataKey]; cell.height = maxCellHeight; } // Reset row height since text are now removed row.height = maxCellHeight; row.maxCellHeight = maxRowSpanCellHeight; } } printRow(row); // Parts of the row is now printed. Time for adding a new page, prune // the text and start over if (Object.keys(remainingTexts).length > 0) { for (var j = 0; j < table.columns.length; j++) { var col = table.columns[j]; var cell = row.cells[col.dataKey]; cell.height = remainingRowHeight; if (cell) { cell.text = remainingTexts[col.dataKey] || ''; } } addPage(); row.pageNumber++; row.height = remainingRowHeight; printFullRow(row); } } function rowHeightGreaterThanMaxTableHeight(row) { var table = state_1.default().table; var pageHeight = state_1.default().pageHeight(); var maxTableHeight = pageHeight - table.margin('top') - table.margin('bottom'); return row.maxCellHeight > maxTableHeight; } function printRow(row) { var table = state_1.default().table; table.cursor.x = table.margin('left'); row.y = table.cursor.y; row.x = table.cursor.x; // For backwards compatibility reset those after addingRow event table.cursor.x = table.margin('left'); row.y = table.cursor.y; row.x = table.cursor.x; for (var _i = 0, _a = table.columns; _i < _a.length; _i++) { var column = _a[_i]; var cell = row.cells[column.dataKey]; if (!cell) { table.cursor.x += column.width; continue; } common_1.applyStyles(cell.styles); cell.x = table.cursor.x; cell.y = row.y; if (cell.styles.valign === 'top') { cell.textPos.y = table.cursor.y + cell.padding('top'); } else if (cell.styles.valign === 'bottom') { cell.textPos.y = table.cursor.y + cell.height - cell.padding('bottom'); } else { cell.textPos.y = table.cursor.y + cell.height / 2; } if (cell.styles.halign === 'right') { cell.textPos.x = cell.x + cell.width - cell.padding('right'); } else if (cell.styles.halign === 'center') { cell.textPos.x = cell.x + cell.width / 2; } else { cell.textPos.x = cell.x + cell.padding('left'); } if (table.callCellHooks(table.cellHooks.willDrawCell, cell, row, column) === false) { table.cursor.x += column.width; continue; } var fillStyle = common_1.getFillStyle(cell.styles); if (fillStyle) { state_1.default().doc.rect(cell.x, table.cursor.y, cell.width, cell.height, fillStyle); } state_1.default().doc.autoTableText(cell.text, cell.textPos.x, cell.textPos.y, { halign: cell.styles.halign, valign: cell.styles.valign, maxWidth: cell.width - cell.padding('left') - cell.padding('right') }); table.callCellHooks(table.cellHooks.didDrawCell, cell, row, column); table.cursor.x += column.width; } table.cursor.y += row.height; } function canFitOnPage(rowHeight) { var table = state_1.default().table; var bottomContentHeight = table.margin('bottom'); var showFoot = table.settings.showFoot; if (showFoot === true || showFoot === 'everyPage' || showFoot === 'lastPage') { bottomContentHeight += table.footHeight; } var pos = rowHeight + table.cursor.y + bottomContentHeight; return pos < state_1.default().pageHeight(); } function addPage() { var table = state_1.default().table; common_1.applyUserStyles(); if (table.settings.showFoot === true || table.settings.showFoot === 'everyPage') { table.foot.forEach(function (row) { return printRow(row); }); } table.finalY = table.cursor.y; // Add user content just before adding new page ensure it will // be drawn above other things on the page table.callEndPageHooks(); common_1.addTableBorder(); nextPage(state_1.default().doc); table.pageNumber++; table.cursor = { x: table.margin('left'), y: table.margin('top') }; table.pageStartX = table.cursor.x; table.pageStartY = table.cursor.y; if (table.settings.showHead === true || table.settings.showHead === 'everyPage') { table.head.forEach(function (row) { return printRow(row); }); } } exports.addPage = addPage; function nextPage(doc) { var current = state_1.default().pageNumber(); doc.setPage(current + 1); var newCurrent = state_1.default().pageNumber(); if (newCurrent === current) { doc.addPage(); } } /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var config_1 = __webpack_require__(2); var common_1 = __webpack_require__(1); var state_1 = __webpack_require__(0); /** * Calculate the column widths */ function calculateWidths(table) { // TODO Fix those cases var columnMinWidth = 10 / state_1.default().scaleFactor(); if (columnMinWidth * table.columns.length > table.width) { console.error('Columns could not fit on page'); } else if (table.minWidth > table.width) { console.error("Column widths to wide and can't fit page"); } var copy = table.columns.slice(0); var diffWidth = table.width - table.wrappedWidth; distributeWidth(copy, diffWidth, table.wrappedWidth); applyColSpans(table); fitContent(table); applyRowSpans(table); } exports.calculateWidths = calculateWidths; function applyRowSpans(table) { var rowSpanCells = {}; var colRowSpansLeft = 1; var all = table.allRows(); for (var rowIndex = 0; rowIndex < all.length; rowIndex++) { var row = all[rowIndex]; for (var _i = 0, _a = table.columns; _i < _a.length; _i++) { var column = _a[_i]; var data = rowSpanCells[column.dataKey]; if (colRowSpansLeft > 1) { colRowSpansLeft--; delete row.cells[column.dataKey]; } else if (data) { data.cell.height += row.height; if (data.cell.height > row.maxCellHeight) { data.row.maxCellHeight = data.cell.height; data.row.maxCellLineCount = Array.isArray(data.cell.text) ? data.cell.text.length : 1; } colRowSpansLeft = data.cell.colSpan; delete row.cells[column.dataKey]; data.left--; if (data.left <= 1) { delete rowSpanCells[column.dataKey]; } } else { var cell = row.cells[column.dataKey]; if (!cell) { continue; } cell.height = row.height; if (cell.rowSpan > 1) { var remaining = all.length - rowIndex; var left = cell.rowSpan > remaining ? remaining : cell.rowSpan; rowSpanCells[column.dataKey] = { cell: cell, left: left, row: row }; } } } if (row.section === 'head') { table.headHeight += row.maxCellHeight; } if (row.section === 'foot') { table.footHeight += row.maxCellHeight; } table.height += row.height; } } function applyColSpans(table) { var all = table.allRows(); for (var rowIndex = 0; rowIndex < all.length; rowIndex++) { var row = all[rowIndex]; var colSpanCell = null; var combinedColSpanWidth = 0; var colSpansLeft = 0; for (var columnIndex = 0; columnIndex < table.columns.length; columnIndex++) { var column = table.columns[columnIndex]; var cell = null; // Width and colspan colSpansLeft -= 1; if (colSpansLeft > 1 && table.columns[columnIndex + 1]) { combinedColSpanWidth += column.width; delete row.cells[column.dataKey]; continue; } else if (colSpanCell) { cell = colSpanCell; delete row.cells[column.dataKey]; colSpanCell = null; } else { cell = row.cells[column.dataKey]; if (!cell) continue; colSpansLeft = cell.colSpan; combinedColSpanWidth = 0; if (cell.colSpan > 1) { colSpanCell = cell; combinedColSpanWidth += column.width; continue; } } cell.width = column.width + combinedColSpanWidth; } } } function fitContent(table) { for (var _i = 0, _a = table.allRows(); _i < _a.length; _i++) { var row = _a[_i]; for (var _b = 0, _c = table.columns; _b < _c.length; _b++) { var column = _c[_b]; var cell = row.cells[column.dataKey]; if (!cell) continue; common_1.applyStyles(cell.styles); var textSpace = cell.width - cell.padding('horizontal'); if (cell.styles.overflow === 'linebreak') { cell.text = Array.isArray(cell.text) ? cell.text.join(' ') : cell.text; // Add one pt to textSpace to fix rounding error cell.text = state_1.default().doc.splitTextToSize(cell.text, textSpace + 1 / (state_1.default().scaleFactor() || 1), { fontSize: cell.styles.fontSize }); } else if (cell.styles.overflow === 'ellipsize') { cell.text = common_1.ellipsize(cell.text, textSpace, cell.styles); } else if (cell.styles.overflow === 'hidden') { cell.text = common_1.ellipsize(cell.text, textSpace, cell.styles, ''); } else if (typeof cell.styles.overflow === 'function') { cell.text = cell.styles.overflow(cell.text, textSpace); } var lineCount = Array.isArray(cell.text) ? cell.text.length : 1; lineCount = cell.rowSpan <= 1 ? lineCount : 1; var fontHeight = cell.styles.fontSize / state_1.default().scaleFactor() * config_1.FONT_ROW_RATIO; cell.contentHeight = lineCount * fontHeight + cell.padding('vertical'); if (cell.styles.minCellHeight > cell.contentHeight) { cell.contentHeight = cell.styles.minCellHeight; } if (cell.contentHeight > row.height) { row.height = cell.contentHeight; row.maxCellHeight = cell.contentHeight; row.maxCellLineCount = lineCount; } } } } function distributeWidth(autoColumns, diffWidth, wrappedAutoColumnsWidth) { for (var i = 0; i < autoColumns.length; i++) { var column = autoColumns[i]; var ratio = column.wrappedWidth / wrappedAutoColumnsWidth; var suggestedChange = diffWidth * ratio; var suggestedWidth = column.wrappedWidth + suggestedChange; if (suggestedWidth >= column.minWidth) { column.width = suggestedWidth; } else { // We can't reduce the width of this column. Mark as none auto column and start over // Add 1 to minWidth as linebreaks calc otherwise sometimes made two rows column.width = column.minWidth + 1 / state_1.default().scaleFactor(); wrappedAutoColumnsWidth -= column.wrappedWidth; autoColumns.splice(i, 1); distributeWidth(autoColumns, diffWidth, wrappedAutoColumnsWidth); break; } } } /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); var models_1 = __webpack_require__(9); var config_1 = __webpack_require__(2); var htmlParser_1 = __webpack_require__(12); var polyfills_1 = __webpack_require__(3); var common_1 = __webpack_require__(1); var state_1 = __webpack_require__(0); var inputValidator_1 = __webpack_require__(14); /** * Create models from the user input */ function parseInput(args) { var tableOptions = parseUserArguments(args); var globalOptions = state_1.getGlobalOptions(); var documentOptions = state_1.getDocumentOptions(); var allOptions = [globalOptions, documentOptions, tableOptions]; inputValidator_1.default(allOptions); var table = new models_1.Table(); state_1.default().table = table; table.id = tableOptions.tableId; var doc = state_1.default().doc; table.userStyles = { // Setting to black for versions of jspdf without getTextColor textColor: doc.getTextColor ? doc.getTextColor() : 0, fontSize: doc.internal.getFontSize(), fontStyle: doc.internal.getFont().fontStyle, font: doc.internal.getFont().fontName }; var _loop_1 = function (styleProp) { var styles = allOptions.map(function (opts) { return opts[styleProp] || {}; }); table.styles[styleProp] = polyfills_1.assign.apply(void 0, [{}].concat(styles)); }; // Merge styles one level deeper for (var _i = 0, _a = Object.keys(table.styles); _i < _a.length; _i++) { var styleProp = _a[_i]; _loop_1(styleProp); } // Append hooks for (var _b = 0, allOptions_1 = allOptions; _b < allOptions_1.length; _b++) { var opts = allOptions_1[_b]; for (var _c = 0, _d = Object.keys(table.cellHooks); _c < _d.length; _c++) { var hookName = _d[_c]; if (opts && typeof opts[hookName] === 'function') { table.cellHooks[hookName].push(opts[hookName]); delete opts[hookName]; } } } table.settings = polyfills_1.assign.apply(void 0, [{}, config_1.defaultConfig()].concat(allOptions)); table.settings.margin = common_1.marginOrPadding(table.settings.margin, config_1.defaultConfig().margin); if (table.settings.theme === 'auto') { table.settings.theme = table.settings.useCss ? 'plain' : 'striped'; } if (table.settings.startY === false) { delete table.settings.startY; } var previous = state_1.default().doc.previousAutoTable; var isSamePageAsPrevious = previous && previous.startPageNumber + previous.pageNumber - 1 === state_1.default().pageNumber(); if (table.settings.startY == null && isSamePageAsPrevious) { table.settings.startY = previous.finalY + 20 / state_1.default().scaleFactor(); } var htmlContent = {}; if (table.settings.html) { htmlContent = htmlParser_1.parseHtml(table.settings.html, table.settings.includeHiddenHtml, table.settings.useCss) || {}; } table.settings.head = htmlContent.head || table.settings.head || []; table.settings.body = htmlContent.body || table.settings.body || []; table.settings.foot = htmlContent.foot || table.settings.foot || []; parseContent(table); table.minWidth = table.columns.reduce(function (total, col) { return (total + col.minWidth); }, 0); table.wrappedWidth = table.columns.reduce(function (total, col) { return (total + col.wrappedWidth); }, 0); if (typeof table.settings.tableWidth === 'number') { table.width = table.settings.tableWidth; } else if (table.settings.tableWidth === 'wrap') { table.width = table.wrappedWidth; } else { table.width = state_1.default().pageWidth() - table.margin('left') - table.margin('right'); } return table; } exports.parseInput = parseInput; function parseUserArguments(args) { // Normal initialization on format doc.autoTable(options) if (args.length === 1) { return args[0]; } else { // Deprecated initialization on format doc.autoTable(columns, body, [options]) var opts = args[2] || {}; opts.body = args[1]; opts.columns = args[0]; // Support v2 title prop in v3 opts.columns.forEach(function (col) { if (col.header == null) { col.header = col.title; } }); return opts; } } function parseContent(table) { var settings = table.settings; table.columns = getTableColumns(settings); var _loop_2 = function (sectionName) { var rowSpansLeftForColumn = {}; var sectionRows = settings[sectionName]; if (sectionRows.length === 0 && settings.columns) { var sectionRow_1 = {}; table.columns .forEach(function (col) { var columnData = col.raw; if (sectionName === 'head') { var val = typeof columnData === 'object' ? columnData.header : columnData; if (val) { sectionRow_1[col.dataKey] = val; } } else if (sectionName === 'foot' && columnData.footer) { sectionRow_1[col.dataKey] = columnData.footer; } }); if (Object.keys(sectionRow_1).length) { sectionRows.push(sectionRow_1); } } sectionRows.forEach(function (rawRow, rowIndex) { var row = new models_1.Row(rawRow, rowIndex, sectionName); table[sectionName].push(row); var colSpansAdded = 0; var columnSpansLeft = 0; for (var _i = 0, _a = table.columns; _i < _a.length; _i++) { var column = _a[_i]; if (rowSpansLeftForColumn[column.dataKey] == null || rowSpansLeftForColumn[column.dataKey].left === 0) { if (columnSpansLeft === 0) { var rawCell = void 0; if (Array.isArray(rawRow)) { rawCell = rawRow[column.dataKey - colSpansAdded]; } else { rawCell = rawRow[column.dataKey]; } var styles = cellStyles(sectionName, column.dataKey, rowIndex); var cell = new models_1.Cell(rawCell, styles, sectionName); row.cells[column.dataKey] = cell; table.callCellHooks(table.cellHooks.didParseCell, cell, row, column); columnSpansLeft = cell.colSpan - 1; rowSpansLeftForColumn[column.dataKey] = { left: cell.rowSpan - 1, times: columnSpansLeft }; } else { columnSpansLeft--; colSpansAdded++; } } else { rowSpansLeftForColumn[column.dataKey].left--; columnSpansLeft = rowSpansLeftForColumn[column.dataKey].times; } } }); }; for (var _i = 0, _a = ['head', 'body', 'foot']; _i < _a.length; _i++) { var sectionName = _a[_i]; _loop_2(sectionName); } table.allRows().forEach(function (row) { for (var _i = 0, _a = table.columns; _i < _a.length; _i++) { var column = _a[_i]; var cell = row.cells[column.dataKey]; // Kind of make sense to not consider width of cells with colspan columns // Consider this in a future release however if (cell && cell.colSpan === 1) { if (cell.wrappedWidth > column.wrappedWidth) { column.wrappedWidth = cell.wrappedWidth; } if (cell.minWidth > column.minWidth) { column.minWidth = cell.minWidth; } } } }); } function getTableColumns(settings) { if (settings.columns) { return settings.columns.map(function (input, index) { var key = input.dataKey || input.key || index; var raw = input != null ? input : index; return new models_1.Column(key, raw, index); }); } else { var merged = __assign({}, settings.head[0], settings.body[0], settings.foot[0]); delete merged._element; var dataKeys = Object.keys(merged); return dataKeys.map(function (key) { return new models_1.Column(key, key, key); }); } } function cellStyles(sectionName, dataKey, rowIndex) { var table = state_1.default().table; var theme = config_1.getTheme(table.settings.theme); var otherStyles = [theme.table, theme[sectionName], table.styles.styles, table.styles[sectionName + "Styles"]]; var colStyles = sectionName === 'body' ? table.styles.columnStyles[dataKey] || {} : {}; var rowStyles = sectionName === 'body' && rowIndex % 2 === 0 ? polyfills_1.assign({}, theme.alternateRow, table.styles.alternateRowStyles) : {}; return polyfills_1.assign.apply(void 0, [config_1.defaultStyles()].concat(otherStyles.concat([rowStyles, colStyles]))); } /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var config_1 = __webpack_require__(2); var state_1 = __webpack_require__(0); var HookData_1 = __webpack_require__(10); var common_1 = __webpack_require__(1); var assign = __webpack_require__(11); var CellHooks = /** @class */ (function () { function CellHooks() { this.willParseCell = []; this.didParseCell = []; this.willDrawCell = []; this.didDrawCell = []; this.didDrawPage = []; } return CellHooks; }()); var Table = /** @class */ (function () { function Table() { this.columns = []; this.head = []; this.body = []; this.foot = []; this.height = 0; this.width = 0; this.preferredWidth = 0; this.wrappedWidth = 0; this.minWidth = 0; this.headHeight = 0; this.footHeight = 0; this.startPageNumber = 1; this.pageNumber = 1; this.styles = { styles: {}, headStyles: {}, bodyStyles: {}, footStyles: {}, alternateRowStyles: {}, columnStyles: {}, }; this.cellHooks = new CellHooks(); } Object.defineProperty(Table.prototype, "pageCount", { get: function () { return this.pageNumber; }, enumerable: true, configurable: true }); Table.prototype.allRows = function () { return this.head.concat(this.body).concat(this.foot); }; Table.prototype.callCellHooks = function (handlers, cell, row, column) { for (var _i = 0, handlers_1 = handlers; _i < handlers_1.length; _i++) { var handler = handlers_1[_i]; if (handler(new HookData_1.CellHookData(cell, row, column)) === false) { return false; } } return true; }; Table.prototype.callEndPageHooks = function () { common_1.applyUserStyles(); for (var _i = 0, _a = this.cellHooks.didDrawPage; _i < _a.length; _i++) { var handler = _a[_i]; handler(new HookData_1.HookData()); } }; Table.prototype.margin = function (side) { return common_1.marginOrPadding(this.settings.margin, config_1.defaultConfig().margin)[side]; }; return Table; }()); exports.Table = Table; var Row = /** @class */ (function () { function Row(raw, index, section) { this.cells = {}; this.height = 0; this.maxCellLineCount = 1; this.maxCellHeight = 0; this.pageNumber = 1; this.spansMultiplePages = false; this.raw = raw; if (raw._element) { this.raw = raw._element; } this.index = index; this.section = section; } Object.defineProperty(Row.prototype, "pageCount", { get: function () { return this.pageNumber; }, enumerable: true, configurable: true }); return Row; }()); exports.Row = Row; var Cell = /** @class */ (function () { function Cell(raw, themeStyles, section) { this.contentWidth = 0; this.wrappedWidth = 0; this.minWidth = 0; this.textPos = {}; this.height = 0; this.width = 0; this.rowSpan = raw && raw.rowSpan || 1; this.colSpan = raw && raw.colSpan || 1; this.styles = assign(themeStyles, raw && raw.styles || {}); this.section = section; var text = ''; var content = raw && typeof raw.content !== 'undefined' ? raw.content : raw; content = content != undefined && content.dataKey != undefined ? content.title : content; var fromHtml = typeof window === 'object' && window.HTMLElement && content instanceof window.HTMLElement; this.raw = fromHtml ? content : raw; if (content && fromHtml) { text = (content.innerText || '').replace(/\s+/g, ' ').trim(); } else { // Stringify 0 and false, but not undefined or null text = content != undefined ? '' + content : ''; } var splitRegex = /\r\n|\r|\n/g; this.text = text.split(splitRegex); this.contentWidth = this.padding('horizontal') + common_1.getStringWidth(this.text, this.styles); if (typeof this.styles.cellWidth === 'number') { this.minWidth = this.styles.cellWidth; this.wrappedWidth = this.styles.cellWidth;