UNPKG

handsontable

Version:

Handsontable is a JavaScript Spreadsheet Component available for React, Angular and Vue.

309 lines (261 loc) • 11.5 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _element = require("./../../../helpers/dom/element"); var _object = require("./../../../helpers/object"); var _string = require("./../../../helpers/string"); var _event = _interopRequireDefault(require("./event")); var _overlays = _interopRequireDefault(require("./overlays")); var _scroll = _interopRequireDefault(require("./scroll")); var _settings = _interopRequireDefault(require("./settings")); var _master = _interopRequireDefault(require("./table/master")); var _viewport = _interopRequireDefault(require("./viewport")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * @class Walkontable */ var Walkontable = /*#__PURE__*/function () { /** * @param {object} settings The Walkontable settings. */ function Walkontable(settings) { _classCallCheck(this, Walkontable); var originalHeaders = []; // this is the namespace for global events this.guid = "wt_".concat((0, _string.randomString)()); this.rootDocument = settings.table.ownerDocument; this.rootWindow = this.rootDocument.defaultView; // bootstrap from settings if (settings.cloneSource) { this.cloneSource = settings.cloneSource; this.cloneOverlay = settings.cloneOverlay; this.wtSettings = settings.cloneSource.wtSettings; this.wtTable = this.cloneOverlay.createTable(this, settings.table); this.wtScroll = new _scroll.default(this); this.wtViewport = settings.cloneSource.wtViewport; this.wtEvent = new _event.default(this); this.selections = this.cloneSource.selections; } else { this.wtSettings = new _settings.default(this, settings); this.wtTable = new _master.default(this, settings.table); this.wtScroll = new _scroll.default(this); this.wtViewport = new _viewport.default(this); this.wtEvent = new _event.default(this); this.selections = this.getSetting('selections'); this.wtOverlays = new _overlays.default(this); this.exportSettingsAsClassNames(); } // find original headers if (this.wtTable.THEAD.childNodes.length && this.wtTable.THEAD.childNodes[0].childNodes.length) { for (var c = 0, clen = this.wtTable.THEAD.childNodes[0].childNodes.length; c < clen; c++) { originalHeaders.push(this.wtTable.THEAD.childNodes[0].childNodes[c].innerHTML); } if (!this.getSetting('columnHeaders').length) { this.update('columnHeaders', [function (column, TH) { (0, _element.fastInnerText)(TH, originalHeaders[column]); }]); } } this.drawn = false; this.drawInterrupted = false; } /** * Force rerender of Walkontable. * * @param {boolean} [fastDraw=false] When `true`, try to refresh only the positions of borders without rerendering * the data. It will only work if Table.draw() does not force * rendering anyway. * @returns {Walkontable} */ _createClass(Walkontable, [{ key: "draw", value: function draw() { var fastDraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this.drawInterrupted = false; if (!fastDraw && !this.wtTable.isVisible()) { // draw interrupted because TABLE is not visible this.drawInterrupted = true; } else { this.wtTable.draw(fastDraw); } return this; } /** * Returns the TD at coords. If topmost is set to true, returns TD from the topmost overlay layer, * if not set or set to false, returns TD from the master table. * * @param {CellCoords} coords The cell coordinates. * @param {boolean} [topmost=false] If set to `true`, it returns the TD element from the topmost overlay. For example, * if the wanted cell is in the range of fixed rows, it will return a TD element * from the top overlay. * @returns {HTMLElement} */ }, { key: "getCell", value: function getCell(coords) { var topmost = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (!topmost) { return this.wtTable.getCell(coords); } var totalRows = this.wtSettings.getSetting('totalRows'); var fixedRowsTop = this.wtSettings.getSetting('fixedRowsTop'); var fixedRowsBottom = this.wtSettings.getSetting('fixedRowsBottom'); var fixedColumns = this.wtSettings.getSetting('fixedColumnsLeft'); if (coords.row < fixedRowsTop && coords.col < fixedColumns) { return this.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell(coords); } else if (coords.row < fixedRowsTop) { return this.wtOverlays.topOverlay.clone.wtTable.getCell(coords); } else if (coords.col < fixedColumns && coords.row >= totalRows - fixedRowsBottom) { if (this.wtOverlays.bottomLeftCornerOverlay && this.wtOverlays.bottomLeftCornerOverlay.clone) { return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(coords); } } else if (coords.col < fixedColumns) { return this.wtOverlays.leftOverlay.clone.wtTable.getCell(coords); } else if (coords.row < totalRows && coords.row >= totalRows - fixedRowsBottom) { if (this.wtOverlays.bottomOverlay && this.wtOverlays.bottomOverlay.clone) { return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(coords); } } return this.wtTable.getCell(coords); } /** * @param {object} settings The singular settings to update or if passed as object to merge with. * @param {*} value The value to set if the first argument is passed as string. * @returns {Walkontable} */ }, { key: "update", value: function update(settings, value) { return this.wtSettings.update(settings, value); } /** * Scrolls the viewport to a cell (rerenders if needed). * * @param {CellCoords} coords The cell coordinates to scroll to. * @param {boolean} [snapToTop] If `true`, viewport is scrolled to show the cell on the top of the table. * @param {boolean} [snapToRight] If `true`, viewport is scrolled to show the cell on the right of the table. * @param {boolean} [snapToBottom] If `true`, viewport is scrolled to show the cell on the bottom of the table. * @param {boolean} [snapToLeft] If `true`, viewport is scrolled to show the cell on the left of the table. * @returns {boolean} */ }, { key: "scrollViewport", value: function scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft) { if (coords.col < 0 || coords.row < 0) { return false; } return this.wtScroll.scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft); } /** * Scrolls the viewport to a column (rerenders if needed). * * @param {number} column Visual column index. * @param {boolean} [snapToRight] If `true`, viewport is scrolled to show the cell on the right of the table. * @param {boolean} [snapToLeft] If `true`, viewport is scrolled to show the cell on the left of the table. * @returns {boolean} */ }, { key: "scrollViewportHorizontally", value: function scrollViewportHorizontally(column, snapToRight, snapToLeft) { if (column < 0) { return false; } return this.wtScroll.scrollViewportHorizontally(column, snapToRight, snapToLeft); } /** * Scrolls the viewport to a row (rerenders if needed). * * @param {number} row Visual row index. * @param {boolean} [snapToTop] If `true`, viewport is scrolled to show the cell on the top of the table. * @param {boolean} [snapToBottom] If `true`, viewport is scrolled to show the cell on the bottom of the table. * @returns {boolean} */ }, { key: "scrollViewportVertically", value: function scrollViewportVertically(row, snapToTop, snapToBottom) { if (row < 0) { return false; } return this.wtScroll.scrollViewportVertically(row, snapToTop, snapToBottom); } /** * @returns {Array} */ }, { key: "getViewport", value: function getViewport() { return [this.wtTable.getFirstVisibleRow(), this.wtTable.getFirstVisibleColumn(), this.wtTable.getLastVisibleRow(), this.wtTable.getLastVisibleColumn()]; } /** * Get overlay name. * * @returns {string} */ }, { key: "getOverlayName", value: function getOverlayName() { return this.cloneOverlay ? this.cloneOverlay.type : 'master'; } /** * Export settings as class names added to the parent element of the table. */ }, { key: "exportSettingsAsClassNames", value: function exportSettingsAsClassNames() { var _this = this; var toExport = { rowHeaders: 'htRowHeaders', columnHeaders: 'htColumnHeaders' }; var allClassNames = []; var newClassNames = []; (0, _object.objectEach)(toExport, function (className, key) { if (_this.getSetting(key).length) { newClassNames.push(className); } allClassNames.push(className); }); (0, _element.removeClass)(this.wtTable.wtRootElement.parentNode, allClassNames); (0, _element.addClass)(this.wtTable.wtRootElement.parentNode, newClassNames); } /** * Get/Set Walkontable instance setting. * * @param {string} key The settings key to retrieve. * @param {*} [param1] Additional parameter passed to the options defined as function. * @param {*} [param2] Additional parameter passed to the options defined as function. * @param {*} [param3] Additional parameter passed to the options defined as function. * @param {*} [param4] Additional parameter passed to the options defined as function. * @returns {*} */ }, { key: "getSetting", value: function getSetting(key, param1, param2, param3, param4) { // this is faster than .apply - https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips return this.wtSettings.getSetting(key, param1, param2, param3, param4); } /** * Checks if setting exists. * * @param {string} key The settings key to check. * @returns {boolean} */ }, { key: "hasSetting", value: function hasSetting(key) { return this.wtSettings.has(key); } /** * Destroy instance. */ }, { key: "destroy", value: function destroy() { this.wtOverlays.destroy(); this.wtEvent.destroy(); } }]); return Walkontable; }(); var _default = Walkontable; exports.default = _default;