handsontable 14.1.0 → 14.2.0-next-7ae341f-20240229

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.
Files changed (161) hide show
  1. package/3rdparty/walkontable/src/core/_base.js +12 -0
  2. package/3rdparty/walkontable/src/core/_base.mjs +12 -0
  3. package/3rdparty/walkontable/src/scroll.js +131 -98
  4. package/3rdparty/walkontable/src/scroll.mjs +133 -100
  5. package/3rdparty/walkontable/src/selection/border/border.js +3 -3
  6. package/3rdparty/walkontable/src/selection/border/border.mjs +3 -3
  7. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +26 -0
  8. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +26 -0
  9. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +26 -0
  10. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +26 -0
  11. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +20 -0
  12. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +20 -0
  13. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +20 -0
  14. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +20 -0
  15. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +20 -0
  16. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +20 -0
  17. package/3rdparty/walkontable/src/table.js +2 -0
  18. package/3rdparty/walkontable/src/table.mjs +2 -0
  19. package/3rdparty/walkontable/src/viewport.js +9 -0
  20. package/3rdparty/walkontable/src/viewport.mjs +10 -1
  21. package/CHANGELOG.md +36 -0
  22. package/base.js +2 -2
  23. package/base.mjs +2 -2
  24. package/core/index.js +6 -0
  25. package/core/index.mjs +2 -1
  26. package/core/viewportScroll/index.js +65 -0
  27. package/core/viewportScroll/index.mjs +61 -0
  28. package/core/viewportScroll/scrollStrategies/columnHeaderScroll.js +20 -0
  29. package/core/viewportScroll/scrollStrategies/columnHeaderScroll.mjs +16 -0
  30. package/core/viewportScroll/scrollStrategies/cornerHeaderScroll.js +14 -0
  31. package/core/viewportScroll/scrollStrategies/cornerHeaderScroll.mjs +10 -0
  32. package/core/viewportScroll/scrollStrategies/multipleScroll.js +15 -0
  33. package/core/viewportScroll/scrollStrategies/multipleScroll.mjs +11 -0
  34. package/core/viewportScroll/scrollStrategies/noncontiguousScroll.js +15 -0
  35. package/core/viewportScroll/scrollStrategies/noncontiguousScroll.mjs +11 -0
  36. package/core/viewportScroll/scrollStrategies/rowHeaderScroll.js +20 -0
  37. package/core/viewportScroll/scrollStrategies/rowHeaderScroll.mjs +16 -0
  38. package/core/viewportScroll/scrollStrategies/singleScroll.js +46 -0
  39. package/core/viewportScroll/scrollStrategies/singleScroll.mjs +42 -0
  40. package/core.d.ts +1 -1
  41. package/core.js +11 -52
  42. package/core.mjs +12 -53
  43. package/dataMap/metaManager/index.js +1 -1
  44. package/dataMap/metaManager/index.mjs +1 -1
  45. package/dataMap/metaManager/metaLayers/cellMeta.js +6 -1
  46. package/dataMap/metaManager/metaLayers/cellMeta.mjs +6 -1
  47. package/dataMap/metaManager/metaSchema.js +36 -12
  48. package/dataMap/metaManager/metaSchema.mjs +36 -12
  49. package/dist/handsontable.css +2 -2
  50. package/dist/handsontable.full.css +2 -2
  51. package/dist/handsontable.full.js +2996 -1928
  52. package/dist/handsontable.full.min.css +2 -2
  53. package/dist/handsontable.full.min.js +42 -42
  54. package/dist/handsontable.js +2998 -1930
  55. package/dist/handsontable.min.css +2 -2
  56. package/dist/handsontable.min.js +25 -25
  57. package/dist/languages/all.js +130 -25
  58. package/dist/languages/all.min.js +1 -1
  59. package/dist/languages/hr-HR.js +167 -0
  60. package/dist/languages/hr-HR.min.js +1 -0
  61. package/editorManager.js +15 -4
  62. package/editorManager.mjs +15 -4
  63. package/editors/autocompleteEditor/autocompleteEditor.js +2 -2
  64. package/editors/autocompleteEditor/autocompleteEditor.mjs +2 -2
  65. package/editors/baseEditor/baseEditor.js +1 -1
  66. package/editors/baseEditor/baseEditor.mjs +1 -1
  67. package/editors/checkboxEditor/checkboxEditor.js +5 -4
  68. package/editors/checkboxEditor/checkboxEditor.mjs +5 -4
  69. package/editors/dateEditor/dateEditor.js +1 -1
  70. package/editors/dateEditor/dateEditor.mjs +1 -1
  71. package/editors/dropdownEditor/dropdownEditor.js +1 -1
  72. package/editors/dropdownEditor/dropdownEditor.mjs +1 -1
  73. package/editors/handsontableEditor/handsontableEditor.js +1 -1
  74. package/editors/handsontableEditor/handsontableEditor.mjs +1 -1
  75. package/editors/selectEditor/selectEditor.js +1 -1
  76. package/editors/selectEditor/selectEditor.mjs +1 -1
  77. package/editors/textEditor/textEditor.js +1 -2
  78. package/editors/textEditor/textEditor.mjs +1 -2
  79. package/editors/timeEditor/timeEditor.js +1 -1
  80. package/editors/timeEditor/timeEditor.mjs +1 -1
  81. package/helpers/mixed.js +2 -2
  82. package/helpers/mixed.mjs +2 -2
  83. package/helpers/moves.js +86 -0
  84. package/helpers/moves.mjs +82 -0
  85. package/i18n/languages/hr-HR.js +96 -0
  86. package/i18n/languages/hr-HR.mjs +90 -0
  87. package/i18n/languages/index.js +2 -0
  88. package/i18n/languages/index.mjs +2 -1
  89. package/languages/all.js +130 -25
  90. package/languages/hr-HR.js +167 -0
  91. package/languages/hr-HR.mjs +92 -0
  92. package/languages/index.js +130 -25
  93. package/languages/index.mjs +2 -1
  94. package/package.json +11 -1
  95. package/pluginHooks.d.ts +4 -2
  96. package/pluginHooks.js +33 -3
  97. package/pluginHooks.mjs +33 -3
  98. package/plugins/autoColumnSize/autoColumnSize.js +6 -1
  99. package/plugins/autoColumnSize/autoColumnSize.mjs +6 -1
  100. package/plugins/autoRowSize/autoRowSize.js +5 -0
  101. package/plugins/autoRowSize/autoRowSize.mjs +5 -0
  102. package/plugins/autofill/autofill.js +3 -2
  103. package/plugins/autofill/autofill.mjs +3 -2
  104. package/plugins/dropdownMenu/dropdownMenu.js +58 -4
  105. package/plugins/dropdownMenu/dropdownMenu.mjs +58 -4
  106. package/plugins/filters/component/value.js +51 -5
  107. package/plugins/filters/component/value.mjs +51 -5
  108. package/plugins/filters/utils.js +1 -1
  109. package/plugins/filters/utils.mjs +1 -1
  110. package/plugins/formulas/formulas.js +10 -1
  111. package/plugins/formulas/formulas.mjs +10 -1
  112. package/plugins/formulas/indexSyncer/axisSyncer.js +3 -75
  113. package/plugins/formulas/indexSyncer/axisSyncer.mjs +3 -75
  114. package/plugins/manualColumnResize/manualColumnResize.js +3 -0
  115. package/plugins/manualColumnResize/manualColumnResize.mjs +3 -0
  116. package/plugins/mergeCells/cellsCollection.js +1 -1
  117. package/plugins/mergeCells/cellsCollection.mjs +1 -1
  118. package/plugins/mergeCells/mergeCells.js +30 -0
  119. package/plugins/mergeCells/mergeCells.mjs +30 -0
  120. package/plugins/undoRedo/undoRedo.js +61 -14
  121. package/plugins/undoRedo/undoRedo.mjs +61 -14
  122. package/renderers/autocompleteRenderer/autocompleteRenderer.js +1 -1
  123. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +1 -1
  124. package/renderers/baseRenderer/baseRenderer.js +1 -1
  125. package/renderers/baseRenderer/baseRenderer.mjs +1 -1
  126. package/renderers/checkboxRenderer/checkboxRenderer.js +36 -8
  127. package/renderers/checkboxRenderer/checkboxRenderer.mjs +36 -8
  128. package/renderers/dateRenderer/dateRenderer.js +1 -1
  129. package/renderers/dateRenderer/dateRenderer.mjs +1 -1
  130. package/renderers/dropdownRenderer/dropdownRenderer.js +1 -1
  131. package/renderers/dropdownRenderer/dropdownRenderer.mjs +1 -1
  132. package/renderers/handsontableRenderer/handsontableRenderer.js +1 -1
  133. package/renderers/handsontableRenderer/handsontableRenderer.mjs +1 -1
  134. package/renderers/htmlRenderer/htmlRenderer.js +1 -1
  135. package/renderers/htmlRenderer/htmlRenderer.mjs +1 -1
  136. package/renderers/numericRenderer/index.js +2 -1
  137. package/renderers/numericRenderer/index.mjs +1 -1
  138. package/renderers/numericRenderer/numericRenderer.js +28 -13
  139. package/renderers/numericRenderer/numericRenderer.mjs +27 -13
  140. package/renderers/passwordRenderer/passwordRenderer.js +1 -1
  141. package/renderers/passwordRenderer/passwordRenderer.mjs +1 -1
  142. package/renderers/selectRenderer/selectRenderer.js +1 -1
  143. package/renderers/selectRenderer/selectRenderer.mjs +1 -1
  144. package/renderers/textRenderer/textRenderer.js +1 -1
  145. package/renderers/textRenderer/textRenderer.mjs +1 -1
  146. package/renderers/timeRenderer/timeRenderer.js +1 -1
  147. package/renderers/timeRenderer/timeRenderer.mjs +1 -1
  148. package/selection/mouseEventHandler.js +4 -0
  149. package/selection/mouseEventHandler.mjs +4 -0
  150. package/selection/selection.js +64 -5
  151. package/selection/selection.mjs +64 -5
  152. package/shortcuts/recorder.js +27 -8
  153. package/shortcuts/recorder.mjs +27 -8
  154. package/tableView.js +86 -5
  155. package/tableView.mjs +87 -6
  156. package/utils/autoResize.js +0 -1
  157. package/utils/autoResize.mjs +0 -1
  158. package/utils/ghostTable.js +6 -6
  159. package/utils/ghostTable.mjs +6 -6
  160. package/utils/parseTable.js +9 -1
  161. package/utils/parseTable.mjs +9 -1
