handsontable 0.0.0-next-88f4ae4-20250313 → 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-88f4ae4-20250313
29
- * Release date: 20/02/2025 (built at 13/03/2025 08:17:35)
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')
@@ -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 08:46:43";
108
+ Handsontable.version = "0.0.0-next-19f5179-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
 
@@ -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-19f5179-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();
@@ -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;
@@ -75485,7 +75525,6 @@ __webpack_require__(111);
75485
75525
  __webpack_require__(113);
75486
75526
  __webpack_require__(115);
75487
75527
  __webpack_require__(289);
75488
- __webpack_require__(185);
75489
75528
  __webpack_require__(133);
75490
75529
  __webpack_require__(142);
75491
75530
  var _defineProperty2 = _interopRequireDefault(__webpack_require__(170));
@@ -75543,13 +75582,9 @@ class Formulas extends _base.BasePlugin {
75543
75582
  super(...arguments);
75544
75583
  _this = this;
75545
75584
  /**
75546
- * The hook allows to translate the formula value to calculated value before it goes to the
75547
- * validator function.
75585
+ * Update sheetName and sheetId properties.
75548
75586
  *
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.
75587
+ * @param {string} [sheetName] The new sheet name.
75553
75588
  */
75554
75589
  _classPrivateMethodInitSpec(this, _Formulas_brand);
75555
75590
  /**
@@ -75616,6 +75651,12 @@ class Formulas extends _base.BasePlugin {
75616
75651
  * @type {HyperFormula|null}
75617
75652
  */
75618
75653
  (0, _defineProperty2.default)(this, "engine", null);
75654
+ /**
75655
+ * HyperFormula's sheet id.
75656
+ *
75657
+ * @type {number|null}
75658
+ */
75659
+ (0, _defineProperty2.default)(this, "sheetId", null);
75619
75660
  /**
75620
75661
  * HyperFormula's sheet name.
75621
75662
  *
@@ -75650,15 +75691,6 @@ class Formulas extends _base.BasePlugin {
75650
75691
  static get SETTING_KEYS() {
75651
75692
  return [PLUGIN_KEY, ...SETTING_KEYS];
75652
75693
  }
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
75694
  /**
75663
75695
  * Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
75664
75696
  * hook and if it returns `true` then the {@link Formulas#enablePlugin} method is called.
@@ -75689,7 +75721,7 @@ class Formulas extends _base.BasePlugin {
75689
75721
  if (this.sheetName !== null && !this.engine.doesSheetExist(this.sheetName)) {
75690
75722
  const newSheetName = this.addSheet(this.sheetName, this.hot.getSourceDataArray());
75691
75723
  if (newSheetName !== false) {
75692
- this.sheetName = newSheetName;
75724
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newSheetName);
75693
75725
  }
75694
75726
  }
75695
75727
  this.addHook('beforeLoadData', function () {
@@ -75920,7 +75952,8 @@ class Formulas extends _base.BasePlugin {
75920
75952
  if (sheetName && this.engine.doesSheetExist(sheetName)) {
75921
75953
  this.switchSheet(this.sheetName);
75922
75954
  } else {
75923
- this.sheetName = this.addSheet(sheetName !== null && sheetName !== void 0 ? sheetName : undefined, this.hot.getSourceDataArray());
75955
+ const newSheetName = this.addSheet(sheetName !== null && sheetName !== void 0 ? sheetName : undefined, this.hot.getSourceDataArray());
75956
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newSheetName);
75924
75957
  }
75925
75958
  }
75926
75959
  super.updatePlugin(newSettings);
@@ -75940,7 +75973,6 @@ class Formulas extends _base.BasePlugin {
75940
75973
  this.engine = null;
75941
75974
  super.destroy();
75942
75975
  }
75943
-
75944
75976
  /**
75945
75977
  * Add a sheet to the shared HyperFormula instance.
75946
75978
  *
@@ -75983,7 +76015,7 @@ class Formulas extends _base.BasePlugin {
75983
76015
  (0, _console.error)(`The sheet named \`${sheetName}\` does not exist, switch aborted.`);
75984
76016
  return;
75985
76017
  }
75986
- this.sheetName = sheetName;
76018
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, sheetName);
75987
76019
  const serialized = this.engine.getSheetSerialized(this.sheetId);
75988
76020
  if (serialized.length > 0) {
75989
76021
  this.hot.loadData(serialized, `${(0, _string.toUpperCaseFirst)(PLUGIN_KEY)}.switchSheet`);
@@ -76143,8 +76175,22 @@ class Formulas extends _base.BasePlugin {
76143
76175
  }
76144
76176
  return this.engine.setCellContents(address, newValue);
76145
76177
  }
76178
+
76179
+ /**
76180
+ * The hook allows to translate the formula value to calculated value before it goes to the
76181
+ * validator function.
76182
+ *
76183
+ * @param {*} value The cell value to validate.
76184
+ * @param {number} visualRow The visual row index.
76185
+ * @param {number|string} prop The visual column index or property name of the column.
76186
+ * @returns {*} Returns value to validate.
76187
+ */
76146
76188
  }
