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.
- package/3rdparty/walkontable/src/cell/range.js +14 -0
- package/3rdparty/walkontable/src/cell/range.mjs +14 -0
- package/3rdparty/walkontable/src/renderer/rowHeaders.js +4 -1
- package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +4 -1
- package/3rdparty/walkontable/src/selection/border/border.js +5 -0
- package/3rdparty/walkontable/src/selection/border/border.mjs +5 -0
- package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +3 -4
- package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +3 -4
- package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +8 -10
- package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +8 -10
- package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +3 -4
- package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +3 -4
- package/3rdparty/walkontable/src/table.js +5 -2
- package/3rdparty/walkontable/src/table.mjs +5 -2
- package/CHANGELOG.md +39 -0
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/core/focusCatcher/focusDetector.js +1 -1
- package/core/focusCatcher/focusDetector.mjs +2 -2
- package/core/hooks/constants.js +266 -0
- package/core/hooks/constants.mjs +266 -0
- package/core/hooks/index.d.ts +1 -0
- package/core.d.ts +0 -1
- package/core.js +71 -25
- package/core.mjs +72 -26
- package/dataMap/dataMap.js +0 -7
- package/dataMap/dataMap.mjs +0 -7
- package/dataMap/metaManager/metaSchema.js +28 -0
- package/dataMap/metaManager/metaSchema.mjs +28 -0
- package/dist/handsontable.css +3 -3
- package/dist/handsontable.full.css +3 -3
- package/dist/handsontable.full.js +1375 -350
- package/dist/handsontable.full.min.css +3 -3
- package/dist/handsontable.full.min.js +17 -17
- package/dist/handsontable.js +1375 -350
- package/dist/handsontable.min.css +3 -3
- package/dist/handsontable.min.js +18 -18
- package/editorManager.js +1 -7
- package/editorManager.mjs +1 -7
- package/editors/autocompleteEditor/autocompleteEditor.js +14 -4
- package/editors/autocompleteEditor/autocompleteEditor.mjs +14 -4
- package/editors/textEditor/textEditor.js +1 -1
- package/editors/textEditor/textEditor.mjs +2 -2
- package/helpers/browser.js +1 -1
- package/helpers/browser.mjs +1 -1
- package/helpers/dom/element.js +2 -2
- package/helpers/dom/element.mjs +1 -1
- package/helpers/mixed.js +2 -2
- package/helpers/mixed.mjs +2 -2
- package/helpers/object.js +3 -0
- package/helpers/object.mjs +3 -0
- package/package.json +1 -1
- package/plugins/autoColumnSize/autoColumnSize.js +48 -1
- package/plugins/autoColumnSize/autoColumnSize.mjs +48 -1
- package/plugins/autoRowSize/autoRowSize.js +46 -6
- package/plugins/autoRowSize/autoRowSize.mjs +46 -6
- package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +13 -0
- package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +13 -0
- package/plugins/collapsibleColumns/collapsibleColumns.js +31 -0
- package/plugins/collapsibleColumns/collapsibleColumns.mjs +31 -0
- package/plugins/columnSorting/columnSorting.js +0 -4
- package/plugins/columnSorting/columnSorting.mjs +0 -4
- package/plugins/columnSummary/columnSummary.js +33 -0
- package/plugins/columnSummary/columnSummary.mjs +33 -0
- package/plugins/comments/comments.js +54 -0
- package/plugins/comments/comments.mjs +54 -0
- package/plugins/contextMenu/menu/defaultShortcutsList.js +2 -2
- package/plugins/contextMenu/menu/defaultShortcutsList.mjs +2 -2
- package/plugins/contextMenu/menu/menu.js +1 -0
- package/plugins/contextMenu/menu/menu.mjs +1 -0
- package/plugins/contextMenu/menu/positioner.js +10 -2
- package/plugins/contextMenu/menu/positioner.mjs +10 -2
- package/plugins/copyPaste/copyPaste.js +12 -15
- package/plugins/copyPaste/copyPaste.mjs +13 -16
- package/plugins/copyPaste/pasteEvent.js +3 -0
- package/plugins/copyPaste/pasteEvent.mjs +3 -0
- package/plugins/dropdownMenu/dropdownMenu.js +15 -0
- package/plugins/dropdownMenu/dropdownMenu.mjs +15 -0
- package/plugins/exportFile/exportFile.js +58 -0
- package/plugins/exportFile/exportFile.mjs +58 -0
- package/plugins/filters/filters.js +99 -24
- package/plugins/filters/filters.mjs +99 -24
- package/plugins/filters/ui/multipleSelect.js +7 -1
- package/plugins/filters/ui/multipleSelect.mjs +7 -1
- package/plugins/hiddenColumns/hiddenColumns.js +65 -1
- package/plugins/hiddenColumns/hiddenColumns.mjs +65 -1
- package/plugins/hiddenRows/hiddenRows.js +65 -1
- package/plugins/hiddenRows/hiddenRows.mjs +65 -1
- package/plugins/manualColumnResize/manualColumnResize.js +4 -6
- package/plugins/manualColumnResize/manualColumnResize.mjs +4 -6
- package/plugins/manualRowResize/manualRowResize.js +4 -6
- package/plugins/manualRowResize/manualRowResize.mjs +4 -6
- package/plugins/mergeCells/mergeCells.js +26 -29
- package/plugins/mergeCells/mergeCells.mjs +26 -29
- package/plugins/mergeCells/renderer.js +15 -0
- package/plugins/mergeCells/renderer.mjs +15 -0
- package/plugins/mergeCells/utils.js +31 -0
- package/plugins/mergeCells/utils.mjs +27 -0
- package/plugins/nestedHeaders/nestedHeaders.js +25 -0
- package/plugins/nestedHeaders/nestedHeaders.mjs +25 -0
- package/plugins/nestedRows/data/dataManager.js +2 -2
- package/plugins/nestedRows/data/dataManager.mjs +2 -2
- package/plugins/stretchColumns/stretchColumns.js +13 -0
- package/plugins/stretchColumns/stretchColumns.mjs +13 -0
- package/plugins/trimRows/trimRows.js +61 -0
- package/plugins/trimRows/trimRows.mjs +61 -0
- package/plugins/undoRedo/actions/removeColumn.js +19 -14
- package/plugins/undoRedo/actions/removeColumn.mjs +19 -14
- package/plugins/undoRedo/actions/removeRow.js +12 -4
- package/plugins/undoRedo/actions/removeRow.mjs +12 -4
- package/selection/selection.js +3 -1
- package/selection/selection.mjs +3 -1
- package/styles/handsontable.css +14 -15
- package/styles/handsontable.min.css +3 -3
- package/styles/ht-theme-horizon.css +2 -2
- package/styles/ht-theme-horizon.min.css +2 -2
- package/styles/ht-theme-main.css +2 -2
- package/styles/ht-theme-main.min.css +2 -2
- package/tableView.js +5 -8
- package/tableView.mjs +5 -8
- package/utils/ghostTable.js +3 -0
- 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((
|
|
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.
|
|
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((
|
|
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.
|
|
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.
|
|
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,
|
|
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 (
|
|
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();
|
package/helpers/browser.js
CHANGED
|
@@ -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(
|
|
44
|
+
ios: tester(platform => /iPhone|iPad|iPod/i.test(platform))
|
|
45
45
|
};
|
|
46
46
|
|
|
47
47
|
/**
|
package/helpers/browser.mjs
CHANGED
|
@@ -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(
|
|
26
|
+
ios: tester(platform => /iPhone|iPad|iPod/i.test(platform))
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
/**
|
package/helpers/dom/element.js
CHANGED
|
@@ -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
|
|
103
|
+
function isInternalElement(element, thisHotContainer) {
|
|
104
104
|
const closestHandsontableContainer = element.closest('.handsontable');
|
|
105
105
|
return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
|
|
106
106
|
}
|
package/helpers/dom/element.mjs
CHANGED
|
@@ -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
|
|
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-
|
|
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)("
|
|
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-
|
|
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("
|
|
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) => {
|
package/helpers/object.mjs
CHANGED
|
@@ -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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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();
|