handsontable 0.0.0-next-ff8465d-20231006 → 0.0.0-next-b0a4ea2-20231024

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 (117) hide show
  1. package/base.js +2 -2
  2. package/base.mjs +2 -2
  3. package/cellTypes/dateType/dateType.d.ts +3 -3
  4. package/cellTypes/dateType/dateType.js +2 -2
  5. package/cellTypes/dateType/dateType.mjs +2 -2
  6. package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
  7. package/cellTypes/handsontableType/handsontableType.js +2 -2
  8. package/cellTypes/handsontableType/handsontableType.mjs +2 -2
  9. package/core.d.ts +1 -1
  10. package/core.js +10 -5
  11. package/core.mjs +10 -5
  12. package/dataMap/metaManager/metaSchema.js +1 -1
  13. package/dataMap/metaManager/metaSchema.mjs +1 -1
  14. package/dist/handsontable.css +13 -12
  15. package/dist/handsontable.full.css +13 -12
  16. package/dist/handsontable.full.js +2260 -1403
  17. package/dist/handsontable.full.min.css +5 -5
  18. package/dist/handsontable.full.min.js +10 -10
  19. package/dist/handsontable.js +2260 -1403
  20. package/dist/handsontable.min.css +5 -5
  21. package/dist/handsontable.min.js +24 -24
  22. package/dist/languages/all.js +6 -2
  23. package/dist/languages/all.min.js +1 -1
  24. package/dist/languages/en-US.js +3 -1
  25. package/dist/languages/en-US.min.js +1 -1
  26. package/dist/languages/pl-PL.js +3 -1
  27. package/dist/languages/pl-PL.min.js +1 -1
  28. package/editors/autocompleteEditor/autocompleteEditor.js +1 -1
  29. package/editors/autocompleteEditor/autocompleteEditor.mjs +1 -1
  30. package/editors/dateEditor/dateEditor.js +26 -7
  31. package/editors/dateEditor/dateEditor.mjs +27 -8
  32. package/editors/handsontableEditor/handsontableEditor.js +7 -0
  33. package/editors/handsontableEditor/handsontableEditor.mjs +8 -1
  34. package/helpers/a11y.js +3 -1
  35. package/helpers/a11y.mjs +2 -1
  36. package/helpers/mixed.js +1 -1
  37. package/helpers/mixed.mjs +1 -1
  38. package/i18n/constants.js +7 -1
  39. package/i18n/constants.mjs +4 -1
  40. package/i18n/languages/en-US.js +3 -1
  41. package/i18n/languages/en-US.mjs +3 -1
  42. package/i18n/languages/pl-PL.js +3 -1
  43. package/i18n/languages/pl-PL.mjs +3 -1
  44. package/languages/all.js +6 -2
  45. package/languages/en-US.js +3 -1
  46. package/languages/en-US.mjs +3 -1
  47. package/languages/index.js +6 -2
  48. package/languages/pl-PL.js +3 -1
  49. package/languages/pl-PL.mjs +3 -1
  50. package/package.json +11 -1
  51. package/pluginHooks.js +1 -1
  52. package/pluginHooks.mjs +1 -1
  53. package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
  54. package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
  55. package/plugins/contextMenu/menu/menu.js +87 -151
  56. package/plugins/contextMenu/menu/menu.mjs +90 -154
  57. package/plugins/contextMenu/menu/menuItemRenderer.js +58 -0
  58. package/plugins/contextMenu/menu/menuItemRenderer.mjs +54 -0
  59. package/plugins/contextMenu/menu/navigator.js +19 -144
  60. package/plugins/contextMenu/menu/navigator.mjs +18 -143
  61. package/plugins/contextMenu/menu/shortcuts.js +114 -0
  62. package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
  63. package/plugins/dropdownMenu/dropdownMenu.js +32 -4
  64. package/plugins/dropdownMenu/dropdownMenu.mjs +33 -5
  65. package/plugins/filters/component/_base.js +23 -8
  66. package/plugins/filters/component/_base.mjs +23 -8
  67. package/plugins/filters/component/actionBar.js +29 -27
  68. package/plugins/filters/component/actionBar.mjs +26 -23
  69. package/plugins/filters/component/condition.js +46 -59
  70. package/plugins/filters/component/condition.mjs +40 -52
  71. package/plugins/filters/component/operators.js +21 -22
  72. package/plugins/filters/component/operators.mjs +18 -18
  73. package/plugins/filters/component/value.js +35 -26
  74. package/plugins/filters/component/value.mjs +32 -22
  75. package/plugins/filters/filters.js +75 -48
  76. package/plugins/filters/filters.mjs +68 -41
  77. package/plugins/filters/menu/focusController.js +123 -0
  78. package/plugins/filters/menu/focusController.mjs +119 -0
  79. package/plugins/filters/menu/focusNavigator.js +30 -0
  80. package/plugins/filters/menu/focusNavigator.mjs +26 -0
  81. package/plugins/filters/ui/_base.js +35 -13
  82. package/plugins/filters/ui/_base.mjs +35 -13
  83. package/plugins/filters/ui/input.js +43 -32
  84. package/plugins/filters/ui/input.mjs +42 -30
  85. package/plugins/filters/ui/link.js +44 -12
  86. package/plugins/filters/ui/link.mjs +44 -11
  87. package/plugins/filters/ui/multipleSelect.js +234 -129
  88. package/plugins/filters/ui/multipleSelect.mjs +232 -127
  89. package/plugins/filters/ui/radioInput.js +42 -18
  90. package/plugins/filters/ui/radioInput.mjs +42 -17
  91. package/plugins/filters/ui/select.js +144 -75
  92. package/plugins/filters/ui/select.mjs +140 -70
  93. package/renderers/autocompleteRenderer/autocompleteRenderer.js +1 -1
  94. package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +1 -1
  95. package/renderers/checkboxRenderer/checkboxRenderer.js +3 -3
  96. package/renderers/checkboxRenderer/checkboxRenderer.mjs +4 -4
  97. package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
  98. package/renderers/dateRenderer/dateRenderer.js +29 -0
  99. package/renderers/dateRenderer/dateRenderer.mjs +24 -0
  100. package/renderers/dateRenderer/index.d.ts +1 -0
  101. package/renderers/dateRenderer/index.js +6 -0
  102. package/renderers/dateRenderer/index.mjs +1 -0
  103. package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
  104. package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
  105. package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
  106. package/renderers/handsontableRenderer/index.d.ts +1 -0
  107. package/renderers/handsontableRenderer/index.js +6 -0
  108. package/renderers/handsontableRenderer/index.mjs +1 -0
  109. package/renderers/index.d.ts +6 -0
  110. package/renderers/selectRenderer/selectRenderer.js +2 -1
  111. package/renderers/selectRenderer/selectRenderer.mjs +2 -1
  112. package/selection/selection.js +2 -2
  113. package/selection/selection.mjs +2 -2
  114. package/shortcuts/context.js +3 -2
  115. package/shortcuts/context.mjs +3 -2
  116. package/utils/paginator.js +151 -0
  117. package/utils/paginator.mjs +147 -0
