handsontable 16.2.0-next-90d1117-20251117 → 16.2.0-next-bf17104-20251120

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 (41) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/base.js +2 -2
  3. package/base.mjs +2 -2
  4. package/dist/handsontable.css +3 -2
  5. package/dist/handsontable.full.css +3 -2
  6. package/dist/handsontable.full.js +17 -30
  7. package/dist/handsontable.full.min.css +3 -3
  8. package/dist/handsontable.full.min.js +5 -5
  9. package/dist/handsontable.js +17 -30
  10. package/dist/handsontable.min.css +3 -3
  11. package/dist/handsontable.min.js +5 -5
  12. package/editors/autocompleteEditor/autocompleteEditor.d.ts +9 -2
  13. package/editors/autocompleteEditor/autocompleteEditor.js +0 -1
  14. package/editors/autocompleteEditor/autocompleteEditor.mjs +0 -1
  15. package/helpers/mixed.js +2 -2
  16. package/helpers/mixed.mjs +2 -2
  17. package/package.json +1 -1
  18. package/plugins/columnSummary/columnSummary.js +2 -2
  19. package/plugins/columnSummary/columnSummary.mjs +2 -2
  20. package/plugins/emptyDataState/ui.js +4 -1
  21. package/plugins/emptyDataState/ui.mjs +4 -1
  22. package/plugins/undoRedo/undoRedo.js +5 -20
  23. package/plugins/undoRedo/undoRedo.mjs +5 -20
  24. package/styles/handsontable.css +3 -3
  25. package/styles/handsontable.min.css +3 -3
  26. package/styles/ht-icons-horizon.css +2 -2
  27. package/styles/ht-icons-horizon.min.css +2 -2
  28. package/styles/ht-icons-main.css +2 -2
  29. package/styles/ht-icons-main.min.css +2 -2
  30. package/styles/ht-theme-classic-no-icons.css +6 -6
  31. package/styles/ht-theme-classic-no-icons.min.css +3 -3
  32. package/styles/ht-theme-classic.css +6 -6
  33. package/styles/ht-theme-classic.min.css +3 -3
  34. package/styles/ht-theme-horizon-no-icons.css +8 -8
  35. package/styles/ht-theme-horizon-no-icons.min.css +3 -3
  36. package/styles/ht-theme-horizon.css +8 -8
  37. package/styles/ht-theme-horizon.min.css +3 -3
  38. package/styles/ht-theme-main-no-icons.css +2 -2
  39. package/styles/ht-theme-main-no-icons.min.css +2 -2
  40. package/styles/ht-theme-main.css +2 -2
  41. package/styles/ht-theme-main.min.css +2 -2
@@ -3,14 +3,21 @@ import { HandsontableEditor } from '../handsontableEditor';
3
3
 
4
4
  export const EDITOR_TYPE: 'autocomplete';
5
5
 
6
+ type ChoiceObject = {
7
+ key: any;
8
+ value: any;
9
+ };
10
+ type ChoiceArray = (string | number)[] | ChoiceObject[];
11
+
6
12
  export class AutocompleteEditor extends HandsontableEditor {
7
13
  constructor(instance: Core);
8
14
 
9
15
  query: string;
10
- strippedChoices: string[];
11
- rawChoices: string[];
16
+ strippedChoices: ChoiceArray;
17
+ rawChoices: ChoiceArray;
12
18
 
13
19
  queryChoices(query: string): void;
20
+ updateChoicesList(choicesList: ChoiceArray): void;
14
21
  }