package/core.js CHANGED
@@ -110,7 +110,6 @@ function Core(rootElement, userSettings) {
110
110
  var _userSettings$layoutD,
111
111
  _this = this;
112
112
  let rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
113
- let preventScrollingToCell = false;
114
113
  let instance = this;
115
114
  const eventManager = new _eventManager.default(instance);
116
115
  let datamap;
@@ -118,6 +117,7 @@ function Core(rootElement, userSettings) {
118
117
  let grid;
119
118
  let editorManager;
120
119
  let focusManager;
120
+ let viewportScroller;
121
121
  let firstRun = true;
122
122
  if ((0, _rootInstance.hasValidParameter)(rootInstanceSymbol)) {
123
123
  (0, _rootInstance.registerAsRootInstance)(this);
@@ -307,7 +307,7 @@ function Core(rootElement, userSettings) {
307
307
  };
308
308
  this.columnIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
309
309
  this.rowIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
310
- this.selection.addLocalHook('afterSetRangeEnd', cellCoords => {
310
+ this.selection.addLocalHook('afterSetRangeEnd', (cellCoords, isLastSelectionLayer) => {
311
311
  const preventScrolling = (0, _object.createObjectPropListener)(false);
312
312
  const selectionRange = this.selection.getSelectedRange();
313
313
  const {
@@ -316,53 +316,12 @@ function Core(rootElement, userSettings) {
316
316
  } = selectionRange.current();
317
317
  const selectionLayerLevel = selectionRange.size() - 1;
318
318
  this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);
319
- this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel); // eslint-disable-line max-len
320
-
321
- let scrollToCell = true;
322
- if (preventScrollingToCell) {
323
- scrollToCell = false;
324
- }
325
- if (preventScrolling.isTouched()) {
326
- scrollToCell = !preventScrolling.value;
327
- }
328
- const currentSelectedRange = this.selection.selectedRange.current();
329
- const isSelectedByAnyHeader = this.selection.isSelectedByAnyHeader();
330
- const isSelectedByRowHeader = this.selection.isSelectedByRowHeader();
331
- const isSelectedByColumnHeader = this.selection.isSelectedByColumnHeader();
332
- if (scrollToCell !== false) {
333
- if (!isSelectedByAnyHeader) {
334
- if (currentSelectedRange && !this.selection.isMultiple()) {
335
- const {
336
- row,
337
- col
338
- } = currentSelectedRange.from;
339
- if (row < 0 && col >= 0) {
340
- this.scrollViewportTo({
341
- col
342
- });
343
- } else if (col < 0 && row >= 0) {
344
- this.scrollViewportTo({
345
- row
346
- });
347
- } else {
348
- this.scrollViewportTo({
349
- row,
350
- col
351
- });
352
- }
353
- } else {
354
- this.scrollViewportTo(cellCoords.toObject());
355
- }
356
- } else if (isSelectedByRowHeader) {
357
- this.scrollViewportTo({
358
- row: cellCoords.row
359
- });
360
- } else if (isSelectedByColumnHeader) {
361
- this.scrollViewportTo({
362
- col: cellCoords.col
363
- });
364
- }
319
+ this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);
320
+ if (isLastSelectionLayer && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {
321
+ viewportScroller.scrollTo(cellCoords);
365
322
  }
323
+ const isSelectedByRowHeader = selection.isSelectedByRowHeader();
324
+ const isSelectedByColumnHeader = selection.isSelectedByColumnHeader();
366
325
 
367
326
  // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected
368
327
  // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing
@@ -1098,6 +1057,7 @@ function Core(rootElement, userSettings) {
1098
1057
  this.updateSettings(tableMeta, true);
1099
1058
  this.view = new _tableView.default(this);
1100
1059
  editorManager = _editorManager.default.getInstance(instance, tableMeta, selection);
1060
+ viewportScroller = (0, _index3.createViewportScroller)(instance);
1101
1061
  focusManager = new _focusManager.FocusManager(instance);
1102
1062
  if ((0, _rootInstance.isRootInstance)(this)) {
1103
1063
  (0, _index3.installFocusCatcher)(instance);
@@ -3915,13 +3875,13 @@ function Core(rootElement, userSettings) {
3915
3875
  let scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
3916
3876
  let changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
3917
3877
  if (scrollToCell === false) {
3918
- preventScrollingToCell = true;
3878
+ viewportScroller.suspend();
3919
3879
  }
3920
3880
  const wasSelected = selection.selectCells(coords);
3921
3881
  if (wasSelected && changeListener) {
3922
3882
  instance.listen();
3923
3883
  }
3924
- preventScrollingToCell = false;
3884
+ viewportScroller.resume();
3925
3885
  return wasSelected;
3926
3886
  };
3927
3887
 
@@ -4053,9 +4013,8 @@ function Core(rootElement, userSettings) {
4053
4013
  let includeRowHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
4054
4014
  let includeColumnHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : includeRowHeaders;
4055
4015
  let options = arguments.length > 2 ? arguments[2] : undefined;
4056
- preventScrollingToCell = true;
4016
+ viewportScroller.skipNextScrollCycle();
4057
4017
  selection.selectAll(includeRowHeaders, includeColumnHeaders, options);
4058
- preventScrollingToCell = false;
4059
4018
  };
4060
4019
  const getIndexToScroll = (indexMapper, visualIndex) => {
4061
4020
  // Looking for a visual index on the right and then (when not found) on the left.
package/core.mjs CHANGED
@@ -28,7 +28,7 @@ import { hasLanguageDictionary, getValidLanguageCode, getTranslatedPhrase } from
28
28
  import { warnUserAboutLanguageRegistration, normalizeLanguageCode } from "./i18n/utils.mjs";
29
29
  import { Selection } from "./selection/index.mjs";
30
30
  import { MetaManager, DynamicCellMetaMod, ExtendMetaPropertiesMod, replaceData } from "./dataMap/index.mjs";
31
- import { installFocusCatcher } from "./core/index.mjs";
31
+ import { installFocusCatcher, createViewportScroller } from "./core/index.mjs";
32
32
  import { createUniqueMap } from "./utils/dataStructures/uniqueMap.mjs";
33
33
  import { createShortcutManager } from "./shortcuts/index.mjs";
34
34
  import { registerAllShortcutContexts } from "./shortcutContexts/index.mjs";
@@ -105,7 +105,6 @@ export default function Core(rootElement, userSettings) {
105
105
  var _userSettings$layoutD,
106
106
  _this = this;
107
107
  let rootInstanceSymbol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
108
- let preventScrollingToCell = false;
109
108
  let instance = this;
110
109
  const eventManager = new EventManager(instance);
111
110
  let datamap;
@@ -113,6 +112,7 @@ export default function Core(rootElement, userSettings) {
113
112
  let grid;
114
113
  let editorManager;
115
114
  let focusManager;
115
+ let viewportScroller;
116
116
  let firstRun = true;
117
117
  if (hasValidParameter(rootInstanceSymbol)) {
118
118
  registerAsRootInstance(this);
@@ -302,7 +302,7 @@ export default function Core(rootElement, userSettings) {
302
302
  };
303
303
  this.columnIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
304
304
  this.rowIndexMapper.addLocalHook('cacheUpdated', onIndexMapperCacheUpdate);
305
- this.selection.addLocalHook('afterSetRangeEnd', cellCoords => {
305
+ this.selection.addLocalHook('afterSetRangeEnd', (cellCoords, isLastSelectionLayer) => {
306
306
  const preventScrolling = createObjectPropListener(false);
307
307
  const selectionRange = this.selection.getSelectedRange();
308
308
  const {
@@ -311,53 +311,12 @@ export default function Core(rootElement, userSettings) {
311
311
  } = selectionRange.current();
312
312
  const selectionLayerLevel = selectionRange.size() - 1;
313
313
  this.runHooks('afterSelection', from.row, from.col, to.row, to.col, preventScrolling, selectionLayerLevel);
314
- this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel); // eslint-disable-line max-len
315
-
316
- let scrollToCell = true;
317
- if (preventScrollingToCell) {
318
- scrollToCell = false;
319
- }
320
- if (preventScrolling.isTouched()) {
321
- scrollToCell = !preventScrolling.value;
322
- }
323
- const currentSelectedRange = this.selection.selectedRange.current();
324
- const isSelectedByAnyHeader = this.selection.isSelectedByAnyHeader();
325
- const isSelectedByRowHeader = this.selection.isSelectedByRowHeader();
326
- const isSelectedByColumnHeader = this.selection.isSelectedByColumnHeader();
327
- if (scrollToCell !== false) {
328
- if (!isSelectedByAnyHeader) {
329
- if (currentSelectedRange && !this.selection.isMultiple()) {
330
- const {
331
- row,
332
- col
333
- } = currentSelectedRange.from;
334
- if (row < 0 && col >= 0) {
335
- this.scrollViewportTo({
336
- col
337
- });
338
- } else if (col < 0 && row >= 0) {
339
- this.scrollViewportTo({
340
- row
341
- });
342
- } else {
343
- this.scrollViewportTo({
344
- row,
345
- col
346
- });
347
- }
348
- } else {
349
- this.scrollViewportTo(cellCoords.toObject());
350
- }
351
- } else if (isSelectedByRowHeader) {
352
- this.scrollViewportTo({
353
- row: cellCoords.row
354
- });
355
- } else if (isSelectedByColumnHeader) {
356
- this.scrollViewportTo({
357
- col: cellCoords.col
358
- });
359
- }
314
+ this.runHooks('afterSelectionByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), preventScrolling, selectionLayerLevel);
315
+ if (isLastSelectionLayer && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {
316
+ viewportScroller.scrollTo(cellCoords);
360
317
  }
318
+ const isSelectedByRowHeader = selection.isSelectedByRowHeader();
319
+ const isSelectedByColumnHeader = selection.isSelectedByColumnHeader();
361
320
 
362
321
  // @TODO: These CSS classes are no longer needed anymore. They are used only as a indicator of the selected
363
322
  // rows/columns in the MergedCells plugin (via border.js#L520 in the walkontable module). After fixing
@@ -1093,6 +1052,7 @@ export default function Core(rootElement, userSettings) {
1093
1052
  this.updateSettings(tableMeta, true);
1094
1053
  this.view = new TableView(this);
1095
1054
  editorManager = EditorManager.getInstance(instance, tableMeta, selection);
1055
+ viewportScroller = createViewportScroller(instance);
1096
1056
  focusManager = new FocusManager(instance);
1097
1057
  if (isRootInstance(this)) {
1098
1058
  installFocusCatcher(instance);
@@ -3910,13 +3870,13 @@ export default function Core(rootElement, userSettings) {
3910
3870
  let scrollToCell = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
3911
3871
  let changeListener = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
3912
3872
  if (scrollToCell === false) {
3913
- preventScrollingToCell = true;
3873
+ viewportScroller.suspend();
3914
3874
  }
3915
3875
  const wasSelected = selection.selectCells(coords);
3916
3876
  if (wasSelected && changeListener) {
3917
3877
  instance.listen();
3918
3878
  }
3919
- preventScrollingToCell = false;
3879
+ viewportScroller.resume();
3920
3880
  return wasSelected;
3921
3881
  };
3922
3882
 
@@ -4048,9 +4008,8 @@ export default function Core(rootElement, userSettings) {
4048
4008
  let includeRowHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
4049
4009
  let includeColumnHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : includeRowHeaders;
4050
4010
  let options = arguments.length > 2 ? arguments[2] : undefined;
4051
- preventScrollingToCell = true;
4011
+ viewportScroller.skipNextScrollCycle();
4052
4012
  selection.selectAll(includeRowHeaders, includeColumnHeaders, options);
4053
- preventScrollingToCell = false;
4054
4013
  };
4055
4014
  const getIndexToScroll = (indexMapper, visualIndex) => {
4056
4015
  // Looking for a visual index on the right and then (when not found) on the left.
@@ -218,7 +218,7 @@ class MetaManager {
218
218
 
219
219
  /**
220
220
  * Returns all cell meta objects that were created during the Handsontable operation but for
221
- * specyfic row index.
221
+ * specific row index.
222
222
  *
223
223
  * @param {number} physicalRow The physical row index.
224
224
  * @returns {object[]}
@@ -214,7 +214,7 @@ export default class MetaManager {
214
214
 
215
215
  /**
216
216
  * Returns all cell meta objects that were created during the Handsontable operation but for
217
- * specyfic row index.
217
+ * specific row index.
218
218
  *
219
219
  * @param {number} physicalRow The physical row index.
220
220
  * @returns {object[]}
@@ -6,6 +6,7 @@ require("core-js/modules/es.error.cause.js");
6
6
  var _object = require("../../../helpers/object");
7
7
  var _utils = require("../utils");
8
8
  var _lazyFactoryMap = _interopRequireDefault(require("../lazyFactoryMap"));
9
+ var _mixed = require("../../../helpers/mixed");
9
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
12
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
@@ -171,7 +172,11 @@ class CellMeta {
171
172
  const metas = [];
172
173
  const rows = Array.from(this.metas.values());
173
174
  for (let row = 0; row < rows.length; row++) {
174
- metas.push(...rows[row].values());
175
+ // Getting a meta for already added row (new row already exist - it has been added using `createRow` method).
176
+ // However, is not ready until the first `getMeta` call (lazy loading).
177
+ if ((0, _mixed.isDefined)(rows[row])) {
178
+ metas.push(...rows[row].values());
179
+ }
175
180
  }
176
181
  return metas;
177
182
  }
@@ -6,6 +6,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
6
6
  import { extend } from "../../../helpers/object.mjs";
7
7
  import { extendByMetaType, assert, isUnsignedNumber } from "../utils.mjs";
8
8
  import LazyFactoryMap from "../lazyFactoryMap.mjs";
9
+ import { isDefined } from "../../../helpers/mixed.mjs";
9
10
  /* eslint-disable jsdoc/require-description-complete-sentence */
10
11
  /**
11
12
  * @class CellMeta
@@ -167,7 +168,11 @@ export default class CellMeta {
167
168
  const metas = [];
168
169
  const rows = Array.from(this.metas.values());
169
170
  for (let row = 0; row < rows.length; row++) {
170
- metas.push(...rows[row].values());
171
+ // Getting a meta for already added row (new row already exist - it has been added using `createRow` method).
172
+ // However, is not ready until the first `getMeta` call (lazy loading).
173
+ if (isDefined(rows[row])) {
174
+ metas.push(...rows[row].values());
175
+ }
171
176
  }
172
177
  return metas;
173
178
  }
@@ -1169,9 +1169,9 @@ var _default = () => {
1169
1169
  * ]
1170
1170
  *
1171
1171
  * // enable copying for specific cells
1172
- * cells: [
1172
+ * cell: [
1173
1173
  * {
1174
- * cell: 0,
1174
+ * coll: 0,
1175
1175
  * row: 0,
1176
1176
  * // disable copying for cell (0, 0)
1177
1177
  * copyable: false,
@@ -2217,7 +2217,7 @@ var _default = () => {
2217
2217
  *
2218
2218
  * formulas: {
2219
2219
  * // set `engine` to a HyperFormula instance
2220
- * engine: hyperFormulaInstance,
2220
+ * engine: hyperformulaInstance,
2221
2221
  * sheetId: 1,
2222
2222
  * sheetName: 'Sheet 1'
2223
2223
  * }
@@ -2226,7 +2226,7 @@ var _default = () => {
2226
2226
  * formulas: {
2227
2227
  * // set `engine` to a HyperFormula configuration object
2228
2228
  * engine: {
2229
- * hyperformula: HyperFormula // or `engine: hyperFormulaInstance`
2229
+ * hyperformula: HyperFormula // or `engine: hyperformulaInstance`
2230
2230
  * leapYear1900: false, // this option comes from HyperFormula
2231
2231
  * // add more HyperFormula configuration options
2232
2232
  * },
@@ -2257,7 +2257,7 @@ var _default = () => {
2257
2257
  *
2258
2258
  * You can set the `fragmentSelection` option to one of the following:
2259
2259
  *
2260
- * | Setting | Decription |
2260
+ * | Setting | Description |
2261
2261
  * | ----------------- | ------------------------------------------------- |
2262
2262
  * | `false` (default) | Disable text selection |
2263
2263
  * | `true` | Enable text selection in multiple cells at a time |
@@ -3209,7 +3209,7 @@ var _default = () => {
3209
3209
  * | `true` | Enable the [`NestedRows`](@/api/nestedRows.md) plugin |
3210
3210
  *
3211
3211
  * Read more:
3212
- * - [Plugins: `NestedRows`](@/api/nestedRows.md)
3212
+ * - [Plugins: `NestedRows`](@/guides/rows/row-parent-child.md)
3213
3213
  *
3214
3214
  * @example
3215
3215
  * ```js
@@ -3493,11 +3493,11 @@ var _default = () => {
3493
3493
  preventWheel: false,
3494
3494
  /**
3495
3495
  * @description
3496
- * The `readOnly` option determines whether a cell, column or comment is editable or not.
3497
- *
3498
- * You can set the `readOnly` option to one of the following:
3496
+ * The `readOnly` option determines whether a [cell](@/guides/cell-features/disabled-cells.md#read-only-specific-cells),
3497
+ * [comment](@/guides/cell-features/comments.md#make-a-comment-read-only), [column](@/guides/cell-features/disabled-cells.md#read-only-columns)
3498
+ * or the [entire grid](@/guides/cell-features/disabled-cells.md#read-only-grid) is editable or not. You can configure it as follows:
3499
3499
  *
3500
- * | Setting | Decription |
3500
+ * | Setting | Description |
3501
3501
  * | ----------------- | ------------------------------------------------------------------------------------------------------------------------- |
3502
3502
  * | `false` (default) | Set as editable |
3503
3503
  * | `true` | - Set as read-only<br>- Add the [`readOnlyCellClassName`](#readOnlyCellClassName) CSS class name (by default: `htDimmed`) |
@@ -3505,6 +3505,7 @@ var _default = () => {
3505
3505
  * `readOnly` cells can't be changed by the [`populateFromArray()`](@/api/core.md#populatefromarray) method.
3506
3506
  *
3507
3507
  * Read more:
3508
+ * - [Disabled cells](@/guides/cell-features/disabled-cells.md)
3508
3509
  * - [Configuration options: Cascading configuration](@/guides/getting-started/configuration-options.md#cascading-configuration)
3509
3510
  *
3510
3511
  * @memberof Options#
@@ -3514,8 +3515,31 @@ var _default = () => {
3514
3515
  *
3515
3516
  * @example
3516
3517
  * ```js
3517
- * // set as read-only
3518
- * readOnly: true,
3518
+ * // make the entire grid read-only
3519
+ * const configurationOptions = {
3520
+ * columnSorting: true,
3521
+ * };
3522
+ *
3523
+ * // make the third column read-only
3524
+ * const configurationOptions = {
3525
+ * columns: [
3526
+ * {},
3527
+ * {},
3528
+ * {
3529
+ * readOnly: true,
3530
+ * },
3531
+ * ],
3532
+ * };
3533
+ *
3534
+ * // make a specific cell read-only
3535
+ * const configurationOptions = {
3536
+ * cell: [
3537
+ * {
3538
+ * row: 0,
3539
+ * col: 0,
3540
+ * readOnly: true,
3541
+ * },
3542
+ * };
3519
3543
  * ```
3520
3544
  */
3521
3545
  readOnly: false,
@@ -1166,9 +1166,9 @@ export default (() => {
1166
1166
  * ]
1167
1167
  *
1168
1168
  * // enable copying for specific cells
1169
- * cells: [
1169
+ * cell: [
1170
1170
  * {
1171
- * cell: 0,
1171
+ * coll: 0,
1172
1172
  * row: 0,
1173
1173
  * // disable copying for cell (0, 0)
1174
1174
  * copyable: false,
@@ -2214,7 +2214,7 @@ export default (() => {
2214
2214
  *
2215
2215
  * formulas: {
2216
2216
  * // set `engine` to a HyperFormula instance
2217
- * engine: hyperFormulaInstance,
2217
+ * engine: hyperformulaInstance,
2218
2218
  * sheetId: 1,
2219
2219
  * sheetName: 'Sheet 1'
2220
2220
  * }
@@ -2223,7 +2223,7 @@ export default (() => {
2223
2223
  * formulas: {
2224
2224
  * // set `engine` to a HyperFormula configuration object
2225
2225
  * engine: {
2226
- * hyperformula: HyperFormula // or `engine: hyperFormulaInstance`
2226
+ * hyperformula: HyperFormula // or `engine: hyperformulaInstance`
2227
2227
  * leapYear1900: false, // this option comes from HyperFormula
2228
2228
  * // add more HyperFormula configuration options
2229
2229
  * },
@@ -2254,7 +2254,7 @@ export default (() => {
2254
2254
  *
2255
2255
  * You can set the `fragmentSelection` option to one of the following:
2256
2256
  *
2257
- * | Setting | Decription |
2257
+ * | Setting | Description |
2258
2258
  * | ----------------- | ------------------------------------------------- |
2259
2259
  * | `false` (default) | Disable text selection |
2260
2260
  * | `true` | Enable text selection in multiple cells at a time |
@@ -3206,7 +3206,7 @@ export default (() => {
3206
3206
  * | `true` | Enable the [`NestedRows`](@/api/nestedRows.md) plugin |
3207
3207
  *
3208
3208
  * Read more:
3209
- * - [Plugins: `NestedRows`](@/api/nestedRows.md)
3209
+ * - [Plugins: `NestedRows`](@/guides/rows/row-parent-child.md)
3210
3210
  *
3211
3211
  * @example
3212
3212
  * ```js
@@ -3490,11 +3490,11 @@ export default (() => {
3490
3490
  preventWheel: false,
3491
3491
  /**
3492
3492
  * @description
3493
- * The `readOnly` option determines whether a cell, column or comment is editable or not.
3494
- *
3495
- * You can set the `readOnly` option to one of the following:
3493
+ * The `readOnly` option determines whether a [cell](@/guides/cell-features/disabled-cells.md#read-only-specific-cells),
3494
+ * [comment](@/guides/cell-features/comments.md#make-a-comment-read-only), [column](@/guides/cell-features/disabled-cells.md#read-only-columns)
3495
+ * or the [entire grid](@/guides/cell-features/disabled-cells.md#read-only-grid) is editable or not. You can configure it as follows:
3496
3496
  *
3497
- * | Setting | Decription |
3497
+ * | Setting | Description |
3498
3498
  * | ----------------- | ------------------------------------------------------------------------------------------------------------------------- |
3499
3499
  * | `false` (default) | Set as editable |
3500
3500
  * | `true` | - Set as read-only<br>- Add the [`readOnlyCellClassName`](#readOnlyCellClassName) CSS class name (by default: `htDimmed`) |
@@ -3502,6 +3502,7 @@ export default (() => {
3502
3502
  * `readOnly` cells can't be changed by the [`populateFromArray()`](@/api/core.md#populatefromarray) method.
3503
3503
  *
3504
3504
  * Read more:
3505
+ * - [Disabled cells](@/guides/cell-features/disabled-cells.md)
3505
3506
  * - [Configuration options: Cascading configuration](@/guides/getting-started/configuration-options.md#cascading-configuration)
3506
3507
  *
3507
3508
  * @memberof Options#
@@ -3511,8 +3512,31 @@ export default (() => {
3511
3512
  *
3512
3513
  * @example
3513
3514
  * ```js
3514
- * // set as read-only
3515
- * readOnly: true,
3515
+ * // make the entire grid read-only
3516
+ * const configurationOptions = {
3517
+ * columnSorting: true,
3518
+ * };
3519
+ *
3520
+ * // make the third column read-only
3521
+ * const configurationOptions = {
3522
+ * columns: [
3523
+ * {},
3524
+ * {},
3525
+ * {
3526
+ * readOnly: true,
3527
+ * },
3528
+ * ],
3529
+ * };
3530
+ *
3531
+ * // make a specific cell read-only
3532
+ * const configurationOptions = {
3533
+ * cell: [
3534
+ * {
3535
+ * row: 0,
3536
+ * col: 0,
3537
+ * readOnly: true,
3538
+ * },
3539
+ * };
3516
3540
  * ```
3517
3541
  */
3518
3542
  readOnly: false,
@@ -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: 14.1.0
29
- * Release date: 16/01/2024 (built at 16/01/2024 10:27:31)
28
+ * Version: 14.2.0-next-7ae341f-20240229
29
+ * Release date: 06/03/2024 (built at 29/02/2024 08:44:44)
30
30
  */
31
31
  /**
32
32
  * Fix for bootstrap styles
@@ -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: 14.1.0
29
- * Release date: 16/01/2024 (built at 16/01/2024 10:27:31)
28
+ * Version: 14.2.0-next-7ae341f-20240229
29
+ * Release date: 06/03/2024 (built at 29/02/2024 08:44:44)
30
30
  */
31
31
  /**
32
32
  * Fix for bootstrap styles