handsontable 17.1.0-rc8 → 17.1.0

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 (74) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/base.js +2 -2
  3. package/base.mjs +2 -2
  4. package/core.js +13 -5
  5. package/core.mjs +13 -5
  6. package/dist/handsontable.full.js +284 -127
  7. package/dist/handsontable.full.min.js +108 -108
  8. package/dist/handsontable.js +69 -28
  9. package/dist/handsontable.min.js +30 -30
  10. package/dist/languages/all.min.js +1 -1
  11. package/dist/themes/classic.js +2 -2
  12. package/dist/themes/classic.min.js +2 -2
  13. package/dist/themes/horizon.js +2 -2
  14. package/dist/themes/horizon.min.js +2 -2
  15. package/dist/themes/main.js +2 -2
  16. package/dist/themes/main.min.js +2 -2
  17. package/dist/themes/static/variables/colors/ant.js +2 -2
  18. package/dist/themes/static/variables/colors/ant.min.js +2 -2
  19. package/dist/themes/static/variables/colors/classic.js +2 -2
  20. package/dist/themes/static/variables/colors/classic.min.js +2 -2
  21. package/dist/themes/static/variables/colors/horizon.js +2 -2
  22. package/dist/themes/static/variables/colors/horizon.min.js +2 -2
  23. package/dist/themes/static/variables/colors/main.js +2 -2
  24. package/dist/themes/static/variables/colors/main.min.js +2 -2
  25. package/dist/themes/static/variables/colors/material.js +2 -2
  26. package/dist/themes/static/variables/colors/material.min.js +2 -2
  27. package/dist/themes/static/variables/colors/shadcn.js +2 -2
  28. package/dist/themes/static/variables/colors/shadcn.min.js +2 -2
  29. package/dist/themes/static/variables/density.js +2 -2
  30. package/dist/themes/static/variables/density.min.js +2 -2
  31. package/dist/themes/static/variables/helpers/iconsMap.js +2 -2
  32. package/dist/themes/static/variables/helpers/iconsMap.min.js +2 -2
  33. package/dist/themes/static/variables/icons/horizon.js +2 -2
  34. package/dist/themes/static/variables/icons/horizon.min.js +2 -2
  35. package/dist/themes/static/variables/icons/main.js +2 -2
  36. package/dist/themes/static/variables/icons/main.min.js +2 -2
  37. package/dist/themes/static/variables/sizing.js +2 -2
  38. package/dist/themes/static/variables/sizing.min.js +2 -2
  39. package/dist/themes/static/variables/tokens/classic.js +2 -2
  40. package/dist/themes/static/variables/tokens/classic.min.js +2 -2
  41. package/dist/themes/static/variables/tokens/horizon.js +2 -2
  42. package/dist/themes/static/variables/tokens/horizon.min.js +2 -2
  43. package/dist/themes/static/variables/tokens/main.js +2 -2
  44. package/dist/themes/static/variables/tokens/main.min.js +2 -2
  45. package/helpers/dom/element.js +2 -4
  46. package/helpers/dom/element.mjs +2 -4
  47. package/helpers/mixed.js +1 -1
  48. package/helpers/mixed.mjs +1 -1
  49. package/package.json +1 -1
  50. package/plugins/dataProvider/query/pagination.js +6 -3
  51. package/plugins/dataProvider/query/pagination.mjs +17 -7
  52. package/plugins/dialog/dialog.js +2 -1
  53. package/plugins/dialog/dialog.mjs +2 -1
  54. package/plugins/emptyDataState/emptyDataState.js +1 -1
  55. package/plugins/emptyDataState/emptyDataState.mjs +1 -1
  56. package/plugins/pagination/pagination.d.ts +1 -0
  57. package/plugins/pagination/pagination.js +7 -0
  58. package/plugins/pagination/pagination.mjs +7 -0
  59. package/selection/mouseEventHandler.js +12 -2
  60. package/selection/mouseEventHandler.mjs +12 -2
  61. package/styles/handsontable.css +2 -2
  62. package/styles/handsontable.min.css +2 -2
  63. package/styles/handsontableStyles.js +1 -1
  64. package/styles/handsontableStyles.mjs +1 -1
  65. package/styles/ht-icons-horizon.min.css +2 -2
  66. package/styles/ht-icons-main.min.css +2 -2
  67. package/styles/ht-theme-classic-no-icons.min.css +2 -2
  68. package/styles/ht-theme-classic.min.css +2 -2
  69. package/styles/ht-theme-horizon-no-icons.min.css +2 -2
  70. package/styles/ht-theme-horizon.min.css +2 -2
  71. package/styles/ht-theme-main-no-icons.min.css +2 -2
  72. package/styles/ht-theme-main.min.css +2 -2
  73. package/themes/engine/manager.js +50 -2
  74. package/themes/engine/manager.mjs +50 -2