@@ -1,21 +1,29 @@
1
1
  import "core-js/modules/es.array.push.js";
2
+ import "core-js/modules/es.error.cause.js";
3
+ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
4
+ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
5
+ function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
6
+ function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
7
+ function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
8
+ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
9
+ function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
2
10
  import { Positioner } from "./positioner.mjs";
3
- import { Navigator } from "./navigator.mjs";
11
+ import { createMenuNavigator } from "./navigator.mjs";
12
+ import { createKeyboardShortcutsCtrl } from "./shortcuts.mjs";
4
13
  import { SEPARATOR, NO_ITEMS, predefinedItems } from "./../predefinedItems/index.mjs";
5
- import { filterSeparators, hasSubMenu, isItemHidden, normalizeSelection, isItemSubMenu, isItemDisabled, isItemSelectionDisabled, isItemSeparator } from "./utils.mjs";
14
+ import { filterSeparators, hasSubMenu, isItemHidden, normalizeSelection, isItemSubMenu, isItemDisabled, isItemSeparator } from "./utils.mjs";
6
15
  import EventManager from "../../../eventManager.mjs";
7
16
  import { arrayEach, arrayFilter, arrayReduce } from "../../../helpers/array.mjs";
8
17
  import { isWindowsOS, isMobileBrowser, isIpadOS } from "../../../helpers/browser.mjs";
9
- import { addClass, empty, fastInnerHTML, isChildOf, isInput, removeClass, getParentWindow, hasClass, setAttribute } from "../../../helpers/dom/element.mjs";
18
+ import { addClass, isChildOf, getParentWindow, hasClass, setAttribute } from "../../../helpers/dom/element.mjs";
10
19
  import { isRightClick } from "../../../helpers/dom/event.mjs";
11
20
  import { debounce, isFunction } from "../../../helpers/function.mjs";
12
21
  import { isUndefined, isDefined } from "../../../helpers/mixed.mjs";
13
22
  import { mixin } from "../../../helpers/object.mjs";
14
23
  import localHooks from "../../../mixins/localHooks.mjs";
