From cfc8286d354f5bf3b9a4c814ea5a9d78051538fa Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 14 Aug 2019 10:53:03 +0100 Subject: [PATCH] fix some table and link issues (but not all) --- node-red-ui-node-table/README.md | 1 - .../examples/2 Richer table.json | 115 +- node-red-ui-node-table/lib/js/tabulator.js | 1841 +++++++++++++---- .../locales/en-US/node.html | 1 - node-red-ui-node-table/node.html | 3 +- node-red-ui-node-table/node.js | 7 +- node-red-ui-node-table/package.json | 2 +- node-red-ui-node-table/screenshot2.png | Bin 56588 -> 58170 bytes 8 files changed, 1586 insertions(+), 384 deletions(-) diff --git a/node-red-ui-node-table/README.md b/node-red-ui-node-table/README.md index ef00048..2ae322f 100644 --- a/node-red-ui-node-table/README.md +++ b/node-red-ui-node-table/README.md @@ -41,7 +41,6 @@ The columns can be configured manually. If so then only the `msg.payload` proper - **Color** - HTML color name, or hex value (#rrggbb) to fill the cell. - **Tick/Cross** - Tick or Cross symbol, boolean true/false, numeric 1/0 or text "1"/"0". - **Stars** - Number of stars - numeric 0 to 5. - - **Date/Time** - **Row Number** - Current row number. diff --git a/node-red-ui-node-table/examples/2 Richer table.json b/node-red-ui-node-table/examples/2 Richer table.json index 2eb4f09..ca8bbd6 100644 --- a/node-red-ui-node-table/examples/2 Richer table.json +++ b/node-red-ui-node-table/examples/2 Richer table.json @@ -1,74 +1,129 @@ [ { - "id": "89c6c6ff.3b8c08", + "id": "b7dff285.69049", + "type": "inject", + "z": "bb6af731.9866a8", + "name": "", + "topic": "", + "payload": "[{\"Name\":\"Yokoi\",\"Age\":\"30\",\"Color\":\"lime\",\"Prog\":70,\"Star\":\"3\"},{\"Name\":\"DCJ\",\"Age\":\"50\",\"Color\":\"dodgerblue\",\"Prog\":\"45\",\"Star\":2,\"Pass\":false,\"web\":\"\"},{\"Name\":\"Nick\",\"Age\":\"40\",\"Color\":\"darkred\",\"Prog\":95,\"Star\":\"5\",\"Pass\":true,\"web\":\"http://nodered.org\"},{\"Name\":\"Oli\"}]", + "payloadType": "json", + "repeat": "", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "x": 210, + "y": 580, + "wires": [ + [ + "7d48e13.90ee22" + ] + ] + }, + { + "id": "cb53cb76.5fd0d8", + "type": "inject", + "z": "bb6af731.9866a8", + "name": "", + "topic": "", + "payload": "[{\"Name\":\"Yokoi\",\"Age\":\"30\",\"Color\":\"lime\",\"Prog\":20,\"Star\":\"1\"},{\"Name\":\"DCJ\",\"Age\":\"50\",\"Color\":\"dodgerblue\",\"Prog\":\"80\",\"Star\":4,\"Pass\":true,\"web\":\"\"},{\"Name\":\"Nick\",\"Age\":\"40\",\"Color\":\"red\",\"Prog\":90,\"Star\":\"5\",\"Pass\":true,\"web\":\"http://nodered.org\"},{\"Name\":\"Oli\"}]", + "payloadType": "json", + "repeat": "", + "crontab": "", + "once": false, + "onceDelay": 0.1, + "x": 210, + "y": 620, + "wires": [ + [ + "7d48e13.90ee22" + ] + ] + }, + { + "id": "7d48e13.90ee22", "type": "ui_table", "z": "bb6af731.9866a8", "group": "571a38b1.5e3638", "name": "People", "order": 1, - "width": 0, - "height": 0, + "width": "8", + "height": "3", "columns": [ { "field": "Name", "title": "Who", "width": "", "align": "left", - "formatter": "html" + "formatter": "html", + "formatterParams": { + "target": "_blank" + } }, { "field": "Age", "title": "Age", - "width": "75", + "width": "40", "align": "center", - "formatter": "plaintext" + "formatter": "plaintext", + "formatterParams": { + "target": "_blank" + } }, { "field": "Color", "title": "", "width": "5%", "align": "left", - "formatter": "color" + "formatter": "color", + "formatterParams": { + "target": "_blank" + } }, { - "field": "Prog", + "field": "Star", "title": "%", "width": "100", "align": "left", - "formatter": "star" + "formatter": "star", + "formatterParams": { + "target": "_blank" + } }, { "field": "Pass", "title": "", "width": "5%", "align": "center", - "formatter": "tickCross" + "formatter": "tickCross", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "Prog", + "title": "", + "width": "80", + "align": "left", + "formatter": "progress", + "formatterParams": { + "target": "_blank" + } + }, + { + "field": "web", + "title": "URL", + "width": "", + "align": "left", + "formatter": "link", + "formatterParams": { + "target": "_blank" + } } ], "x": 420, "y": 580, "wires": [] }, - { - "id": "b7dff285.69049", - "type": "inject", - "z": "bb6af731.9866a8", - "name": "", - "topic": "", - "payload": "[{\"Name\":\"Yokoi\",\"Age\":\"30\",\"Color\":\"lime\",\"Prog\":\"3\",\"Pass\":true},{\"Name\":\"DCJ\",\"Age\":\"50\",\"Color\":\"dodgerblue\",\"Prog\":\"2\",\"Pass\":false},{\"Name\":\"Nick\",\"Age\":\"40\",\"Color\":\"darkred\",\"Prog\":\"5\",\"Pass\":true}]", - "payloadType": "json", - "repeat": "", - "crontab": "", - "once": false, - "onceDelay": 0.1, - "x": 210, - "y": 580, - "wires": [ - [ - "89c6c6ff.3b8c08" - ] - ] - }, { "id": "571a38b1.5e3638", "type": "ui_group", diff --git a/node-red-ui-node-table/lib/js/tabulator.js b/node-red-ui-node-table/lib/js/tabulator.js index 4d57db3..c6e6e0d 100755 --- a/node-red-ui-node-table/lib/js/tabulator.js +++ b/node-red-ui-node-table/lib/js/tabulator.js @@ -1,6 +1,6 @@ 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.2.5 (c) Oliver Folkerd */ +/* Tabulator v4.4.1 (c) Oliver Folkerd */ ;(function (global, factory) { if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined') { @@ -223,6 +223,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol el.classList.add("tabulator-header"); + if (!this.table.options.headerVisible) { + + el.classList.add("tabulator-header-hidden"); + } + return el; }; @@ -233,13 +238,20 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //scroll body along with header - self.element.addEventListener("scroll", function (e) { + // self.element.addEventListener("scroll", function(e){ - if (!self.blockHozScrollEvent) { - self.table.rowManager.scrollHorizontal(self.element.scrollLeft); - } - }); + // if(!self.blockHozScrollEvent){ + + + // self.table.rowManager.scrollHorizontal(self.element.scrollLeft); + + + // } + + + // }); + }; //link to row manager @@ -266,15 +278,17 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return this.headersElement; }; - ColumnManager.prototype.tempScrollBlock = function () { - var _this = this; + // ColumnManager.prototype.tempScrollBlock = function(){ - clearTimeout(this.blockHozScrollEvent); - this.blockHozScrollEvent = setTimeout(function () { - _this.blockHozScrollEvent = false; - }, 50); - }; + // clearTimeout(this.blockHozScrollEvent); + + + // this.blockHozScrollEvent = setTimeout(() => {this.blockHozScrollEvent = false;}, 50); + + + // } + //scroll horizontally to match table body @@ -284,7 +298,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var hozAdjust = 0, scrollWidth = this.element.scrollWidth - this.table.element.clientWidth; - this.tempScrollBlock(); + // this.tempScrollBlock(); + this.element.scrollLeft = left; @@ -311,7 +326,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (this.table.modExists("frozenColumns")) { - this.table.modules.frozenColumns.layout(); + this.table.modules.frozenColumns.scrollHorizontal(); } }; @@ -338,9 +353,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; - var _value = row[key]; + var value = row[key]; - switch (typeof _value === 'undefined' ? 'undefined' : _typeof(_value)) { + switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) { case "undefined": @@ -356,7 +371,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol case "object": - if (Array.isArray(_value)) { + if (Array.isArray(value)) { sorter = "array"; } else { @@ -368,12 +383,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol default: - if (!isNaN(_value) && _value !== "") { + if (!isNaN(value) && value !== "") { sorter = "number"; } else { - if (_value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)) { + if (value.match(/((^[0-9]+[a-z]+)|(^[a-z]+[0-9]+))+$/i)) { sorter = "alphanum"; } else { @@ -547,7 +562,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return subject._getSelf() || false; - } else if (subject instanceof HTMLElement) { + } else if (typeof HTMLElement !== "undefined" && subject instanceof HTMLElement) { //subject is a HTML element of the column header @@ -693,6 +708,32 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol ColumnManager.prototype.moveColumn = function (from, to, after) { + this.moveColumnActual(from, to, after); + + if (this.table.options.responsiveLayout && this.table.modExists("responsiveLayout", true)) { + + this.table.modules.responsiveLayout.initialize(); + } + + if (this.table.modExists("columnCalcs")) { + + this.table.modules.columnCalcs.recalc(this.table.rowManager.activeRows); + } + + to.element.parentNode.insertBefore(from.element, to.element); + + if (after) { + + to.element.parentNode.insertBefore(to.element, from.element); + } + + this._verticalAlignHeaders(); + + this.table.rowManager.reinitialize(); + }; + + ColumnManager.prototype.moveColumnActual = function (from, to, after) { + this._moveColumnInArray(this.columns, from, to, after); this._moveColumnInArray(this.columnsByIndex, from, to, after, true); @@ -753,7 +794,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; ColumnManager.prototype.scrollToColumn = function (column, position, ifVisible) { - var _this2 = this; + var _this = this; var left = 0, offset = 0, @@ -764,12 +805,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (typeof position === "undefined") { - position = _this2.table.options.scrollToColumnPosition; + position = _this.table.options.scrollToColumnPosition; } if (typeof ifVisible === "undefined") { - ifVisible = _this2.table.options.scrollToColumnIfVisible; + ifVisible = _this.table.options.scrollToColumnIfVisible; } if (column.visible) { @@ -783,13 +824,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol case "center": - adjust = -_this2.element.clientWidth / 2; + adjust = -_this.element.clientWidth / 2; break; case "right": - adjust = colEl.clientWidth - _this2.headersElement.clientWidth; + adjust = colEl.clientWidth - _this.headersElement.clientWidth; break; @@ -802,7 +843,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol offset = colEl.offsetLeft; - if (offset > 0 && offset + colEl.offsetWidth < _this2.element.clientWidth) { + if (offset > 0 && offset + colEl.offsetWidth < _this.element.clientWidth) { return false; } @@ -811,13 +852,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //calculate scroll position - left = colEl.offsetLeft + _this2.element.scrollLeft + adjust; + left = colEl.offsetLeft + _this.element.scrollLeft + adjust; - left = Math.max(Math.min(left, _this2.table.rowManager.element.scrollWidth - _this2.table.rowManager.element.clientWidth), 0); + left = Math.max(Math.min(left, _this.table.rowManager.element.scrollWidth - _this.table.rowManager.element.clientWidth), 0); - _this2.table.rowManager.scrollHorizontal(left); + _this.table.rowManager.scrollHorizontal(left); - _this2.scrollHorizontal(left); + _this.scrollHorizontal(left); resolve(); } else { @@ -1173,14 +1214,31 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } }; + ColumnComponent.prototype.move = function (to, after) { + + var toColumn = this._column.table.columnManager.findColumn(to); + + if (toColumn) { + + this._column.table.columnManager.moveColumn(this._column, toColumn, after); + } else { + + console.warn("Move Error - No matching column found:", toColumn); + } + }; + ColumnComponent.prototype.getNextColumn = function () { - return this._column.nextColumn().getComponent(); + var nextCol = this._column.nextColumn(); + + return nextCol ? nextCol.getComponent() : false; }; ColumnComponent.prototype.getPrevColumn = function () { - return this._column.prevColumn().getComponent(); + var prevCol = this._column.prevColumn(); + + return prevCol ? prevCol.getComponent() : false; }; var Column = function Column(def, parent) { @@ -1212,7 +1270,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.hozAlign = ""; //horizontal text alignment - //multi dimentional filed handling + //multi dimensional filed handling this.field = ""; @@ -1224,6 +1282,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.setField(this.definition.field); + if (this.table.options.invalidOptionWarnings) { + + this.checkDefinition(); + } + this.modules = {}; //hold module variables; @@ -1267,6 +1330,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.visible = true; //default visible state + this._mapDepricatedFunctionality(); + //initialize column if (def.columns) { @@ -1316,6 +1381,18 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return el; }; + Column.prototype.checkDefinition = function () { + var _this2 = this; + + Object.keys(this.definition).forEach(function (key) { + + if (_this2.defaultOptionList.indexOf(key) === -1) { + + console.warn("Invalid column definition option in '" + (_this2.field || _this2.definition.title) + "' column:", key); + } + }); + }; + Column.prototype.setField = function (field) { this.field = field; @@ -1357,6 +1434,16 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } }; + Column.prototype._mapDepricatedFunctionality = function () { + + if (typeof this.definition.hideInHtml !== "undefined") { + + this.definition.htmlOutput = !this.definition.hideInHtml; + + console.warn("hideInHtml column definition property is deprecated, you should now use htmlOutput"); + } + }; + Column.prototype.setTooltip = function () { var self = this, @@ -1523,7 +1610,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.element.addEventListener("touchstart", function (e) { tap = true; - }); + }, { passive: true }); self.element.addEventListener("touchend", function (e) { @@ -1579,7 +1666,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol def.headerTapHold(e, self.getComponent()); }, 1000); - }); + }, { passive: true }); self.element.addEventListener("touchend", function (e) { @@ -1825,11 +1912,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol table.modules.localize.bind("columns|" + def.field, function (text) { - titleElement.value = text || def.title || " "; + titleElement.value = text || def.title || " "; }); } else { - titleElement.value = def.title || " "; + titleElement.value = def.title || " "; } } else { @@ -1837,11 +1924,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol table.modules.localize.bind("columns|" + def.field, function (text) { - self._formatColumnHeaderTitle(titleHolderElement, text || def.title || " "); + self._formatColumnHeaderTitle(titleHolderElement, text || def.title || " "); }); } else { - self._formatColumnHeaderTitle(titleHolderElement, def.title || " "); + self._formatColumnHeaderTitle(titleHolderElement, def.title || " "); } } @@ -1882,10 +1969,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (contents instanceof Node) { - this.element.appendChild(contents); + el.appendChild(contents); } else { - this.element.innerHTML = ""; + el.innerHTML = ""; console.warn("Format Error - Title formatter has returned a type of object, the only valid formatter object return is an instance of Node, the formatter returned:", contents); } @@ -1896,13 +1983,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol case "null": - this.element.innerHTML = ""; + el.innerHTML = ""; break; default: - this.element.innerHTML = contents; + el.innerHTML = contents; } } else { @@ -2449,14 +2536,28 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var index = this.table.columnManager.findColumnIndex(this); - return index > -1 ? this.table.columnManager.getColumnByIndex(index + 1) : false; + return index > -1 ? this._nextVisibleColumn(index + 1) : false; + }; + + Column.prototype._nextVisibleColumn = function (index) { + + var column = this.table.columnManager.getColumnByIndex(index); + + return !column || column.visible ? column : this._nextVisibleColumn(index + 1); }; Column.prototype.prevColumn = function () { var index = this.table.columnManager.findColumnIndex(this); - return index > -1 ? this.table.columnManager.getColumnByIndex(index - 1) : false; + return index > -1 ? this._prevVisibleColumn(index - 1) : false; + }; + + Column.prototype._prevVisibleColumn = function (index) { + + var column = this.table.columnManager.getColumnByIndex(index); + + return !column || column.visible ? column : this._prevVisibleColumn(index - 1); }; Column.prototype.reinitializeWidth = function (force) { @@ -2534,7 +2635,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } }; - Column.prototype.defaultOptionList = ["title", "field", "visible", "align", "width", "minWidth", "widthGrow", "widthShrink", "resizable", "frozen", "responsive", "tooltip", "cssClass", "rowHandle", "hideInHtml", "sorter", "sorterParams", "formatter", "formatterParams", "variableHeight", "editable", "editor", "editorParams", "validator", "mutator", "mutatorParams", "mutatorData", "mutatorDataParams", "mutatorEdit", "mutatorEditParams", "mutatorClipboard", "mutatorClipboardParams", "accessor", "accessorParams", "accessorData", "accessorDataParams", "accessorDownload", "accessorDownloadParams", "accessorClipboard", "accessorClipboardParams", "download", "downloadTitle", "topCalc", "topCalcParams", "topCalcFormatter", "topCalcFormatterParams", "bottomCalc", "bottomCalcParams", "bottomCalcFormatter", "bottomCalcFormatterParams", "cellClick", "cellDblClick", "cellContext", "cellTap", "cellDblTap", "cellTapHold", "cellMouseEnter", "cellMouseLeave", "cellMouseOver", "cellMouseOut", "cellMouseMove", "cellEditing", "cellEdited", "cellEditCancelled", "headerSort", "headerSortStartingDir", "headerSortTristate", "headerClick", "headerDblClick", "headerContext", "headerTap", "headerDblTap", "headerTapHold", "headerTooltip", "headerVertical", "editableTitle", "titleFormatter", "titleFormatterParams", "headerFilter", "headerFilterPlaceholder", "headerFilterParams", "headerFilterEmptyCheck", "headerFilterFunc", "headerFilterFuncParams", "headerFilterLiveFilter"]; + Column.prototype.defaultOptionList = ["title", "field", "columns", "visible", "align", "width", "minWidth", "widthGrow", "widthShrink", "resizable", "frozen", "responsive", "tooltip", "cssClass", "rowHandle", "hideInHtml", "print", "htmlOutput", "sorter", "sorterParams", "formatter", "formatterParams", "variableHeight", "editable", "editor", "editorParams", "validator", "mutator", "mutatorParams", "mutatorData", "mutatorDataParams", "mutatorEdit", "mutatorEditParams", "mutatorClipboard", "mutatorClipboardParams", "accessor", "accessorParams", "accessorData", "accessorDataParams", "accessorDownload", "accessorDownloadParams", "accessorClipboard", "accessorClipboardParams", "clipboard", "download", "downloadTitle", "topCalc", "topCalcParams", "topCalcFormatter", "topCalcFormatterParams", "bottomCalc", "bottomCalcParams", "bottomCalcFormatter", "bottomCalcFormatterParams", "cellClick", "cellDblClick", "cellContext", "cellTap", "cellDblTap", "cellTapHold", "cellMouseEnter", "cellMouseLeave", "cellMouseOver", "cellMouseOut", "cellMouseMove", "cellEditing", "cellEdited", "cellEditCancelled", "headerSort", "headerSortStartingDir", "headerSortTristate", "headerClick", "headerDblClick", "headerContext", "headerTap", "headerDblTap", "headerTapHold", "headerTooltip", "headerVertical", "editableTitle", "titleFormatter", "titleFormatterParams", "headerFilter", "headerFilterPlaceholder", "headerFilterParams", "headerFilterEmptyCheck", "headerFilterFunc", "headerFilterFuncParams", "headerFilterLiveFilter", "print"]; //////////////// Event Bindings ///////////////// @@ -2758,7 +2859,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //subject is public row component return subject._getSelf() || false; - } else if (subject instanceof HTMLElement) { + } else if (typeof HTMLElement !== "undefined" && subject instanceof HTMLElement) { //subject is a HTML element of the row @@ -3472,56 +3573,6 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return output; }; - RowManager.prototype.getHtml = function (active) { - - var data = this.getData(active), - columns = [], - header = "", - body = "", - table = ""; - - //build header row - - this.table.columnManager.getColumns().forEach(function (column) { - - var def = column.getDefinition(); - - if (column.visible && !def.hideInHtml) { - - header += '' + (def.title || "") + ''; - - columns.push(column); - } - }); - - //build body rows - - data.forEach(function (rowData) { - - var row = ""; - - columns.forEach(function (column) { - - var value = column.getFieldValue(rowData); - - if (typeof value === "undefined" || value === null) { - - value = ":"; - } - - row += '' + value + ''; - }); - - body += '' + row + ''; - }); - - //build table - - table = '\n\n\t\t\t\n\n\t\t\t' + header + '\n\n\t\t\t\n\n\t\t\t' + body + '\n\n\t\t\t
'; - - return table; - }; - RowManager.prototype.getComponents = function (active) { var self = this, @@ -3539,7 +3590,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol RowManager.prototype.getDataCount = function (active) { - return active ? this.rows.length : this.activeRows.length; + return active ? this.activeRows.length : this.rows.length; }; RowManager.prototype._genRemoteRequest = function () { @@ -3943,6 +3994,54 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } }; + RowManager.prototype.getVisibleRows = function (viewable) { + + var topEdge = this.element.scrollTop, + bottomEdge = this.element.clientHeight + topEdge, + topFound = false, + topRow = 0, + bottomRow = 0, + rows = this.getDisplayRows(); + + if (viewable) { + + this.getDisplayRows(); + + for (var i = this.vDomTop; i <= this.vDomBottom; i++) { + + if (rows[i]) { + + if (!topFound) { + + if (topEdge - rows[i].getElement().offsetTop >= 0) { + + topRow = i; + } else { + + topFound = true; + } + } else { + + if (bottomEdge - rows[i].getElement().offsetTop >= 0) { + + bottomRow = i; + } else { + + break; + } + } + } + } + } else { + + topRow = this.vDomTop; + + bottomRow = this.vDomBottom; + } + + return rows.slice(topRow, bottomRow + 1); + }; + //repeat action accross display rows RowManager.prototype.displayRowIterator = function (callback) { @@ -4670,13 +4769,15 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.adjustTableSize(); + this.table.tableWidth = this.table.element.clientWidth; + if (!force) { - if (self.renderMode == "classic") { + if (this.renderMode == "classic") { - if (self.table.options.groupBy) { + if (this.table.options.groupBy) { - self.refreshActiveData("group", false, false); + this.refreshActiveData("group", false, false); } else { this._simpleRender(); @@ -5074,7 +5175,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.element.addEventListener("touchstart", function (e) { tap = true; - }); + }, { passive: true }); self.element.addEventListener("touchend", function (e) { @@ -5130,7 +5231,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.table.options.rowTapHold(e, self.getComponent()); }, 1000); - }); + }, { passive: true }); self.element.addEventListener("touchend", function (e) { @@ -5963,6 +6064,31 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.table.options.cellDblClick.call(self.table, e, component); } }); + } else { + + element.addEventListener("dblclick", function (e) { + + e.preventDefault(); + + if (document.selection) { + // IE + + var range = document.body.createTextRange(); + + range.moveToElementText(self.element); + + range.select(); + } else if (window.getSelection) { + + var range = document.createRange(); + + range.selectNode(self.element); + + window.getSelection().removeAllRanges(); + + window.getSelection().addRange(range); + } + }); } if (cellEvents.cellContext || this.table.options.cellContext) { @@ -6095,7 +6221,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol element.addEventListener("touchstart", function (e) { tap = true; - }); + }, { passive: true }); element.addEventListener("touchend", function (e) { @@ -6181,7 +6307,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.table.options.cellTapHold.call(self.table, e, component); } }, 1000); - }); + }, { passive: true }); element.addEventListener("touchend", function (e) { @@ -6355,7 +6481,15 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (this.table.options.groupBy && this.table.modExists("groupRows")) { - this.table.modules.columnCalcs.recalcRowGroup(this.row); + if (this.table.options.columnCalcs == "table" || this.table.options.columnCalcs == "both") { + + this.table.modules.columnCalcs.recalc(this.table.rowManager.activeRows); + } + + if (this.table.options.columnCalcs != "table") { + + this.table.modules.columnCalcs.recalcRowGroup(this.row); + } } else { this.table.modules.columnCalcs.recalc(this.table.rowManager.activeRows); @@ -6847,6 +6981,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol sortOrderReverse: false, //reverse internal sort ordering + headerSort: true, //set default global header sort + + headerSortTristate: false, //set default tristate header sorting + + footerElement: false, //hold footer element @@ -6856,6 +6995,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol keybindings: [], //array for keybindings + tabEndNewRow: false, //create new row when tab to end of table + + + invalidOptionWarnings: true, //allow toggling of invalid option warnings + + clipboard: false, //enable clipboard clipboardCopyStyled: true, //formatted table data @@ -6910,6 +7055,21 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol dataTreeRowCollapsed: function dataTreeRowCollapsed() {}, //row has been collapsed + printAsHtml: false, //enable print as html + + printFormatter: false, //printing page formatter + + printHeader: false, //page header contents + + printFooter: false, //page footer contents + + printCopyStyle: true, //enable print as html styling + + printVisibleRows: true, //restrict print to visible rows only + + printConfig: {}, //print config options + + addRowPos: "bottom", //position to insert blank rows, top|bottom @@ -6929,6 +7089,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol headerFilterPlaceholder: false, //placeholder text to display in header filters + headerVisible: true, //hide header + + history: false, //enable edit history @@ -7016,6 +7179,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol groupHeader: false, //header generation function + htmlOutputConfig: false, //html outypu config + + movableColumns: false, //enable movable columns @@ -7231,6 +7397,21 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol Tabulator.prototype.initializeOptions = function (options) { + //warn user if option is not available + + if (options.invalidOptionWarnings !== false) { + + for (var key in options) { + + if (typeof this.defaultOptions[key] === "undefined") { + + console.warn("Invalid table constructor option:", key); + } + } + } + + //assign options to table + for (var key in this.defaultOptions) { if (key in options) { @@ -7254,7 +7435,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol Tabulator.prototype.initializeElement = function (element) { - if (element instanceof HTMLElement) { + if (typeof HTMLElement !== "undefined" && element instanceof HTMLElement) { this.element = element; @@ -7284,6 +7465,30 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol Tabulator.prototype._mapDepricatedFunctionality = function () {}; + Tabulator.prototype._clearSelection = function () { + + this.element.classList.add("tabulator-block-select"); + + if (window.getSelection) { + + if (window.getSelection().empty) { + // Chrome + + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { + // Firefox + + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { + // IE? + + document.selection.empty(); + } + + this.element.classList.remove("tabulator-block-select"); + }; + //concreate table Tabulator.prototype._create = function () { @@ -7540,6 +7745,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol mod.clipboard.initialize(); } + if (options.printAsHtml && this.modExists("print")) { + + mod.print.initialize(); + } + options.tableBuilt.call(this); }; @@ -7858,9 +8068,22 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //get table html - Tabulator.prototype.getHtml = function (active) { + Tabulator.prototype.getHtml = function (visible, style, config) { + + if (this.modExists("htmlTableExport", true)) { + + return this.modules.htmlTableExport.getHtml(visible, style, config); + } + }; + + //get print html + + Tabulator.prototype.print = function (visible, style, config) { + + if (this.modExists("print", true)) { - return this.rowManager.getHtml(active); + return this.modules.print.printFullscreen(visible, style, config); + } }; //retrieve Ajax URL @@ -8416,6 +8639,27 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } }; + Tabulator.prototype.moveColumn = function (from, to, after) { + + var fromColumn = this.columnManager.findColumn(from); + + var toColumn = this.columnManager.findColumn(to); + + if (fromColumn) { + + if (toColumn) { + + this.columnManager.moveColumn(fromColumn, toColumn, after); + } else { + + console.warn("Move Error - No matching column found:", toColumn); + } + } else { + + console.warn("Move Error - No matching column found:", from); + } + }; + //scroll to column in DOM Tabulator.prototype.scrollToColumn = function (field, position, ifVisible) { @@ -8994,7 +9238,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol e.preventDefault(); - return cell.nav().dpwn(); + return cell.nav().down(); } } @@ -9237,7 +9481,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } } } - } else if (query instanceof HTMLElement || query instanceof Tabulator) { + } else if (typeof HTMLElement !== "undefined" && query instanceof HTMLElement || query instanceof Tabulator) { match = Tabulator.prototype.comms.matchElement(query); @@ -10620,6 +10864,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol data = this.rowsToData(rows); if (this.topInitialized) { + if (this.topRow) { + this.topRow.deleteCells(); + } + row = this.generateRow("top", this.rowsToData(rows)); this.topRow = row; while (this.topElement.firstChild) { @@ -10629,6 +10877,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } if (this.botInitialized) { + if (this.botRow) { + this.botRow.deleteCells(); + } + row = this.generateRow("bottom", this.rowsToData(rows)); this.botRow = row; while (this.botElement.firstChild) { @@ -10774,7 +11026,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }); paramKey = type + "Params"; - params = typeof column.modules.columnCalcs[paramKey] === "function" ? column.modules.columnCalcs[paramKey](value, data) : column.modules.columnCalcs[paramKey]; + params = typeof column.modules.columnCalcs[paramKey] === "function" ? column.modules.columnCalcs[paramKey](values, data) : column.modules.columnCalcs[paramKey]; column.setFieldValue(rowData, column.modules.columnCalcs[type](values, data, params)); } @@ -10785,9 +11037,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol ColumnCalcs.prototype.hasTopCalcs = function () { return !!this.topCalcs.length; - }, ColumnCalcs.prototype.hasBottomCalcs = function () { + }; + + ColumnCalcs.prototype.hasBottomCalcs = function () { return !!this.botCalcs.length; - }, + }; //handle table redraw ColumnCalcs.prototype.redraw = function () { @@ -10932,6 +11186,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Tabulator.prototype.registerModule("columnCalcs", ColumnCalcs); + var Clipboard = function Clipboard(table) { this.table = table; this.mode = true; @@ -11003,7 +11258,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (typeof this.table.options.clipboardCopyHeader !== "undefined") { config.columnHeaders = this.table.options.clipboardCopyHeader; - console.warn("DEPRECATION WANRING - clipboardCopyHeader option has been depricated, please use the columnHeaders property on the clipboardCopyConfig option"); + console.warn("DEPRECATION WARNING - clipboardCopyHeader option has been deprecated, please use the columnHeaders property on the clipboardCopyConfig option"); } if (this.table.options.clipboardCopyConfig) { @@ -11133,7 +11388,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Clipboard.prototype.copy = function (selector, selectorParams, formatter, formatterParams, internal) { - var range, sel; + var range, sel, textRange; this.blocked = false; if (this.mode === true || this.mode === "copy") { @@ -11270,7 +11525,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return false; } } else { - if (column.field && column.visible) { + if (column.field && (column.definition.clipboard || column.visible && column.definition.clipboard !== false)) { groupData.width = 1; } else { return false; @@ -11328,9 +11583,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return headers; }; - Clipboard.prototype.rowsToData = function (rows, config, params) { - var columns = this.table.columnManager.columnsByIndex, - data = []; + Clipboard.prototype.rowsToData = function (rows, columns, config, params) { + var data = []; rows.forEach(function (row) { var rowArray = [], @@ -11398,7 +11652,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return groupData; }; - Clipboard.prototype.getCalcRow = function (calcs, selector, pos) { + Clipboard.prototype.getCalcRow = function (calcs, columns, selector, pos) { var calcData = calcs[selector]; if (calcData) { @@ -11407,7 +11661,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } if (Object.keys(calcData).length) { - return this.rowsToData([calcData]); + return this.rowsToData([calcData], columns); } } @@ -11419,7 +11673,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var output = [], calcs, - columns = this.table.columnManager.columnsByIndex; + columns = []; if (config.columnHeaders) { @@ -11428,6 +11682,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol output = output.concat(this.groupHeadersToRows(columns)); } else { + this.table.columnManager.columnsByIndex.forEach(function (column) { + if (column.definition.clipboard || column.visible && column.definition.clipboard !== false) { + columns.push(column); + } + }); + output.push(this.generateSimpleHeaders(columns)); } } @@ -11444,24 +11704,24 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //generate unstyled content if (config.rowGroups) { rows.forEach(function (row) { - output = output.concat(_this26.parseRowGroupData(row, config, params, calcs || {})); + output = output.concat(_this26.parseRowGroupData(row, columns, config, params, calcs || {})); }); } else { if (config.columnCalcs) { - output = output.concat(this.getCalcRow(calcs, "top")); + output = output.concat(this.getCalcRow(calcs, columns, "top")); } - output = output.concat(this.rowsToData(rows, config, params)); + output = output.concat(this.rowsToData(rows, columns, config, params)); if (config.columnCalcs) { - output = output.concat(this.getCalcRow(calcs, "bottom")); + output = output.concat(this.getCalcRow(calcs, columns, "bottom")); } } return output; }; - Clipboard.prototype.parseRowGroupData = function (group, config, params, calcObj) { + Clipboard.prototype.parseRowGroupData = function (group, columns, config, params, calcObj) { var _this27 = this; var groupData = []; @@ -11474,13 +11734,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }); } else { if (config.columnCalcs) { - groupData = groupData.concat(this.getCalcRow(calcObj, group.key, "top")); + groupData = groupData.concat(this.getCalcRow(calcObj, columns, group.key, "top")); } - groupData = groupData.concat(this.rowsToData(group.rows, config, params)); + groupData = groupData.concat(this.rowsToData(group.rows, columns, config, params)); if (config.columnCalcs) { - groupData = groupData.concat(this.getCalcRow(calcObj, group.key, "bottom")); + groupData = groupData.concat(this.getCalcRow(calcObj, columns, group.key, "bottom")); } } @@ -11615,7 +11875,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } } - columns = this.table.columnManager.columnsByIndex; + // columns = this.table.columnManager.columnsByIndex; //create table body body = document.createElement("tbody"); @@ -12382,10 +12642,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var subGroups = column.columns, maxDepth = 0; - + var processedColumn = this.processDefinition(column); var groupData = { type: "group", - title: column.definition.title, + title: processedColumn.title, depth: 1 }; @@ -12414,7 +12674,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } else { if (column.field && column.definition.download !== false && (column.visible || !column.visible && column.definition.download)) { groupData.width = 1; - groupData.definition = this.processDefinition(column); + groupData.definition = processedColumn; } else { return false; } @@ -12892,6 +13152,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol doc.autoTable(autoTableParams); + if (options && options.documentProcessing) { + options.documentProcessing(doc); + } + setFileContents(doc.output("arraybuffer"), "application/pdf"); }, @@ -13186,7 +13450,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (column.definition.editor === "tick") { column.definition.editor = "tickCross"; - console.warn("DEPRECATION WANRING - the tick editor has been depricated, please use the tickCross editor"); + console.warn("DEPRECATION WARNING - the tick editor has been deprecated, please use the tickCross editor"); } if (self.editors[column.definition.editor]) { @@ -13208,7 +13472,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (column.definition.formatter === "tick") { column.definition.formatter = "tickCross"; - console.warn("DEPRECATION WANRING - the tick editor has been depricated, please use the tickCross editor"); + console.warn("DEPRECATION WARNING - the tick editor has been deprecated, please use the tickCross editor"); } if (self.editors[column.definition.formatter]) { @@ -13462,12 +13726,23 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var cellValue = cell.getValue(), input = document.createElement("input"); - input.setAttribute("type", "text"); + input.setAttribute("type", editorParams.search ? "search" : "text"); input.style.padding = "4px"; input.style.width = "100%"; input.style.boxSizing = "border-box"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + input.value = typeof cellValue !== "undefined" ? cellValue : ""; onRendered(function () { @@ -13507,7 +13782,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol textarea: function textarea(cell, onRendered, success, cancel, editorParams) { var self = this, cellValue = cell.getValue(), - value = String(cellValue !== null && cellValue !== "undefined" ? cellValue : ""), + value = String(cellValue !== null && typeof cellValue !== "undefined" ? cellValue : ""), count = (value.match(/(?:\r\n|\r|\n)/g) || []).length + 1, input = document.createElement("textarea"), scrollHeight = 0; @@ -13521,6 +13796,17 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol input.style.whiteSpace = "pre-wrap"; input.style.resize = "none"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + input.value = value; onRendered(function () { @@ -13592,11 +13878,32 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol input.style.width = "100%"; input.style.boxSizing = "border-box"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + input.value = cellValue; + var blurFunc = function blurFunc(e) { + onChange(); + }; + onRendered(function () { + //submit new value on blur + input.removeEventListener("blur", blurFunc); + input.focus(); input.style.height = "100%"; + + //submit new value on blur + input.addEventListener("blur", blurFunc); }); function onChange() { @@ -13613,16 +13920,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } } - //submit new value on blur - input.addEventListener("blur", function (e) { - onChange(); - }); - //submit new value on enter input.addEventListener("keydown", function (e) { switch (e.keyCode) { case 13: - case 9: + // case 9: onChange(); break; @@ -13660,6 +13962,17 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol input.style.width = "100%"; input.style.boxSizing = "border-box"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + input.value = cellValue; onRendered(function () { @@ -13708,6 +14021,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var self = this, cellEl = cell.getElement(), initialValue = cell.getValue(), + initialDisplayValue = typeof initialValue !== "undefined" || initialValue === null ? initialValue : typeof editorParams.defaultValue !== "undefined" ? editorParams.defaultValue : "", input = document.createElement("input"), listEl = document.createElement("div"), dataItems = [], @@ -13715,32 +14029,44 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol currentItem = {}, blurable = true; + this.table.rowManager.element.addEventListener("scroll", cancelItem); + if (Array.isArray(editorParams) || !Array.isArray(editorParams) && (typeof editorParams === 'undefined' ? 'undefined' : _typeof(editorParams)) === "object" && !editorParams.values) { console.warn("DEPRECATION WANRING - values for the select editor must now be passed into the values property of the editorParams object, not as the editorParams object"); editorParams = { values: editorParams }; } - function getUniqueColumnValues() { + function getUniqueColumnValues(field) { var output = {}, - column = cell.getColumn()._getSelf(), - data = self.table.getData(); + data = self.table.getData(), + column; - data.forEach(function (row) { - var val = column.getFieldValue(row); + if (field) { + column = self.table.columnManager.getColumnByField(field); + } else { + column = cell.getColumn()._getSelf(); + } - if (val !== null && typeof val !== "undefined" && val !== "") { - output[val] = true; - } - }); + if (column) { + data.forEach(function (row) { + var val = column.getFieldValue(row); + + if (val !== null && typeof val !== "undefined" && val !== "") { + output[val] = true; + } + }); - if (editorParams.sortValuesList) { - if (editorParams.sortValuesList == "asc") { - output = Object.keys(output).sort(); + if (editorParams.sortValuesList) { + if (editorParams.sortValuesList == "asc") { + output = Object.keys(output).sort(); + } else { + output = Object.keys(output).sort().reverse(); + } } else { - output = Object.keys(output).sort().reverse(); + output = Object.keys(output); } } else { - output = Object.keys(output); + console.warn("unable to find matching column to create select lookup list:", field); } return output; @@ -13909,9 +14235,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (!listEl.parentNode) { if (editorParams.values === true) { - parseItems(getUniqueColumnValues(), initialValue); + parseItems(getUniqueColumnValues(), initialDisplayValue); + } else if (typeof editorParams.values === "string") { + parseItems(getUniqueColumnValues(editorParams.values), initialDisplayValue); } else { - parseItems(editorParams.values || [], initialValue); + parseItems(editorParams.values || [], initialDisplayValue); } var offset = Tabulator.prototype.helpers.elOffset(cellEl); @@ -13928,6 +14256,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (listEl.parentNode) { listEl.parentNode.removeChild(listEl); } + + removeScrollListener(); + } + + function removeScrollListener() { + self.table.rowManager.element.removeEventListener("scroll", cancelItem); } //style input @@ -13936,12 +14270,26 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol input.style.padding = "4px"; input.style.width = "100%"; input.style.boxSizing = "border-box"; - input.readOnly = true; + input.style.cursor = "default"; + input.readOnly = this.currentCell != false; + + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } - input.value = typeof initialValue !== "undefined" ? initialValue : ""; + input.value = typeof initialValue !== "undefined" || initialValue === null ? initialValue : ""; if (editorParams.values === true) { parseItems(getUniqueColumnValues(), initialValue); + } else if (typeof editorParams.values === "string") { + parseItems(getUniqueColumnValues(editorParams.values), initialValue); } else { parseItems(editorParams.values || [], initialValue); } @@ -14028,6 +14376,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var self = this, cellEl = cell.getElement(), initialValue = cell.getValue(), + initialDisplayValue = typeof initialValue !== "undefined" || initialValue === null ? initialValue : typeof editorParams.defaultValue !== "undefined" ? editorParams.defaultValue : "", input = document.createElement("input"), listEl = document.createElement("div"), allItems = [], @@ -14036,27 +14385,39 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol currentItem = {}, blurable = true; - function getUniqueColumnValues() { + this.table.rowManager.element.addEventListener("scroll", cancelItem); + + function getUniqueColumnValues(field) { var output = {}, - column = cell.getColumn()._getSelf(), - data = self.table.getData(); + data = self.table.getData(), + column; - data.forEach(function (row) { - var val = column.getFieldValue(row); + if (field) { + column = self.table.columnManager.getColumnByField(field); + } else { + column = cell.getColumn()._getSelf(); + } - if (val !== null && typeof val !== "undefined" && val !== "") { - output[val] = true; - } - }); + if (column) { + data.forEach(function (row) { + var val = column.getFieldValue(row); + + if (val !== null && typeof val !== "undefined" && val !== "") { + output[val] = true; + } + }); - if (editorParams.sortValuesList) { - if (editorParams.sortValuesList == "asc") { - output = Object.keys(output).sort(); + if (editorParams.sortValuesList) { + if (editorParams.sortValuesList == "asc") { + output = Object.keys(output).sort(); + } else { + output = Object.keys(output).sort().reverse(); + } } else { - output = Object.keys(output).sort().reverse(); + output = Object.keys(output); } } else { - output = Object.keys(output); + console.warn("unable to find matching column to create autocomplete lookup list:", field); } return output; @@ -14252,6 +14613,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol listEl.removeChild(listEl.firstChild); }if (editorParams.values === true) { values = getUniqueColumnValues(); + } else if (typeof editorParams.values === "string") { + values = getUniqueColumnValues(editorParams.values); } else { values = editorParams.values || []; } @@ -14272,6 +14635,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (listEl.parentNode) { listEl.parentNode.removeChild(listEl); } + + removeScrollListener(); + } + + function removeScrollListener() { + self.table.rowManager.element.removeEventListener("scroll", cancelItem); } //style input @@ -14281,6 +14650,17 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol input.style.width = "100%"; input.style.boxSizing = "border-box"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + //allow key based navigation input.addEventListener("keydown", function (e) { var index; @@ -14373,9 +14753,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }); input.addEventListener("focus", function (e) { + var value = initialDisplayValue; showList(); - input.value = initialValue; - filterList(initialValue, true); + input.value = value; + filterList(value, true); }); //style list element @@ -14394,13 +14775,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol star: function star(cell, onRendered, success, cancel, editorParams) { var self = this, element = cell.getElement(), - value = cell.getValue(), + value = cell.getValue() || 0, maxStars = element.getElementsByTagName("svg").length || 5, size = element.getElementsByTagName("svg")[0] ? element.getElementsByTagName("svg")[0].getAttribute("width") : 14, stars = [], starsHolder = document.createElement("div"), star = document.createElementNS('http://www.w3.org/2000/svg', "svg"); - + //change star type function starChange(val) { stars.forEach(function (star, i) { @@ -14476,12 +14857,24 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol star.setAttribute("xml:space", "preserve"); star.style.padding = "0 1px"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + starsHolder.setAttribute(key, starsHolder.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + starsHolder.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + //create correct number of stars for (var i = 1; i <= maxStars; i++) { buildStar(i); } //ensure value does not exceed number of stars + if (isNaN(value)) { value = 0; } value = Math.min(parseInt(value), maxStars); // set initial styling of stars @@ -14567,6 +14960,17 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol bar.style.maxWidth = "100%"; bar.style.minWidth = "0%"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + bar.setAttribute(key, bar.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + bar.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + //style cell element.style.padding = "4px 4px"; @@ -14656,6 +15060,17 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol input.style.marginTop = "5px"; input.style.boxSizing = "border-box"; + if (editorParams.elementAttributes && _typeof(editorParams.elementAttributes) == "object") { + for (var key in editorParams.elementAttributes) { + if (key.charAt(0) == "+") { + key = key.slice(1); + input.setAttribute(key, input.getAttribute(key) + editorParams.elementAttributes["+" + key]); + } else { + input.setAttribute(key, editorParams.elementAttributes[key]); + } + } + } + input.value = value; if (tristate && (typeof value === "undefined" || value === indetermValue || value === "")) { @@ -14720,6 +15135,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Tabulator.prototype.registerModule("edit", Edit); + var Filter = function Filter(table) { this.table = table; //hold Tabulator object @@ -14736,7 +15152,6 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol Filter.prototype.initializeColumn = function (column, value) { var self = this, field = column.getField(), - prevSuccess, params; //handle successfull value change @@ -14745,9 +15160,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol type = "", filterFunc; - if (typeof prevSuccess === "undefined" || prevSuccess !== value) { + if (typeof column.modules.filter.prevSuccess === "undefined" || column.modules.filter.prevSuccess !== value) { - prevSuccess = value; + column.modules.filter.prevSuccess = value; if (!column.modules.filter.emptyFunc(value)) { column.modules.filter.value = value; @@ -14828,6 +15243,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Filter.prototype.generateHeaderFilterElement = function (column, initialValue) { + var _this35 = this; + var self = this, success = column.modules.filter.success, field = column.getField(), @@ -14961,6 +15378,15 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol editorElement.focus(); }); + editorElement.addEventListener("focus", function (e) { + var left = _this35.table.columnManager.element.scrollLeft; + + if (left !== _this35.table.rowManager.element.scrollLeft) { + _this35.table.rowManager.scrollHorizontal(left); + _this35.table.columnManager.scrollHorizontal(left); + } + }); + //live update filters as user types typingTimer = false; @@ -14980,7 +15406,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (column.definition.headerFilterLiveFilter !== false) { - if (!((column.definition.headerFilter === 'autocomplete' || column.definition.editor === 'autocomplete' || column.definition.headerFilter === 'tickCross' || column.definition.editor === 'tickCross') && column.definition.headerFilter === true)) { + if (!(column.definition.headerFilter === 'autocomplete' || column.definition.headerFilter === 'tickCross' || (column.definition.editor === 'autocomplete' || column.definition.editor === 'tickCross') && column.definition.headerFilter === true)) { editorElement.addEventListener("keyup", searchTrigger); editorElement.addEventListener("search", searchTrigger); @@ -15163,17 +15589,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //get all filters Filter.prototype.getFilters = function (all, ajax) { - var self = this, - output = []; + var output = []; if (all) { - output = self.getHeaderFilters(); + output = this.getHeaderFilters(); } - self.filterList.forEach(function (filter) { - output.push({ field: filter.field, type: filter.type, value: filter.value }); - }); - if (ajax) { output.forEach(function (item) { if (typeof item.type == "function") { @@ -15182,6 +15603,35 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }); } + output = output.concat(this.filtersToArray(this.filterList, ajax)); + + return output; + }; + + //filter to Object + Filter.prototype.filtersToArray = function (filterList, ajax) { + var _this36 = this; + + var output = []; + + filterList.forEach(function (filter) { + var item; + + if (Array.isArray(filter)) { + output.push(_this36.filtersToArray(filter, ajax)); + } else { + item = { field: filter.field, type: filter.type, value: filter.value }; + + if (ajax) { + if (typeof item.type == "function") { + item.type = "function"; + } + } + + output.push(item); + } + }); + return output; }; @@ -15254,6 +15704,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.headerFilterColumns.forEach(function (column) { column.modules.filter.value = null; + column.modules.filter.prevSuccess = undefined; self.reloadHeaderFilter(column); }); @@ -15453,7 +15904,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol config.params.crossElement = false; } - console.warn("DEPRECATION WANRING - the tick formatter has been depricated, please use the tickCross formatter with the crossElement param set to false"); + console.warn("DEPRECATION WARNING - the tick formatter has been deprecated, please use the tickCross formatter with the crossElement param set to false"); } if (self.formatters[column.definition.formatter]) { @@ -15516,7 +15967,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Format.prototype.emptyToSpace = function (value) { - return value === null || typeof value === "undefined" ? " " : value; + return value === null || typeof value === "undefined" ? " " : value; }; //get formatter for cell @@ -15604,6 +16055,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol el = document.createElement("a"), data; + if (label === " ") { return; } if (formatterParams.labelField) { data = cell.getData(); label = data[formatterParams.labelField]; @@ -15944,7 +16396,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol element.setAttribute("aria-label", percentValue); - return "
" + (legend ? "
" + legend + "
" : ""); + return "
" + (legend ? "
" + legend + "
" : ""); }, //background color @@ -16014,6 +16466,43 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol toggleList(open); return el; + }, + + rowSelection: function rowSelection(cell) { + var _this37 = this; + + var checkbox = document.createElement("input"); + + checkbox.type = 'checkbox'; + + if (this.table.modExists("selectRow", true)) { + + checkbox.addEventListener("click", function (e) { + e.stopPropagation(); + }); + + if (typeof cell.getRow == 'function') { + var row = cell.getRow(); + + checkbox.addEventListener("change", function (e) { + row.toggleSelect(); + }); + + checkbox.checked = row.isSelected(); + this.table.modules.selectRow.registerRowSelectCheckbox(row, checkbox); + } else { + checkbox.addEventListener("change", function (e) { + if (_this37.table.modules.selectRow.selectedRows.length) { + _this37.table.deselectRow(); + } else { + _this37.table.selectRow(); + } + }); + + this.table.modules.selectRow.registerHeaderSelectCheckbox(checkbox); + } + } + return checkbox; } }; @@ -16025,8 +16514,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.rightColumns = []; this.leftMargin = 0; this.rightMargin = 0; + this.rightPadding = 0; this.initializationMode = "left"; this.active = false; + this.scrollEndTimer = false; }; //reset initial state @@ -16036,6 +16527,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.rightColumns = []; this.leftMargin = 0; this.rightMargin = 0; + this.rightMargin = 0; this.active = false; this.table.columnManager.headersElement.style.marginLeft = 0; @@ -16073,98 +16565,168 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } }; - //layout columns appropropriatly - FrozenColumns.prototype.layout = function () { - var self = this, - tableHolder = this.table.rowManager.element, - rightMargin = 0; + //quick layout to smooth horizontal scrolling + FrozenColumns.prototype.scrollHorizontal = function () { + var _this38 = this; - if (self.active) { + var rows; - //calculate row padding - self.leftMargin = self._calcSpace(self.leftColumns, self.leftColumns.length); - self.table.columnManager.headersElement.style.marginLeft = self.leftMargin + "px"; + if (this.active) { + clearTimeout(this.scrollEndTimer); + + //layout all rows after scroll is complete + this.scrollEndTimer = setTimeout(function () { + _this38.layout(); + }, 100); + + rows = this.table.rowManager.getVisibleRows(); - self.rightMargin = self._calcSpace(self.rightColumns, self.rightColumns.length); - self.table.columnManager.element.style.paddingRight = self.rightMargin + "px"; + this.calcMargins(); - self.table.rowManager.activeRows.forEach(function (row) { - self.layoutRow(row); + this.layoutColumnPosition(); + + this.layoutCalcRows(); + + rows.forEach(function (row) { + if (row.type === "row") { + _this38.layoutRow(row); + } }); - if (self.table.options.dataTree) { - self.table.rowManager.getDisplayRows().forEach(function (row) { - self.layoutRow(row); + this.table.rowManager.tableElement.style.marginRight = this.rightMargin; + } + }; + + //calculate margins for rows + FrozenColumns.prototype.calcMargins = function () { + this.leftMargin = this._calcSpace(this.leftColumns, this.leftColumns.length) + "px"; + this.table.columnManager.headersElement.style.marginLeft = this.leftMargin; + + this.rightMargin = this._calcSpace(this.rightColumns, this.rightColumns.length) + "px"; + this.table.columnManager.element.style.paddingRight = this.rightMargin; + + //calculate right frozen columns + this.rightPadding = this.table.rowManager.element.clientWidth + this.table.columnManager.scrollLeft; + }; + + //layout calculation rows + FrozenColumns.prototype.layoutCalcRows = function () { + if (this.table.modExists("columnCalcs")) { + if (this.table.modules.columnCalcs.topInitialized && this.table.modules.columnCalcs.topRow) { + this.layoutRow(this.table.modules.columnCalcs.topRow); + } + if (this.table.modules.columnCalcs.botInitialized && this.table.modules.columnCalcs.botRow) { + this.layoutRow(this.table.modules.columnCalcs.botRow); + } + } + }; + + //calculate column positions and layout headers + FrozenColumns.prototype.layoutColumnPosition = function (allCells) { + var _this39 = this; + + this.leftColumns.forEach(function (column, i) { + column.modules.frozen.margin = _this39._calcSpace(_this39.leftColumns, i) + _this39.table.columnManager.scrollLeft + "px"; + + if (i == _this39.leftColumns.length - 1) { + column.modules.frozen.edge = true; + } else { + column.modules.frozen.edge = false; + } + + _this39.layoutElement(column.getElement(), column); + + if (allCells) { + column.cells.forEach(function (cell) { + _this39.layoutElement(cell.getElement(), column); }); } + }); - if (self.table.modExists("columnCalcs")) { - if (self.table.modules.columnCalcs.topInitialized && self.table.modules.columnCalcs.topRow) { - self.layoutRow(self.table.modules.columnCalcs.topRow); - } - if (self.table.modules.columnCalcs.botInitialized && self.table.modules.columnCalcs.botRow) { - self.layoutRow(self.table.modules.columnCalcs.botRow); - } + this.rightColumns.forEach(function (column, i) { + column.modules.frozen.margin = _this39.rightPadding - _this39._calcSpace(_this39.rightColumns, i + 1) + "px"; + + if (i == _this39.rightColumns.length - 1) { + column.modules.frozen.edge = true; + } else { + column.modules.frozen.edge = false; } - //calculate left columns - self.leftColumns.forEach(function (column, i) { - column.modules.frozen.margin = self._calcSpace(self.leftColumns, i) + self.table.columnManager.scrollLeft; + _this39.layoutElement(column.getElement(), column); - if (i == self.leftColumns.length - 1) { - column.modules.frozen.edge = true; - } else { - column.modules.frozen.edge = false; - } + if (allCells) { + column.cells.forEach(function (cell) { + _this39.layoutElement(cell.getElement(), column); + }); + } + }); + }; - self.layoutColumn(column); - }); + //layout columns appropropriatly + FrozenColumns.prototype.layout = function () { + var self = this, + rightMargin = 0; - //calculate right frozen columns - rightMargin = self.table.rowManager.element.clientWidth + self.table.columnManager.scrollLeft; + if (self.active) { - // if(tableHolder.scrollHeight > tableHolder.clientHeight){ - // rightMargin -= tableHolder.offsetWidth - tableHolder.clientWidth; - // } + //calculate row padding + this.calcMargins(); - self.rightColumns.forEach(function (column, i) { - column.modules.frozen.margin = rightMargin - self._calcSpace(self.rightColumns, i + 1); + // self.table.rowManager.activeRows.forEach(function(row){ + // self.layoutRow(row); + // }); - if (i == self.rightColumns.length - 1) { - column.modules.frozen.edge = true; - } else { - column.modules.frozen.edge = false; + // if(self.table.options.dataTree){ + self.table.rowManager.getDisplayRows().forEach(function (row) { + if (row.type === "row") { + self.layoutRow(row); } - - self.layoutColumn(column); }); + // } - this.table.rowManager.tableElement.style.marginRight = this.rightMargin + "px"; - } - }; + this.layoutCalcRows(); - FrozenColumns.prototype.layoutColumn = function (column) { - var self = this; + //calculate left columns + this.layoutColumnPosition(true); - self.layoutElement(column.getElement(), column); + // if(tableHolder.scrollHeight > tableHolder.clientHeight){ + // rightMargin -= tableHolder.offsetWidth - tableHolder.clientWidth; + // } - column.cells.forEach(function (cell) { - self.layoutElement(cell.getElement(), column); - }); + this.table.rowManager.tableElement.style.marginRight = this.rightMargin; + } }; FrozenColumns.prototype.layoutRow = function (row) { + var _this40 = this; + var rowEl = row.getElement(); - rowEl.style.paddingLeft = this.leftMargin + "px"; + rowEl.style.paddingLeft = this.leftMargin; // rowEl.style.paddingRight = this.rightMargin + "px"; + + this.leftColumns.forEach(function (column) { + var cell = row.getCell(column); + + if (cell) { + _this40.layoutElement(cell.getElement(), column); + } + }); + + this.rightColumns.forEach(function (column) { + var cell = row.getCell(column); + + if (cell) { + _this40.layoutElement(cell.getElement(), column); + } + }); }; FrozenColumns.prototype.layoutElement = function (element, column) { if (column.modules.frozen) { element.style.position = "absolute"; - element.style.left = column.modules.frozen.margin + "px"; + element.style.left = column.modules.frozen.margin; element.classList.add("tabulator-frozen"); @@ -16294,6 +16856,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol return this._group.key; }; + GroupComponent.prototype.getField = function () { + return this._group.field; + }; + GroupComponent.prototype.getElement = function () { return this._group.element; }; @@ -16399,12 +16965,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Group.prototype.createValueGroups = function () { - var _this35 = this; + var _this41 = this; var level = this.level + 1; if (this.groupManager.allowedValues && this.groupManager.allowedValues[level]) { this.groupManager.allowedValues[level].forEach(function (value) { - _this35._createGroup(value, level); + _this41._createGroup(value, level); }); } }; @@ -16441,7 +17007,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.element.addEventListener("touchstart", function (e) { tap = true; - }); + }, { passive: true }); self.element.addEventListener("touchend", function (e) { if (tap) { @@ -16486,7 +17052,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol tap = false; self.groupManager.table.options.groupTapHold(e, self.getComponent()); }, 1000); - }); + }, { passive: true }); self.element.addEventListener("touchend", function (e) { clearTimeout(tapHold); @@ -16658,7 +17224,6 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this._visSet(); if (this.visible) { - if (this.groupList.length) { this.groupList.forEach(function (group) { output = output.concat(group.getHeadersAndRows(noCalc)); @@ -16667,6 +17232,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol if (!noCalc && this.groupManager.table.options.columnCalcs != "table" && this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.modules.columnCalcs.hasTopCalcs()) { if (this.calcs.top) { this.calcs.top.detachElement(); + this.calcs.top.deleteCells(); } this.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows); @@ -16676,9 +17242,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol output = output.concat(this.rows); if (!noCalc && this.groupManager.table.options.columnCalcs != "table" && this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.modules.columnCalcs.hasBottomCalcs()) { - if (this.calcs.bottom) { this.calcs.bottom.detachElement(); + this.calcs.bottom.deleteCells(); } this.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows); @@ -16686,22 +17252,32 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } } } else { - if (!this.groupList.length && this.groupManager.table.options.columnCalcs != "table" && this.groupManager.table.options.groupClosedShowCalcs) { + if (!this.groupList.length && this.groupManager.table.options.columnCalcs != "table") { + if (this.groupManager.table.modExists("columnCalcs")) { + if (!noCalc && this.groupManager.table.modules.columnCalcs.hasTopCalcs()) { if (this.calcs.top) { this.calcs.top.detachElement(); + this.calcs.top.deleteCells(); + } + + if (this.groupManager.table.options.groupClosedShowCalcs) { + this.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows); + output.push(this.calcs.top); } - this.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows); - output.push(this.calcs.top); } if (!noCalc && this.groupManager.table.modules.columnCalcs.hasBottomCalcs()) { if (this.calcs.bottom) { this.calcs.bottom.detachElement(); + this.calcs.bottom.deleteCells(); + } + + if (this.groupManager.table.options.groupClosedShowCalcs) { + this.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows); + output.push(this.calcs.bottom); } - this.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows); - output.push(this.calcs.bottom); } } } @@ -17007,6 +17583,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.allowedValues = self.table.options.groupValues; + if (Array.isArray(groupBy) && Array.isArray(groupHeader) && groupBy.length > groupHeader.length) { + console.warn("Error creating group headers, groupHeader array is shorter than groupBy array"); + } + self.headerGenerator = [function () { return ""; }]; @@ -17642,26 +18222,400 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Tabulator.prototype.registerModule("htmlTableImport", HtmlTableImport); - var Keybindings = function Keybindings(table) { + var HtmlTableExport = function HtmlTableExport(table) { this.table = table; //hold Tabulator object - this.watchKeys = null; - this.pressedKeys = null; - this.keyupBinding = false; - this.keydownBinding = false; + this.config = {}; + this.cloneTableStyle = true; + this.colVisProp = ""; }; - Keybindings.prototype.initialize = function () { - var bindings = this.table.options.keybindings, - mergedBindings = {}; + HtmlTableExport.prototype.genereateTable = function (config, style, visible, colVisProp) { + this.cloneTableStyle = style; + this.config = config || {}; + this.colVisProp = colVisProp; - this.watchKeys = {}; - this.pressedKeys = []; + var headers = this.generateHeaderElements(); + var body = this.generateBodyElements(visible); - if (bindings !== false) { + var table = document.createElement("table"); + table.classList.add("tabulator-print-table"); + table.appendChild(headers); + table.appendChild(body); - for (var key in this.bindings) { - mergedBindings[key] = this.bindings[key]; - } + this.mapElementStyles(this.table.element, table, ["border-top", "border-left", "border-right", "border-bottom"]); + + return table; + }; + + HtmlTableExport.prototype.generateColumnGroupHeaders = function () { + var _this42 = this; + + var output = []; + + var columns = this.config.columnGroups !== false ? this.table.columnManager.columns : this.table.columnManager.columnsByIndex; + + columns.forEach(function (column) { + var colData = _this42.processColumnGroup(column); + + if (colData) { + output.push(colData); + } + }); + + return output; + }; + + HtmlTableExport.prototype.processColumnGroup = function (column) { + var _this43 = this; + + var subGroups = column.columns, + maxDepth = 0; + + var groupData = { + title: column.definition.title, + column: column, + depth: 1 + }; + + if (subGroups.length) { + groupData.subGroups = []; + groupData.width = 0; + + subGroups.forEach(function (subGroup) { + var subGroupData = _this43.processColumnGroup(subGroup); + + if (subGroupData) { + groupData.width += subGroupData.width; + groupData.subGroups.push(subGroupData); + + if (subGroupData.depth > maxDepth) { + maxDepth = subGroupData.depth; + } + } + }); + + groupData.depth += maxDepth; + + if (!groupData.width) { + return false; + } + } else { + if (column.field && this.columnVisCheck(column)) { + groupData.width = 1; + } else { + return false; + } + } + + return groupData; + }; + + HtmlTableExport.prototype.groupHeadersToRows = function (columns) { + + var headers = [], + headerDepth = 0; + + function parseColumnGroup(column, level) { + + var depth = headerDepth - level; + + if (typeof headers[level] === "undefined") { + headers[level] = []; + } + + column.height = column.subGroups ? 1 : depth - column.depth + 1; + + headers[level].push(column); + + if (column.subGroups) { + column.subGroups.forEach(function (subGroup) { + parseColumnGroup(subGroup, level + 1); + }); + } + } + + //calculate maximum header debth + columns.forEach(function (column) { + if (column.depth > headerDepth) { + headerDepth = column.depth; + } + }); + + columns.forEach(function (column) { + parseColumnGroup(column, 0); + }); + + return headers; + }; + + HtmlTableExport.prototype.generateHeaderElements = function () { + var _this44 = this; + + var headerEl = document.createElement("thead"); + + var rows = this.groupHeadersToRows(this.generateColumnGroupHeaders()); + + rows.forEach(function (row) { + var rowEl = document.createElement("tr"); + + _this44.mapElementStyles(_this44.table.columnManager.getHeadersElement(), headerEl, ["border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]); + + row.forEach(function (column) { + var cellEl = document.createElement("th"); + + cellEl.colSpan = column.width; + cellEl.rowSpan = column.height; + + cellEl.innerHTML = column.column.definition.title; + + if (_this44.cloneTableStyle) { + cellEl.style.boxSizing = "border-box"; + } + + _this44.mapElementStyles(column.column.getElement(), cellEl, ["text-align", "border-top", "border-left", "border-right", "border-bottom", "background-color", "color", "font-weight", "font-family", "font-size"]); + _this44.mapElementStyles(column.column.contentElement, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom"]); + + if (column.column.visible) { + _this44.mapElementStyles(column.column.getElement(), cellEl, ["width"]); + } else { + if (column.column.definition.width) { + cellEl.style.width = column.column.definition.width + "px"; + } + } + + if (column.column.parent) { + _this44.mapElementStyles(column.column.parent.groupElement, cellEl, ["border-top"]); + } + + rowEl.appendChild(cellEl); + }); + + headerEl.appendChild(rowEl); + }); + + return headerEl; + }; + + HtmlTableExport.prototype.generateBodyElements = function (visible) { + var _this45 = this; + + var oddRow, evenRow, calcRow, firstRow, firstCell, firstGroup, lastCell, styleCells, styleRow; + + //lookup row styles + if (this.cloneTableStyle && window.getComputedStyle) { + oddRow = this.table.element.querySelector(".tabulator-row-odd:not(.tabulator-group):not(.tabulator-calcs)"); + evenRow = this.table.element.querySelector(".tabulator-row-even:not(.tabulator-group):not(.tabulator-calcs)"); + calcRow = this.table.element.querySelector(".tabulator-row.tabulator-calcs"); + firstRow = this.table.element.querySelector(".tabulator-row:not(.tabulator-group):not(.tabulator-calcs)"); + firstGroup = this.table.element.getElementsByClassName("tabulator-group")[0]; + + if (firstRow) { + styleCells = firstRow.getElementsByClassName("tabulator-cell"); + firstCell = styleCells[0]; + lastCell = styleCells[styleCells.length - 1]; + } + } + + var bodyEl = document.createElement("tbody"); + + var rows = visible ? this.table.rowManager.getVisibleRows(true) : this.table.rowManager.getDisplayRows(); + var columns = []; + + if (this.config.columnCalcs !== false && this.table.modExists("columnCalcs")) { + if (this.table.modules.columnCalcs.topInitialized) { + rows.unshift(this.table.modules.columnCalcs.topRow); + } + + if (this.table.modules.columnCalcs.botInitialized) { + rows.push(this.table.modules.columnCalcs.botRow); + } + } + + this.table.columnManager.columnsByIndex.forEach(function (column) { + if (_this45.columnVisCheck(column)) { + columns.push(column); + } + }); + + rows = rows.filter(function (row) { + switch (row.type) { + case "group": + return _this45.config.rowGroups !== false; + break; + + case "calc": + return _this45.config.columnCalcs !== false; + break; + } + + return true; + }); + + if (rows.length > 1000) { + console.warn("It may take a long time to render an HTML table with more than 1000 rows"); + } + + rows.forEach(function (row, i) { + var rowData = row.getData(); + + var rowEl = document.createElement("tr"); + rowEl.classList.add("tabulator-print-table-row"); + + switch (row.type) { + case "group": + var cellEl = document.createElement("td"); + cellEl.colSpan = columns.length; + cellEl.innerHTML = row.key; + + rowEl.classList.add("tabulator-print-table-group"); + + _this45.mapElementStyles(firstGroup, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]); + _this45.mapElementStyles(firstGroup, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom"]); + rowEl.appendChild(cellEl); + break; + + case "calc": + rowEl.classList.add("tabulator-print-table-calcs"); + + case "row": + columns.forEach(function (column) { + var cellEl = document.createElement("td"); + + var value = column.getFieldValue(rowData); + + var cellWrapper = { + getValue: function getValue() { + return value; + }, + getField: function getField() { + return column.definition.field; + }, + getElement: function getElement() { + return cellEl; + }, + getColumn: function getColumn() { + return column.getComponent(); + }, + getData: function getData() { + return rowData; + }, + getRow: function getRow() { + return row.getComponent(); + }, + getComponent: function getComponent() { + return cellWrapper; + }, + column: column + }; + + if (_this45.table.modExists("format")) { + value = _this45.table.modules.format.formatValue(cellWrapper); + } else { + switch (typeof value === 'undefined' ? 'undefined' : _typeof(value)) { + case "object": + value = JSON.stringify(value); + break; + + case "undefined": + case "null": + value = ""; + break; + + default: + value = value; + } + } + + if (value instanceof Node) { + cellEl.appendChild(value); + } else { + cellEl.innerHTML = value; + } + + if (firstCell) { + _this45.mapElementStyles(firstCell, cellEl, ["padding-top", "padding-left", "padding-right", "padding-bottom", "border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "text-align"]); + } + + rowEl.appendChild(cellEl); + }); + + styleRow = row.type == "calc" ? calcRow : i % 2 && evenRow ? evenRow : oddRow; + + _this45.mapElementStyles(styleRow, rowEl, ["border-top", "border-left", "border-right", "border-bottom", "color", "font-weight", "font-family", "font-size", "background-color"]); + break; + } + + bodyEl.appendChild(rowEl); + }); + + return bodyEl; + }; + + HtmlTableExport.prototype.columnVisCheck = function (column) { + return column.definition[this.colVisProp] !== false && (column.visible || !column.visible && column.definition[this.colVisProp]); + }; + + HtmlTableExport.prototype.getHtml = function (visible, style, config) { + var holder = document.createElement("div"); + + holder.appendChild(this.genereateTable(config || this.table.options.htmlOutputConfig, style, visible, "htmlOutput")); + + return holder.innerHTML; + }; + + HtmlTableExport.prototype.mapElementStyles = function (from, to, props) { + if (this.cloneTableStyle && from && to) { + + var lookup = { + "background-color": "backgroundColor", + "color": "fontColor", + "width": "width", + "font-weight": "fontWeight", + "font-family": "fontFamily", + "font-size": "fontSize", + "text-align": "textAlign", + "border-top": "borderTop", + "border-left": "borderLeft", + "border-right": "borderRight", + "border-bottom": "borderBottom", + "padding-top": "paddingTop", + "padding-left": "paddingLeft", + "padding-right": "paddingRight", + "padding-bottom": "paddingBottom" + }; + + if (window.getComputedStyle) { + var fromStyle = window.getComputedStyle(from); + + props.forEach(function (prop) { + to.style[lookup[prop]] = fromStyle.getPropertyValue(prop); + }); + } + } + }; + + Tabulator.prototype.registerModule("htmlTableExport", HtmlTableExport); + + var Keybindings = function Keybindings(table) { + this.table = table; //hold Tabulator object + this.watchKeys = null; + this.pressedKeys = null; + this.keyupBinding = false; + this.keydownBinding = false; + }; + + Keybindings.prototype.initialize = function () { + var bindings = this.table.options.keybindings, + mergedBindings = {}; + + this.watchKeys = {}; + this.pressedKeys = []; + + if (bindings !== false) { + + for (var key in this.bindings) { + mergedBindings[key] = this.bindings[key]; + } if (Object.keys(bindings).length) { @@ -17676,13 +18630,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Keybindings.prototype.mapBindings = function (bindings) { - var _this36 = this; + var _this46 = this; var self = this; var _loop2 = function _loop2(key) { - if (_this36.actions[key]) { + if (_this46.actions[key]) { if (bindings[key]) { @@ -17900,13 +18854,30 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol navNext: function navNext(e) { var cell = false; + var newRow = this.table.options.tabEndNewRow; if (this.table.modExists("edit")) { cell = this.table.modules.edit.currentCell; if (cell) { e.preventDefault(); - cell.nav().next(); + if (!cell.nav().next()) { + if (newRow) { + if (newRow === true) { + newRow = this.table.addRow({}); + } else { + if (typeof newRow == "function") { + newRow = this.table.addRow(newRow(cell.row.getComponent())); + } else { + newRow = this.table.addRow(newRow); + } + } + + newRow.then(function () { + cell.nav().next(); + }); + } + } } } }, @@ -18103,7 +19074,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.startMove(e, column); }, self.checkPeriod); - }); + }, { passive: true }); colEl.addEventListener("touchmove", function (e) { var halfCol, diff, moveToCol; @@ -18149,7 +19120,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol prevColWidth = prevCol ? prevCol.getWidth() / 2 : 0; } } - }); + }, { passive: true }); colEl.addEventListener("touchend", function (e) { if (self.checkTimeout) { @@ -18241,7 +19212,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.table.element.classList.remove("tabulator-block-select"); if (this.toCol) { - this.table.columnManager.moveColumn(this.moving, this.toCol, this.toColAfter); + this.table.columnManager.moveColumnActual(this.moving, this.toCol, this.toColAfter); } this.moving = false; @@ -18286,6 +19257,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Tabulator.prototype.registerModule("moveColumn", MoveColumns); + var MoveRows = function MoveRows(table) { this.table = table; //hold Tabulator object @@ -18465,7 +19437,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.startMove(e, row); }, self.checkPeriod); - }); + }, { passive: true }); this.moving, this.toRow, this.toRowAfter; element.addEventListener("touchmove", function (e) { @@ -19026,7 +19998,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Page.prototype.generatePageSizeSelectList = function () { - var _this37 = this; + var _this47 = this; var pageSizes = []; @@ -19061,7 +20033,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol itemEl.value = item; itemEl.innerHTML = item; - _this37.pageSizeSelect.appendChild(itemEl); + _this47.pageSizeSelect.appendChild(itemEl); }); this.pageSizeSelect.value = this.size; @@ -19229,38 +20201,38 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //set current page number Page.prototype.setPage = function (page) { - var _this38 = this; + var _this48 = this; return new Promise(function (resolve, reject) { page = parseInt(page); - if (page > 0 && page <= _this38.max) { - _this38.page = page; - _this38.trigger().then(function () { + if (page > 0 && page <= _this48.max) { + _this48.page = page; + _this48.trigger().then(function () { resolve(); }).catch(function () { reject(); }); } else { - console.warn("Pagination Error - Requested page is out of range of 1 - " + _this38.max + ":", page); + console.warn("Pagination Error - Requested page is out of range of 1 - " + _this48.max + ":", page); reject(); } }); }; Page.prototype.setPageToRow = function (row) { - var _this39 = this; + var _this49 = this; return new Promise(function (resolve, reject) { - var rows = _this39.table.rowManager.getDisplayRows(_this39.displayIndex - 1); + var rows = _this49.table.rowManager.getDisplayRows(_this49.displayIndex - 1); var index = rows.indexOf(row); if (index > -1) { - var page = Math.ceil((index + 1) / _this39.size); + var page = Math.ceil((index + 1) / _this49.size); - _this39.setPage(page).then(function () { + _this49.setPage(page).then(function () { resolve(); }).catch(function () { reject(); @@ -19346,12 +20318,12 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //previous page Page.prototype.previousPage = function () { - var _this40 = this; + var _this50 = this; return new Promise(function (resolve, reject) { - if (_this40.page > 1) { - _this40.page--; - _this40.trigger().then(function () { + if (_this50.page > 1) { + _this50.page--; + _this50.trigger().then(function () { resolve(); }).catch(function () { reject(); @@ -19365,19 +20337,19 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //next page Page.prototype.nextPage = function () { - var _this41 = this; + var _this51 = this; return new Promise(function (resolve, reject) { - if (_this41.page < _this41.max) { - _this41.page++; - _this41.trigger().then(function () { + if (_this51.page < _this51.max) { + _this51.page++; + _this51.trigger().then(function () { resolve(); }).catch(function () { reject(); }); } else { - if (!_this41.progressiveLoad) { - console.warn("Pagination Error - Next page would be greater than maximum page of " + _this41.max + ":", _this41.max + 1); + if (!_this51.progressiveLoad) { + console.warn("Pagination Error - Next page would be greater than maximum page of " + _this51.max + ":", _this51.max + 1); } reject(); } @@ -19429,28 +20401,28 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; Page.prototype.trigger = function () { - var _this42 = this; + var _this52 = this; var left; return new Promise(function (resolve, reject) { - switch (_this42.mode) { + switch (_this52.mode) { case "local": - left = _this42.table.rowManager.scrollLeft; + left = _this52.table.rowManager.scrollLeft; - _this42.table.rowManager.refreshActiveData("page"); - _this42.table.rowManager.scrollHorizontal(left); + _this52.table.rowManager.refreshActiveData("page"); + _this52.table.rowManager.scrollHorizontal(left); - _this42.table.options.pageLoaded.call(_this42.table, _this42.getPage()); + _this52.table.options.pageLoaded.call(_this52.table, _this52.getPage()); resolve(); break; case "remote": case "progressive_load": case "progressive_scroll": - _this42.table.modules.ajax.blockActiveRequest(); - _this42._getRemotePage().then(function () { + _this52.table.modules.ajax.blockActiveRequest(); + _this52._getRemotePage().then(function () { resolve(); }).catch(function () { reject(); @@ -19458,14 +20430,14 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol break; default: - console.warn("Pagination Error - no such pagination mode:", _this42.mode); + console.warn("Pagination Error - no such pagination mode:", _this52.mode); reject(); } }); }; Page.prototype._getRemotePage = function () { - var _this43 = this; + var _this53 = this; var self = this, oldParams, @@ -19482,33 +20454,33 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol pageParams = self.table.modules.ajax.getParams(); //configure request params - pageParams[_this43.paginationDataSentNames.page] = self.page; + pageParams[_this53.paginationDataSentNames.page] = self.page; //set page size if defined - if (_this43.size) { - pageParams[_this43.paginationDataSentNames.size] = _this43.size; + if (_this53.size) { + pageParams[_this53.paginationDataSentNames.size] = _this53.size; } //set sort data if defined - if (_this43.table.options.ajaxSorting && _this43.table.modExists("sort")) { + if (_this53.table.options.ajaxSorting && _this53.table.modExists("sort")) { var sorters = self.table.modules.sort.getSort(); sorters.forEach(function (item) { delete item.column; }); - pageParams[_this43.paginationDataSentNames.sorters] = sorters; + pageParams[_this53.paginationDataSentNames.sorters] = sorters; } //set filter data if defined - if (_this43.table.options.ajaxFiltering && _this43.table.modExists("filter")) { + if (_this53.table.options.ajaxFiltering && _this53.table.modExists("filter")) { var filters = self.table.modules.filter.getFilters(true, true); - pageParams[_this43.paginationDataSentNames.filters] = filters; + pageParams[_this53.paginationDataSentNames.filters] = filters; } self.table.modules.ajax.setParams(pageParams); - self.table.modules.ajax.sendRequest(_this43.progressiveLoad).then(function (data) { + self.table.modules.ajax.sendRequest(_this53.progressiveLoad).then(function (data) { self._parseRemoteData(data); resolve(); }).catch(function (e) { @@ -19593,6 +20565,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol "sorters": "sorters", // "sort_dir":"sort_dir", "filters": "filters" + // "filter_value":"filter_value", + // "filter_type":"filter_type", }; //set the property names for pagination responses @@ -19611,10 +20585,24 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.persistProps = ["field", "width", "visible"]; }; + // Test for whether localStorage is available for use. + Persistence.prototype.localStorageTest = function () { + var testKey = "_tabulator_test"; + + try { + window.localStorage.setItem(testKey, testKey); + window.localStorage.removeItem(testKey); + return true; + } catch (e) { + return false; + } + }; + //setup parameters Persistence.prototype.initialize = function (mode, id) { //determine persistent layout storage type - this.mode = mode !== true ? mode : typeof window.localStorage !== 'undefined' ? "local" : "cookie"; + + this.mode = mode !== true ? mode : this.localStorageTest() ? "local" : "cookie"; //set storage tag this.id = "tabulator-" + (id || this.table.element.getAttribute("id") || ""); @@ -19664,13 +20652,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol break; default: - console.warn("Persistance Load Error - invalid mode selected", this.mode); + console.warn("Persistence Load Error - invalid mode selected", this.mode); } return data ? JSON.parse(data) : false; }; - //merge old and new column defintions + //merge old and new column definitions Persistence.prototype.mergeDefinition = function (oldCols, newCols) { var self = this, output = []; @@ -19781,11 +20769,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol break; default: - console.warn("Persistance Save Error - invalid mode selected", this.mode); + console.warn("Persistence Save Error - invalid mode selected", this.mode); } }; - //build premission list + //build permission list Persistence.prototype.parseColumns = function (columns) { var self = this, definitions = []; @@ -19811,6 +20799,100 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol Tabulator.prototype.registerModule("persistence", Persistence); + var Print = function Print(table) { + this.table = table; //hold Tabulator object + this.element = false; + this.manualBlock = false; + }; + + Print.prototype.initialize = function () { + window.addEventListener("beforeprint", this.replaceTable.bind(this)); + window.addEventListener("afterprint", this.cleanup.bind(this)); + }; + + Print.prototype.replaceTable = function () { + if (!this.manualBlock) { + this.element = document.createElement("div"); + this.element.classList.add("tabulator-print-table"); + + this.element.appendChild(this.table.modules.htmlTableExport.genereateTable(this.table.options.printConfig, this.table.options.printCopyStyle, this.table.options.printVisibleRows, "print")); + + this.table.element.style.display = "none"; + + this.table.element.parentNode.insertBefore(this.element, this.table.element); + } + }; + + Print.prototype.cleanup = function () { + document.body.classList.remove("tabulator-print-fullscreen-hide"); + + if (this.element && this.element.parentNode) { + this.element.parentNode.removeChild(this.element); + this.table.element.style.display = ""; + } + }; + + Print.prototype.printFullscreen = function (visible, style, config) { + var scrollX = window.scrollX, + scrollY = window.scrollY, + headerEl = document.createElement("div"), + footerEl = document.createElement("div"), + tableEl = this.table.modules.htmlTableExport.genereateTable(typeof config != "undefined" ? config : this.table.options.printConfig, typeof style != "undefined" ? style : this.table.options.printCopyStyle, visible, "print"), + headerContent, + footerContent; + + this.manualBlock = true; + + this.element = document.createElement("div"); + this.element.classList.add("tabulator-print-fullscreen"); + + if (this.table.options.printHeader) { + headerEl.classList.add("tabulator-print-header"); + + headerContent = typeof this.table.options.printHeader == "function" ? this.table.options.printHeader.call(this.table) : this.table.options.printHeader; + + if (typeof headerContent == "string") { + headerEl.innerHTML = headerContent; + } else { + headerEl.appendChild(headerContent); + } + + this.element.appendChild(headerEl); + } + + this.element.appendChild(tableEl); + + if (this.table.options.printFooter) { + footerEl.classList.add("tabulator-print-footer"); + + footerContent = typeof this.table.options.printFooter == "function" ? this.table.options.printFooter.call(this.table) : this.table.options.printFooter; + + if (typeof footerContent == "string") { + footerEl.innerHTML = footerContent; + } else { + footerEl.appendChild(footerContent); + } + + this.element.appendChild(footerEl); + } + + document.body.classList.add("tabulator-print-fullscreen-hide"); + document.body.appendChild(this.element); + + if (this.table.options.printFormatter) { + this.table.options.printFormatter(this.element, tableEl); + } + + window.print(); + + this.cleanup(); + + window.scrollTo(scrollX, scrollY); + + this.manualBlock = false; + }; + + Tabulator.prototype.registerModule("print", Print); var ReactiveData = function ReactiveData(table) { this.table = table; //hold Tabulator object this.data = false; @@ -20087,12 +21169,14 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; handle.addEventListener("mousedown", handleDown); - handle.addEventListener("touchstart", handleDown); + handle.addEventListener("touchstart", handleDown, { passive: true }); //reszie column on double click handle.addEventListener("dblclick", function (e) { - if (self._checkResizability(column)) { - column.reinitializeWidth(true); + var col = column.getLastColumn(); + + if (col && self._checkResizability(col)) { + col.reinitializeWidth(true); } }); @@ -20117,7 +21201,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; prevHandle.addEventListener("mousedown", prevHandleDown); - prevHandle.addEventListener("touchstart", prevHandleDown); + prevHandle.addEventListener("touchstart", prevHandleDown, { passive: true }); //resize column on double click prevHandle.addEventListener("dblclick", function (e) { @@ -20150,7 +21234,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.table.element.classList.add("tabulator-block-select"); function mouseMove(e) { - self.table.columnManager.tempScrollBlock(); + // self.table.columnManager.tempScrollBlock(); column.setWidth(self.startWidth + ((typeof e.screenX === "undefined" ? e.touches[0].screenX : e.screenX) - self.startX)); @@ -20197,7 +21281,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol document.body.addEventListener("mousemove", mouseMove); document.body.addEventListener("mouseup", mouseUp); - handle.addEventListener("touchmove", mouseMove); + handle.addEventListener("touchmove", mouseMove, { passive: true }); handle.addEventListener("touchend", mouseUp); }; @@ -20230,7 +21314,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self._mouseDown(e, row, handle); }; - handle.addEventListener("mousedown", handleDown); + handle.addEventListener("mousedown", handleDown, { passive: true }); handle.addEventListener("touchstart", handleDown); prevHandle.addEventListener("click", function (e) { @@ -20247,7 +21331,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; prevHandle.addEventListener("mousedown", prevHandleDown); - prevHandle.addEventListener("touchstart", prevHandleDown); + prevHandle.addEventListener("touchstart", prevHandleDown, { passive: true }); rowEl.appendChild(handle); rowEl.appendChild(prevHandle); @@ -20293,7 +21377,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol document.body.addEventListener("mousemove", mouseMove); document.body.addEventListener("mouseup", mouseUp); - handle.addEventListener("touchmove", mouseMove); + handle.addEventListener("touchmove", mouseMove, { passive: true }); handle.addEventListener("touchend", mouseUp); }; @@ -20512,7 +21596,6 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol while (el.firstChild) { el.removeChild(el.firstChild); }contents = this.collapseFormatter(this.generateCollapsedRowData(row)); - if (contents) { el.appendChild(contents); } @@ -20572,6 +21655,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol listContents = ""; data.forEach(function (item) { + var div = document.createElement("div"); + + if (item.value instanceof Node) { + div.appendChild(item.value); + item.value = div.innerHTML; + } + listContents += "" + item.title + "" + item.value + ""; }); @@ -20588,6 +21678,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol this.lastClickedRow = false; //last clicked row this.selectPrev = []; //hold previously selected element for drag drop selection this.selectedRows = []; //hold selected rows + this.headerCheckboxElement = null; // hold header select element }; SelectRow.prototype.clearSelectionData = function (silent) { @@ -20623,8 +21714,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol element.classList.remove("tabulator-unselectable"); if (self.table.options.selectable && self.table.options.selectable != "highlight") { - if (self.table.options.selectableRangeMode && self.table.options.selectableRangeMode === "click") { + if (self.table.options.selectableRangeMode === "click") { element.addEventListener("click", function (e) { + + self.table._clearSelection(); + if (e.shiftKey) { self.lastClickedRow = self.lastClickedRow || row; @@ -20637,18 +21731,32 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol var rows = self.table.rowManager.getDisplayRows().slice(0); var toggledRows = rows.splice(fromRowIdx, toRowIdx - fromRowIdx + 1); - if (e.ctrlKey) { + if (e.ctrlKey || e.metaKey) { toggledRows.forEach(function (toggledRow) { if (toggledRow !== self.lastClickedRow) { - self.toggleRow(toggledRow); + + if (self.table.options.selectable !== true && !self.isRowSelected(row)) { + if (self.selectedRows.length < self.table.options.selectable) { + self.toggleRow(toggledRow); + } + } else { + self.toggleRow(toggledRow); + } } }); self.lastClickedRow = row; } else { self.deselectRows(); + + if (self.table.options.selectable !== true) { + if (toggledRows.length > self.table.options.selectable) { + toggledRows = toggledRows.slice(0, self.table.options.selectable); + } + } + self.selectRows(toggledRows); } - } else if (e.ctrlKey) { + } else if (e.ctrlKey || e.metaKey) { self.toggleRow(row); self.lastClickedRow = row; } else { @@ -20656,9 +21764,13 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol self.selectRows(row); self.lastClickedRow = row; } + + self.table._clearSelection(); }); } else { element.addEventListener("click", function (e) { + self.table._clearSelection(); + if (!self.selecting) { self.toggleRow(row); } @@ -20666,6 +21778,8 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol element.addEventListener("mousedown", function (e) { if (e.shiftKey) { + self.table._clearSelection(); + self.selecting = true; self.selectPrev = []; @@ -20681,6 +21795,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol element.addEventListener("mouseenter", function (e) { if (self.selecting) { + self.table._clearSelection(); self.toggleRow(row); if (self.selectPrev[1] == row) { @@ -20691,6 +21806,7 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol element.addEventListener("mouseout", function (e) { if (self.selecting) { + self.table._clearSelection(); self.selectPrev.unshift(row); } }); @@ -20774,6 +21890,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } row.modules.select.selected = true; + if (row.modules.select.checkboxEl) { + row.modules.select.checkboxEl.checked = true; + } row.getElement().classList.add("tabulator-selected"); this.selectedRows.push(row); @@ -20839,6 +21958,9 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol } row.modules.select.selected = false; + if (row.modules.select.checkboxEl) { + row.modules.select.checkboxEl.checked = false; + } row.getElement().classList.remove("tabulator-selected"); self.selectedRows.splice(index, 1); @@ -20876,9 +21998,34 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol }; SelectRow.prototype._rowSelectionChanged = function () { + if (this.headerCheckboxElement) { + if (this.selectedRows.length === 0) { + this.headerCheckboxElement.checked = false; + this.headerCheckboxElement.indeterminate = false; + } else if (this.table.rowManager.rows.length === this.selectedRows.length) { + this.headerCheckboxElement.checked = true; + this.headerCheckboxElement.indeterminate = false; + } else { + this.headerCheckboxElement.indeterminate = true; + this.headerCheckboxElement.checked = false; + } + } + this.table.options.rowSelectionChanged.call(this.table, this.getSelectedData(), this.getSelectedRows()); }; + SelectRow.prototype.registerRowSelectCheckbox = function (row, element) { + if (!row._row.modules.select) { + row._row.modules.select = {}; + } + + row._row.modules.select.checkboxEl = element; + }; + + SelectRow.prototype.registerHeaderSelectCheckbox = function (element) { + this.headerCheckboxElement = element; + }; + Tabulator.prototype.registerModule("selectRow", SelectRow); var Sort = function Sort(table) { @@ -20912,10 +22059,10 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol sorter: sorter, dir: "none", params: column.definition.sorterParams || {}, startingDir: column.definition.headerSortStartingDir || "asc", - tristate: column.definition.headerSortTristate + tristate: typeof column.definition.headerSortTristate !== "undefined" ? column.definition.headerSortTristate : this.table.options.headerSortTristate }; - if (column.definition.headerSort !== false) { + if (typeof column.definition.headerSort === "undefined" ? this.table.options.headerSort !== false : column.definition.headerSort !== false) { colEl = column.getElement(); @@ -21641,11 +22788,11 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol //must have a value required: function required(cell, value, parameters) { - return value !== "" & value !== null && typeof value !== "undefined"; + return value !== "" && value !== null && typeof value !== "undefined"; } }; Tabulator.prototype.registerModule("validate", Validate); return Tabulator; -}); \ No newline at end of file +}); diff --git a/node-red-ui-node-table/locales/en-US/node.html b/node-red-ui-node-table/locales/en-US/node.html index 5a3b870..b745b9c 100644 --- a/node-red-ui-node-table/locales/en-US/node.html +++ b/node-red-ui-node-table/locales/en-US/node.html @@ -22,7 +22,6 @@

Inputs

  • Color - HTML color name, or hex value (#rrggbb) to fill the cell.
  • Tick/Cross - Tick or Cross symbol, boolean true/false, numeric 1/0 or text "1"/"0".
  • Stars - Number of stars - numeric 0 to 5.
  • -
  • Date/Time
  • Row Number - Current row number.
  • diff --git a/node-red-ui-node-table/node.html b/node-red-ui-node-table/node.html index dc3d38d..fe53ff1 100644 --- a/node-red-ui-node-table/node.html +++ b/node-red-ui-node-table/node.html @@ -158,7 +158,7 @@ align.append($('').val('color').text('Color (html,#rrggbb)')); align.append($('').val('tickCross').text('Tick / Cross (boolean,1/0)')); align.append($('').val('star').text('Stars (0-5)')); - align.append($('').val('datetime').text('Date time')); + // align.append($('').val('datetime').text('Date time')); align.append($('').val('rownum').text('Row number')); if (data.formatter) { align.val(data.formatter); @@ -179,6 +179,7 @@ c.width = colum.find(".node-input-column-width").val(); c.align = colum.find(".node-input-column-align").val(); c.formatter = colum.find(".node-input-column-formatter").val(); + c.formatterParams = { target:"_blank" }; node.columns.push(c); }); }, diff --git a/node-red-ui-node-table/node.js b/node-red-ui-node-table/node.js index 6f5295a..0f6cf82 100644 --- a/node-red-ui-node-table/node.js +++ b/node-red-ui-node-table/node.js @@ -28,7 +28,7 @@ module.exports = function (RED) { var configAsJson = JSON.stringify(config); var html = String.raw` - +
    `; @@ -66,10 +66,11 @@ module.exports = function (RED) { var columndata = $scope.config.columns; var table = new Tabulator('#ui_table-' + $scope.$eval('$id'), { data: tabledata, - layout:'fitColumns', + layout: 'fitColumns', columns: columndata, autoColumns: columndata.length == 0, - movableColumns:true + movableColumns: true + // rowClick:function(e, row) { console.log("CLICK",row._row.data) } }); }); } diff --git a/node-red-ui-node-table/package.json b/node-red-ui-node-table/package.json index 87d7623..b11bb88 100644 --- a/node-red-ui-node-table/package.json +++ b/node-red-ui-node-table/package.json @@ -1,6 +1,6 @@ { "name": "node-red-ui-node-table", - "version": "0.0.2", + "version": "0.0.3", "description": "Table UI widget node for Node-RED Dashboard", "author": "Kazuhito Yokoi", "license": "Apache-2.0", diff --git a/node-red-ui-node-table/screenshot2.png b/node-red-ui-node-table/screenshot2.png index 85e1815686e4fd3f87321976046731ab73e1ccd0..afb1d2f0009af4c868610c4992f79820fbe105d8 100644 GIT binary patch literal 58170 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
      #nzO49Bp8ILxeFhiS)-LMbEB;l`F7CBch?>pr@m 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 GKK~0urZE5j literal 56588 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