"use strict";
require("core-js/modules/es.symbol");
require("core-js/modules/es.symbol.description");
require("core-js/modules/es.symbol.iterator");
require("core-js/modules/es.array.iterator");
require("core-js/modules/es.object.to-string");
require("core-js/modules/es.regexp.to-string");
require("core-js/modules/es.string.iterator");
require("core-js/modules/es.weak-map");
require("core-js/modules/web.dom-collections.iterator");
exports.__esModule = true;
exports.default = void 0;
var _element = require("./helpers/dom/element");
var _eventManager = _interopRequireDefault(require("./eventManager"));
var _event = require("./helpers/dom/event");
var _src = _interopRequireDefault(require("./3rdparty/walkontable/src"));
var _mouseEventHandler = require("./selection/mouseEventHandler");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var privatePool = new WeakMap();
/**
* @class TableView
* @private
*/
var TableView =
/*#__PURE__*/
function () {
/**
* @param {Hanstontable} instance Instance of {@link Handsontable}
*/
function TableView(instance) {
_classCallCheck(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
element.
*
* @type {HTMLTableSectionElement}
*/
this.TBODY = void 0;
/**
* Main Walkontable instance.
*
* @type {Walkontable}
*/
this.wt = void 0;
/**
* Main Walkontable instance.
*
* @private
* @type {Walkontable}
*/
this.activeWt = void 0;
privatePool.set(this, {
/**
* Defines if the text should be selected during mousemove.
*
* @private
* @type {Boolean}
*/
selectionMouseDown: false,
/**
* @private
* @type {Boolean}
*/
mouseDown: void 0,
/**
* Main element.
*
* @private
* @type {HTMLTableElement}
*/
table: void 0,
/**
* Cached width of the rootElement.
*
* @type {Number}
*/
lastWidth: 0,
/**
* Cached height of the rootElement.
*
* @type {Number}
*/
lastHeight: 0
});
this.createElements();
this.registerEvents();
this.initializeWalkontable();
}
/**
* Renders WalkontableUI.
*/
_createClass(TableView, [{
key: "render",
value: function render() {
this.wt.draw(!this.instance.forceFullRender);
this.instance.forceFullRender = false;
this.instance.renderCall = false;
}
/**
* Returns td object given coordinates
*
* @param {CellCoords} coords
* @param {Boolean} topmost
* @returns {HTMLTableCellElement|null}
*/
}, {
key: "getCellAtCoords",
value: function getCellAtCoords(coords, topmost) {
var td = this.wt.getCell(coords, topmost);
if (td < 0) {
// there was an exit code (cell is out of bounds)
return null;
}
return td;
}
/**
* Scroll viewport to a cell.
*
* @param {CellCoords} coords
* @param {Boolean} [snapToTop]
* @param {Boolean} [snapToRight]
* @param {Boolean} [snapToBottom]
* @param {Boolean} [snapToLeft]
* @returns {Boolean}
*/
}, {
key: "scrollViewport",
value: function scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft) {
return this.wt.scrollViewport(coords, snapToTop, snapToRight, snapToBottom, snapToLeft);
}
/**
* Scroll viewport to a column.
*
* @param {Number} column Visual column index.
* @param {Boolean} [snapToLeft]
* @param {Boolean} [snapToRight]
* @returns {Boolean}
*/
}, {
key: "scrollViewportHorizontally",
value: function scrollViewportHorizontally(column, snapToRight, snapToLeft) {
return this.wt.scrollViewportHorizontally(column, snapToRight, snapToLeft);
}
/**
* Scroll viewport to a row.
*
* @param {Number} row Visual row index.
* @param {Boolean} [snapToTop]
* @param {Boolean} [snapToBottom]
* @returns {Boolean}
*/
}, {
key: "scrollViewportVertically",
value: function scrollViewportVertically(row, snapToTop, snapToBottom) {
return this.wt.scrollViewportVertically(row, snapToTop, snapToBottom);
}
/**
* Prepares DOMElements and adds correct className to the root element.
*
* @private
*/
}, {
key: "createElements",
value: function createElements() {
var priv = privatePool.get(this);
var _this$instance = this.instance,
rootElement = _this$instance.rootElement,
rootDocument = _this$instance.rootDocument;
var originalStyle = rootElement.getAttribute('style');
if (originalStyle) {
rootElement.setAttribute('data-originalstyle', originalStyle); // needed to retrieve original style in jsFiddle link generator in HT examples. may be removed in future versions
}
(0, _element.addClass)(rootElement, 'handsontable');
priv.table = rootDocument.createElement('TABLE');
(0, _element.addClass)(priv.table, 'htCore');
if (this.instance.getSettings().tableClassName) {
(0, _element.addClass)(priv.table, this.instance.getSettings().tableClassName);
}
this.THEAD = rootDocument.createElement('THEAD');
priv.table.appendChild(this.THEAD);
this.TBODY = rootDocument.createElement('TBODY');
priv.table.appendChild(this.TBODY);
this.instance.table = priv.table;
this.instance.container.insertBefore(priv.table, this.instance.container.firstChild);
}
/**
* Attaches necessary listeners.
*
* @private
*/
}, {
key: "registerEvents",
value: function registerEvents() {
var _this = this;
var priv = privatePool.get(this);
var _this$instance2 = this.instance,
rootElement = _this$instance2.rootElement,
rootDocument = _this$instance2.rootDocument;
var documentElement = rootDocument.documentElement;
this.eventManager.addEventListener(rootElement, 'mousedown', function (event) {
priv.selectionMouseDown = true;
if (!_this.isTextSelectionAllowed(event.target)) {
var rootWindow = _this.instance.rootWindow;
(0, _element.clearTextSelection)(rootWindow);
event.preventDefault();
rootWindow.focus(); // make sure that window that contains HOT is active. Important when HOT is in iframe.
}
});
this.eventManager.addEventListener(rootElement, 'mouseup', function () {
priv.selectionMouseDown = false;
});
this.eventManager.addEventListener(rootElement, 'mousemove', function (event) {
if (priv.selectionMouseDown && !_this.isTextSelectionAllowed(event.target)) {
// Clear selection only when fragmentSelection is enabled, otherwise clearing selection breakes the IME editor.
if (_this.settings.fragmentSelection) {
(0, _element.clearTextSelection)(_this.instance.rootWindow);
}
event.preventDefault();
}
});
this.eventManager.addEventListener(documentElement, 'keyup', function (event) {
if (_this.instance.selection.isInProgress() && !event.shiftKey) {
_this.instance.selection.finish();
}
});
this.eventManager.addEventListener(documentElement, 'mouseup', function (event) {
if (_this.instance.selection.isInProgress() && (0, _event.isLeftClick)(event)) {
// is left mouse button
_this.instance.selection.finish();
}
priv.mouseDown = false;
if ((0, _element.isOutsideInput)(rootDocument.activeElement) || !_this.instance.selection.isSelected() && !(0, _event.isRightClick)(event)) {
_this.instance.unlisten();
}
});
this.eventManager.addEventListener(documentElement, 'contextmenu', function (event) {
if (_this.instance.selection.isInProgress() && (0, _event.isRightClick)(event)) {
_this.instance.selection.finish();
priv.mouseDown = false;
}
});
this.eventManager.addEventListener(documentElement, 'touchend', function () {
if (_this.instance.selection.isInProgress()) {
_this.instance.selection.finish();
}
priv.mouseDown = false;
});
this.eventManager.addEventListener(documentElement, 'mousedown', function (event) {
var originalTarget = event.target;
var eventX = event.x || event.clientX;
var eventY = event.y || event.clientY;
var next = event.target;
if (priv.mouseDown || !rootElement || !_this.instance.view) {
return; // it must have been started in a cell
} // immediate click on "holder" means click on the right side of vertical scrollbar
var holder = _this.instance.view.wt.wtTable.holder;
if (next === holder) {
var scrollbarWidth = (0, _element.getScrollbarWidth)(rootDocument);
if (rootDocument.elementFromPoint(eventX + scrollbarWidth, eventY) !== holder || rootDocument.elementFromPoint(eventX, eventY + scrollbarWidth) !== holder) {
return;
}
} else {
while (next !== documentElement) {
if (next === null) {
if (event.isTargetWebComponent) {
break;
} // click on something that was a row but now is detached (possibly because your click triggered a rerender)
return;
}
if (next === rootElement) {
// click inside container
return;
}
next = next.parentNode;
}
} // function did not return until here, we have an outside click!
var outsideClickDeselects = typeof _this.settings.outsideClickDeselects === 'function' ? _this.settings.outsideClickDeselects(originalTarget) : _this.settings.outsideClickDeselects;
if (outsideClickDeselects) {
_this.instance.deselectCell();
} else {
_this.instance.destroyEditor(false, false);
}
});
this.eventManager.addEventListener(priv.table, 'selectstart', function (event) {
if (_this.settings.fragmentSelection || (0, _element.isInput)(event.target)) {
return;
} // https://github.com/handsontable/handsontable/issues/160
// Prevent text from being selected when performing drag down.
event.preventDefault();
});
}
/**
* Defines default configuration and initializes WalkOnTable intance.
*
* @private
*/
}, {
key: "initializeWalkontable",
value: function initializeWalkontable() {
var _this2 = this;
var priv = privatePool.get(this);
var walkontableConfig = {
debug: function debug() {
return _this2.settings.debug;
},
externalRowCalculator: this.instance.getPlugin('autoRowSize') && this.instance.getPlugin('autoRowSize').isEnabled(),
table: priv.table,
preventOverflow: function preventOverflow() {
return _this2.settings.preventOverflow;
},
preventWheel: function preventWheel() {
return _this2.settings.preventWheel;
},
stretchH: function stretchH() {
return _this2.settings.stretchH;
},
data: this.instance.getDataAtCell,
totalRows: function totalRows() {
return _this2.instance.countRows();
},
totalColumns: function totalColumns() {
return _this2.instance.countCols();
},
fixedColumnsLeft: function fixedColumnsLeft() {
return _this2.settings.fixedColumnsLeft;
},
fixedRowsTop: function fixedRowsTop() {
return _this2.settings.fixedRowsTop;
},
fixedRowsBottom: function fixedRowsBottom() {
return _this2.settings.fixedRowsBottom;
},
minSpareRows: function minSpareRows() {
return _this2.settings.minSpareRows;
},
renderAllRows: this.settings.renderAllRows,
rowHeaders: function rowHeaders() {
var headerRenderers = [];
if (_this2.instance.hasRowHeaders()) {
headerRenderers.push(function (row, TH) {
return _this2.appendRowHeader(row, TH);
});
}
_this2.instance.runHooks('afterGetRowHeaderRenderers', headerRenderers);
return headerRenderers;
},
columnHeaders: function columnHeaders() {
var headerRenderers = [];
if (_this2.instance.hasColHeaders()) {
headerRenderers.push(function (column, TH) {
_this2.appendColHeader(column, TH);
});
}
_this2.instance.runHooks('afterGetColumnHeaderRenderers', headerRenderers);
return headerRenderers;
},
columnWidth: this.instance.getColWidth,
rowHeight: this.instance.getRowHeight,
cellRenderer: function cellRenderer(row, col, TD) {
var cellProperties = _this2.instance.getCellMeta(row, col);
var prop = _this2.instance.colToProp(col);
var value = _this2.instance.getDataAtRowProp(row, prop);
if (_this2.instance.hasHook('beforeValueRender')) {
value = _this2.instance.runHooks('beforeValueRender', value, cellProperties);
}
_this2.instance.runHooks('beforeRenderer', TD, row, col, prop, value, cellProperties);
_this2.instance.getCellRenderer(cellProperties)(_this2.instance, TD, row, col, prop, value, cellProperties);
_this2.instance.runHooks('afterRenderer', TD, row, col, prop, value, cellProperties);
},
selections: this.instance.selection.highlight,
hideBorderOnMouseDownOver: function hideBorderOnMouseDownOver() {
return _this2.settings.fragmentSelection;
},
onWindowResize: function onWindowResize() {
if (!_this2.instance || _this2.instance.isDestroyed) {
return;
}
_this2.instance.refreshDimensions();
},
onCellMouseDown: function onCellMouseDown(event, coords, TD, wt) {
var blockCalculations = {
row: false,
column: false,
cell: false
};
_this2.instance.listen();
_this2.activeWt = wt;
priv.mouseDown = true;
_this2.instance.runHooks('beforeOnCellMouseDown', event, coords, TD, blockCalculations);
if ((0, _event.isImmediatePropagationStopped)(event)) {
return;
}
(0, _mouseEventHandler.handleMouseEvent)(event, {
coords: coords,
selection: _this2.instance.selection,
controller: blockCalculations
});
_this2.instance.runHooks('afterOnCellMouseDown', event, coords, TD);
_this2.activeWt = _this2.wt;
},
onCellContextMenu: function onCellContextMenu(event, coords, TD, wt) {
_this2.activeWt = wt;
priv.mouseDown = false;
if (_this2.instance.selection.isInProgress()) {
_this2.instance.selection.finish();
}
_this2.instance.runHooks('beforeOnCellContextMenu', event, coords, TD);
if ((0, _event.isImmediatePropagationStopped)(event)) {
return;
}
_this2.instance.runHooks('afterOnCellContextMenu', event, coords, TD);
_this2.activeWt = _this2.wt;
},
onCellMouseOut: function onCellMouseOut(event, coords, TD, wt) {
_this2.activeWt = wt;
_this2.instance.runHooks('beforeOnCellMouseOut', event, coords, TD);
if ((0, _event.isImmediatePropagationStopped)(event)) {
return;
}
_this2.instance.runHooks('afterOnCellMouseOut', event, coords, TD);
_this2.activeWt = _this2.wt;
},
onCellMouseOver: function onCellMouseOver(event, coords, TD, wt) {
var blockCalculations = {
row: false,
column: false,
cell: false
};
_this2.activeWt = wt;
_this2.instance.runHooks('beforeOnCellMouseOver', event, coords, TD, blockCalculations);
if ((0, _event.isImmediatePropagationStopped)(event)) {
return;
}
if (priv.mouseDown) {
(0, _mouseEventHandler.handleMouseEvent)(event, {
coords: coords,
selection: _this2.instance.selection,
controller: blockCalculations
});
}
_this2.instance.runHooks('afterOnCellMouseOver', event, coords, TD);
_this2.activeWt = _this2.wt;
},
onCellMouseUp: function onCellMouseUp(event, coords, TD, wt) {
_this2.activeWt = wt;
_this2.instance.runHooks('beforeOnCellMouseUp', event, coords, TD);
if ((0, _event.isImmediatePropagationStopped)(event)) {
return;
}
_this2.instance.runHooks('afterOnCellMouseUp', event, coords, TD);
_this2.activeWt = _this2.wt;
},
onCellCornerMouseDown: function onCellCornerMouseDown(event) {
event.preventDefault();
_this2.instance.runHooks('afterOnCellCornerMouseDown', event);
},
onCellCornerDblClick: function onCellCornerDblClick(event) {
event.preventDefault();
_this2.instance.runHooks('afterOnCellCornerDblClick', event);
},
beforeDraw: function beforeDraw(force, skipRender) {
return _this2.beforeRender(force, skipRender);
},
onDraw: function onDraw(force) {
return _this2.onDraw(force);
},
onScrollVertically: function onScrollVertically() {
return _this2.instance.runHooks('afterScrollVertically');
},
onScrollHorizontally: function onScrollHorizontally() {
return _this2.instance.runHooks('afterScrollHorizontally');
},
onBeforeRemoveCellClassNames: function onBeforeRemoveCellClassNames() {
return _this2.instance.runHooks('beforeRemoveCellClassNames');
},
onAfterDrawSelection: function onAfterDrawSelection(currentRow, currentColumn, cornersOfSelection, layerLevel) {
return _this2.instance.runHooks('afterDrawSelection', currentRow, currentColumn, cornersOfSelection, layerLevel);
},
onBeforeDrawBorders: function onBeforeDrawBorders(corners, borderClassName) {
return _this2.instance.runHooks('beforeDrawBorders', corners, borderClassName);
},
onBeforeTouchScroll: function onBeforeTouchScroll() {
return _this2.instance.runHooks('beforeTouchScroll');
},
onAfterMomentumScroll: function onAfterMomentumScroll() {
return _this2.instance.runHooks('afterMomentumScroll');
},
onBeforeStretchingColumnWidth: function onBeforeStretchingColumnWidth(stretchedWidth, column) {
return _this2.instance.runHooks('beforeStretchingColumnWidth', stretchedWidth, column);
},
onModifyRowHeaderWidth: function onModifyRowHeaderWidth(rowHeaderWidth) {
return _this2.instance.runHooks('modifyRowHeaderWidth', rowHeaderWidth);
},
onModifyGetCellCoords: function onModifyGetCellCoords(row, column, topmost) {
return _this2.instance.runHooks('modifyGetCellCoords', row, column, topmost);
},
viewportRowCalculatorOverride: function viewportRowCalculatorOverride(calc) {
var viewportOffset = _this2.settings.viewportRowRenderingOffset;
if (viewportOffset === 'auto' && _this2.settings.fixedRowsTop) {
viewportOffset = 10;
}
if (viewportOffset > 0 || viewportOffset === 'auto') {
var rows = _this2.instance.countRows();
if (typeof viewportOffset === 'number') {
calc.startRow = Math.max(calc.startRow - viewportOffset, 0);
calc.endRow = Math.min(calc.endRow + viewportOffset, rows - 1);
} else if (viewportOffset === 'auto') {
var center = calc.startRow + calc.endRow - calc.startRow;
var offset = Math.ceil(center / rows * 12);
calc.startRow = Math.max(calc.startRow - offset, 0);
calc.endRow = Math.min(calc.endRow + offset, rows - 1);
}
}
_this2.instance.runHooks('afterViewportRowCalculatorOverride', calc);
},
viewportColumnCalculatorOverride: function viewportColumnCalculatorOverride(calc) {
var viewportOffset = _this2.settings.viewportColumnRenderingOffset;
if (viewportOffset === 'auto' && _this2.settings.fixedColumnsLeft) {
viewportOffset = 10;
}
if (viewportOffset > 0 || viewportOffset === 'auto') {
var cols = _this2.instance.countCols();
if (typeof viewportOffset === 'number') {
calc.startColumn = Math.max(calc.startColumn - viewportOffset, 0);
calc.endColumn = Math.min(calc.endColumn + viewportOffset, cols - 1);
}
if (viewportOffset === 'auto') {
var center = calc.startColumn + calc.endColumn - calc.startColumn;
var offset = Math.ceil(center / cols * 12);
calc.startRow = Math.max(calc.startColumn - offset, 0);
calc.endColumn = Math.min(calc.endColumn + offset, cols - 1);
}
}
_this2.instance.runHooks('afterViewportColumnCalculatorOverride', calc);
},
rowHeaderWidth: function rowHeaderWidth() {
return _this2.settings.rowHeaderWidth;
},
columnHeaderHeight: function columnHeaderHeight() {
var columnHeaderHeight = _this2.instance.runHooks('modifyColumnHeaderHeight');
return _this2.settings.columnHeaderHeight || columnHeaderHeight;
}
};
this.instance.runHooks('beforeInitWalkontable', walkontableConfig);
this.wt = new _src.default(walkontableConfig);
this.activeWt = this.wt;
var spreader = this.wt.wtTable.spreader; // We have to cache width and height after Walkontable initialization.
var _this$instance$rootEl = this.instance.rootElement.getBoundingClientRect(),
width = _this$instance$rootEl.width,
height = _this$instance$rootEl.height;
this.setLastSize(width, height);
this.eventManager.addEventListener(spreader, 'mousedown', function (event) {
// right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar
if (event.target === spreader && event.which === 3) {
(0, _event.stopPropagation)(event);
}
});
this.eventManager.addEventListener(spreader, 'contextmenu', function (event) {
// right mouse button exactly on spreader means right click on the right hand side of vertical scrollbar
if (event.target === spreader && event.which === 3) {
(0, _event.stopPropagation)(event);
}
});
this.eventManager.addEventListener(this.instance.rootDocument.documentElement, 'click', function () {
if (_this2.settings.observeDOMVisibility) {
if (_this2.wt.drawInterrupted) {
_this2.instance.forceFullRender = true;
_this2.render();
}
}
});
}
/**
* Checks if it's possible to create text selection in element.
*
* @private
* @param {HTMLElement} el
* @returns {Boolean}
*/
}, {
key: "isTextSelectionAllowed",
value: function isTextSelectionAllowed(el) {
if ((0, _element.isInput)(el)) {
return true;
}
var isChildOfTableBody = (0, _element.isChildOf)(el, this.instance.view.wt.wtTable.spreader);
if (this.settings.fragmentSelection === true && isChildOfTableBody) {
return true;
}
if (this.settings.fragmentSelection === 'cell' && this.isSelectedOnlyCell() && isChildOfTableBody) {
return true;
}
if (!this.settings.fragmentSelection && this.isCellEdited() && this.isSelectedOnlyCell()) {
return true;
}
return false;
}
/**
* Checks if user's been called mousedown.
*
* @private
* @returns {Boolean}
*/
}, {
key: "isMouseDown",
value: function isMouseDown() {
return privatePool.get(this).mouseDown;
}
/**
* Check if selected only one cell.
*
* @private
* @returns {Boolean}
*/
}, {
key: "isSelectedOnlyCell",
value: function isSelectedOnlyCell() {
var _ref = this.instance.getSelectedLast() || [],
_ref2 = _slicedToArray(_ref, 4),
row = _ref2[0],
col = _ref2[1],
rowEnd = _ref2[2],
colEnd = _ref2[3];
return row !== void 0 && row === rowEnd && col === colEnd;
}
/**
* Checks if active cell is editing.
*
* @private
* @returns {Boolean}
*/
}, {
key: "isCellEdited",
value: function isCellEdited() {
var activeEditor = this.instance.getActiveEditor();
return activeEditor && activeEditor.isOpened();
}
/**
* `beforeDraw` callback.
*
* @private
* @param {Boolean} force
* @param {Boolean} skipRender
*/
}, {
key: "beforeRender",
value: function beforeRender(force, skipRender) {
if (force) {
// this.instance.forceFullRender = did Handsontable request full render?
this.instance.runHooks('beforeRender', this.instance.forceFullRender, skipRender);
}
}
/**
* `onDraw` callback.
*
* @private
* @param {Boolean} force
*/
}, {
key: "onDraw",
value: function onDraw(force) {
if (force) {
// this.instance.forceFullRender = did Handsontable request full render?
this.instance.runHooks('afterRender', this.instance.forceFullRender);
}
}
/**
* Append row header to a TH element
*
* @private
* @param row
* @param TH
*/
}, {
key: "appendRowHeader",
value: function appendRowHeader(row, TH) {
if (TH.firstChild) {
var container = TH.firstChild;
if (!(0, _element.hasClass)(container, 'relative')) {
(0, _element.empty)(TH);
this.appendRowHeader(row, TH);
return;
}
this.updateCellHeader(container.querySelector('.rowHeader'), row, this.instance.getRowHeader);
} else {
var _this$instance3 = this.instance,
rootDocument = _this$instance3.rootDocument,
getRowHeader = _this$instance3.getRowHeader;
var div = rootDocument.createElement('div');
var span = rootDocument.createElement('span');
div.className = 'relative';
span.className = 'rowHeader';
this.updateCellHeader(span, row, getRowHeader);
div.appendChild(span);
TH.appendChild(div);
}
this.instance.runHooks('afterGetRowHeader', row, TH);
}
/**
* Append column header to a TH element
*
* @private
* @param col
* @param TH
*/
}, {
key: "appendColHeader",
value: function appendColHeader(col, TH) {
if (TH.firstChild) {
var container = TH.firstChild;
if ((0, _element.hasClass)(container, 'relative')) {
this.updateCellHeader(container.querySelector('.colHeader'), col, this.instance.getColHeader);
} else {
(0, _element.empty)(TH);
this.appendColHeader(col, TH);
}
} else {
var rootDocument = this.instance.rootDocument;
var div = rootDocument.createElement('div');
var span = rootDocument.createElement('span');
div.className = 'relative';
span.className = 'colHeader';
this.updateCellHeader(span, col, this.instance.getColHeader);
div.appendChild(span);
TH.appendChild(div);
}
this.instance.runHooks('afterGetColHeader', col, TH);
}
/**
* Updates header cell content.
*
* @since 0.15.0-beta4
* @param {HTMLElement} element Element to update
* @param {Number} index Row index or column index
* @param {Function} content Function which should be returns content for this cell
*/
}, {
key: "updateCellHeader",
value: function updateCellHeader(element, index, content) {
var renderedIndex = index;
var parentOverlay = this.wt.wtOverlays.getParentOverlay(element) || this.wt; // prevent wrong calculations from SampleGenerator
if (element.parentNode) {
if ((0, _element.hasClass)(element, 'colHeader')) {
renderedIndex = parentOverlay.wtTable.columnFilter.sourceToRendered(index);
} else if ((0, _element.hasClass)(element, 'rowHeader')) {
renderedIndex = parentOverlay.wtTable.rowFilter.sourceToRendered(index);
}
}
if (renderedIndex > -1) {
(0, _element.fastInnerHTML)(element, content(index));
} else {
// workaround for https://github.com/handsontable/handsontable/issues/1946
(0, _element.fastInnerText)(element, String.fromCharCode(160));
(0, _element.addClass)(element, 'cornerHeader');
}
}
/**
* Given a element's left position relative to the viewport, returns maximum element width until the right
* edge of the viewport (before scrollbar)
*
* @private
* @param {Number} leftOffset
* @return {Number}
*/
}, {
key: "maximumVisibleElementWidth",
value: function maximumVisibleElementWidth(leftOffset) {
var workspaceWidth = this.wt.wtViewport.getWorkspaceWidth();
var maxWidth = workspaceWidth - leftOffset;
return maxWidth > 0 ? maxWidth : 0;
}
/**
* Given a element's top position relative to the viewport, returns maximum element height until the bottom
* edge of the viewport (before scrollbar)
*
* @private
* @param {Number} topOffset
* @return {Number}
*/
}, {
key: "maximumVisibleElementHeight",
value: function maximumVisibleElementHeight(topOffset) {
var workspaceHeight = this.wt.wtViewport.getWorkspaceHeight();
var maxHeight = workspaceHeight - topOffset;
return maxHeight > 0 ? maxHeight : 0;
}
/**
* Sets new dimensions of the container.
*/
}, {
key: "setLastSize",
value: function setLastSize(width, height) {
var priv = privatePool.get(this);
var _ref3 = [width, height];
priv.lastWidth = _ref3[0];
priv.lastHeight = _ref3[1];
}
/**
* Returns cached dimensions.
*/
}, {
key: "getLastSize",
value: function getLastSize() {
var priv = privatePool.get(this);
return {
width: priv.lastWidth,
height: priv.lastHeight
};
}
/**
* Checks if master overlay is active.
*
* @private
* @returns {Boolean}
*/
}, {
key: "mainViewIsActive",
value: function mainViewIsActive() {
return this.wt === this.activeWt;
}
/**
* Destroyes internal WalkOnTable's instance. Detaches all of the bonded listeners.
*
* @private
*/
}, {
key: "destroy",
value: function destroy() {
this.wt.destroy();
this.eventManager.destroy();
}
}]);
return TableView;
}();
var _default = TableView;
exports.default = _default;