handsontable 0.0.0-next-88f4ae4-20250313 → 0.0.0-next-a1cc3b8-20250314

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

Files changed (41) hide show
  1. package/base.js +2 -2
  2. package/base.mjs +2 -2
  3. package/core.d.ts +1 -1
  4. package/core.js +7 -1
  5. package/core.mjs +7 -1
  6. package/dataMap/metaManager/index.js +8 -9
  7. package/dataMap/metaManager/index.mjs +8 -9
  8. package/dataMap/metaManager/mods/dynamicCellMeta.js +4 -1
  9. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +4 -1
  10. package/dist/handsontable.css +2 -2
  11. package/dist/handsontable.full.css +2 -2
  12. package/dist/handsontable.full.js +143 -108
  13. package/dist/handsontable.full.min.css +2 -2
  14. package/dist/handsontable.full.min.js +12 -12
  15. package/dist/handsontable.js +143 -108
  16. package/dist/handsontable.min.css +2 -2
  17. package/dist/handsontable.min.js +13 -13
  18. package/editors/textEditor/textEditor.js +1 -1
  19. package/editors/textEditor/textEditor.mjs +2 -2
  20. package/helpers/dom/element.js +2 -2
  21. package/helpers/dom/element.mjs +1 -1
  22. package/helpers/mixed.js +1 -1
  23. package/helpers/mixed.mjs +1 -1
  24. package/package.json +1 -1
  25. package/plugins/autoColumnSize/autoColumnSize.js +37 -16
  26. package/plugins/autoColumnSize/autoColumnSize.mjs +37 -16
  27. package/plugins/autoRowSize/autoRowSize.js +11 -0
  28. package/plugins/autoRowSize/autoRowSize.mjs +11 -0
  29. package/plugins/copyPaste/copyPaste.js +6 -12
  30. package/plugins/copyPaste/copyPaste.mjs +7 -13
  31. package/plugins/formulas/formulas.d.ts +1 -1
  32. package/plugins/formulas/formulas.js +57 -60
  33. package/plugins/formulas/formulas.mjs +59 -62
  34. package/plugins/formulas/indexSyncer/axisSyncer.js +5 -1
  35. package/plugins/formulas/indexSyncer/axisSyncer.mjs +5 -1
  36. package/styles/handsontable.css +2 -2
  37. package/styles/handsontable.min.css +2 -2
  38. package/styles/ht-theme-horizon.css +2 -2
  39. package/styles/ht-theme-horizon.min.css +2 -2
  40. package/styles/ht-theme-main.css +2 -2
  41. package/styles/ht-theme-main.min.css +2 -2
@@ -25,8 +25,8 @@
25
25
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
26
26
  * USE OR INABILITY TO USE THIS SOFTWARE.
27
27
  *
28
- * Version: 0.0.0-next-88f4ae4-20250313
29
- * Release date: 20/02/2025 (built at 13/03/2025 08:17:35)
28
+ * Version: 0.0.0-next-a1cc3b8-20250314
29
+ * Release date: 20/02/2025 (built at 14/03/2025 11:34:35)
30
30
  */
