handsontable 0.0.0-next-ff10728-20250410 → 0.0.0-next-d9b3885-20250415

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

Potentially problematic release.


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

Files changed (122) hide show
  1. package/3rdparty/walkontable/src/cell/range.js +14 -0
  2. package/3rdparty/walkontable/src/cell/range.mjs +14 -0
  3. package/3rdparty/walkontable/src/renderer/rowHeaders.js +4 -1
  4. package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +4 -1
  5. package/3rdparty/walkontable/src/selection/border/border.js +5 -0
  6. package/3rdparty/walkontable/src/selection/border/border.mjs +5 -0
  7. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +3 -4
  8. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +3 -4
  9. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +8 -10
  10. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +8 -10
  11. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +3 -4
  12. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +3 -4
  13. package/3rdparty/walkontable/src/table.js +5 -2
  14. package/3rdparty/walkontable/src/table.mjs +5 -2
  15. package/CHANGELOG.md +39 -0
  16. package/base.js +2 -2
  17. package/base.mjs +2 -2
  18. package/core/focusCatcher/focusDetector.js +1 -1
  19. package/core/focusCatcher/focusDetector.mjs +2 -2
  20. package/core/hooks/constants.js +266 -0
  21. package/core/hooks/constants.mjs +266 -0
  22. package/core/hooks/index.d.ts +1 -0
  23. package/core.d.ts +0 -1
  24. package/core.js +71 -25
  25. package/core.mjs +72 -26
  26. package/dataMap/dataMap.js +0 -7
  27. package/dataMap/dataMap.mjs +0 -7
  28. package/dataMap/metaManager/metaSchema.js +28 -0
  29. package/dataMap/metaManager/metaSchema.mjs +28 -0
  30. package/dist/handsontable.css +3 -3
  31. package/dist/handsontable.full.css +3 -3
  32. package/dist/handsontable.full.js +1375 -350
  33. package/dist/handsontable.full.min.css +3 -3
  34. package/dist/handsontable.full.min.js +17 -17
  35. package/dist/handsontable.js +1375 -350
  36. package/dist/handsontable.min.css +3 -3
  37. package/dist/handsontable.min.js +18 -18
  38. package/editorManager.js +1 -7
  39. package/editorManager.mjs +1 -7
  40. package/editors/autocompleteEditor/autocompleteEditor.js +14 -4
  41. package/editors/autocompleteEditor/autocompleteEditor.mjs +14 -4
  42. package/editors/textEditor/textEditor.js +1 -1
  43. package/editors/textEditor/textEditor.mjs +2 -2
  44. package/helpers/browser.js +1 -1
  45. package/helpers/browser.mjs +1 -1
  46. package/helpers/dom/element.js +2 -2
  47. package/helpers/dom/element.mjs +1 -1
  48. package/helpers/mixed.js +2 -2
  49. package/helpers/mixed.mjs +2 -2
  50. package/helpers/object.js +3 -0
  51. package/helpers/object.mjs +3 -0
  52. package/package.json +1 -1
  53. package/plugins/autoColumnSize/autoColumnSize.js +48 -1
  54. package/plugins/autoColumnSize/autoColumnSize.mjs +48 -1
  55. package/plugins/autoRowSize/autoRowSize.js +46 -6
  56. package/plugins/autoRowSize/autoRowSize.mjs +46 -6
  57. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +13 -0
  58. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +13 -0
  59. package/plugins/collapsibleColumns/collapsibleColumns.js +31 -0
  60. package/plugins/collapsibleColumns/collapsibleColumns.mjs +31 -0
  61. package/plugins/columnSorting/columnSorting.js +0 -4
  62. package/plugins/columnSorting/columnSorting.mjs +0 -4
  63. package/plugins/columnSummary/columnSummary.js +33 -0
  64. package/plugins/columnSummary/columnSummary.mjs +33 -0
  65. package/plugins/comments/comments.js +54 -0
  66. package/plugins/comments/comments.mjs +54 -0
  67. package/plugins/contextMenu/menu/defaultShortcutsList.js +2 -2
  68. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +2 -2
  69. package/plugins/contextMenu/menu/menu.js +1 -0
  70. package/plugins/contextMenu/menu/menu.mjs +1 -0
  71. package/plugins/contextMenu/menu/positioner.js +10 -2
  72. package/plugins/contextMenu/menu/positioner.mjs +10 -2
  73. package/plugins/copyPaste/copyPaste.js +12 -15
  74. package/plugins/copyPaste/copyPaste.mjs +13 -16
  75. package/plugins/copyPaste/pasteEvent.js +3 -0
  76. package/plugins/copyPaste/pasteEvent.mjs +3 -0
  77. package/plugins/dropdownMenu/dropdownMenu.js +15 -0
  78. package/plugins/dropdownMenu/dropdownMenu.mjs +15 -0
  79. package/plugins/exportFile/exportFile.js +58 -0
  80. package/plugins/exportFile/exportFile.mjs +58 -0
  81. package/plugins/filters/filters.js +99 -24
  82. package/plugins/filters/filters.mjs +99 -24
  83. package/plugins/filters/ui/multipleSelect.js +7 -1
  84. package/plugins/filters/ui/multipleSelect.mjs +7 -1
  85. package/plugins/hiddenColumns/hiddenColumns.js +65 -1
  86. package/plugins/hiddenColumns/hiddenColumns.mjs +65 -1
  87. package/plugins/hiddenRows/hiddenRows.js +65 -1
  88. package/plugins/hiddenRows/hiddenRows.mjs +65 -1
  89. package/plugins/manualColumnResize/manualColumnResize.js +4 -6
  90. package/plugins/manualColumnResize/manualColumnResize.mjs +4 -6
  91. package/plugins/manualRowResize/manualRowResize.js +4 -6
  92. package/plugins/manualRowResize/manualRowResize.mjs +4 -6
  93. package/plugins/mergeCells/mergeCells.js +26 -29
  94. package/plugins/mergeCells/mergeCells.mjs +26 -29
  95. package/plugins/mergeCells/renderer.js +15 -0
  96. package/plugins/mergeCells/renderer.mjs +15 -0
  97. package/plugins/mergeCells/utils.js +31 -0
  98. package/plugins/mergeCells/utils.mjs +27 -0
  99. package/plugins/nestedHeaders/nestedHeaders.js +25 -0
  100. package/plugins/nestedHeaders/nestedHeaders.mjs +25 -0
  101. package/plugins/nestedRows/data/dataManager.js +2 -2
  102. package/plugins/nestedRows/data/dataManager.mjs +2 -2
  103. package/plugins/stretchColumns/stretchColumns.js +13 -0
  104. package/plugins/stretchColumns/stretchColumns.mjs +13 -0
  105. package/plugins/trimRows/trimRows.js +61 -0
  106. package/plugins/trimRows/trimRows.mjs +61 -0
  107. package/plugins/undoRedo/actions/removeColumn.js +19 -14
  108. package/plugins/undoRedo/actions/removeColumn.mjs +19 -14
  109. package/plugins/undoRedo/actions/removeRow.js +12 -4
  110. package/plugins/undoRedo/actions/removeRow.mjs +12 -4
  111. package/selection/selection.js +3 -1
  112. package/selection/selection.mjs +3 -1
  113. package/styles/handsontable.css +14 -15
  114. package/styles/handsontable.min.css +3 -3
  115. package/styles/ht-theme-horizon.css +2 -2
  116. package/styles/ht-theme-horizon.min.css +2 -2
  117. package/styles/ht-theme-main.css +2 -2
  118. package/styles/ht-theme-main.min.css +2 -2
  119. package/tableView.js +5 -8
  120. package/tableView.mjs +5 -8
  121. package/utils/ghostTable.js +3 -0
  122. package/utils/ghostTable.mjs +3 -0
