handsontable 0.0.0-next-d7edb4b-20240927 → 0.0.0-next-f512acf-20240930

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (47) hide show
  1. package/base.js +2 -2
  2. package/base.mjs +2 -2
  3. package/core.js +11 -0
  4. package/core.mjs +11 -0
  5. package/dataMap/metaManager/metaSchema.js +17 -0
  6. package/dataMap/metaManager/metaSchema.mjs +17 -0
  7. package/dist/handsontable.css +296 -145
  8. package/dist/handsontable.full.css +305 -152
  9. package/dist/handsontable.full.js +3610 -3723
  10. package/dist/handsontable.full.min.css +85 -14
  11. package/dist/handsontable.full.min.js +48 -48
  12. package/dist/handsontable.js +3317 -3424
  13. package/dist/handsontable.min.css +82 -11
  14. package/dist/handsontable.min.js +24 -24
  15. package/editors/dateEditor/dateEditor.js +2 -0
  16. package/editors/dateEditor/dateEditor.mjs +2 -0
  17. package/editors/handsontableEditor/handsontableEditor.js +1 -1
  18. package/editors/handsontableEditor/handsontableEditor.mjs +1 -1
  19. package/editors/selectEditor/selectEditor.js +20 -9
  20. package/editors/selectEditor/selectEditor.mjs +20 -9
  21. package/editors/textEditor/textEditor.js +4 -11
  22. package/editors/textEditor/textEditor.mjs +4 -11
  23. package/helpers/mixed.js +2 -2
  24. package/helpers/mixed.mjs +2 -2
  25. package/helpers/themes.js +17 -0
  26. package/helpers/themes.mjs +13 -0
  27. package/package.json +10 -3
  28. package/plugins/comments/commentEditor.js +8 -1
  29. package/plugins/comments/commentEditor.mjs +8 -1
  30. package/plugins/comments/comments.js +1 -1
  31. package/plugins/comments/comments.mjs +1 -1
  32. package/plugins/contextMenu/menu/menu.js +4 -4
  33. package/plugins/contextMenu/menu/menu.mjs +4 -4
  34. package/plugins/contextMenu/menu/shortcuts.js +1 -1
  35. package/plugins/contextMenu/menu/shortcuts.mjs +1 -1
  36. package/plugins/filters/filters.js +37 -13
  37. package/plugins/filters/filters.mjs +37 -13
  38. package/plugins/filters/menu/focusController.js +36 -14
  39. package/plugins/filters/menu/focusController.mjs +36 -14
  40. package/styles/handsontable.css +1921 -0
  41. package/styles/handsontable.min.css +30 -0
  42. package/styles/ht-theme-gemini.css +689 -0
  43. package/styles/ht-theme-gemini.min.css +30 -0
  44. package/styles/ht-theme-main.css +697 -0
  45. package/styles/ht-theme-main.min.css +30 -0
  46. package/utils/ghostTable.js +1 -1
  47. package/utils/ghostTable.mjs +1 -1
