handsontable
Version:
Handsontable is a JavaScript Spreadsheet Component available for React, Angular and Vue.
726 lines (580 loc) • 30.2 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
require("core-js/modules/es.array.concat.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.map.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/es.weak-map.js");
require("core-js/modules/web.dom-collections.iterator.js");
exports.__esModule = true;
exports.NestedHeaders = exports.PLUGIN_PRIORITY = exports.PLUGIN_KEY = void 0;
var _element = require("../../helpers/dom/element");
var _array = require("../../helpers/array");
var _templateLiteralTag = require("../../helpers/templateLiteralTag");
var _console = require("../../helpers/console");
var _base = require("../base");
var _stateManager2 = _interopRequireDefault(require("./stateManager"));
var _ghostTable = _interopRequireDefault(require("./utils/ghostTable"));
var _templateObject, _templateObject2;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) 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 _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
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; }
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = privateMap.get(receiver); if (!descriptor) { throw new TypeError("attempted to set private field on non-instance"); } if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } return value; }
function _classPrivateFieldGet(receiver, privateMap) { var descriptor = privateMap.get(receiver); if (!descriptor) { throw new TypeError("attempted to get private field on non-instance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
var PLUGIN_KEY = 'nestedHeaders';
exports.PLUGIN_KEY = PLUGIN_KEY;
var PLUGIN_PRIORITY = 280;
/**
* @plugin NestedHeaders
* @description
* The plugin allows to create a nested header structure, using the HTML's colspan attribute.
*
* To make any header wider (covering multiple table columns), it's corresponding configuration array element should be
* provided as an object with `label` and `colspan` properties. The `label` property defines the header's label,
* while the `colspan` property defines a number of columns that the header should cover.
*
* __Note__ that the plugin supports a *nested* structure, which means, any header cannot be wider than it's "parent". In
* other words, headers cannot overlap each other.
* @example
*
* ```js
* const container = document.getElementById('example');
* const hot = new Handsontable(container, {
* data: getData(),
* nestedHeaders: [
* ['A', {label: 'B', colspan: 8}, 'C'],
* ['D', {label: 'E', colspan: 4}, {label: 'F', colspan: 4}, 'G'],
* ['H', {label: 'I', colspan: 2}, {label: 'J', colspan: 2}, {label: 'K', colspan: 2}, {label: 'L', colspan: 2}, 'M'],
* ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W']
* ],
* ```
*/
exports.PLUGIN_PRIORITY = PLUGIN_PRIORITY;
var _stateManager = new WeakMap();
var NestedHeaders = /*#__PURE__*/function (_BasePlugin) {
_inherits(NestedHeaders, _BasePlugin);
var _super = _createSuper(NestedHeaders);
function NestedHeaders() {
var _this;
_classCallCheck(this, NestedHeaders);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_stateManager.set(_assertThisInitialized(_this), {
writable: true,
value: new _stateManager2.default()
});
_defineProperty(_assertThisInitialized(_this), "ghostTable", new _ghostTable.default(_assertThisInitialized(_this)));
_defineProperty(_assertThisInitialized(_this), "detectedOverlappedHeaders", false);
return _this;
}
_createClass(NestedHeaders, [{
key: "isEnabled",
value:
/**
* Check if plugin is enabled.
*
* @returns {boolean}
*/
function isEnabled() {
return !!this.hot.getSettings()[PLUGIN_KEY];
}
/**
* Enables the plugin functionality for this Handsontable instance.
*/
}, {
key: "enablePlugin",
value: function enablePlugin() {
var _this2 = this;
if (this.enabled) {
return;
}
var _this$hot$getSettings = this.hot.getSettings(),
nestedHeaders = _this$hot$getSettings.nestedHeaders;
if (!Array.isArray(nestedHeaders) || !Array.isArray(nestedHeaders[0])) {
(0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject || (_templateObject = _taggedTemplateLiteral(["Your Nested Headers plugin configuration is invalid. The settings has to be \n passed as an array of arrays e.q. [['A1', { label: 'A2', colspan: 2 }]]"], ["Your Nested Headers plugin configuration is invalid. The settings has to be\\x20\n passed as an array of arrays e.q. [['A1', { label: 'A2', colspan: 2 }]]"]))));
}
this.addHook('init', function () {
return _this2.onInit();
});
this.addHook('afterLoadData', function () {
return _this2.onAfterLoadData.apply(_this2, arguments);
});
this.addHook('afterOnCellMouseDown', function (event, coords) {
return _this2.onAfterOnCellMouseDown(event, coords);
});
this.addHook('beforeOnCellMouseOver', function (event, coords, TD, blockCalculations) {
return _this2.onBeforeOnCellMouseOver(event, coords, TD, blockCalculations);
});
this.addHook('afterGetColumnHeaderRenderers', function (array) {
return _this2.onAfterGetColumnHeaderRenderers(array);
});
this.addHook('modifyColWidth', function (width, column) {
return _this2.onModifyColWidth(width, column);
});
this.addHook('afterViewportColumnCalculatorOverride', function (calc) {
return _this2.onAfterViewportColumnCalculatorOverride(calc);
});
_get(_getPrototypeOf(NestedHeaders.prototype), "enablePlugin", this).call(this);
this.updatePlugin(); // @TODO: Workaround for broken plugin initialization abstraction.
}
/**
* Updates the plugin state. This method is executed when {@link Core#updateSettings} is invoked.
*/
}, {
key: "updatePlugin",
value: function updatePlugin() {
if (!this.hot.view) {
// @TODO: Workaround for broken plugin initialization abstraction.
return;
}
var _this$hot$getSettings2 = this.hot.getSettings(),
nestedHeaders = _this$hot$getSettings2.nestedHeaders;
_classPrivateFieldGet(this, _stateManager).setColumnsLimit(this.hot.countCols());
if (Array.isArray(nestedHeaders)) {
this.detectedOverlappedHeaders = _classPrivateFieldGet(this, _stateManager).setState(nestedHeaders);
}
if (this.detectedOverlappedHeaders) {
(0, _console.warn)((0, _templateLiteralTag.toSingleLine)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["Your Nested Headers plugin setup contains overlapping headers. This kind of configuration \n is currently not supported."], ["Your Nested Headers plugin setup contains overlapping headers. This kind of configuration\\x20\n is currently not supported."]))));
}
this.ghostTable.buildWidthsMapper();
_get(_getPrototypeOf(NestedHeaders.prototype), "updatePlugin", this).call(this);
}
/**
* Disables the plugin functionality for this Handsontable instance.
*/
}, {
key: "disablePlugin",
value: function disablePlugin() {
this.clearColspans();
_classPrivateFieldGet(this, _stateManager).clear();
this.ghostTable.clear();
_get(_getPrototypeOf(NestedHeaders.prototype), "disablePlugin", this).call(this);
}
/**
* Returns an instance of the internal state manager of the plugin.
*
* @private
* @returns {StateManager}
*/
}, {
key: "getStateManager",
value: function getStateManager() {
return _classPrivateFieldGet(this, _stateManager);
}
/**
* Gets a total number of headers levels.
*
* @private
* @returns {number}
*/
}, {
key: "getLayersCount",
value: function getLayersCount() {
return _classPrivateFieldGet(this, _stateManager).getLayersCount();
}
/**
* Gets column settings for a specified header. The returned object contains
* information about the header label, its colspan length, or if it is hidden
* in the header renderers.
*
* @private
* @param {number} headerLevel Header level (0 = most distant to the table).
* @param {number} columnIndex A visual column index.
* @returns {object}
*/
}, {
key: "getHeaderSettings",
value: function getHeaderSettings(headerLevel, columnIndex) {
return _classPrivateFieldGet(this, _stateManager).getHeaderSettings(headerLevel, columnIndex);
}
/**
* Gets HTML elements for specified visual column index and header level from
* all overlays except master.
*
* @private
* @param {number} columnIndex A visual column index.
* @param {number} headerLevel Header level (0 = most distant to the table).
* @returns {HTMLElement[]}
*/
}, {
key: "getColumnHeaders",
value: function getColumnHeaders(columnIndex, headerLevel) {
var wtOverlays = this.hot.view.wt.wtOverlays;
var renderedColumnIndex = this.hot.columnIndexMapper.getRenderableFromVisualIndex(columnIndex);
var headers = [];
if (renderedColumnIndex !== null) {
if (wtOverlays.topOverlay) {
headers.push(wtOverlays.topOverlay.clone.wtTable.getColumnHeader(renderedColumnIndex, headerLevel));
}
if (wtOverlays.topLeftCornerOverlay) {
headers.push(wtOverlays.topLeftCornerOverlay.clone.wtTable.getColumnHeader(renderedColumnIndex, headerLevel));
}
}
return headers;
}
/**
* Clear the colspans remaining after plugin usage.
*
* @private
*/
}, {
key: "clearColspans",
value: function clearColspans() {
if (!this.hot.view) {
return;
}
var wt = this.hot.view.wt;
var headerLevels = wt.getSetting('columnHeaders').length;
var mainHeaders = wt.wtTable.THEAD;
var topHeaders = wt.wtOverlays.topOverlay.clone.wtTable.THEAD;
var topLeftCornerHeaders = wt.wtOverlays.topLeftCornerOverlay ? wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.THEAD : null;
for (var i = 0; i < headerLevels; i++) {
var masterLevel = mainHeaders.childNodes[i];
if (!masterLevel) {
break;
}
var topLevel = topHeaders.childNodes[i];
var topLeftCornerLevel = topLeftCornerHeaders ? topLeftCornerHeaders.childNodes[i] : null;
for (var j = 0, masterNodes = masterLevel.childNodes.length; j < masterNodes; j++) {
masterLevel.childNodes[j].removeAttribute('colspan');
(0, _element.removeClass)(masterLevel.childNodes[j], 'hiddenHeader');
if (topLevel && topLevel.childNodes[j]) {
topLevel.childNodes[j].removeAttribute('colspan');
(0, _element.removeClass)(topLevel.childNodes[j], 'hiddenHeader');
}
if (topLeftCornerHeaders && topLeftCornerLevel && topLeftCornerLevel.childNodes[j]) {
topLeftCornerLevel.childNodes[j].removeAttribute('colspan');
(0, _element.removeClass)(topLeftCornerLevel.childNodes[j], 'hiddenHeader');
}
}
}
}
/**
* Generates the appropriate header renderer for a header row.
*
* @private
* @param {number} headerLevel The index of header level counting from the top (positive
* values counting from 0 to N).
* @returns {Function}
* @fires Hooks#afterGetColHeader
*/
}, {
key: "headerRendererFactory",
value: function headerRendererFactory(headerLevel) {
var _this3 = this;
var fixedColumnsLeft = this.hot.getSettings().fixedColumnsLeft || 0;
return function (renderedColumnIndex, TH) {
var _this3$hot = _this3.hot,
rootDocument = _this3$hot.rootDocument,
columnIndexMapper = _this3$hot.columnIndexMapper,
view = _this3$hot.view;
var visualColumnsIndex = columnIndexMapper.getVisualFromRenderableIndex(renderedColumnIndex);
if (visualColumnsIndex === null) {
visualColumnsIndex = renderedColumnIndex;
}
TH.removeAttribute('colspan');
(0, _element.removeClass)(TH, 'hiddenHeader');
var _classPrivateFieldGet2 = _classPrivateFieldGet(_this3, _stateManager).getHeaderSettings(headerLevel, visualColumnsIndex),
colspan = _classPrivateFieldGet2.colspan,
label = _classPrivateFieldGet2.label,
isHidden = _classPrivateFieldGet2.isHidden;
if (isHidden === true) {
(0, _element.addClass)(TH, 'hiddenHeader');
} else if (colspan > 1) {
var _view$wt$wtOverlays$t, _view$wt$wtOverlays$l;
var isTopLeftOverlay = (_view$wt$wtOverlays$t = view.wt.wtOverlays.topLeftCornerOverlay) === null || _view$wt$wtOverlays$t === void 0 ? void 0 : _view$wt$wtOverlays$t.clone.wtTable.THEAD.contains(TH);
var isLeftOverlay = (_view$wt$wtOverlays$l = view.wt.wtOverlays.leftOverlay) === null || _view$wt$wtOverlays$l === void 0 ? void 0 : _view$wt$wtOverlays$l.clone.wtTable.THEAD.contains(TH); // Check if there is a fixed column enabled, if so then reduce colspan to fixed column width.
var correctedColspan = isTopLeftOverlay || isLeftOverlay ? Math.min(colspan, fixedColumnsLeft - visualColumnsIndex) : colspan;
if (correctedColspan > 1) {
TH.setAttribute('colspan', correctedColspan);
}
}
var divEl = rootDocument.createElement('div');
var spanEl = rootDocument.createElement('span');
(0, _element.addClass)(divEl, 'relative');
(0, _element.addClass)(spanEl, 'colHeader');
(0, _element.fastInnerHTML)(spanEl, label);
divEl.appendChild(spanEl);
(0, _element.empty)(TH);
TH.appendChild(divEl);
_this3.hot.runHooks('afterGetColHeader', visualColumnsIndex, TH);
};
}
/**
* Updates headers highlight in nested structure.
*
* @private
*/
}, {
key: "updateHeadersHighlight",
value: function updateHeadersHighlight() {
var _this4 = this;
var hot = this.hot;
var selection = hot.getSelectedRange();
if (selection === void 0) {
return;
}
var hotSettings = this.hot.getSettings();
var classNameModifier = function classNameModifier(className) {
return function (TH, modifier) {
return function () {
return TH ? modifier(TH, className) : null;
};
};
};
var highlightHeader = classNameModifier(hotSettings.currentHeaderClassName);
var activeHeader = classNameModifier(hotSettings.activeHeaderClassName);
var selectionByHeader = hot.selection.isSelectedByColumnHeader() || hot.selection.isSelectedByCorner();
var layersCount = _classPrivateFieldGet(this, _stateManager).getLayersCount();
var activeHeaderChanges = new Map();
var highlightHeaderChanges = new Map();
(0, _array.arrayEach)(selection, function (selectionLayer) {
var coordsFrom = selectionLayer.getTopLeftCorner();
var coordsTo = selectionLayer.getTopRightCorner(); // If the beginning of the selection (columnFrom) starts in-between colspaned
// header shift the columnFrom to the header position where it starts.
var columnFrom = _classPrivateFieldGet(_this4, _stateManager).findLeftMostColumnIndex(-1, coordsFrom.col);
var columnTo = coordsTo.col;
var columnSelectionWidth = columnTo - columnFrom + 1;
var columnCursor = 0;
for (var column = columnFrom; column <= columnTo; column++) {
var _loop = function _loop(level) {
var _classPrivateFieldGet3 = _classPrivateFieldGet(_this4, _stateManager).getHeaderSettings(level, column),
colspan = _classPrivateFieldGet3.colspan,
isHidden = _classPrivateFieldGet3.isHidden;
var isFirstLayer = level === layersCount - 1;
var isOutOfRange = !isFirstLayer && columnCursor + colspan > columnSelectionWidth;
var THs = _this4.getColumnHeaders(column, level);
(0, _array.arrayEach)(THs, function (TH) {
if (isOutOfRange || isHidden) {
// Reset CSS classes state (workaround for WoT issue which can not render that classes
// for nested header structure properly).
activeHeaderChanges.set(TH, activeHeader(TH, _element.removeClass));
highlightHeaderChanges.set(TH, highlightHeader(TH, _element.removeClass));
} else if (selectionByHeader) {
activeHeaderChanges.set(TH, activeHeader(TH, _element.addClass));
highlightHeaderChanges.set(TH, highlightHeader(TH, _element.addClass));
} else if (isFirstLayer) {
highlightHeaderChanges.set(TH, highlightHeader(TH, _element.addClass));
} else {
highlightHeaderChanges.set(TH, highlightHeader(TH, _element.removeClass));
}
});
};
// Traverse header layers from bottom to top.
for (var level = layersCount - 1; level > -1; level--) {
_loop(level);
}
columnCursor += 1;
}
});
(0, _array.arrayEach)(activeHeaderChanges, function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
classModifer = _ref2[1];
return void classModifer();
});
(0, _array.arrayEach)(highlightHeaderChanges, function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
classModifer = _ref4[1];
return void classModifer();
});
activeHeaderChanges.clear();
highlightHeaderChanges.clear();
}
/**
* Select all nested headers of clicked cell.
*
* @private
* @param {MouseEvent} event Mouse event.
* @param {CellCoords} coords Clicked cell coords.
*/
}, {
key: "onAfterOnCellMouseDown",
value: function onAfterOnCellMouseDown(event, coords) {
if (coords.row < 0) {
var _classPrivateFieldGet4 = _classPrivateFieldGet(this, _stateManager).getHeaderSettings(coords.row, coords.col),
origColspan = _classPrivateFieldGet4.origColspan;
if (origColspan > 1) {
this.hot.selection.selectColumns(coords.col, coords.col + origColspan - 1);
}
}
}
/**
* Make the header-selection properly select the nested headers.
*
* @private
* @param {MouseEvent} event Mouse event.
* @param {CellCoords} coords Clicked cell coords.
* @param {HTMLElement} TD The cell element.
* @param {object} blockCalculations An object which allows or disallows changing the selection for the particular axies.
*/
}, {
key: "onBeforeOnCellMouseOver",
value: function onBeforeOnCellMouseOver(event, coords, TD, blockCalculations) {
if (coords.row >= 0 || coords.col < 0 || !this.hot.view.isMouseDown()) {
return;
}
var _this$hot$getSelected = this.hot.getSelectedRangeLast(),
from = _this$hot$getSelected.from,
to = _this$hot$getSelected.to;
var _classPrivateFieldGet5 = _classPrivateFieldGet(this, _stateManager).getHeaderSettings(coords.row, coords.col),
origColspan = _classPrivateFieldGet5.origColspan;
var lastColIndex = coords.col + origColspan - 1;
var changeDirection = false;
if (from.col <= to.col) {
if (coords.col < from.col && lastColIndex === to.col || coords.col < from.col && lastColIndex < from.col || coords.col < from.col && lastColIndex >= from.col && lastColIndex < to.col) {
changeDirection = true;
}
} else if (coords.col < to.col && lastColIndex > from.col || coords.col > from.col || coords.col <= to.col && lastColIndex > from.col || coords.col > to.col && lastColIndex > from.col) {
changeDirection = true;
}
if (changeDirection) {
var _ref5 = [to.col, from.col];
from.col = _ref5[0];
to.col = _ref5[1];
}
if (origColspan > 1) {
var _this$hot;
blockCalculations.column = true;
blockCalculations.cell = true;
var columnRange = [];
if (from.col === to.col) {
if (lastColIndex <= from.col && coords.col < from.col) {
columnRange.push(to.col, coords.col);
} else {
columnRange.push(coords.col < from.col ? coords.col : from.col, lastColIndex > to.col ? lastColIndex : to.col);
}
}
if (from.col < to.col) {
columnRange.push(coords.col < from.col ? coords.col : from.col, lastColIndex);
}
if (from.col > to.col) {
columnRange.push(from.col, coords.col);
}
(_this$hot = this.hot).selectColumns.apply(_this$hot, columnRange);
}
}
/**
* `afterGetColumnHeader` hook callback - prepares the header structure.
*
* @private
* @param {Array} renderersArray Array of renderers.
*/
}, {
key: "onAfterGetColumnHeaderRenderers",
value: function onAfterGetColumnHeaderRenderers(renderersArray) {
if (renderersArray) {
renderersArray.length = 0;
for (var headerLayer = 0; headerLayer < _classPrivateFieldGet(this, _stateManager).getLayersCount(); headerLayer++) {
renderersArray.push(this.headerRendererFactory(headerLayer));
}
}
this.updateHeadersHighlight();
}
/**
* Make the renderer render the first nested column in its entirety.
*
* @private
* @param {object} calc Viewport column calculator.
*/
}, {
key: "onAfterViewportColumnCalculatorOverride",
value: function onAfterViewportColumnCalculatorOverride(calc) {
var newStartColumn = calc.startColumn;
for (var headerLayer = 0; headerLayer < _classPrivateFieldGet(this, _stateManager).getLayersCount(); headerLayer++) {
var startColumn = _classPrivateFieldGet(this, _stateManager).findLeftMostColumnIndex(headerLayer, calc.startColumn);
var renderedStartColumn = this.hot.columnIndexMapper.getRenderableFromVisualIndex(startColumn);
if (renderedStartColumn < calc.startColumn) {
newStartColumn = renderedStartColumn;
break;
}
}
calc.startColumn = newStartColumn;
}
/**
* `modifyColWidth` hook callback - returns width from cache, when is greater than incoming from hook.
*
* @private
* @param {number} width Width from hook.
* @param {number} column Visual index of an column.
* @returns {number}
*/
}, {
key: "onModifyColWidth",
value: function onModifyColWidth(width, column) {
var cachedWidth = this.ghostTable.widthsCache[column];
return width > cachedWidth ? width : cachedWidth;
}
/**
* Updates the plugin state after HoT initialization.
*
* @private
*/
}, {
key: "onInit",
value: function onInit() {
// @TODO: Workaround for broken plugin initialization abstraction.
this.updatePlugin();
}
/**
* Updates the plugin state after new dataset load.
*
* @private
* @param {Array[]} sourceData Array of arrays or array of objects containing data.
* @param {boolean} initialLoad Flag that determines whether the data has been loaded
* during the initialization.
*/
}, {
key: "onAfterLoadData",
value: function onAfterLoadData(sourceData, initialLoad) {
if (!initialLoad) {
this.updatePlugin();
}
}
/**
* Destroys the plugin instance.
*/
}, {
key: "destroy",
value: function destroy() {
_classPrivateFieldSet(this, _stateManager, null);
_get(_getPrototypeOf(NestedHeaders.prototype), "destroy", this).call(this);
}
}], [{
key: "PLUGIN_KEY",
get: function get() {
return PLUGIN_KEY;
}
}, {
key: "PLUGIN_PRIORITY",
get: function get() {
return PLUGIN_PRIORITY;
}
/**
* @private
* @type {StateManager}
*/
}]);
return NestedHeaders;
}(_base.BasePlugin);
exports.NestedHeaders = NestedHeaders;