package/editorManager.js CHANGED
@@ -80,13 +80,7 @@ class EditorManager {
80
80
  this.selection = _selection;
81
81
  this.eventManager = new _eventManager.default(hotInstance);
82
82
  this.hot.addHook('afterDocumentKeyDown', event => _assertClassBrand(_EditorManager_brand, this, _onAfterDocumentKeyDown).call(this, event));
83
-
84
- // Open editor when text composition is started (IME editor)
85
- this.eventManager.addEventListener(this.hot.rootDocument.documentElement, 'compositionstart', event => {
86
- if (!this.destroyed && this.hot.isListening()) {
87
- this.openEditor('', event);
88
- }
89
- });
83
+ this.hot.addHook('beforeCompositionStart', event => _assertClassBrand(_EditorManager_brand, this, _onAfterDocumentKeyDown).call(this, event));
90
84
  this.hot.view._wt.update('onCellDblClick', (event, coords, elem) => _assertClassBrand(_EditorManager_brand, this, _onCellDblClick).call(this, event, coords, elem));
91
85
  }
92
86
 
package/editorManager.mjs CHANGED
@@ -76,13 +76,7 @@ class EditorManager {
76
76
  this.selection = _selection;
77
77
  this.eventManager = new EventManager(hotInstance);
78
78
  this.hot.addHook('afterDocumentKeyDown', event => _assertClassBrand(_EditorManager_brand, this, _onAfterDocumentKeyDown).call(this, event));
79
-
80
- // Open editor when text composition is started (IME editor)
81
- this.eventManager.addEventListener(this.hot.rootDocument.documentElement, 'compositionstart', event => {
82
- if (!this.destroyed && this.hot.isListening()) {
83
- this.openEditor('', event);
84
- }
85
- });
79
+ this.hot.addHook('beforeCompositionStart', event => _assertClassBrand(_EditorManager_brand, this, _onAfterDocumentKeyDown).call(this, event));
86
80
  this.hot.view._wt.update('onCellDblClick', (event, coords, elem) => _assertClassBrand(_EditorManager_brand, this, _onCellDblClick).call(this, event, coords, elem));
87
81
  }