15
- import { A11Y_DISABLED, A11Y_EXPANDED, A11Y_LABEL, A11Y_MENU, A11Y_MENU_ITEM } from "../../../helpers/a11y.mjs";
24
+ import { createMenuItemRenderer } from "./menuItemRenderer.mjs";
25
+ import { A11Y_EXPANDED, A11Y_MENU, A11Y_TABINDEX } from "../../../helpers/a11y.mjs";
16
26
  const MIN_WIDTH = 215;
17
- const SHORTCUTS_CONTEXT = 'menu';
18
- const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
19
27
 
20
28
  /**
21
29
  * @typedef MenuOptions
@@ -32,12 +40,33 @@ const SHORTCUTS_GROUP = SHORTCUTS_CONTEXT;
32
40
  * @private
33
41
  * @class Menu
34
42
  */
43
+ var _navigator = /*#__PURE__*/new WeakMap();
44
+ var _shortcutsCtrl = /*#__PURE__*/new WeakMap();
35
45
  export class Menu {
36
46
  /**
37
47
  * @param {Core} hotInstance Handsontable instance.
38
48
  * @param {MenuOptions} [options] Menu options.
39
49
  */
40
50
  constructor(hotInstance, options) {
51
+ var _this = this;
52
+ /**
53
+ * The controller module that allows modifying the menu item selection positions.
54
+ *
55
+ * @type {Paginator}
56
+ */
57
+ _classPrivateFieldInitSpec(this, _navigator, {
58
+ writable: true,
59
+ value: void 0
60
+ });
61
+ /**
62
+ * The controller module that allows extending the keyboard shortcuts for the menu.
63
+ *
64
+ * @type {KeyboardShortcutsMenuController}
65
+ */
66
+ _classPrivateFieldInitSpec(this, _shortcutsCtrl, {
67
+ writable: true,
68
+ value: void 0
69
+ });
41
70
  this.hot = hotInstance;
42
71
  this.options = options || {
43
72
  parent: null,
@@ -51,14 +80,20 @@ export class Menu {
51
80
  this.eventManager = new EventManager(this);
52
81
  this.container = this.createContainer(this.options.name);
53
82
  this.positioner = new Positioner(this.options.keepInViewport);
54
- this.navigator = new Navigator();
55
83
  this.hotMenu = null;
56
84
  this.hotSubMenus = {};
57
85
  this.parentMenu = this.options.parent || null;
58
86
  this.menuItems = null;
59
87
  this.origOutsideClickDeselects = null;
60
- this._afterScrollCallback = null;
61
88
  this.registerEvents();
89
+ if (this.isSubMenu()) {
90
+ this.addLocalHook('afterSelectionChange', function () {
91
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
92
+ args[_key] = arguments[_key];
93
+ }
94
+ return _this.parentMenu.runLocalHooks('afterSelectionChange', ...args);
95
+ });
96
+ }
62
97
  }
63
98
 
64
99
  /**
@@ -84,6 +119,24 @@ export class Menu {
84
119
  this.menuItems = menuItems;
85
120
  }
86
121
 
122
+ /**
123
+ * Gets the controller object that allows modifying the the menu item selection.
124
+ *
125
+ * @returns {Paginator | undefined}
126
+ */
127
+ getNavigator() {
128
+ return _classPrivateFieldGet(this, _navigator);
129
+ }
130
+
131
+ /**
132
+ * Gets the controller object that allows extending the keyboard shortcuts of the menu.
133
+ *
134
+ * @returns {KeyboardShortcutsMenuController | undefined}
135
+ */
136
+ getKeyboardShortcutsCtrl() {
137
+ return _classPrivateFieldGet(this, _shortcutsCtrl);
138
+ }
139
+
87
140
  /**
88
141
  * Returns currently selected menu item. Returns `null` if no item was selected.
89
142
  *
@@ -152,10 +205,11 @@ export class Menu {
152
205
  readOnly: true,
153
206
  editor: false,
154
207
  copyPaste: false,
208
+ hiddenRows: true,
155
209
  maxCols: 1,
156
210
  columns: [{
157
211
  data: 'name',
158
- renderer: (hot, TD, row, col, prop, value) => this.menuItemRenderer(hot, TD, row, col, prop, value)
212
+ renderer: createMenuItemRenderer(this.hot)
159
213
  }],
160
214
  renderAllRows: true,
161
215
  fragmentSelection: false,
@@ -163,6 +217,9 @@ export class Menu {
163
217
  disableVisualSelection: 'area',
164
218
  layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr',
165
219
  ariaTags: false,
220
+ beforeOnCellMouseOver: (event, coords) => {
221
+ _classPrivateFieldGet(this, _navigator).setCurrentPage(coords.row);
222
+ },
166
223
  afterOnCellMouseOver: (event, coords) => {
167
224
  if (this.isAllSubMenusClosed()) {
168
225
  delayedOpenSubMenu(coords.row);
@@ -185,6 +242,7 @@ export class Menu {
185
242
  if (this.hotMenu.view.isMouseDown()) {
186
243
  preventScrolling.value = true;
187
244
  }
245
+ this.runLocalHooks('afterSelectionChange', this.getSelectedItem());
188
246
  },
189
247
  beforeOnCellMouseUp: event => {
190
248
  if (this.hasSelectedItem()) {
@@ -222,94 +280,14 @@ export class Menu {
222
280
  this.hotMenu = new this.hot.constructor(this.container, settings);
223
281
  this.hotMenu.addHook('afterInit', () => this.onAfterInit());
224
282
  this.hotMenu.init();
225
- this.hotMenu.listen();
226
- this.navigator.setMenu(this.hotMenu);
227
- const shortcutManager = this.hotMenu.getShortcutManager();
228
- const menuContext = shortcutManager.addContext(SHORTCUTS_GROUP);
229
- const config = {
230
- group: SHORTCUTS_CONTEXT
231
- };
232
- const menuContextConfig = {
233
- ...config,
234
- runOnlyIf: event => !isInput(event.target) || !this.container.contains(event.target)
235
- };
236
-
237
- // Default shortcuts for Handsontable should not be handled. Changing context will help with that.
238
- shortcutManager.setActiveContextName('menu');
239
- menuContext.addShortcuts([{
240
- keys: [['Tab'], ['Shift', 'Tab'], ['Control/Meta', 'A']],
241
- forwardToContext: this.hot.getShortcutManager().getContext('grid'),
242
- callback: () => this.close(true)
243
- }, {
244
- keys: [['Escape']],
245
- callback: () => this.close(true)
246
- }, {
247
- keys: [['ArrowDown']],
248
- callback: () => this.navigator.selectNext()
249
- }, {
250
- keys: [['ArrowUp']],
251
- callback: () => this.navigator.selectPrev()
252
- }, {
253
- keys: [['ArrowRight']],
254
- callback: () => {
255
- const selection = this.hotMenu.getSelectedLast();
256
- if (selection) {
257
- const subMenu = this.openSubMenu(selection[0]);
258
- if (subMenu) {
259
- subMenu.navigator.selectFirst();
260
- }
261
- }
262
- }
263
- }, {
264
- keys: [['ArrowLeft']],
265
- callback: () => {
266
- const selection = this.hotMenu.getSelectedLast();
267
- if (selection && this.isSubMenu()) {
268
- this.close();
269
- if (this.isSubMenu()) {
270
- this.parentMenu.hotMenu.listen();
271
- }
272
- }
273
- }
274
- }, {
275
- keys: [['Control/Meta', 'ArrowUp'], ['Home']],
276
- callback: () => this.navigator.selectFirst()
277
- }, {
278
- keys: [['Control/Meta', 'ArrowDown'], ['End']],
279
- callback: () => this.navigator.selectLast()
280
- }, {
281
- keys: [['Enter'], ['Space']],
282
- callback: event => {
283
- const selection = this.hotMenu.getSelectedLast();
284
- if (this.hotMenu.getSourceDataAtRow(selection[0]).submenu) {
285
- this.openSubMenu(selection[0]).navigator.selectFirst();
286
- } else {
287
- this.executeCommand(event);
288
- this.close(true);
289
- }
290
- }
291
- }, {
292
- keys: [['PageUp']],
293
- callback: () => {
294
- const selection = this.hotMenu.getSelectedLast();
295
- if (selection) {
296
- this.hotMenu.selection.transformStart(-this.hotMenu.countVisibleRows(), 0);
297
- } else {
298
- this.navigator.selectFirst();
299
- }
300
- }
301
- }, {
302
- keys: [['PageDown']],
303
- callback: () => {
304
- const selection = this.hotMenu.getSelectedLast();
305
- if (selection) {
306
- this.hotMenu.selection.transformStart(this.hotMenu.countVisibleRows(), 0);
307
- } else {
308
- this.navigator.selectLast();
309
- }
310
- }
311
- }], menuContextConfig);
312
- this.runLocalHooks('afterOpen');
283
+ _classPrivateFieldSet(this, _navigator, createMenuNavigator(this.hotMenu));
284
+ _classPrivateFieldSet(this, _shortcutsCtrl, createKeyboardShortcutsCtrl(this));
285
+ _classPrivateFieldGet(this, _shortcutsCtrl).listen();
286
+ this.focus();
287
+ if (this.isSubMenu()) {
288
+ this.addLocalHook('afterOpen', () => this.parentMenu.runLocalHooks('afterSubmenuOpen', this));
289
+ }
290
+ this.runLocalHooks('afterOpen', this);
313
291
  }
314
292
 
315
293
  /**
@@ -325,7 +303,7 @@ export class Menu {
325
303
  if (closeParent && this.isSubMenu()) {
326
304
  this.parentMenu.close();
327
305
  } else {
328
- this.navigator.clear();
306
+ _classPrivateFieldGet(this, _navigator).clear();
329
307
  this.closeAllSubMenus();
330
308
  this.container.style.display = 'none';
331
309
  this.hotMenu.destroy();
@@ -416,6 +394,19 @@ export class Menu {
416
394
  return Object.keys(this.hotSubMenus).length === 0;
417
395
  }
418
396
 
397
+ /**
398
+ * Focus the menu so all keyboard shortcuts become active.
399
+ */
400
+ focus() {
401
+ if (this.isOpened()) {
402
+ this.hotMenu.rootElement.focus({
403
+ preventScroll: true
404
+ });
405
+ this.getKeyboardShortcutsCtrl().listen();
406
+ this.hotMenu.listen();
407
+ }
408
+ }
409
+
419
410
  /**
420
411
  * Destroy instance.
421
412
  */
@@ -501,61 +492,6 @@ export class Menu {
501
492
  this.positioner.setElement(this.container).updatePosition(coords);
502
493
  }
503
494
 
504
- /**
505
- * Menu item renderer.
506
- *
507
- * @private
508
- * @param {Core} hot The Handsontable instance.
509
- * @param {HTMLCellElement} TD The rendered cell element.
510
- * @param {number} row The visual index.
511
- * @param {number} col The visual index.
512
- * @param {string} prop The column property if used.
513
- * @param {string} value The cell value.
514
- */
515
- menuItemRenderer(hot, TD, row, col, prop, value) {
516
- const item = hot.getSourceDataAtRow(row);
517
- const wrapper = this.hot.rootDocument.createElement('div');
518
- let itemValue = value;
519
- if (typeof itemValue === 'function') {
520
- itemValue = itemValue.call(this.hot);
521
- }
522
- empty(TD);
523
- addClass(wrapper, 'htItemWrapper');
524
- if (this.hot.getSettings().ariaTags) {
525
- setAttribute(TD, [A11Y_MENU_ITEM(), A11Y_LABEL(itemValue), ...(isItemDisabled(item, this.hot) ? [A11Y_DISABLED()] : []), ...(isItemSubMenu(item) ? [A11Y_EXPANDED(false)] : [])]);
526
- }
527
- TD.appendChild(wrapper);
528
- if (isItemSeparator(item)) {
529
- addClass(TD, 'htSeparator');
530
- } else if (typeof item.renderer === 'function') {
531
- addClass(TD, 'htCustomMenuRenderer');
532
- TD.appendChild(item.renderer(hot, wrapper, row, col, prop, itemValue));
533
- } else {
534
- fastInnerHTML(wrapper, itemValue);
535
- }
536
- if (isItemDisabled(item, this.hot)) {
537
- addClass(TD, 'htDisabled');
538
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
539
- } else if (isItemSelectionDisabled(item)) {
540
- addClass(TD, 'htSelectionDisabled');
541
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
542
- } else if (isItemSubMenu(item)) {
543
- addClass(TD, 'htSubmenu');
544
- if (isItemSelectionDisabled(item)) {
545
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
546
- } else {
547
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.selectCell(row, col, void 0, void 0, false, false));
548
- }
549
- } else {
550
- removeClass(TD, ['htSubmenu', 'htDisabled']);
551
- if (isItemSelectionDisabled(item)) {
552
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.deselectCell());
553
- } else {
554
- this.eventManager.addEventListener(TD, 'mouseenter', () => hot.selectCell(row, col, void 0, void 0, false, false));
555
- }
556
- }
557
- }
558
-
559
495
  /**
560
496
  * Create container/wrapper for handsontable.
561
497
  *
@@ -614,7 +550,7 @@ export class Menu {
614
550
 
615
551
  // Replace the default accessibility tags with the context menu's
616
552
  if (this.hot.getSettings().ariaTags) {
617
- setAttribute(this.hotMenu.rootElement, [A11Y_MENU()]);
553
+ setAttribute(this.hotMenu.rootElement, [A11Y_MENU(), A11Y_TABINDEX(-1)]);
618
554
  }
619
555
  }
620
556
 
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.createMenuItemRenderer = createMenuItemRenderer;
5
+ var _utils = require("./utils");
6
+ var _element = require("../../../helpers/dom/element");
7
+ var _a11y = require("../../../helpers/a11y");
8
+ /**
9
+ * Creates the menu renderer function.
10
+ *
11
+ * @private
12
+ * @param {Core} mainTableHot The main table Handsontable instance.
13
+ * @returns {Function}
14
+ */
15
+ function createMenuItemRenderer(mainTableHot) {
16
+ /**
17
+ * Menu item renderer.
18
+ *
19
+ * @private
20
+ * @param {Core} menuHot The Handsontable instance.
21
+ * @param {HTMLCellElement} TD The rendered cell element.
22
+ * @param {number} row The visual index.
23
+ * @param {number} col The visual index.
24
+ * @param {string} prop The column property if used.
25
+ * @param {string} value The cell value.
26
+ */
27
+ return (menuHot, TD, row, col, prop, value) => {
28
+ if (TD.hasAttribute('ghost-table')) {
29
+ return;
30
+ }
31
+ const item = menuHot.getSourceDataAtRow(row);
32
+ const wrapper = mainTableHot.rootDocument.createElement('div');
33
+ const itemValue = typeof value === 'function' ? value.call(mainTableHot) : value;
34
+ (0, _element.empty)(TD);
35
+ (0, _element.addClass)(wrapper, 'htItemWrapper');
36
+ if (mainTableHot.getSettings().ariaTags) {
37
+ const isFocusable = !(0, _utils.isItemDisabled)(item, mainTableHot) && !(0, _utils.isItemSelectionDisabled)(item) && !(0, _utils.isItemSeparator)(item);
38
+ (0, _element.setAttribute)(TD, [(0, _a11y.A11Y_MENU_ITEM)(), (0, _a11y.A11Y_LABEL)(itemValue), ...(isFocusable ? [(0, _a11y.A11Y_TABINDEX)(-1)] : []), ...((0, _utils.isItemDisabled)(item, mainTableHot) ? [(0, _a11y.A11Y_DISABLED)()] : []), ...((0, _utils.isItemSubMenu)(item) ? [(0, _a11y.A11Y_EXPANDED)(false)] : [])]);
39
+ }
40
+ TD.className = '';
41
+ TD.appendChild(wrapper);
42
+ if ((0, _utils.isItemSeparator)(item)) {
43
+ (0, _element.addClass)(TD, 'htSeparator');
44
+ } else if (typeof item.renderer === 'function') {
45
+ (0, _element.addClass)(TD, 'htCustomMenuRenderer');
46
+ TD.appendChild(item.renderer(menuHot, wrapper, row, col, prop, itemValue));
47
+ } else {
48
+ (0, _element.fastInnerHTML)(wrapper, itemValue);
49
+ }
50
+ if ((0, _utils.isItemDisabled)(item, mainTableHot)) {
51
+ (0, _element.addClass)(TD, 'htDisabled');
52
+ } else if ((0, _utils.isItemSelectionDisabled)(item)) {
53
+ (0, _element.addClass)(TD, 'htSelectionDisabled');
54
+ } else if ((0, _utils.isItemSubMenu)(item)) {
55
+ (0, _element.addClass)(TD, 'htSubmenu');
56
+ }
57
+ };
58
+ }
@@ -0,0 +1,54 @@
1
+ import { isItemSubMenu, isItemDisabled, isItemSelectionDisabled, isItemSeparator } from "./utils.mjs";
2
+ import { addClass, empty, fastInnerHTML, setAttribute } from "../../../helpers/dom/element.mjs";
3
+ import { A11Y_DISABLED, A11Y_EXPANDED, A11Y_LABEL, A11Y_MENU_ITEM, A11Y_TABINDEX } from "../../../helpers/a11y.mjs";
4
+ /**
5
+ * Creates the menu renderer function.
6
+ *
7
+ * @private
8
+ * @param {Core} mainTableHot The main table Handsontable instance.
9
+ * @returns {Function}
10
+ */
11
+ export function createMenuItemRenderer(mainTableHot) {
12
+ /**
13
+ * Menu item renderer.
14
+ *
15
+ * @private
16
+ * @param {Core} menuHot The Handsontable instance.
17
+ * @param {HTMLCellElement} TD The rendered cell element.
18
+ * @param {number} row The visual index.
19
+ * @param {number} col The visual index.
20
+ * @param {string} prop The column property if used.
21
+ * @param {string} value The cell value.
22
+ */
23
+ return (menuHot, TD, row, col, prop, value) => {
24
+ if (TD.hasAttribute('ghost-table')) {
25
+ return;
26
+ }
27
+ const item = menuHot.getSourceDataAtRow(row);
28
+ const wrapper = mainTableHot.rootDocument.createElement('div');
29
+ const itemValue = typeof value === 'function' ? value.call(mainTableHot) : value;
30
+ empty(TD);
31
+ addClass(wrapper, 'htItemWrapper');
32
+ if (mainTableHot.getSettings().ariaTags) {
33
+ const isFocusable = !isItemDisabled(item, mainTableHot) && !isItemSelectionDisabled(item) && !isItemSeparator(item);
34
+ setAttribute(TD, [A11Y_MENU_ITEM(), A11Y_LABEL(itemValue), ...(isFocusable ? [A11Y_TABINDEX(-1)] : []), ...(isItemDisabled(item, mainTableHot) ? [A11Y_DISABLED()] : []), ...(isItemSubMenu(item) ? [A11Y_EXPANDED(false)] : [])]);
35
+ }
36
+ TD.className = '';
37
+ TD.appendChild(wrapper);
38
+ if (isItemSeparator(item)) {
39
+ addClass(TD, 'htSeparator');
40
+ } else if (typeof item.renderer === 'function') {
41
+ addClass(TD, 'htCustomMenuRenderer');
42
+ TD.appendChild(item.renderer(menuHot, wrapper, row, col, prop, itemValue));
43
+ } else {
44
+ fastInnerHTML(wrapper, itemValue);
45
+ }
46
+ if (isItemDisabled(item, mainTableHot)) {
47
+ addClass(TD, 'htDisabled');
48
+ } else if (isItemSelectionDisabled(item)) {
49
+ addClass(TD, 'htSelectionDisabled');
50
+ } else if (isItemSubMenu(item)) {
51
+ addClass(TD, 'htSubmenu');
52
+ }
53
+ };
54
+ }
@@ -1,152 +1,27 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
- require("core-js/modules/es.error.cause.js");
4
+ exports.createMenuNavigator = createMenuNavigator;
5
+ var _paginator = require("../../../utils/paginator");
5
6
  var _utils = require("./utils");
