@elliemae/ds-menu 1.60.0 → 2.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/cjs/Menu.js +191 -39
  2. package/cjs/MenuCombobox.js +38 -80
  3. package/cjs/MenuContext.js +1 -2
  4. package/cjs/MenuItems/CheckboxGroup.js +17 -10
  5. package/cjs/MenuItems/MenuItem.js +199 -36
  6. package/cjs/MenuItems/MenuItemCheckable.js +114 -35
  7. package/cjs/MenuItems/MenuItemCheckbox.js +39 -34
  8. package/cjs/MenuItems/MenuItemRadio.js +36 -35
  9. package/cjs/MenuItems/RadioGroup.js +17 -10
  10. package/cjs/MenuItems/SearchableGroup.js +49 -57
  11. package/cjs/MenuItems/SearchableList.js +35 -51
  12. package/cjs/MenuItems/SelectionGroup.js +103 -36
  13. package/cjs/MenuItems/Separator.js +17 -16
  14. package/cjs/MenuItems/SubMenu.js +199 -36
  15. package/cjs/MenuItems/menuItemFactory.js +67 -36
  16. package/cjs/VirtualMenuList.js +27 -23
  17. package/cjs/index.js +27 -48
  18. package/cjs/utils/useHeightByAmountOfItems.js +8 -9
  19. package/esm/Menu.js +180 -31
  20. package/esm/MenuCombobox.js +33 -74
  21. package/esm/MenuContext.js +0 -1
  22. package/esm/MenuItems/CheckboxGroup.js +15 -7
  23. package/esm/MenuItems/MenuItem.js +191 -31
  24. package/esm/MenuItems/MenuItemCheckable.js +107 -30
  25. package/esm/MenuItems/MenuItemCheckbox.js +33 -30
  26. package/esm/MenuItems/MenuItemRadio.js +31 -30
  27. package/esm/MenuItems/RadioGroup.js +15 -7
  28. package/esm/MenuItems/SearchableGroup.js +48 -55
  29. package/esm/MenuItems/SearchableList.js +34 -47
  30. package/esm/MenuItems/SelectionGroup.js +97 -31
  31. package/esm/MenuItems/Separator.js +14 -13
  32. package/esm/MenuItems/SubMenu.js +190 -31
  33. package/esm/MenuItems/menuItemFactory.js +62 -31
  34. package/esm/VirtualMenuList.js +25 -21
  35. package/esm/index.js +7 -28
  36. package/esm/utils/useHeightByAmountOfItems.js +8 -9
  37. package/package.json +109 -21
  38. package/types/Menu.d.ts +28 -0
  39. package/types/MenuCombobox.d.ts +28 -0
  40. package/types/MenuContext.d.ts +3 -0
  41. package/types/MenuItems/CheckboxGroup.d.ts +32 -0
  42. package/types/MenuItems/MenuItem.d.ts +79 -0
  43. package/types/MenuItems/MenuItemCheckable.d.ts +86 -0
  44. package/types/MenuItems/MenuItemCheckbox.d.ts +6 -0
  45. package/types/MenuItems/MenuItemRadio.d.ts +37 -0
  46. package/types/MenuItems/RadioGroup.d.ts +26 -0
  47. package/types/MenuItems/SearchableGroup.d.ts +18 -0
  48. package/types/MenuItems/SearchableList.d.ts +106 -0
  49. package/types/MenuItems/SelectionGroup.d.ts +98 -0
  50. package/types/MenuItems/Separator.d.ts +34 -0
  51. package/types/MenuItems/SubMenu.d.ts +122 -0
  52. package/types/MenuItems/menuItemFactory.d.ts +3 -0
  53. package/types/VirtualMenuList.d.ts +8 -0
  54. package/types/index.d.ts +13 -0
  55. package/types/tests/Menu.test.d.ts +1 -0
  56. package/types/tests/MenuItem.test.d.ts +1 -0
  57. package/types/utils/useHeightByAmountOfItems.d.ts +5 -0
  58. package/Menu/package.json +0 -10
  59. package/MenuCombobox/package.json +0 -10
  60. package/MenuContext/package.json +0 -10
  61. package/MenuItems/CheckboxGroup/package.json +0 -10
  62. package/MenuItems/MenuItem/package.json +0 -10
  63. package/MenuItems/MenuItemCheckable/package.json +0 -10
  64. package/MenuItems/MenuItemCheckbox/package.json +0 -10
  65. package/MenuItems/MenuItemRadio/package.json +0 -10
  66. package/MenuItems/RadioGroup/package.json +0 -10
  67. package/MenuItems/SearchableGroup/package.json +0 -10
  68. package/MenuItems/SearchableList/package.json +0 -10
  69. package/MenuItems/SelectionGroup/package.json +0 -10
  70. package/MenuItems/Separator/package.json +0 -10
  71. package/MenuItems/SubMenu/package.json +0 -10
  72. package/MenuItems/menuItemFactory/package.json +0 -10
  73. package/VirtualMenuList/package.json +0 -10
  74. package/cjs/Menu.js.map +0 -1
  75. package/cjs/MenuCombobox.js.map +0 -1
  76. package/cjs/MenuContext.js.map +0 -1
  77. package/cjs/MenuItems/CheckboxGroup.js.map +0 -1
  78. package/cjs/MenuItems/MenuItem.js.map +0 -1
  79. package/cjs/MenuItems/MenuItemCheckable.js.map +0 -1
  80. package/cjs/MenuItems/MenuItemCheckbox.js.map +0 -1
  81. package/cjs/MenuItems/MenuItemRadio.js.map +0 -1
  82. package/cjs/MenuItems/RadioGroup.js.map +0 -1
  83. package/cjs/MenuItems/SearchableGroup.js.map +0 -1
  84. package/cjs/MenuItems/SearchableList.js.map +0 -1
  85. package/cjs/MenuItems/SelectionGroup.js.map +0 -1
  86. package/cjs/MenuItems/Separator.js.map +0 -1
  87. package/cjs/MenuItems/SubMenu.js.map +0 -1
  88. package/cjs/MenuItems/menuItemFactory.js.map +0 -1
  89. package/cjs/SubMenu-22be0a18.js +0 -806
  90. package/cjs/SubMenu-22be0a18.js.map +0 -1
  91. package/cjs/VirtualMenuList.js.map +0 -1
  92. package/cjs/index.js.map +0 -1
  93. package/cjs/utils/useHeightByAmountOfItems.js.map +0 -1
  94. package/esm/Menu.js.map +0 -1
  95. package/esm/MenuCombobox.js.map +0 -1
  96. package/esm/MenuContext.js.map +0 -1
  97. package/esm/MenuItems/CheckboxGroup.js.map +0 -1
  98. package/esm/MenuItems/MenuItem.js.map +0 -1
  99. package/esm/MenuItems/MenuItemCheckable.js.map +0 -1
  100. package/esm/MenuItems/MenuItemCheckbox.js.map +0 -1
  101. package/esm/MenuItems/MenuItemRadio.js.map +0 -1
  102. package/esm/MenuItems/RadioGroup.js.map +0 -1
  103. package/esm/MenuItems/SearchableGroup.js.map +0 -1
  104. package/esm/MenuItems/SearchableList.js.map +0 -1
  105. package/esm/MenuItems/SelectionGroup.js.map +0 -1
  106. package/esm/MenuItems/Separator.js.map +0 -1
  107. package/esm/MenuItems/SubMenu.js.map +0 -1
  108. package/esm/MenuItems/menuItemFactory.js.map +0 -1
  109. package/esm/SubMenu-a25e69ec.js +0 -778
  110. package/esm/SubMenu-a25e69ec.js.map +0 -1
  111. package/esm/VirtualMenuList.js.map +0 -1
  112. package/esm/index.js.map +0 -1
  113. package/esm/utils/useHeightByAmountOfItems.js.map +0 -1
  114. package/utils/useHeightByAmountOfItems/package.json +0 -10