88
82
 
@@ -15,6 +15,7 @@ var _string = require("../../helpers/string");
15
15
  var _unicode = require("../../helpers/unicode");
16
16
  var _textRenderer = require("../../renderers/textRenderer");
17
17
  var _a11y = require("../../helpers/a11y");
18
+ var _function = require("../../helpers/function");
18
19
  function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
19
20
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
20
21
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -30,6 +31,7 @@ const EDITOR_TYPE = exports.EDITOR_TYPE = 'autocomplete';
30
31
  * @class AutocompleteEditor
31
32
  */
32
33
  var _idPrefix = /*#__PURE__*/new WeakMap();
34
+ var _focusDebounced = /*#__PURE__*/new WeakMap();
33
35
  var _AutocompleteEditor_brand = /*#__PURE__*/new WeakSet();
34
36
  class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
35
37
  constructor() {
@@ -62,6 +64,12 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
62
64
  * @type {string}
63
65
  */
64
66
  _classPrivateFieldInitSpec(this, _idPrefix, this.hot.guid.slice(0, 9));
67
+ /**
68
+ * Runs focus method after debounce.
69
+ */
70
+ _classPrivateFieldInitSpec(this, _focusDebounced, (0, _function.debounce)(() => {
71
+ this.focus();
72
+ }, 100));
65
73
  /**
66
74
  * Filters and sorts by relevance.
67
75
  *
@@ -147,7 +155,6 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
147
155
  }
148
156
  return this.TEXTAREA.value;
149
157
  }
150
-
151
158
  /**
152
159
  * Creates an editor's elements and adds necessary CSS classnames.
153
160
  */
@@ -193,10 +200,10 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
193
200
  this.showEditableElement();
194
201
  this.focus();
195
202
  this.addHook('beforeKeyDown', event => this.onBeforeKeyDown(event));
203
+ this.htEditor.addHook('afterScroll', _classPrivateFieldGet(_focusDebounced, this));
196
204
  this.htEditor.updateSettings({
197
205
  colWidths: trimDropdown ? [(0, _element.outerWidth)(this.TEXTAREA) - 2] : undefined,
198
206
  autoColumnSize: true,
199
- autoRowSize: true,
200
207
  renderer: (hotInstance, TD, row, col, prop, value, cellProperties) => {
201
208
  (0, _textRenderer.textRenderer)(hotInstance, TD, row, col, prop, value, cellProperties);
202
209
  const {
@@ -468,7 +475,10 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
468
475
  const maxItems = Math.min(this.cellProperties.visibleRows, this.strippedChoices.length);
469
476
  const height = Array.from({
470
477
  length: maxItems
471
- }, (_, i) => i).reduce((h, index) => h + this.htEditor.getRowHeight(index), 0);
478
+ }, (_, i) => i).reduce((totalHeight, index) => {
479
+ const rowHeight = this.htEditor.getRowHeight(index) || this.htEditor.view.getDefaultRowHeight();
480
+ return totalHeight + rowHeight;
481
+ }, 0);
472
482
  return height + borderVerticalCompensation + 1;
473
483
  }
474
484
 
@@ -566,7 +576,7 @@ exports.AutocompleteEditor = AutocompleteEditor;
566
576
  function _fixDropdownWidth() {
567
577
  if (this.htEditor.view.hasVerticalScroll()) {
568
578
  this.htEditor.updateSettings({
569
- width: this.htEditor.getSettings().width + (0, _element.getScrollbarWidth)(this.hot.rootDocument)
579
+ width: this.getWidth() + (0, _element.getScrollbarWidth)(this.hot.rootDocument)
570
580
  });
571
581
  }
572
582
  }
@@ -20,6 +20,7 @@ import { stripTags } from "../../helpers/string.mjs";
20
20
  import { KEY_CODES, isPrintableChar } from "../../helpers/unicode.mjs";
21
21
  import { textRenderer } from "../../renderers/textRenderer/index.mjs";
22
22
  import { A11Y_ACTIVEDESCENDANT, A11Y_AUTOCOMPLETE, A11Y_COMBOBOX, A11Y_CONTROLS, A11Y_EXPANDED, A11Y_HASPOPUP, A11Y_LISTBOX, A11Y_LIVE, A11Y_OPTION, A11Y_POSINSET, A11Y_PRESENTATION, A11Y_RELEVANT, A11Y_SELECTED, A11Y_SETSIZE, A11Y_TEXT } from "../../helpers/a11y.mjs";
23
+ import { debounce } from "../../helpers/function.mjs";
23
24
  export const EDITOR_TYPE = 'autocomplete';
24
25
 
25
26
  /**
@@ -27,6 +28,7 @@ export const EDITOR_TYPE = 'autocomplete';
27
28
  * @class AutocompleteEditor
28
29
  */
29
30
  var _idPrefix = /*#__PURE__*/new WeakMap();
31
+ var _focusDebounced = /*#__PURE__*/new WeakMap();
30
32
  var _AutocompleteEditor_brand = /*#__PURE__*/new WeakSet();
31
33
  export class AutocompleteEditor extends HandsontableEditor {
32
34
  constructor() {
@@ -59,6 +61,12 @@ export class AutocompleteEditor extends HandsontableEditor {
59
61
  * @type {string}
60
62
  */
61
63
  _classPrivateFieldInitSpec(this, _idPrefix, this.hot.guid.slice(0, 9));
64
+ /**
65
+ * Runs focus method after debounce.
66
+ */
67
+ _classPrivateFieldInitSpec(this, _focusDebounced, debounce(() => {
68
+ this.focus();
69
+ }, 100));
62
70
  /**
63
71
  * Filters and sorts by relevance.
64
72
  *
@@ -144,7 +152,6 @@ export class AutocompleteEditor extends HandsontableEditor {
144
152
  }
145
153
  return this.TEXTAREA.value;
146
154
  }
147
-
148
155
  /**
149
156
  * Creates an editor's elements and adds necessary CSS classnames.
150
157
  */
@@ -190,10 +197,10 @@ export class AutocompleteEditor extends HandsontableEditor {
190
197
  this.showEditableElement();
191
198
  this.focus();
192
199
  this.addHook('beforeKeyDown', event => this.onBeforeKeyDown(event));
200
+ this.htEditor.addHook('afterScroll', _classPrivateFieldGet(_focusDebounced, this));
193
201
  this.htEditor.updateSettings({
194
202
  colWidths: trimDropdown ? [outerWidth(this.TEXTAREA) - 2] : undefined,
195
203
  autoColumnSize: true,
196
- autoRowSize: true,
197
204
  renderer: (hotInstance, TD, row, col, prop, value, cellProperties) => {
198
205
  textRenderer(hotInstance, TD, row, col, prop, value, cellProperties);
199
206
  const {
@@ -465,7 +472,10 @@ export class AutocompleteEditor extends HandsontableEditor {
465
472
  const maxItems = Math.min(this.cellProperties.visibleRows, this.strippedChoices.length);
466
473
  const height = Array.from({
467
474
  length: maxItems
468
- }, (_, i) => i).reduce((h, index) => h + this.htEditor.getRowHeight(index), 0);
475
+ }, (_, i) => i).reduce((totalHeight, index) => {
476
+ const rowHeight = this.htEditor.getRowHeight(index) || this.htEditor.view.getDefaultRowHeight();
477
+ return totalHeight + rowHeight;
478
+ }, 0);
469
479
  return height + borderVerticalCompensation + 1;
470
480
  }
471
481
 
@@ -562,7 +572,7 @@ export class AutocompleteEditor extends HandsontableEditor {
562
572
  function _fixDropdownWidth() {
563
573
  if (this.htEditor.view.hasVerticalScroll()) {
564
574
  this.htEditor.updateSettings({
565
- width: this.htEditor.getSettings().width + getScrollbarWidth(this.hot.rootDocument)
575
+ width: this.getWidth() + getScrollbarWidth(this.hot.rootDocument)
566
576
  });
567
577
  }
568
578
  }
@@ -123,7 +123,7 @@ class TextEditor extends _baseEditor.BaseEditor {
123
123
  */
124
124
  close() {
125
125
  this.autoResize.unObserve();
126
- if ((0, _element.isThisHotChild)(this.hot.rootDocument.activeElement, this.hot.rootElement)) {
126
+ if ((0, _element.isInternalElement)(this.hot.rootDocument.activeElement, this.hot.rootElement)) {
127
127
  this.hot.listen(); // don't refocus the table if user focused some cell outside of HT on purpose
128
128
  }
129
129
  this.hideEditableElement();
@@ -5,7 +5,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
5
5
  import { BaseEditor, EDITOR_STATE } from "../baseEditor/index.mjs";
6
6
  import EventManager from "../../eventManager.mjs";
7
7
  import { isEdge, isIOS } from "../../helpers/browser.mjs";
8
- import { addClass, isThisHotChild, setCaretPosition, hasClass, removeClass, setAttribute } from "../../helpers/dom/element.mjs";
8
+ import { addClass, isInternalElement, setCaretPosition, hasClass, removeClass, setAttribute } from "../../helpers/dom/element.mjs";
9
9
  import { rangeEach } from "../../helpers/number.mjs";
10
10
  import { createInputElementResizer } from "../../utils/autoResize.mjs";
11
11
  import { isDefined } from "../../helpers/mixed.mjs";
@@ -119,7 +119,7 @@ export class TextEditor extends BaseEditor {
119
119
  */
120
120
  close() {
121
121
  this.autoResize.unObserve();
122
- if (isThisHotChild(this.hot.rootDocument.activeElement, this.hot.rootElement)) {
122
+ if (isInternalElement(this.hot.rootDocument.activeElement, this.hot.rootElement)) {
123
123
  this.hot.listen(); // don't refocus the table if user focused some cell outside of HT on purpose
124
124
  }
125
125
  this.hideEditableElement();
@@ -41,7 +41,7 @@ const platforms = {
41
41
  mac: tester(platform => /^Mac/.test(platform)),
42
42
  win: tester(platform => /^Win/.test(platform)),
43
43
  linux: tester(platform => /^Linux/.test(platform)),
44
- ios: tester(ua => /iPhone|iPad|iPod/i.test(ua))
44
+ ios: tester(platform => /iPhone|iPad|iPod/i.test(platform))
45
45
  };
46
46
 
47
47
  /**
@@ -23,7 +23,7 @@ const platforms = {
23
23
  mac: tester(platform => /^Mac/.test(platform)),
24
24
  win: tester(platform => /^Win/.test(platform)),
25
25
  linux: tester(platform => /^Linux/.test(platform)),
26
- ios: tester(ua => /iPhone|iPad|iPod/i.test(ua))
26
+ ios: tester(platform => /iPhone|iPad|iPod/i.test(platform))
27
27
  };
28
28
 
29
29
  /**
@@ -38,8 +38,8 @@ exports.isChildOf = isChildOf;
38
38
  exports.isDetached = isDetached;
39
39
  exports.isHTMLElement = isHTMLElement;
40
40
  exports.isInput = isInput;
41
+ exports.isInternalElement = isInternalElement;
41
42
  exports.isOutsideInput = isOutsideInput;
42
- exports.isThisHotChild = isThisHotChild;
43
43
  exports.isVisible = isVisible;
44
44
  exports.makeElementContentEditableAndSelectItsContent = makeElementContentEditableAndSelectItsContent;
45
45
  exports.matchesCSSRules = matchesCSSRules;
@@ -100,7 +100,7 @@ function getParent(element) {
100
100
  * @param {HTMLElement} thisHotContainer The Handsontable container.
101
101
  * @returns {boolean}
102
102
  */
103
- function isThisHotChild(element, thisHotContainer) {
103
+ function isInternalElement(element, thisHotContainer) {
104
104
  const closestHandsontableContainer = element.closest('.handsontable');
105
105
  return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
106
106
  }
@@ -39,7 +39,7 @@ export function getParent(element) {
39
39
  * @param {HTMLElement} thisHotContainer The Handsontable container.
40
40
  * @returns {boolean}
41
41
  */
42
- export function isThisHotChild(element, thisHotContainer) {
42
+ export function isInternalElement(element, thisHotContainer) {
43
43
  const closestHandsontableContainer = element.closest('.handsontable');
44
44
  return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
45
45
  }
package/helpers/mixed.js CHANGED
@@ -134,7 +134,7 @@ const domMessages = {
134
134
  function _injectProductInfo(key, element) {
135
135
  const hasValidType = !isEmpty(key);
136
136
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
137
- const hotVersion = "0.0.0-next-ff10728-20250410";
137
+ const hotVersion = "0.0.0-next-d9b3885-20250415";
138
138
  let keyValidityDate;
139
139
  let consoleMessageState = 'invalid';
140
140
  let domMessageState = 'invalid';
@@ -142,7 +142,7 @@ function _injectProductInfo(key, element) {
142
142
  const schemaValidity = _checkKeySchema(key);
143
143
  if (hasValidType || isNonCommercial || schemaValidity) {
144
144
  if (schemaValidity) {
145
- const releaseDate = (0, _moment.default)("20/02/2025", 'DD/MM/YYYY');
145
+ const releaseDate = (0, _moment.default)("19/03/2025", 'DD/MM/YYYY');
146
146
  const releaseDays = Math.floor(releaseDate.toDate().getTime() / 8.64e7);
147
147
  const keyValidityDays = _extractTime(key);
148
148
  keyValidityDate = (0, _moment.default)((keyValidityDays + 1) * 8.64e7, 'x').format('MMMM DD, YYYY');
package/helpers/mixed.mjs CHANGED
@@ -124,7 +124,7 @@ const domMessages = {
124
124
  export function _injectProductInfo(key, element) {
125
125
  const hasValidType = !isEmpty(key);
126
126
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
127
- const hotVersion = "0.0.0-next-ff10728-20250410";
127
+ const hotVersion = "0.0.0-next-d9b3885-20250415";
128
128
  let keyValidityDate;
129
129
  let consoleMessageState = 'invalid';
130
130
  let domMessageState = 'invalid';
@@ -132,7 +132,7 @@ export function _injectProductInfo(key, element) {
132
132
  const schemaValidity = _checkKeySchema(key);
133
133
  if (hasValidType || isNonCommercial || schemaValidity) {
134
134
  if (schemaValidity) {
135
- const releaseDate = moment("20/02/2025", 'DD/MM/YYYY');
135
+ const releaseDate = moment("19/03/2025", 'DD/MM/YYYY');
136
136
  const releaseDays = Math.floor(releaseDate.toDate().getTime() / 8.64e7);
137
137
  const keyValidityDays = _extractTime(key);
138
138
  keyValidityDate = moment((keyValidityDays + 1) * 8.64e7, 'x').format('MMMM DD, YYYY');
package/helpers/object.js CHANGED
@@ -281,6 +281,9 @@ function getProperty(object, name) {
281
281
  * @param {*} value Value to be assigned at the provided property.
282
282
  */
283
283
  function setProperty(object, name, value) {
284
+ if (typeof name !== 'string') {
285
+ return;
286
+ }
284
287
  const names = name.split('.');
285
288
  let workingObject = object;
286
289
  names.forEach((propName, index) => {
@@ -262,6 +262,9 @@ export function getProperty(object, name) {
262
262
  * @param {*} value Value to be assigned at the provided property.
263
263
  */
264
264
  export function setProperty(object, name, value) {
265
+ if (typeof name !== 'string') {
266
+ return;
267
+ }
265
268
  const names = name.split('.');
266
269
  let workingObject = object;
267
270
  names.forEach((propName, index) => {
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "url": "https://github.com/handsontable/handsontable/issues"
11
11
  },
12
12
  "author": "Handsoncode <hello@handsontable.com>",
13
- "version": "0.0.0-next-ff10728-20250410",
13
+ "version": "0.0.0-next-d9b3885-20250415",
14
14
  "main": "index",
15
15
  "module": "index.mjs",
16
16
  "jsnext:main": "index.mjs",
@@ -127,6 +127,53 @@ const COLUMN_SIZE_MAP_NAME = 'autoColumnSize';
127
127
  * }
128
128
  * ```
129
129
  * :::
130
+ *
131
+ * ::: only-for angular
132
+ *
133
+ * ```ts
134
+ * import { AfterViewInit, Component, ViewChild } from "@angular/core";
135
+ * import {
136
+ * GridSettings,
137
+ * HotTableModule,
138
+ * HotTableComponent,
139
+ * } from "@handsontable/angular-wrapper";
140
+ *
141
+ * `@Component`({
142
+ * selector: "app-example",
143
+ * standalone: true,
144
+ * imports: [HotTableModule],
145
+ * template: ` <div class="ht-theme-main">
146
+ * <hot-table [settings]="gridSettings" />
147
+ * </div>`,
148
+ * })
149
+ * export class ExampleComponent implements AfterViewInit {
150
+ * `@ViewChild`(HotTableComponent, { static: false })
151
+ * readonly hotTable!: HotTableComponent;
152
+ *
153
+ * readonly gridSettings = <GridSettings>{
154
+ * data: this.getData(),
155
+ * autoColumnSize: true,
156
+ * };
157
+ *
158
+ * ngAfterViewInit(): void {
159
+ * // Access to plugin instance:
160
+ * const hot = this.hotTable.hotInstance;
161
+ * const plugin = hot.getPlugin("autoColumnSize");
162
+ *
163
+ * plugin.getColumnWidth(4);
164
+ *
165
+ * if (plugin.isEnabled()) {
166
+ * // code...
167
+ * }
168
+ * }
169
+ *
170
+ * private getData(): any[] {
171
+ * //get some data
172
+ * }
173
+ * }
174
+ * ```
175
+ *
176
+ * :::
130
177
  */
131
178
  /* eslint-enable jsdoc/require-description-complete-sentence */
132
179
  var _isInitialized = /*#__PURE__*/new WeakMap();
@@ -325,7 +372,7 @@ class AutoColumnSize extends _base.BasePlugin {
325
372
  if (firstVisibleColumn === -1 || lastVisibleColumn === -1) {
326
373
  return;
327
374
  }
328
- const overwriteCache = this.hot.renderCall;
375
+ const overwriteCache = this.hot.forceFullRender;
329
376
  this.calculateColumnsWidth({
330
377
  from: firstVisibleColumn,
331
378
  to: lastVisibleColumn
@@ -123,6 +123,53 @@ const COLUMN_SIZE_MAP_NAME = 'autoColumnSize';
123
123
  * }
124
124
  * ```
125
125
  * :::
126
+ *
127
+ * ::: only-for angular
128
+ *
129
+ * ```ts
130
+ * import { AfterViewInit, Component, ViewChild } from "@angular/core";
131
+ * import {
132
+ * GridSettings,
133
+ * HotTableModule,
134
+ * HotTableComponent,
135
+ * } from "@handsontable/angular-wrapper";
136
+ *
137
+ * `@Component`({
138
+ * selector: "app-example",
139
+ * standalone: true,
140
+ * imports: [HotTableModule],
141
+ * template: ` <div class="ht-theme-main">
142
+ * <hot-table [settings]="gridSettings" />
143
+ * </div>`,
144
+ * })
145
+ * export class ExampleComponent implements AfterViewInit {
146
+ * `@ViewChild`(HotTableComponent, { static: false })
147
+ * readonly hotTable!: HotTableComponent;
148
+ *
149
+ * readonly gridSettings = <GridSettings>{
150
+ * data: this.getData(),
151
+ * autoColumnSize: true,
152
+ * };
153
+ *
154
+ * ngAfterViewInit(): void {
155
+ * // Access to plugin instance:
156
+ * const hot = this.hotTable.hotInstance;
157
+ * const plugin = hot.getPlugin("autoColumnSize");
158
+ *
159
+ * plugin.getColumnWidth(4);
160
+ *
161
+ * if (plugin.isEnabled()) {
162
+ * // code...
163
+ * }
164
+ * }
165
+ *
166
+ * private getData(): any[] {
167
+ * //get some data
168
+ * }
169
+ * }
170
+ * ```
171
+ *
172
+ * :::
126
173
  */
127
174
  /* eslint-enable jsdoc/require-description-complete-sentence */
128
175
  var _isInitialized = /*#__PURE__*/new WeakMap();
@@ -321,7 +368,7 @@ export class AutoColumnSize extends BasePlugin {
321
368
  if (firstVisibleColumn === -1 || lastVisibleColumn === -1) {
322
369
  return;
323
370
  }
324
- const overwriteCache = this.hot.renderCall;
371
+ const overwriteCache = this.hot.forceFullRender;
325
372
  this.calculateColumnsWidth({
326
373
  from: firstVisibleColumn,
327
374
  to: lastVisibleColumn
@@ -110,6 +110,51 @@ const ROW_WIDTHS_MAP_NAME = 'autoRowSize';
110
110
  * }
111
111
  * ```
112
112
  * :::
113
+ *
114
+ * ::: only-for angular
115
+ * ```ts
116
+ * import { AfterViewInit, Component, ViewChild } from "@angular/core";
117
+ * import {
118
+ * GridSettings,
119
+ * HotTableModule,
120
+ * HotTableComponent,
121
+ * } from "@handsontable/angular-wrapper";
122
+ *
123
+ * `@Component`({
124
+ * selector: "app-example",
125
+ * standalone: true,
126
+ * imports: [HotTableModule],
127
+ * template: ` <div class="ht-theme-main">
128
+ * <hot-table [settings]="gridSettings" />
129
+ * </div>`,
130
+ * })
131
+ * export class ExampleComponent implements AfterViewInit {
132
+ * `@ViewChild`(HotTableComponent, { static: false })
133
+ * readonly hotTable!: HotTableComponent;
134
+ *
135
+ * readonly gridSettings = <GridSettings>{
136
+ * data: this.getData(),
137
+ * autoRowSize: true,
138
+ * };
139
+ *
140
+ * ngAfterViewInit(): void {
141
+ * // Access to plugin instance:
142
+ * const hot = this.hotTable.hotInstance;
143
+ * const plugin = hot.getPlugin("autoRowSize");
144
+ *
145
+ * plugin.getRowHeight(4);
146
+ *
147
+ * if (plugin.isEnabled()) {
148
+ * // code...
149
+ * }
150
+ * }
151
+ *
152
+ * private getData(): any[] {
153
+ * // get some data
154
+ * }
155
+ * }
156
+ * ```
157
+ * :::
113
158
  */
114
159
  /* eslint-enable jsdoc/require-description-complete-sentence */
115
160
  var _visualRowsToRefresh = /*#__PURE__*/new WeakMap();
@@ -304,7 +349,7 @@ class AutoRowSize extends _base.BasePlugin {
304
349
  if (firstVisibleRow === -1 || lastVisibleRow === -1) {
305
350
  return;
306
351
  }
307
- const overwriteCache = this.hot.renderCall;
352
+ const overwriteCache = this.hot.forceFullRender;
308
353
  this.calculateRowsHeight({
309
354
  from: firstVisibleRow,
310
355
  to: lastVisibleRow
@@ -405,11 +450,6 @@ class AutoRowSize extends _base.BasePlugin {
405
450
 
406
451
  // @TODO Should call once per render cycle, currently fired separately in different plugins
407
452
  this.hot.view.adjustElementsSize();
408
-
409
- // tmp
410
- if (this.hot.view._wt.wtOverlays.inlineStartOverlay.needFullRender) {
411
- this.hot.view._wt.wtOverlays.inlineStartOverlay.clone.draw();
412
- }
413
453
  }
414
454
  };
415
455
  const syncLimit = this.getSyncCalculationLimit();
@@ -106,6 +106,51 @@ const ROW_WIDTHS_MAP_NAME = 'autoRowSize';
106
106
  * }
107
107
  * ```
108
108
  * :::
109
+ *
110
+ * ::: only-for angular
111
+ * ```ts
112
+ * import { AfterViewInit, Component, ViewChild } from "@angular/core";
113
+ * import {
114
+ * GridSettings,
115
+ * HotTableModule,
116
+ * HotTableComponent,
117
+ * } from "@handsontable/angular-wrapper";
118
+ *
119
+ * `@Component`({
120
+ * selector: "app-example",
121
+ * standalone: true,
122
+ * imports: [HotTableModule],
123
+ * template: ` <div class="ht-theme-main">
124
+ * <hot-table [settings]="gridSettings" />
125
+ * </div>`,
126
+ * })
127
+ * export class ExampleComponent implements AfterViewInit {
128
+ * `@ViewChild`(HotTableComponent, { static: false })
129
+ * readonly hotTable!: HotTableComponent;
130
+ *
131
+ * readonly gridSettings = <GridSettings>{
132
+ * data: this.getData(),
133
+ * autoRowSize: true,
134
+ * };
135
+ *
136
+ * ngAfterViewInit(): void {
137
+ * // Access to plugin instance:
138
+ * const hot = this.hotTable.hotInstance;
139
+ * const plugin = hot.getPlugin("autoRowSize");
140
+ *
141
+ * plugin.getRowHeight(4);
142
+ *
143
+ * if (plugin.isEnabled()) {
144
+ * // code...
145
+ * }
146
+ * }
147
+ *
148
+ * private getData(): any[] {
149
+ * // get some data
150
+ * }
151
+ * }
152
+ * ```
153
+ * :::
109
154
  */
110
155
  /* eslint-enable jsdoc/require-description-complete-sentence */
111
156
  var _visualRowsToRefresh = /*#__PURE__*/new WeakMap();
@@ -300,7 +345,7 @@ export class AutoRowSize extends BasePlugin {
300
345
  if (firstVisibleRow === -1 || lastVisibleRow === -1) {
301
346
  return;
302
347
  }
303
- const overwriteCache = this.hot.renderCall;
348
+ const overwriteCache = this.hot.forceFullRender;
304
349
  this.calculateRowsHeight({
305
350
  from: firstVisibleRow,
306
351
  to: lastVisibleRow
@@ -401,11 +446,6 @@ export class AutoRowSize extends BasePlugin {
401
446
 
402
447
  // @TODO Should call once per render cycle, currently fired separately in different plugins
403
448
  this.hot.view.adjustElementsSize();
404
-
405
- // tmp
406
- if (this.hot.view._wt.wtOverlays.inlineStartOverlay.needFullRender) {
407
- this.hot.view._wt.wtOverlays.inlineStartOverlay.clone.draw();
408
- }
409
449
  }
410
450
  };
411
451
  const syncLimit = this.getSyncCalculationLimit();
@@ -48,6 +48,19 @@ const bindTypeToMapStrategy = new Map([['loose', _looseBindsMap.default], ['stri
48
48
  * />
49
49
  * ```
50
50
  * :::
51
+ *
52
+ * ::: only-for angular
53
+ * ```ts
54
+ * settings = {
55
+ * data: getData(),
56
+ * bindRowsWithHeaders: true,
57
+ * };
58
+ * ```
59
+ *
60
+ * ```html
61
+ * <hot-table [settings]="settings" />
62
+ * ```
63
+ * :::
51
64
  */
52
65
  var _BindRowsWithHeaders_brand = /*#__PURE__*/new WeakSet();
53
66
  class BindRowsWithHeaders extends _base.BasePlugin {
@@ -44,6 +44,19 @@ const bindTypeToMapStrategy = new Map([['loose', LooseBindsMap], ['strict', Stri
44
44
  * />
45
45
  * ```
46
46
  * :::
47
+ *
48
+ * ::: only-for angular
49
+ * ```ts
50
+ * settings = {
51
+ * data: getData(),
52
+ * bindRowsWithHeaders: true,
53
+ * };
54
+ * ```
55
+ *
56
+ * ```html
57
+ * <hot-table [settings]="settings" />
58
+ * ```
59
+ * :::
47
60
  */
48
61
  var _BindRowsWithHeaders_brand = /*#__PURE__*/new WeakSet();
49
62
  export class BindRowsWithHeaders extends BasePlugin {
@@ -105,6 +105,37 @@ const actionDictionary = new Map([['collapse', {
105
105
  * />
106
106
  * ```
107
107
  * :::
108
+ *
109
+ * ::: only-for angular
110
+ * ```ts
111
+ * // Enable the collapsibleColumns plugin
112
+ * settings = {
113
+ * data: generateDataObj(),
114
+ * colHeaders: true,
115
+ * rowHeaders: true,
116
+ * nestedHeaders: true,
117
+ * // enable plugin
118
+ * collapsibleColumns: true,
119
+ * };
120
+ *
121
+ * // Or enable and configure specific collapsible columns
122
+ * settings = {
123
+ * data: generateDataObj(),
124
+ * colHeaders: true,
125
+ * rowHeaders: true,
126
+ * nestedHeaders: true,
127
+ * // enable and configure which columns can be collapsed
128
+ * collapsibleColumns: [
129
+ * { row: -4, col: 1, collapsible: true },
130
+ * { row: -3, col: 5, collapsible: true },
131
+ * ],
132
+ * };
133
+ * ```
134
+ *
135
+ * ```html
136
+ * <hot-table [settings]="settings"></hot-table>
137
+ * ```
138
+ * :::
108
139
  */
109
140
  var _collapsedColumnsMap = /*#__PURE__*/new WeakMap();
110
141
  var _CollapsibleColumns_brand = /*#__PURE__*/new WeakSet();