6
- function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
7
- function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
8
- function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
9
- function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
10
- function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
11
- function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
12
- function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
13
- function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
14
- function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
15
7
  /**
16
- * Helper class that supports navigating throughout the menu and submenus.
8
+ * Creates navigator for menus and submenus.
17
9
  *
18
- * @private
19
- * @class Navigator
10
+ * @param {Handsontable} hotMenu The Handsontable instance of the menu.
11
+ * @returns {Paginator}
20
12
  */
21
- var _hotMenu = /*#__PURE__*/new WeakMap();
22
- var _current = /*#__PURE__*/new WeakMap();
23
- var _prev = /*#__PURE__*/new WeakMap();
24
- var _visited = /*#__PURE__*/new WeakMap();
25
- var _updateMenuSelection = /*#__PURE__*/new WeakSet();
26
- class Navigator {
27
- constructor() {
28
- /**
29
- * Selects the menu based on the internal state of the class.
30
- */
31
- _classPrivateMethodInitSpec(this, _updateMenuSelection);
32
- /**
33
- * The instance of the Handsontable as menu.
34
- *
35
- * @type {Handsontable}
36
- */
37
- _classPrivateFieldInitSpec(this, _hotMenu, {
38
- writable: true,
39
- value: void 0
40
- });
41
- /**
42
- * The index of the current selected menu item.
43
- *
44
- * @type {number}
45
- */
46
- _classPrivateFieldInitSpec(this, _current, {
47
- writable: true,
48
- value: -1
49
- });
50
- /**
51
- * The index of the previously selected menu item.
52
- *
53
- * @type {number}
54
- */
55
- _classPrivateFieldInitSpec(this, _prev, {
56
- writable: true,
57
- value: -1
58
- });
59
- /**
60
- * The collection of the already visited menu item indexes. The collection allows for preventing
61
- * infinite loops in cases when all menu items are disabled, or there is only one item available
62
- * and the navigation is triggered.
63
- *
64
- * @type {Set<number>}
65
- */
66
- _classPrivateFieldInitSpec(this, _visited, {
67
- writable: true,
68
- value: new Set()
69
- });
70
- }
71
- /**
72
- * Sets the menu Handsontable instance.
73
- *
74
- * @param {Handsontable} hotMenu The menu Handsontable instance.
75
- */
76
- setMenu(hotMenu) {
77
- _classPrivateFieldSet(this, _hotMenu, hotMenu);
78
- }
79
-
80
- /**
81
- * Selects the first menu item in the menu.
82
- */
83
- selectFirst() {
84
- _classPrivateFieldGet(this, _visited).clear();
85
- _classPrivateFieldSet(this, _current, 0);
86
- _classPrivateFieldSet(this, _prev, _classPrivateFieldGet(this, _current) - 1);
87
- _classPrivateMethodGet(this, _updateMenuSelection, _updateMenuSelection2).call(this);
88
- }
89
-
90
- /**
91
- * Selects the last menu item in the menu.
92
- */
93
- selectLast() {
94
- _classPrivateFieldGet(this, _visited).clear();
95
- _classPrivateFieldSet(this, _current, _classPrivateFieldGet(this, _hotMenu).countRows() - 1);
96
- _classPrivateFieldSet(this, _prev, _classPrivateFieldGet(this, _current) + 1);
97
- _classPrivateMethodGet(this, _updateMenuSelection, _updateMenuSelection2).call(this);
98
- }
99
-
100
- /**
101
- * Selects the next menu item in the menu. The navigator tries to select the closes non-disabled menu
102
- * item. When all next items are disabled the first (or next non-disabled) menu item is selected.
103
- */
104
- selectNext() {
105
- _classPrivateFieldGet(this, _visited).clear();
106
- _classPrivateFieldSet(this, _current, _classPrivateFieldGet(this, _current) + 1);
107
- _classPrivateMethodGet(this, _updateMenuSelection, _updateMenuSelection2).call(this);
108
- }
109
-
110
- /**
111
- * Selects the previous menu item in the menu. The navigator tries to select the closes non-disabled menu
112
- * item. When all previous items are disabled the last (or previous non-disabled) menu item is selected.
113
- */
114
- selectPrev() {
115
- _classPrivateFieldGet(this, _visited).clear();
116
- _classPrivateFieldSet(this, _current, _classPrivateFieldGet(this, _current) - 1);
117
- _classPrivateMethodGet(this, _updateMenuSelection, _updateMenuSelection2).call(this);
118
- }
119
-
120
- /**
121
- * Clears the internal state to the initial values.
122
- */
123
- clear() {
124
- _classPrivateFieldGet(this, _visited).clear();
125
- _classPrivateFieldSet(this, _prev, -1);
126
- _classPrivateFieldSet(this, _current, -1);
127
- }
128
- }
129
- exports.Navigator = Navigator;
130
- function _updateMenuSelection2() {
131
- const maxItems = _classPrivateFieldGet(this, _hotMenu).countRows() - 1;
132
- if (_classPrivateFieldGet(this, _current) < 0) {
133
- _classPrivateFieldSet(this, _current, maxItems);
134
- _classPrivateFieldSet(this, _prev, maxItems);
135
- }
136
- if (_classPrivateFieldGet(this, _current) > maxItems) {
137
- _classPrivateFieldSet(this, _current, 0);
138
- _classPrivateFieldSet(this, _prev, -1);
139
- }
140
- if (_classPrivateFieldGet(this, _visited).has(_classPrivateFieldGet(this, _current))) {
141
- return;
142
- }
143
- const cell = _classPrivateFieldGet(this, _hotMenu).getCell(_classPrivateFieldGet(this, _current), 0);
144
- _classPrivateFieldGet(this, _visited).add(_classPrivateFieldGet(this, _current));
145
- if (!cell || (0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {
146
- _classPrivateFieldSet(this, _current, _classPrivateFieldGet(this, _current) + (_classPrivateFieldGet(this, _current) > _classPrivateFieldGet(this, _prev) ? 1 : -1));
147
- _classPrivateMethodGet(this, _updateMenuSelection, _updateMenuSelection2).call(this);
148
- } else {
149
- _classPrivateFieldGet(this, _hotMenu).selectCell(_classPrivateFieldGet(this, _current), 0);
150
- }
151
- _classPrivateFieldSet(this, _prev, _classPrivateFieldGet(this, _current));
13
+ function createMenuNavigator(hotMenu) {
14
+ return (0, _paginator.createPaginator)({
15
+ size: () => hotMenu.countRows(),
16
+ onItemSelect(currentItem, directItemChange) {
17
+ const cell = hotMenu.getCell(currentItem, 0);
18
+ if (!cell || (0, _utils.isSeparator)(cell) || (0, _utils.isDisabled)(cell) || (0, _utils.isSelectionDisabled)(cell)) {
19
+ return false;
20
+ }
21
+ hotMenu.selectCell(currentItem, 0, ...(directItemChange ? [currentItem, 0, false, false] : []));
22
+ },
23
+ onClear() {
24
+ hotMenu.deselectCell();
25
+ }
26
+ });
152
27
  }