(root node)
* ├ --- RowHeadersRenderer
* ├ | \
* ├ | \
* ├ | - CellsRenderer
* ├ | /
* └ | /
*
* @class {CellsRenderer}
*/
var CellsRenderer =
/*#__PURE__*/
function (_BaseRenderer) {
(0, _inherits2.default)(CellsRenderer, _BaseRenderer);
function CellsRenderer() {
var _this;
(0, _classCallCheck2.default)(this, CellsRenderer);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CellsRenderer).call(this, 'TD'));
/**
* Cache for OrderView classes connected to specified node.
*
* @type {WeakMap}
*/
_this.orderViews = new WeakMap();
/**
* Row index which specifies the row position of the processed cell.
*
* @type {Number}
*/
_this.sourceRowIndex = 0;
return _this;
}
/**
* Obtains the instance of the SharedOrderView class which is responsible for rendering the nodes to the root node.
*
* @param {HTMLTableRowElement} rootNode The TR element, which is root element for cells (TD).
* @return {SharedOrderView}
*/
(0, _createClass2.default)(CellsRenderer, [{
key: "obtainOrderView",
value: function obtainOrderView(rootNode) {
var _this2 = this;
var orderView;
if (this.orderViews.has(rootNode)) {
orderView = this.orderViews.get(rootNode);
} else {
orderView = new _orderView.SharedOrderView(rootNode, function (sourceColumnIndex) {
return _this2.nodesPool.obtain(_this2.sourceRowIndex, sourceColumnIndex);
}, this.nodeType);
this.orderViews.set(rootNode, orderView);
}
return orderView;
}
/**
* Renders the cells.
*/
}, {
key: "render",
value: function render() {
var _this$table = this.table,
rowsToRender = _this$table.rowsToRender,
columnsToRender = _this$table.columnsToRender,
rows = _this$table.rows,
rowHeaders = _this$table.rowHeaders;
for (var visibleRowIndex = 0; visibleRowIndex < rowsToRender; visibleRowIndex++) {
var sourceRowIndex = this.table.renderedRowToSource(visibleRowIndex);
var TR = rows.getRenderedNode(visibleRowIndex);
this.sourceRowIndex = sourceRowIndex;
var orderView = this.obtainOrderView(TR);
var rowHeadersView = rowHeaders.obtainOrderView(TR); // @TODO(perf-tip): For cells other than "visual 0" generating diff leads/commands can be skipped. New order view
// shoule share state between next orderViews.
orderView.prependView(rowHeadersView).setSize(columnsToRender).setOffset(this.table.renderedColumnToSource(0)).start();
for (var visibleColumnIndex = 0; visibleColumnIndex < columnsToRender; visibleColumnIndex++) {
orderView.render();
var TD = orderView.getCurrentNode();
var sourceColumnIndex = this.table.renderedColumnToSource(visibleColumnIndex);
if (!(0, _element.hasClass)(TD, 'hide')) {
// Workaround for hidden columns plugin
TD.className = '';
}
TD.removeAttribute('style');
this.table.cellRenderer(sourceRowIndex, sourceColumnIndex, TD);
}
orderView.end();
}
}
}]);
return CellsRenderer;
}(_base.default);
exports.default = CellsRenderer;
/***/ }),
/* 316 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
/**
* TableRenderer class collects all renderers and properties necessary for table creation. It's
* responsible for adjusting and rendering each renderer.
*
* Below is a diagram of the renderers together with an indication of what they are responisble for.
*
* \ (root node)
* \
* \___ ColGroupRenderer
* /
* /
* /
* \ (root node)
* \
* \
* | \____ ColumnHeadersRenderer
* | /
* | /
* | /
* /
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\ (root node)
* (root node) \
* --- RowHeadersRenderer
* | \ \
* | -- CellsRenderer \
* | / \
* | \
* (root node) \
* --- RowHeadersRenderer \
* | \ \___ RowsRenderer
* | -- CellsRenderer /
* | / /
* | /
* (root node) /
* --- RowHeadersRenderer /
* | \ /
* | -- CellsRenderer /
* | / /
* | /
* ___________________/
*
*
* @class {RowsRenderer}
*/
var TableRenderer =
/*#__PURE__*/
function () {
function TableRenderer(rootNode) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
cellRenderer = _ref.cellRenderer;
(0, _classCallCheck2.default)(this, TableRenderer);
/**
* Table element which will be used to render the children element.
*
* @type {HTMLTableElement}
*/
this.rootNode = rootNode;
/**
* Document owner of the root node.
*
* @type {HTMLDocument}
*/
this.rootDocument = this.rootNode.ownerDocument;
/**
* Renderer class responsible for rendering row headers.
*
* @type {RowsRenderer}
*/
this.rowHeaders = null;
/**
* Renderer class responsible for rendering column headers.
*
* @type {ColumnHeadersRenderer}
*/
this.columnHeaders = null;
/**
* Renderer class responsible for rendering col in colgroup.
*
* @type {ColGroupRenderer}
*/
this.colGroup = null;
/**
* Renderer class responsible for rendering rows in tbody.
*
* @type {RowsRenderer}
*/
this.rows = null;
/**
* Renderer class responsible for rendering cells.
*
* @type {CellsRenderer}
*/
this.cells = null;
/**
* Row filter which contains all necessary information about row index transformation.
*
* @type {RowFilter}
*/
this.rowFilter = null;
/**
* Column filter which contains all necessary information about column index transformation.
*
* @type {ColumnFilter}
*/
this.columnFilter = null;
/**
* Row utils class which contains all necessary information about sizes of the rows.
*
* @type {RowUtils}
*/
this.rowUtils = null;
/**
* Column utils class which contains all necessary information about sizes of the columns.
*
* @type {ColumnUtils}
*/
this.columnUtils = null;
/**
* Indicates how much rows should be rendered to fill whole table viewport.
*
* @type {Number}
*/
this.rowsToRender = 0;
/**
* Indicates how much columns should be rendered to fill whole table viewport.
*
* @type {Number}
*/
this.columnsToRender = 0;
/**
* An array of functions to be used as a content factory to row headers.
*
* @type {Function[]}
*/
this.rowHeaderFunctions = [];
/**
* Count of the function used to render row headers.
*
* @type {Number}
*/
this.rowHeadersCount = 0;
/**
* An array of functions to be used as a content factory to column headers.
*
* @type {Function[]}
*/
this.columnHeaderFunctions = [];
/**
* Count of the function used to render column headers.
*
* @type {Number}
*/
this.columnHeadersCount = 0;
/**
* Cell renderer used to render cells content.
*
* @type {Function}
*/
this.cellRenderer = cellRenderer;
}
/**
* Set row and column util classes.
*
* @param {RowUtils} rowUtils RowUtils instance which provides useful methods related to row sizes.
* @param {ColumnUtils} columnUtils ColumnUtils instance which provides useful methods related to row sizes.
*/
(0, _createClass2.default)(TableRenderer, [{
key: "setAxisUtils",
value: function setAxisUtils(rowUtils, columnUtils) {
this.rowUtils = rowUtils;
this.columnUtils = columnUtils;
}
/**
* Sets viewport size of the table.
*
* @param {Number} rowsCount An amount of rows to render.
* @param {Number} columnsCount An amount of columns to render.
*/
}, {
key: "setViewportSize",
value: function setViewportSize(rowsCount, columnsCount) {
this.rowsToRender = rowsCount;
this.columnsToRender = columnsCount;
}
/**
* Sets row and column filter instances.
*
* @param {RowFilter} rowFilter Row filter instance which contains all necessary information about row index transformation.
* @param {ColumnFilter} columnFilter Cokumn filter instance which contains all necessary information about row index transformation.
*/
}, {
key: "setFilters",
value: function setFilters(rowFilter, columnFilter) {
this.rowFilter = rowFilter;
this.columnFilter = columnFilter;
}
/**
* Sets row and column header functions.
*
* @param {Function[]} rowHeaders Row header functions. Factories for creating content for row headers.
* @param {Function[]} columnHeaders Column header functions. Factories for creating content for column headers.
*/
}, {
key: "setHeaderContentRenderers",
value: function setHeaderContentRenderers(rowHeaders, columnHeaders) {
this.rowHeaderFunctions = rowHeaders;
this.rowHeadersCount = rowHeaders.length;
this.columnHeaderFunctions = columnHeaders;
this.columnHeadersCount = columnHeaders.length;
}
/**
* Sets table renderers.
*
* @param {RowHeadersRenderer} renderers.rowHeaders Row headers renderer.
* @param {ColumnHeadersRenderer} renderers.columnHeaders Column headers renderer.
* @param {ColGroupRenderer} renderers.colGroup Col group renderer.
* @param {RowsRenderer} renderers.rows Rows renderer.
* @param {CellsRenderer} renderers.cells Cells renderer.
*/
}, {
key: "setRenderers",
value: function setRenderers() {
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
rowHeaders = _ref2.rowHeaders,
columnHeaders = _ref2.columnHeaders,
colGroup = _ref2.colGroup,
rows = _ref2.rows,
cells = _ref2.cells;
rowHeaders.setTable(this);
columnHeaders.setTable(this);
colGroup.setTable(this);
rows.setTable(this);
cells.setTable(this);
this.rowHeaders = rowHeaders;
this.columnHeaders = columnHeaders;
this.colGroup = colGroup;
this.rows = rows;
this.cells = cells;
}
/**
* Transforms visual/rendered row index to source index.
*
* @param {Number} rowIndex Rendered index.
* @return {Number}
*/
}, {
key: "renderedRowToSource",
value: function renderedRowToSource(rowIndex) {
return this.rowFilter.renderedToSource(rowIndex);
}
/**
* Transforms visual/rendered column index to source index.
*
* @param {Number} columnIndex Rendered index.
* @return {Number}
*/
}, {
key: "renderedColumnToSource",
value: function renderedColumnToSource(columnIndex) {
return this.columnFilter.renderedToSource(columnIndex);
}
/**
* Renders the table.
*/
}, {
key: "render",
value: function render() {
this.colGroup.adjust();
this.columnHeaders.adjust();
this.rows.adjust();
this.rowHeaders.adjust();
this.columnHeaders.render();
this.rows.render();
this.rowHeaders.render();
this.cells.render(); // After the cells are rendered calculate columns width (or columns stretch width) to prepare proper values
// for colGroup renderer (which renders COL elements).
this.columnUtils.calculateWidths();
this.colGroup.render();
var rowsToRender = this.rowsToRender,
rows = this.rows; // Fix for multi-line content and for supporting `rowHeights` option.
for (var visibleRowIndex = 0; visibleRowIndex < rowsToRender; visibleRowIndex++) {
var TR = rows.getRenderedNode(visibleRowIndex);
if (TR.firstChild) {
var sourceRowIndex = this.renderedRowToSource(visibleRowIndex);
var rowHeight = this.rowUtils.getHeight(sourceRowIndex);
if (rowHeight) {
// Decrease height. 1 pixel will be "replaced" by 1px border top
TR.firstChild.style.height = "".concat(rowHeight - 1, "px");
} else {
TR.firstChild.style.height = '';
}
}
}
}
}]);
return TableRenderer;
}();
exports.default = TableRenderer;
/***/ }),
/* 317 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
var _exportNames = {
ViewportColumnsCalculator: true,
ViewportRowsCalculator: true
};
var _viewportColumns = _interopRequireDefault(__webpack_require__(223));
exports.ViewportColumnsCalculator = _viewportColumns.default;
var _viewportRows = _interopRequireDefault(__webpack_require__(224));
exports.ViewportRowsCalculator = _viewportRows.default;
var _constants = __webpack_require__(174);
Object.keys(_constants).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
exports[key] = _constants[key];
});
/***/ }),
/* 318 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(15);
__webpack_require__(68);
__webpack_require__(10);
__webpack_require__(13);
__webpack_require__(16);
exports.__esModule = true;
exports.default = void 0;
var _typeof2 = _interopRequireDefault(__webpack_require__(42));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _element = __webpack_require__(8);
/**
* Column utils class contains all necessary information about sizes of the columns.
*
* @class {ColumnUtils}
*/
var ColumnUtils =
/*#__PURE__*/
function () {
function ColumnUtils(wot) {
(0, _classCallCheck2.default)(this, ColumnUtils);
this.wot = wot;
this.headerWidths = new Map();
}
/**
* Returns column width based on passed source index.
*
* @param {Number} sourceIndex Column source index.
* @returns {Number}
*/
(0, _createClass2.default)(ColumnUtils, [{
key: "getWidth",
value: function getWidth(sourceIndex) {
var width = this.wot.wtSettings.settings.columnWidth;
if (typeof width === 'function') {
width = width(sourceIndex);
} else if ((0, _typeof2.default)(width) === 'object') {
width = width[sourceIndex];
}
return width || this.wot.wtSettings.settings.defaultColumnWidth;
}
/**
* Returns stretched column width based on passed source index.
*
* @param {Number} sourceIndex Column source index.
* @returns {Number}
*/
}, {
key: "getStretchedColumnWidth",
value: function getStretchedColumnWidth(sourceIndex) {
var columnWidth = this.getWidth(sourceIndex);
var calculator = this.wot.wtViewport.columnsRenderCalculator;
var width = columnWidth === null || columnWidth === void 0 ? this.wot.wtSettings.settings.defaultColumnWidth : columnWidth;
if (calculator) {
var stretchedWidth = calculator.getStretchedColumnWidth(sourceIndex, width);
if (stretchedWidth) {
width = stretchedWidth;
}
}
return width;
}
/**
* Returns column header height based on passed header level.
*
* @param {Number} level Column header level.
* @returns {Number}
*/
}, {
key: "getHeaderHeight",
value: function getHeaderHeight(level) {
var height = this.wot.wtSettings.settings.defaultRowHeight;
var oversizedHeight = this.wot.wtViewport.oversizedColumnHeaders[level];
if (oversizedHeight !== void 0) {
height = height ? Math.max(height, oversizedHeight) : oversizedHeight;
}
return height;
}
/**
* Returns column header width based on passed source index.
*
* @param {Number} sourceIndex Column source index.
* @returns {Number}
*/
}, {
key: "getHeaderWidth",
value: function getHeaderWidth(sourceIndex) {
return this.headerWidths.get(this.wot.wtTable.columnFilter.sourceToRendered(sourceIndex));
}
/**
* Calculates column header widths that can be retrieved from the cache.
*/
}, {
key: "calculateWidths",
value: function calculateWidths() {
var wot = this.wot;
var wtTable = wot.wtTable,
wtViewport = wot.wtViewport,
cloneSource = wot.cloneSource;
var mainHolder = cloneSource ? cloneSource.wtTable.holder : wtTable.holder;
var scrollbarCompensation = mainHolder.offsetHeight < mainHolder.scrollHeight ? (0, _element.getScrollbarWidth)() : 0;
var rowHeaderWidthSetting = wot.getSetting('rowHeaderWidth');
wtViewport.columnsRenderCalculator.refreshStretching(wtViewport.getViewportWidth() - scrollbarCompensation);
rowHeaderWidthSetting = wot.getSetting('onModifyRowHeaderWidth', rowHeaderWidthSetting);
if (rowHeaderWidthSetting !== null && rowHeaderWidthSetting !== void 0) {
var rowHeadersCount = wot.getSetting('rowHeaders').length;
var defaultColumnWidth = wot.getSetting('defaultColumnWidth');
for (var visibleColumnIndex = 0; visibleColumnIndex < rowHeadersCount; visibleColumnIndex++) {
var width = Array.isArray(rowHeaderWidthSetting) ? rowHeaderWidthSetting[visibleColumnIndex] : rowHeaderWidthSetting;
width = width === null || width === void 0 ? defaultColumnWidth : width;
this.headerWidths.set(visibleColumnIndex, width);
}
}
}
}]);
return ColumnUtils;
}();
exports.default = ColumnUtils;
/***/ }),
/* 319 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
/**
* Row utils class contains all necessary information about sizes of the rows.
*
* @class {RowUtils}
*/
var RowUtils =
/*#__PURE__*/
function () {
function RowUtils(wot) {
(0, _classCallCheck2.default)(this, RowUtils);
this.wot = wot;
}
/**
* Returns row height based on passed source index.
*
* @param {Number} sourceIndex Row source index.
* @returns {Number}
*/
(0, _createClass2.default)(RowUtils, [{
key: "getHeight",
value: function getHeight(sourceIndex) {
var height = this.wot.wtSettings.settings.rowHeight(sourceIndex);
var oversizedHeight = this.wot.wtViewport.oversizedRows[sourceIndex];
if (oversizedHeight !== void 0) {
height = height === void 0 ? oversizedHeight : Math.max(height, oversizedHeight);
}
return height;
}
}]);
return RowUtils;
}();
exports.default = RowUtils;
/***/ }),
/* 320 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _construct2 = _interopRequireDefault(__webpack_require__(122));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _left = _interopRequireDefault(__webpack_require__(321));
var _base = _interopRequireDefault(__webpack_require__(92));
/**
* @class LeftOverlay
*/
var LeftOverlay =
/*#__PURE__*/
function (_Overlay) {
(0, _inherits2.default)(LeftOverlay, _Overlay);
/**
* @param {Walkontable} wotInstance
*/
function LeftOverlay(wotInstance) {
var _this;
(0, _classCallCheck2.default)(this, LeftOverlay);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(LeftOverlay).call(this, wotInstance));
_this.clone = _this.makeClone(_base.default.CLONE_LEFT);
return _this;
}
/**
* Factory method to create a subclass of `Table` that is relevant to this overlay.
*
* @see Table#constructor
* @param {...*} args Parameters that will be forwarded to the `Table` constructor
* @returns {Table}
*/
(0, _createClass2.default)(LeftOverlay, [{
key: "createTable",
value: function createTable() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (0, _construct2.default)(_left.default, args);
}
/**
* Checks if overlay should be fully rendered.
*
* @returns {Boolean}
*/
}, {
key: "shouldBeRendered",
value: function shouldBeRendered() {
return !!(this.wot.getSetting('fixedColumnsLeft') || this.wot.getSetting('rowHeaders').length);
}
/**
* Updates the left overlay position.
*/
}, {
key: "resetFixedPosition",
value: function resetFixedPosition() {
var wtTable = this.wot.wtTable;
if (!this.needFullRender || !wtTable.holder.parentNode) {
// removed from DOM
return;
}
var overlayRoot = this.clone.wtTable.holder.parentNode;
var headerPosition = 0;
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer === this.wot.rootWindow && (!preventOverflow || preventOverflow !== 'horizontal')) {
var box = wtTable.hider.getBoundingClientRect();
var left = Math.ceil(box.left);
var right = Math.ceil(box.right);
var finalLeft;
var finalTop;
finalTop = wtTable.hider.style.top;
finalTop = finalTop === '' ? 0 : finalTop;
if (left < 0 && right - overlayRoot.offsetWidth > 0) {
finalLeft = -left;
} else {
finalLeft = 0;
}
headerPosition = finalLeft;
finalLeft += 'px';
(0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);
} else {
headerPosition = this.getScrollPosition();
(0, _element.resetCssTransform)(overlayRoot);
}
this.adjustHeaderBordersPosition(headerPosition);
this.adjustElementsSize();
}
/**
* Sets the main overlay's horizontal scroll position.
*
* @param {Number} pos
* @returns {Boolean}
*/
}, {
key: "setScrollPosition",
value: function setScrollPosition(pos) {
var rootWindow = this.wot.rootWindow;
var result = false;
if (this.mainTableScrollableElement === rootWindow && rootWindow.scrollX !== pos) {
rootWindow.scrollTo(pos, (0, _element.getWindowScrollTop)(rootWindow));
result = true;
} else if (this.mainTableScrollableElement.scrollLeft !== pos) {
this.mainTableScrollableElement.scrollLeft = pos;
result = true;
}
return result;
}
/**
* Triggers onScroll hook callback.
*/
}, {
key: "onScroll",
value: function onScroll() {
this.wot.getSetting('onScrollVertically');
}
/**
* Calculates total sum cells width.
*
* @param {Number} from Column index which calculates started from.
* @param {Number} to Column index where calculation is finished.
* @returns {Number} Width sum.
*/
}, {
key: "sumCellSizes",
value: function sumCellSizes(from, to) {
var defaultColumnWidth = this.wot.wtSettings.defaultColumnWidth;
var column = from;
var sum = 0;
while (column < to) {
sum += this.wot.wtTable.getStretchedColumnWidth(column) || defaultColumnWidth;
column += 1;
}
return sum;
}
/**
* Adjust overlay root element, childs and master table element sizes (width, height).
*
* @param {Boolean} [force=false]
*/
}, {
key: "adjustElementsSize",
value: function adjustElementsSize() {
var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
this.updateTrimmingContainer();
if (this.needFullRender || force) {
this.adjustRootElementSize();
this.adjustRootChildrenSize();
if (!force) {
this.areElementSizesAdjusted = true;
}
}
}
/**
* Adjust overlay root element size (width and height).
*/
}, {
key: "adjustRootElementSize",
value: function adjustRootElementSize() {
var _this$wot = this.wot,
wtTable = _this$wot.wtTable,
rootDocument = _this$wot.rootDocument,
rootWindow = _this$wot.rootWindow;
var scrollbarHeight = (0, _element.getScrollbarWidth)(rootDocument);
var overlayRoot = this.clone.wtTable.holder.parentNode;
var overlayRootStyle = overlayRoot.style;
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer !== rootWindow || preventOverflow === 'vertical') {
var height = this.wot.wtViewport.getWorkspaceHeight();
if (this.wot.wtOverlays.hasScrollbarBottom) {
height -= scrollbarHeight;
}
height = Math.min(height, wtTable.wtRootElement.scrollHeight);
overlayRootStyle.height = "".concat(height, "px");
} else {
overlayRootStyle.height = '';
}
this.clone.wtTable.holder.style.height = overlayRootStyle.height;
var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);
overlayRootStyle.width = "".concat(tableWidth === 0 ? tableWidth : tableWidth + 4, "px");
}
/**
* Adjust overlay root childs size.
*/
}, {
key: "adjustRootChildrenSize",
value: function adjustRootChildrenSize() {
var scrollbarWidth = (0, _element.getScrollbarWidth)(this.wot.rootDocument);
this.clone.wtTable.hider.style.height = this.hider.style.height;
this.clone.wtTable.holder.style.height = this.clone.wtTable.holder.parentNode.style.height;
if (scrollbarWidth === 0) {
scrollbarWidth = 30;
}
this.clone.wtTable.holder.style.width = "".concat(parseInt(this.clone.wtTable.holder.parentNode.style.width, 10) + scrollbarWidth, "px");
}
/**
* Adjust the overlay dimensions and position.
*/
}, {
key: "applyToDOM",
value: function applyToDOM() {
var total = this.wot.getSetting('totalColumns');
if (!this.areElementSizesAdjusted) {
this.adjustElementsSize();
}
if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {
this.spreader.style.left = "".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition, "px");
} else if (total === 0) {
this.spreader.style.left = '0';
} else {
throw new Error('Incorrect value of the columnsRenderCalculator');
}
this.spreader.style.right = '';
if (this.needFullRender) {
this.syncOverlayOffset();
}
}
/**
* Synchronize calculated top position to an element.
*/
}, {
key: "syncOverlayOffset",
value: function syncOverlayOffset() {
if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {
this.clone.wtTable.spreader.style.top = "".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition, "px");
} else {
this.clone.wtTable.spreader.style.top = '';
}
}
/**
* Scrolls horizontally to a column at the left edge of the viewport.
*
* @param {Number} sourceCol Column index which you want to scroll to.
* @param {Boolean} [beyondRendered] if `true`, scrolls according to the bottom edge (top edge is by default).
* @returns {Boolean}
*/
}, {
key: "scrollTo",
value: function scrollTo(sourceCol, beyondRendered) {
var newX = this.getTableParentOffset();
var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;
var mainHolder = sourceInstance.wtTable.holder;
var scrollbarCompensation = 0;
if (beyondRendered && mainHolder.offsetWidth !== mainHolder.clientWidth) {
scrollbarCompensation = (0, _element.getScrollbarWidth)(this.wot.rootDocument);
}
if (beyondRendered) {
newX += this.sumCellSizes(0, sourceCol + 1);
newX -= this.wot.wtViewport.getViewportWidth();
} else {
newX += this.sumCellSizes(this.wot.getSetting('fixedColumnsLeft'), sourceCol);
}
newX += scrollbarCompensation;
return this.setScrollPosition(newX);
}
/**
* Gets table parent left position.
*
* @returns {Number}
*/
}, {
key: "getTableParentOffset",
value: function getTableParentOffset() {
var preventOverflow = this.wot.getSetting('preventOverflow');
var offset = 0;
if (!preventOverflow && this.trimmingContainer === this.wot.rootWindow) {
offset = this.wot.wtTable.holderOffset.left;
}
return offset;
}
/**
* Gets the main overlay's horizontal scroll position.
*
* @returns {Number} Main table's vertical scroll position.
*/
}, {
key: "getScrollPosition",
value: function getScrollPosition() {
return (0, _element.getScrollLeft)(this.mainTableScrollableElement, this.wot.rootWindow);
}
/**
* Adds css classes to hide the header border's header (cell-selection border hiding issue).
*
* @param {Number} position Header X position if trimming container is window or scroll top if not.
*/
}, {
key: "adjustHeaderBordersPosition",
value: function adjustHeaderBordersPosition(position) {
var masterParent = this.wot.wtTable.holder.parentNode;
var rowHeaders = this.wot.getSetting('rowHeaders');
var fixedColumnsLeft = this.wot.getSetting('fixedColumnsLeft');
var totalRows = this.wot.getSetting('totalRows');
if (totalRows) {
(0, _element.removeClass)(masterParent, 'emptyRows');
} else {
(0, _element.addClass)(masterParent, 'emptyRows');
}
if (fixedColumnsLeft && !rowHeaders.length) {
(0, _element.addClass)(masterParent, 'innerBorderLeft');
} else if (!fixedColumnsLeft && rowHeaders.length) {
var previousState = (0, _element.hasClass)(masterParent, 'innerBorderLeft');
if (position) {
(0, _element.addClass)(masterParent, 'innerBorderLeft');
} else {
(0, _element.removeClass)(masterParent, 'innerBorderLeft');
}
if (!previousState && position || previousState && !position) {
this.wot.wtOverlays.adjustElementsSize();
}
}
}
}]);
return LeftOverlay;
}(_base.default);
_base.default.registerOverlay(_base.default.CLONE_LEFT, LeftOverlay);
var _default = LeftOverlay;
exports.default = _default;
/***/ }),
/* 321 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _table = _interopRequireDefault(__webpack_require__(95));
var _calculatedRows = _interopRequireDefault(__webpack_require__(243));
var _stickyColumnsLeft = _interopRequireDefault(__webpack_require__(179));
var _object = __webpack_require__(3);
/**
* Subclass of `Table` that provides the helper methods relevant to LeftOverlay, implemented through mixins.
*/
var LeftOverlayTable =
/*#__PURE__*/
function (_Table) {
(0, _inherits2.default)(LeftOverlayTable, _Table);
function LeftOverlayTable() {
(0, _classCallCheck2.default)(this, LeftOverlayTable);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(LeftOverlayTable).apply(this, arguments));
}
return LeftOverlayTable;
}(_table.default);
(0, _object.mixin)(LeftOverlayTable, _calculatedRows.default);
(0, _object.mixin)(LeftOverlayTable, _stickyColumnsLeft.default);
var _default = LeftOverlayTable;
exports.default = _default;
/***/ }),
/* 322 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _construct2 = _interopRequireDefault(__webpack_require__(122));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _array = __webpack_require__(4);
var _top = _interopRequireDefault(__webpack_require__(323));
var _base = _interopRequireDefault(__webpack_require__(92));
/**
* @class TopOverlay
*/
var TopOverlay =
/*#__PURE__*/
function (_Overlay) {
(0, _inherits2.default)(TopOverlay, _Overlay);
/**
* @param {Walkontable} wotInstance
*/
function TopOverlay(wotInstance) {
var _this;
(0, _classCallCheck2.default)(this, TopOverlay);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TopOverlay).call(this, wotInstance));
_this.clone = _this.makeClone(_base.default.CLONE_TOP);
return _this;
}
/**
* Factory method to create a subclass of `Table` that is relevant to this overlay.
*
* @see Table#constructor
* @param {...*} args Parameters that will be forwarded to the `Table` constructor
* @returns {Table}
*/
(0, _createClass2.default)(TopOverlay, [{
key: "createTable",
value: function createTable() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (0, _construct2.default)(_top.default, args);
}
/**
* Checks if overlay should be fully rendered.
*
* @returns {Boolean}
*/
}, {
key: "shouldBeRendered",
value: function shouldBeRendered() {
return !!(this.wot.getSetting('fixedRowsTop') || this.wot.getSetting('columnHeaders').length);
}
/**
* Updates the top overlay position.
*/
}, {
key: "resetFixedPosition",
value: function resetFixedPosition() {
if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {
// removed from DOM
return;
}
var overlayRoot = this.clone.wtTable.holder.parentNode;
var headerPosition = 0;
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer === this.wot.rootWindow && (!preventOverflow || preventOverflow !== 'vertical')) {
var wtTable = this.wot.wtTable;
var box = wtTable.hider.getBoundingClientRect();
var top = Math.ceil(box.top);
var bottom = Math.ceil(box.bottom);
var finalLeft;
var finalTop;
finalLeft = wtTable.hider.style.left;
finalLeft = finalLeft === '' ? 0 : finalLeft;
if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {
finalTop = -top;
} else {
finalTop = 0;
}
headerPosition = finalTop;
finalTop += 'px';
(0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);
} else {
headerPosition = this.getScrollPosition();
(0, _element.resetCssTransform)(overlayRoot);
}
this.adjustHeaderBordersPosition(headerPosition);
this.adjustElementsSize();
}
/**
* Sets the main overlay's vertical scroll position.
*
* @param {Number} pos
* @returns {Boolean}
*/
}, {
key: "setScrollPosition",
value: function setScrollPosition(pos) {
var rootWindow = this.wot.rootWindow;
var result = false;
if (this.mainTableScrollableElement === rootWindow && rootWindow.scrollY !== pos) {
rootWindow.scrollTo((0, _element.getWindowScrollLeft)(rootWindow), pos);
result = true;
} else if (this.mainTableScrollableElement.scrollTop !== pos) {
this.mainTableScrollableElement.scrollTop = pos;
result = true;
}
return result;
}
/**
* Triggers onScroll hook callback.
*/
}, {
key: "onScroll",
value: function onScroll() {
this.wot.getSetting('onScrollHorizontally');
}
/**
* Calculates total sum cells height.
*
* @param {Number} from Row index which calculates started from.
* @param {Number} to Row index where calculation is finished.
* @returns {Number} Height sum.
*/
}, {
key: "sumCellSizes",
value: function sumCellSizes(from, to) {
var defaultRowHeight = this.wot.wtSettings.settings.defaultRowHeight;
var row = from;
var sum = 0;
while (row < to) {
var height = this.wot.wtTable.getRowHeight(row);
sum += height === void 0 ? defaultRowHeight : height;
row += 1;
}
return sum;
}
/**
* Adjust overlay root element, childs and master table element sizes (width, height).
*
* @param {Boolean} [force=false]
*/
}, {
key: "adjustElementsSize",
value: function adjustElementsSize() {
var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
this.updateTrimmingContainer();
if (this.needFullRender || force) {
this.adjustRootElementSize();
this.adjustRootChildrenSize();
if (!force) {
this.areElementSizesAdjusted = true;
}
}
}
/**
* Adjust overlay root element size (width and height).
*/
}, {
key: "adjustRootElementSize",
value: function adjustRootElementSize() {
var _this$wot = this.wot,
wtTable = _this$wot.wtTable,
rootDocument = _this$wot.rootDocument,
rootWindow = _this$wot.rootWindow;
var scrollbarWidth = (0, _element.getScrollbarWidth)(rootDocument);
var overlayRoot = this.clone.wtTable.holder.parentNode;
var overlayRootStyle = overlayRoot.style;
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer !== rootWindow || preventOverflow === 'horizontal') {
var width = this.wot.wtViewport.getWorkspaceWidth();
if (this.wot.wtOverlays.hasScrollbarRight) {
width -= scrollbarWidth;
}
width = Math.min(width, wtTable.wtRootElement.scrollWidth);
overlayRootStyle.width = "".concat(width, "px");
} else {
overlayRootStyle.width = '';
}
this.clone.wtTable.holder.style.width = overlayRootStyle.width;
var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);
if (!this.wot.wtTable.hasDefinedSize()) {
tableHeight = 0;
}
overlayRootStyle.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight + 4, "px");
}
/**
* Adjust overlay root childs size.
*/
}, {
key: "adjustRootChildrenSize",
value: function adjustRootChildrenSize() {
var scrollbarWidth = (0, _element.getScrollbarWidth)(this.wot.rootDocument);
this.clone.wtTable.hider.style.width = this.hider.style.width;
this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width;
if (scrollbarWidth === 0) {
scrollbarWidth = 30;
}
this.clone.wtTable.holder.style.height = "".concat(parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth, "px");
}
/**
* Adjust the overlay dimensions and position.
*/
}, {
key: "applyToDOM",
value: function applyToDOM() {
var total = this.wot.getSetting('totalRows');
if (!this.areElementSizesAdjusted) {
this.adjustElementsSize();
}
if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {
this.spreader.style.top = "".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition, "px");
} else if (total === 0) {
// can happen if there are 0 rows
this.spreader.style.top = '0';
} else {
throw new Error('Incorrect value of the rowsRenderCalculator');
}
this.spreader.style.bottom = '';
if (this.needFullRender) {
this.syncOverlayOffset();
}
}
/**
* Synchronize calculated left position to an element.
*/
}, {
key: "syncOverlayOffset",
value: function syncOverlayOffset() {
if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {
this.clone.wtTable.spreader.style.left = "".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition, "px");
} else {
this.clone.wtTable.spreader.style.left = '';
}
}
/**
* Scrolls vertically to a row.
*
* @param {Number} sourceRow Row index which you want to scroll to.
* @param {Boolean} [bottomEdge] if `true`, scrolls according to the bottom edge (top edge is by default).
* @returns {Boolean}
*/
}, {
key: "scrollTo",
value: function scrollTo(sourceRow, bottomEdge) {
var wot = this.wot;
var sourceInstance = wot.cloneSource ? wot.cloneSource : wot;
var mainHolder = sourceInstance.wtTable.holder;
var newY = this.getTableParentOffset();
var scrollbarCompensation = 0;
if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) {
scrollbarCompensation = (0, _element.getScrollbarWidth)(wot.rootDocument);
}
if (bottomEdge) {
var fixedRowsBottom = wot.getSetting('fixedRowsBottom');
var totalRows = wot.getSetting('totalRows');
newY += this.sumCellSizes(0, sourceRow + 1);
newY -= wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows); // Fix 1 pixel offset when cell is selected
newY += 1;
} else {
newY += this.sumCellSizes(wot.getSetting('fixedRowsTop'), sourceRow);
}
newY += scrollbarCompensation;
return this.setScrollPosition(newY);
}
/**
* Gets table parent top position.
*
* @returns {Number}
*/
}, {
key: "getTableParentOffset",
value: function getTableParentOffset() {
if (this.mainTableScrollableElement === this.wot.rootWindow) {
return this.wot.wtTable.holderOffset.top;
}
return 0;
}
/**
* Gets the main overlay's vertical scroll position.
*
* @returns {Number} Main table's vertical scroll position.
*/
}, {
key: "getScrollPosition",
value: function getScrollPosition() {
return (0, _element.getScrollTop)(this.mainTableScrollableElement, this.wot.rootWindow);
}
/**
* Redraw borders of selection.
*
* @param {WalkontableSelection} selection Selection for redraw.
*/
}, {
key: "redrawSelectionBorders",
value: function redrawSelectionBorders(selection) {
if (selection && selection.cellRange) {
var border = selection.getBorder(this.wot);
var corners = selection.getCorners();
border.disappear();
border.appear(corners);
}
}
/**
* Redrawing borders of all selections.
*/
}, {
key: "redrawAllSelectionsBorders",
value: function redrawAllSelectionsBorders() {
var _this2 = this;
var selections = this.wot.selections;
this.redrawSelectionBorders(selections.getCell());
(0, _array.arrayEach)(selections.getAreas(), function (area) {
_this2.redrawSelectionBorders(area);
});
this.redrawSelectionBorders(selections.getFill());
this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh();
}
/**
* Adds css classes to hide the header border's header (cell-selection border hiding issue).
*
* @param {Number} position Header Y position if trimming container is window or scroll top if not.
*/
}, {
key: "adjustHeaderBordersPosition",
value: function adjustHeaderBordersPosition(position) {
var masterParent = this.wot.wtTable.holder.parentNode;
var totalColumns = this.wot.getSetting('totalColumns');
if (totalColumns) {
(0, _element.removeClass)(masterParent, 'emptyColumns');
} else {
(0, _element.addClass)(masterParent, 'emptyColumns');
}
if (this.wot.getSetting('fixedRowsTop') === 0 && this.wot.getSetting('columnHeaders').length > 0) {
var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop');
if (position || this.wot.getSetting('totalRows') === 0) {
(0, _element.addClass)(masterParent, 'innerBorderTop');
} else {
(0, _element.removeClass)(masterParent, 'innerBorderTop');
}
if (!previousState && position || previousState && !position) {
this.wot.wtOverlays.adjustElementsSize(); // cell borders should be positioned once again,
// because we added / removed 1px border from table header
this.redrawAllSelectionsBorders();
}
} // nasty workaround for double border in the header, TODO: find a pure-css solution
if (this.wot.getSetting('rowHeaders').length === 0) {
var secondHeaderCell = this.clone.wtTable.THEAD.querySelectorAll('th:nth-of-type(2)');
if (secondHeaderCell) {
for (var i = 0; i < secondHeaderCell.length; i++) {
secondHeaderCell[i].style['border-left-width'] = 0;
}
}
}
}
}]);
return TopOverlay;
}(_base.default);
_base.default.registerOverlay(_base.default.CLONE_TOP, TopOverlay);
var _default = TopOverlay;
exports.default = _default;
/***/ }),
/* 323 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _table = _interopRequireDefault(__webpack_require__(95));
var _stickyRowsTop = _interopRequireDefault(__webpack_require__(244));
var _calculatedColumns = _interopRequireDefault(__webpack_require__(178));
var _object = __webpack_require__(3);
/**
* Subclass of `Table` that provides the helper methods relevant to TopOverlay, implemented through mixins.
*/
var TopOverlayTable =
/*#__PURE__*/
function (_Table) {
(0, _inherits2.default)(TopOverlayTable, _Table);
function TopOverlayTable() {
(0, _classCallCheck2.default)(this, TopOverlayTable);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TopOverlayTable).apply(this, arguments));
}
return TopOverlayTable;
}(_table.default);
(0, _object.mixin)(TopOverlayTable, _stickyRowsTop.default);
(0, _object.mixin)(TopOverlayTable, _calculatedColumns.default);
var _default = TopOverlayTable;
exports.default = _default;
/***/ }),
/* 324 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _construct2 = _interopRequireDefault(__webpack_require__(122));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _topLeftCorner = _interopRequireDefault(__webpack_require__(325));
var _base = _interopRequireDefault(__webpack_require__(92));
/**
* @class TopLeftCornerOverlay
*/
var TopLeftCornerOverlay =
/*#__PURE__*/
function (_Overlay) {
(0, _inherits2.default)(TopLeftCornerOverlay, _Overlay);
/**
* @param {Walkontable} wotInstance
*/
function TopLeftCornerOverlay(wotInstance) {
var _this;
(0, _classCallCheck2.default)(this, TopLeftCornerOverlay);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TopLeftCornerOverlay).call(this, wotInstance));
_this.clone = _this.makeClone(_base.default.CLONE_TOP_LEFT_CORNER);
return _this;
}
/**
* Factory method to create a subclass of `Table` that is relevant to this overlay.
*
* @see Table#constructor
* @param {...*} args Parameters that will be forwarded to the `Table` constructor
* @returns {Table}
*/
(0, _createClass2.default)(TopLeftCornerOverlay, [{
key: "createTable",
value: function createTable() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (0, _construct2.default)(_topLeftCorner.default, args);
}
/**
* Checks if overlay should be fully rendered
*
* @returns {Boolean}
*/
}, {
key: "shouldBeRendered",
value: function shouldBeRendered() {
var wot = this.wot;
return !!((wot.getSetting('fixedRowsTop') || wot.getSetting('columnHeaders').length) && (wot.getSetting('fixedColumnsLeft') || wot.getSetting('rowHeaders').length));
}
/**
* Updates the corner overlay position
*/
}, {
key: "resetFixedPosition",
value: function resetFixedPosition() {
this.updateTrimmingContainer();
if (!this.wot.wtTable.holder.parentNode) {
// removed from DOM
return;
}
var overlayRoot = this.clone.wtTable.holder.parentNode;
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer === this.wot.rootWindow) {
var box = this.wot.wtTable.hider.getBoundingClientRect();
var top = Math.ceil(box.top);
var left = Math.ceil(box.left);
var bottom = Math.ceil(box.bottom);
var right = Math.ceil(box.right);
var finalLeft = '0';
var finalTop = '0';
if (!preventOverflow || preventOverflow === 'vertical') {
if (left < 0 && right - overlayRoot.offsetWidth > 0) {
finalLeft = "".concat(-left, "px");
}
}
if (!preventOverflow || preventOverflow === 'horizontal') {
if (top < 0 && bottom - overlayRoot.offsetHeight > 0) {
finalTop = "".concat(-top, "px");
}
}
(0, _element.setOverlayPosition)(overlayRoot, finalLeft, finalTop);
} else {
(0, _element.resetCssTransform)(overlayRoot);
}
var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);
var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);
if (!this.wot.wtTable.hasDefinedSize()) {
tableHeight = 0;
}
overlayRoot.style.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight + 4, "px");
overlayRoot.style.width = "".concat(tableWidth === 0 ? tableWidth : tableWidth + 4, "px");
}
}]);
return TopLeftCornerOverlay;
}(_base.default);
_base.default.registerOverlay(_base.default.CLONE_TOP_LEFT_CORNER, TopLeftCornerOverlay);
var _default = TopLeftCornerOverlay;
exports.default = _default;
/***/ }),
/* 325 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _table = _interopRequireDefault(__webpack_require__(95));
var _stickyRowsTop = _interopRequireDefault(__webpack_require__(244));
var _stickyColumnsLeft = _interopRequireDefault(__webpack_require__(179));
var _object = __webpack_require__(3);
/**
* Subclass of `Table` that provides the helper methods relevant to TopLeftCornerOverlay, implemented through mixins.
*/
var TopLeftCornerOverlayTable =
/*#__PURE__*/
function (_Table) {
(0, _inherits2.default)(TopLeftCornerOverlayTable, _Table);
function TopLeftCornerOverlayTable() {
(0, _classCallCheck2.default)(this, TopLeftCornerOverlayTable);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TopLeftCornerOverlayTable).apply(this, arguments));
}
return TopLeftCornerOverlayTable;
}(_table.default);
(0, _object.mixin)(TopLeftCornerOverlayTable, _stickyRowsTop.default);
(0, _object.mixin)(TopLeftCornerOverlayTable, _stickyColumnsLeft.default);
var _default = TopLeftCornerOverlayTable;
exports.default = _default;
/***/ }),
/* 326 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _construct2 = _interopRequireDefault(__webpack_require__(122));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _bottom = _interopRequireDefault(__webpack_require__(327));
var _base = _interopRequireDefault(__webpack_require__(92));
/**
* @class BottomOverlay
*/
var BottomOverlay =
/*#__PURE__*/
function (_Overlay) {
(0, _inherits2.default)(BottomOverlay, _Overlay);
/**
* @param {Walkontable} wotInstance
*/
function BottomOverlay(wotInstance) {
var _this;
(0, _classCallCheck2.default)(this, BottomOverlay);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(BottomOverlay).call(this, wotInstance));
_this.clone = _this.makeClone(_base.default.CLONE_BOTTOM);
return _this;
}
/**
* Factory method to create a subclass of `Table` that is relevant to this overlay.
*
* @see Table#constructor
* @param {...*} args Parameters that will be forwarded to the `Table` constructor
* @returns {Table}
*/
(0, _createClass2.default)(BottomOverlay, [{
key: "createTable",
value: function createTable() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (0, _construct2.default)(_bottom.default, args);
}
/**
*
*/
}, {
key: "repositionOverlay",
value: function repositionOverlay() {
var _this$wot = this.wot,
wtTable = _this$wot.wtTable,
rootDocument = _this$wot.rootDocument;
var cloneRoot = this.clone.wtTable.holder.parentNode;
var scrollbarWidth = (0, _element.getScrollbarWidth)(rootDocument);
if (wtTable.holder.clientHeight === wtTable.holder.offsetHeight) {
scrollbarWidth = 0;
}
cloneRoot.style.top = '';
cloneRoot.style.bottom = "".concat(scrollbarWidth, "px");
}
/**
* Checks if overlay should be fully rendered
*
* @returns {Boolean}
*/
}, {
key: "shouldBeRendered",
value: function shouldBeRendered() {
/* eslint-disable no-unneeded-ternary */
return this.wot.getSetting('fixedRowsBottom') ? true : false;
}
/**
* Updates the top overlay position
*/
}, {
key: "resetFixedPosition",
value: function resetFixedPosition() {
if (!this.needFullRender || !this.wot.wtTable.holder.parentNode) {
// removed from DOM
return;
}
var overlayRoot = this.clone.wtTable.holder.parentNode;
var headerPosition = 0;
overlayRoot.style.top = '';
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer === this.wot.rootWindow && (!preventOverflow || preventOverflow !== 'vertical')) {
var _this$wot2 = this.wot,
rootDocument = _this$wot2.rootDocument,
wtTable = _this$wot2.wtTable;
var box = wtTable.hider.getBoundingClientRect();
var bottom = Math.ceil(box.bottom);
var finalLeft;
var finalBottom;
var bodyHeight = rootDocument.body.offsetHeight;
finalLeft = wtTable.hider.style.left;
finalLeft = finalLeft === '' ? 0 : finalLeft;
if (bottom > bodyHeight) {
finalBottom = bottom - bodyHeight;
} else {
finalBottom = 0;
}
headerPosition = finalBottom;
finalBottom += 'px';
overlayRoot.style.top = '';
overlayRoot.style.left = finalLeft;
overlayRoot.style.bottom = finalBottom;
} else {
headerPosition = this.getScrollPosition();
(0, _element.resetCssTransform)(overlayRoot);
this.repositionOverlay();
}
this.adjustHeaderBordersPosition(headerPosition);
this.adjustElementsSize();
}
/**
* Sets the main overlay's vertical scroll position
*
* @param {Number} pos
*/
}, {
key: "setScrollPosition",
value: function setScrollPosition(pos) {
var rootWindow = this.wot.rootWindow;
var result = false;
if (this.mainTableScrollableElement === rootWindow) {
rootWindow.scrollTo((0, _element.getWindowScrollLeft)(rootWindow), pos);
result = true;
} else if (this.mainTableScrollableElement.scrollTop !== pos) {
this.mainTableScrollableElement.scrollTop = pos;
result = true;
}
return result;
}
/**
* Triggers onScroll hook callback
*/
}, {
key: "onScroll",
value: function onScroll() {
this.wot.getSetting('onScrollHorizontally');
}
/**
* Calculates total sum cells height
*
* @param {Number} from Row index which calculates started from
* @param {Number} to Row index where calculation is finished
* @returns {Number} Height sum
*/
}, {
key: "sumCellSizes",
value: function sumCellSizes(from, to) {
var _this$wot3 = this.wot,
wtTable = _this$wot3.wtTable,
wtSettings = _this$wot3.wtSettings;
var defaultRowHeight = wtSettings.settings.defaultRowHeight;
var row = from;
var sum = 0;
while (row < to) {
var height = wtTable.getRowHeight(row);
sum += height === void 0 ? defaultRowHeight : height;
row += 1;
}
return sum;
}
/**
* Adjust overlay root element, childs and master table element sizes (width, height).
*
* @param {Boolean} [force=false]
*/
}, {
key: "adjustElementsSize",
value: function adjustElementsSize() {
var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
this.updateTrimmingContainer();
if (this.needFullRender || force) {
this.adjustRootElementSize();
this.adjustRootChildrenSize();
if (!force) {
this.areElementSizesAdjusted = true;
}
}
}
/**
* Adjust overlay root element size (width and height).
*/
}, {
key: "adjustRootElementSize",
value: function adjustRootElementSize() {
var _this$wot4 = this.wot,
wtTable = _this$wot4.wtTable,
wtViewport = _this$wot4.wtViewport,
rootWindow = _this$wot4.rootWindow;
var scrollbarWidth = (0, _element.getScrollbarWidth)(this.wot.rootDocument);
var overlayRoot = this.clone.wtTable.holder.parentNode;
var overlayRootStyle = overlayRoot.style;
var preventOverflow = this.wot.getSetting('preventOverflow');
if (this.trimmingContainer !== rootWindow || preventOverflow === 'horizontal') {
var width = wtViewport.getWorkspaceWidth();
if (this.wot.wtOverlays.hasScrollbarRight) {
width -= scrollbarWidth;
}
width = Math.min(width, wtTable.wtRootElement.scrollWidth);
overlayRootStyle.width = "".concat(width, "px");
} else {
overlayRootStyle.width = '';
}
this.clone.wtTable.holder.style.width = overlayRootStyle.width;
var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);
if (!this.wot.wtTable.hasDefinedSize()) {
tableHeight = 0;
}
overlayRootStyle.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight, "px");
}
/**
* Adjust overlay root childs size
*/
}, {
key: "adjustRootChildrenSize",
value: function adjustRootChildrenSize() {
var scrollbarWidth = (0, _element.getScrollbarWidth)(this.wot.rootDocument);
this.clone.wtTable.hider.style.width = this.hider.style.width;
this.clone.wtTable.holder.style.width = this.clone.wtTable.holder.parentNode.style.width;
if (scrollbarWidth === 0) {
scrollbarWidth = 30;
}
this.clone.wtTable.holder.style.height = "".concat(parseInt(this.clone.wtTable.holder.parentNode.style.height, 10) + scrollbarWidth, "px");
}
/**
* Adjust the overlay dimensions and position
*/
}, {
key: "applyToDOM",
value: function applyToDOM() {
var total = this.wot.getSetting('totalRows');
if (!this.areElementSizesAdjusted) {
this.adjustElementsSize();
}
if (typeof this.wot.wtViewport.rowsRenderCalculator.startPosition === 'number') {
this.spreader.style.top = "".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition, "px");
} else if (total === 0) {
// can happen if there are 0 rows
this.spreader.style.top = '0';
} else {
throw new Error('Incorrect value of the rowsRenderCalculator');
}
this.spreader.style.bottom = '';
if (this.needFullRender) {
this.syncOverlayOffset();
}
}
/**
* Synchronize calculated left position to an element
*/
}, {
key: "syncOverlayOffset",
value: function syncOverlayOffset() {
if (typeof this.wot.wtViewport.columnsRenderCalculator.startPosition === 'number') {
this.clone.wtTable.spreader.style.left = "".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition, "px");
} else {
this.clone.wtTable.spreader.style.left = '';
}
}
/**
* Scrolls vertically to a row
*
* @param sourceRow {Number} Row index which you want to scroll to
* @param [bottomEdge=false] {Boolean} if `true`, scrolls according to the bottom edge (top edge is by default)
*/
}, {
key: "scrollTo",
value: function scrollTo(sourceRow, bottomEdge) {
var newY = this.getTableParentOffset();
var sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;
var mainHolder = sourceInstance.wtTable.holder;
var scrollbarCompensation = 0;
if (bottomEdge && mainHolder.offsetHeight !== mainHolder.clientHeight) {
scrollbarCompensation = (0, _element.getScrollbarWidth)(this.wot.rootDocument);
}
if (bottomEdge) {
newY += this.sumCellSizes(0, sourceRow + 1);
newY -= this.wot.wtViewport.getViewportHeight(); // Fix 1 pixel offset when cell is selected
newY += 1;
} else {
newY += this.sumCellSizes(this.wot.getSetting('fixedRowsBottom'), sourceRow);
}
newY += scrollbarCompensation;
this.setScrollPosition(newY);
}
/**
* Gets table parent top position
*
* @returns {Number}
*/
}, {
key: "getTableParentOffset",
value: function getTableParentOffset() {
if (this.mainTableScrollableElement === this.wot.rootWindow) {
return this.wot.wtTable.holderOffset.top;
}
return 0;
}
/**
* Gets the main overlay's vertical scroll position
*
* @returns {Number} Main table's vertical scroll position
*/
}, {
key: "getScrollPosition",
value: function getScrollPosition() {
return (0, _element.getScrollTop)(this.mainTableScrollableElement, this.wot.rootWindow);
}
/**
* Adds css classes to hide the header border's header (cell-selection border hiding issue)
*
* @param {Number} position Header Y position if trimming container is window or scroll top if not
*/
}, {
key: "adjustHeaderBordersPosition",
value: function adjustHeaderBordersPosition(position) {
if (this.wot.getSetting('fixedRowsBottom') === 0 && this.wot.getSetting('columnHeaders').length > 0) {
var masterParent = this.wot.wtTable.holder.parentNode;
var previousState = (0, _element.hasClass)(masterParent, 'innerBorderTop');
if (position) {
(0, _element.addClass)(masterParent, 'innerBorderTop');
} else {
(0, _element.removeClass)(masterParent, 'innerBorderTop');
}
if (!previousState && position || previousState && !position) {
this.wot.wtOverlays.adjustElementsSize();
}
} // nasty workaround for double border in the header, TODO: find a pure-css solution
if (this.wot.getSetting('rowHeaders').length === 0) {
var secondHeaderCell = this.clone.wtTable.THEAD.querySelector('th:nth-of-type(2)');
if (secondHeaderCell) {
secondHeaderCell.style['border-left-width'] = 0;
}
}
}
}]);
return BottomOverlay;
}(_base.default);
_base.default.registerOverlay(_base.default.CLONE_BOTTOM, BottomOverlay);
var _default = BottomOverlay;
exports.default = _default;
/***/ }),
/* 327 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _table = _interopRequireDefault(__webpack_require__(95));
var _stickyRowsBottom = _interopRequireDefault(__webpack_require__(245));
var _calculatedColumns = _interopRequireDefault(__webpack_require__(178));
var _object = __webpack_require__(3);
/**
* Subclass of `Table` that provides the helper methods relevant to BottomOverlay, implemented through mixins.
*/
var BottomOverlayTable =
/*#__PURE__*/
function (_Table) {
(0, _inherits2.default)(BottomOverlayTable, _Table);
function BottomOverlayTable() {
(0, _classCallCheck2.default)(this, BottomOverlayTable);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(BottomOverlayTable).apply(this, arguments));
}
return BottomOverlayTable;
}(_table.default);
(0, _object.mixin)(BottomOverlayTable, _stickyRowsBottom.default);
(0, _object.mixin)(BottomOverlayTable, _calculatedColumns.default);
var _default = BottomOverlayTable;
exports.default = _default;
/***/ }),
/* 328 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _construct2 = _interopRequireDefault(__webpack_require__(122));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _bottomLeftCorner = _interopRequireDefault(__webpack_require__(329));
var _base = _interopRequireDefault(__webpack_require__(92));
/**
* @class TopLeftCornerOverlay
*/
var BottomLeftCornerOverlay =
/*#__PURE__*/
function (_Overlay) {
(0, _inherits2.default)(BottomLeftCornerOverlay, _Overlay);
/**
* @param {Walkontable} wotInstance
*/
function BottomLeftCornerOverlay(wotInstance) {
var _this;
(0, _classCallCheck2.default)(this, BottomLeftCornerOverlay);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(BottomLeftCornerOverlay).call(this, wotInstance));
_this.clone = _this.makeClone(_base.default.CLONE_BOTTOM_LEFT_CORNER);
return _this;
}
/**
* Factory method to create a subclass of `Table` that is relevant to this overlay.
*
* @see Table#constructor
* @param {...*} args Parameters that will be forwarded to the `Table` constructor
* @returns {Table}
*/
(0, _createClass2.default)(BottomLeftCornerOverlay, [{
key: "createTable",
value: function createTable() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return (0, _construct2.default)(_bottomLeftCorner.default, args);
}
/**
* Checks if overlay should be fully rendered
*
* @returns {Boolean}
*/
}, {
key: "shouldBeRendered",
value: function shouldBeRendered() {
var wot = this.wot;
/* eslint-disable no-unneeded-ternary */
return wot.getSetting('fixedRowsBottom') && (wot.getSetting('fixedColumnsLeft') || wot.getSetting('rowHeaders').length) ? true : false;
}
/**
* Reposition the overlay.
*/
}, {
key: "repositionOverlay",
value: function repositionOverlay() {
var _this$wot = this.wot,
wtTable = _this$wot.wtTable,
rootDocument = _this$wot.rootDocument;
var cloneRoot = this.clone.wtTable.holder.parentNode;
var scrollbarWidth = (0, _element.getScrollbarWidth)(rootDocument);
if (wtTable.holder.clientHeight === wtTable.holder.offsetHeight) {
scrollbarWidth = 0;
}
cloneRoot.style.top = '';
cloneRoot.style.bottom = "".concat(scrollbarWidth, "px");
}
/**
* Updates the corner overlay position
*/
}, {
key: "resetFixedPosition",
value: function resetFixedPosition() {
var wot = this.wot;
this.updateTrimmingContainer();
if (!wot.wtTable.holder.parentNode) {
// removed from DOM
return;
}
var overlayRoot = this.clone.wtTable.holder.parentNode;
overlayRoot.style.top = '';
if (this.trimmingContainer === wot.rootWindow) {
var box = wot.wtTable.hider.getBoundingClientRect();
var bottom = Math.ceil(box.bottom);
var left = Math.ceil(box.left);
var finalLeft;
var finalBottom;
var bodyHeight = wot.rootDocument.body.offsetHeight;
if (left < 0) {
finalLeft = -left;
} else {
finalLeft = 0;
}
if (bottom > bodyHeight) {
finalBottom = bottom - bodyHeight;
} else {
finalBottom = 0;
}
finalBottom += 'px';
finalLeft += 'px';
overlayRoot.style.top = '';
overlayRoot.style.left = finalLeft;
overlayRoot.style.bottom = finalBottom;
} else {
(0, _element.resetCssTransform)(overlayRoot);
this.repositionOverlay();
}
var tableHeight = (0, _element.outerHeight)(this.clone.wtTable.TABLE);
var tableWidth = (0, _element.outerWidth)(this.clone.wtTable.TABLE);
if (!this.wot.wtTable.hasDefinedSize()) {
tableHeight = 0;
}
overlayRoot.style.height = "".concat(tableHeight === 0 ? tableHeight : tableHeight, "px");
overlayRoot.style.width = "".concat(tableWidth === 0 ? tableWidth : tableWidth, "px");
}
}]);
return BottomLeftCornerOverlay;
}(_base.default);
_base.default.registerOverlay(_base.default.CLONE_BOTTOM_LEFT_CORNER, BottomLeftCornerOverlay);
var _default = BottomLeftCornerOverlay;
exports.default = _default;
/***/ }),
/* 329 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _table = _interopRequireDefault(__webpack_require__(95));
var _stickyRowsBottom = _interopRequireDefault(__webpack_require__(245));
var _stickyColumnsLeft = _interopRequireDefault(__webpack_require__(179));
var _object = __webpack_require__(3);
/**
* Subclass of `Table` that provides the helper methods relevant to BottomLeftCornerOverlay, implemented through mixins.
*/
var BottomLeftCornerOverlayTable =
/*#__PURE__*/
function (_Table) {
(0, _inherits2.default)(BottomLeftCornerOverlayTable, _Table);
function BottomLeftCornerOverlayTable() {
(0, _classCallCheck2.default)(this, BottomLeftCornerOverlayTable);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(BottomLeftCornerOverlayTable).apply(this, arguments));
}
return BottomLeftCornerOverlayTable;
}(_table.default);
(0, _object.mixin)(BottomLeftCornerOverlayTable, _stickyRowsBottom.default);
(0, _object.mixin)(BottomLeftCornerOverlayTable, _stickyColumnsLeft.default);
var _default = BottomLeftCornerOverlayTable;
exports.default = _default;
/***/ }),
/* 330 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(19);
__webpack_require__(96);
__webpack_require__(31);
__webpack_require__(247);
__webpack_require__(39);
__webpack_require__(97);
exports.__esModule = true;
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(18));
var _typeof2 = _interopRequireDefault(__webpack_require__(42));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _element = __webpack_require__(8);
var _border = _interopRequireDefault(__webpack_require__(246));
var _coords = _interopRequireDefault(__webpack_require__(118));
var _range = _interopRequireDefault(__webpack_require__(225));
/**
* @class Selection
*/
var Selection =
/*#__PURE__*/
function () {
/**
* @param {Object} settings
* @param {CellRange} cellRange
*/
function Selection(settings, cellRange) {
(0, _classCallCheck2.default)(this, Selection);
this.settings = settings;
this.cellRange = cellRange || null;
this.instanceBorders = {};
this.classNames = [this.settings.className];
this.classNameGenerator = this.linearClassNameGenerator(this.settings.className, this.settings.layerLevel);
}
/**
* Each Walkontable clone requires it's own border for every selection. This method creates and returns selection
* borders per instance
*
* @param {Walkontable} wotInstance
* @returns {Border}
*/
(0, _createClass2.default)(Selection, [{
key: "getBorder",
value: function getBorder(wotInstance) {
if (!this.instanceBorders[wotInstance.guid]) {
this.instanceBorders[wotInstance.guid] = new _border.default(wotInstance, this.settings);
}
return this.instanceBorders[wotInstance.guid];
}
/**
* Checks if selection is empty
*
* @returns {Boolean}
*/
}, {
key: "isEmpty",
value: function isEmpty() {
return this.cellRange === null;
}
/**
* Adds a cell coords to the selection
*
* @param {CellCoords} coords
*/
}, {
key: "add",
value: function add(coords) {
if (this.isEmpty()) {
this.cellRange = new _range.default(coords);
} else {
this.cellRange.expand(coords);
}
return this;
}
/**
* If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean
* information about success
*
* @param {CellCoords} oldCoords
* @param {CellCoords} newCoords
* @returns {Boolean}
*/
}, {
key: "replace",
value: function replace(oldCoords, newCoords) {
if (!this.isEmpty()) {
if (this.cellRange.from.isEqual(oldCoords)) {
this.cellRange.from = newCoords;
return true;
}
if (this.cellRange.to.isEqual(oldCoords)) {
this.cellRange.to = newCoords;
return true;
}
}
return false;
}
/**
* Clears selection
*
* @returns {Selection}
*/
}, {
key: "clear",
value: function clear() {
this.cellRange = null;
return this;
}
/**
* Returns the top left (TL) and bottom right (BR) selection coordinates
*
* @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]`
*/
}, {
key: "getCorners",
value: function getCorners() {
var topLeft = this.cellRange.getTopLeftCorner();
var bottomRight = this.cellRange.getBottomRightCorner();
return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col];
}
/**
* Adds class name to cell element at given coords
*
* @param {Walkontable} wotInstance Walkontable instance
* @param {Number} sourceRow Cell row coord
* @param {Number} sourceColumn Cell column coord
* @param {String} className Class name
* @param {Boolean} [markIntersections=false] If `true`, linear className generator will be used to add CSS classes
* in a continuous way.
* @returns {Selection}
*/
}, {
key: "addClassAtCoords",
value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) {
var markIntersections = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
var TD = wotInstance.wtTable.getCell(new _coords.default(sourceRow, sourceColumn));
if ((0, _typeof2.default)(TD) === 'object') {
var cellClassName = className;
if (markIntersections) {
cellClassName = this.classNameGenerator(TD);
if (!this.classNames.includes(cellClassName)) {
this.classNames.push(cellClassName);
}
}
(0, _element.addClass)(TD, cellClassName);
}
return this;
}
/**
* Generate helper for calculating classNames based on previously added base className.
* The generated className is always generated as a continuation of the previous className. For example, when
* the currently checked element has 'area-2' className the generated new className will be 'area-3'. When
* the element doesn't have any classNames than the base className will be returned ('area');
*
* @param {String} baseClassName Base className to be used.
* @param {Number} layerLevelOwner Layer level which the instance of the Selection belongs to.
* @return {Function}
*/
}, {
key: "linearClassNameGenerator",
value: function linearClassNameGenerator(baseClassName, layerLevelOwner) {
// TODO: Make this recursive function Proper Tail Calls (TCO/PTC) friendly.
return function calcClassName(element) {
var previousIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
if (layerLevelOwner === 0 || previousIndex === 0) {
return baseClassName;
}
var index = previousIndex >= 0 ? previousIndex : layerLevelOwner;
var className = baseClassName;
index -= 1;
var previousClassName = index === 0 ? baseClassName : "".concat(baseClassName, "-").concat(index);
if ((0, _element.hasClass)(element, previousClassName)) {
var currentLayer = index + 1;
className = "".concat(baseClassName, "-").concat(currentLayer);
} else {
className = calcClassName(element, index);
}
return className;
};
}
/**
* @param wotInstance
*/
}, {
key: "draw",
value: function draw(wotInstance) {
if (this.isEmpty()) {
if (this.settings.border) {
this.getBorder(wotInstance).disappear();
}
return;
}
var renderedRows = wotInstance.wtTable.getRenderedRowsCount();
var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount();
var corners = this.getCorners();
var _corners = (0, _slicedToArray2.default)(corners, 4),
topRow = _corners[0],
topColumn = _corners[1],
bottomRow = _corners[2],
bottomColumn = _corners[3];
for (var column = 0; column < renderedColumns; column += 1) {
var sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column);
if (sourceCol >= topColumn && sourceCol <= bottomColumn) {
var TH = wotInstance.wtTable.getColumnHeader(sourceCol);
if (TH) {
var newClasses = [];
if (this.settings.highlightHeaderClassName) {
newClasses.push(this.settings.highlightHeaderClassName);
}
if (this.settings.highlightColumnClassName) {
newClasses.push(this.settings.highlightColumnClassName);
}
(0, _element.addClass)(TH, newClasses);
}
}
}
for (var row = 0; row < renderedRows; row += 1) {
var sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row);
if (sourceRow >= topRow && sourceRow <= bottomRow) {
var _TH = wotInstance.wtTable.getRowHeader(sourceRow);
if (_TH) {
var _newClasses = [];
if (this.settings.highlightHeaderClassName) {
_newClasses.push(this.settings.highlightHeaderClassName);
}
if (this.settings.highlightRowClassName) {
_newClasses.push(this.settings.highlightRowClassName);
}
(0, _element.addClass)(_TH, _newClasses);
}
}
for (var _column = 0; _column < renderedColumns; _column += 1) {
var _sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column);
if (sourceRow >= topRow && sourceRow <= bottomRow && _sourceCol >= topColumn && _sourceCol <= bottomColumn) {
// selected cell
if (this.settings.className) {
this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.className, this.settings.markIntersections);
}
} else if (sourceRow >= topRow && sourceRow <= bottomRow) {
// selection is in this row
if (this.settings.highlightRowClassName) {
this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightRowClassName);
}
} else if (_sourceCol >= topColumn && _sourceCol <= bottomColumn) {
// selection is in this column
if (this.settings.highlightColumnClassName) {
this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, this.settings.highlightColumnClassName);
}
}
var additionalSelectionClass = wotInstance.getSetting('onAfterDrawSelection', sourceRow, _sourceCol, corners, this.settings.layerLevel);
if (typeof additionalSelectionClass === 'string') {
this.addClassAtCoords(wotInstance, sourceRow, _sourceCol, additionalSelectionClass);
}
}
}
wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className);
if (this.settings.border) {
// warning! border.appear modifies corners!
this.getBorder(wotInstance).appear(corners);
}
}
/**
* Cleans up all the DOM state related to a Selection instance. Call this prior to deleting a Selection instance.
*/
}, {
key: "destroy",
value: function destroy() {
Object.values(this.instanceBorders).forEach(function (border) {
return border.destroy();
});
}
}]);
return Selection;
}();
var _default = Selection;
exports.default = _default;
/***/ }),
/* 331 */
/***/ (function(module, exports, __webpack_require__) {
var DESCRIPTORS = __webpack_require__(44);
var objectKeys = __webpack_require__(111);
var toIndexedObject = __webpack_require__(63);
var propertyIsEnumerable = __webpack_require__(130).f;
// `Object.{ entries, values }` methods implementation
var createMethod = function (TO_ENTRIES) {
return function (it) {
var O = toIndexedObject(it);
var keys = objectKeys(O);
var length = keys.length;
var i = 0;
var result = [];
var key;
while (length > i) {
key = keys[i++];
if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {
result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
}
}
return result;
};
};
module.exports = {
// `Object.entries` method
// https://tc39.github.io/ecma262/#sec-object.entries
entries: createMethod(true),
// `Object.values` method
// https://tc39.github.io/ecma262/#sec-object.values
values: createMethod(false)
};
/***/ }),
/* 332 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _array = __webpack_require__(4);
var _object = __webpack_require__(3);
var MIXIN_NAME = 'hooksRefRegisterer';
/**
* Mixin object to extend objects functionality for auto registering hooks in an Handsontable instance.
*
* @type {Object}
*/
var hooksRefRegisterer = {
/**
* Internal hooks storage.
*/
_hooksStorage: Object.create(null),
/**
* Add hook to the collection.
*
* @param {String} key Hook name.
* @param {Function} callback Hook callback
* @returns {Object}
*/
addHook: function addHook(key, callback) {
if (!this._hooksStorage[key]) {
this._hooksStorage[key] = [];
}
this.hot.addHook(key, callback);
this._hooksStorage[key].push(callback);
return this;
},
/**
* Remove all hooks listeners by hook name.
*
* @param {String} key
*/
removeHooksByKey: function removeHooksByKey(key) {
var _this = this;
(0, _array.arrayEach)(this._hooksStorage[key] || [], function (callback) {
_this.hot.removeHook(key, callback);
});
},
/**
* Clear all added hooks.
*/
clearHooks: function clearHooks() {
var _this2 = this;
(0, _object.objectEach)(this._hooksStorage, function (callbacks, name) {
return _this2.removeHooksByKey(name);
});
this._hooksStorage = {};
}
};
(0, _object.defineGetter)(hooksRefRegisterer, 'MIXIN_NAME', MIXIN_NAME, {
writable: false,
enumerable: false
});
var _default = hooksRefRegisterer;
exports.default = _default;
/***/ }),
/* 333 */
/***/ (function(module, exports, __webpack_require__) {
var getPrototypeOf = __webpack_require__(5);
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = getPrototypeOf(object);
if (object === null) break;
}
return object;
}
module.exports = _superPropBase;
/***/ }),
/* 334 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
__webpack_require__(34);
/**
* autoResize - resizes a DOM element to the width and height of another DOM element
*
* Copyright 2014, Marcin Warpechowski
* Licensed under the MIT license
*/
function autoResize() {
var defaults = {
minHeight: 200,
maxHeight: 300,
minWidth: 100,
maxWidth: 300
},
el,
body = document.body,
text = document.createTextNode(''),
span = document.createElement('SPAN'),
observe = function observe(element, event, handler) {
element.addEventListener(event, handler, false);
},
_unObserve = function unObserve(element, event, handler) {
element.removeEventListener(event, handler, false);
},
resize = function resize(newChar) {
var width, scrollHeight;
if (!newChar) {
newChar = "";
} else if (!/^[a-zA-Z \.,\\\/\|0-9]$/.test(newChar)) {
newChar = ".";
}
if (text.textContent !== void 0) {
text.textContent = el.value + newChar;
} else {
text.data = el.value + newChar; //IE8
}
span.style.fontSize = getComputedStyle(el).fontSize;
span.style.fontFamily = getComputedStyle(el).fontFamily;
span.style.whiteSpace = "pre";
body.appendChild(span);
width = span.clientWidth + 2;
body.removeChild(span);
el.style.height = defaults.minHeight + 'px';
if (defaults.minWidth > width) {
el.style.width = defaults.minWidth + 'px';
} else if (width > defaults.maxWidth) {
el.style.width = defaults.maxWidth + 'px';
} else {
el.style.width = width + 'px';
}
scrollHeight = el.scrollHeight ? el.scrollHeight - 1 : 0;
if (defaults.minHeight > scrollHeight) {
el.style.height = defaults.minHeight + 'px';
} else if (defaults.maxHeight < scrollHeight) {
el.style.height = defaults.maxHeight + 'px';
el.style.overflowY = 'visible';
} else {
el.style.height = scrollHeight + 'px';
}
},
delayedResize = function delayedResize() {
window.setTimeout(resize, 0);
},
extendDefaults = function extendDefaults(config) {
if (config && config.minHeight) {
if (config.minHeight == 'inherit') {
defaults.minHeight = el.clientHeight;
} else {
var minHeight = parseInt(config.minHeight);
if (!isNaN(minHeight)) {
defaults.minHeight = minHeight;
}
}
}
if (config && config.maxHeight) {
if (config.maxHeight == 'inherit') {
defaults.maxHeight = el.clientHeight;
} else {
var maxHeight = parseInt(config.maxHeight);
if (!isNaN(maxHeight)) {
defaults.maxHeight = maxHeight;
}
}
}
if (config && config.minWidth) {
if (config.minWidth == 'inherit') {
defaults.minWidth = el.clientWidth;
} else {
var minWidth = parseInt(config.minWidth);
if (!isNaN(minWidth)) {
defaults.minWidth = minWidth;
}
}
}
if (config && config.maxWidth) {
if (config.maxWidth == 'inherit') {
defaults.maxWidth = el.clientWidth;
} else {
var maxWidth = parseInt(config.maxWidth);
if (!isNaN(maxWidth)) {
defaults.maxWidth = maxWidth;
}
}
}
if (!span.firstChild) {
span.className = "autoResize";
span.style.display = 'inline-block';
span.appendChild(text);
}
},
_init = function init(el_, config, doObserve) {
el = el_;
extendDefaults(config);
if (el.nodeName == 'TEXTAREA') {
el.style.resize = 'none';
el.style.overflowY = '';
el.style.height = defaults.minHeight + 'px';
el.style.minWidth = defaults.minWidth + 'px';
el.style.maxWidth = defaults.maxWidth + 'px';
el.style.overflowY = 'hidden';
}
if (doObserve) {
observe(el, 'change', resize);
observe(el, 'cut', delayedResize);
observe(el, 'paste', delayedResize);
observe(el, 'drop', delayedResize);
observe(el, 'keydown', delayedResize);
observe(el, 'focus', resize);
observe(el, 'compositionstart', delayedResize);
observe(el, 'compositionupdate', delayedResize);
observe(el, 'compositionend', delayedResize);
}
resize();
};
function getComputedStyle(element) {
return element.currentStyle || document.defaultView.getComputedStyle(element);
}
return {
init: function init(el_, config, doObserve) {
_init(el_, config, doObserve);
},
unObserve: function unObserve() {
_unObserve(el, 'change', resize);
_unObserve(el, 'cut', delayedResize);
_unObserve(el, 'paste', delayedResize);
_unObserve(el, 'drop', delayedResize);
_unObserve(el, 'keydown', delayedResize);
_unObserve(el, 'focus', resize);
_unObserve(el, 'compositionstart', delayedResize);
_unObserve(el, 'compositionupdate', delayedResize);
_unObserve(el, 'compositionend', delayedResize);
},
resize: resize
};
}
if (true) {
module.exports = autoResize;
}
/***/ }),
/* 335 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _baseEditor = _interopRequireDefault(__webpack_require__(117));
var _element = __webpack_require__(8);
/**
* @private
* @editor CheckboxEditor
* @class CheckboxEditor
*/
var CheckboxEditor =
/*#__PURE__*/
function (_BaseEditor) {
(0, _inherits2.default)(CheckboxEditor, _BaseEditor);
function CheckboxEditor() {
(0, _classCallCheck2.default)(this, CheckboxEditor);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CheckboxEditor).apply(this, arguments));
}
(0, _createClass2.default)(CheckboxEditor, [{
key: "beginEditing",
value: function beginEditing(initialValue, event) {
// Just some events connected with checkbox editor are delegated here. Some `keydown` events like `enter` and `space` key press
// are handled inside `checkboxRenderer`. Some events come here from `editorManager`. Below `if` statement was created by author
// for purpose of handling only `doubleclick` event which may be done on a cell with checkbox.
if (event && event.type === 'mouseup') {
var checkbox = this.TD.querySelector('input[type="checkbox"]');
if (!(0, _element.hasClass)(checkbox, 'htBadValue')) {
checkbox.click();
}
}
}
}, {
key: "finishEditing",
value: function finishEditing() {}
}, {
key: "init",
value: function init() {}
}, {
key: "open",
value: function open() {}
}, {
key: "close",
value: function close() {}
}, {
key: "getValue",
value: function getValue() {}
}, {
key: "setValue",
value: function setValue() {}
}, {
key: "focus",
value: function focus() {}
}]);
return CheckboxEditor;
}(_baseEditor.default);
var _default = CheckboxEditor;
exports.default = _default;
/***/ }),
/* 336 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _get2 = _interopRequireDefault(__webpack_require__(14));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _moment = _interopRequireDefault(__webpack_require__(72));
var _pikaday = _interopRequireDefault(__webpack_require__(337));
__webpack_require__(338);
var _element = __webpack_require__(8);
var _object = __webpack_require__(3);
var _eventManager = _interopRequireDefault(__webpack_require__(25));
var _unicode = __webpack_require__(55);
var _event = __webpack_require__(32);
var _textEditor = _interopRequireDefault(__webpack_require__(123));
/**
* @private
* @editor DateEditor
* @class DateEditor
* @dependencies TextEditor
*/
var DateEditor =
/*#__PURE__*/
function (_TextEditor) {
(0, _inherits2.default)(DateEditor, _TextEditor);
/**
* @param {Core} hotInstance Handsontable instance
* @private
*/
function DateEditor(hotInstance) {
var _this;
(0, _classCallCheck2.default)(this, DateEditor);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(DateEditor).call(this, hotInstance)); // TODO: Move this option to general settings
_this.defaultDateFormat = 'DD/MM/YYYY';
_this.isCellEdited = false;
_this.parentDestroyed = false;
return _this;
}
(0, _createClass2.default)(DateEditor, [{
key: "init",
value: function init() {
var _this2 = this;
if (typeof _moment.default !== 'function') {
throw new Error('You need to include moment.js to your project.');
}
if (typeof _pikaday.default !== 'function') {
throw new Error('You need to include Pikaday to your project.');
}
(0, _get2.default)((0, _getPrototypeOf2.default)(DateEditor.prototype), "init", this).call(this);
this.instance.addHook('afterDestroy', function () {
_this2.parentDestroyed = true;
_this2.destroyElements();
});
}
/**
* Create data picker instance
*/
}, {
key: "createElements",
value: function createElements() {
(0, _get2.default)((0, _getPrototypeOf2.default)(DateEditor.prototype), "createElements", this).call(this);
this.datePicker = this.hot.rootDocument.createElement('DIV');
this.datePickerStyle = this.datePicker.style;
this.datePickerStyle.position = 'absolute';
this.datePickerStyle.top = 0;
this.datePickerStyle.left = 0;
this.datePickerStyle.zIndex = 9999;
(0, _element.addClass)(this.datePicker, 'htDatepickerHolder');
this.hot.rootDocument.body.appendChild(this.datePicker);
this.$datePicker = new _pikaday.default(this.getDatePickerConfig());
var eventManager = new _eventManager.default(this);
/**
* Prevent recognizing clicking on datepicker as clicking outside of table
*/
eventManager.addEventListener(this.datePicker, 'mousedown', function (event) {
return (0, _event.stopPropagation)(event);
});
this.hideDatepicker();
}
/**
* Destroy data picker instance
*/
}, {
key: "destroyElements",
value: function destroyElements() {
var datePickerParentElement = this.datePicker.parentNode;
this.$datePicker.destroy();
if (datePickerParentElement) {
datePickerParentElement.removeChild(this.datePicker);
}
}
/**
* Prepare editor to appear
*
* @param {Number} row Row index
* @param {Number} col Column index
* @param {String} prop Property name (passed when datasource is an array of objects)
* @param {HTMLTableCellElement} td Table cell element
* @param {*} originalValue Original value
* @param {Object} cellProperties Object with cell properties ({@see Core#getCellMeta})
*/
}, {
key: "prepare",
value: function prepare(row, col, prop, td, originalValue, cellProperties) {
(0, _get2.default)((0, _getPrototypeOf2.default)(DateEditor.prototype), "prepare", this).call(this, row, col, prop, td, originalValue, cellProperties);
}
/**
* Open editor
*
* @param {Event} [event=null]
*/
}, {
key: "open",
value: function open() {
var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
(0, _get2.default)((0, _getPrototypeOf2.default)(DateEditor.prototype), "open", this).call(this);
this.showDatepicker(event);
}
/**
* Close editor
*/
}, {
key: "close",
value: function close() {
var _this3 = this;
this._opened = false;
this.instance._registerTimeout(function () {
_this3.instance._refreshBorders();
});
(0, _get2.default)((0, _getPrototypeOf2.default)(DateEditor.prototype), "close", this).call(this);
}
/**
* @param {Boolean} [isCancelled=false]
* @param {Boolean} [ctrlDown=false]
*/
}, {
key: "finishEditing",
value: function finishEditing() {
var isCancelled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var ctrlDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (isCancelled) {
// pressed ESC, restore original value
// var value = this.instance.getDataAtCell(this.row, this.col);
var value = this.originalValue;
if (value !== void 0) {
this.setValue(value);
}
}
this.hideDatepicker();
(0, _get2.default)((0, _getPrototypeOf2.default)(DateEditor.prototype), "finishEditing", this).call(this, isCancelled, ctrlDown);
}
/**
* Show data picker
*
* @param {Event} event
*/
}, {
key: "showDatepicker",
value: function showDatepicker(event) {
this.$datePicker.config(this.getDatePickerConfig());
var offset = this.TD.getBoundingClientRect();
var dateFormat = this.cellProperties.dateFormat || this.defaultDateFormat;
var datePickerConfig = this.$datePicker.config();
var dateStr;
var isMouseDown = this.instance.view.isMouseDown();
var isMeta = event ? (0, _unicode.isMetaKey)(event.keyCode) : false;
this.datePickerStyle.top = "".concat(this.hot.rootWindow.pageYOffset + offset.top + (0, _element.outerHeight)(this.TD), "px");
this.datePickerStyle.left = "".concat(this.hot.rootWindow.pageXOffset + offset.left, "px");
this.$datePicker._onInputFocus = function () {};
datePickerConfig.format = dateFormat;
if (this.originalValue) {
dateStr = this.originalValue;
if ((0, _moment.default)(dateStr, dateFormat, true).isValid()) {
this.$datePicker.setMoment((0, _moment.default)(dateStr, dateFormat), true);
} // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.
if (this.getValue() !== this.originalValue) {
this.setValue(this.originalValue);
}
if (!isMeta && !isMouseDown) {
this.setValue('');
}
} else if (this.cellProperties.defaultDate) {
dateStr = this.cellProperties.defaultDate;
datePickerConfig.defaultDate = dateStr;
if ((0, _moment.default)(dateStr, dateFormat, true).isValid()) {
this.$datePicker.setMoment((0, _moment.default)(dateStr, dateFormat), true);
}
if (!isMeta && !isMouseDown) {
this.setValue('');
}
} else {
// if a default date is not defined, set a soft-default-date: display the current day and month in the
// datepicker, but don't fill the editor input
this.$datePicker.gotoToday();
}
this.datePickerStyle.display = 'block';
this.$datePicker.show();
}
/**
* Hide data picker
*/
}, {
key: "hideDatepicker",
value: function hideDatepicker() {
this.datePickerStyle.display = 'none';
this.$datePicker.hide();
}
/**
* Get date picker options.
*
* @returns {Object}
*/
}, {
key: "getDatePickerConfig",
value: function getDatePickerConfig() {
var _this4 = this;
var htInput = this.TEXTAREA;
var options = {};
if (this.cellProperties && this.cellProperties.datePickerConfig) {
(0, _object.deepExtend)(options, this.cellProperties.datePickerConfig);
}
var origOnSelect = options.onSelect;
var origOnClose = options.onClose;
options.field = htInput;
options.trigger = htInput;
options.container = this.datePicker;
options.bound = false;
options.format = options.format || this.defaultDateFormat;
options.reposition = options.reposition || false;
options.onSelect = function (value) {
var dateStr = value;
if (!isNaN(dateStr.getTime())) {
dateStr = (0, _moment.default)(dateStr).format(_this4.cellProperties.dateFormat || _this4.defaultDateFormat);
}
_this4.setValue(dateStr);
_this4.hideDatepicker();
if (origOnSelect) {
origOnSelect();
}
};
options.onClose = function () {
if (!_this4.parentDestroyed) {
_this4.finishEditing(false);
}
if (origOnClose) {
origOnClose();
}
};
return options;
}
}]);
return DateEditor;
}(_textEditor.default);
var _default = DateEditor;
exports.default = _default;
/***/ }),
/* 337 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__337__;
/***/ }),
/* 338 */
/***/ (function(module, exports) {
/***/ }),
/* 339 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(50);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _get2 = _interopRequireDefault(__webpack_require__(14));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _autocompleteEditor = _interopRequireDefault(__webpack_require__(248));
var _pluginHooks = _interopRequireDefault(__webpack_require__(46));
/**
* @private
* @editor DropdownEditor
* @class DropdownEditor
* @dependencies AutocompleteEditor
*/
var DropdownEditor =
/*#__PURE__*/
function (_AutocompleteEditor) {
(0, _inherits2.default)(DropdownEditor, _AutocompleteEditor);
function DropdownEditor() {
(0, _classCallCheck2.default)(this, DropdownEditor);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(DropdownEditor).apply(this, arguments));
}
(0, _createClass2.default)(DropdownEditor, [{
key: "prepare",
value: function prepare(row, col, prop, td, originalValue, cellProperties) {
(0, _get2.default)((0, _getPrototypeOf2.default)(DropdownEditor.prototype), "prepare", this).call(this, row, col, prop, td, originalValue, cellProperties);
this.cellProperties.filter = false;
this.cellProperties.strict = true;
}
}]);
return DropdownEditor;
}(_autocompleteEditor.default);
_pluginHooks.default.getSingleton().add('beforeValidate', function (value, row, col) {
var cellMeta = this.getCellMeta(row, this.propToCol(col));
if (cellMeta.editor === DropdownEditor) {
if (cellMeta.strict === void 0) {
cellMeta.filter = false;
cellMeta.strict = true;
}
}
});
var _default = DropdownEditor;
exports.default = _default;
/***/ }),
/* 340 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _textEditor = _interopRequireDefault(__webpack_require__(123));
/**
* @private
* @editor NumericEditor
* @class NumericEditor
*/
var NumericEditor =
/*#__PURE__*/
function (_TextEditor) {
(0, _inherits2.default)(NumericEditor, _TextEditor);
function NumericEditor() {
(0, _classCallCheck2.default)(this, NumericEditor);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(NumericEditor).apply(this, arguments));
}
return NumericEditor;
}(_textEditor.default);
var _default = NumericEditor;
exports.default = _default;
/***/ }),
/* 341 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _get2 = _interopRequireDefault(__webpack_require__(14));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _textEditor = _interopRequireDefault(__webpack_require__(123));
/**
* @private
* @editor PasswordEditor
* @class PasswordEditor
* @dependencies TextEditor
*/
var PasswordEditor =
/*#__PURE__*/
function (_TextEditor) {
(0, _inherits2.default)(PasswordEditor, _TextEditor);
function PasswordEditor() {
(0, _classCallCheck2.default)(this, PasswordEditor);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(PasswordEditor).apply(this, arguments));
}
(0, _createClass2.default)(PasswordEditor, [{
key: "createElements",
value: function createElements() {
(0, _get2.default)((0, _getPrototypeOf2.default)(PasswordEditor.prototype), "createElements", this).call(this);
this.TEXTAREA = this.hot.rootDocument.createElement('input');
this.TEXTAREA.setAttribute('type', 'password');
this.TEXTAREA.className = 'handsontableInput';
this.textareaStyle = this.TEXTAREA.style;
this.textareaStyle.width = 0;
this.textareaStyle.height = 0;
(0, _element.empty)(this.TEXTAREA_PARENT);
this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);
}
}]);
return PasswordEditor;
}(_textEditor.default);
var _default = PasswordEditor;
exports.default = _default;
/***/ }),
/* 342 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireWildcard = __webpack_require__(9);
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = void 0;
var _typeof2 = _interopRequireDefault(__webpack_require__(42));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(6));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(5));
var _get2 = _interopRequireDefault(__webpack_require__(14));
var _inherits2 = _interopRequireDefault(__webpack_require__(7));
var _element = __webpack_require__(8);
var _event = __webpack_require__(32);
var _unicode = __webpack_require__(55);
var _baseEditor = _interopRequireWildcard(__webpack_require__(117));
var _object = __webpack_require__(3);
var EDITOR_VISIBLE_CLASS_NAME = 'ht_editor_visible';
/**
* @private
* @editor SelectEditor
* @class SelectEditor
*/
var SelectEditor =
/*#__PURE__*/
function (_BaseEditor) {
(0, _inherits2.default)(SelectEditor, _BaseEditor);
function SelectEditor() {
(0, _classCallCheck2.default)(this, SelectEditor);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(SelectEditor).apply(this, arguments));
}
(0, _createClass2.default)(SelectEditor, [{
key: "init",
/**
* Initializes editor instance, DOM Element and mount hooks.
*/
value: function init() {
this.select = this.hot.rootDocument.createElement('SELECT');
(0, _element.addClass)(this.select, 'htSelectEditor');
this.select.style.display = 'none';
this.hot.rootElement.appendChild(this.select);
this.registerHooks();
}
/**
* Returns select's value.
*
* @returns {*}
*/
}, {
key: "getValue",
value: function getValue() {
return this.select.value;
}
/**
* Sets value in the select element.
*
* @param {*} value A new select's value.
*/
}, {
key: "setValue",
value: function setValue(value) {
this.select.value = value;
}
/**
* Opens the editor and adjust its size.
*/
}, {
key: "open",
value: function open() {
var _this = this;
this._opened = true;
this.refreshDimensions();
this.select.style.display = '';
this.addHook('beforeKeyDown', function () {
return _this.onBeforeKeyDown();
});
}
/**
* Closes the editor.
*/
}, {
key: "close",
value: function close() {
this._opened = false;
this.select.style.display = 'none';
if ((0, _element.hasClass)(this.select, EDITOR_VISIBLE_CLASS_NAME)) {
(0, _element.removeClass)(this.select, EDITOR_VISIBLE_CLASS_NAME);
}
this.clearHooks();
}
/**
* Sets focus state on the select element.
*/
}, {
key: "focus",
value: function focus() {
this.select.focus();
}
/**
* Binds hooks to refresh editor's size after scrolling of the viewport or resizing of columns/rows.
*
* @private
*/
}, {
key: "registerHooks",
value: function registerHooks() {
var _this2 = this;
this.addHook('afterScrollHorizontally', function () {
return _this2.refreshDimensions();
});
this.addHook('afterScrollVertically', function () {
return _this2.refreshDimensions();
});
this.addHook('afterColumnResize', function () {
return _this2.refreshDimensions();
});
this.addHook('afterRowResize', function () {
return _this2.refreshDimensions();
});
}
/**
* Prepares editor's meta data and a list of available options.
*
* @param {Number} row
* @param {Number} col
* @param {Number|String} prop
* @param {HTMLTableCellElement} td
* @param {*} originalValue
* @param {Object} cellProperties
*/
}, {
key: "prepare",
value: function prepare(row, col, prop, td, originalValue, cellProperties) {
var _this3 = this;
(0, _get2.default)((0, _getPrototypeOf2.default)(SelectEditor.prototype), "prepare", this).call(this, row, col, prop, td, originalValue, cellProperties);
var selectOptions = this.cellProperties.selectOptions;
var options;
if (typeof selectOptions === 'function') {
options = this.prepareOptions(selectOptions(this.row, this.col, this.prop));
} else {
options = this.prepareOptions(selectOptions);
}
(0, _element.empty)(this.select);
(0, _object.objectEach)(options, function (value, key) {
var optionElement = _this3.hot.rootDocument.createElement('OPTION');
optionElement.value = key;
(0, _element.fastInnerHTML)(optionElement, value);
_this3.select.appendChild(optionElement);
});
}
/**
* Creates consistent list of available options.
*
* @private
* @param {Array|Object} optionsToPrepare
* @returns {Object}
*/
}, {
key: "prepareOptions",
value: function prepareOptions(optionsToPrepare) {
var preparedOptions = {};
if (Array.isArray(optionsToPrepare)) {
for (var i = 0, len = optionsToPrepare.length; i < len; i++) {
preparedOptions[optionsToPrepare[i]] = optionsToPrepare[i];
}
} else if ((0, _typeof2.default)(optionsToPrepare) === 'object') {
preparedOptions = optionsToPrepare;
}
return preparedOptions;
}
/**
* Refreshes editor's value using source data.
*
* @private
*/
}, {
key: "refreshValue",
value: function refreshValue() {
var sourceData = this.hot.getSourceDataAtCell(this.row, this.prop);
this.originalValue = sourceData;
this.setValue(sourceData);
this.refreshDimensions();
}
/**
* Refreshes editor's size and position.
*
* @private
*/
}, {
key: "refreshDimensions",
value: function refreshDimensions() {
if (this.state !== _baseEditor.EditorState.EDITING) {
return;
}
this.TD = this.getEditedCell(); // TD is outside of the viewport.
if (!this.TD) {
this.close();
return;
}
var wtOverlays = this.hot.view.wt.wtOverlays;
var currentOffset = (0, _element.offset)(this.TD);
var containerOffset = (0, _element.offset)(this.hot.rootElement);
var scrollableContainer = wtOverlays.scrollableElement;
var editorSection = this.checkEditorSection();
var width = (0, _element.outerWidth)(this.TD) + 1;
var height = (0, _element.outerHeight)(this.TD) + 1;
var editTop = currentOffset.top - containerOffset.top - 1 - (scrollableContainer.scrollTop || 0);
var editLeft = currentOffset.left - containerOffset.left - 1 - (scrollableContainer.scrollLeft || 0);
var cssTransformOffset;
switch (editorSection) {
case 'top':
cssTransformOffset = (0, _element.getCssTransform)(wtOverlays.topOverlay.clone.wtTable.holder.parentNode);
break;
case 'left':
cssTransformOffset = (0, _element.getCssTransform)(wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);
break;
case 'top-left-corner':
cssTransformOffset = (0, _element.getCssTransform)(wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);
break;
case 'bottom-left-corner':
cssTransformOffset = (0, _element.getCssTransform)(wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);
break;
case 'bottom':
cssTransformOffset = (0, _element.getCssTransform)(wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode);
break;
default:
break;
}
if (this.hot.getSelectedLast()[0] === 0) {
editTop += 1;
}
if (this.hot.getSelectedLast()[1] === 0) {
editLeft += 1;
}
var selectStyle = this.select.style;
if (cssTransformOffset && cssTransformOffset !== -1) {
selectStyle[cssTransformOffset[0]] = cssTransformOffset[1];
} else {
(0, _element.resetCssTransform)(this.select);
}
var cellComputedStyle = (0, _element.getComputedStyle)(this.TD, this.hot.rootWindow);
if (parseInt(cellComputedStyle.borderTopWidth, 10) > 0) {
height -= 1;
}
if (parseInt(cellComputedStyle.borderLeftWidth, 10) > 0) {
width -= 1;
}
selectStyle.height = "".concat(height, "px");
selectStyle.minWidth = "".concat(width, "px");
selectStyle.top = "".concat(editTop, "px");
selectStyle.left = "".concat(editLeft, "px");
selectStyle.margin = '0px';
(0, _element.addClass)(this.select, EDITOR_VISIBLE_CLASS_NAME);
}
/**
* onBeforeKeyDown callback.
*
* @private
*/
}, {
key: "onBeforeKeyDown",
value: function onBeforeKeyDown() {
var previousOptionIndex = this.select.selectedIndex - 1;
var nextOptionIndex = this.select.selectedIndex + 1;
switch (event.keyCode) {
case _unicode.KEY_CODES.ARROW_UP:
if (previousOptionIndex >= 0) {
this.select[previousOptionIndex].selected = true;
}
(0, _event.stopImmediatePropagation)(event);
event.preventDefault();
break;
case _unicode.KEY_CODES.ARROW_DOWN:
if (nextOptionIndex <= this.select.length - 1) {
this.select[nextOptionIndex].selected = true;
}
(0, _event.stopImmediatePropagation)(event);
event.preventDefault();
break;
default:
break;
}
}
}]);
return SelectEditor;
}(_baseEditor.default);
var _default = SelectEditor;
exports.default = _default;
/***/ }),
/* 343 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
__webpack_require__(19);
exports.__esModule = true;
exports.default = void 0;
var _element = __webpack_require__(8);
/**
* Adds appropriate CSS class to table cell, based on cellProperties
*/
function cellDecorator(instance, TD, row, col, prop, value, cellProperties) {
var classesToAdd = [];
var classesToRemove = [];
if (cellProperties.className) {
if (TD.className) {
TD.className = "".concat(TD.className, " ").concat(cellProperties.className);
} else {
TD.className = cellProperties.className;
}
}
if (cellProperties.readOnly) {
classesToAdd.push(cellProperties.readOnlyCellClassName);
}
if (cellProperties.valid === false && cellProperties.invalidCellClassName) {
classesToAdd.push(cellProperties.invalidCellClassName);
} else {
classesToRemove.push(cellProperties.invalidCellClassName);
}
if (cellProperties.wordWrap === false && cellProperties.noWordWrapClassName) {
classesToAdd.push(cellProperties.noWordWrapClassName);
}
if (!value && cellProperties.placeholder) {
classesToAdd.push(cellProperties.placeholderCellClassName);
}
(0, _element.removeClass)(TD, classesToRemove);
(0, _element.addClass)(TD, classesToAdd);
}
var _default = cellDecorator;
exports.default = _default;
/***/ }),
/* 344 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(19);
exports.__esModule = true;
exports.default = void 0;
var _element = __webpack_require__(8);
var _eventManager = _interopRequireDefault(__webpack_require__(25));
var _src = __webpack_require__(27);
var _index = __webpack_require__(43);
/**
* Autocomplete renderer
*
* @private
* @renderer AutocompleteRenderer
* @param {Object} instance Handsontable instance
* @param {Element} TD Table cell where to render
* @param {Number} row
* @param {Number} col
* @param {String|Number} prop Row object property name
* @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
* @param {Object} cellProperties Cell properites (shared by cell renderer and editor)
*/
function autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) {
var rootDocument = instance.rootDocument;
var rendererType = cellProperties.allowHtml ? 'html' : 'text';
var ARROW = rootDocument.createElement('DIV');
ARROW.className = 'htAutocompleteArrow';
ARROW.appendChild(rootDocument.createTextNode(String.fromCharCode(9660)));
for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) {
args[_key - 7] = arguments[_key];
}
(0, _index.getRenderer)(rendererType).apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args));
if (!TD.firstChild) {
// http://jsperf.com/empty-node-if-needed
// otherwise empty fields appear borderless in demo/renderers.html (IE)
TD.appendChild(rootDocument.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946
// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips
}
TD.insertBefore(ARROW, TD.firstChild);
(0, _element.addClass)(TD, 'htAutocomplete');
if (!instance.acArrowListener) {
var eventManager = new _eventManager.default(instance); // not very elegant but easy and fast
instance.acArrowListener = function (event) {
if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) {
instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD);
}
};
eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener); // We need to unbind the listener after the table has been destroyed
instance.addHookOnce('afterDestroy', function () {
eventManager.destroy();
});
}
}
var _default = autocompleteRenderer;
exports.default = _default;
/***/ }),
/* 345 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(19);
__webpack_require__(31);
__webpack_require__(15);
__webpack_require__(10);
__webpack_require__(38);
__webpack_require__(39);
__webpack_require__(13);
__webpack_require__(24);
__webpack_require__(16);
__webpack_require__(34);
exports.__esModule = true;
exports.default = void 0;
var _element = __webpack_require__(8);
var _string = __webpack_require__(74);
var _eventManager = _interopRequireDefault(__webpack_require__(25));
var _unicode = __webpack_require__(55);
var _function = __webpack_require__(77);
var _event = __webpack_require__(32);
var _index = __webpack_require__(43);
var isListeningKeyDownEvent = new WeakMap();
var isCheckboxListenerAdded = new WeakMap();
var BAD_VALUE_CLASS = 'htBadValue';
/**
* Checkbox renderer
*
* @private
* @param {Object} instance Handsontable instance
* @param {Element} TD Table cell where to render
* @param {Number} row
* @param {Number} col
* @param {String|Number} prop Row object property name
* @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
* @param {Object} cellProperties Cell properties (shared by cell renderer and editor)
*/
function checkboxRenderer(instance, TD, row, col, prop, value, cellProperties) {
var rootDocument = instance.rootDocument;
for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) {
args[_key - 7] = arguments[_key];
}
(0, _index.getRenderer)('base').apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args));
registerEvents(instance);
var input = createInput(rootDocument);
var labelOptions = cellProperties.label;
var badValue = false;
if (typeof cellProperties.checkedTemplate === 'undefined') {
cellProperties.checkedTemplate = true;
}
if (typeof cellProperties.uncheckedTemplate === 'undefined') {
cellProperties.uncheckedTemplate = false;
}
(0, _element.empty)(TD); // TODO identify under what circumstances this line can be removed
if (value === cellProperties.checkedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.checkedTemplate)) {
input.checked = true;
} else if (value === cellProperties.uncheckedTemplate || (0, _string.equalsIgnoreCase)(value, cellProperties.uncheckedTemplate)) {
input.checked = false;
} else if (value === null) {
// default value
(0, _element.addClass)(input, 'noValue');
} else {
input.style.display = 'none';
(0, _element.addClass)(input, BAD_VALUE_CLASS);
badValue = true;
}
input.setAttribute('data-row', row);
input.setAttribute('data-col', col);
if (!badValue && labelOptions) {
var labelText = '';
if (labelOptions.value) {
labelText = typeof labelOptions.value === 'function' ? labelOptions.value.call(this, row, col, prop, value) : labelOptions.value;
} else if (labelOptions.property) {
var labelValue = instance.getDataAtRowProp(row, labelOptions.property);
labelText = labelValue !== null ? labelValue : '';
}
var label = createLabel(rootDocument, labelText);
if (labelOptions.position === 'before') {
label.appendChild(input);
} else {
label.insertBefore(input, label.firstChild);
}
input = label;
}
TD.appendChild(input);
if (badValue) {
TD.appendChild(rootDocument.createTextNode('#bad-value#'));
}
if (!isListeningKeyDownEvent.has(instance)) {
isListeningKeyDownEvent.set(instance, true);
instance.addHook('beforeKeyDown', onBeforeKeyDown);
}
/**
* On before key down DOM listener.
*
* @private
* @param {Event} event
*/
function onBeforeKeyDown(event) {
var toggleKeys = 'SPACE|ENTER';
var switchOffKeys = 'DELETE|BACKSPACE';
var isKeyCode = (0, _function.partial)(_unicode.isKey, event.keyCode);
if (!instance.getSettings().enterBeginsEditing && isKeyCode('ENTER')) {
return;
}
if (isKeyCode("".concat(toggleKeys, "|").concat(switchOffKeys)) && !(0, _event.isImmediatePropagationStopped)(event)) {
eachSelectedCheckboxCell(function () {
(0, _event.stopImmediatePropagation)(event);
event.preventDefault();
});
}
if (isKeyCode(toggleKeys)) {
changeSelectedCheckboxesState();
}
if (isKeyCode(switchOffKeys)) {
changeSelectedCheckboxesState(true);
}
}
/**
* Change checkbox checked property
*
* @private
* @param {Boolean} [uncheckCheckbox=false]
*/
function changeSelectedCheckboxesState() {
var uncheckCheckbox = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var selRange = instance.getSelectedRangeLast();
if (!selRange) {
return;
}
var _selRange$getTopLeftC = selRange.getTopLeftCorner(),
startRow = _selRange$getTopLeftC.row,
startColumn = _selRange$getTopLeftC.col;
var _selRange$getBottomRi = selRange.getBottomRightCorner(),
endRow = _selRange$getBottomRi.row,
endColumn = _selRange$getBottomRi.col;
var changes = [];
for (var visualRow = startRow; visualRow <= endRow; visualRow += 1) {
for (var visualColumn = startColumn; visualColumn <= endColumn; visualColumn += 1) {
var cachedCellProperties = instance.getCellMeta(visualRow, visualColumn);
if (cachedCellProperties.type !== 'checkbox') {
return;
}
/* eslint-disable no-continue */
if (cachedCellProperties.readOnly === true) {
continue;
}
if (typeof cachedCellProperties.checkedTemplate === 'undefined') {
cachedCellProperties.checkedTemplate = true;
}
if (typeof cachedCellProperties.uncheckedTemplate === 'undefined') {
cachedCellProperties.uncheckedTemplate = false;
}
var dataAtCell = instance.getDataAtCell(visualRow, visualColumn);
if (uncheckCheckbox === false) {
if ([cachedCellProperties.checkedTemplate, cachedCellProperties.checkedTemplate.toString()].includes(dataAtCell)) {
changes.push([visualRow, visualColumn, cachedCellProperties.uncheckedTemplate]);
} else if ([cachedCellProperties.uncheckedTemplate, cachedCellProperties.uncheckedTemplate.toString(), null, void 0].includes(dataAtCell)) {
changes.push([visualRow, visualColumn, cachedCellProperties.checkedTemplate]);
}
} else {
changes.push([visualRow, visualColumn, cachedCellProperties.uncheckedTemplate]);
}
}
}
if (changes.length > 0) {
instance.setDataAtCell(changes);
}
}
/**
* Call callback for each found selected cell with checkbox type.
*
* @private
* @param {Function} callback
*/
function eachSelectedCheckboxCell(callback) {
var selRange = instance.getSelectedRangeLast();
if (!selRange) {
return;
}
var topLeft = selRange.getTopLeftCorner();
var bottomRight = selRange.getBottomRightCorner();
for (var visualRow = topLeft.row; visualRow <= bottomRight.row; visualRow++) {
for (var visualColumn = topLeft.col; visualColumn <= bottomRight.col; visualColumn++) {
var cachedCellProperties = instance.getCellMeta(visualRow, visualColumn);
if (cachedCellProperties.type !== 'checkbox') {
return;
}
var cell = instance.getCell(visualRow, visualColumn);
if (cell === null || cell === void 0) {
callback(visualRow, visualColumn, cachedCellProperties);
} else {
var checkboxes = cell.querySelectorAll('input[type=checkbox]');
if (checkboxes.length > 0 && !cachedCellProperties.readOnly) {
callback(checkboxes);
}
}
}
}
}
}
/**
* Register checkbox listeners.
*
* @param {Handsontable} instance Handsontable instance.
* @returns {EventManager}
*/
function registerEvents(instance) {
var eventManager = isCheckboxListenerAdded.get(instance);
if (!eventManager) {
var rootElement = instance.rootElement;
eventManager = new _eventManager.default(instance);
eventManager.addEventListener(rootElement, 'click', function (event) {
return onClick(event, instance);
});
eventManager.addEventListener(rootElement, 'mouseup', function (event) {
return onMouseUp(event, instance);
});
eventManager.addEventListener(rootElement, 'change', function (event) {
return onChange(event, instance);
});
isCheckboxListenerAdded.set(instance, eventManager);
}
return eventManager;
}
/**
* Create input element.
*
* @param {Document} rootDocument
* @returns {Node}
*/
function createInput(rootDocument) {
var input = rootDocument.createElement('input');
input.className = 'htCheckboxRendererInput';
input.type = 'checkbox';
input.setAttribute('autocomplete', 'off');
input.setAttribute('tabindex', '-1');
return input.cloneNode(false);
}
/**
* Create label element.
*
* @param {Document} rootDocument
* @param {String} text
* @returns {Node}
*/
function createLabel(rootDocument, text) {
var label = rootDocument.createElement('label');
label.className = 'htCheckboxRendererLabel';
label.appendChild(rootDocument.createTextNode(text));
return label.cloneNode(true);
}
/**
* `mouseup` callback.
*
* @private
* @param {Event} event `mouseup` event.
* @param {Object} instance Handsontable instance.
*/
function onMouseUp(event, instance) {
if (!isCheckboxInput(event.target)) {
return;
}
setTimeout(instance.listen, 10);
}
/**
* `click` callback.
*
* @private
* @param {Event} event `click` event.
* @param {Object} instance Handsontable instance.
*/
function onClick(event, instance) {
if (!isCheckboxInput(event.target)) {
return false;
}
var row = parseInt(event.target.getAttribute('data-row'), 10);
var col = parseInt(event.target.getAttribute('data-col'), 10);
var cellProperties = instance.getCellMeta(row, col);
if (cellProperties.readOnly) {
event.preventDefault();
}
}
/**
* `change` callback.
*
* @param {Event} event `change` event.
* @param {Object} instance Handsontable instance.
* @param {Object} cellProperties Reference to cell properties.
* @returns {Boolean}
*/
function onChange(event, instance) {
if (!isCheckboxInput(event.target)) {
return false;
}
var row = parseInt(event.target.getAttribute('data-row'), 10);
var col = parseInt(event.target.getAttribute('data-col'), 10);
var cellProperties = instance.getCellMeta(row, col);
if (!cellProperties.readOnly) {
var newCheckboxValue = null;
if (event.target.checked) {
newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? true : cellProperties.checkedTemplate;
} else {
newCheckboxValue = cellProperties.uncheckedTemplate === void 0 ? false : cellProperties.uncheckedTemplate;
}
instance.setDataAtCell(row, col, newCheckboxValue);
}
}
/**
* Check if the provided element is the checkbox input.
*
* @private
* @param {HTMLElement} element The element in question.
* @returns {Boolean}
*/
function isCheckboxInput(element) {
return element.tagName === 'INPUT' && element.getAttribute('type') === 'checkbox';
}
var _default = checkboxRenderer;
exports.default = _default;
/***/ }),
/* 346 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
__webpack_require__(19);
exports.__esModule = true;
exports.default = void 0;
var _element = __webpack_require__(8);
var _index = __webpack_require__(43);
/**
* @private
* @renderer HtmlRenderer
* @param instance
* @param TD
* @param row
* @param col
* @param prop
* @param value
* @param cellProperties
*/
function htmlRenderer(instance, TD, row, col, prop, value) {
for (var _len = arguments.length, args = new Array(_len > 6 ? _len - 6 : 0), _key = 6; _key < _len; _key++) {
args[_key - 6] = arguments[_key];
}
(0, _index.getRenderer)('base').apply(this, [instance, TD, row, col, prop, value].concat(args));
(0, _element.fastInnerHTML)(TD, value === null || value === void 0 ? '' : value);
}
var _default = htmlRenderer;
exports.default = _default;
/***/ }),
/* 347 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(12);
__webpack_require__(54);
__webpack_require__(23);
__webpack_require__(40);
__webpack_require__(52);
exports.__esModule = true;
exports.default = void 0;
var _numbro = _interopRequireDefault(__webpack_require__(348));
var _index = __webpack_require__(43);
var _number = __webpack_require__(17);
/**
* Numeric cell renderer
*
* @private
* @renderer NumericRenderer
* @param {Object} instance Handsontable instance
* @param {Element} TD Table cell where to render
* @param {Number} row
* @param {Number} col
* @param {String|Number} prop Row object property name
* @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
* @param {Object} cellProperties Cell properties (shared by cell renderer and editor)
*/
function numericRenderer(instance, TD, row, col, prop, value, cellProperties) {
var newValue = value;
if ((0, _number.isNumeric)(newValue)) {
var numericFormat = cellProperties.numericFormat;
var cellCulture = numericFormat && numericFormat.culture || '-';
var cellFormatPattern = numericFormat && numericFormat.pattern;
var className = cellProperties.className || '';
var classArr = className.length ? className.split(' ') : [];
if (typeof cellCulture !== 'undefined' && !_numbro.default.languages()[cellCulture]) {
var shortTag = cellCulture.replace('-', '');
var langData = _numbro.default.allLanguages ? _numbro.default.allLanguages[cellCulture] : _numbro.default[shortTag];
if (langData) {
_numbro.default.registerLanguage(langData);
}
}
_numbro.default.setLanguage(cellCulture);
newValue = (0, _numbro.default)(newValue).format(cellFormatPattern || '0');
if (classArr.indexOf('htLeft') < 0 && classArr.indexOf('htCenter') < 0 && classArr.indexOf('htRight') < 0 && classArr.indexOf('htJustify') < 0) {
classArr.push('htRight');
}
if (classArr.indexOf('htNumeric') < 0) {
classArr.push('htNumeric');
}
cellProperties.className = classArr.join(' ');
}
(0, _index.getRenderer)('text')(instance, TD, row, col, prop, newValue, cellProperties);
}
var _default = numericRenderer;
exports.default = _default;
/***/ }),
/* 348 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__348__;
/***/ }),
/* 349 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
__webpack_require__(19);
exports.__esModule = true;
exports.default = void 0;
var _element = __webpack_require__(8);
var _index = __webpack_require__(43);
var _number = __webpack_require__(17);
/**
* @private
* @renderer PasswordRenderer
* @param instance
* @param TD
* @param row
* @param col
* @param prop
* @param value
* @param cellProperties
*/
function passwordRenderer(instance, TD, row, col, prop, value, cellProperties) {
for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) {
args[_key - 7] = arguments[_key];
}
(0, _index.getRenderer)('text').apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args));
var hashLength = cellProperties.hashLength || TD.innerHTML.length;
var hashSymbol = cellProperties.hashSymbol || '*';
var hash = '';
(0, _number.rangeEach)(hashLength - 1, function () {
hash += hashSymbol;
});
(0, _element.fastInnerHTML)(TD, hash);
}
var _default = passwordRenderer;
exports.default = _default;
/***/ }),
/* 350 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
__webpack_require__(19);
__webpack_require__(23);
__webpack_require__(40);
exports.__esModule = true;
exports.default = void 0;
var _element = __webpack_require__(8);
var _mixed = __webpack_require__(29);
var _index = __webpack_require__(43);
/**
* Default text renderer
*
* @private
* @renderer TextRenderer
* @param {Object} instance Handsontable instance
* @param {Element} TD Table cell where to render
* @param {Number} row
* @param {Number} col
* @param {String|Number} prop Row object property name
* @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
* @param {Object} cellProperties Cell properties (shared by cell renderer and editor)
*/
function textRenderer(instance, TD, row, col, prop, value, cellProperties) {
for (var _len = arguments.length, args = new Array(_len > 7 ? _len - 7 : 0), _key = 7; _key < _len; _key++) {
args[_key - 7] = arguments[_key];
}
(0, _index.getRenderer)('base').apply(this, [instance, TD, row, col, prop, value, cellProperties].concat(args));
var escaped = value;
if (!escaped && cellProperties.placeholder) {
escaped = cellProperties.placeholder;
}
escaped = (0, _mixed.stringify)(escaped);
if (!instance.getSettings().trimWhitespace) {
escaped = escaped.replace(/ /g, String.fromCharCode(160));
}
if (cellProperties.rendererTemplate) {
(0, _element.empty)(TD);
var TEMPLATE = instance.rootDocument.createElement('TEMPLATE');
TEMPLATE.setAttribute('bind', '{{}}');
TEMPLATE.innerHTML = cellProperties.rendererTemplate;
HTMLTemplateElement.decorate(TEMPLATE);
TEMPLATE.model = instance.getSourceDataAtRow(row);
TD.appendChild(TEMPLATE);
} else {
// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips
(0, _element.fastInnerText)(TD, escaped);
}
}
var _default = textRenderer;
exports.default = _default;
/***/ }),
/* 351 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = autocompleteValidator;
/**
* Autocomplete cell validator.
*
* @private
* @validator AutocompleteValidator
* @param {*} value - Value of edited cell
* @param {Function} callback - Callback called with validation result
*/
function autocompleteValidator(value, callback) {
var valueToValidate = value;
if (valueToValidate === null || valueToValidate === void 0) {
valueToValidate = '';
}
if (this.allowEmpty && valueToValidate === '') {
callback(true);
return;
}
if (this.strict && this.source) {
if (typeof this.source === 'function') {
this.source(valueToValidate, process(valueToValidate, callback));
} else {
process(valueToValidate, callback)(this.source);
}
} else {
callback(true);
}
}
/**
* Function responsible for validation of autocomplete value.
*
* @param {*} value - Value of edited cell
* @param {Function} callback - Callback called with validation result
*/
function process(value, callback) {
var originalVal = value;
return function (source) {
var found = false;
for (var s = 0, slen = source.length; s < slen; s++) {
if (originalVal === source[s]) {
found = true; // perfect match
break;
}
}
callback(found);
};
}
/***/ }),
/* 352 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(23);
__webpack_require__(250);
exports.__esModule = true;
exports.default = dateValidator;
exports.correctFormat = correctFormat;
var _moment = _interopRequireDefault(__webpack_require__(72));
var _date = __webpack_require__(251);
var _editors = __webpack_require__(57);
/**
* Date cell validator
*
* @private
* @validator DateValidator
* @param {*} value - Value of edited cell
* @param {Function} callback - Callback called with validation result
*/
function dateValidator(value, callback) {
var dateEditor = (0, _editors.getEditorInstance)('date', this.instance);
var valueToValidate = value;
var valid = true;
if (valueToValidate === null || valueToValidate === void 0) {
valueToValidate = '';
}
var isValidFormat = (0, _moment.default)(valueToValidate, this.dateFormat || dateEditor.defaultDateFormat, true).isValid();
var isValidDate = (0, _moment.default)(new Date(valueToValidate)).isValid() || isValidFormat;
if (this.allowEmpty && valueToValidate === '') {
isValidDate = true;
isValidFormat = true;
}
if (!isValidDate) {
valid = false;
}
if (!isValidDate && isValidFormat) {
valid = true;
}
if (isValidDate && !isValidFormat) {
if (this.correctFormat === true) {
// if format correction is enabled
var correctedValue = correctFormat(valueToValidate, this.dateFormat);
var row = this.instance.runHooks('unmodifyRow', this.row);
var column = this.instance.runHooks('unmodifyCol', this.col);
this.instance.setDataAtCell(row, column, correctedValue, 'dateValidator');
valid = true;
} else {
valid = false;
}
}
callback(valid);
}
/**
* Format the given string using moment.js' format feature
*
* @param {String} value
* @param {String} dateFormat
* @returns {String}
*/
function correctFormat(value, dateFormat) {
var dateFromDate = (0, _moment.default)((0, _date.getNormalizedDate)(value));
var dateFromMoment = (0, _moment.default)(value, dateFormat);
var isAlphanumeric = value.search(/[A-z]/g) > -1;
var date;
if (dateFromDate.isValid() && dateFromDate.format('x') === dateFromMoment.format('x') || !dateFromMoment.isValid() || isAlphanumeric) {
date = dateFromDate;
} else {
date = dateFromMoment;
}
return date.format(dateFormat);
}
/***/ }),
/* 353 */
/***/ (function(module, exports) {
// `SameValue` abstract operation
// https://tc39.github.io/ecma262/#sec-samevalue
module.exports = Object.is || function is(x, y) {
// eslint-disable-next-line no-self-compare
return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
};
/***/ }),
/* 354 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = numericValidator;
var _number = __webpack_require__(17);
/**
* Numeric cell validator
*
* @private
* @validator NumericValidator
* @param {*} value - Value of edited cell
* @param {*} callback - Callback called with validation result
*/
function numericValidator(value, callback) {
var valueToValidate = value;
if (valueToValidate === null || valueToValidate === void 0) {
valueToValidate = '';
}
if (this.allowEmpty && valueToValidate === '') {
callback(true);
} else if (valueToValidate === '') {
callback(false);
} else {
callback((0, _number.isNumeric)(value));
}
}
/***/ }),
/* 355 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
exports.__esModule = true;
exports.default = timeValidator;
var _moment = _interopRequireDefault(__webpack_require__(72));
// Formats which are correctly parsed to time (supported by momentjs)
var STRICT_FORMATS = ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', // Unix timestamp
'x' // Unix ms timestamp
];
/**
* Time cell validator
*
* @private
* @validator TimeValidator
* @param {*} value - Value of edited cell
* @param {Function} callback - Callback called with validation result
*/
function timeValidator(value, callback) {
var timeFormat = this.timeFormat || 'h:mm:ss a';
var valid = true;
var valueToValidate = value;
if (valueToValidate === null) {
valueToValidate = '';
}
valueToValidate = /^\d{3,}$/.test(valueToValidate) ? parseInt(valueToValidate, 10) : valueToValidate;
var twoDigitValue = /^\d{1,2}$/.test(valueToValidate);
if (twoDigitValue) {
valueToValidate += ':00';
}
var date = (0, _moment.default)(valueToValidate, STRICT_FORMATS, true).isValid() ? (0, _moment.default)(valueToValidate) : (0, _moment.default)(valueToValidate, timeFormat);
var isValidTime = date.isValid(); // is it in the specified format
var isValidFormat = (0, _moment.default)(valueToValidate, timeFormat, true).isValid() && !twoDigitValue;
if (this.allowEmpty && valueToValidate === '') {
isValidTime = true;
isValidFormat = true;
}
if (!isValidTime) {
valid = false;
}
if (!isValidTime && isValidFormat) {
valid = true;
}
if (isValidTime && !isValidFormat) {
if (this.correctFormat === true) {
// if format correction is enabled
var correctedValue = date.format(timeFormat);
var row = this.instance.runHooks('unmodifyRow', this.row);
var column = this.instance.runHooks('unmodifyCol', this.col);
this.instance.setDataAtCell(row, column, correctedValue, 'timeValidator');
valid = true;
} else {
valid = false;
}
}
callback(valid);
}
/***/ }),
/* 356 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var _validators = __webpack_require__(85);
var CELL_TYPE = 'autocomplete';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
renderer: (0, _renderers.getRenderer)(CELL_TYPE),
validator: (0, _validators.getValidator)(CELL_TYPE)
};
exports.default = _default;
/***/ }),
/* 357 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var CELL_TYPE = 'checkbox';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
renderer: (0, _renderers.getRenderer)(CELL_TYPE)
};
exports.default = _default;
/***/ }),
/* 358 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var _validators = __webpack_require__(85);
var CELL_TYPE = 'date';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
// displays small gray arrow on right side of the cell
renderer: (0, _renderers.getRenderer)('autocomplete'),
validator: (0, _validators.getValidator)(CELL_TYPE)
};
exports.default = _default;
/***/ }),
/* 359 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var _validators = __webpack_require__(85);
var CELL_TYPE = 'dropdown';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
// displays small gray arrow on right side of the cell
renderer: (0, _renderers.getRenderer)('autocomplete'),
validator: (0, _validators.getValidator)('autocomplete')
};
exports.default = _default;
/***/ }),
/* 360 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var CELL_TYPE = 'handsontable';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
// displays small gray arrow on right side of the cell
renderer: (0, _renderers.getRenderer)('autocomplete')
};
exports.default = _default;
/***/ }),
/* 361 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var _validators = __webpack_require__(85);
var CELL_TYPE = 'numeric';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
renderer: (0, _renderers.getRenderer)(CELL_TYPE),
validator: (0, _validators.getValidator)(CELL_TYPE),
dataType: 'number'
};
exports.default = _default;
/***/ }),
/* 362 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var CELL_TYPE = 'password';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
renderer: (0, _renderers.getRenderer)(CELL_TYPE),
copyable: false
};
exports.default = _default;
/***/ }),
/* 363 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var CELL_TYPE = 'text';
var _default = {
editor: (0, _editors.getEditor)(CELL_TYPE),
renderer: (0, _renderers.getRenderer)(CELL_TYPE)
};
exports.default = _default;
/***/ }),
/* 364 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _editors = __webpack_require__(57);
var _renderers = __webpack_require__(43);
var _validators = __webpack_require__(85);
var CELL_TYPE = 'time';
var _default = {
editor: (0, _editors.getEditor)('text'),
// displays small gray arrow on right side of the cell
renderer: (0, _renderers.getRenderer)('text'),
validator: (0, _validators.getValidator)(CELL_TYPE)
};
exports.default = _default;
/***/ }),
/* 365 */
/***/ (function(module, exports, __webpack_require__) {
var isObject = __webpack_require__(45);
var floor = Math.floor;
// `Number.isInteger` method implementation
// https://tc39.github.io/ecma262/#sec-number.isinteger
module.exports = function isInteger(it) {
return !isObject(it) && isFinite(it) && floor(it) === it;
};
/***/ }),
/* 366 */
/***/ (function(module, exports, __webpack_require__) {
var $ = __webpack_require__(20);
var global = __webpack_require__(35);
var task = __webpack_require__(367);
var FORCED = !global.setImmediate || !global.clearImmediate;
// http://w3c.github.io/setImmediate/
$({ global: true, bind: true, enumerable: true, forced: FORCED }, {
// `setImmediate` method
// http://w3c.github.io/setImmediate/#si-setImmediate
setImmediate: task.set,
// `clearImmediate` method
// http://w3c.github.io/setImmediate/#si-clearImmediate
clearImmediate: task.clear
});
/***/ }),
/* 367 */
/***/ (function(module, exports, __webpack_require__) {
var global = __webpack_require__(35);
var fails = __webpack_require__(26);
var classof = __webpack_require__(80);
var bind = __webpack_require__(113);
var html = __webpack_require__(204);
var createElement = __webpack_require__(155);
var IS_IOS = __webpack_require__(368);
var location = global.location;
var set = global.setImmediate;
var clear = global.clearImmediate;
var process = global.process;
var MessageChannel = global.MessageChannel;
var Dispatch = global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer, channel, port;
var run = function (id) {
// eslint-disable-next-line no-prototype-builtins
if (queue.hasOwnProperty(id)) {
var fn = queue[id];
delete queue[id];
fn();
}
};
var runner = function (id) {
return function () {
run(id);
};
};
var listener = function (event) {
run(event.data);
};
var post = function (id) {
// old engines have not location.origin
global.postMessage(id + '', location.protocol + '//' + location.host);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!set || !clear) {
set = function setImmediate(fn) {
var args = [];
var i = 1;
while (arguments.length > i) args.push(arguments[i++]);
queue[++counter] = function () {
// eslint-disable-next-line no-new-func
(typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);
};
defer(counter);
return counter;
};
clear = function clearImmediate(id) {
delete queue[id];
};
// Node.js 0.8-
if (classof(process) == 'process') {
defer = function (id) {
process.nextTick(runner(id));
};
// Sphere (JS game engine) Dispatch API
} else if (Dispatch && Dispatch.now) {
defer = function (id) {
Dispatch.now(runner(id));
};
// Browsers with MessageChannel, includes WebWorkers
// except iOS - https://github.com/zloirock/core-js/issues/624
} else if (MessageChannel && !IS_IOS) {
channel = new MessageChannel();
port = channel.port2;
channel.port1.onmessage = listener;
defer = bind(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {
defer = post;
global.addEventListener('message', listener, false);
// IE8-
} else if (ONREADYSTATECHANGE in createElement('script')) {
defer = function (id) {
html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
html.removeChild(this);
run(id);
};
};
// Rest old browsers
} else {
defer = function (id) {
setTimeout(runner(id), 0);
};
}
}
module.exports = {
set: set,
clear: clear
};
/***/ }),
/* 368 */
/***/ (function(module, exports, __webpack_require__) {
var userAgent = __webpack_require__(139);
module.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);
/***/ }),
/* 369 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(50);
__webpack_require__(12);
__webpack_require__(15);
__webpack_require__(41);
__webpack_require__(78);
__webpack_require__(33);
__webpack_require__(68);
__webpack_require__(10);
__webpack_require__(23);
__webpack_require__(13);
__webpack_require__(52);
__webpack_require__(16);
__webpack_require__(34);
exports.__esModule = true;
exports.default = void 0;
var _typeof2 = _interopRequireDefault(__webpack_require__(42));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _SheetClip = _interopRequireDefault(__webpack_require__(252));
var _data = __webpack_require__(147);
var _setting = __webpack_require__(182);
var _object = __webpack_require__(3);
var _array = __webpack_require__(4);
var _interval = _interopRequireDefault(__webpack_require__(370));
var _number = __webpack_require__(17);
var copyableLookup = (0, _data.cellMethodLookupFactory)('copyable', false);
/**
* Utility class that gets and saves data from/to the data source using mapping of columns numbers to object property names
* @todo refactor arguments of methods getRange, getText to be numbers (not objects)
* @todo remove priv, GridSettings from object constructor
*
* @util
* @class DataMap
* @private
*/
var DataMap =
/*#__PURE__*/
function () {
(0, _createClass2.default)(DataMap, null, [{
key: "DESTINATION_RENDERER",
/**
* @type {Number}
*/
get: function get() {
return 1;
}
/**
* @type {Number}
*/
}, {
key: "DESTINATION_CLIPBOARD_GENERATOR",
get: function get() {
return 2;
}
/**
* @param {Object} instance Instance of Handsontable
* @param {*} priv
* @param {GridSettings} GridSettings Grid settings
*/
}]);
function DataMap(instance, priv, GridSettings) {
var _this = this;
(0, _classCallCheck2.default)(this, DataMap);
/**
* Instance of {@link Handsontable}
*
* @private
* @type {Handsontable}
*/
this.instance = instance;
/**
* Private settings object.
*
* @private
* @type {Object}
*/
this.priv = priv;
/**
* Instance of {@link GridSettings}
*
* @private
* @type {GridSettings}
*/
this.GridSettings = GridSettings;
/**
* Reference to the original dataset.
*
* @type {*}
*/
this.dataSource = this.instance.getSettings().data;
/**
* Cached rows number.
*
* @type {Number}
*/
this.cachedLength = null;
/**
* Flag determines if the cache should be used.
*
* @type {Boolean}
*/
this.skipCache = false;
/**
* Cached sourceData rows number.
*
* @type {Number}
*/
this.latestSourceRowsCount = 0;
/**
* Generated schema based on the first row from the source data.
*
* @type {Object}
*/
this.duckSchema = this.dataSource && this.dataSource[0] ? (0, _object.duckSchema)(this.dataSource[0]) : {};
/**
* Cached array of properties to columns.
*
* @type {Array}
*/
this.colToPropCache = void 0;
/**
* Cached map of properties to columns.
*
* @type {Map}
*/
this.propToColCache = void 0;
this.createMap();
/**
* Instance of {@link Interval}
*
* @type {Interval}
*/
this.interval = _interval.default.create(function () {
return _this.clearLengthCache();
}, '15fps');
this.instance.addHook('skipLengthCache', function (delay) {
return _this.onSkipLengthCache(delay);
});
this.onSkipLengthCache(500);
}
/**
* Generates cache for property to and from column addressation.
*/
(0, _createClass2.default)(DataMap, [{
key: "createMap",
value: function createMap() {
var schema = this.getSchema();
var i;
if (typeof schema === 'undefined') {
throw new Error('trying to create `columns` definition but you didn\'t provide `schema` nor `data`');
}
this.colToPropCache = [];
this.propToColCache = new Map();
var columns = this.instance.getSettings().columns;
if (columns) {
var maxCols = this.instance.getSettings().maxCols;
var columnsLen = Math.min(maxCols, columns.length);
var filteredIndex = 0;
var columnsAsFunc = false;
var schemaLen = (0, _object.deepObjectSize)(schema);
if (typeof columns === 'function') {
columnsLen = schemaLen > 0 ? schemaLen : this.instance.countSourceCols();
columnsAsFunc = true;
}
for (i = 0; i < columnsLen; i++) {
var column = columnsAsFunc ? columns(i) : columns[i];
if ((0, _object.isObject)(column)) {
if (typeof column.data !== 'undefined') {
var index = columnsAsFunc ? filteredIndex : i;
this.colToPropCache[index] = column.data;
this.propToColCache.set(column.data, index);
}
filteredIndex += 1;
}
}
} else {
this.recursiveDuckColumns(schema);
}
}
/**
* Generates columns' translation cache.
*
* @param {Object} schema
* @param {Number} lastCol
* @param {Number} parent
* @returns {Number}
*/
}, {
key: "recursiveDuckColumns",
value: function recursiveDuckColumns(schema, lastCol, parent) {
var _this2 = this;
var lastColumn = lastCol;
var propertyParent = parent;
var prop;
if (typeof lastColumn === 'undefined') {
lastColumn = 0;
propertyParent = '';
}
if ((0, _typeof2.default)(schema) === 'object' && !Array.isArray(schema)) {
(0, _object.objectEach)(schema, function (value, key) {
if (value === null) {
prop = propertyParent + key;
_this2.colToPropCache.push(prop);
_this2.propToColCache.set(prop, lastColumn);
lastColumn += 1;
} else {
lastColumn = _this2.recursiveDuckColumns(value, lastColumn, "".concat(key, "."));
}
});
}
return lastColumn;
}
/**
* Returns property name that corresponds with the given column index.
*
* @param {Number} col Visual column index.
* @returns {Number} Physical column index.
*/
}, {
key: "colToProp",
value: function colToProp(col) {
var physicalColumn = this.instance.toPhysicalColumn(col);
if (!isNaN(physicalColumn) && this.colToPropCache && typeof this.colToPropCache[physicalColumn] !== 'undefined') {
return this.colToPropCache[physicalColumn];
}
return physicalColumn;
}
/**
* Translates property into visual column index.
*
* @param {Object} prop
* @fires Hooks#modifyCol
* @returns {Number}
*/
}, {
key: "propToCol",
value: function propToCol(prop) {
var col;
if (typeof this.propToColCache.get(prop) === 'undefined') {
col = prop;
} else {
col = this.propToColCache.get(prop);
}
col = this.instance.toVisualColumn(col);
return col;
}
/**
* Returns data's schema.
*
* @returns {Object}
*/
}, {
key: "getSchema",
value: function getSchema() {
var schema = this.instance.getSettings().dataSchema;
if (schema) {
if (typeof schema === 'function') {
return schema();
}
return schema;
}
return this.duckSchema;
}
/**
* Creates row at the bottom of the data array.
*
* @param {Number} [index] Physical index of the row before which the new row will be inserted.
* @param {Number} [amount=1] An amount of rows to add.
* @param {String} [source] Source of method call.
* @fires Hooks#afterCreateRow
* @returns {Number} Returns number of created rows.
*/
}, {
key: "createRow",
value: function createRow(index) {
var _this3 = this;
var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var source = arguments.length > 2 ? arguments[2] : undefined;
var numberOfCreatedRows = 0;
var rowIndex = index;
if (typeof rowIndex !== 'number' || rowIndex >= this.instance.countSourceRows()) {
rowIndex = this.instance.countSourceRows();
}
var continueProcess = this.instance.runHooks('beforeCreateRow', rowIndex, amount, source);
if (continueProcess === false) {
return 0;
}
var maxRows = this.instance.getSettings().maxRows;
var columnCount = this.instance.countCols();
var _loop = function _loop() {
var row = null;
if (_this3.instance.dataType === 'array') {
if (_this3.instance.getSettings().dataSchema) {
// Clone template array
row = (0, _object.deepClone)(_this3.getSchema());
} else {
row = [];
/* eslint-disable no-loop-func */
(0, _number.rangeEach)(columnCount - 1, function () {
return row.push(null);
});
}
} else if (_this3.instance.dataType === 'function') {
row = _this3.instance.getSettings().dataSchema(rowIndex);
} else {
row = {};
(0, _object.deepExtend)(row, _this3.getSchema());
}
if (rowIndex === _this3.instance.countSourceRows()) {
_this3.dataSource.push(row);
} else {
_this3.spliceData(rowIndex, 0, row);
}
numberOfCreatedRows += 1;
};
while (numberOfCreatedRows < amount && this.instance.countSourceRows() < maxRows) {
_loop();
}
this.instance.runHooks('afterCreateRow', rowIndex, numberOfCreatedRows, source);
this.instance.forceFullRender = true; // used when data was changed
return numberOfCreatedRows;
}
/**
* Creates column at the right of the data array.
*
* @param {Number} [index] Visual index of the column before which the new column will be inserted
* @param {Number} [amount=1] An amount of columns to add.
* @param {String} [source] Source of method call.
* @fires Hooks#afterCreateCol
* @returns {Number} Returns number of created columns
*/
}, {
key: "createCol",
value: function createCol(index) {
var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var source = arguments.length > 2 ? arguments[2] : undefined;
if (!this.instance.isColumnModificationAllowed()) {
throw new Error('Cannot create new column. When data source in an object, ' + 'you can only have as much columns as defined in first data row, data schema or in the \'columns\' setting.' + 'If you want to be able to add new columns, you have to use array datasource.');
}
var rlen = this.instance.countSourceRows();
var data = this.dataSource;
var countColumns = this.instance.countCols();
var columnIndex = typeof index !== 'number' || index >= countColumns ? countColumns : index;
var numberOfCreatedCols = 0;
var currentIndex;
var continueProcess = this.instance.runHooks('beforeCreateCol', columnIndex, amount, source);
if (continueProcess === false) {
return 0;
}
currentIndex = columnIndex;
var maxCols = this.instance.getSettings().maxCols;
while (numberOfCreatedCols < amount && this.instance.countCols() < maxCols) {
var _constructor = (0, _setting.columnFactory)(this.GridSettings, this.priv.columnsSettingConflicts);
if (typeof columnIndex !== 'number' || columnIndex >= this.instance.countCols()) {
if (rlen > 0) {
for (var r = 0; r < rlen; r++) {
if (typeof data[r] === 'undefined') {
data[r] = [];
}
data[r].push(null);
}
} else {
data.push([null]);
} // Add new column constructor
this.priv.columnSettings.push(_constructor);
} else {
for (var row = 0; row < rlen; row++) {
data[row].splice(currentIndex, 0, null);
} // Add new column constructor at given index
this.priv.columnSettings.splice(currentIndex, 0, _constructor);
}
numberOfCreatedCols += 1;
currentIndex += 1;
}
this.instance.runHooks('afterCreateCol', columnIndex, numberOfCreatedCols, source);
this.instance.forceFullRender = true; // used when data was changed
return numberOfCreatedCols;
}
/**
* Removes row from the data array.
*
* @param {Number} [index] Visual index of the row to be removed. If not provided, the last row will be removed
* @param {Number} [amount=1] Amount of the rows to be removed. If not provided, one row will be removed
* @param {String} [source] Source of method call.
* @fires Hooks#beforeRemoveRow
* @fires Hooks#afterRemoveRow
*/
}, {
key: "removeRow",
value: function removeRow(index) {
var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var source = arguments.length > 2 ? arguments[2] : undefined;
var rowIndex = typeof index !== 'number' ? -amount : index;
var rowsAmount = this.instance.runHooks('modifyRemovedAmount', amount, rowIndex);
var sourceRowsLength = this.instance.countSourceRows();
rowIndex = (sourceRowsLength + rowIndex) % sourceRowsLength;
var logicRows = this.visualRowsToPhysical(rowIndex, rowsAmount);
var actionWasNotCancelled = this.instance.runHooks('beforeRemoveRow', rowIndex, rowsAmount, logicRows, source);
if (actionWasNotCancelled === false) {
return;
}
var data = this.dataSource;
var newData = this.filterData(rowIndex, rowsAmount);
if (newData) {
data.length = 0;
Array.prototype.push.apply(data, newData);
}
this.instance.runHooks('afterRemoveRow', rowIndex, rowsAmount, logicRows, source);
this.instance.forceFullRender = true; // used when data was changed
}
/**
* Removes column from the data array.
*
* @param {Number} [index] Visual index of the column to be removed. If not provided, the last column will be removed
* @param {Number} [amount=1] Amount of the columns to be removed. If not provided, one column will be removed
* @param {String} [source] Source of method call.
* @fires Hooks#beforeRemoveCol
* @fires Hooks#afterRemoveCol
*/
}, {
key: "removeCol",
value: function removeCol(index) {
var amount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var source = arguments.length > 2 ? arguments[2] : undefined;
if (this.instance.dataType === 'object' || this.instance.getSettings().columns) {
throw new Error('cannot remove column with object data source or columns option specified');
}
var columnIndex = typeof index !== 'number' ? -amount : index;
columnIndex = (this.instance.countCols() + columnIndex) % this.instance.countCols();
var logicColumns = this.visualColumnsToPhysical(columnIndex, amount);
var descendingLogicColumns = logicColumns.slice(0).sort(function (a, b) {
return b - a;
});
var actionWasNotCancelled = this.instance.runHooks('beforeRemoveCol', columnIndex, amount, logicColumns, source);
if (actionWasNotCancelled === false) {
return;
}
var isTableUniform = true;
var removedColumnsCount = descendingLogicColumns.length;
var data = this.dataSource;
for (var c = 0; c < removedColumnsCount; c++) {
if (isTableUniform && logicColumns[0] !== logicColumns[c] - c) {
isTableUniform = false;
}
}
if (isTableUniform) {
for (var r = 0, rlen = this.instance.countSourceRows(); r < rlen; r++) {
data[r].splice(logicColumns[0], amount);
}
} else {
for (var _r = 0, _rlen = this.instance.countSourceRows(); _r < _rlen; _r++) {
for (var _c = 0; _c < removedColumnsCount; _c++) {
data[_r].splice(descendingLogicColumns[_c], 1);
}
}
for (var _c2 = 0; _c2 < removedColumnsCount; _c2++) {
this.priv.columnSettings.splice(logicColumns[_c2], 1);
}
}
this.instance.runHooks('afterRemoveCol', columnIndex, amount, logicColumns, source);
this.instance.forceFullRender = true; // used when data was changed
}
/**
* Add/Removes data from the column.
*
* @param {Number} col Physical index of column in which do you want to do splice
* @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end
* @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed
* @param {Array} [elements]
* @returns {Array} Returns removed portion of columns
*/
}, {
key: "spliceCol",
value: function spliceCol(col, index, amount) {
var colData = this.instance.getDataAtCol(col);
var removed = colData.slice(index, index + amount);
var after = colData.slice(index + amount);
for (var _len = arguments.length, elements = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
elements[_key - 3] = arguments[_key];
}
(0, _array.extendArray)(elements, after);
var i = 0;
while (i < amount) {
elements.push(null); // add null in place of removed elements
i += 1;
}
(0, _array.to2dArray)(elements);
this.instance.populateFromArray(index, col, elements, null, null, 'spliceCol');
return removed;
}
/**
* Add/Removes data from the row.
*
* @param {Number} row Physical index of row in which do you want to do splice
* @param {Number} index Index at which to start changing the array. If negative, will begin that many elements from the end.
* @param {Number} amount An integer indicating the number of old array elements to remove. If amount is 0, no elements are removed.
* @param {Array} [elements]
* @returns {Array} Returns removed portion of rows
*/
}, {
key: "spliceRow",
value: function spliceRow(row, index, amount) {
var rowData = this.instance.getSourceDataAtRow(row);
var removed = rowData.slice(index, index + amount);
var after = rowData.slice(index + amount);
for (var _len2 = arguments.length, elements = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
elements[_key2 - 3] = arguments[_key2];
}
(0, _array.extendArray)(elements, after);
var i = 0;
while (i < amount) {
elements.push(null); // add null in place of removed elements
i += 1;
}
this.instance.populateFromArray(row, index, [elements], null, null, 'spliceRow');
return removed;
}
/**
* Add/remove row(s) to/from the data source.
*
* @param {Number} index Physical index of the element to remove.
* @param {Number} amount Number of rows to add/remove.
* @param {Object} element Row to add.
*/
}, {
key: "spliceData",
value: function spliceData(index, amount, element) {
var continueSplicing = this.instance.runHooks('beforeDataSplice', index, amount, element);
if (continueSplicing !== false) {
this.dataSource.splice(index, amount, element);
}
}
/**
* Filter unwanted data elements from the data source.
*
* @param {Number} index Visual index of the element to remove.
* @param {Number} amount Number of rows to add/remove.
* @returns {Array}
*/
}, {
key: "filterData",
value: function filterData(index, amount) {
var physicalRows = this.visualRowsToPhysical(index, amount);
var continueSplicing = this.instance.runHooks('beforeDataFilter', index, amount, physicalRows);
if (continueSplicing !== false) {
var newData = this.dataSource.filter(function (row, rowIndex) {
return physicalRows.indexOf(rowIndex) === -1;
});
return newData;
}
}
/**
* Returns single value from the data array.
*
* @param {Number} row Visual row index.
* @param {Number} prop
* @returns {*}
*/
}, {
key: "get",
value: function get(row, prop) {
var physicalRow = this.instance.toPhysicalRow(row);
var dataRow = this.dataSource[physicalRow]; // TODO: To remove, use 'modifyData' hook instead (see below)
var modifiedRowData = this.instance.runHooks('modifyRowData', physicalRow);
dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow; //
var value = null; // try to get value under property `prop` (includes dot)
if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {
value = dataRow[prop];
} else if (typeof prop === 'string' && prop.indexOf('.') > -1) {
var sliced = prop.split('.');
var out = dataRow;
if (!out) {
return null;
}
for (var i = 0, ilen = sliced.length; i < ilen; i++) {
out = out[sliced[i]];
if (typeof out === 'undefined') {
return null;
}
}
value = out;
} else if (typeof prop === 'function') {
/**
* allows for interacting with complex structures, for example
* d3/jQuery getter/setter properties:
*
* {columns: [{
* data: function(row, value){
* if(arguments.length === 1){
* return row.property();
* }
* row.property(value);
* }
* }]}
*/
value = prop(this.dataSource.slice(physicalRow, physicalRow + 1)[0]);
}
if (this.instance.hasHook('modifyData')) {
var valueHolder = (0, _object.createObjectPropListener)(value);
this.instance.runHooks('modifyData', physicalRow, this.propToCol(prop), valueHolder, 'get');
if (valueHolder.isTouched()) {
value = valueHolder.value;
}
}
return value;
}
/**
* Returns single value from the data array (intended for clipboard copy to an external application).
*
* @param {Number} row Physical row index.
* @param {Number} prop
* @returns {String}
*/
}, {
key: "getCopyable",
value: function getCopyable(row, prop) {
if (copyableLookup.call(this.instance, row, this.propToCol(prop))) {
return this.get(row, prop);
}
return '';
}
/**
* Saves single value to the data array.
*
* @param {Number} row Visual row index.
* @param {Number} prop
* @param {String} value
* @param {String} [source] Source of hook runner.
*/
}, {
key: "set",
value: function set(row, prop, value, source) {
var physicalRow = this.instance.runHooks('modifyRow', row, source || 'datamapGet');
var newValue = value;
var dataRow = this.dataSource[physicalRow]; // TODO: To remove, use 'modifyData' hook instead (see below)
var modifiedRowData = this.instance.runHooks('modifyRowData', physicalRow);
dataRow = isNaN(modifiedRowData) ? modifiedRowData : dataRow; //
if (this.instance.hasHook('modifyData')) {
var valueHolder = (0, _object.createObjectPropListener)(newValue);
this.instance.runHooks('modifyData', physicalRow, this.propToCol(prop), valueHolder, 'set');
if (valueHolder.isTouched()) {
newValue = valueHolder.value;
}
} // try to set value under property `prop` (includes dot)
if (dataRow && dataRow.hasOwnProperty && (0, _object.hasOwnProperty)(dataRow, prop)) {
dataRow[prop] = newValue;
} else if (typeof prop === 'string' && prop.indexOf('.') > -1) {
var sliced = prop.split('.');
var out = dataRow;
var i = 0;
var ilen;
for (i = 0, ilen = sliced.length - 1; i < ilen; i++) {
if (typeof out[sliced[i]] === 'undefined') {
out[sliced[i]] = {};
}
out = out[sliced[i]];
}
out[sliced[i]] = newValue;
} else if (typeof prop === 'function') {
/* see the `function` handler in `get` */
prop(this.dataSource.slice(physicalRow, physicalRow + 1)[0], newValue);
} else {
dataRow[prop] = newValue;
}
}
/**
* This ridiculous piece of code maps rows Id that are present in table data to those displayed for user.
* The trick is, the physical row id (stored in settings.data) is not necessary the same
* as the visual (displayed) row id (e.g. when sorting is applied).
*
* @param {Number} index Visual row index.
* @param {Number} amount
* @fires Hooks#modifyRow
* @returns {Number}
*/
}, {
key: "visualRowsToPhysical",
value: function visualRowsToPhysical(index, amount) {
var totalRows = this.instance.countSourceRows();
var logicRows = [];
var physicRow = (totalRows + index) % totalRows;
var rowsToRemove = amount;
var row;
while (physicRow < totalRows && rowsToRemove) {
row = this.instance.toPhysicalRow(physicRow);
logicRows.push(row);
rowsToRemove -= 1;
physicRow += 1;
}
return logicRows;
}
/**
*
* @param index Visual column index.
* @param amount
* @returns {Array}
*/
}, {
key: "visualColumnsToPhysical",
value: function visualColumnsToPhysical(index, amount) {
var totalCols = this.instance.countCols();
var visualCols = [];
var physicalCol = (totalCols + index) % totalCols;
var colsToRemove = amount;
while (physicalCol < totalCols && colsToRemove) {
var col = this.instance.toPhysicalColumn(physicalCol);
visualCols.push(col);
colsToRemove -= 1;
physicalCol += 1;
}
return visualCols;
}
/**
* Clears the data array.
*/
}, {
key: "clear",
value: function clear() {
for (var r = 0; r < this.instance.countSourceRows(); r++) {
for (var c = 0; c < this.instance.countCols(); c++) {
this.set(r, this.colToProp(c), '');
}
}
}
/**
* Clear cached data length.
*/
}, {
key: "clearLengthCache",
value: function clearLengthCache() {
this.cachedLength = null;
}
/**
* Get data length.
*
* @returns {Number}
*/
}, {
key: "getLength",
value: function getLength() {
var _this4 = this;
var maxRowsFromSettings = this.instance.getSettings().maxRows;
var maxRows;
if (maxRowsFromSettings < 0 || maxRowsFromSettings === 0) {
maxRows = 0;
} else {
maxRows = maxRowsFromSettings || Infinity;
}
var length = this.instance.countSourceRows();
if (this.instance.hasHook('modifyRow')) {
var reValidate = this.skipCache;
this.interval.start();
if (length !== this.latestSourceRowsCount) {
reValidate = true;
}
this.latestSourceRowsCount = length;
if (this.cachedLength === null || reValidate) {
(0, _number.rangeEach)(length - 1, function (row) {
var physicalRow = _this4.instance.toPhysicalRow(row);
if (physicalRow === null) {
length -= 1;
}
});
this.cachedLength = length;
} else {
length = this.cachedLength;
}
} else {
this.interval.stop();
}
return Math.min(length, maxRows);
}
/**
* Returns the data array.
*
* @returns {Array}
*/
}, {
key: "getAll",
value: function getAll() {
var start = {
row: 0,
col: 0
};
var end = {
row: Math.max(this.instance.countSourceRows() - 1, 0),
col: Math.max(this.instance.countCols() - 1, 0)
};
if (start.row - end.row === 0 && !this.instance.countSourceRows()) {
return [];
}
return this.getRange(start, end, DataMap.DESTINATION_RENDERER);
}
/**
* Returns data range as array.
*
* @param {Object} [start] Start selection position. Visual indexes.
* @param {Object} [end] End selection position. Visual indexes.
* @param {Number} destination Destination of datamap.get
* @returns {Array}
*/
}, {
key: "getRange",
value: function getRange(start, end, destination) {
var output = [];
var r;
var c;
var row;
var maxRows = this.instance.getSettings().maxRows;
var maxCols = this.instance.getSettings().maxCols;
if (maxRows === 0 || maxCols === 0) {
return [];
}
var getFn = destination === DataMap.DESTINATION_CLIPBOARD_GENERATOR ? this.getCopyable : this.get;
var rlen = Math.min(Math.max(maxRows - 1, 0), Math.max(start.row, end.row));
var clen = Math.min(Math.max(maxCols - 1, 0), Math.max(start.col, end.col));
for (r = Math.min(start.row, end.row); r <= rlen; r++) {
row = [];
var physicalRow = this.instance.toPhysicalRow(r);
for (c = Math.min(start.col, end.col); c <= clen; c++) {
if (physicalRow === null) {
break;
}
row.push(getFn.call(this, r, this.colToProp(c)));
}
if (physicalRow !== null) {
output.push(row);
}
}
return output;
}
/**
* Return data as text (tab separated columns).
*
* @param {Object} [start] Start selection position. Visual indexes.
* @param {Object} [end] End selection position. Visual indexes.
* @returns {String}
*/
}, {
key: "getText",
value: function getText(start, end) {
return _SheetClip.default.stringify(this.getRange(start, end, DataMap.DESTINATION_RENDERER));
}
/**
* Return data as copyable text (tab separated columns intended for clipboard copy to an external application).
*
* @param {Object} [start] Start selection position. Visual indexes.
* @param {Object} [end] End selection position. Visual indexes.
* @returns {String}
*/
}, {
key: "getCopyableText",
value: function getCopyableText(start, end) {
return _SheetClip.default.stringify(this.getRange(start, end, DataMap.DESTINATION_CLIPBOARD_GENERATOR));
}
/**
* `skipLengthCache` callback.
*
* @private
* @param {Number} delay Time of the delay in milliseconds.
*/
}, {
key: "onSkipLengthCache",
value: function onSkipLengthCache(delay) {
var _this5 = this;
this.skipCache = true;
setTimeout(function () {
_this5.skipCache = false;
}, delay);
}
/**
* Destroy instance.
*/
}, {
key: "destroy",
value: function destroy() {
this.interval.stop();
this.interval = null;
this.instance = null;
this.priv = null;
this.GridSettings = null;
this.dataSource = null;
this.cachedLength = null;
this.duckSchema = null;
this.colToPropCache.length = 0;
this.propToColCache.clear();
this.propToColCache = void 0;
}
}]);
return DataMap;
}();
var _default = DataMap;
exports.default = _default;
/***/ }),
/* 370 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(23);
__webpack_require__(40);
exports.__esModule = true;
exports.parseDelay = parseDelay;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _feature = __webpack_require__(76);
/**
* @class Interval
* @util
*/
var Interval =
/*#__PURE__*/
function () {
(0, _createClass2.default)(Interval, null, [{
key: "create",
value: function create(func, delay) {
return new Interval(func, delay);
}
}]);
function Interval(func, delay) {
var _this = this;
(0, _classCallCheck2.default)(this, Interval);
/**
* Animation frame request id.
*
* @type {Number}
*/
this.timer = null;
/**
* Function to invoke repeatedly.
*
* @type {Function}
*/
this.func = func;
/**
* Number of milliseconds that function should wait before next call.
*/
this.delay = parseDelay(delay);
/**
* Flag which indicates if interval object was stopped.
*
* @type {Boolean}
* @default true
*/
this.stopped = true;
/**
* Interval time (in milliseconds) of the last callback call.
*
* @private
* @type {Number}
*/
this._then = null;
/**
* Bounded function `func`.
*
* @private
* @type {Function}
*/
this._callback = function () {
return _this.__callback();
};
}
/**
* Start loop.
*
* @returns {Interval}
*/
(0, _createClass2.default)(Interval, [{
key: "start",
value: function start() {
if (this.stopped) {
this._then = Date.now();
this.stopped = false;
this.timer = (0, _feature.requestAnimationFrame)(this._callback);
}
return this;
}
/**
* Stop looping.
*
* @returns {Interval}
*/
}, {
key: "stop",
value: function stop() {
if (!this.stopped) {
this.stopped = true;
(0, _feature.cancelAnimationFrame)(this.timer);
this.timer = null;
}
return this;
}
/**
* Loop callback, fired on every animation frame.
*
* @private
*/
}, {
key: "__callback",
value: function __callback() {
this.timer = (0, _feature.requestAnimationFrame)(this._callback);
if (this.delay) {
var now = Date.now();
var elapsed = now - this._then;
if (elapsed > this.delay) {
this._then = now - elapsed % this.delay;
this.func();
}
} else {
this.func();
}
}
}]);
return Interval;
}();
var _default = Interval;
/**
* Convert delay from string format to milliseconds.
*
* @param {Number|String} delay
* @returns {Number}
*/
exports.default = _default;
function parseDelay(delay) {
var result = delay;
if (typeof result === 'string' && /fps$/.test(result)) {
result = 1000 / parseInt(result.replace('fps', '') || 0, 10);
}
return result;
}
/***/ }),
/* 371 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(15);
__webpack_require__(10);
__webpack_require__(13);
__webpack_require__(24);
__webpack_require__(16);
exports.__esModule = true;
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _src = __webpack_require__(27);
var _unicode = __webpack_require__(55);
var _event = __webpack_require__(32);
var _editors = __webpack_require__(57);
var _eventManager = _interopRequireDefault(__webpack_require__(25));
var _baseEditor = __webpack_require__(117);
var _element = __webpack_require__(8);
var EditorManager =
/*#__PURE__*/
function () {
/**
* @param {Handsontable} instance
* @param {GridSettings} priv
* @param {Selection} selection
*/
function EditorManager(instance, priv, selection) {
var _this = this;
(0, _classCallCheck2.default)(this, EditorManager);
/**
* Instance of {@link Handsontable}
*
* @private
* @type {Handsontable}
*/
this.instance = instance;
/**
* Reference to an instance's private GridSettings object.
*
* @private
* @type {GridSettings}
*/
this.priv = priv;
/**
* Instance of {@link Selection}
*
* @private
* @type {Selection}
*/
this.selection = selection;
/**
* Instance of {@link EventManager}.
*
* @private
* @type {EventManager}
*/
this.eventManager = new _eventManager.default(instance);
/**
* Determines if EditorManager is destroyed.
*
* @private
* @type {Boolean}
*/
this.destroyed = false;
/**
* Determines if EditorManager is locked.
*
* @private
* @type {Boolean}
*/
this.lock = false;
/**
* A reference to an instance of the activeEditor.
*
* @private
* @type {*}
*/
this.activeEditor = void 0;
/**
* Keeps a reference to the cell's properties object.
*
* @type {Object}
*/
this.cellProperties = void 0;
this.instance.addHook('afterDocumentKeyDown', function (event) {
return _this.onAfterDocumentKeyDown(event);
});
var frame = this.instance.rootWindow;
while (frame) {
this.eventManager.addEventListener(frame.document.documentElement, 'keydown', function (event) {
if (!_this.destroyed) {
_this.instance.runHooks('afterDocumentKeyDown', event);
}
});
frame = (0, _element.getParentWindow)(frame);
} // Open editor when text composition is started (IME editor)
this.eventManager.addEventListener(this.instance.rootDocument.documentElement, 'compositionstart', function (event) {
if (!_this.destroyed && _this.activeEditor && !_this.activeEditor.isOpened() && _this.instance.isListening()) {
_this.openEditor('', event);
}
});
this.instance.view.wt.update('onCellDblClick', function (event, coords, elem) {
return _this.onCellDblClick(event, coords, elem);
});
}
/**
* Lock the editor from being prepared and closed. Locking the editor prevents its closing and
* reinitialized after selecting the new cell. This feature is necessary for a mobile editor.
*/
(0, _createClass2.default)(EditorManager, [{
key: "lockEditor",
value: function lockEditor() {
this.lock = true;
}
/**
* Unlock the editor from being prepared and closed. This method restores the original behavior of
* the editors where for every new selection its instances are closed.
*/
}, {
key: "unlockEditor",
value: function unlockEditor() {
this.lock = false;
}
/**
* Destroy current editor, if exists.
*
* @param {Boolean} revertOriginal
*/
}, {
key: "destroyEditor",
value: function destroyEditor(revertOriginal) {
if (!this.lock) {
this.closeEditor(revertOriginal);
}
}
/**
* Get active editor.
*
* @returns {*}
*/
}, {
key: "getActiveEditor",
value: function getActiveEditor() {
return this.activeEditor;
}
/**
* Prepare text input to be displayed at given grid cell.
*/
}, {
key: "prepareEditor",
value: function prepareEditor() {
var _this2 = this;
if (this.lock) {
return;
}
if (this.activeEditor && this.activeEditor.isWaiting()) {
this.closeEditor(false, false, function (dataSaved) {
if (dataSaved) {
_this2.prepareEditor();
}
});
return;
}
var _this$instance$select = this.instance.selection.selectedRange.current().highlight,
row = _this$instance$select.row,
col = _this$instance$select.col;
this.cellProperties = this.instance.getCellMeta(row, col);
if (this.cellProperties.readOnly) {
this.clearActiveEditor();
return;
}
var editorClass = this.instance.getCellEditor(this.cellProperties);
var td = this.instance.getCell(row, col, true);
if (editorClass && td) {
var prop = this.instance.colToProp(col);
var originalValue = this.instance.getSourceDataAtCell(this.instance.runHooks('modifyRow', row), col);
this.activeEditor = (0, _editors.getEditorInstance)(editorClass, this.instance);
this.activeEditor.prepare(row, col, prop, td, originalValue, this.cellProperties);
} else {
this.clearActiveEditor();
}
}
/**
* Check is editor is opened/showed.
*
* @returns {Boolean}
*/
}, {
key: "isEditorOpened",
value: function isEditorOpened() {
return this.activeEditor && this.activeEditor.isOpened();
}
/**
* Open editor with initial value.
*
* @param {null|String} newInitialValue new value from which editor will start if handled property it's not the `null`.
* @param {Event} event
*/
}, {
key: "openEditor",
value: function openEditor(newInitialValue, event) {
if (!this.activeEditor) {
return;
}
this.activeEditor.beginEditing(newInitialValue, event);
}
/**
* Close editor, finish editing cell.
*
* @param {Boolean} restoreOriginalValue
* @param {Boolean} [isCtrlPressed]
* @param {Function} [callback]
*/
}, {
key: "closeEditor",
value: function closeEditor(restoreOriginalValue, isCtrlPressed, callback) {
if (this.activeEditor) {
this.activeEditor.finishEditing(restoreOriginalValue, isCtrlPressed, callback);
} else if (callback) {
callback(false);
}
}
/**
* Close editor and save changes.
*
* @param {Boolean} isCtrlPressed
*/
}, {
key: "closeEditorAndSaveChanges",
value: function closeEditorAndSaveChanges(isCtrlPressed) {
this.closeEditor(false, isCtrlPressed);
}
/**
* Close editor and restore original value.
*
* @param {Boolean} isCtrlPressed
*/
}, {
key: "closeEditorAndRestoreOriginalValue",
value: function closeEditorAndRestoreOriginalValue(isCtrlPressed) {
return this.closeEditor(true, isCtrlPressed);
}
/**
* Clears reference to an instance of the active editor.
*
* @private
*/
}, {
key: "clearActiveEditor",
value: function clearActiveEditor() {
this.activeEditor = void 0;
}
/**
* Controls selection's behaviour after clicking `Enter`.
*
* @private
* @param {Boolean} isShiftPressed
*/
}, {
key: "moveSelectionAfterEnter",
value: function moveSelectionAfterEnter(isShiftPressed) {
var enterMoves = typeof this.priv.settings.enterMoves === 'function' ? this.priv.settings.enterMoves(event) : this.priv.settings.enterMoves;
if (isShiftPressed) {
// move selection up
this.selection.transformStart(-enterMoves.row, -enterMoves.col);
} else {
// move selection down (add a new row if needed)
this.selection.transformStart(enterMoves.row, enterMoves.col, true);
}
}
/**
* Controls selection behaviour after clicking `arrow up`.
*
* @private
* @param {Boolean} isShiftPressed
*/
}, {
key: "moveSelectionUp",
value: function moveSelectionUp(isShiftPressed) {
if (isShiftPressed) {
this.selection.transformEnd(-1, 0);
} else {
this.selection.transformStart(-1, 0);
}
}
/**
* Controls selection's behaviour after clicking `arrow down`.
*
* @private
* @param {Boolean} isShiftPressed
*/
}, {
key: "moveSelectionDown",
value: function moveSelectionDown(isShiftPressed) {
if (isShiftPressed) {
// expanding selection down with shift
this.selection.transformEnd(1, 0);
} else {
this.selection.transformStart(1, 0);
}
}
/**
* Controls selection's behaviour after clicking `arrow right`.
*
* @private
* @param {Boolean} isShiftPressed
*/
}, {
key: "moveSelectionRight",
value: function moveSelectionRight(isShiftPressed) {
if (isShiftPressed) {
this.selection.transformEnd(0, 1);
} else {
this.selection.transformStart(0, 1);
}
}
/**
* Controls selection's behaviour after clicking `arrow left`.
*
* @private
* @param {Boolean} isShiftPressed
*/
}, {
key: "moveSelectionLeft",
value: function moveSelectionLeft(isShiftPressed) {
if (isShiftPressed) {
this.selection.transformEnd(0, -1);
} else {
this.selection.transformStart(0, -1);
}
}
/**
* onAfterDocumentKeyDown callback.
*
* @private
* @param {KeyboardEvent} event
*/
}, {
key: "onAfterDocumentKeyDown",
value: function onAfterDocumentKeyDown(event) {
if (!this.instance.isListening()) {
return;
}
this.instance.runHooks('beforeKeyDown', event); // keyCode 229 aka 'uninitialized' doesn't take into account with editors. This key code is produced when unfinished
// character is entering (using IME editor). It is fired mainly on linux (ubuntu) with installed ibus-pinyin package.
if (this.destroyed || event.keyCode === 229) {
return;
}
if ((0, _event.isImmediatePropagationStopped)(event)) {
return;
}
this.priv.lastKeyCode = event.keyCode;
if (!this.selection.isSelected()) {
return;
} // catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)
var isCtrlPressed = (event.ctrlKey || event.metaKey) && !event.altKey;
if (this.activeEditor && !this.activeEditor.isWaiting()) {
if (!(0, _unicode.isMetaKey)(event.keyCode) && !(0, _unicode.isCtrlMetaKey)(event.keyCode) && !isCtrlPressed && !this.isEditorOpened()) {
this.openEditor('', event);
return;
}
}
var isShiftPressed = event.shiftKey;
var rangeModifier = isShiftPressed ? this.selection.setRangeEnd : this.selection.setRangeStart;
var tabMoves;
switch (event.keyCode) {
case _unicode.KEY_CODES.A:
if (!this.isEditorOpened() && isCtrlPressed) {
this.instance.selectAll();
event.preventDefault();
(0, _event.stopPropagation)(event);
}
break;
case _unicode.KEY_CODES.ARROW_UP:
if (this.isEditorOpened() && !this.activeEditor.isWaiting()) {
this.closeEditorAndSaveChanges(isCtrlPressed);
}
this.moveSelectionUp(isShiftPressed);
event.preventDefault();
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.ARROW_DOWN:
if (this.isEditorOpened() && !this.activeEditor.isWaiting()) {
this.closeEditorAndSaveChanges(isCtrlPressed);
}
this.moveSelectionDown(isShiftPressed);
event.preventDefault();
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.ARROW_RIGHT:
if (this.isEditorOpened() && !this.activeEditor.isWaiting()) {
this.closeEditorAndSaveChanges(isCtrlPressed);
}
this.moveSelectionRight(isShiftPressed);
event.preventDefault();
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.ARROW_LEFT:
if (this.isEditorOpened() && !this.activeEditor.isWaiting()) {
this.closeEditorAndSaveChanges(isCtrlPressed);
}
this.moveSelectionLeft(isShiftPressed);
event.preventDefault();
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.TAB:
tabMoves = typeof this.priv.settings.tabMoves === 'function' ? this.priv.settings.tabMoves(event) : this.priv.settings.tabMoves;
if (isShiftPressed) {
// move selection left
this.selection.transformStart(-tabMoves.row, -tabMoves.col);
} else {
// move selection right (add a new column if needed)
this.selection.transformStart(tabMoves.row, tabMoves.col, true);
}
event.preventDefault();
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.BACKSPACE:
case _unicode.KEY_CODES.DELETE:
this.instance.emptySelectedCells();
this.prepareEditor();
event.preventDefault();
break;
case _unicode.KEY_CODES.F2:
/* F2 */
if (this.activeEditor) {
this.activeEditor.enableFullEditMode();
}
this.openEditor(null, event);
event.preventDefault(); // prevent Opera from opening 'Go to Page dialog'
break;
case _unicode.KEY_CODES.ENTER:
/* return/enter */
if (this.isEditorOpened()) {
if (this.activeEditor && this.activeEditor.state !== _baseEditor.EditorState.WAITING) {
this.closeEditorAndSaveChanges(isCtrlPressed);
}
this.moveSelectionAfterEnter(isShiftPressed);
} else if (this.instance.getSettings().enterBeginsEditing) {
if (this.cellProperties.readOnly) {
this.moveSelectionAfterEnter();
} else if (this.activeEditor) {
this.activeEditor.enableFullEditMode();
this.openEditor(null, event);
}
} else {
this.moveSelectionAfterEnter(isShiftPressed);
}
event.preventDefault(); // don't add newline to field
(0, _event.stopImmediatePropagation)(event); // required by HandsontableEditor
break;
case _unicode.KEY_CODES.ESCAPE:
if (this.isEditorOpened()) {
this.closeEditorAndRestoreOriginalValue(isCtrlPressed);
this.activeEditor.focus();
}
event.preventDefault();
break;
case _unicode.KEY_CODES.HOME:
if (event.ctrlKey || event.metaKey) {
rangeModifier.call(this.selection, new _src.CellCoords(0, this.selection.selectedRange.current().from.col));
} else {
rangeModifier.call(this.selection, new _src.CellCoords(this.selection.selectedRange.current().from.row, 0));
}
event.preventDefault(); // don't scroll the window
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.END:
if (event.ctrlKey || event.metaKey) {
rangeModifier.call(this.selection, new _src.CellCoords(this.instance.countRows() - 1, this.selection.selectedRange.current().from.col));
} else {
rangeModifier.call(this.selection, new _src.CellCoords(this.selection.selectedRange.current().from.row, this.instance.countCols() - 1));
}
event.preventDefault(); // don't scroll the window
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.PAGE_UP:
this.selection.transformStart(-this.instance.countVisibleRows(), 0);
event.preventDefault(); // don't page up the window
(0, _event.stopPropagation)(event);
break;
case _unicode.KEY_CODES.PAGE_DOWN:
this.selection.transformStart(this.instance.countVisibleRows(), 0);
event.preventDefault(); // don't page down the window
(0, _event.stopPropagation)(event);
break;
default:
break;
}
}
/**
* onCellDblClick callback.
*
* @private
* @param {MouseEvent} event
* @param {Object} coords
* @param {HTMLTableCellElement|HTMLTableHeaderCellElement} elem
*/
}, {
key: "onCellDblClick",
value: function onCellDblClick(event, coords, elem) {
// may be TD or TH
if (elem.nodeName === 'TD') {
if (this.activeEditor) {
this.activeEditor.enableFullEditMode();
}
this.openEditor(null, event);
}
}
/**
* Destroy the instance.
*/
}, {
key: "destroy",
value: function destroy() {
this.destroyed = true;
this.eventManager.destroy();
}
}]);
return EditorManager;
}();
var instances = new WeakMap();
/**
* @param {Handsontable} hotInstance
* @param {GridSettings} hotSettings
* @param {Selection} selection
* @param {DataMap} datamap
*/
EditorManager.getInstance = function (hotInstance, hotSettings, selection, datamap) {
var editorManager = instances.get(hotInstance);
if (!editorManager) {
editorManager = new EditorManager(hotInstance, hotSettings, selection, datamap);
instances.set(hotInstance, editorManager);
}
return editorManager;
};
var _default = EditorManager;
exports.default = _default;
/***/ }),
/* 372 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var $ = __webpack_require__(20);
var $findIndex = __webpack_require__(75).findIndex;
var addToUnscopables = __webpack_require__(109);
var arrayMethodUsesToLength = __webpack_require__(59);
var FIND_INDEX = 'findIndex';
var SKIPS_HOLES = true;
var USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);
// Shouldn't skip holes
if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });
// `Array.prototype.findIndex` method
// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {
findIndex: function findIndex(callbackfn /* , that = undefined */) {
return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
}
});
// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
addToUnscopables(FIND_INDEX);
/***/ }),
/* 373 */
/***/ (function(module, exports, __webpack_require__) {
var $ = __webpack_require__(20);
var lastIndexOf = __webpack_require__(374);
// `Array.prototype.lastIndexOf` method
// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof
$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {
lastIndexOf: lastIndexOf
});
/***/ }),
/* 374 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var toIndexedObject = __webpack_require__(63);
var toInteger = __webpack_require__(82);
var toLength = __webpack_require__(49);
var arrayMethodIsStrict = __webpack_require__(84);
var arrayMethodUsesToLength = __webpack_require__(59);
var min = Math.min;
var nativeLastIndexOf = [].lastIndexOf;
var NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
var STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');
// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method
var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
var FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;
// `Array.prototype.lastIndexOf` method implementation
// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof
module.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
// convert -0 to +0
if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;
var O = toIndexedObject(this);
var length = toLength(O.length);
var index = length - 1;
if (arguments.length > 1) index = min(index, toInteger(arguments[1]));
if (index < 0) index = length + index;
for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
return -1;
} : nativeLastIndexOf;
/***/ }),
/* 375 */
/***/ (function(module, exports, __webpack_require__) {
var aFunction = __webpack_require__(138);
var toObject = __webpack_require__(58);
var IndexedObject = __webpack_require__(104);
var toLength = __webpack_require__(49);
// `Array.prototype.{ reduce, reduceRight }` methods implementation
var createMethod = function (IS_RIGHT) {
return function (that, callbackfn, argumentsLength, memo) {
aFunction(callbackfn);
var O = toObject(that);
var self = IndexedObject(O);
var length = toLength(O.length);
var index = IS_RIGHT ? length - 1 : 0;
var i = IS_RIGHT ? -1 : 1;
if (argumentsLength < 2) while (true) {
if (index in self) {
memo = self[index];
index += i;
break;
}
index += i;
if (IS_RIGHT ? index < 0 : length <= index) {
throw TypeError('Reduce of empty array with no initial value');
}
}
for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
memo = callbackfn(memo, self[index], index, O);
}
return memo;
};
};
module.exports = {
// `Array.prototype.reduce` method
// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
left: createMethod(false),
// `Array.prototype.reduceRight` method
// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright
right: createMethod(true)
};
/***/ }),
/* 376 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _interopRequireDefault = __webpack_require__(0);
__webpack_require__(15);
__webpack_require__(10);
__webpack_require__(13);
__webpack_require__(24);
__webpack_require__(16);
exports.__esModule = true;
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(18));
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(1));
var _createClass2 = _interopRequireDefault(__webpack_require__(2));
var _element = __webpack_require__(8);
var _eventManager = _interopRequireDefault(__webpack_require__(25));
var _event = __webpack_require__(32);
var _src = _interopRequireDefault(__webpack_require__(27));
var _mouseEventHandler = __webpack_require__(254);
var privatePool = new WeakMap();
/**
* @class TableView
* @private
*/
var TableView =
/*#__PURE__*/
function () {
/**
* @param {Hanstontable} instance Instance of {@link Handsontable}
*/
function TableView(instance) {
(0, _classCallCheck2.default)(this, TableView);
/**
* Instance of {@link Handsontable}
*
* @private
* @type {Handsontable}
*/
this.instance = instance;
/**
* Instance of {@link EventManager}
*
* @private
* @type {EventManager}
*/
this.eventManager = new _eventManager.default(instance);
/**
* Current Handsontable's GridSettings object.
*
* @private
* @type {GridSettings}
*/
this.settings = instance.getSettings();
/**
* Main element.
*
* @type {HTMLTableSectionElement}
*/
this.THEAD = void 0;
/**
* Main |