31
31
  (function webpackUniversalModuleDefinition(root, factory) {
32
32
  if(typeof exports === 'object' && typeof module === 'object')
@@ -104,8 +104,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
104
104
  Handsontable.CellCoords = _src.CellCoords;
105
105
  Handsontable.CellRange = _src.CellRange;
106
106
  Handsontable.packageName = 'handsontable';
107
- Handsontable.buildDate = "13/03/2025 08:17:35";
108
- Handsontable.version = "0.0.0-next-88f4ae4-20250313";
107
+ Handsontable.buildDate = "14/03/2025 11:34:35";
108
+ Handsontable.version = "0.0.0-next-a1cc3b8-20250314";
109
109
  Handsontable.languages = {
110
110
  dictionaryKeys: _registry.dictionaryKeys,
111
111
  getLanguageDictionary: _registry.getLanguageDictionary,
@@ -3216,11 +3216,16 @@ function Core(rootElement, userSettings) {
3216
3216
  * @function getCellMeta
3217
3217
  * @param {number} row Visual row index.
3218
3218
  * @param {number} column Visual column index.
3219
+ * @param {object} options Execution options for the `getCellMeta` method.
3220
+ * @param {boolean} [options.skipMetaExtension=false] If `true`, skips extending the cell meta object. This means, the `cells` function, as well as the `afterGetCellMeta` and `beforeGetCellMeta` hooks, will not be called.
3219
3221
  * @returns {object} The cell properties object.
3220
3222
  * @fires Hooks#beforeGetCellMeta
3221
3223
  * @fires Hooks#afterGetCellMeta
3222
3224
  */
3223
3225
  this.getCellMeta = function (row, column) {
3226
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
3227
+ skipMetaExtension: false
3228
+ };
3224
3229
  let physicalRow = this.toPhysicalRow(row);
3225
3230
  let physicalColumn = this.toPhysicalColumn(column);
3226
3231
  if (physicalRow === null) {
@@ -3231,7 +3236,8 @@ function Core(rootElement, userSettings) {
3231
3236
  }
3232
3237
  return metaManager.getCellMeta(physicalRow, physicalColumn, {
3233
3238
  visualRow: row,
3234
- visualColumn: column
3239
+ visualColumn: column,
3240
+ ...options
3235
3241
  });
3236
3242
  };
3237
3243
 
@@ -8665,8 +8671,8 @@ exports.isChildOf = isChildOf;
8665
8671
  exports.isDetached = isDetached;
8666
8672
  exports.isHTMLElement = isHTMLElement;
8667
8673
  exports.isInput = isInput;
8674
+ exports.isInternalElement = isInternalElement;
8668
8675
  exports.isOutsideInput = isOutsideInput;
8669
- exports.isThisHotChild = isThisHotChild;
8670
8676
  exports.isVisible = isVisible;
8671
8677
  exports.makeElementContentEditableAndSelectItsContent = makeElementContentEditableAndSelectItsContent;
8672
8678
  exports.matchesCSSRules = matchesCSSRules;
@@ -8727,7 +8733,7 @@ function getParent(element) {
8727
8733
  * @param {HTMLElement} thisHotContainer The Handsontable container.
8728
8734
  * @returns {boolean}
8729
8735
  */
8730
- function isThisHotChild(element, thisHotContainer) {
8736
+ function isInternalElement(element, thisHotContainer) {
8731
8737
  const closestHandsontableContainer = element.closest('.handsontable');
8732
8738
  return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
8733
8739
  }
@@ -10091,7 +10097,7 @@ const domMessages = {
10091
10097
  function _injectProductInfo(key, element) {
10092
10098
  const hasValidType = !isEmpty(key);
10093
10099
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
10094
- const hotVersion = "0.0.0-next-88f4ae4-20250313";
10100
+ const hotVersion = "0.0.0-next-a1cc3b8-20250314";
10095
10101
  let keyValidityDate;
10096
10102
  let consoleMessageState = 'invalid';
10097
10103
  let domMessageState = 'invalid';
@@ -40089,22 +40095,21 @@ class MetaManager {
40089
40095
  *
40090
40096
  * @param {number} physicalRow The physical row index.
40091
40097
  * @param {number} physicalColumn The physical column index.
40092
- * @param {object} options Additional options that are used to extend the cell meta object.
40098
+ * @param {object} options Options for the `getCellMeta` method.
40093
40099
  * @param {number} options.visualRow The visual row index of the currently requested cell meta object.
40094
40100
  * @param {number} options.visualColumn The visual column index of the currently requested cell meta object.
40101
+ * @param {boolean} [options.skipMetaExtension=false] If `true`, omits the `afterGetCellMeta` hook which calls the `extendCellMeta` method.
40095
40102
  * @returns {object}
40096
40103
  */
40097
- getCellMeta(physicalRow, physicalColumn, _ref) {
40098
- let {
40099
- visualRow,
40100
- visualColumn
40101
- } = _ref;
40104
+ getCellMeta(physicalRow, physicalColumn, options) {
40102
40105
  const cellMeta = this.cellMeta.getMeta(physicalRow, physicalColumn);
40103
- cellMeta.visualRow = visualRow;
40104
- cellMeta.visualCol = visualColumn;
40106
+ cellMeta.visualRow = options.visualRow;
40107
+ cellMeta.visualCol = options.visualColumn;
40105
40108
  cellMeta.row = physicalRow;
40106
40109
  cellMeta.col = physicalColumn;
40107
- this.runLocalHooks('afterGetCellMeta', cellMeta);
40110
+ if (!options.skipMetaExtension) {
40111
+ this.runLocalHooks('afterGetCellMeta', cellMeta);
40112
+ }
40108
40113
  return cellMeta;
40109
40114
  }
40110
40115
 
@@ -46428,6 +46433,7 @@ var _function = __webpack_require__(163);
46428
46433
  */
46429
46434
  class DynamicCellMetaMod {
46430
46435
  constructor(metaManager) {
46436
+ var _this = this;
46431
46437
  /**
46432
46438
  * @type {MetaManager}
46433
46439
  */
@@ -46437,7 +46443,9 @@ class DynamicCellMetaMod {
46437
46443
  */
46438
46444
  (0, _defineProperty2.default)(this, "metaSyncMemo", new Map());
46439
46445
  this.metaManager = metaManager;
46440
- metaManager.addLocalHook('afterGetCellMeta', cellMeta => this.extendCellMeta(cellMeta));
46446
+ metaManager.addLocalHook('afterGetCellMeta', function () {
46447
+ return _this.extendCellMeta(...arguments);
46448
+ });
46441
46449
  _hooks.Hooks.getSingleton().add('beforeRender', forceFullRender => {
46442
46450
  if (forceFullRender) {
46443
46451
  this.metaSyncMemo.clear();
@@ -50273,7 +50281,7 @@ class TextEditor extends _baseEditor.BaseEditor {
50273
50281
  */
50274
50282
  close() {
50275
50283
  this.autoResize.unObserve();
50276
- if ((0, _element.isThisHotChild)(this.hot.rootDocument.activeElement, this.hot.rootElement)) {
50284
+ if ((0, _element.isInternalElement)(this.hot.rootDocument.activeElement, this.hot.rootElement)) {
50277
50285
  this.hot.listen(); // don't refocus the table if user focused some cell outside of HT on purpose
50278
50286
  }
50279
50287
  this.hideEditableElement();
@@ -54874,6 +54882,7 @@ const COLUMN_SIZE_MAP_NAME = 'autoColumnSize';
54874
54882
  * :::
54875
54883
  */
54876
54884
  /* eslint-enable jsdoc/require-description-complete-sentence */
54885
+ var _isInitialized = /*#__PURE__*/new WeakMap();
54877
54886
  var _cachedColumnHeaders = /*#__PURE__*/new WeakMap();
54878
54887
  var _visualColumnsToRefresh = /*#__PURE__*/new WeakMap();
54879
54888
  var _AutoColumnSize_brand = /*#__PURE__*/new WeakSet();
@@ -54963,6 +54972,12 @@ class AutoColumnSize extends _base.BasePlugin {
54963
54972
  * @type {PhysicalIndexToValueMap}
54964
54973
  */
54965
54974
  (0, _defineProperty2.default)(this, "columnWidthsMap", new _translations.PhysicalIndexToValueMap());
54975
+ /**
54976
+ * `true` value indicates that the #onInit() function has been already called.
54977
+ *
54978
+ * @type {boolean}
54979
+ */
54980
+ _classPrivateFieldInitSpec(this, _isInitialized, false);
54966
54981
  /**
54967
54982
  * Cached column header names. It is used to diff current column headers with previous state and detect which
54968
54983
  * columns width should be updated.
@@ -55101,17 +55116,11 @@ class AutoColumnSize extends _base.BasePlugin {
55101
55116
  physicalColumn = visualColumn;
55102
55117
  }
55103
55118
  if (overwriteCache || this.columnWidthsMap.getValueAtIndex(physicalColumn) === null && !this.hot._getColWidthFromSettings(physicalColumn)) {
55104
- const samples = this.samplesGenerator.generateColumnSamples(visualColumn, rowsRange);
55105
- samples.forEach((sample, column) => this.ghostTable.addColumn(column, sample));
55119
+ _assertClassBrand(_AutoColumnSize_brand, this, _fillGhostTableWithSamples).call(this, visualColumn, rowsRange);
55106
55120
  }
55107
55121
  });
55108
55122
  if (this.ghostTable.columns.length) {
55109
- this.hot.batchExecution(() => {
55110
- this.ghostTable.getWidths((visualColumn, width) => {
55111
- const physicalColumn = this.hot.toPhysicalColumn(visualColumn);
55112
- this.columnWidthsMap.setValueAtIndex(physicalColumn, width);
55113
- });
55114
- }, true);
55123
+ _assertClassBrand(_AutoColumnSize_brand, this, _updateColumnWidthsMapBasedOnGhostTable).call(this);
55115
55124
  this.measuredColumns = columnsRange.to + 1;
55116
55125
  this.ghostTable.clean();
55117
55126
  }
@@ -55322,20 +55331,36 @@ function _calculateSpecificColumnsWidth(visualColumns) {
55322
55331
  return;
55323
55332
  }
55324
55333
  if (!this.hot._getColWidthFromSettings(physicalColumn)) {
55325
- const samples = this.samplesGenerator.generateColumnSamples(visualColumn, rowsRange);
55326
- samples.forEach((sample, column) => this.ghostTable.addColumn(column, sample));
55334
+ _assertClassBrand(_AutoColumnSize_brand, this, _fillGhostTableWithSamples).call(this, visualColumn, rowsRange);
55327
55335
  }
55328
55336
  });
55329
55337
  if (this.ghostTable.columns.length) {
55330
- this.hot.batchExecution(() => {
55331
- this.ghostTable.getWidths((visualColumn, width) => {
55332
- const physicalColumn = this.hot.toPhysicalColumn(visualColumn);
55333
- this.columnWidthsMap.setValueAtIndex(physicalColumn, width);
55334
- });
55335
- }, true);
55338
+ _assertClassBrand(_AutoColumnSize_brand, this, _updateColumnWidthsMapBasedOnGhostTable).call(this);
55336
55339
  this.ghostTable.clean();
55337
55340
  }
55338
55341
  }
55342
+ /**
55343
+ * Processes a single column for width calculation.
55344
+ *
55345
+ * @param {number} visualColumn Visual column index.
55346
+ * @param {object} rowsRange Range of rows to process.
55347
+ */
55348
+ function _fillGhostTableWithSamples(visualColumn, rowsRange) {
55349
+ const samples = this.samplesGenerator.generateColumnSamples(visualColumn, rowsRange);
55350
+ samples.forEach((sample, column) => this.ghostTable.addColumn(column, sample));
55351
+ }
55352
+ /**
55353
+ * Updates the column widths map with calculated widths from the ghost table.
55354
+ *
55355
+ */
55356
+ function _updateColumnWidthsMapBasedOnGhostTable() {
55357
+ this.hot.batchExecution(() => {
55358
+ this.ghostTable.getWidths((visualColumn, width) => {
55359
+ const physicalColumn = this.hot.toPhysicalColumn(visualColumn);
55360
+ this.columnWidthsMap.setValueAtIndex(physicalColumn, width);
55361
+ });
55362
+ }, true);
55363
+ }
55339
55364
  function _onBeforeRender() {
55340
55365
  this.calculateVisibleColumnsWidth();
55341
55366
  if (!this.inProgress) {
@@ -55392,6 +55417,7 @@ function _onBeforeColumnResize(size, column, isDblClick) {
55392
55417
  function _onInit() {
55393
55418
  _classPrivateFieldSet(_cachedColumnHeaders, this, this.hot.getColHeader());
55394
55419
  this.recalculateAllColumnsWidth();
55420
+ _classPrivateFieldSet(_isInitialized, this, true);
55395
55421
  }
55396
55422
  /**
55397
55423
  * After formulas values updated listener.
@@ -55399,6 +55425,9 @@ function _onInit() {
55399
55425
  * @param {Array} changes An array of modified data.
55400
55426
  */
55401
55427
  function _onAfterFormulasValuesUpdate(changes) {
55428
+ if (!_classPrivateFieldGet(_isInitialized, this)) {
55429
+ return;
55430
+ }
55402
55431
  const changedColumns = changes.reduce((acc, change) => {
55403
55432
  var _change$address;
55404
55433
  const physicalColumn = (_change$address = change.address) === null || _change$address === void 0 ? void 0 : _change$address.col;
@@ -57252,6 +57281,7 @@ const ROW_WIDTHS_MAP_NAME = 'autoRowSize';
57252
57281
  */
57253
57282
  /* eslint-enable jsdoc/require-description-complete-sentence */
57254
57283
  var _visualRowsToRefresh = /*#__PURE__*/new WeakMap();
57284
+ var _isInitialized = /*#__PURE__*/new WeakMap();
57255
57285
  var _AutoRowSize_brand = /*#__PURE__*/new WeakSet();
57256
57286
  class AutoRowSize extends _base.BasePlugin {
57257
57287
  static get PLUGIN_KEY() {
@@ -57354,6 +57384,12 @@ class AutoRowSize extends _base.BasePlugin {
57354
57384
  * @type {number[]}
57355
57385
  */
57356
57386
  _classPrivateFieldInitSpec(this, _visualRowsToRefresh, []);
57387
+ /**
57388
+ * `true` value indicates that the #onInit() function has been already called.
57389
+ *
57390
+ * @type {boolean}
57391
+ */
57392
+ _classPrivateFieldInitSpec(this, _isInitialized, false);
57357
57393
  this.hot.rowIndexMapper.registerMap(ROW_WIDTHS_MAP_NAME, this.rowHeightsMap);
57358
57394
 
57359
57395
  // Leave the listener active to allow auto-sizing the rows when the plugin is disabled.
@@ -57784,6 +57820,7 @@ function _onBeforeChange(changes) {
57784
57820
  */
57785
57821
  function _onInit() {
57786
57822
  this.recalculateAllRowsHeight();
57823
+ _classPrivateFieldSet(_isInitialized, this, true);
57787
57824
  }
57788
57825
  /**
57789
57826
  * After formulas values updated listener.
@@ -57791,6 +57828,9 @@ function _onInit() {
57791
57828
  * @param {Array} changes An array of modified data.
57792
57829
  */
57793
57830
  function _onAfterFormulasValuesUpdate(changes) {
57831
+ if (!_classPrivateFieldGet(_isInitialized, this)) {
57832
+ return;
57833
+ }
57794
57834
  const changedRows = changes.reduce((acc, change) => {
57795
57835
  var _change$address;
57796
57836
  const physicalRow = (_change$address = change.address) === null || _change$address === void 0 ? void 0 : _change$address.row;
@@ -66794,12 +66834,10 @@ class CopyPaste extends _base.BasePlugin {
66794
66834
  * @private
66795
66835
  */
66796
66836
  onCopy(event) {
66797
- var _event$target, _this$hot$getSelected;
66837
+ var _event$target;
66798
66838
  const focusedElement = this.hot.getFocusManager().getRefocusElement();
66799
66839
  const isHotInput = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.hasAttribute('data-hot-input');
66800
- const selectedCell = (_this$hot$getSelected = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected === void 0 ? void 0 : _this$hot$getSelected.highlight;
66801
- const TD = selectedCell ? this.hot.getCell(selectedCell.row, selectedCell.col, true) : null;
66802
- if (!this.hot.isListening() && !_classPrivateFieldGet(_isTriggeredByCopy, this) || this.isEditorOpened() || (0, _element.isHTMLElement)(event.target) && (isHotInput && event.target !== focusedElement || !isHotInput && event.target !== this.hot.rootDocument.body && TD !== event.target)) {
66840
+ if (!this.hot.isListening() && !_classPrivateFieldGet(_isTriggeredByCopy, this) || this.isEditorOpened() || (0, _element.isHTMLElement)(event.target) && (isHotInput && event.target !== focusedElement || !isHotInput && event.target !== this.hot.rootDocument.body && !(0, _element.isInternalElement)(event.target, this.hot.rootElement))) {
66803
66841
  return;
66804
66842
  }
66805
66843
  event.preventDefault();
@@ -66829,12 +66867,10 @@ class CopyPaste extends _base.BasePlugin {
66829
66867
  * @private
66830
66868
  */
66831
66869
  onCut(event) {
66832
- var _event$target2, _this$hot$getSelected2;
66870
+ var _event$target2;
66833
66871
  const focusedElement = this.hot.getFocusManager().getRefocusElement();
66834
66872
  const isHotInput = (_event$target2 = event.target) === null || _event$target2 === void 0 ? void 0 : _event$target2.hasAttribute('data-hot-input');
66835
- const selectedCell = (_this$hot$getSelected2 = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected2 === void 0 ? void 0 : _this$hot$getSelected2.highlight;
66836
- const TD = selectedCell ? this.hot.getCell(selectedCell.row, selectedCell.col, true) : null;
66837
- if (!this.hot.isListening() && !_classPrivateFieldGet(_isTriggeredByCut, this) || this.isEditorOpened() || (0, _element.isHTMLElement)(event.target) && (isHotInput && event.target !== focusedElement || !isHotInput && event.target !== this.hot.rootDocument.body && TD !== event.target)) {
66873
+ if (!this.hot.isListening() && !_classPrivateFieldGet(_isTriggeredByCut, this) || this.isEditorOpened() || (0, _element.isHTMLElement)(event.target) && (isHotInput && event.target !== focusedElement || !isHotInput && event.target !== this.hot.rootDocument.body && !(0, _element.isInternalElement)(event.target, this.hot.rootElement))) {
66838
66874
  return;
66839
66875
  }
66840
66876
  event.preventDefault();
@@ -66863,12 +66899,10 @@ class CopyPaste extends _base.BasePlugin {
66863
66899
  * @private
66864
66900
  */
66865
66901
  onPaste(event) {
66866
- var _event$target3, _this$hot$getSelected3;
66902
+ var _event$target3;
66867
66903
  const focusedElement = this.hot.getFocusManager().getRefocusElement();
66868
66904
  const isHotInput = (_event$target3 = event.target) === null || _event$target3 === void 0 ? void 0 : _event$target3.hasAttribute('data-hot-input');
66869
- const selectedCell = (_this$hot$getSelected3 = this.hot.getSelectedRangeLast()) === null || _this$hot$getSelected3 === void 0 ? void 0 : _this$hot$getSelected3.highlight;
66870
- const TD = selectedCell ? this.hot.getCell(selectedCell.row, selectedCell.col, true) : null;
66871
- if (!this.hot.isListening() || this.isEditorOpened() || !this.hot.getSelected() || (0, _element.isHTMLElement)(event.target) && (isHotInput && event.target !== focusedElement || !isHotInput && event.target !== this.hot.rootDocument.body && TD !== event.target)) {
66905
+ if (!this.hot.isListening() || this.isEditorOpened() || !this.hot.getSelected() || (0, _element.isHTMLElement)(event.target) && (isHotInput && event.target !== focusedElement || !isHotInput && event.target !== this.hot.rootDocument.body && !(0, _element.isInternalElement)(event.target, this.hot.rootElement))) {
66872
66906
  return;
66873
66907
  }
66874
66908
  event.preventDefault();
@@ -75485,7 +75519,6 @@ __webpack_require__(111);
75485
75519
  __webpack_require__(113);
75486
75520
  __webpack_require__(115);
75487
75521
  __webpack_require__(289);
75488
- __webpack_require__(185);
75489
75522
  __webpack_require__(133);
75490
75523
  __webpack_require__(142);
75491
75524
  var _defineProperty2 = _interopRequireDefault(__webpack_require__(170));
@@ -75543,13 +75576,9 @@ class Formulas extends _base.BasePlugin {
75543
75576
  super(...arguments);
75544
75577
  _this = this;
75545
75578
  /**
75546
- * The hook allows to translate the formula value to calculated value before it goes to the
75547
- * validator function.
75579
+ * Update sheetName and sheetId properties.
75548
75580
  *
75549
- * @param {*} value The cell value to validate.
75550
- * @param {number} visualRow The visual row index.
75551
- * @param {number|string} prop The visual column index or property name of the column.
75552
- * @returns {*} Returns value to validate.
75581
+ * @param {string} [sheetName] The new sheet name.
75553
75582
  */
75554
75583
  _classPrivateMethodInitSpec(this, _Formulas_brand);
75555
75584
  /**
@@ -75616,6 +75645,12 @@ class Formulas extends _base.BasePlugin {
75616
75645
  * @type {HyperFormula|null}
75617
75646
  */
75618
75647
  (0, _defineProperty2.default)(this, "engine", null);
75648
+ /**
75649
+ * HyperFormula's sheet id.
75650
+ *
75651
+ * @type {number|null}
75652
+ */
75653
+ (0, _defineProperty2.default)(this, "sheetId", null);
75619
75654
  /**
75620
75655
  * HyperFormula's sheet name.
75621
75656
  *
@@ -75650,15 +75685,6 @@ class Formulas extends _base.BasePlugin {
75650
75685
  static get SETTING_KEYS() {
75651
75686
  return [PLUGIN_KEY, ...SETTING_KEYS];
75652
75687
  }
75653
- /**
75654
- * HyperFormula's sheet id.
75655
- *
75656
- * @type {number|null}
75657
- */
75658
- get sheetId() {
75659
- return this.sheetName === null ? null : this.engine.getSheetId(this.sheetName);
75660
- }
75661
-
75662
75688
  /**
75663
75689
  * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
75664
75690
  * hook and if it returns `true` then the {@link Formulas#enablePlugin} method is called.
@@ -75689,7 +75715,7 @@ class Formulas extends _base.BasePlugin {
75689
75715
  if (this.sheetName !== null && !this.engine.doesSheetExist(this.sheetName)) {
75690
75716
  const newSheetName = this.addSheet(this.sheetName, this.hot.getSourceDataArray());
75691
75717
  if (newSheetName !== false) {
75692
- this.sheetName = newSheetName;
75718
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newSheetName);
75693
75719
  }
75694
75720
  }
75695
75721
  this.addHook('beforeLoadData', function () {
@@ -75920,7 +75946,8 @@ class Formulas extends _base.BasePlugin {
75920
75946
  if (sheetName && this.engine.doesSheetExist(sheetName)) {
75921
75947
  this.switchSheet(this.sheetName);
75922
75948
  } else {
75923
- this.sheetName = this.addSheet(sheetName !== null && sheetName !== void 0 ? sheetName : undefined, this.hot.getSourceDataArray());
75949
+ const newSheetName = this.addSheet(sheetName !== null && sheetName !== void 0 ? sheetName : undefined, this.hot.getSourceDataArray());
75950
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newSheetName);
75924
75951
  }
75925
75952
  }
75926
75953
  super.updatePlugin(newSettings);
@@ -75940,7 +75967,6 @@ class Formulas extends _base.BasePlugin {
75940
75967
  this.engine = null;
75941
75968
  super.destroy();
75942
75969
  }
75943
-
75944
75970
  /**
75945
75971
  * Add a sheet to the shared HyperFormula instance.
75946
75972
  *
@@ -75983,7 +76009,7 @@ class Formulas extends _base.BasePlugin {
75983
76009
  (0, _console.error)(`The sheet named \`${sheetName}\` does not exist, switch aborted.`);
75984
76010
  return;
75985
76011
  }
75986
- this.sheetName = sheetName;
76012
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, sheetName);
75987
76013
  const serialized = this.engine.getSheetSerialized(this.sheetId);
75988
76014
  if (serialized.length > 0) {
75989
76015
  this.hot.loadData(serialized, `${(0, _string.toUpperCaseFirst)(PLUGIN_KEY)}.switchSheet`);
@@ -76143,8 +76169,22 @@ class Formulas extends _base.BasePlugin {
76143
76169
  }
76144
76170
  return this.engine.setCellContents(address, newValue);
76145
76171
  }
76172
+
76173
+ /**
76174
+ * The hook allows to translate the formula value to calculated value before it goes to the
76175
+ * validator function.
76176
+ *
76177
+ * @param {*} value The cell value to validate.
76178
+ * @param {number} visualRow The visual row index.
76179
+ * @param {number|string} prop The visual column index or property name of the column.
76180
+ * @returns {*} Returns value to validate.
76181
+ */
76146
76182
  }
76147
76183
  exports.Formulas = Formulas;
76184
+ function _updateSheetNameAndSheetId(sheetName) {
76185
+ this.sheetName = sheetName;
76186
+ this.sheetId = this.engine.getSheetId(this.sheetName);
76187
+ }
76148
76188
  function _onBeforeValidate(value, visualRow, prop) {
76149
76189
  const visualColumn = this.hot.propToCol(prop);
76150
76190
  if (this.isFormulaCellType(visualRow, visualColumn)) {
@@ -76272,29 +76312,33 @@ function _onBeforeLoadData(sourceData, initialLoad) {
76272
76312
  * Callback to `afterCellMetaReset` hook which is triggered after setting cell meta.
76273
76313
  */
76274
76314
  function _onAfterCellMetaReset() {
76315
+ if (_classPrivateFieldGet(_hotWasInitializedWithEmptyData, this)) {
76316
+ this.switchSheet(this.sheetName);
76317
+ return;
76318
+ }
76275
76319
  const sourceDataArray = this.hot.getSourceDataArray();
76276
- let valueChanged = false;
76277
76320
  sourceDataArray.forEach((rowData, rowIndex) => {
76278
76321
  rowData.forEach((cellValue, columnIndex) => {
76279
- const cellMeta = this.hot.getCellMeta(rowIndex, columnIndex);
76322
+ const cellMeta = this.hot.getCellMeta(rowIndex, columnIndex, {
76323
+ skipMetaExtension: true
76324
+ });
76280
76325
  const dateFormat = cellMeta.dateFormat;
76281
76326
  if ((0, _utils.isDate)(cellValue, cellMeta.type)) {
76282
- valueChanged = true;
76283
76327
  if ((0, _utils.isDateValid)(cellValue, dateFormat)) {
76284
76328
  // Rewriting date in HOT format to HF format.
76285
76329
  sourceDataArray[rowIndex][columnIndex] = (0, _utils.getDateInHfFormat)(cellValue, dateFormat);
76286
- } else if (this.isFormulaCellType(rowIndex, columnIndex) === false) {
76330
+ } else if (!cellValue.startsWith('=')) {
76287
76331
  // Escaping value from date parsing using "'" sign (HF feature).
76288
76332
  sourceDataArray[rowIndex][columnIndex] = `'${cellValue}`;
76289
76333
  }
76290
76334
  }
76291
76335
  });
76292
76336
  });
76293
- if (valueChanged === true) {
76294
- _classPrivateFieldSet(_internalOperationPending, this, true);
76295
- this.engine.setSheetContent(this.sheetId, sourceDataArray);
76296
- _classPrivateFieldSet(_internalOperationPending, this, false);
76297
- }
76337
+ _classPrivateFieldSet(_internalOperationPending, this, true);
76338
+ const dependentCells = this.engine.setSheetContent(this.sheetId, sourceDataArray);
76339
+ this.indexSyncer.setupSyncEndpoint(this.engine, this.sheetId);
76340
+ this.renderDependentSheets(dependentCells);
76341
+ _classPrivateFieldSet(_internalOperationPending, this, false);
76298
76342
  }
76299
76343
  /**
76300
76344
  * `afterLoadData` hook callback.
@@ -76308,7 +76352,12 @@ function _onAfterLoadData(sourceData, initialLoad) {
76308
76352
  if (source.includes((0, _string.toUpperCaseFirst)(PLUGIN_KEY))) {
76309
76353
  return;
76310
76354
  }
76311
- this.sheetName = (0, _register.setupSheet)(this.engine, this.hot.getSettings()[PLUGIN_KEY].sheetName);
76355
+ const sheetName = (0, _register.setupSheet)(this.engine, this.hot.getSettings()[PLUGIN_KEY].sheetName);
76356
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, sheetName);
76357
+ if (source === 'updateSettings') {
76358
+ // For performance reasons, the initialization will be done in afterCellMetaReset hook
76359
+ return;
76360
+ }
76312
76361
  if (!_classPrivateFieldGet(_hotWasInitializedWithEmptyData, this)) {
76313
76362
  const sourceDataArray = this.hot.getSourceDataArray();
76314
76363
  if (this.engine.isItPossibleToReplaceSheetContent(this.sheetId, sourceDataArray)) {
@@ -76339,17 +76388,10 @@ function _onModifyData(physicalRow, visualColumn, valueHolder, ioMode) {
76339
76388
  if (visualRow === null || visualColumn === null) {
76340
76389
  return;
76341
76390
  }
76342
-
76343
- // `column` is here as visual index because of inconsistencies related to hook execution in `src/dataMap`.
76344
- const isFormulaCellType = this.isFormulaCellType(visualRow, visualColumn);
76345
- if (!isFormulaCellType) {
76346
- const cellType = this.getCellType(visualRow, visualColumn);
76347
- if (cellType !== 'ARRAY') {
76348
- if ((0, _utils.isEscapedFormulaExpression)(valueHolder.value)) {
76349
- valueHolder.value = (0, _utils.unescapeFormulaExpression)(valueHolder.value);
76350
- }
76351
- return;
76352
- }
76391
+ const cellType = this.getCellType(visualRow, visualColumn);
76392
+ if (cellType === 'VALUE' || cellType === 'EMPTY') {
76393
+ valueHolder.value = (0, _utils.unescapeFormulaExpression)(valueHolder.value);
76394
+ return;
76353
76395
  }
76354
76396
  const address = {
76355
76397
  row: this.rowAxisSyncer.getHfIndexFromVisualIndex(visualRow),
@@ -76358,21 +76400,15 @@ function _onModifyData(physicalRow, visualColumn, valueHolder, ioMode) {
76358
76400
  };
76359
76401
  let cellValue = this.engine.getCellValue(address); // Date as an integer (Excel like date).
76360
76402
 
76361
- // TODO: Workaround. We use HOT's `getCellsMeta` method instead of HOT's `getCellMeta` method. Getting cell meta
76362
- // using the second method lead to execution of the `cells` method. Using the `getDataAtCell` (which may be useful)
76363
- // in a callback to the `cells` method leads to triggering the `modifyData` hook. Thus, the `onModifyData` callback
76364
- // is executed once again and it cause creation of an infinite loop.
76365
- let cellMeta = this.hot.getCellsMeta().find(singleCellMeta => singleCellMeta.visualRow === visualRow && singleCellMeta.visualCol === visualColumn);
76366
- if (cellMeta === undefined) {
76367
- cellMeta = {};
76368
- }
76403
+ const cellMeta = this.hot.getCellMeta(visualRow, visualColumn, {
76404
+ skipMetaExtension: true
76405
+ });
76369
76406
  if (cellMeta.type === 'date' && (0, _number.isNumeric)(cellValue)) {
76370
76407
  cellValue = (0, _utils.getDateFromExcelDate)(cellValue, cellMeta.dateFormat);
76371
76408
  }
76372
76409
 
76373
76410
  // If `cellValue` is an object it is expected to be an error
76374
- const value = typeof cellValue === 'object' && cellValue !== null ? cellValue.value : cellValue;
76375
- valueHolder.value = value;
76411
+ valueHolder.value = typeof cellValue === 'object' && cellValue !== null ? cellValue.value : cellValue;
76376
76412
  }
76377
76413
  /**
76378
76414
  * `modifySourceData` hook callback.
@@ -76392,14 +76428,9 @@ function _onModifySourceData(row, columnOrProp, valueHolder, ioMode) {
76392
76428
  if (visualRow === null || visualColumn === null) {
76393
76429
  return;
76394
76430
  }
76395
-
76396
- // `column` is here as visual index because of inconsistencies related to hook execution in `src/dataMap`.
76397
- const isFormulaCellType = this.isFormulaCellType(visualRow, visualColumn);
76398
- if (!isFormulaCellType) {
76399
- const cellType = this.getCellType(visualRow, visualColumn);
76400
- if (cellType !== 'ARRAY') {
76401
- return;
76402
- }
76431
+ const cellType = this.getCellType(visualRow, visualColumn);
76432
+ if (cellType === 'VALUE' || cellType === 'EMPTY') {
76433
+ return;
76403
76434
  }
76404
76435
  const dimensions = this.engine.getSheetDimensions(this.engine.getSheetId(this.sheetName));
76405
76436
 
@@ -76708,7 +76739,7 @@ function _onEngineSheetAdded(addedSheetDisplayName) {
76708
76739
  * @param {string} newDisplayName The new name of the sheet.
76709
76740
  */
76710
76741
  function _onEngineSheetRenamed(oldDisplayName, newDisplayName) {
76711
- this.sheetName = newDisplayName;
76742
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newDisplayName);
76712
76743
  this.hot.runHooks('afterSheetRenamed', oldDisplayName, newDisplayName);
76713
76744
  }
76714
76745
  /**
@@ -77522,7 +77553,11 @@ class AxisSyncer {
77522
77553
  getHfIndexFromVisualIndex(visualIndex) {
77523
77554
  const indexesSequence = _classPrivateFieldGet(_indexMapper, this).getIndexesSequence();
77524
77555
  const notTrimmedIndexes = _classPrivateFieldGet(_indexMapper, this).getNotTrimmedIndexes();
77525
- return indexesSequence.indexOf(notTrimmedIndexes[visualIndex]);
77556
+
77557
+ // Optimization:
77558
+ // notTrimmedIndexes is a subset of indexesSequence,
77559
+ // so for every x indexesSequence.indexOf(x) is always >= notTrimmedIndexes.indexOf(x)
77560
+ return indexesSequence.indexOf(notTrimmedIndexes[visualIndex], visualIndex);
77526
77561
  }
77527
77562
 
77528
77563
  /**
@@ -26,8 +26,8 @@
26
26
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
27
27
  * USE OR INABILITY TO USE THIS SOFTWARE.
28
28
  *
29
- * Version: 0.0.0-next-88f4ae4-20250313
30
- * Release date: 20/02/2025 (built at 13/03/2025 08:18:28)
29
+ * Version: 0.0.0-next-a1cc3b8-20250314
30
+ * Release date: 20/02/2025 (built at 14/03/2025 11:35:29)
31
31
  */.handsontable .table td,.handsontable .table th{border-top:none}.handsontable tr{background:#fff}.handsontable td{background-color:inherit}.handsontable .table caption+thead tr:first-child td,.handsontable .table caption+thead tr:first-child th,.handsontable .table colgroup+thead tr:first-child td,.handsontable .table colgroup+thead tr:first-child th,.handsontable .table thead:first-child tr:first-child td,.handsontable .table thead:first-child tr:first-child th{border-top:1px solid #ccc}.handsontable .table-bordered{border:0;border-collapse:separate}.handsontable .table-bordered td,.handsontable .table-bordered th{border-left:none}.handsontable .table-bordered td:first-child,.handsontable .table-bordered th:first-child{border-left:1px solid #ccc}.handsontable .table>tbody>tr>td,.handsontable .table>tbody>tr>th,.handsontable .table>tfoot>tr>td,.handsontable .table>tfoot>tr>th,.handsontable .table>thead>tr>td,.handsontable .table>thead>tr>th{line-height:21px;padding:0}.col-lg-1.handsontable,.col-lg-10.handsontable,.col-lg-11.handsontable,.col-lg-12.handsontable,.col-lg-2.handsontable,.col-lg-3.handsontable,.col-lg-4.handsontable,.col-lg-5.handsontable,.col-lg-6.handsontable,.col-lg-7.handsontable,.col-lg-8.handsontable,.col-lg-9.handsontable,.col-md-1.handsontable,.col-md-10.handsontable,.col-md-11.handsontable,.col-md-12.handsontable,.col-md-2.handsontable,.col-md-3.handsontable,.col-md-4.handsontable,.col-md-5.handsontable,.col-md-6.handsontable,.col-md-7.handsontable,.col-md-8.handsontable,.col-md-9.handsontable .col-sm-1.handsontable,.col-sm-10.handsontable,.col-sm-11.handsontable,.col-sm-12.handsontable,.col-sm-2.handsontable,.col-sm-3.handsontable,.col-sm-4.handsontable,.col-sm-5.handsontable,.col-sm-6.handsontable,.col-sm-7.handsontable,.col-sm-8.handsontable,.col-sm-9.handsontable .col-xs-1.handsontable,.col-xs-10.handsontable,.col-xs-11.handsontable,.col-xs-12.handsontable,.col-xs-2.handsontable,.col-xs-3.handsontable,.col-xs-4.handsontable,.col-xs-5.handsontable,.col-xs-6.handsontable,.col-xs-7.handsontable,.col-xs-8.handsontable,.col-xs-9.handsontable{padding-left:0;padding-right:0}.handsontable .table-striped>tbody>tr:nth-of-type(2n){background-color:#fff}.handsontable .hide{display:none}.handsontable .relative{position:relative}.handsontable .wtHider{position:relative;width:0}.handsontable .wtSpreader{height:auto;position:relative;width:0}.handsontable div,.handsontable input,.handsontable table,.handsontable tbody,.handsontable td,.handsontable textarea,.handsontable th,.handsontable thead{box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.handsontable input,.handsontable textarea{min-height:auto}.handsontable table.htCore{border-collapse:separate;border-spacing:0;border-width:0;cursor:default;margin:0;max-height:none;max-width:none;outline-width:0;table-layout:fixed;width:0}.handsontable col,.handsontable col.rowHeader{width:50px}.handsontable td,.handsontable th{background-color:#fff;border-bottom:1px solid #ccc;border-left-width:0;border-right:1px solid #ccc;border-top-width:0;empty-cells:show;height:22px;line-height:21px;outline:none;outline-width:0;overflow:hidden;padding:0 4px;vertical-align:top;white-space:pre-wrap}[dir=rtl].handsontable td,[dir=rtl].handsontable th{border-left:1px solid #ccc;border-right-width:0}.handsontable th:last-child{border-bottom:1px solid #ccc;border-left:none;border-right:1px solid #ccc}[dir=rtl].handsontable th:last-child{border-left:1px solid #ccc;border-right:none}.handsontable td:first-of-type,.handsontable th:first-child{border-left:1px solid #ccc}[dir=rtl].handsontable td:first-of-type,[dir=rtl].handsontable th:first-child{border-right:1px solid #ccc}.handsontable .ht_clone_top th:nth-child(2){border-left-width:0;border-right:1px solid #ccc}[dir=rtl].handsontable .ht_clone_top th:nth-child(2){border-left:1px solid #ccc;border-right-width:0}.handsontable.htRowHeaders thead tr th:nth-child(2){border-left:1px solid #ccc}[dir=rtl].handsontable.htRowHeaders thead tr th:nth-child(2){border-right:1px solid #ccc}.handsontable tr:first-child td,.handsontable tr:first-child th{border-top:1px solid #ccc}.ht_master:not(.innerBorderInlineStart):not(.emptyColumns) tbody tr th,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns) thead tr th:first-child,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.htGhostTable) tbody tr th,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.ht_clone_top):not(.htGhostTable) thead tr th:first-child{border-left:1px solid #ccc;border-right-width:0}[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns) tbody tr th,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns) thead tr th:first-child,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.htGhostTable) tbody tr th,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.ht_clone_top):not(.htGhostTable) thead tr th:first-child{border-left-width:0;border-right:1px solid #ccc}.ht_master:not(.innerBorderTop):not(.innerBorderBottom) thead tr.lastChild th,.ht_master:not(.innerBorderTop):not(.innerBorderBottom) thead tr:last-child th,.ht_master:not(.innerBorderTop):not(.innerBorderBottom)~.handsontable thead tr.lastChild th,.ht_master:not(.innerBorderTop):not(.innerBorderBottom)~.handsontable thead tr:last-child th{border-bottom-width:0}.handsontable th{background-color:#f0f0f0;color:#222;font-weight:400;text-align:center;white-space:nowrap}.handsontable thead th{padding:0}.handsontable th.active{background-color:#ccc}.handsontable thead th .relative{padding:2px 4px}.handsontable span.colHeader{display:inline-block;line-height:1.1}.handsontable .wtBorder{font-size:0;position:absolute}.handsontable .wtBorder.hidden{display:none!important}.handsontable .wtBorder.current{z-index:10}.handsontable .wtBorder.area{z-index:8}.handsontable .wtBorder.fill{z-index:6}.handsontable .wtBorder.corner{cursor:crosshair;font-size:0}.ht_clone_master{z-index:100}.ht_clone_inline_start{z-index:120}.ht_clone_bottom{z-index:130}.ht_clone_bottom_inline_start_corner{z-index:150}.ht_clone_top{z-index:160}.ht_clone_top_inline_start_corner{z-index:180}.handsontable col.hidden{width:0!important}.handsontable tr.hidden,.handsontable tr.hidden td,.handsontable tr.hidden th{display:none}.ht_clone_bottom,.ht_clone_inline_start,.ht_clone_top,.ht_master{overflow:hidden}.ht_master .wtHolder{overflow:auto}.handsontable .ht_clone_inline_start table.htCore>thead,.handsontable .ht_master table.htCore>tbody>tr>th,.handsontable .ht_master table.htCore>thead{visibility:hidden}.ht_clone_bottom .wtHolder,.ht_clone_inline_start .wtHolder,.ht_clone_top .wtHolder{overflow:hidden}.handsontable{color:#373737;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Helvetica Neue,Arial,sans-serif;font-size:13px;font-weight:400;position:relative;touch-action:manipulation}.handsontable a{color:#104acc}.handsontable.htAutoSize{left:-99000px;position:absolute;top:-99000px;visibility:hidden}.handsontable td.htInvalid{background-color:#ffbeba!important}.handsontable td.htNoWrap{white-space:nowrap}.handsontable td.invisibleSelection,.handsontable th.invisibleSelection{outline:none}.handsontable td.invisibleSelection::selection,.handsontable th.invisibleSelection::selection{background:hsla(0,0%,100%,0)}.hot-display-license-info{color:#373737;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Helvetica Neue,Arial,sans-serif;font-size:10px;font-weight:400;padding:5px 0 3px;text-align:left}.hot-display-license-info a{color:#104acc;font-size:10px}.handsontable .htFocusCatcher{border:0;height:0;margin:0;opacity:0;padding:0;position:absolute;width:0;z-index:-1}.handsontable .manualColumnResizer{cursor:col-resize;height:25px;position:absolute;top:0;width:5px;z-index:210}.handsontable .manualRowResizer{cursor:row-resize;height:5px;left:0;position:absolute;width:50px;z-index:210}.handsontable .manualColumnResizer.active,.handsontable .manualColumnResizer:hover,.handsontable .manualRowResizer.active,.handsontable .manualRowResizer:hover{background-color:#34a9db}.handsontable .manualColumnResizerGuide{background-color:#34a9db;border-left:none;border-right:1px dashed #777;display:none;margin-left:5px;margin-right:unset;position:absolute;right:unset;top:0;width:0}[dir=rtl].handsontable .manualColumnResizerGuide{border-left:1px dashed #777;border-right:none;left:unset;margin-left:unset;margin-right:5px}.handsontable .manualRowResizerGuide{background-color:#34a9db;border-bottom:1px dashed #777;bottom:0;display:none;height:0;left:0;margin-top:5px;position:absolute}.handsontable .manualColumnResizerGuide.active,.handsontable .manualRowResizerGuide.active{display:block;z-index:209}.handsontable td.area,.handsontable td.area-1,.handsontable td.area-2,.handsontable td.area-3,.handsontable td.area-4,.handsontable td.area-5,.handsontable td.area-6,.handsontable td.area-7{position:relative}.handsontable td.area-1:before,.handsontable td.area-2:before,.handsontable td.area-3:before,.handsontable td.area-4:before,.handsontable td.area-5:before,.handsontable td.area-6:before,.handsontable td.area-7:before,.handsontable td.area:before{background:#005eff;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.handsontable td.area:before{opacity:.1}.handsontable td.area-1:before{opacity:.2}.handsontable td.area-2:before{opacity:.27}.handsontable td.area-3:before{opacity:.35}.handsontable td.area-4:before{opacity:.41}.handsontable td.area-5:before{opacity:.47}.handsontable td.area-6:before{opacity:.54}.handsontable td.area-7:before{opacity:.58}.handsontable tbody th.current,.handsontable thead th.current{box-shadow:inset 0 0 0 2px #4b89ff}.handsontable tbody th.ht__highlight,.handsontable thead th.ht__highlight{background-color:#dcdcdc}.handsontable tbody th.ht__active_highlight,.handsontable thead th.ht__active_highlight{background-color:#8eb0e7;color:#000}.handsontableInput{background-color:#fff;border:none;border-radius:0;box-shadow:inset 0 0 0 2px #5292f7;box-sizing:border-box!important;color:#000;display:block;font-family:inherit;font-size:inherit;line-height:21px;margin:0;outline-width:0;padding:1px 5px 0;resize:none}.handsontableInput:focus{outline:none}.handsontableInputHolder{left:0;position:absolute;top:0}.htSelectEditor{position:absolute;select{-webkit-appearance:menulist-button!important;border:2px solid #4b89ff;box-sizing:border-box!important;height:100%;width:100%}}.htSelectEditor select:focus{outline:none}.htSelectEditor .htAutocompleteArrow{display:none}.handsontable .htDimmed{color:#777}.handsontable .htSubmenu{position:relative}.handsontable .htSubmenu :after{color:#777;content:"▶";font-size:9px;position:absolute;right:5px}[dir=rtl].handsontable .htSubmenu :after{content:""}[dir=rtl].handsontable .htSubmenu :before{color:#777;content:"◀";font-size:9px;left:5px;position:absolute}.handsontable .htLeft{text-align:left}.handsontable .htCenter{text-align:center}.handsontable .htRight{text-align:right}.handsontable .htJustify{text-align:justify}.handsontable .htTop{vertical-align:top}.handsontable .htMiddle{vertical-align:middle}.handsontable .htBottom{vertical-align:bottom}.handsontable .htPlaceholder{color:#999}.handsontable.listbox{margin:0}.handsontable.listbox .ht_master table{background:#fff;border:1px solid #ccc;border-collapse:separate}.handsontable.listbox td,.handsontable.listbox th,.handsontable.listbox tr:first-child td,.handsontable.listbox tr:first-child th,.handsontable.listbox tr:last-child th{border-color:transparent!important}.handsontable.listbox td,.handsontable.listbox th{text-overflow:ellipsis;white-space:nowrap}.handsontable.listbox td.htDimmed{color:inherit;cursor:default;font-style:inherit}.handsontable.listbox .wtBorder{visibility:hidden}.handsontable.listbox tr td.current,.handsontable.listbox tr:hover td{background:#eee}.ht_editor_hidden{z-index:-1}.ht_editor_visible{z-index:200}.handsontable td.htSearchResult{background:#fcedd9;color:#583707}.handsontable.mobile,.handsontable.mobile .wtHolder{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-overflow-scrolling:touch}.handsontable.mobile .handsontableInput:focus{-webkit-appearance:none;-webkit-box-shadow:inset 0 0 0 2px #5292f7;-moz-box-shadow:inset 0 0 0 2px #5292f7;box-shadow:inset 0 0 0 2px #5292f7}.handsontable .bottomSelectionHandle,.handsontable .bottomSelectionHandle-HitArea,.handsontable .topSelectionHandle,.handsontable .topSelectionHandle-HitArea{left:-10000px;right:unset;top:-10000px;z-index:9999}[dir=rtl].handsontable .bottomSelectionHandle,[dir=rtl].handsontable .bottomSelectionHandle-HitArea,[dir=rtl].handsontable .topSelectionHandle,[dir=rtl].handsontable .topSelectionHandle-HitArea{left:unset;right:-10000px}.handsontable.hide-tween{-webkit-animation:opacity-hide .3s;animation:opacity-hide .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.handsontable.show-tween{-webkit-animation:opacity-show .3s;animation:opacity-show .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.handsontable .htAutocompleteArrow{color:#bbb;cursor:default;float:right;font-size:10px;text-align:center;width:16px}[dir=rtl].handsontable .htAutocompleteArrow{float:left}.handsontable td.htInvalid .htAutocompleteArrow{color:#555}.handsontable td.htInvalid .htAutocompleteArrow:hover{color:#1a1a1a}.handsontable td .htAutocompleteArrow:hover{color:#777}.handsontable td.area .htAutocompleteArrow{color:#d3d3d3}.handsontable .htCheckboxRendererInput.noValue{opacity:.5}.handsontable .htCheckboxRendererLabel{cursor:pointer;display:inline-block;font-size:inherit;vertical-align:middle}.handsontable .htCheckboxRendererLabel.fullWidth{width:100%}.handsontable .collapsibleIndicator{background:#eee;border:1px solid #a6a6a6;border-radius:10px;-webkit-box-shadow:0 0 0 6px #eee;-moz-box-shadow:0 0 0 6px #eee;box-shadow:0 0 0 3px #eee;color:#222;cursor:pointer;font-size:10px;height:10px;left:unset;line-height:8px;position:absolute;right:5px;text-align:center;top:50%;transform:translateY(-50%);width:10px}[dir=rtl].handsontable .collapsibleIndicator{left:5px;right:unset}.handsontable[dir=ltr] thead th:has(.collapsibleIndicator) div.htRight span.colHeader{margin-right:20px}.handsontable[dir=rtl] thead th:has(.collapsibleIndicator) div.htLeft span.colHeader{margin-left:20px}.handsontable .columnSorting{position:relative}.handsontable[dir=ltr] div.htRight span[class*=ascending],.handsontable[dir=ltr] div.htRight span[class*=descending]{margin-left:-10px;margin-right:10px}.handsontable[dir=rtl] div.htLeft span[class*=ascending],.handsontable[dir=rtl] div.htLeft span[class*=descending]{margin-left:10px;margin-right:-10px}.handsontable[dir=ltr] div.htRight span[class*=ascending]:only-child,.handsontable[dir=ltr] div.htRight span[class*=descending]:only-child{margin-left:-15px;margin-right:15px}.handsontable[dir=rtl] div.htLeft span[class*=ascending]:only-child,.handsontable[dir=rtl] div.htLeft span[class*=descending]:only-child{margin-left:15px;margin-right:-15px}.handsontable .columnSorting.sortAction:hover{cursor:pointer;text-decoration:underline}.handsontable span.colHeader.columnSorting:before{background-position-x:right;background-repeat:no-repeat;background-size:contain;content:"";height:10px;left:unset;margin-top:-6px;padding-left:8px;padding-right:0;position:absolute;right:-9px;top:50%;width:5px}[dir=rtl].handsontable span.colHeader.columnSorting:before{background-position-x:left;left:-9px;padding-left:0;padding-right:8px;right:unset}.handsontable span.colHeader.columnSorting.ascending:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFNJREFUeAHtzjkSgCAUBNHPgsoy97+ulGXRqJE5L+xkxoYt2UdsLb5bqFINz+aLuuLn5rIu2RkO3fZpWENimNgiw6iBYRTPMLJjGFxQZ1hxxb/xBI1qC8k39CdKAAAAAElFTkSuQmCC)}.handsontable span.colHeader.columnSorting.descending:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFJJREFUeAHtzjkSgCAQRNFmQYUZ7n9dKUvru0TmvPAn3br0QfgdZ5xx6x+rQn23GqTYnq1FDcnuzZIO2WmedVqIRVxgGKEyjNgYRjKGkZ1hFIZ3I70LyM0VtU8AAAAASUVORK5CYII=)}.htGhostTable .htCore span.colHeader.columnSorting:not(.indicatorDisabled):before{content:"*";display:inline-block;padding-right:20px;position:relative}.handsontable.htGhostTable table thead th{border-bottom-width:0}.handsontable.htGhostTable table tbody tr td,.handsontable.htGhostTable table tbody tr th{border-top-width:0}.handsontable .htCommentCell{position:relative}.handsontable .htCommentCell:after{border-left:6px solid transparent;border-right:none;border-top:6px solid #000;content:"";left:unset;position:absolute;right:0;top:0}[dir=rtl].handsontable .htCommentCell:after{border-left:none;border-right:6px solid transparent;left:0;right:unset}.htCommentsContainer .htComments{display:none;position:absolute;z-index:1059}.htCommentsContainer .htCommentTextArea{-webkit-appearance:none;background-color:#fff;border:none;border-left:3px solid #ccc;box-shadow:0 1px 3px rgba(0,0,0,.118),0 1px 2px rgba(0,0,0,.239);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:12px;height:90px;outline:0!important;padding:5px;width:215px}[dir=rtl].htCommentsContainer .htCommentTextArea{border-left:none;border-right:3px solid #ccc}.htCommentsContainer .htCommentTextArea:focus{border-left:3px solid #5292f7;border-right:none;box-shadow:0 1px 3px rgba(0,0,0,.118),0 1px 2px rgba(0,0,0,.239),inset 0 0 0 1px #5292f7}[dir=rtl].htCommentsContainer .htCommentTextArea:focus{border-left:none;border-right:3px solid #5292f7}
32
32
  /*!
33
33
  * Handsontable ContextMenu