@@ -66,7 +66,9 @@ class DateEditor extends _textEditor.TextEditor {
66
66
  this.datePickerStyle.left = 0;
67
67
  this.datePickerStyle.zIndex = 9999;
68
68
  this.datePicker.setAttribute('dir', this.hot.isRtl() ? 'rtl' : 'ltr');
69
+ const themeClassName = this.hot.getSettings().themeName;
69
70
  (0, _element.addClass)(this.datePicker, 'htDatepickerHolder');
71
+ (0, _element.addClass)(this.datePicker, themeClassName);
70
72
  this.hot.rootDocument.body.appendChild(this.datePicker);
71
73
 
72
74
  /**
@@ -62,7 +62,9 @@ export class DateEditor extends TextEditor {
62
62
  this.datePickerStyle.left = 0;
63
63
  this.datePickerStyle.zIndex = 9999;
64
64
  this.datePicker.setAttribute('dir', this.hot.isRtl() ? 'rtl' : 'ltr');
65
+ const themeClassName = this.hot.getSettings().themeName;
65
66
  addClass(this.datePicker, 'htDatepickerHolder');
67
+ addClass(this.datePicker, themeClassName);
66
68
  this.hot.rootDocument.body.appendChild(this.datePicker);
67
69
 
68
70
  /**
@@ -158,7 +158,7 @@ class HandsontableEditor extends _textEditor.TextEditor {
158
158
  * @returns {number}
159
159
  */
160
160
  getHeight() {
161
- return this.htEditor.view.getTableHeight();
161
+ return this.htEditor.view.getTableHeight() + 1;
162
162
  }
163
163
 
164
164
  /**
@@ -155,7 +155,7 @@ export class HandsontableEditor extends TextEditor {
155
155
  * @returns {number}
156
156
  */
157
157
  getHeight() {
158
- return this.htEditor.view.getTableHeight();
158
+ return this.htEditor.view.getTableHeight() + 1;
159
159
  }
160
160
 
161
161
  /**
@@ -4,6 +4,7 @@ exports.__esModule = true;
4
4
  var _baseEditor = require("../baseEditor");
5
5
  var _element = require("../../helpers/dom/element");
6
6
  var _object = require("../../helpers/object");
7
+ var _a11y = require("../../helpers/a11y");
7
8
  const EDITOR_VISIBLE_CLASS_NAME = 'ht_editor_visible';
8
9
  const SHORTCUTS_GROUP = 'selectEditor';
9
10
  const EDITOR_TYPE = exports.EDITOR_TYPE = 'select';
@@ -21,11 +22,21 @@ class SelectEditor extends _baseEditor.BaseEditor {
21
22
  * Initializes editor instance, DOM Element and mount hooks.
22
23
  */
23
24
  init() {
25
+ this.selectWrapper = this.hot.rootDocument.createElement('div');
24
26
  this.select = this.hot.rootDocument.createElement('select');
25
27
  this.select.setAttribute('data-hot-input', 'true');
26
- this.select.style.display = 'none';
27
- (0, _element.addClass)(this.select, 'htSelectEditor');
28
- this.hot.rootElement.appendChild(this.select);
28
+ this.selectWrapper.style.display = 'none';
29
+ const ARROW = this.hot.rootDocument.createElement('DIV');
30
+ const isAriaEnabled = this.hot.getSettings().ariaTags;
31
+ ARROW.className = 'htAutocompleteArrow';
32
+ if (isAriaEnabled) {
33
+ ARROW.setAttribute(...(0, _a11y.A11Y_HIDDEN)());
34
+ }
35
+ ARROW.appendChild(this.hot.rootDocument.createTextNode(String.fromCharCode(9660)));
36
+ (0, _element.addClass)(this.selectWrapper, 'htSelectEditor');
37
+ this.selectWrapper.appendChild(this.select);
38
+ this.selectWrapper.insertBefore(ARROW, this.selectWrapper.firstChild);
39
+ this.hot.rootElement.appendChild(this.selectWrapper);
29
40
  this.registerHooks();
30
41
  }
31
42
 
@@ -53,7 +64,7 @@ class SelectEditor extends _baseEditor.BaseEditor {
53
64
  open() {
54
65
  this._opened = true;
55
66
  this.refreshDimensions();
56
- this.select.style.display = '';
67
+ this.selectWrapper.style.display = '';
57
68
  const shortcutManager = this.hot.getShortcutManager();
58
69
  shortcutManager.setActiveContextName('editor');
59
70
  this.registerShortcuts();
@@ -64,9 +75,9 @@ class SelectEditor extends _baseEditor.BaseEditor {
64
75
  */
65
76
  close() {
66
77
  this._opened = false;
67
- this.select.style.display = 'none';
68
- if ((0, _element.hasClass)(this.select, EDITOR_VISIBLE_CLASS_NAME)) {
69
- (0, _element.removeClass)(this.select, EDITOR_VISIBLE_CLASS_NAME);
78
+ this.selectWrapper.style.display = 'none';
79
+ if ((0, _element.hasClass)(this.selectWrapper, EDITOR_VISIBLE_CLASS_NAME)) {
80
+ (0, _element.removeClass)(this.selectWrapper, EDITOR_VISIBLE_CLASS_NAME);
70
81
  }
71
82
  this.unregisterShortcuts();
72
83
  this.clearHooks();
@@ -172,13 +183,13 @@ class SelectEditor extends _baseEditor.BaseEditor {
172
183
  width,
173
184
  height
174
185
  } = this.getEditedCellRect();
175
- const selectStyle = this.select.style;
186
+ const selectStyle = this.selectWrapper.style;
176
187
  selectStyle.height = `${height}px`;
177
188
  selectStyle.width = `${width}px`;
178
189
  selectStyle.top = `${top}px`;
179
190
  selectStyle[this.hot.isRtl() ? 'right' : 'left'] = `${start}px`;
180
191
  selectStyle.margin = '0px';
181
- (0, _element.addClass)(this.select, EDITOR_VISIBLE_CLASS_NAME);
192
+ (0, _element.addClass)(this.selectWrapper, EDITOR_VISIBLE_CLASS_NAME);
182
193
  }
183
194
 
184
195
  /**
@@ -1,6 +1,7 @@
1
1
  import { BaseEditor, EDITOR_STATE } from "../baseEditor/index.mjs";
2
2
  import { addClass, empty, fastInnerHTML, hasClass, removeClass } from "../../helpers/dom/element.mjs";
3
3
  import { objectEach } from "../../helpers/object.mjs";
4
+ import { A11Y_HIDDEN } from "../../helpers/a11y.mjs";
4
5
  const EDITOR_VISIBLE_CLASS_NAME = 'ht_editor_visible';
5
6
  const SHORTCUTS_GROUP = 'selectEditor';
6
7
  export const EDITOR_TYPE = 'select';
@@ -18,11 +19,21 @@ export class SelectEditor extends BaseEditor {
18
19
  * Initializes editor instance, DOM Element and mount hooks.
19
20
  */
20
21
  init() {
22
+ this.selectWrapper = this.hot.rootDocument.createElement('div');
21
23
  this.select = this.hot.rootDocument.createElement('select');
22
24
  this.select.setAttribute('data-hot-input', 'true');
23
- this.select.style.display = 'none';
24
- addClass(this.select, 'htSelectEditor');
25
- this.hot.rootElement.appendChild(this.select);
25
+ this.selectWrapper.style.display = 'none';
26
+ const ARROW = this.hot.rootDocument.createElement('DIV');
27
+ const isAriaEnabled = this.hot.getSettings().ariaTags;
28
+ ARROW.className = 'htAutocompleteArrow';
29
+ if (isAriaEnabled) {
30
+ ARROW.setAttribute(...A11Y_HIDDEN());
31
+ }
32
+ ARROW.appendChild(this.hot.rootDocument.createTextNode(String.fromCharCode(9660)));
33
+ addClass(this.selectWrapper, 'htSelectEditor');
34
+ this.selectWrapper.appendChild(this.select);
35
+ this.selectWrapper.insertBefore(ARROW, this.selectWrapper.firstChild);
36
+ this.hot.rootElement.appendChild(this.selectWrapper);
26
37
  this.registerHooks();
27
38
  }
28
39
 
@@ -50,7 +61,7 @@ export class SelectEditor extends BaseEditor {
50
61
  open() {
51
62
  this._opened = true;
52
63
  this.refreshDimensions();
53
- this.select.style.display = '';
64
+ this.selectWrapper.style.display = '';
54
65
  const shortcutManager = this.hot.getShortcutManager();
55
66
  shortcutManager.setActiveContextName('editor');
56
67
  this.registerShortcuts();
@@ -61,9 +72,9 @@ export class SelectEditor extends BaseEditor {
61
72
  */
62
73
  close() {
63
74
  this._opened = false;
64
- this.select.style.display = 'none';
65
- if (hasClass(this.select, EDITOR_VISIBLE_CLASS_NAME)) {
66
- removeClass(this.select, EDITOR_VISIBLE_CLASS_NAME);
75
+ this.selectWrapper.style.display = 'none';
76
+ if (hasClass(this.selectWrapper, EDITOR_VISIBLE_CLASS_NAME)) {
77
+ removeClass(this.selectWrapper, EDITOR_VISIBLE_CLASS_NAME);
67
78
  }
68
79
  this.unregisterShortcuts();
69
80
  this.clearHooks();
@@ -169,13 +180,13 @@ export class SelectEditor extends BaseEditor {
169
180
  width,
170
181
  height
171
182
  } = this.getEditedCellRect();
172
- const selectStyle = this.select.style;
183
+ const selectStyle = this.selectWrapper.style;
173
184
  selectStyle.height = `${height}px`;
174
185
  selectStyle.width = `${width}px`;
175
186
  selectStyle.top = `${top}px`;
176
187
  selectStyle[this.hot.isRtl() ? 'right' : 'left'] = `${start}px`;
177
188
  selectStyle.margin = '0px';
178
- addClass(this.select, EDITOR_VISIBLE_CLASS_NAME);
189
+ addClass(this.selectWrapper, EDITOR_VISIBLE_CLASS_NAME);
179
190
  }
180
191
 
181
192
  /**
@@ -312,19 +312,12 @@ class TextEditor extends _baseEditor.BaseEditor {
312
312
  this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize;
313
313
  this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily;
314
314
  this.TEXTAREA.style.backgroundColor = this.TD.style.backgroundColor;
315
- const textareaComputedStyle = this.hot.rootWindow.getComputedStyle(this.TEXTAREA);
316
- const horizontalPadding = parseInt(textareaComputedStyle.paddingLeft, 10) + parseInt(textareaComputedStyle.paddingRight, 10);
317
- const verticalPadding = parseInt(textareaComputedStyle.paddingTop, 10) + parseInt(textareaComputedStyle.paddingBottom, 10);
318
- const finalWidth = width - horizontalPadding;
319
- const finalHeight = height - verticalPadding;
320
- const finalMaxWidth = maxWidth - horizontalPadding;
321
- const finalMaxHeight = maxHeight - verticalPadding;
322
315
  this.autoResize.init(this.TEXTAREA, {
323
- minWidth: Math.min(finalWidth, finalMaxWidth),
324
- minHeight: Math.min(finalHeight, finalMaxHeight),
316
+ minWidth: Math.min(width, maxWidth),
317
+ minHeight: Math.min(height, maxHeight),
325
318
  // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)
326
- maxWidth: finalMaxWidth,
327
- maxHeight: finalMaxHeight
319
+ maxWidth,
320
+ maxHeight
328
321
  }, true);
329
322
  }
330
323
 
@@ -308,19 +308,12 @@ export class TextEditor extends BaseEditor {
308
308
  this.TEXTAREA.style.fontSize = cellComputedStyle.fontSize;
309
309
  this.TEXTAREA.style.fontFamily = cellComputedStyle.fontFamily;
310
310
  this.TEXTAREA.style.backgroundColor = this.TD.style.backgroundColor;
311
- const textareaComputedStyle = this.hot.rootWindow.getComputedStyle(this.TEXTAREA);
312
- const horizontalPadding = parseInt(textareaComputedStyle.paddingLeft, 10) + parseInt(textareaComputedStyle.paddingRight, 10);
313
- const verticalPadding = parseInt(textareaComputedStyle.paddingTop, 10) + parseInt(textareaComputedStyle.paddingBottom, 10);
314
- const finalWidth = width - horizontalPadding;
315
- const finalHeight = height - verticalPadding;
316
- const finalMaxWidth = maxWidth - horizontalPadding;
317
- const finalMaxHeight = maxHeight - verticalPadding;
318
311
  this.autoResize.init(this.TEXTAREA, {
319
- minWidth: Math.min(finalWidth, finalMaxWidth),
320
- minHeight: Math.min(finalHeight, finalMaxHeight),
312
+ minWidth: Math.min(width, maxWidth),
313
+ minHeight: Math.min(height, maxHeight),
321
314
  // TEXTAREA should never be wider than visible part of the viewport (should not cover the scrollbar)
322
- maxWidth: finalMaxWidth,
323
- maxHeight: finalMaxHeight
315
+ maxWidth,
316
+ maxHeight
324
317
  }, true);
325
318
  }
326
319
 
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-d7edb4b-20240927";
137
+ const hotVersion = "0.0.0-next-f512acf-20240930";
138
138
  let keyValidityDate;
139
139
  let consoleMessageState = 'invalid';
140
140
  let domMessageState = 'invalid';
@@ -188,7 +188,7 @@ function _injectProductInfo(key, element) {
188
188
  });
189
189
  if (message) {
190
190
  const messageNode = document.createElement('div');
191
- messageNode.className = 'hot-display-license-info';
191
+ messageNode.className = 'handsontable hot-display-license-info';
192
192
  messageNode.innerHTML = domMessages[domMessageState]({
193
193
  keyValidityDate,
194
194
  hotVersion
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-d7edb4b-20240927";
127
+ const hotVersion = "0.0.0-next-f512acf-20240930";
128
128
  let keyValidityDate;
129
129
  let consoleMessageState = 'invalid';
130
130
  let domMessageState = 'invalid';
@@ -178,7 +178,7 @@ export function _injectProductInfo(key, element) {
178
178
  });
179
179
  if (message) {
180
180
  const messageNode = document.createElement('div');
181
- messageNode.className = 'hot-display-license-info';
181
+ messageNode.className = 'handsontable hot-display-license-info';
182
182
  messageNode.innerHTML = domMessages[domMessageState]({
183
183
  keyValidityDate,
184
184
  hotVersion
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.getThemeClassName = getThemeClassName;
5
+ /**
6
+ * Get theme class name from rootElement class.
7
+ *
8
+ * @param {string} className Class names.
9
+ * @returns {string}
10
+ */
11
+ function getThemeClassName(className) {
12
+ if (!className || typeof className !== 'string') {
13
+ return false;
14
+ }
15
+ const [match] = className.match(/ht-theme-[a-zA-Z0-9_-]+/) || [];
16
+ return match;
17
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Get theme class name from rootElement class.
3
+ *
4
+ * @param {string} className Class names.
5
+ * @returns {string}
6
+ */
7
+ export function getThemeClassName(className) {
8
+ if (!className || typeof className !== 'string') {
9
+ return false;
10
+ }
11
+ const [match] = className.match(/ht-theme-[a-zA-Z0-9_-]+/) || [];
12
+ return match;
13
+ }
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-d7edb4b-20240927",
13
+ "version": "0.0.0-next-f512acf-20240930",
14
14
  "main": "index",
15
15
  "module": "index.mjs",
16
16
  "jsnext:main": "index.mjs",
@@ -50,7 +50,6 @@
50
50
  "@babel/register": "^7.8.3",
51
51
  "@babel/runtime": "^7.11.2",
52
52
  "@babel/types": "^7.12.12",
53
- "@typescript-eslint/eslint-plugin": "^4.33.0",
54
53
  "babel-jest": "^26.6.3",
55
54
  "babel-loader": "^8.0.4",
56
55
  "babel-plugin-forbidden-imports": "^0.1.2",
@@ -94,8 +93,10 @@
94
93
  "string-replace-loader": "^3.1.0",
95
94
  "stylelint": "^16.3.1",
96
95
  "typescript": "3.8.2",
96
+ "@typescript-eslint/eslint-plugin": "^4.33.0",
97
97
  "webpack": "^5.88.1",
98
- "webpack-cli": "^5.1.4"
98
+ "webpack-cli": "^5.1.4",
99
+ "webpack-remove-empty-scripts": "^1.0.4"
99
100
  },
100
101
  "optionalDependencies": {
101
102
  "hyperformula": "^2.6.2"
@@ -767,6 +768,12 @@
767
768
  "./dist/languages/zh-CN.min.js": "./dist/languages/zh-CN.min.js",
768
769
  "./dist/languages/zh-TW.js": "./dist/languages/zh-TW.js",
769
770
  "./dist/languages/zh-TW.min.js": "./dist/languages/zh-TW.min.js",
771
+ "./styles/handsontable.css": "./styles/handsontable.css",
772
+ "./styles/handsontable.min.css": "./styles/handsontable.min.css",
773
+ "./styles/ht-theme-gemini.css": "./styles/ht-theme-gemini.css",
774
+ "./styles/ht-theme-gemini.min.css": "./styles/ht-theme-gemini.min.css",
775
+ "./styles/ht-theme-main.css": "./styles/ht-theme-main.css",
776
+ "./styles/ht-theme-main.min.css": "./styles/ht-theme-main.min.css",
770
777
  ".": {
771
778
  "types": "./index.d.ts",
772
779
  "import": "./index.mjs",
@@ -25,6 +25,7 @@ var _editor = /*#__PURE__*/new WeakMap();
25
25
  var _editorStyle = /*#__PURE__*/new WeakMap();
26
26
  var _hidden = /*#__PURE__*/new WeakMap();
27
27
  var _resizeObserver = /*#__PURE__*/new WeakMap();
28
+ var _themeClassName = /*#__PURE__*/new WeakMap();
28
29
  class CommentEditor {
29
30
  static get CLASS_EDITOR_CONTAINER() {
30
31
  return 'htCommentsContainer';
@@ -43,7 +44,7 @@ class CommentEditor {
43
44
  * @type {Document}
44
45
  */
45
46
 
46
- constructor(rootDocument, isRtl) {
47
+ constructor(rootDocument, isRtl, themeClassName) {
47
48
  var _this = this;
48
49
  _classPrivateFieldInitSpec(this, _rootDocument, void 0);
49
50
  /**
@@ -70,8 +71,13 @@ class CommentEditor {
70
71
  * @type {EditorResizeObserver}
71
72
  */
72
73
  _classPrivateFieldInitSpec(this, _resizeObserver, new _editorResizeObserver.EditorResizeObserver());
74
+ /**
75
+ * @type {string}
76
+ */
77
+ _classPrivateFieldInitSpec(this, _themeClassName, void 0);
73
78
  _classPrivateFieldSet(_rootDocument, this, rootDocument);
74
79
  _classPrivateFieldSet(_isRtl, this, isRtl);
80
+ _classPrivateFieldSet(_themeClassName, this, themeClassName);
75
81
  _classPrivateFieldSet(_editor, this, this.createEditor());
76
82
  _classPrivateFieldSet(_editorStyle, this, _classPrivateFieldGet(_editor, this).style);
77
83
  _classPrivateFieldGet(_resizeObserver, this).setObservedElement(this.getInputElement());
@@ -223,6 +229,7 @@ class CommentEditor {
223
229
  _classPrivateFieldSet(_container, this, _classPrivateFieldGet(_rootDocument, this).createElement('div'));
224
230
  _classPrivateFieldGet(_container, this).setAttribute('dir', _classPrivateFieldGet(_isRtl, this) ? 'rtl' : 'ltr');
225
231
  (0, _element.addClass)(_classPrivateFieldGet(_container, this), CommentEditor.CLASS_EDITOR_CONTAINER);
232
+ (0, _element.addClass)(_classPrivateFieldGet(_container, this), _classPrivateFieldGet(_themeClassName, this));
226
233
  _classPrivateFieldGet(_rootDocument, this).body.appendChild(_classPrivateFieldGet(_container, this));
227
234
  (0, _element.addClass)(editor, CommentEditor.CLASS_EDITOR);
228
235
  (0, _element.addClass)(textarea, CommentEditor.CLASS_INPUT);
@@ -21,6 +21,7 @@ var _editor = /*#__PURE__*/new WeakMap();
21
21
  var _editorStyle = /*#__PURE__*/new WeakMap();
22
22
  var _hidden = /*#__PURE__*/new WeakMap();
23
23
  var _resizeObserver = /*#__PURE__*/new WeakMap();
24
+ var _themeClassName = /*#__PURE__*/new WeakMap();
24
25
  class CommentEditor {
25
26
  static get CLASS_EDITOR_CONTAINER() {
26
27
  return 'htCommentsContainer';
@@ -39,7 +40,7 @@ class CommentEditor {
39
40
  * @type {Document}
40
41
  */
41
42
 
42
- constructor(rootDocument, isRtl) {
43
+ constructor(rootDocument, isRtl, themeClassName) {
43
44
  var _this = this;
44
45
  _classPrivateFieldInitSpec(this, _rootDocument, void 0);
45
46
  /**
@@ -66,8 +67,13 @@ class CommentEditor {
66
67
  * @type {EditorResizeObserver}
67
68
  */
68
69
  _classPrivateFieldInitSpec(this, _resizeObserver, new EditorResizeObserver());
70
+ /**
71
+ * @type {string}
72
+ */
73
+ _classPrivateFieldInitSpec(this, _themeClassName, void 0);
69
74
  _classPrivateFieldSet(_rootDocument, this, rootDocument);
70
75
  _classPrivateFieldSet(_isRtl, this, isRtl);
76
+ _classPrivateFieldSet(_themeClassName, this, themeClassName);
71
77
  _classPrivateFieldSet(_editor, this, this.createEditor());
72
78
  _classPrivateFieldSet(_editorStyle, this, _classPrivateFieldGet(_editor, this).style);
73
79
  _classPrivateFieldGet(_resizeObserver, this).setObservedElement(this.getInputElement());
@@ -219,6 +225,7 @@ class CommentEditor {
219
225
  _classPrivateFieldSet(_container, this, _classPrivateFieldGet(_rootDocument, this).createElement('div'));
220
226
  _classPrivateFieldGet(_container, this).setAttribute('dir', _classPrivateFieldGet(_isRtl, this) ? 'rtl' : 'ltr');
221
227
  addClass(_classPrivateFieldGet(_container, this), CommentEditor.CLASS_EDITOR_CONTAINER);
228
+ addClass(_classPrivateFieldGet(_container, this), _classPrivateFieldGet(_themeClassName, this));
222
229
  _classPrivateFieldGet(_rootDocument, this).body.appendChild(_classPrivateFieldGet(_container, this));
223
230
  addClass(editor, CommentEditor.CLASS_EDITOR);
224
231
  addClass(textarea, CommentEditor.CLASS_INPUT);
@@ -213,7 +213,7 @@ class Comments extends _base.BasePlugin {
213
213
  return;
214
214
  }
215
215
  if (!_classPrivateFieldGet(_editor, this)) {
216
- _classPrivateFieldSet(_editor, this, new _commentEditor.default(this.hot.rootDocument, this.hot.isRtl()));
216
+ _classPrivateFieldSet(_editor, this, new _commentEditor.default(this.hot.rootDocument, this.hot.isRtl(), this.hot.getSettings().themeName));
217
217
  _classPrivateFieldGet(_editor, this).addLocalHook('resize', function () {
218
218
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
219
219
  args[_key] = arguments[_key];
@@ -209,7 +209,7 @@ export class Comments extends BasePlugin {
209
209
  return;
210
210
  }
211
211
  if (!_classPrivateFieldGet(_editor, this)) {
212
- _classPrivateFieldSet(_editor, this, new CommentEditor(this.hot.rootDocument, this.hot.isRtl()));
212
+ _classPrivateFieldSet(_editor, this, new CommentEditor(this.hot.rootDocument, this.hot.isRtl(), this.hot.getSettings().themeName));
213
213
  _classPrivateFieldGet(_editor, this).addLocalHook('resize', function () {
214
214
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
215
215
  args[_key] = arguments[_key];
@@ -579,10 +579,8 @@ class Menu {
579
579
  const currentRowHeight = itemCell ? (0, _element.outerHeight)(this.hotMenu.getCell(index, 0)) : 0;
580
580
  return accumulator + (value.name === _predefinedItems.SEPARATOR ? 1 : currentRowHeight);
581
581
  }, 0);
582
-
583
- // Additional 3px to menu's size because of additional border around its `table.htCore`.
584
- holderStyle.width = `${currentHiderWidth + 3}px`;
585
- holderStyle.height = `${realHeight + 3}px`;
582
+ holderStyle.width = `${currentHiderWidth}px`;
583
+ holderStyle.height = `${realHeight}px`;
586
584
  hiderStyle.height = holderStyle.height;
587
585
  }
588
586
 
@@ -612,8 +610,10 @@ class Menu {
612
610
  container = doc.querySelector(`.${this.options.className}.${className}`);
613
611
  }
614
612
  if (!container) {
613
+ const themeClassName = this.hot.getSettings().themeName;
615
614
  container = doc.createElement('div');
616
615
  (0, _element.addClass)(container, `htMenu ${this.options.className}`);
616
+ (0, _element.addClass)(container, themeClassName);
617
617
  if (className) {
618
618
  (0, _element.addClass)(container, className);
619
619
  }
@@ -575,10 +575,8 @@ export class Menu {
575
575
  const currentRowHeight = itemCell ? outerHeight(this.hotMenu.getCell(index, 0)) : 0;
576
576
  return accumulator + (value.name === SEPARATOR ? 1 : currentRowHeight);
577
577
  }, 0);
578
-
579
- // Additional 3px to menu's size because of additional border around its `table.htCore`.
580
- holderStyle.width = `${currentHiderWidth + 3}px`;
581
- holderStyle.height = `${realHeight + 3}px`;
578
+ holderStyle.width = `${currentHiderWidth}px`;
579
+ holderStyle.height = `${realHeight}px`;
582
580
  hiderStyle.height = holderStyle.height;
583
581
  }
584
582
 
@@ -608,8 +606,10 @@ export class Menu {
608
606
  container = doc.querySelector(`.${this.options.className}.${className}`);
609
607
  }
610
608
  if (!container) {
609
+ const themeClassName = this.hot.getSettings().themeName;
611
610
  container = doc.createElement('div');
612
611
  addClass(container, `htMenu ${this.options.className}`);
612
+ addClass(container, themeClassName);
613
613
  if (className) {
614
614
  addClass(container, className);
615
615
  }
@@ -100,7 +100,7 @@ function createKeyboardShortcutsCtrl(menu) {
100
100
  /**
101
101
  * Makes the specified context active.
102
102
  *
103
- * @param {string} contextName The context name.
103
+ * @param {string} [contextName] The context name.
104
104
  */
105
105
  function listen(contextName) {
106
106
  menu.hotMenu.getShortcutManager().setActiveContextName(_getContextName(contextName));
@@ -96,7 +96,7 @@ export function createKeyboardShortcutsCtrl(menu) {
96
96
  /**
97
97
  * Makes the specified context active.
98
98
  *
99
- * @param {string} contextName The context name.
99
+ * @param {string} [contextName] The context name.
100
100
  */
101
101
  function listen(contextName) {
102
102
  menu.hotMenu.getShortcutManager().setActiveContextName(_getContextName(contextName));
@@ -76,6 +76,7 @@ const SHORTCUTS_GROUP = PLUGIN_KEY;
76
76
  * :::
77
77
  */
78
78
  var _menuFocusNavigator = /*#__PURE__*/new WeakMap();
79
+ var _dropdownMenuTraces = /*#__PURE__*/new WeakMap();
79
80
  var _Filters_brand = /*#__PURE__*/new WeakSet();
80
81
  class Filters extends _base.BasePlugin {
81
82
  static get PLUGIN_KEY() {
@@ -139,6 +140,12 @@ class Filters extends _base.BasePlugin {
139
140
  * @type {MenuFocusNavigator|undefined}
140
141
  */
141
142
  _classPrivateFieldInitSpec(this, _menuFocusNavigator, void 0);
143
+ /**
144
+ * Traces the new menu instances to apply the focus navigation to the latest one.
145
+ *
146
+ * @type {WeakSet<Menu>}
147
+ */
148
+ _classPrivateFieldInitSpec(this, _dropdownMenuTraces, new WeakSet());
142
149
  this.hot.addHook('afterGetColHeader', (col, TH) => _assertClassBrand(_Filters_brand, this, _onAfterGetColHeader).call(this, col, TH));
143
150
  }
144
151
 
@@ -157,6 +164,7 @@ class Filters extends _base.BasePlugin {
157
164
  * Enables the plugin functionality for this Handsontable instance.
158
165
  */
159
166
  enablePlugin() {
167
+ var _this = this;
160
168
  if (this.enabled) {
161
169
  return;
162
170
  }
@@ -218,7 +226,13 @@ class Filters extends _base.BasePlugin {
218
226
  this.conditionUpdateObserver.addLocalHook('update', conditionState => _assertClassBrand(_Filters_brand, this, _updateComponents).call(this, conditionState));
219
227
  }
220
228
  this.components.forEach(component => component.show());
221
- this.addHook('afterDropdownMenuDefaultOptions', defaultOptions => _assertClassBrand(_Filters_brand, this, _onAfterDropdownMenuDefaultOptions).call(this, defaultOptions));
229
+ this.addHook('afterDropdownMenuDefaultOptions', function () {
230
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
231
+ args[_key] = arguments[_key];
232
+ }
233
+ return _assertClassBrand(_Filters_brand, _this, _onAfterDropdownMenuDefaultOptions).call(_this, ...args);
234
+ });
235
+ this.addHook('beforeDropdownMenuShow', () => _assertClassBrand(_Filters_brand, this, _onBeforeDropdownMenuShow).call(this));
222
236
  this.addHook('afterDropdownMenuShow', () => _assertClassBrand(_Filters_brand, this, _onAfterDropdownMenuShow).call(this));
223
237
  this.addHook('afterDropdownMenuHide', () => _assertClassBrand(_Filters_brand, this, _onAfterDropdownMenuHide).call(this));
224
238
  this.addHook('afterChange', changes => _assertClassBrand(_Filters_brand, this, _onAfterChange).call(this, changes));
@@ -229,15 +243,15 @@ class Filters extends _base.BasePlugin {
229
243
  this.dropdownMenuPlugin.enablePlugin();
230
244
  }
231
245
  if (!_classPrivateFieldGet(_menuFocusNavigator, this) && this.dropdownMenuPlugin.enabled) {
232
- const mainMenu = this.dropdownMenuPlugin.menu;
233
246
  const focusableItems = [
234
247
  // A fake menu item that once focused allows escaping from the focus navigation (using Tab keys)
235
248
  // to the menu navigation using arrow keys.
236
249
  {
237
250
  focus: () => {
238
- const menuNavigator = mainMenu.getNavigator();
251
+ const menu = _classPrivateFieldGet(_menuFocusNavigator, this).getMenu();
252
+ const menuNavigator = menu.getNavigator();
239
253
  const lastSelectedMenuItem = _classPrivateFieldGet(_menuFocusNavigator, this).getLastMenuPage();
240
- mainMenu.focus();
254
+ menu.focus();
241
255
  if (lastSelectedMenuItem > 0) {
242
256
  menuNavigator.setCurrentPage(lastSelectedMenuItem);
243
257
  } else {
@@ -248,7 +262,7 @@ class Filters extends _base.BasePlugin {
248
262
  let [, component] = _ref;
249
263
  return component.getElements();
250
264
  }).flat()];
251
- _classPrivateFieldSet(_menuFocusNavigator, this, (0, _focusController.createMenuFocusController)(mainMenu, focusableItems));
265
+ _classPrivateFieldSet(_menuFocusNavigator, this, (0, _focusController.createMenuFocusController)(this.dropdownMenuPlugin.menu, focusableItems));
252
266
  const forwardToFocusNavigation = event => {
253
267
  _classPrivateFieldGet(_menuFocusNavigator, this).listen();
254
268
  event.preventDefault();
@@ -706,8 +720,8 @@ class Filters extends _base.BasePlugin {
706
720
  return indexes;
707
721
  }
708
722
  const menu = this.dropdownMenuPlugin.menu;
709
- for (var _len = arguments.length, components = new Array(_len), _key = 0; _key < _len; _key++) {
710
- components[_key] = arguments[_key];
723
+ for (var _len2 = arguments.length, components = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
724
+ components[_key2] = arguments[_key2];
711
725
  }
712
726
  (0, _array.arrayEach)(components, component => {
713
727
  (0, _array.arrayEach)(menu.menuItems, (item, index) => {
@@ -734,8 +748,8 @@ class Filters extends _base.BasePlugin {
734
748
  const menu = this.dropdownMenuPlugin.menu;
735
749
  const hotMenu = menu.hotMenu;
736
750
  const hiddenRows = hotMenu.getPlugin('hiddenRows');
737
- for (var _len2 = arguments.length, components = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
738
- components[_key2 - 1] = arguments[_key2];
751
+ for (var _len3 = arguments.length, components = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
752
+ components[_key3 - 1] = arguments[_key3];
739
753
  }
740
754
  const indexes = this.getIndexesOfComponents(...components);
741
755
  if (visible) {
@@ -753,8 +767,8 @@ class Filters extends _base.BasePlugin {
753
767
  * @param {...BaseComponent} components List of components.
754
768
  */
755
769
  hideComponents() {
756
- for (var _len3 = arguments.length, components = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
757
- components[_key3] = arguments[_key3];
770
+ for (var _len4 = arguments.length, components = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
771
+ components[_key4] = arguments[_key4];
758
772
  }
759
773
  this.changeComponentsVisibility(false, ...components);
760
774
  }
@@ -766,8 +780,8 @@ class Filters extends _base.BasePlugin {
766
780
  * @param {...BaseComponent} components List of components.
767
781
  */
768
782
  showComponents() {
769
- for (var _len4 = arguments.length, components = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
770
- components[_key4] = arguments[_key4];
783
+ for (var _len5 = arguments.length, components = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
784
+ components[_key5] = arguments[_key5];
771
785
  }
772
786
  this.changeComponentsVisibility(true, ...components);
773
787
  }
@@ -814,6 +828,16 @@ function _onAfterDropdownMenuHide() {
814
828
  this.components.get('filter_by_condition').getSelectElement().closeOptions();
815
829
  this.components.get('filter_by_condition2').getSelectElement().closeOptions();
816
830
  }
831
+ /**
832
+ * Hooks applies the new dropdown menu instance to the focus navigator.
833
+ */
834
+ function _onBeforeDropdownMenuShow() {
835
+ const mainMenu = this.dropdownMenuPlugin.menu;
836
+ if (!_classPrivateFieldGet(_dropdownMenuTraces, this).has(mainMenu)) {
837
+ _classPrivateFieldGet(_menuFocusNavigator, this).setMenu(mainMenu);
838
+ }
839
+ _classPrivateFieldGet(_dropdownMenuTraces, this).add(mainMenu);
840
+ }
817
841
  /**
818
842
  * After dropdown menu default options listener.
819
843
  *