@@ -1,806 +0,0 @@
1
- 'use strict';
2
-
3
- var _extends = require('@babel/runtime/helpers/extends');
4
- var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
- var React = require('react');
6
- var reactDesc = require('react-desc');
7
- var dsIcons = require('@elliemae/ds-icons');
8
- var FocusGroup = require('@elliemae/ds-shared/FocusGroup');
9
- var dsHidden = require('@elliemae/ds-hidden');
10
- var DSButton = require('@elliemae/ds-button');
11
- var DSPopper = require('@elliemae/ds-popper');
12
- var styled = require('styled-components');
13
- var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
14
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
15
- var lodash = require('lodash');
16
- var dsClassnames = require('@elliemae/ds-classnames');
17
- var web_cjs = require('react-spring/web.cjs');
18
- var dsUtilities = require('@elliemae/ds-utilities');
19
- var DSTruncatedTooltipText = require('@elliemae/ds-truncated-tooltip-text');
20
- var MenuItems_Separator = require('./MenuItems/Separator.js');
21
- var CheckableGroup = require('@elliemae/ds-shared/CheckableGroup');
22
- var MenuItems_SearchableGroup = require('./MenuItems/SearchableGroup.js');
23
- var VirtualMenuList = require('./VirtualMenuList.js');
24
- var dsForm = require('@elliemae/ds-form');
25
- var MenuContext = require('./MenuContext.js');
26
- var MenuItems_CheckboxGroup = require('./MenuItems/CheckboxGroup.js');
27
- var MenuItems_RadioGroup = require('./MenuItems/RadioGroup.js');
28
-
29
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
30
-
31
- var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
32
- var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
33
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
34
- var DSButton__default = /*#__PURE__*/_interopDefaultLegacy(DSButton);
35
- var DSPopper__default = /*#__PURE__*/_interopDefaultLegacy(DSPopper);
36
- var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
37
- var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
38
- var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
39
- var DSTruncatedTooltipText__default = /*#__PURE__*/_interopDefaultLegacy(DSTruncatedTooltipText);
40
-
41
- var noop$2 = function noop() {
42
- return null;
43
- };
44
-
45
- function SelectionGroup(_ref) {
46
- var _ref$multi = _ref.multi,
47
- multi = _ref$multi === void 0 ? false : _ref$multi,
48
- _ref$searchable = _ref.searchable,
49
- searchable = _ref$searchable === void 0 ? false : _ref$searchable,
50
- _ref$focusOnOpen = _ref.focusOnOpen,
51
- focusOnOpen = _ref$focusOnOpen === void 0 ? false : _ref$focusOnOpen,
52
- _ref$onSelect = _ref.onSelect,
53
- onSelect = _ref$onSelect === void 0 ? noop$2 : _ref$onSelect,
54
- children = _ref.children,
55
- _ref$items = _ref.items,
56
- items = _ref$items === void 0 ? undefined : _ref$items,
57
- _ref$active = _ref.active,
58
- active = _ref$active === void 0 ? multi ? [] : '' : _ref$active,
59
- width = _ref.width,
60
- height = _ref.height;
61
- var renderedItems = React.useMemo(function () {
62
- return items && items.map(function (item) {
63
- var Component = menuItemFactory(multi ? 'checkbox' : 'radio');
64
- return /*#__PURE__*/React__default['default'].createElement(Component, _extends__default['default']({}, item, {
65
- key: item.name || item.id || item.key,
66
- item: item,
67
- name: item.id || item.name
68
- }));
69
- });
70
- }, [items]);
71
- var decoratedGroupChildren = CheckableGroup.useCheckableGroup({
72
- children: renderedItems || children,
73
- multi: multi,
74
- active: active,
75
- onCheck: onSelect
76
- });
77
-
78
- if (searchable) {
79
- return /*#__PURE__*/React__default['default'].createElement(MenuItems_SearchableGroup['default'], {
80
- focusOnOpen: focusOnOpen,
81
- height: height,
82
- items: items,
83
- width: width
84
- }, decoratedGroupChildren);
85
- }
86
-
87
- return /*#__PURE__*/React__default['default'].createElement(VirtualMenuList, {
88
- height: height,
89
- items: decoratedGroupChildren,
90
- width: width
91
- });
92
- }
93
-
94
- var props$5 = {
95
- /** toggle on multi select */
96
- multi: reactDesc.PropTypes.bool.description('toggle on multi select'),
97
-
98
- /** toggle on searchable behavior */
99
- searchable: reactDesc.PropTypes.bool.description('toggle on searchable behavior'),
100
-
101
- /** toggle to focus component on open */
102
- focusOnOpen: reactDesc.PropTypes.bool.description('toggle to focus component on open'),
103
-
104
- /** callback that triggers when select happens */
105
- onSelect: reactDesc.PropTypes.func.description('callback that triggers when select happens'),
106
- children: reactDesc.PropTypes.node.description(''),
107
-
108
- /** selection group items */
109
- items: reactDesc.PropTypes.array.description('selection group items'),
110
-
111
- /** array of values for multi and string for single selection */
112
- active: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.string, reactDesc.PropTypes.array]).description('array of values for multi and string for single selection'),
113
-
114
- /** selection group width */
115
- width: reactDesc.PropTypes.number.description('selection group width'),
116
-
117
- /** selection group height */
118
- height: reactDesc.PropTypes.number.description('selection group height')
119
- };
120
- SelectionGroup.propTypes = props$5;
121
- var DSMenuSelectionGroupWithSchema = reactDesc.describe(SelectionGroup);
122
- DSMenuSelectionGroupWithSchema.propTypes = props$5;
123
-
124
- var _excluded$3 = ["checked"];
125
-
126
- function MenuItemCheckbox(_ref) {
127
- var checked = _ref.checked,
128
- rest = _objectWithoutProperties__default['default'](_ref, _excluded$3);
129
-
130
- return /*#__PURE__*/React__default['default'].createElement(MenuItemCheckable, _extends__default['default']({}, rest, {
131
- leftAddon: /*#__PURE__*/React__default['default'].createElement(dsForm.DSCheckbox, {
132
- checked: checked
133
- }),
134
- role: "menuitemcheckbox"
135
- }));
136
- }
137
-
138
- var itemTypes = {
139
- separator: MenuItems_Separator['default'],
140
- menuitem: MenuItem,
141
- radio: MenuItemRadio,
142
- checkbox: MenuItemCheckbox,
143
- submenu: SubMenu,
144
- 'selection-group': SelectionGroup
145
- };
146
- var fallback = {
147
- SelectionGroup: 'selection-group'
148
- };
149
- function menuItemFactory() {
150
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
151
- var items = arguments.length > 1 ? arguments[1] : undefined;
152
- var defaultItem = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : itemTypes.menuitem;
153
- var itemsObject = items || itemTypes;
154
- var parsedType = fallback[type] || type.toLowerCase();
155
- return itemsObject[parsedType] || defaultItem;
156
- }
157
- function renderMenuItems(options) {
158
- var factory = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : menuItemFactory;
159
- return options.map(function (option, index) {
160
- if (dsUtilities.isFunction(option.renderer)) {
161
- return option.renderer({
162
- key: option.id,
163
- item: option
164
- });
165
- }
166
-
167
- var ItemComponent = factory(option.type);
168
- var children = option.subItems && renderMenuItems(option.subItems, factory);
169
- return /*#__PURE__*/React__default['default'].createElement(ItemComponent, _extends__default['default']({}, option, {
170
- key: option.id || index,
171
- item: option,
172
- onClick: null,
173
- onMouseDown: option.onClick // onClick callback called in onMouseDown due to events order issue
174
-
175
- }), children);
176
- });
177
- }
178
-
179
- var _excluded$2 = ["innerRef", "as", "role", "leftAddon", "rightAddon", "disabledAddonInactive", "label", "children", "tabIndex", "onKeyDown", "fixedItem", "noAddon", "disabled", "customRenderer", "maxOption", "closeMenu", "style"];
180
-
181
- var noop$1 = function noop() {
182
- return null;
183
- };
184
-
185
- var blockName$1 = 'menu-item';
186
- var Content = dsClassnames.aggregatedClasses('div')(blockName$1, 'content');
187
- var Addon = dsClassnames.aggregatedClasses('div')(blockName$1, 'addon', function (_ref) {
188
- var empty = _ref.empty,
189
- fixedItem = _ref.fixedItem;
190
- return {
191
- empty: empty,
192
- fixedItem: fixedItem
193
- };
194
- });
195
-
196
- var renderAddon = function renderAddon(addon, fixedItem, addonId) {
197
- return /*#__PURE__*/React__default['default'].createElement(Addon, {
198
- key: addonId,
199
- classProps: {
200
- fixedItem: fixedItem
201
- }
202
- }, addon);
203
- };
204
-
205
- var renderAddons = function renderAddons(addons, fixedItem) {
206
- return Array.isArray(addons) ? addons.map(renderAddon) : renderAddon(addons, fixedItem);
207
- };
208
-
209
- var Wrapper = dsClassnames.aggregatedClasses('li')(blockName$1, null, function (_ref2) {
210
- var disabled = _ref2.disabled,
211
- disabledAddonInactive = _ref2.disabledAddonInactive,
212
- customRenderer = _ref2.customRenderer,
213
- fixedItem = _ref2.fixedItem,
214
- type = _ref2.type;
215
- return _defineProperty__default['default']({
216
- disabled: disabled,
217
- disabledAddonInactive: disabledAddonInactive,
218
- customRenderer: customRenderer,
219
- fixedItem: fixedItem
220
- }, "menu-type-".concat(type), type);
221
- });
222
-
223
- var calculateSize = function calculateSize() {
224
- var length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
225
- if (length > 45) return 45 * 7;
226
- return length * 7;
227
- };
228
-
229
- function MenuItem(props) {
230
- var innerRef = props.innerRef,
231
- _props$as = props.as,
232
- as = _props$as === void 0 ? 'li' : _props$as,
233
- _props$role = props.role,
234
- role = _props$role === void 0 ? 'menuitem' : _props$role,
235
- _props$leftAddon = props.leftAddon,
236
- leftAddon = _props$leftAddon === void 0 ? null : _props$leftAddon,
237
- _props$rightAddon = props.rightAddon,
238
- rightAddon = _props$rightAddon === void 0 ? undefined : _props$rightAddon,
239
- _props$disabledAddonI = props.disabledAddonInactive,
240
- disabledAddonInactive = _props$disabledAddonI === void 0 ? undefined : _props$disabledAddonI,
241
- _props$label = props.label,
242
- label = _props$label === void 0 ? undefined : _props$label,
243
- children = props.children,
244
- _props$tabIndex = props.tabIndex,
245
- tabIndex = _props$tabIndex === void 0 ? -1 : _props$tabIndex,
246
- _props$onKeyDown = props.onKeyDown,
247
- onKeyDown = _props$onKeyDown === void 0 ? noop$1 : _props$onKeyDown,
248
- _props$fixedItem = props.fixedItem,
249
- fixedItem = _props$fixedItem === void 0 ? false : _props$fixedItem,
250
- noAddon = props.noAddon,
251
- _props$disabled = props.disabled,
252
- disabled = _props$disabled === void 0 ? false : _props$disabled,
253
- customRenderer = props.customRenderer,
254
- maxOption = props.maxOption;
255
- props.closeMenu;
256
- var style = props.style,
257
- otherProps = _objectWithoutProperties__default['default'](props, _excluded$2);
258
-
259
- var menuCxt = React.useContext(MenuContext);
260
- var ref = React.useRef(null);
261
- FocusGroup.useFocusGroupItem(ref);
262
-
263
- if (otherProps.subItems) {
264
- return /*#__PURE__*/React__default['default'].createElement(SubMenu, _extends__default['default']({}, props, {
265
- closeMenu: menuCxt.closeMenu
266
- }), renderMenuItems(otherProps.subItems));
267
- }
268
-
269
- var wrapperProps = React.useMemo(function () {
270
- return lodash.omit(otherProps, ['icon']);
271
- }, [otherProps]);
272
-
273
- var onClick = function onClick() {
274
- if (wrapperProps.onClick) wrapperProps.onClick.apply(wrapperProps, arguments);
275
-
276
- if (wrapperProps.closeOnClick && menuCxt.closeMenu) {
277
- menuCxt.closeMenu.apply(menuCxt, arguments);
278
- }
279
- };
280
-
281
- return /*#__PURE__*/React__default['default'].createElement(Wrapper, _extends__default['default']({
282
- as: as,
283
- classProps: {
284
- disabled: disabled,
285
- disabledAddonInactive: disabledAddonInactive,
286
- customRenderer: customRenderer,
287
- fixedItem: fixedItem,
288
- type: otherProps.type
289
- },
290
- id: otherProps.id,
291
- innerRef: otherProps.type !== 'disabled' ? dsUtilities.mergeRefs(innerRef, ref) : innerRef,
292
- onKeyDown: !fixedItem && dsUtilities.runAll(function (e) {
293
- if (e.key === ' ' || e.key === 'Enter') {
294
- e.preventDefault();
295
- e.target.dispatchEvent(new MouseEvent('click', {
296
- view: window,
297
- bubbles: true,
298
- cancelable: false
299
- }));
300
- }
301
- }, onKeyDown),
302
- role: role,
303
- style: style,
304
- tabIndex: tabIndex
305
- }, wrapperProps, {
306
- onClick: onClick
307
- }), !noAddon && renderAddons(leftAddon, fixedItem), label && /*#__PURE__*/React__default['default'].createElement(Content, {
308
- style: maxOption > 0 ? {
309
- width: "".concat(calculateSize(maxOption), "px"),
310
- maxWidth: "".concat(calculateSize(maxOption), "px")
311
- } : undefined
312
- }, /*#__PURE__*/React__default['default'].createElement(DSTruncatedTooltipText__default['default'], {
313
- value: label
314
- })), customRenderer, rightAddon && renderAddons(rightAddon), children);
315
- }
316
-
317
- var props$4 = {
318
- /** Renders the MenuItem with a specific html element */
319
- as: reactDesc.PropTypes.element.description('Renders the MenuItem with a specific html element'),
320
-
321
- /**
322
- * reference to the component
323
- */
324
- innerRef: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.func, reactDesc.PropTypes.shape({
325
- current: reactDesc.PropTypes.any
326
- })]).description('reference to the component'),
327
-
328
- /** Renders the passed element to the left */
329
- leftAddon: reactDesc.PropTypes.element.description('Renders the passed element to the left'),
330
-
331
- /** Renders the passed element to the right */
332
- rightAddon: reactDesc.PropTypes.element.description('Renders the passed element to the right'),
333
-
334
- /** Label for the menu item */
335
- label: reactDesc.PropTypes.string.description('Label for the menu item'),
336
-
337
- /** style object for menu item wrapper */
338
- style: reactDesc.PropTypes.object.description('style object for menu item wrapper'),
339
-
340
- /** disable menu item */
341
- disabled: reactDesc.PropTypes.bool.description('disable menu item'),
342
-
343
- /** HTML tabindex to manage focus order */
344
- tabindex: reactDesc.PropTypes.number.description('HTML tabindex to manage focus order'),
345
-
346
- /** a11y role */
347
- role: reactDesc.PropTypes.string.description('a11y role')
348
- };
349
- MenuItem.propTypes = props$4;
350
- var DSMenuItemWithSchema = reactDesc.describe(MenuItem);
351
- DSMenuItemWithSchema.propTypes = props$4;
352
-
353
- var _excluded$1 = ["role", "checked", "name", "checkIcon", "children", "leftAddon", "item"];
354
-
355
- function useCheckable(_ref) {
356
- var checked = _ref.checked;
357
- return {
358
- checked: checked,
359
- 'aria-checked': checked
360
- };
361
- }
362
- /**
363
- * Reuses the same props as the MenuItem
364
- *
365
- * @param root0
366
- * @param root0.role
367
- * @param root0.checked
368
- * @param root0.name
369
- * @param root0.checkIcon
370
- * @param root0.children
371
- * @param root0.leftAddon
372
- * @param root0.item
373
- */
374
-
375
-
376
- function MenuItemCheckable(_ref2) {
377
- var _ref2$role = _ref2.role,
378
- role = _ref2$role === void 0 ? 'menuitemcheckbox' : _ref2$role,
379
- _ref2$checked = _ref2.checked,
380
- checked = _ref2$checked === void 0 ? false : _ref2$checked,
381
- _ref2$name = _ref2.name,
382
- name = _ref2$name === void 0 ? '' : _ref2$name,
383
- _ref2$checkIcon = _ref2.checkIcon,
384
- checkIcon = _ref2$checkIcon === void 0 ? /*#__PURE__*/React__default['default'].createElement(dsIcons.Checkmark, {
385
- color: ['brand-primary', 600]
386
- }) : _ref2$checkIcon;
387
- _ref2.children;
388
- var leftAddon = _ref2.leftAddon,
389
- _ref2$item = _ref2.item,
390
- item = _ref2$item === void 0 ? undefined : _ref2$item,
391
- otherProps = _objectWithoutProperties__default['default'](_ref2, _excluded$1);
392
-
393
- var checkableProps = useCheckable({
394
- checked: checked,
395
- name: name
396
- });
397
-
398
- var handleClick = function handleClick() {
399
- return dsUtilities.runAll(otherProps.onClick, checkableProps.onClick)({
400
- target: {
401
- value: name,
402
- checked: checked
403
- }
404
- }, item);
405
- };
406
-
407
- var checkAddon = leftAddon || (checkableProps.checked ? /*#__PURE__*/React__default['default'].createElement("div", {
408
- className: "checkable-mark"
409
- }, checkIcon) : /*#__PURE__*/React__default['default'].createElement("div", null));
410
- return /*#__PURE__*/React__default['default'].createElement(MenuItem, _extends__default['default']({}, item, otherProps, checkableProps, {
411
- customRenderer: item && item.customRenderer ? item.customRenderer : function () {},
412
- items: otherProps.subItems,
413
- leftAddon: checkAddon,
414
- onClick: handleClick,
415
- role: role
416
- }));
417
- }
418
-
419
- var props$3 = {
420
- /** Whether the item is checked or not */
421
- checked: reactDesc.PropTypes.bool.description('Whether the item is checked or not'),
422
-
423
- /** A custom item when the item is checked */
424
- checkIcon: reactDesc.PropTypes.element.description('A custom item when the item is checked'),
425
-
426
- /** form field name */
427
- name: reactDesc.PropTypes.string.description('form field name'),
428
-
429
- /** menu item object props */
430
- item: reactDesc.PropTypes.object.description('menu item object props'),
431
-
432
- /** a11y role */
433
- role: reactDesc.PropTypes.string.description('a11y role'),
434
-
435
- /** left addon component */
436
- leftAddon: reactDesc.PropTypes.node.description('left addon component')
437
- };
438
- MenuItemCheckable.propTypes = props$3;
439
- var DSMenuItemCheckeableWithSchema = reactDesc.describe(MenuItemCheckable);
440
- DSMenuItemCheckeableWithSchema.propTypes = props$3;
441
-
442
- function MenuItemRadio(props) {
443
- return /*#__PURE__*/React__default['default'].createElement(MenuItemCheckable, _extends__default['default']({}, props, {
444
- role: "menuitemradio"
445
- }));
446
- }
447
-
448
- var props$2 = {
449
- /** Whether the item is checked or not */
450
- checked: reactDesc.PropTypes.bool.description('Whether the item is checked or not'),
451
-
452
- /** A custom item when the item is checked */
453
- checkIcon: reactDesc.PropTypes.element.description('A custom item when the item is checked')
454
- };
455
- MenuItemRadio.propTypes = props$2;
456
- var DSMenuItemRadioWithSchema = reactDesc.describe(MenuItemCheckable);
457
- DSMenuItemRadioWithSchema.propTypes = props$2;
458
-
459
- var _excluded = ["containerProps", "innerRef", "as", "children", "onClickOutside", "visible", "focusOnOpen", "maxOption", "style", "minWidth", "maxWidth", "closeMenu", "responsiveHeight"],
460
- _excluded2 = ["destroyed"];
461
-
462
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
463
-
464
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default['default'](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
465
- var RESPONSIVE_HEIHGT_MARGIN = 120;
466
- var blockName = 'menu';
467
-
468
- var noop = function noop() {};
469
-
470
- var MenuComponent = dsClassnames.aggregatedClasses('div')(blockName, '', function (_ref) {
471
- var menuComboBox = _ref.menuComboBox,
472
- type = _ref.type;
473
- return _defineProperty__default['default']({
474
- 'menu-combo-box': menuComboBox
475
- }, "type-".concat(type), type);
476
- });
477
- /**
478
- * todo: -- IDEA -- each menu could have an overlay based on an overlay stack context so we can
479
- * capture the context of the clicks on very nested components
480
- */
481
-
482
- var isChildOfType = function isChildOfType(child, type) {
483
- return child.type.name === type;
484
- };
485
-
486
- function DSMenu(_ref3) {
487
- var _ref3$containerProps = _ref3.containerProps,
488
- containerProps = _ref3$containerProps === void 0 ? {} : _ref3$containerProps,
489
- innerRef = _ref3.innerRef,
490
- _ref3$as = _ref3.as,
491
- MenuTag = _ref3$as === void 0 ? web_cjs.animated.ul : _ref3$as,
492
- _ref3$children = _ref3.children,
493
- children = _ref3$children === void 0 ? undefined : _ref3$children,
494
- _ref3$onClickOutside = _ref3.onClickOutside,
495
- onClickOutside = _ref3$onClickOutside === void 0 ? noop : _ref3$onClickOutside,
496
- _ref3$visible = _ref3.visible,
497
- visible = _ref3$visible === void 0 ? undefined : _ref3$visible,
498
- _ref3$focusOnOpen = _ref3.focusOnOpen,
499
- focusOnOpen = _ref3$focusOnOpen === void 0 ? false : _ref3$focusOnOpen,
500
- _ref3$maxOption = _ref3.maxOption,
501
- maxOption = _ref3$maxOption === void 0 ? 0 : _ref3$maxOption,
502
- _ref3$style = _ref3.style,
503
- style = _ref3$style === void 0 ? {} : _ref3$style,
504
- _ref3$minWidth = _ref3.minWidth,
505
- minWidth = _ref3$minWidth === void 0 ? undefined : _ref3$minWidth,
506
- _ref3$maxWidth = _ref3.maxWidth,
507
- maxWidth = _ref3$maxWidth === void 0 ? undefined : _ref3$maxWidth,
508
- closeMenu = _ref3.closeMenu,
509
- _ref3$responsiveHeigh = _ref3.responsiveHeight,
510
- responsiveHeight = _ref3$responsiveHeigh === void 0 ? false : _ref3$responsiveHeigh,
511
- otherProps = _objectWithoutProperties__default['default'](_ref3, _excluded);
512
-
513
- var menuRef = React.useRef(null);
514
-
515
- var _useContext = React.useContext(FocusGroup.FocusGroupContext),
516
- focusFirst = _useContext.focusFirst;
517
-
518
- var _useHiddenTransition = dsHidden.useHiddenTransition({
519
- visible: visible,
520
- style: style
521
- });
522
- _useHiddenTransition.destroyed;
523
- var hiddenProps = _objectWithoutProperties__default['default'](_useHiddenTransition, _excluded2); // force no addon to the children if the menu doesn't have any item with leftAddon like SelectionGroup
524
-
525
-
526
- var nextChildren = React.useMemo(function () {
527
- var forceLeftAddon = React__default['default'].Children.toArray(children).some(function (child) {
528
- return isChildOfType(child, 'SelectionGroup') || isChildOfType(child, 'MenuItemCheckbox') || isChildOfType(child, 'MenuItemRadio') || child.props.leftAddon;
529
- });
530
- return React__default['default'].Children.map(children, function (child) {
531
- return child && /*#__PURE__*/React__default['default'].cloneElement(child, _objectSpread(_objectSpread({}, child.props), {}, {
532
- noAddon: !forceLeftAddon ? true : undefined,
533
- maxOption: maxOption,
534
- closeMenu: closeMenu
535
- }));
536
- });
537
- }, [children]);
538
- dsUtilities.useOnClickOutside(menuRef, onClickOutside);
539
- React.useEffect(function () {
540
- if (focusOnOpen && visible) {
541
- setTimeout(function () {
542
- focusFirst();
543
- }, 0);
544
- }
545
- }, [visible, focusOnOpen]); // todo: find out a better approach to this
546
-
547
- return !hiddenProps.destroyed ? /*#__PURE__*/React__default['default'].createElement(MenuContext.Provider, {
548
- value: {
549
- visible: visible,
550
- closeMenu: closeMenu
551
- }
552
- }, /*#__PURE__*/React__default['default'].createElement(MenuComponent, _extends__default['default']({
553
- "data-testid": containerProps !== null && containerProps !== void 0 && containerProps['data-testid'] ? containerProps['data-testid'] : "em-ds-menu"
554
- }, containerProps, {
555
- as: MenuTag,
556
- classProps: _objectSpread(_objectSpread({}, otherProps.classProps || {}), {}, {
557
- type: otherProps.type
558
- }),
559
- innerRef: dsUtilities.mergeRefs(innerRef, menuRef),
560
- role: "menu"
561
- }, lodash.omit(otherProps, ['scheduleUpdate']), hiddenProps), /*#__PURE__*/React__default['default'].createElement("div", {
562
- className: "menu-component-internal-wrapper",
563
- style: _objectSpread(_objectSpread({}, style), {}, {
564
- minWidth: minWidth,
565
- maxWidth: maxWidth
566
- }, responsiveHeight ? {
567
- overflowY: 'scroll',
568
- maxHeight: responsiveHeight ? "".concat(window.innerHeight - RESPONSIVE_HEIHGT_MARGIN, "px") : undefined
569
- } : {})
570
- }, nextChildren))) : null;
571
- }
572
-
573
- var Menu = FocusGroup.focusGroupManagerHoc(DSMenu, {
574
- loop: true
575
- });
576
- var props$1 = {
577
- /** Injected props to wrapper element of component */
578
- containerProps: reactDesc.PropTypes.object.description('Injected props to wrapper element of component'),
579
-
580
- /** Renders the menu with a specific html element */
581
- as: reactDesc.PropTypes.element.description('Renders the menu with a specific html element'),
582
-
583
- /** Handler when a user clicks outside the menu */
584
- onClickOutside: reactDesc.PropTypes.func.description('Handler when a user clicks outside the menu'),
585
-
586
- /** Whether the menu is visible or not */
587
- visible: reactDesc.PropTypes.bool.description('Whether the menu is visible or not'),
588
-
589
- /** When set to true, it's going to focus the first item */
590
- focusOnOpen: reactDesc.PropTypes.bool.description("When set to true, it's going to focus the first item"),
591
-
592
- /** Customize menu minWidth. Can be undefined or 'number' */
593
- minWidth: reactDesc.PropTypes.number.description("Customize menu minWidth. Can be undefined or 'number'"),
594
-
595
- /** Customize menu maxWidth. Can be undefined or 'number' */
596
- maxWidth: reactDesc.PropTypes.number.description("Customize menu maxWidth. Can be undefined or 'number'")
597
- };
598
- DSMenu.propTypes = props$1;
599
- var DSMenuWithSchema = reactDesc.describe(DSMenu);
600
- DSMenuWithSchema.propTypes = props$1; // todo: add a handler to get this kind of exports for documentation
601
-
602
- Menu.Item = MenuItem;
603
- Menu.ItemCheckbox = MenuItemCheckbox;
604
- Menu.ItemRadio = MenuItemRadio;
605
- Menu.SubMenu = SubMenu;
606
- Menu.Separator = MenuItems_Separator['default'];
607
- Menu.CheckboxGroup = MenuItems_CheckboxGroup['default'];
608
- Menu.RadioGroup = MenuItems_RadioGroup['default'];
609
- Menu.SearchableGroup = MenuItems_SearchableGroup['default'];
610
- Menu.SelectionGroup = SelectionGroup;
611
-
612
- var ChevronRightComp = /*#__PURE__*/styled__default['default'].div.withConfig({
613
- componentId: "sc-1qhp1z-0"
614
- })(["display:flex;justify-content:center;align-items:center;width:28px;"]);
615
-
616
- function SubMenu(_ref) {
617
- var noAddon = _ref.noAddon,
618
- _ref$leftAddon = _ref.leftAddon,
619
- leftAddon = _ref$leftAddon === void 0 ? undefined : _ref$leftAddon,
620
- _ref$label = _ref.label,
621
- label = _ref$label === void 0 ? undefined : _ref$label,
622
- _ref$interactionType = _ref.interactionType,
623
- interactionType = _ref$interactionType === void 0 ? 'hover' : _ref$interactionType,
624
- subitems = _ref.children,
625
- rightAddonType = _ref.rightAddonType,
626
- disabledAddonInactive = _ref.disabledAddonInactive,
627
- _ref$checkableProps = _ref.checkableProps,
628
- checkableProps = _ref$checkableProps === void 0 ? {} : _ref$checkableProps,
629
- customRenderer = _ref.customRenderer,
630
- onClick = _ref.onClick,
631
- closeMenu = _ref.closeMenu,
632
- id = _ref.id;
633
- var itemRef = React.useRef(null);
634
- var focusOnOpen = React.useRef(false);
635
-
636
- var _useState = React.useState(false),
637
- _useState2 = _slicedToArray__default['default'](_useState, 2),
638
- isAddonHovered = _useState2[0],
639
- setIsAddonHovered = _useState2[1];
640
-
641
- var _useHiddenController = dsHidden.useHiddenController(undefined, {
642
- interaction: 'click'
643
- }),
644
- _useHiddenController$ = _useHiddenController.visible,
645
- visible = _useHiddenController$ === void 0 ? false : _useHiddenController$,
646
- onShow = _useHiddenController.onShow,
647
- onHide = _useHiddenController.onHide;
648
-
649
- var interaction = rightAddonType === 'elipsis' ? 'click' : 'hover';
650
-
651
- var _useFocusGroupItem = FocusGroup.useFocusGroupItem(),
652
- focusItemByNode = _useFocusGroupItem.focusItemByNode; // todo: create a menu state to handle all related menu things
653
-
654
-
655
- var handleShowSubItemsWithMouse = function handleShowSubItemsWithMouse(e) {
656
- e.stopPropagation();
657
- onShow();
658
- focusOnOpen.current = true;
659
- };
660
-
661
- var handleShowWithMouse = function handleShowWithMouse(e) {
662
- if (onClick) onClick(e);
663
- };
664
-
665
- var handleShowWithMouseHover = function handleShowWithMouseHover() {
666
- setIsAddonHovered(true);
667
- onShow();
668
- focusOnOpen.current = false;
669
- };
670
-
671
- var handleShowWithKeyboard = function handleShowWithKeyboard() {
672
- onShow();
673
- focusOnOpen.current = true;
674
- };
675
-
676
- var handleOnMouseEnter = React.useCallback(function () {
677
- setIsAddonHovered(true);
678
- }, []);
679
- var handleOnMouseLeave = React.useCallback(function () {
680
- setIsAddonHovered(false);
681
- }, []);
682
- var hoverHandlers = interaction === 'hover' ? {
683
- onMouseEnter: handleShowWithMouseHover,
684
- onMouseLeave: function onMouseLeave() {
685
- onHide();
686
- setIsAddonHovered(false);
687
- }
688
- } : {
689
- onClick: handleShowWithMouse
690
- };
691
- var rightAddon = rightAddonType === 'elipsis' ? /*#__PURE__*/React__default['default'].createElement(DSButton__default['default'], {
692
- "aria-label": "vertical-elipsis",
693
- "data-testid": "vertical-elipsis",
694
- buttonType: "text",
695
- leftIcon: /*#__PURE__*/React__default['default'].createElement(dsIcons.MoreOptionsVert, {
696
- className: "submenu-arrow",
697
- color: visible || isAddonHovered ? ['brand-primary', 800] : ['neutral', 500],
698
- size: "s"
699
- }),
700
- onClick: function onClick(e) {
701
- return handleShowSubItemsWithMouse(e);
702
- },
703
- size: "m",
704
- variant: DSButton.BUTTON_VARIANT.DEFAULT
705
- }) : /*#__PURE__*/React__default['default'].createElement(ChevronRightComp, null, /*#__PURE__*/React__default['default'].createElement(dsIcons.ChevronSmallRight, {
706
- "data-testid": "chevron-right",
707
- className: "submenu-arrow",
708
- color: visible || isAddonHovered ? ['brand-primary', 800] : ['neutral', 500],
709
- size: "sm"
710
- }));
711
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(DSPopper__default['default'], {
712
- contentComponent: /*#__PURE__*/React__default['default'].createElement(Menu, _extends__default['default']({
713
- focusKeyBindings: {
714
- ArrowLeft: [function () {
715
- return focusItemByNode(itemRef.current);
716
- }, 'exit']
717
- },
718
- focusOnOpen: focusOnOpen.current,
719
- onExitFocusGroup: onHide
720
- }, hoverHandlers, {
721
- closeMenu: closeMenu,
722
- visible: visible
723
- }), subitems),
724
- interactionType: interactionType,
725
- isOpen: visible,
726
- onOpen: function onOpen(opening) {
727
- return opening ? onShow() : onHide();
728
- },
729
- placement: "right-start",
730
- showArrow: false,
731
- triggerComponent: /*#__PURE__*/React__default['default'].createElement(MenuItem, _extends__default['default']({
732
- customRenderer: customRenderer,
733
- disabledAddonInactive: disabledAddonInactive,
734
- id: id,
735
- innerRef: itemRef,
736
- label: label,
737
- leftAddon: leftAddon,
738
- noAddon: noAddon,
739
- onFocus: handleOnMouseEnter,
740
- onBlur: handleOnMouseLeave,
741
- onMouseEnter: handleOnMouseEnter,
742
- onMouseLeave: handleOnMouseLeave
743
- }, hoverHandlers, {
744
- onKeyDown: function onKeyDown(e) {
745
- if (e.key === 'ArrowRight' || e.key === 'Enter' || e.keyCode === 32) {
746
- handleShowWithKeyboard();
747
- }
748
- },
749
- rightAddon: rightAddon
750
- }, checkableProps))
751
- }));
752
- }
753
-
754
- var props = {
755
- /** dont show addon for submenu */
756
- noAddon: reactDesc.PropTypes.bool.description('dont show addon for submenu'),
757
-
758
- /** left addon */
759
- leftAddon: reactDesc.PropTypes.node.description('left addon'),
760
-
761
- /** submenu label */
762
- label: reactDesc.PropTypes.string.description('submenu label'),
763
-
764
- /** A type indicating how to open/close the tooltip */
765
- interactionType: reactDesc.PropTypes.oneOf(DSPopper.interactions).description('A type indicating how to open/close the tooltip'),
766
-
767
- /** sub menu items */
768
- children: reactDesc.PropTypes.oneOfType([reactDesc.PropTypes.array, reactDesc.PropTypes.node]).description('sub menu items'),
769
-
770
- /** right addon, ellipsis or undefined */
771
- rightAddonType: reactDesc.PropTypes.oneOf(['ellipsis']).description('right addon, ellipsis or undefined'),
772
- disabledAddonInactive: reactDesc.PropTypes.bool.description(''),
773
-
774
- /** props passed to MenuItem component */
775
- checkableProps: reactDesc.PropTypes.object.description('props passed to MenuItem component'),
776
-
777
- /** custom renderer for menu item */
778
- customRenderer: reactDesc.PropTypes.func.description('custom renderer for menu item'),
779
-
780
- /** on click handler */
781
- onClick: reactDesc.PropTypes.func.description('on click handler'),
782
- closeMenu: reactDesc.PropTypes.any.description(''),
783
-
784
- /** component id */
785
- id: reactDesc.PropTypes.string.description('component id')
786
- };
787
- SubMenu.propTypes = props;
788
- var DSSubMenuWithSchema = reactDesc.describe(SubMenu);
789
- DSSubMenuWithSchema.propTypes = props;
790
-
791
- exports.DSMenuItemCheckeableWithSchema = DSMenuItemCheckeableWithSchema;
792
- exports.DSMenuItemRadioWithSchema = DSMenuItemRadioWithSchema;
793
- exports.DSMenuItemWithSchema = DSMenuItemWithSchema;
794
- exports.DSMenuSelectionGroupWithSchema = DSMenuSelectionGroupWithSchema;
795
- exports.DSMenuWithSchema = DSMenuWithSchema;
796
- exports.DSSubMenuWithSchema = DSSubMenuWithSchema;
797
- exports.Menu = Menu;
798
- exports.MenuItem = MenuItem;
799
- exports.MenuItemCheckable = MenuItemCheckable;
800
- exports.MenuItemCheckbox = MenuItemCheckbox;
801
- exports.MenuItemRadio = MenuItemRadio;
802
- exports.SelectionGroup = SelectionGroup;
803
- exports.SubMenu = SubMenu;
804
- exports.menuItemFactory = menuItemFactory;
805
- exports.renderMenuItems = renderMenuItems;
806
- //# sourceMappingURL=SubMenu-22be0a18.js.map