76147
76189
  exports.Formulas = Formulas;
76190
+ function _updateSheetNameAndSheetId(sheetName) {
76191
+ this.sheetName = sheetName;
76192
+ this.sheetId = this.engine.getSheetId(this.sheetName);
76193
+ }
76148
76194
  function _onBeforeValidate(value, visualRow, prop) {
76149
76195
  const visualColumn = this.hot.propToCol(prop);
76150
76196
  if (this.isFormulaCellType(visualRow, visualColumn)) {
@@ -76272,29 +76318,33 @@ function _onBeforeLoadData(sourceData, initialLoad) {
76272
76318
  * Callback to `afterCellMetaReset` hook which is triggered after setting cell meta.
76273
76319
  */
76274
76320
  function _onAfterCellMetaReset() {
76321
+ if (_classPrivateFieldGet(_hotWasInitializedWithEmptyData, this)) {
76322
+ this.switchSheet(this.sheetName);
76323
+ return;
76324
+ }
76275
76325
  const sourceDataArray = this.hot.getSourceDataArray();
76276
- let valueChanged = false;
76277
76326
  sourceDataArray.forEach((rowData, rowIndex) => {
76278
76327
  rowData.forEach((cellValue, columnIndex) => {
76279
- const cellMeta = this.hot.getCellMeta(rowIndex, columnIndex);
76328
+ const cellMeta = this.hot.getCellMeta(rowIndex, columnIndex, {
76329
+ skipMetaExtension: true
76330
+ });
76280
76331
  const dateFormat = cellMeta.dateFormat;
76281
76332
  if ((0, _utils.isDate)(cellValue, cellMeta.type)) {
76282
- valueChanged = true;
76283
76333
  if ((0, _utils.isDateValid)(cellValue, dateFormat)) {
76284
76334
  // Rewriting date in HOT format to HF format.
76285
76335
  sourceDataArray[rowIndex][columnIndex] = (0, _utils.getDateInHfFormat)(cellValue, dateFormat);
76286
- } else if (this.isFormulaCellType(rowIndex, columnIndex) === false) {
76336
+ } else if (!cellValue.startsWith('=')) {
76287
76337
  // Escaping value from date parsing using "'" sign (HF feature).
76288
76338
  sourceDataArray[rowIndex][columnIndex] = `'${cellValue}`;
76289
76339
  }
76290
76340
  }
76291
76341
  });
76292
76342
  });
76293
- if (valueChanged === true) {
76294
- _classPrivateFieldSet(_internalOperationPending, this, true);
76295
- this.engine.setSheetContent(this.sheetId, sourceDataArray);
76296
- _classPrivateFieldSet(_internalOperationPending, this, false);
76297
- }
76343
+ _classPrivateFieldSet(_internalOperationPending, this, true);
76344
+ const dependentCells = this.engine.setSheetContent(this.sheetId, sourceDataArray);
76345
+ this.indexSyncer.setupSyncEndpoint(this.engine, this.sheetId);
76346
+ this.renderDependentSheets(dependentCells);
76347
+ _classPrivateFieldSet(_internalOperationPending, this, false);
76298
76348
  }
76299
76349
  /**
76300
76350
  * `afterLoadData` hook callback.
@@ -76308,7 +76358,12 @@ function _onAfterLoadData(sourceData, initialLoad) {
76308
76358
  if (source.includes((0, _string.toUpperCaseFirst)(PLUGIN_KEY))) {
76309
76359
  return;
76310
76360
  }
76311
- this.sheetName = (0, _register.setupSheet)(this.engine, this.hot.getSettings()[PLUGIN_KEY].sheetName);
76361
+ const sheetName = (0, _register.setupSheet)(this.engine, this.hot.getSettings()[PLUGIN_KEY].sheetName);
76362
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, sheetName);
76363
+ if (source === 'updateSettings') {
76364
+ // For performance reasons, the initialization will be done in afterCellMetaReset hook
76365
+ return;
76366
+ }
76312
76367
  if (!_classPrivateFieldGet(_hotWasInitializedWithEmptyData, this)) {
76313
76368
  const sourceDataArray = this.hot.getSourceDataArray();
76314
76369
  if (this.engine.isItPossibleToReplaceSheetContent(this.sheetId, sourceDataArray)) {
@@ -76339,17 +76394,10 @@ function _onModifyData(physicalRow, visualColumn, valueHolder, ioMode) {
76339
76394
  if (visualRow === null || visualColumn === null) {
76340
76395
  return;
76341
76396
  }
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
- }
76397
+ const cellType = this.getCellType(visualRow, visualColumn);
76398
+ if (cellType === 'VALUE' || cellType === 'EMPTY') {
76399
+ valueHolder.value = (0, _utils.unescapeFormulaExpression)(valueHolder.value);
76400
+ return;
76353
76401
  }
76354
76402
  const address = {
76355
76403
  row: this.rowAxisSyncer.getHfIndexFromVisualIndex(visualRow),
@@ -76358,21 +76406,15 @@ function _onModifyData(physicalRow, visualColumn, valueHolder, ioMode) {
76358
76406
  };
76359
76407
  let cellValue = this.engine.getCellValue(address); // Date as an integer (Excel like date).
76360
76408
 
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
- }
76409
+ const cellMeta = this.hot.getCellMeta(visualRow, visualColumn, {
76410
+ skipMetaExtension: true
76411
+ });
76369
76412
  if (cellMeta.type === 'date' && (0, _number.isNumeric)(cellValue)) {
76370
76413
  cellValue = (0, _utils.getDateFromExcelDate)(cellValue, cellMeta.dateFormat);
76371
76414
  }
76372
76415
 
76373
76416
  // 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;
76417
+ valueHolder.value = typeof cellValue === 'object' && cellValue !== null ? cellValue.value : cellValue;
76376
76418
  }
76377
76419
  /**
76378
76420
  * `modifySourceData` hook callback.
@@ -76392,14 +76434,9 @@ function _onModifySourceData(row, columnOrProp, valueHolder, ioMode) {
76392
76434
  if (visualRow === null || visualColumn === null) {
76393
76435
  return;
76394
76436
  }
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
- }
76437
+ const cellType = this.getCellType(visualRow, visualColumn);
76438
+ if (cellType === 'VALUE' || cellType === 'EMPTY') {
76439
+ return;
76403
76440
  }
76404
76441
  const dimensions = this.engine.getSheetDimensions(this.engine.getSheetId(this.sheetName));
76405
76442
 
@@ -76708,7 +76745,7 @@ function _onEngineSheetAdded(addedSheetDisplayName) {
76708
76745
  * @param {string} newDisplayName The new name of the sheet.
76709
76746
  */
76710
76747
  function _onEngineSheetRenamed(oldDisplayName, newDisplayName) {
76711
- this.sheetName = newDisplayName;
76748
+ _assertClassBrand(_Formulas_brand, this, _updateSheetNameAndSheetId).call(this, newDisplayName);
76712
76749
  this.hot.runHooks('afterSheetRenamed', oldDisplayName, newDisplayName);
76713
76750
  }
76714
76751
  /**
@@ -77522,7 +77559,11 @@ class AxisSyncer {
77522
77559
  getHfIndexFromVisualIndex(visualIndex) {
77523
77560
  const indexesSequence = _classPrivateFieldGet(_indexMapper, this).getIndexesSequence();
77524
77561
  const notTrimmedIndexes = _classPrivateFieldGet(_indexMapper, this).getNotTrimmedIndexes();
77525
- return indexesSequence.indexOf(notTrimmedIndexes[visualIndex]);
77562
+
77563
+ // Optimization:
77564
+ // notTrimmedIndexes is a subset of indexesSequence,
77565
+ // so for every x indexesSequence.indexOf(x) is always >= notTrimmedIndexes.indexOf(x)
77566
+ return indexesSequence.indexOf(notTrimmedIndexes[visualIndex], visualIndex);
77526
77567
  }
77527
77568
 
77528
77569
  /**
@@ -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-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