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.
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/cellTypes/dateType/dateType.d.ts +3 -3
- package/cellTypes/dateType/dateType.js +2 -2
- package/cellTypes/dateType/dateType.mjs +2 -2
- package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
- package/cellTypes/handsontableType/handsontableType.js +2 -2
- package/cellTypes/handsontableType/handsontableType.mjs +2 -2
- package/core.d.ts +1 -1
- package/core.js +10 -5
- package/core.mjs +10 -5
- package/dataMap/metaManager/metaSchema.js +1 -1
- package/dataMap/metaManager/metaSchema.mjs +1 -1
- package/dist/handsontable.css +13 -12
- package/dist/handsontable.full.css +13 -12
- package/dist/handsontable.full.js +2260 -1403
- package/dist/handsontable.full.min.css +5 -5
- package/dist/handsontable.full.min.js +10 -10
- package/dist/handsontable.js +2260 -1403
- package/dist/handsontable.min.css +5 -5
- package/dist/handsontable.min.js +24 -24
- package/dist/languages/all.js +6 -2
- package/dist/languages/all.min.js +1 -1
- package/dist/languages/en-US.js +3 -1
- package/dist/languages/en-US.min.js +1 -1
- package/dist/languages/pl-PL.js +3 -1
- package/dist/languages/pl-PL.min.js +1 -1
- package/editors/autocompleteEditor/autocompleteEditor.js +1 -1
- package/editors/autocompleteEditor/autocompleteEditor.mjs +1 -1
- package/editors/dateEditor/dateEditor.js +26 -7
- package/editors/dateEditor/dateEditor.mjs +27 -8
- package/editors/handsontableEditor/handsontableEditor.js +7 -0
- package/editors/handsontableEditor/handsontableEditor.mjs +8 -1
- package/helpers/a11y.js +3 -1
- package/helpers/a11y.mjs +2 -1
- package/helpers/mixed.js +1 -1
- package/helpers/mixed.mjs +1 -1
- package/i18n/constants.js +7 -1
- package/i18n/constants.mjs +4 -1
- package/i18n/languages/en-US.js +3 -1
- package/i18n/languages/en-US.mjs +3 -1
- package/i18n/languages/pl-PL.js +3 -1
- package/i18n/languages/pl-PL.mjs +3 -1
- package/languages/all.js +6 -2
- package/languages/en-US.js +3 -1
- package/languages/en-US.mjs +3 -1
- package/languages/index.js +6 -2
- package/languages/pl-PL.js +3 -1
- package/languages/pl-PL.mjs +3 -1
- package/package.json +11 -1
- package/pluginHooks.js +1 -1
- package/pluginHooks.mjs +1 -1
- package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
- package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
- package/plugins/contextMenu/menu/menu.js +87 -151
- package/plugins/contextMenu/menu/menu.mjs +90 -154
- package/plugins/contextMenu/menu/menuItemRenderer.js +58 -0
- package/plugins/contextMenu/menu/menuItemRenderer.mjs +54 -0
- package/plugins/contextMenu/menu/navigator.js +19 -144
- package/plugins/contextMenu/menu/navigator.mjs +18 -143
- package/plugins/contextMenu/menu/shortcuts.js +114 -0
- package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
- package/plugins/dropdownMenu/dropdownMenu.js +32 -4
- package/plugins/dropdownMenu/dropdownMenu.mjs +33 -5
- package/plugins/filters/component/_base.js +23 -8
- package/plugins/filters/component/_base.mjs +23 -8
- package/plugins/filters/component/actionBar.js +29 -27
- package/plugins/filters/component/actionBar.mjs +26 -23
- package/plugins/filters/component/condition.js +46 -59
- package/plugins/filters/component/condition.mjs +40 -52
- package/plugins/filters/component/operators.js +21 -22
- package/plugins/filters/component/operators.mjs +18 -18
- package/plugins/filters/component/value.js +35 -26
- package/plugins/filters/component/value.mjs +32 -22
- package/plugins/filters/filters.js +75 -48
- package/plugins/filters/filters.mjs +68 -41
- package/plugins/filters/menu/focusController.js +123 -0
- package/plugins/filters/menu/focusController.mjs +119 -0
- package/plugins/filters/menu/focusNavigator.js +30 -0
- package/plugins/filters/menu/focusNavigator.mjs +26 -0
- package/plugins/filters/ui/_base.js +35 -13
- package/plugins/filters/ui/_base.mjs +35 -13
- package/plugins/filters/ui/input.js +43 -32
- package/plugins/filters/ui/input.mjs +42 -30
- package/plugins/filters/ui/link.js +44 -12
- package/plugins/filters/ui/link.mjs +44 -11
- package/plugins/filters/ui/multipleSelect.js +234 -129
- package/plugins/filters/ui/multipleSelect.mjs +232 -127
- package/plugins/filters/ui/radioInput.js +42 -18
- package/plugins/filters/ui/radioInput.mjs +42 -17
- package/plugins/filters/ui/select.js +144 -75
- package/plugins/filters/ui/select.mjs +140 -70
- package/renderers/autocompleteRenderer/autocompleteRenderer.js +1 -1
- package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +1 -1
- package/renderers/checkboxRenderer/checkboxRenderer.js +3 -3
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +4 -4
- package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
- package/renderers/dateRenderer/dateRenderer.js +29 -0
- package/renderers/dateRenderer/dateRenderer.mjs +24 -0
- package/renderers/dateRenderer/index.d.ts +1 -0
- package/renderers/dateRenderer/index.js +6 -0
- package/renderers/dateRenderer/index.mjs +1 -0
- package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
- package/renderers/handsontableRenderer/handsontableRenderer.js +29 -0
- package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
- package/renderers/handsontableRenderer/index.d.ts +1 -0
- package/renderers/handsontableRenderer/index.js +6 -0
- package/renderers/handsontableRenderer/index.mjs +1 -0
- package/renderers/index.d.ts +6 -0
- package/renderers/selectRenderer/selectRenderer.js +2 -1
- package/renderers/selectRenderer/selectRenderer.mjs +2 -1
- package/selection/selection.js +2 -2
- package/selection/selection.mjs +2 -2
- package/shortcuts/context.js +3 -2
- package/shortcuts/context.mjs +3 -2
- package/utils/paginator.js +151 -0
- 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 {
|
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,
|
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,
|
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 {
|
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: (
|
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
|
226
|
-
this
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
}
|
232
|
-
|
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.
|
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
|
-
|
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
|
-
*
|
8
|
+
* Creates navigator for menus and submenus.
|
17
9
|
*
|
18
|
-
* @
|
19
|
-
* @
|
10
|
+
* @param {Handsontable} hotMenu The Handsontable instance of the menu.
|
11
|
+
* @returns {Paginator}
|
20
12
|
*/
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
}
|