package/CHANGELOG.md CHANGED
@@ -9,7 +9,7 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
10
  <!-- UNVERSIONED -->
11
11
 
12
- ## [17.1.0-rc7] - 2026-05-06
12
+ ## [17.1.0] - 2026-05-19
13
13
 
14
14
  ### Added
15
15
  - Added a hit area for dropdown menu and collapsible buttons [#12070](https://github.com/handsontable/handsontable/pull/12070)
@@ -78,6 +78,11 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
78
78
  - Fixed one-pixel horizontal alignment for the left pagination caret [#2791](https://github.com/handsontable/handsontable/pull/2791)
79
79
  - Fixed setDataAtRowProp interrupting edits in progress [#4305](https://github.com/handsontable/handsontable/issues/4305)
80
80
  - React: Fixed the React wrapper skipping settings updates when `dataSchema` or `columns` contains non-plain objects such as `Date`, `Set`, or `Map`. [#12207](https://github.com/handsontable/handsontable/pull/12207)
81
+ - Fixed the loading overlay resetting the grid scroll position to the top when no cell was selected before showing the overlay. [#12514](https://github.com/handsontable/handsontable/issues/12514)
82
+ - Fixed a memory leak caused by ThemeManager not unsubscribing from the shared theme object on destroy. [#12570](https://github.com/handsontable/handsontable/issues/12570)
83
+ - Fixed viewport scroll jump when Ctrl+clicking a selected cell to deselect it. [#12574](https://github.com/handsontable/handsontable/issues/12574)
84
+ - Fixed a memory leak where IntersectionObserver instances were not properly disconnected when `document.body` had zero height. [#12578](https://github.com/handsontable/handsontable/issues/12578)
85
+ - Fixed the browser page scrolling to the grid when `dataProvider` loads rows for the first time into an empty grid with `emptyDataState` enabled. [#12591](https://github.com/handsontable/handsontable/issues/12591)
81
86
 
82
87
  ### Security
83
88
  - Patched critical and high dependency vulnerabilities across the monorepo and aligned Angular wrapper tooling for compatibility. [#12237](https://github.com/handsontable/handsontable/issues/12237)
package/base.js CHANGED
@@ -60,8 +60,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
60
60
  Handsontable.CellCoords = _src.CellCoords;
61
61
  Handsontable.CellRange = _src.CellRange;
62
62
  Handsontable.packageName = 'handsontable';
63
- Handsontable.buildDate = "08/05/2026 12:05:24";
64
- Handsontable.version = "17.1.0-rc8";
63
+ Handsontable.buildDate = "19/05/2026 14:51:41";
64
+ Handsontable.version = "17.1.0";
65
65
  Handsontable.languages = {
66
66
  dictionaryKeys: _registry.dictionaryKeys,
67
67
  getLanguageDictionary: _registry.getLanguageDictionary,
package/base.mjs CHANGED
@@ -35,8 +35,8 @@ Handsontable.hooks = Hooks.getSingleton();
35
35
  Handsontable.CellCoords = CellCoords;
36
36
  Handsontable.CellRange = CellRange;
37
37
  Handsontable.packageName = 'handsontable';
38
- Handsontable.buildDate = "08/05/2026 12:05:24";
39
- Handsontable.version = "17.1.0-rc8";
38
+ Handsontable.buildDate = "19/05/2026 14:51:41";
39
+ Handsontable.version = "17.1.0";
40
40
  Handsontable.languages = {
41
41
  dictionaryKeys,
42
42
  getLanguageDictionary,
package/core.js CHANGED
@@ -225,6 +225,7 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
225
225
  this.rootGridElement.appendChild(this.rootElement);
226
226
  this.rootWrapperElement.appendChild(this.rootGridElement);
227
227
  this.rootContainer.appendChild(this.rootWrapperElement);
228
+ this.rootWrapperElement.__hotInstance = this;
228
229
  (0, _element.addClass)(this.rootPortalElement, 'ht-portal');
229
230
  this.rootDocument.body.appendChild(this.rootPortalElement);
230
231
  }
@@ -452,7 +453,9 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
452
453
  const selectionSource = selection.getSelectionSource();
453
454
  const ignoreScrollSources = [
454
455
  'loadData',
455
- 'updateData'
456
+ 'updateData',
457
+ 'deselect',
458
+ 'shift'
456
459
  ];
457
460
  if (isLastSelectionLayer && !ignoreScrollSources.includes(selectionSource) && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {
458
461
  viewportScroller.scrollTo(cellCoords);
@@ -483,14 +486,16 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
483
486
  'shift',
484
487
  'refresh',
485
488
  'loadData',
486
- 'updateData'
489
+ 'updateData',
490
+ 'deselect'
487
491
  ].includes(selectionSource)) {
488
492
  editorManager.closeEditor(null);
489
493
  }
490
494
  if (![
491
495
  'refresh',
492
496
  'loadData',
493
- 'updateData'
497
+ 'updateData',
498
+ 'deselect'
494
499
  ].includes(selectionSource)) {
495
500
  instance.view.render();
496
501
  editorManager.prepareEditor();
@@ -514,7 +519,10 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
514
519
  const { from, to } = cellRanges[selectionLayerLevel];
515
520
  this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);
516
521
  this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);
517
- if (selection.getSelectionSource() === 'refresh') {
522
+ if ([
523
+ 'refresh',
524
+ 'deselect'
525
+ ].includes(selection.getSelectionSource())) {
518
526
  instance.view.render();
519
527
  editorManager.prepareEditor();
520
528
  }
@@ -1080,7 +1088,7 @@ function Core(rootContainer, userSettings, rootInstanceSymbol = false) {
1080
1088
  focusGridManager.init();
1081
1089
  if ((0, _rootInstance.isRootInstance)(this)) {
1082
1090
  (0, _a11yAnnouncer.install)(instance.rootPortalElement);
1083
- (0, _mixed._injectProductInfo)(mergedUserSettings.licenseKey, this.rootWrapperElement, "08/05/2026");
1091
+ (0, _mixed._injectProductInfo)(mergedUserSettings.licenseKey, this.rootWrapperElement, "19/05/2026");
1084
1092
  }
1085
1093
  instance.runHooks('init');
1086
1094
  this.render();
package/core.mjs CHANGED
@@ -210,6 +210,7 @@ const deprecationWarns = new Set();
210
210
  this.rootGridElement.appendChild(this.rootElement);
211
211
  this.rootWrapperElement.appendChild(this.rootGridElement);
212
212
  this.rootContainer.appendChild(this.rootWrapperElement);
213
+ this.rootWrapperElement.__hotInstance = this;
213
214
  addClass(this.rootPortalElement, 'ht-portal');
214
215
  this.rootDocument.body.appendChild(this.rootPortalElement);
215
216
  }
@@ -437,7 +438,9 @@ const deprecationWarns = new Set();
437
438
  const selectionSource = selection.getSelectionSource();
438
439
  const ignoreScrollSources = [
439
440
  'loadData',
440
- 'updateData'
441
+ 'updateData',
442
+ 'deselect',
443
+ 'shift'
441
444
  ];
442
445
  if (isLastSelectionLayer && !ignoreScrollSources.includes(selectionSource) && (!preventScrolling.isTouched() || preventScrolling.isTouched() && !preventScrolling.value)) {
443
446
  viewportScroller.scrollTo(cellCoords);
@@ -468,14 +471,16 @@ const deprecationWarns = new Set();
468
471
  'shift',
469
472
  'refresh',
470
473
  'loadData',
471
- 'updateData'
474
+ 'updateData',
475
+ 'deselect'
472
476
  ].includes(selectionSource)) {
473
477
  editorManager.closeEditor(null);
474
478
  }
475
479
  if (![
476
480
  'refresh',
477
481
  'loadData',
478
- 'updateData'
482
+ 'updateData',
483
+ 'deselect'
479
484
  ].includes(selectionSource)) {
480
485
  instance.view.render();
481
486
  editorManager.prepareEditor();
@@ -499,7 +504,10 @@ const deprecationWarns = new Set();
499
504
  const { from, to } = cellRanges[selectionLayerLevel];
500
505
  this.runHooks('afterSelectionEnd', from.row, from.col, to.row, to.col, selectionLayerLevel);
501
506
  this.runHooks('afterSelectionEndByProp', from.row, instance.colToProp(from.col), to.row, instance.colToProp(to.col), selectionLayerLevel);
502
- if (selection.getSelectionSource() === 'refresh') {
507
+ if ([
508
+ 'refresh',
509
+ 'deselect'
510
+ ].includes(selection.getSelectionSource())) {
503
511
  instance.view.render();
504
512
  editorManager.prepareEditor();
505
513
  }
@@ -1065,7 +1073,7 @@ const deprecationWarns = new Set();
1065
1073
  focusGridManager.init();
1066
1074
  if (isRootInstance(this)) {
1067
1075
  installAccessibilityAnnouncer(instance.rootPortalElement);
1068
- _injectProductInfo(mergedUserSettings.licenseKey, this.rootWrapperElement, "08/05/2026");
1076
+ _injectProductInfo(mergedUserSettings.licenseKey, this.rootWrapperElement, "19/05/2026");
1069
1077
  }
1070
1078
  instance.runHooks('init');
1071
1079
  this.render();