15
22
  export namespace AutocompleteEditor {
16
23
  export function sortByRelevance(value: any, choices: string[], caseSensitive: boolean): number[];
@@ -267,7 +267,6 @@ class AutocompleteEditor extends _handsontableEditor.HandsontableEditor {
267
267
  /**
268
268
  * Updates list of the possible completions to choose.
269
269
  *
270
- * @private
271
270
  * @param {Array} choicesList The choices list to process.
272
271
  */
273
272
  updateChoicesList(choicesList) {
@@ -264,7 +264,6 @@ export class AutocompleteEditor extends HandsontableEditor {
264
264
  /**
265
265
  * Updates list of the possible completions to choose.
266
266
  *
267
- * @private
268
267
  * @param {Array} choicesList The choices list to process.
269
268
  */
270
269
  updateChoicesList(choicesList) {
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 = "16.2.0-next-90d1117-20251117";
137
+ const hotVersion = "16.2.0-next-bf17104-20251120";
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/11/2025", 'DD/MM/YYYY');
145
+ const releaseDate = (0, _moment.default)("25/11/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 = "16.2.0-next-90d1117-20251117";
127
+ const hotVersion = "16.2.0-next-bf17104-20251120";
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/11/2025", 'DD/MM/YYYY');
135
+ const releaseDate = moment("25/11/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/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": "16.2.0-next-90d1117-20251117",
13
+ "version": "16.2.0-next-bf17104-20251120",
14
14
  "main": "index",
15
15
  "module": "index.mjs",
16
16
  "jsnext:main": "index.mjs",
@@ -39,9 +39,9 @@ const PLUGIN_PRIORITY = exports.PLUGIN_PRIORITY = 220;
39
39
  * | `destinationRow` | Yes | Number | - | [Sets the destination cell's row coordinate](@/guides/columns/column-summary/column-summary.md#step-4-provide-the-destination-cell-s-coordinates) |
40
40
  * | `destinationColumn` | Yes | Number | - | [Sets the destination cell's column coordinate](@/guides/columns/column-summary/column-summary.md#step-4-provide-the-destination-cell-s-coordinates) |
41
41
  * | `forceNumeric` | No | Boolean | `false` | [Forces the summary to treat non-numerics as numerics](@/guides/columns/column-summary/column-summary.md#force-numeric-values) |
42
- * | `reversedRowCoords` | No | Boolean | `false` | [Reverses row coordinates](@/guides/columns/column-summary/column-summary.md#step-5-make-room-for-the-destination-cell) |
42
+ * | `reversedRowCoords` | No | Boolean | `false` | [Reverses the row coordinate, count row coordinates backward](@/guides/columns/column-summary/column-summary.md#step-5-make-room-for-the-destination-cell). Useful when displaying summary results at the bottom of the grid, as it allows you to reference rows relative to the last row (e.g., `destinationRow: 0` refers to the last row when this option is enabled) |
43
43
  * | `suppressDataTypeErrors` | No | Boolean | `true` | [Suppresses data type errors](@/guides/columns/column-summary/column-summary.md#throw-data-type-errors) |
44
- * | `readOnly` | No | Boolean | `true` | Makes summary cell read-only |
44
+ * | `readOnly` | No | Boolean | `true` | Makes summary cell [read-only](@/api/options.md#readonly) |
45
45
  * | `roundFloat` | No | Number/<br>Boolean | - | [Rounds summary result](@/guides/columns/column-summary/column-summary.md#round-a-column-summary-result) |
46
46
  * | `customFunction` | No | Function | - | [Lets you add a custom summary function](@/guides/columns/column-summary/column-summary.md#implement-a-custom-summary-function) |
47
47
  *
@@ -35,9 +35,9 @@ export const PLUGIN_PRIORITY = 220;
35
35
  * | `destinationRow` | Yes | Number | - | [Sets the destination cell's row coordinate](@/guides/columns/column-summary/column-summary.md#step-4-provide-the-destination-cell-s-coordinates) |
36
36
  * | `destinationColumn` | Yes | Number | - | [Sets the destination cell's column coordinate](@/guides/columns/column-summary/column-summary.md#step-4-provide-the-destination-cell-s-coordinates) |
37
37
  * | `forceNumeric` | No | Boolean | `false` | [Forces the summary to treat non-numerics as numerics](@/guides/columns/column-summary/column-summary.md#force-numeric-values) |
38
- * | `reversedRowCoords` | No | Boolean | `false` | [Reverses row coordinates](@/guides/columns/column-summary/column-summary.md#step-5-make-room-for-the-destination-cell) |
38
+ * | `reversedRowCoords` | No | Boolean | `false` | [Reverses the row coordinate, count row coordinates backward](@/guides/columns/column-summary/column-summary.md#step-5-make-room-for-the-destination-cell). Useful when displaying summary results at the bottom of the grid, as it allows you to reference rows relative to the last row (e.g., `destinationRow: 0` refers to the last row when this option is enabled) |
39
39
  * | `suppressDataTypeErrors` | No | Boolean | `true` | [Suppresses data type errors](@/guides/columns/column-summary/column-summary.md#throw-data-type-errors) |
40
- * | `readOnly` | No | Boolean | `true` | Makes summary cell read-only |
40
+ * | `readOnly` | No | Boolean | `true` | Makes summary cell [read-only](@/api/options.md#readonly) |
41
41
  * | `roundFloat` | No | Number/<br>Boolean | - | [Rounds summary result](@/guides/columns/column-summary/column-summary.md#round-a-column-summary-result) |
42
42
  * | `customFunction` | No | Function | - | [Lets you add a custom summary function](@/guides/columns/column-summary/column-summary.md#implement-a-custom-summary-function) |
43
43
  *
@@ -227,6 +227,7 @@ class EmptyDataStateUI {
227
227
  const scrollbarSize = view.hasHorizontalScroll() ? (0, _element.getScrollbarWidth)(view.hot.rootDocument) : 0;
228
228
  const rows = view.countRenderableRows();
229
229
  const cols = view.countRenderableColumns();
230
+ const headerCols = view.getColumnHeadersCount();
230
231
  emptyDataStateElement.style.top = cols > 0 ? `${view.getColumnHeaderHeight()}px` : '0px';
231
232
  emptyDataStateElement.style.insetInlineStart = rows > 0 ? `${view.getRowHeaderWidth()}px` : '0px';
232
233
  if (rows === 0) {
@@ -261,8 +262,10 @@ class EmptyDataStateUI {
261
262
  } else {
262
263
  height = view.hot.getTableHeight();
263
264
  }
264
- } else if (rows === 0) {
265
+ } else if (headerCols > 0 && cols > 0) {
265
266
  height = view.getViewportHeight() - scrollbarSize;
267
+ } else if (headerCols > 0 && cols === 0) {
268
+ height = view.getWorkspaceHeight() - scrollbarSize;
266
269
  }
267
270
  emptyDataStateElement.style.width = `${width}px`;
268
271
  emptyDataStateElement.style.height = `${height}px`;
@@ -224,6 +224,7 @@ export class EmptyDataStateUI {
224
224
  const scrollbarSize = view.hasHorizontalScroll() ? getScrollbarWidth(view.hot.rootDocument) : 0;
225
225
  const rows = view.countRenderableRows();
226
226
  const cols = view.countRenderableColumns();
227
+ const headerCols = view.getColumnHeadersCount();
227
228
  emptyDataStateElement.style.top = cols > 0 ? `${view.getColumnHeaderHeight()}px` : '0px';
228
229
  emptyDataStateElement.style.insetInlineStart = rows > 0 ? `${view.getRowHeaderWidth()}px` : '0px';
229
230
  if (rows === 0) {
@@ -258,8 +259,10 @@ export class EmptyDataStateUI {
258
259
  } else {
259
260
  height = view.hot.getTableHeight();
260
261
  }
261
- } else if (rows === 0) {
262
+ } else if (headerCols > 0 && cols > 0) {
262
263
  height = view.getViewportHeight() - scrollbarSize;
264
+ } else if (headerCols > 0 && cols === 0) {
265
+ height = view.getWorkspaceHeight() - scrollbarSize;
263
266
  }
264
267
  emptyDataStateElement.style.width = `${width}px`;
265
268
  emptyDataStateElement.style.height = `${height}px`;
@@ -322,11 +322,8 @@ function _exposeAPIToCore() {
322
322
  };
323
323
 
324
324
  /**
325
- * ::: warning
326
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#undo-2) plugin.
327
- * :::
328
- *
329
325
  * @alias undo
326
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#undo-2) plugin.
330
327
  * @memberof! Core#
331
328
  */
332
329
  this.hot.undo = () => {
@@ -334,11 +331,8 @@ function _exposeAPIToCore() {
334
331
  this.undo();
335
332
  };
336
333
  /**
337
- * ::: warning
338
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#redo) plugin.
339
- * :::
340
- *
341
334
  * @alias redo
335
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#redo) plugin.
342
336
  * @memberof! Core#
343
337
  */
344
338
  this.hot.redo = () => {
@@ -346,11 +340,8 @@ function _exposeAPIToCore() {
346
340
  this.redo();
347
341
  };
348
342
  /**
349
- * ::: warning
350
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isundoavailable) plugin.
351
- * :::
352
- *
353
343
  * @alias isUndoAvailable
344
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isundoavailable) plugin.
354
345
  * @memberof! Core#
355
346
  * @returns {boolean}
356
347
  */
@@ -359,11 +350,8 @@ function _exposeAPIToCore() {
359
350
  return this.isUndoAvailable();
360
351
  };
361
352
  /**
362
- * ::: warning
363
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isredoavailable) plugin.
364
- * :::
365
- *
366
353
  * @alias isRedoAvailable
354
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isredoavailable) plugin.
367
355
  * @memberof! Core#
368
356
  * @returns {boolean}
369
357
  */
@@ -372,11 +360,8 @@ function _exposeAPIToCore() {
372
360
  return this.isRedoAvailable();
373
361
  };
374
362
  /**
375
- * ::: warning
376
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#clear) plugin.
377
- * :::
378
- *
379
363
  * @alias clearUndo
364
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#clear) plugin.
380
365
  * @memberof! Core#
381
366
  */
382
367
  this.hot.clearUndo = () => {
@@ -319,11 +319,8 @@ function _exposeAPIToCore() {
319
319
  };
320
320
 
321
321
  /**
322
- * ::: warning
323
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#undo-2) plugin.
324
- * :::
325
- *
326
322
  * @alias undo
323
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#undo-2) plugin.
327
324
  * @memberof! Core#
328
325
  */
329
326
  this.hot.undo = () => {
@@ -331,11 +328,8 @@ function _exposeAPIToCore() {
331
328
  this.undo();
332
329
  };
333
330
  /**
334
- * ::: warning
335
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#redo) plugin.
336
- * :::
337
- *
338
331
  * @alias redo
332
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#redo) plugin.
339
333
  * @memberof! Core#
340
334
  */
341
335
  this.hot.redo = () => {
@@ -343,11 +337,8 @@ function _exposeAPIToCore() {
343
337
  this.redo();
344
338
  };
345
339
  /**
346
- * ::: warning
347
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isundoavailable) plugin.
348
- * :::
349
- *
350
340
  * @alias isUndoAvailable
341
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isundoavailable) plugin.
351
342
  * @memberof! Core#
352
343
  * @returns {boolean}
353
344
  */
@@ -356,11 +347,8 @@ function _exposeAPIToCore() {
356
347
  return this.isUndoAvailable();
357
348
  };
358
349
  /**
359
- * ::: warning
360
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isredoavailable) plugin.
361
- * :::
362
- *
363
350
  * @alias isRedoAvailable
351
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#isredoavailable) plugin.
364
352
  * @memberof! Core#
365
353
  * @returns {boolean}
366
354
  */
@@ -369,11 +357,8 @@ function _exposeAPIToCore() {
369
357
  return this.isRedoAvailable();
370
358
  };
371
359
  /**
372
- * ::: warning
373
- * This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#clear) plugin.
374
- * :::
375
- *
376
360
  * @alias clearUndo
361
+ * @deprecated This method is deprecated and it will be removed from the Core API in the future. Please use the method from the [`UndoRedo`](@/api/undoRedo.md#clear) plugin.
377
362
  * @memberof! Core#
378
363
  */
379
364
  this.hot.clearUndo = () => {
@@ -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: 16.2.0-next-90d1117-20251117
29
- * Release date: 20/11/2025 (built at 17/11/2025 11:48:52)
28
+ * Version: 16.2.0-next-bf17104-20251120
29
+ * Release date: 25/11/2025 (built at 20/11/2025 13:06:28)
30
30
  */
31
31
  .htBorders .wtBorder.ht-border-style-dashed-vertical {
32
32
  background-image: repeating-linear-gradient(to bottom, var(--ht-custom-border-color) 0 5px, transparent 0 10px);
@@ -275,7 +275,7 @@
275
275
  }
276
276
  .handsontable tbody tr th .relative {
277
277
  padding: var(--ht-cell-vertical-padding) var(--ht-cell-horizontal-padding);
278
- height: 100%;
278
+ min-height: 100%;
279
279
  }
280
280
  .handsontable tbody tr td:first-child {
281
281
  border-inline-start-color: var(--ht-border-color);