handsontable 0.0.0-next-44bc39b-20250312 → 0.0.0-next-19f5179-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.

@@ -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-44bc39b-20250312
29
- * Release date: 20/02/2025 (built at 12/03/2025 14:34:52)
28
+ * Version: 0.0.0-next-19f5179-20250314
29
+ * Release date: 20/02/2025 (built at 14/03/2025 08:46:43)
30
30
  */
31
31
  (function webpackUniversalModuleDefinition(root, factory) {
32
32
  if(typeof exports === 'object' && typeof module === 'object')
@@ -42855,8 +42855,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
42855
42855
  Handsontable.CellCoords = _src.CellCoords;
42856
42856
  Handsontable.CellRange = _src.CellRange;
42857
42857
  Handsontable.packageName = 'handsontable';
42858
- Handsontable.buildDate = "12/03/2025 14:34:52";
42859
- Handsontable.version = "0.0.0-next-44bc39b-20250312";
42858
+ Handsontable.buildDate = "14/03/2025 08:46:43";
42859
+ Handsontable.version = "0.0.0-next-19f5179-20250314";
42860
42860
  Handsontable.languages = {
42861
42861
  dictionaryKeys: _registry.dictionaryKeys,
42862
42862
  getLanguageDictionary: _registry.getLanguageDictionary,
@@ -45964,11 +45964,16 @@ function Core(rootElement, userSettings) {
45964
45964
  * @function getCellMeta
45965
45965
  * @param {number} row Visual row index.
45966
45966
  * @param {number} column Visual column index.
45967
+ * @param {object} options Execution options for the `getCellMeta` method.
45968
+ * @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.
45967
45969
  * @returns {object} The cell properties object.
45968
45970
  * @fires Hooks#beforeGetCellMeta
45969
45971
  * @fires Hooks#afterGetCellMeta
45970
45972
  */
45971
45973
  this.getCellMeta = function (row, column) {
45974
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
45975
+ skipMetaExtension: false
45976
+ };
45972
45977
  let physicalRow = this.toPhysicalRow(row);
45973
45978
  let physicalColumn = this.toPhysicalColumn(column);
45974
45979
  if (physicalRow === null) {
@@ -45979,7 +45984,8 @@ function Core(rootElement, userSettings) {
45979
45984
  }
45980
45985
  return metaManager.getCellMeta(physicalRow, physicalColumn, {
45981
45986
  visualRow: row,
45982
- visualColumn: column
45987
+ visualColumn: column,
45988
+ ...options
45983
45989
  });
45984
45990
  };
45985
45991
 
@@ -54182,7 +54188,7 @@ const domMessages = {
54182
54188
  function _injectProductInfo(key, element) {
54183
54189
  const hasValidType = !isEmpty(key);
54184
54190
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
54185
- const hotVersion = "0.0.0-next-44bc39b-20250312";
54191
+ const hotVersion = "0.0.0-next-19f5179-20250314";
54186
54192
  let keyValidityDate;
54187
54193
  let consoleMessageState = 'invalid';
54188
54194
  let domMessageState = 'invalid';
@@ -90993,22 +90999,21 @@ class MetaManager {
90993
90999
  *
90994
91000
  * @param {number} physicalRow The physical row index.
90995
91001
  * @param {number} physicalColumn The physical column index.
90996
- * @param {object} options Additional options that are used to extend the cell meta object.
91002
+ * @param {object} options Options for the `getCellMeta` method.
90997
91003
  * @param {number} options.visualRow The visual row index of the currently requested cell meta object.
90998
91004
  * @param {number} options.visualColumn The visual column index of the currently requested cell meta object.
91005
+ * @param {boolean} [options.skipMetaExtension=false] If `true`, omits the `afterGetCellMeta` hook which calls the `extendCellMeta` method.
90999
91006
  * @returns {object}
91000
91007
  */
91001
- getCellMeta(physicalRow, physicalColumn, _ref) {
91002
- let {
91003
- visualRow,
91004
- visualColumn
91005
- } = _ref;
91008
+ getCellMeta(physicalRow, physicalColumn, options) {
91006
91009
  const cellMeta = this.cellMeta.getMeta(physicalRow, physicalColumn);
91007
- cellMeta.visualRow = visualRow;
91008
- cellMeta.visualCol = visualColumn;
91010
+ cellMeta.visualRow = options.visualRow;
91011
+ cellMeta.visualCol = options.visualColumn;
91009
91012
  cellMeta.row = physicalRow;
91010
91013
  cellMeta.col = physicalColumn;
91011
- this.runLocalHooks('afterGetCellMeta', cellMeta);
91014
+ if (!options.skipMetaExtension) {
91015
+ this.runLocalHooks('afterGetCellMeta', cellMeta);
91016
+ }
91012
91017
  return cellMeta;
91013
91018
  }
91014
91019
 
@@ -97332,6 +97337,7 @@ var _function = __webpack_require__(497);
97332
97337
  */
97333
97338
  class DynamicCellMetaMod {
97334
97339
  constructor(metaManager) {
97340
+ var _this = this;
97335
97341
  /**
97336
97342
  * @type {MetaManager}
97337
97343
  */
@@ -97341,7 +97347,9 @@ class DynamicCellMetaMod {
97341
97347
  */
97342
97348
  (0, _defineProperty2.default)(this, "metaSyncMemo", new Map());
97343
97349
  this.metaManager = metaManager;
97344
- metaManager.addLocalHook('afterGetCellMeta', cellMeta => this.extendCellMeta(cellMeta));
97350
+ metaManager.addLocalHook('afterGetCellMeta', function () {
97351
+ return _this.extendCellMeta(...arguments);
97352
+ });
97345
97353
  _hooks.Hooks.getSingleton().add('beforeRender', forceFullRender => {
97346
97354
  if (forceFullRender) {
97347
97355
  this.metaSyncMemo.clear();
@@ -112184,6 +112192,7 @@ const COLUMN_SIZE_MAP_NAME = 'autoColumnSize';
112184
112192
  * :::
112185
112193
  */
112186
112194
  /* eslint-enable jsdoc/require-description-complete-sentence */
112195
+ var _isInitialized = /*#__PURE__*/new WeakMap();
112187
112196
  var _cachedColumnHeaders = /*#__PURE__*/new WeakMap();
112188
112197
  var _visualColumnsToRefresh = /*#__PURE__*/new WeakMap();
112189
112198
  var _AutoColumnSize_brand = /*#__PURE__*/new WeakSet();
@@ -112273,6 +112282,12 @@ class AutoColumnSize extends _base.BasePlugin {
112273
112282
  * @type {PhysicalIndexToValueMap}
112274
112283
  */
112275
112284
  (0, _defineProperty2.default)(this, "columnWidthsMap", new _translations.PhysicalIndexToValueMap());
112285
+ /**
112286
+ * `true` value indicates that the #onInit() function has been already called.
112287
+ *
112288
+ * @type {boolean}
112289
+ */
112290
+ _classPrivateFieldInitSpec(this, _isInitialized, false);
112276
112291
  /**
112277
112292
  * Cached column header names. It is used to diff current column headers with previous state and detect which
112278
112293
  * columns width should be updated.
@@ -112411,17 +112426,11 @@ class AutoColumnSize extends _base.BasePlugin {
112411
112426
  physicalColumn = visualColumn;
112412
112427
  }
112413
112428
  if (overwriteCache || this.columnWidthsMap.getValueAtIndex(physicalColumn) === null && !this.hot._getColWidthFromSettings(physicalColumn)) {
112414
- const samples = this.samplesGenerator.generateColumnSamples(visualColumn, rowsRange);
112415
- samples.forEach((sample, column) => this.ghostTable.addColumn(column, sample));
112429
+ _assertClassBrand(_AutoColumnSize_brand, this, _fillGhostTableWithSamples).call(this, visualColumn, rowsRange);
112416
112430
  }
112417
112431
  });
112418
112432
  if (this.ghostTable.columns.length) {
112419
- this.hot.batchExecution(() => {
112420
- this.ghostTable.getWidths((visualColumn, width) => {
112421
- const physicalColumn = this.hot.toPhysicalColumn(visualColumn);
112422
- this.columnWidthsMap.setValueAtIndex(physicalColumn, width);
112423
- });
112424
- }, true);
112433
+ _assertClassBrand(_AutoColumnSize_brand, this, _updateColumnWidthsMapBasedOnGhostTable).call(this);
112425
112434
  this.measuredColumns = columnsRange.to + 1;
112426
112435
  this.ghostTable.clean();
112427
112436
  }
@@ -112632,20 +112641,36 @@ function _calculateSpecificColumnsWidth(visualColumns) {
112632
112641
  return;
112633
112642
  }
112634
112643
  if (!this.hot._getColWidthFromSettings(physicalColumn)) {
112635
- const samples = this.samplesGenerator.generateColumnSamples(visualColumn, rowsRange);
112636
- samples.forEach((sample, column) => this.ghostTable.addColumn(column, sample));
112644
+ _assertClassBrand(_AutoColumnSize_brand, this, _fillGhostTableWithSamples).call(this, visualColumn, rowsRange);
112637
112645
  }
112638
112646
  });
112639
112647
  if (this.ghostTable.columns.length) {
112640
- this.hot.batchExecution(() => {
112641
- this.ghostTable.getWidths((visualColumn, width) => {
112642
- const physicalColumn = this.hot.toPhysicalColumn(visualColumn);
112643
- this.columnWidthsMap.setValueAtIndex(physicalColumn, width);
112644
- });
112645
- }, true);
112648
+ _assertClassBrand(_AutoColumnSize_brand, this, _updateColumnWidthsMapBasedOnGhostTable).call(this);
112646
112649
  this.ghostTable.clean();
112647
112650
  }
112648
112651
  }
112652
+ /**
112653
+ * Processes a single column for width calculation.
112654
+ *
112655
+ * @param {number} visualColumn Visual column index.
112656
+ * @param {object} rowsRange Range of rows to process.
112657
+ */
112658
+ function _fillGhostTableWithSamples(visualColumn, rowsRange) {
112659
+ const samples = this.samplesGenerator.generateColumnSamples(visualColumn, rowsRange);
112660
+ samples.forEach((sample, column) => this.ghostTable.addColumn(column, sample));
112661
+ }
112662
+ /**
112663
+ * Updates the column widths map with calculated widths from the ghost table.
112664
+ *
112665
+ */
112666
+ function _updateColumnWidthsMapBasedOnGhostTable() {
112667
+ this.hot.batchExecution(() => {
112668
+ this.ghostTable.getWidths((visualColumn, width) => {
112669
+ const physicalColumn = this.hot.toPhysicalColumn(visualColumn);
112670
+ this.columnWidthsMap.setValueAtIndex(physicalColumn, width);
112671
+ });
112672
+ }, true);
112673
+ }
112649
112674
  function _onBeforeRender() {
112650
112675
  this.calculateVisibleColumnsWidth();
112651
112676
  if (!this.inProgress) {
@@ -112702,6 +112727,7 @@ function _onBeforeColumnResize(size, column, isDblClick) {
112702
112727
  function _onInit() {
112703
112728
  _classPrivateFieldSet(_cachedColumnHeaders, this, this.hot.getColHeader());
112704
112729
  this.recalculateAllColumnsWidth();
112730
+ _classPrivateFieldSet(_isInitialized, this, true);
112705
112731
  }
112706
112732
  /**
112707
112733
  * After formulas values updated listener.
@@ -112709,6 +112735,9 @@ function _onInit() {
112709
112735
  * @param {Array} changes An array of modified data.
112710
112736
  */
112711
112737
  function _onAfterFormulasValuesUpdate(changes) {
112738
+ if (!_classPrivateFieldGet(_isInitialized, this)) {
112739
+ return;
112740
+ }
112712
112741
  const changedColumns = changes.reduce((acc, change) => {
112713
112742
  var _change$address;
112714
112743
  const physicalColumn = (_change$address = change.address) === null || _change$address === void 0 ? void 0 : _change$address.col;
@@ -114562,6 +114591,7 @@ const ROW_WIDTHS_MAP_NAME = 'autoRowSize';
114562
114591
  */
114563
114592
  /* eslint-enable jsdoc/require-description-complete-sentence */
114564
114593
  var _visualRowsToRefresh = /*#__PURE__*/new WeakMap();
114594
+ var _isInitialized = /*#__PURE__*/new WeakMap();
114565
114595
  var _AutoRowSize_brand = /*#__PURE__*/new WeakSet();
114566
114596
  class AutoRowSize extends _base.BasePlugin {
114567
114597
  static get PLUGIN_KEY() {
@@ -114664,6 +114694,12 @@ class AutoRowSize extends _base.BasePlugin {
114664
114694
  * @type {number[]}
114665
114695
  */
114666
114696
  _classPrivateFieldInitSpec(this, _visualRowsToRefresh, []);
114697
+ /**
114698
+ * `true` value indicates that the #onInit() function has been already called.
114699
+ *
114700
+ * @type {boolean}
114701
+ */
114702
+ _classPrivateFieldInitSpec(this, _isInitialized, false);
114667
114703
  this.hot.rowIndexMapper.registerMap(ROW_WIDTHS_MAP_NAME, this.rowHeightsMap);
114668
114704
 
114669
114705
  // Leave the listener active to allow auto-sizing the rows when the plugin is disabled.
@@ -115094,6 +115130,7 @@ function _onBeforeChange(changes) {
115094
115130
  */
115095
115131
  function _onInit() {
115096
115132
  this.recalculateAllRowsHeight();
115133
+ _classPrivateFieldSet(_isInitialized, this, true);
115097
115134
  }
115098
115135
  /**
115099
115136
  * After formulas values updated listener.
@@ -115101,6 +115138,9 @@ function _onInit() {
115101
115138
  * @param {Array} changes An array of modified data.
115102
115139
  */
115103
115140
  function _onAfterFormulasValuesUpdate(changes) {
115141
+ if (!_classPrivateFieldGet(_isInitialized, this)) {
115142
+ return;
115143
+ }
115104
115144
  const changedRows = changes.reduce((acc, change) => {
115105
115145
  var _change$address;
115106
115146
  const physicalRow = (_change$address = change.address) === null || _change$address === void 0 ? void 0 : _change$address.row;
@@ -132795,7 +132835,6 @@ __webpack_require__(307);
132795
132835
  __webpack_require__(309);
132796
132836
  __webpack_require__(311);
132797
132837
  __webpack_require__(623);
132798
- __webpack_require__(519);
132799
132838
  __webpack_require__(329);
132800
132839
  __webpack_require__(338);
132801
132840
  var _defineProperty2 = _interopRequireDefault(__webpack_require__(504));
@@ -132853,13 +132892,9 @@ class Formulas extends _base.BasePlugin {
132853
132892
  super(...arguments);
132854
132893
  _this = this;
132855
132894
  /**
132856
- * The hook allows to translate the formula value to calculated value before it goes to the
132857
- * validator function.
132895
+ * Update sheetName and sheetId properties.
132858
132896
  *
132859
- * @param {*} value The cell value to validate.
132860
- * @param {number} visualRow The visual row index.
132861
- * @param {number|string} prop The visual column index or property name of the column.
132862
- * @returns {*} Returns value to validate.
132897
+ * @param {string} [sheetName] The new sheet name.
132863
132898
  */
132864
132899
  _classPrivateMethodInitSpec(this, _Formulas_brand);
132865
132900
  /**
@@ -132926,6 +132961,12 @@ class Formulas extends _base.BasePlugin {
132926
132961
  * @type {HyperFormula|null}
132927
132962
  */
132928
132963
  (0, _defineProperty2.default)(this, "engine", null);
132964
+ /**
132965
+ * HyperFormula's sheet id.
132966
+ *
132967
+ * @type {number|null}
132968
+ */
132969
+ (0, _defineProperty2.default)(this, "sheetId", null);
132929
132970
  /**
132930
132971
  * HyperFormula's sheet name.
132931
132972
  *
@@ -132960,15 +133001,6 @@ class Formulas extends _base.BasePlugin {
132960
133001
  static get SETTING_KEYS() {
132961
133002
  return [PLUGIN_KEY, ...SETTING_KEYS];
132962
133003
  }
132963
- /**
132964
- * HyperFormula's sheet id.
132965
- *
132966
- * @type {number|null}
132967
- */
132968
- get sheetId() {
132969
- return this.sheetName === null ? null : this.engine.getSheetId(this.sheetName);
132970
- }
132971
-
132972
133004
  /**
132973
133005
  * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
132974
133006
  * hook and if it returns `true` then the {@link Formulas#enablePlugin} method is called.
@@ -132999,7 +133031,7 @@ class Formulas extends _base.BasePlugin {
132999
133031
  if (this.sheetName !== null && !this.engine.doesSheetExist(this.sheetName)) {
133000
133032
  const newSheetName = this.addSheet(this.sheetName, this.hot.getSourceDataArray());
133001
133033
  if (newSheetName !== false) {
133002
- this.sheetName = newSheetName;
133034
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newSheetName);
133003
133035
  }
133004
133036
  }
133005
133037
  this.addHook('beforeLoadData', function () {
@@ -133230,7 +133262,8 @@ class Formulas extends _base.BasePlugin {
133230
133262
  if (sheetName && this.engine.doesSheetExist(sheetName)) {
133231
133263
  this.switchSheet(this.sheetName);
133232
133264
  } else {
133233
- this.sheetName = this.addSheet(sheetName !== null && sheetName !== void 0 ? sheetName : undefined, this.hot.getSourceDataArray());
133265
+ const newSheetName = this.addSheet(sheetName !== null && sheetName !== void 0 ? sheetName : undefined, this.hot.getSourceDataArray());
133266
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newSheetName);
133234
133267
  }
133235
133268
  }
133236
133269
  super.updatePlugin(newSettings);
@@ -133250,7 +133283,6 @@ class Formulas extends _base.BasePlugin {
133250
133283
  this.engine = null;
133251
133284
  super.destroy();
133252
133285
  }
133253
-
133254
133286
  /**
133255
133287
  * Add a sheet to the shared HyperFormula instance.
133256
133288
  *
@@ -133293,7 +133325,7 @@ class Formulas extends _base.BasePlugin {
133293
133325
  (0, _console.error)(`The sheet named \`${sheetName}\` does not exist, switch aborted.`);
133294
133326
  return;
133295
133327
  }
133296
- this.sheetName = sheetName;
133328
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, sheetName);
133297
133329
  const serialized = this.engine.getSheetSerialized(this.sheetId);
133298
133330
  if (serialized.length > 0) {
133299
133331
  this.hot.loadData(serialized, `${(0, _string.toUpperCaseFirst)(PLUGIN_KEY)}.switchSheet`);
@@ -133453,8 +133485,22 @@ class Formulas extends _base.BasePlugin {
133453
133485
  }
133454
133486
  return this.engine.setCellContents(address, newValue);
133455
133487
  }
133488
+
133489
+ /**
133490
+ * The hook allows to translate the formula value to calculated value before it goes to the
133491
+ * validator function.
133492
+ *
133493
+ * @param {*} value The cell value to validate.
133494
+ * @param {number} visualRow The visual row index.
133495
+ * @param {number|string} prop The visual column index or property name of the column.
133496
+ * @returns {*} Returns value to validate.
133497
+ */
133456
133498
  }
133457
133499
  exports.Formulas = Formulas;
133500
+ function _updateSheetNameAndSheetId(sheetName) {
133501
+ this.sheetName = sheetName;
133502
+ this.sheetId = this.engine.getSheetId(this.sheetName);
133503
+ }
133458
133504
  function _onBeforeValidate(value, visualRow, prop) {
133459
133505
  const visualColumn = this.hot.propToCol(prop);
133460
133506
  if (this.isFormulaCellType(visualRow, visualColumn)) {
@@ -133582,29 +133628,33 @@ function _onBeforeLoadData(sourceData, initialLoad) {
133582
133628
  * Callback to `afterCellMetaReset` hook which is triggered after setting cell meta.
133583
133629
  */
133584
133630
  function _onAfterCellMetaReset() {
133631
+ if (_classPrivateFieldGet(_hotWasInitializedWithEmptyData, this)) {
133632
+ this.switchSheet(this.sheetName);
133633
+ return;
133634
+ }
133585
133635
  const sourceDataArray = this.hot.getSourceDataArray();
133586
- let valueChanged = false;
133587
133636
  sourceDataArray.forEach((rowData, rowIndex) => {
133588
133637
  rowData.forEach((cellValue, columnIndex) => {
133589
- const cellMeta = this.hot.getCellMeta(rowIndex, columnIndex);
133638
+ const cellMeta = this.hot.getCellMeta(rowIndex, columnIndex, {
133639
+ skipMetaExtension: true
133640
+ });
133590
133641
  const dateFormat = cellMeta.dateFormat;
133591
133642
  if ((0, _utils.isDate)(cellValue, cellMeta.type)) {
133592
- valueChanged = true;
133593
133643
  if ((0, _utils.isDateValid)(cellValue, dateFormat)) {
133594
133644
  // Rewriting date in HOT format to HF format.
133595
133645
  sourceDataArray[rowIndex][columnIndex] = (0, _utils.getDateInHfFormat)(cellValue, dateFormat);
133596
- } else if (this.isFormulaCellType(rowIndex, columnIndex) === false) {
133646
+ } else if (!cellValue.startsWith('=')) {
133597
133647
  // Escaping value from date parsing using "'" sign (HF feature).
133598
133648
  sourceDataArray[rowIndex][columnIndex] = `'${cellValue}`;
133599
133649
  }
133600
133650
  }
133601
133651
  });
133602
133652
  });
133603
- if (valueChanged === true) {
133604
- _classPrivateFieldSet(_internalOperationPending, this, true);
133605
- this.engine.setSheetContent(this.sheetId, sourceDataArray);
133606
- _classPrivateFieldSet(_internalOperationPending, this, false);
133607
- }
133653
+ _classPrivateFieldSet(_internalOperationPending, this, true);
133654
+ const dependentCells = this.engine.setSheetContent(this.sheetId, sourceDataArray);
133655
+ this.indexSyncer.setupSyncEndpoint(this.engine, this.sheetId);
133656
+ this.renderDependentSheets(dependentCells);
133657
+ _classPrivateFieldSet(_internalOperationPending, this, false);
133608
133658
  }
133609
133659
  /**
133610
133660
  * `afterLoadData` hook callback.
@@ -133618,7 +133668,12 @@ function _onAfterLoadData(sourceData, initialLoad) {
133618
133668
  if (source.includes((0, _string.toUpperCaseFirst)(PLUGIN_KEY))) {
133619
133669
  return;
133620
133670
  }
133621
- this.sheetName = (0, _register.setupSheet)(this.engine, this.hot.getSettings()[PLUGIN_KEY].sheetName);
133671
+ const sheetName = (0, _register.setupSheet)(this.engine, this.hot.getSettings()[PLUGIN_KEY].sheetName);
133672
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, sheetName);
133673
+ if (source === 'updateSettings') {
133674
+ // For performance reasons, the initialization will be done in afterCellMetaReset hook
133675
+ return;
133676
+ }
133622
133677
  if (!_classPrivateFieldGet(_hotWasInitializedWithEmptyData, this)) {
133623
133678
  const sourceDataArray = this.hot.getSourceDataArray();
133624
133679
  if (this.engine.isItPossibleToReplaceSheetContent(this.sheetId, sourceDataArray)) {
@@ -133649,17 +133704,10 @@ function _onModifyData(physicalRow, visualColumn, valueHolder, ioMode) {
133649
133704
  if (visualRow === null || visualColumn === null) {
133650
133705
  return;
133651
133706
  }
133652
-
133653
- // `column` is here as visual index because of inconsistencies related to hook execution in `src/dataMap`.
133654
- const isFormulaCellType = this.isFormulaCellType(visualRow, visualColumn);
133655
- if (!isFormulaCellType) {
133656
- const cellType = this.getCellType(visualRow, visualColumn);
133657
- if (cellType !== 'ARRAY') {
133658
- if ((0, _utils.isEscapedFormulaExpression)(valueHolder.value)) {
133659
- valueHolder.value = (0, _utils.unescapeFormulaExpression)(valueHolder.value);
133660
- }
133661
- return;
133662
- }
133707
+ const cellType = this.getCellType(visualRow, visualColumn);
133708
+ if (cellType === 'VALUE' || cellType === 'EMPTY') {
133709
+ valueHolder.value = (0, _utils.unescapeFormulaExpression)(valueHolder.value);
133710
+ return;
133663
133711
  }
133664
133712
  const address = {
133665
133713
  row: this.rowAxisSyncer.getHfIndexFromVisualIndex(visualRow),
@@ -133668,21 +133716,15 @@ function _onModifyData(physicalRow, visualColumn, valueHolder, ioMode) {
133668
133716
  };
133669
133717
  let cellValue = this.engine.getCellValue(address); // Date as an integer (Excel like date).
133670
133718
 
133671
- // TODO: Workaround. We use HOT's `getCellsMeta` method instead of HOT's `getCellMeta` method. Getting cell meta
133672
- // using the second method lead to execution of the `cells` method. Using the `getDataAtCell` (which may be useful)
133673
- // in a callback to the `cells` method leads to triggering the `modifyData` hook. Thus, the `onModifyData` callback
133674
- // is executed once again and it cause creation of an infinite loop.
133675
- let cellMeta = this.hot.getCellsMeta().find(singleCellMeta => singleCellMeta.visualRow === visualRow && singleCellMeta.visualCol === visualColumn);
133676
- if (cellMeta === undefined) {
133677
- cellMeta = {};
133678
- }
133719
+ const cellMeta = this.hot.getCellMeta(visualRow, visualColumn, {
133720
+ skipMetaExtension: true
133721
+ });
133679
133722
  if (cellMeta.type === 'date' && (0, _number.isNumeric)(cellValue)) {
133680
133723
  cellValue = (0, _utils.getDateFromExcelDate)(cellValue, cellMeta.dateFormat);
133681
133724
  }
133682
133725
 
133683
133726
  // If `cellValue` is an object it is expected to be an error
133684
- const value = typeof cellValue === 'object' && cellValue !== null ? cellValue.value : cellValue;
133685
- valueHolder.value = value;
133727
+ valueHolder.value = typeof cellValue === 'object' && cellValue !== null ? cellValue.value : cellValue;
133686
133728
  }
133687
133729
  /**
133688
133730
  * `modifySourceData` hook callback.
@@ -133702,14 +133744,9 @@ function _onModifySourceData(row, columnOrProp, valueHolder, ioMode) {
133702
133744
  if (visualRow === null || visualColumn === null) {
133703
133745
  return;
133704
133746
  }
133705
-
133706
- // `column` is here as visual index because of inconsistencies related to hook execution in `src/dataMap`.
133707
- const isFormulaCellType = this.isFormulaCellType(visualRow, visualColumn);
133708
- if (!isFormulaCellType) {
133709
- const cellType = this.getCellType(visualRow, visualColumn);
133710
- if (cellType !== 'ARRAY') {
133711
- return;
133712
- }
133747
+ const cellType = this.getCellType(visualRow, visualColumn);
133748
+ if (cellType === 'VALUE' || cellType === 'EMPTY') {
133749
+ return;
133713
133750
  }
133714
133751
  const dimensions = this.engine.getSheetDimensions(this.engine.getSheetId(this.sheetName));
133715
133752
 
@@ -134018,7 +134055,7 @@ function _onEngineSheetAdded(addedSheetDisplayName) {
134018
134055
  * @param {string} newDisplayName The new name of the sheet.
134019
134056
  */
134020
134057
  function _onEngineSheetRenamed(oldDisplayName, newDisplayName) {
134021
- this.sheetName = newDisplayName;
134058
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newDisplayName);
134022
134059
  this.hot.runHooks('afterSheetRenamed', oldDisplayName, newDisplayName);
134023
134060
  }
134024
134061
  /**
@@ -134832,7 +134869,11 @@ class AxisSyncer {
134832
134869
  getHfIndexFromVisualIndex(visualIndex) {
134833
134870
  const indexesSequence = _classPrivateFieldGet(_indexMapper, this).getIndexesSequence();
134834
134871
  const notTrimmedIndexes = _classPrivateFieldGet(_indexMapper, this).getNotTrimmedIndexes();
134835
- return indexesSequence.indexOf(notTrimmedIndexes[visualIndex]);
134872
+
134873
+ // Optimization:
134874
+ // notTrimmedIndexes is a subset of indexesSequence,
134875
+ // so for every x indexesSequence.indexOf(x) is always >= notTrimmedIndexes.indexOf(x)
134876
+ return indexesSequence.indexOf(notTrimmedIndexes[visualIndex], visualIndex);
134836
134877
  }
134837
134878
 
134838
134879
  /**
@@ -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-44bc39b-20250312
30
- * Release date: 20/02/2025 (built at 12/03/2025 14:35:45)
29
+ * Version: 0.0.0-next-19f5179-20250314
30
+ * Release date: 20/02/2025 (built at 14/03/2025 08:47:49)
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