@dhis2-ui/menu 9.10.3 → 9.11.1-beta.1

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 (65) hide show
  1. package/build/cjs/flyout-menu/__tests__/flyout-menu.test.js +44 -0
  2. package/build/cjs/flyout-menu/features/accepts_children/index.js +0 -1
  3. package/build/cjs/flyout-menu/features/position/index.js +4 -4
  4. package/build/cjs/flyout-menu/features/toggles_submenus/index.js +0 -1
  5. package/build/cjs/flyout-menu/{flyout-menu.stories.e2e.js → flyout-menu.e2e.stories.js} +2 -20
  6. package/build/cjs/flyout-menu/flyout-menu.js +37 -19
  7. package/build/cjs/flyout-menu/{flyout-menu.stories.js → flyout-menu.prod.stories.js} +28 -38
  8. package/build/cjs/flyout-menu/index.js +0 -1
  9. package/build/cjs/index.js +0 -5
  10. package/build/cjs/menu/__tests__/menu.test.js +11 -50
  11. package/build/cjs/menu/features/accepts_children/index.js +0 -1
  12. package/build/cjs/menu/helpers.js +2 -10
  13. package/build/cjs/menu/index.js +0 -1
  14. package/build/cjs/menu/menu.e2e.stories.js +14 -0
  15. package/build/cjs/menu/menu.js +12 -20
  16. package/build/cjs/menu/{menu.stories.js → menu.prod.stories.js} +18 -17
  17. package/build/cjs/menu/use-menu.js +12 -20
  18. package/build/cjs/menu-divider/index.js +0 -1
  19. package/build/cjs/menu-divider/menu-divider.js +3 -11
  20. package/build/cjs/menu-divider/{menu-divider.stories.js → menu-divider.prod.stories.js} +11 -15
  21. package/build/cjs/menu-item/__tests__/menu-item.test.js +1 -5
  22. package/build/cjs/menu-item/features/accepts_href/index.js +1 -2
  23. package/build/cjs/menu-item/features/accepts_icon/index.js +0 -1
  24. package/build/cjs/menu-item/features/accepts_label/index.js +1 -2
  25. package/build/cjs/menu-item/features/accepts_suffix/index.js +0 -1
  26. package/build/cjs/menu-item/features/accepts_target/index.js +1 -2
  27. package/build/cjs/menu-item/features/is_clickable/index.js +0 -1
  28. package/build/cjs/menu-item/index.js +0 -1
  29. package/build/cjs/menu-item/{menu-item.stories.e2e.js → menu-item.e2e.stories.js} +2 -20
  30. package/build/cjs/menu-item/menu-item.js +48 -38
  31. package/build/cjs/menu-item/{menu-item.stories.js → menu-item.prod.stories.js} +22 -46
  32. package/build/cjs/menu-item/menu-item.styles.js +2 -5
  33. package/build/cjs/menu-section-header/features/accepts_label/index.js +1 -2
  34. package/build/cjs/menu-section-header/index.js +0 -1
  35. package/build/cjs/menu-section-header/{menu-section-header.stories.e2e.js → menu-section-header.e2e.stories.js} +2 -10
  36. package/build/cjs/menu-section-header/menu-section-header.js +3 -12
  37. package/build/cjs/menu-section-header/{menu-section-header.stories.js → menu-section-header.prod.stories.js} +11 -19
  38. package/build/es/flyout-menu/__tests__/flyout-menu.test.js +41 -0
  39. package/build/es/flyout-menu/features/position/index.js +4 -3
  40. package/build/es/flyout-menu/{flyout-menu.stories.e2e.js → flyout-menu.e2e.stories.js} +0 -2
  41. package/build/es/flyout-menu/flyout-menu.js +35 -9
  42. package/build/es/flyout-menu/{flyout-menu.stories.js → flyout-menu.prod.stories.js} +28 -13
  43. package/build/es/menu/__tests__/menu.test.js +10 -8
  44. package/build/es/menu/helpers.js +2 -6
  45. package/build/es/menu/menu.e2e.stories.js +6 -0
  46. package/build/es/menu/menu.js +9 -9
  47. package/build/es/menu/{menu.stories.js → menu.prod.stories.js} +18 -1
  48. package/build/es/menu/use-menu.js +12 -16
  49. package/build/es/menu-divider/menu-divider.js +2 -4
  50. package/build/es/menu-divider/{menu-divider.stories.js → menu-divider.prod.stories.js} +7 -3
  51. package/build/es/menu-item/features/accepts_href/index.js +1 -1
  52. package/build/es/menu-item/features/accepts_label/index.js +1 -1
  53. package/build/es/menu-item/features/accepts_target/index.js +1 -1
  54. package/build/es/menu-item/menu-item.js +46 -24
  55. package/build/es/menu-item/{menu-item.stories.js → menu-item.prod.stories.js} +14 -9
  56. package/build/es/menu-item/menu-item.styles.js +1 -1
  57. package/build/es/menu-section-header/features/accepts_label/index.js +1 -1
  58. package/build/es/menu-section-header/menu-section-header.js +2 -4
  59. package/build/es/menu-section-header/{menu-section-header.stories.js → menu-section-header.prod.stories.js} +7 -3
  60. package/package.json +11 -11
  61. package/types/index.d.ts +4 -0
  62. package/build/cjs/menu/menu.stories.e2e.js +0 -11
  63. package/build/es/menu/menu.stories.e2e.js +0 -4
  64. /package/build/es/menu-item/{menu-item.stories.e2e.js → menu-item.e2e.stories.js} +0 -0
  65. /package/build/es/menu-section-header/{menu-section-header.stories.e2e.js → menu-section-header.e2e.stories.js} +0 -0
@@ -4,33 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.MenuItem = void 0;
7
-
8
7
  var _style = _interopRequireDefault(require("styled-jsx/style"));
9
-
8
+ var _uiIcons = require("@dhis2/ui-icons");
10
9
  var _popper = require("@dhis2-ui/popper");
11
-
12
10
  var _portal = require("@dhis2-ui/portal");
13
-
14
- var _uiIcons = require("@dhis2/ui-icons");
15
-
16
11
  var _classnames = _interopRequireDefault(require("classnames"));
17
-
18
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
19
-
20
13
  var _react = _interopRequireWildcard(require("react"));
21
-
22
- var _index = require("../index.js");
23
-
14
+ var _index = require("../flyout-menu/index.js");
24
15
  var _menuItemStyles = _interopRequireDefault(require("./menu-item.styles.js"));
25
-
26
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
-
28
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
-
30
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
-
16
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
17
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
18
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
19
  const isModifiedEvent = evt => evt.metaKey || evt.altKey || evt.ctrlKey || evt.shiftKey;
33
-
34
20
  const createOnClickHandler = _ref => {
35
21
  let {
36
22
  onClick,
@@ -42,7 +28,6 @@ const createOnClickHandler = _ref => {
42
28
  if (isLink && isModifiedEvent(evt) || !(onClick || toggleSubMenu)) {
43
29
  return;
44
30
  }
45
-
46
31
  evt.preventDefault();
47
32
  evt.stopPropagation();
48
33
  onClick && onClick({
@@ -51,7 +36,6 @@ const createOnClickHandler = _ref => {
51
36
  toggleSubMenu && toggleSubMenu();
52
37
  };
53
38
  };
54
-
55
39
  const MenuItem = _ref2 => {
56
40
  let {
57
41
  href,
@@ -76,12 +60,49 @@ const MenuItem = _ref2 => {
76
60
  tabIndex
77
61
  } = _ref2;
78
62
  const menuItemRef = (0, _react.useRef)();
63
+ const [openSubMenus, setOpenSubMenus] = (0, _react.useState)([]);
64
+ (0, _react.useEffect)(() => {
65
+ // track open submenus
66
+ setOpenSubMenus(document.querySelectorAll('[data-submenu-open=true]'));
67
+ }, []);
68
+ (0, _react.useEffect)(() => {
69
+ if (!menuItemRef.current) {
70
+ return;
71
+ }
72
+ const menuItem = menuItemRef.current;
73
+ const handleKeyDown = event => {
74
+ var _openSubMenus, _openSubMenus2;
75
+ const firstChild = event.target.children[0];
76
+ const hasSubMenu = firstChild === null || firstChild === void 0 ? void 0 : firstChild.getAttribute('aria-haspopup');
77
+ switch (event.key) {
78
+ // for submenus
79
+ case 'ArrowRight':
80
+ event.preventDefault();
81
+ if (hasSubMenu) {
82
+ firstChild.click();
83
+ }
84
+ break;
85
+ case 'ArrowLeft':
86
+ case 'Escape':
87
+ // close flyout menu
88
+ event.preventDefault();
89
+ (_openSubMenus = openSubMenus[openSubMenus.length - 1]) === null || _openSubMenus === void 0 ? void 0 : _openSubMenus.focus();
90
+ (_openSubMenus2 = openSubMenus[openSubMenus.length - 1]) === null || _openSubMenus2 === void 0 ? void 0 : _openSubMenus2.children[0].click();
91
+ break;
92
+ }
93
+ };
94
+ menuItem.addEventListener('keydown', handleKeyDown);
95
+ return () => {
96
+ menuItem.removeEventListener('keydown', handleKeyDown);
97
+ };
98
+ }, [openSubMenus]);
79
99
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("li", {
80
100
  ref: menuItemRef,
81
101
  "data-test": dataTest,
82
102
  role: "presentation",
83
103
  tabIndex: tabIndex,
84
- className: "jsx-".concat(_menuItemStyles.default.__hash) + " " + ((0, _classnames.default)(className, {
104
+ "data-submenu-open": children && showSubMenu,
105
+ className: `jsx-${_menuItemStyles.default.__hash}` + " " + ((0, _classnames.default)(className, {
85
106
  destructive,
86
107
  disabled,
87
108
  dense,
@@ -103,15 +124,15 @@ const MenuItem = _ref2 => {
103
124
  "aria-haspopup": children && 'menu',
104
125
  "aria-expanded": showSubMenu,
105
126
  "aria-label": label,
106
- className: "jsx-".concat(_menuItemStyles.default.__hash)
127
+ className: `jsx-${_menuItemStyles.default.__hash}`
107
128
  }, icon && /*#__PURE__*/_react.default.createElement("span", {
108
- className: "jsx-".concat(_menuItemStyles.default.__hash) + " " + "icon"
129
+ className: `jsx-${_menuItemStyles.default.__hash}` + " " + "icon"
109
130
  }, icon), /*#__PURE__*/_react.default.createElement("span", {
110
- className: "jsx-".concat(_menuItemStyles.default.__hash) + " " + "label"
131
+ className: `jsx-${_menuItemStyles.default.__hash}` + " " + "label"
111
132
  }, label), suffix && /*#__PURE__*/_react.default.createElement("span", {
112
- className: "jsx-".concat(_menuItemStyles.default.__hash) + " " + "suffix"
133
+ className: `jsx-${_menuItemStyles.default.__hash}` + " " + "suffix"
113
134
  }, suffix), (chevron || children) && /*#__PURE__*/_react.default.createElement("span", {
114
- className: "jsx-".concat(_menuItemStyles.default.__hash) + " " + "chevron"
135
+ className: `jsx-${_menuItemStyles.default.__hash}` + " " + "chevron"
115
136
  }, /*#__PURE__*/_react.default.createElement(_uiIcons.IconChevronRight24, null))), /*#__PURE__*/_react.default.createElement(_style.default, {
116
137
  id: _menuItemStyles.default.__hash
117
138
  }, _menuItemStyles.default)), children && showSubMenu && /*#__PURE__*/_react.default.createElement(_portal.Portal, null, /*#__PURE__*/_react.default.createElement(_popper.Popper, {
@@ -121,7 +142,6 @@ const MenuItem = _ref2 => {
121
142
  dense: dense
122
143
  }, children))));
123
144
  };
124
-
125
145
  exports.MenuItem = MenuItem;
126
146
  MenuItem.defaultProps = {
127
147
  dataTest: 'dhis2-uicore-menuitem'
@@ -131,7 +151,6 @@ MenuItem.propTypes = {
131
151
  checkbox: _propTypes.default.bool,
132
152
  checked: _propTypes.default.bool,
133
153
  chevron: _propTypes.default.bool,
134
-
135
154
  /**
136
155
  * Nested menu items can become submenus.
137
156
  * See `showSubMenu` and `toggleSubMenu` props, and 'Children' demo
@@ -142,32 +161,23 @@ MenuItem.propTypes = {
142
161
  dense: _propTypes.default.bool,
143
162
  destructive: _propTypes.default.bool,
144
163
  disabled: _propTypes.default.bool,
145
-
146
164
  /** For using menu item as a link */
147
165
  href: _propTypes.default.string,
148
-
149
166
  /** An icon for the left side of the menu item */
150
167
  icon: _propTypes.default.node,
151
-
152
168
  /** Text in the menu item */
153
169
  label: _propTypes.default.node,
154
-
155
170
  /** When true, nested menu items are shown in a Popper */
156
171
  showSubMenu: _propTypes.default.bool,
157
-
158
172
  /** A supporting element shown at the end of the menu item */
159
173
  suffix: _propTypes.default.node,
160
174
  tabIndex: _propTypes.default.number,
161
-
162
175
  /** For using menu item as a link */
163
176
  target: _propTypes.default.string,
164
-
165
177
  /** On click, this function is called (without args) */
166
178
  toggleSubMenu: _propTypes.default.func,
167
-
168
179
  /** Value associated with item. Passed as an argument to onClick handler. */
169
180
  value: _propTypes.default.string,
170
-
171
181
  /** Click handler called with signature `({ value: string }, event)` */
172
182
  onClick: _propTypes.default.func
173
183
  };
@@ -4,27 +4,29 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.ToggleMenuItem = exports.SuffixAndChevron = exports.Suffix = exports.SubMenus = exports.RTLSuffixAndChevron = exports.OnClick = exports.Link = exports.Icon = exports.Disabled = exports.Destructive = exports.Dense = exports.Default = exports.Chevron = exports.Active = void 0;
7
-
8
7
  var _ui = require("@dhis2/ui");
9
-
10
8
  var _uiConstants = require("@dhis2/ui-constants");
11
-
12
9
  var _uiIcons = require("@dhis2/ui-icons");
13
-
14
10
  var _react = _interopRequireWildcard(require("react"));
15
-
16
11
  var _index = require("../index.js");
17
-
18
12
  var _menuItem = require("./menu-item.js");
13
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
16
+ const description = `
17
+ Menu Items are intended to be children of Menu and Flyout Menu components. They can be nested to create submenus.
19
18
 
20
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+ Splitting menus into several levels with child menus makes sense when there are a lot of options that can be grouped together. An example may be an option in level 1 menu of 'Download' that has several different download formats as child menu items. Make sure that child menu items relate to their parent item, otherwise a user will struggle to discover them. A menu item with children is not selectable/actionable itself, it serves only as a container for the child elements. Try to keep menus to a maximum of 1, 2 or 3 levels, anything more than this can easily confuse the user.
21
20
 
22
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
+ There is no enforced ordering of menu items, they should be presented in order of relevance. Put the most commonly used items at the top of the menu for easy discovery and access.
23
22
 
24
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
23
+ See the [design system](https://github.com/dhis2/design-system/blob/master/molecules/menu.md) for more information about menus.
25
24
 
26
- const description = "\nMenu Items are intended to be children of Menu and Flyout Menu components. They can be nested to create submenus.\n\nSplitting menus into several levels with child menus makes sense when there are a lot of options that can be grouped together. An example may be an option in level 1 menu of 'Download' that has several different download formats as child menu items. Make sure that child menu items relate to their parent item, otherwise a user will struggle to discover them. A menu item with children is not selectable/actionable itself, it serves only as a container for the child elements. Try to keep menus to a maximum of 1, 2 or 3 levels, anything more than this can easily confuse the user.\n\nThere is no enforced ordering of menu items, they should be presented in order of relevance. Put the most commonly used items at the top of the menu for easy discovery and access.\n\nSee the [design system](https://github.com/dhis2/design-system/blob/master/molecules/menu.md) for more information about menus.\n\n```js\nimport { MenuItem } from '@dhis2/ui'\n```\n";
27
- var _default = {
25
+ \`\`\`js
26
+ import { MenuItem } from '@dhis2/ui'
27
+ \`\`\`
28
+ `;
29
+ var _default = exports.default = {
28
30
  title: 'Menu Item',
29
31
  component: _menuItem.MenuItem,
30
32
  args: {
@@ -38,29 +40,21 @@ var _default = {
38
40
  }
39
41
  }
40
42
  };
41
- exports.default = _default;
42
-
43
43
  const Template = args => /*#__PURE__*/_react.default.createElement(_index.Menu, null, /*#__PURE__*/_react.default.createElement(_menuItem.MenuItem, args));
44
-
45
- const Default = Template.bind({});
46
- exports.Default = Default;
47
- const Active = Template.bind({});
48
- exports.Active = Active;
44
+ const Default = exports.Default = Template.bind({});
45
+ const Active = exports.Active = Template.bind({});
49
46
  Active.args = {
50
47
  active: true
51
48
  };
52
- const Chevron = Template.bind({});
53
- exports.Chevron = Chevron;
49
+ const Chevron = exports.Chevron = Template.bind({});
54
50
  Chevron.args = {
55
51
  chevron: true
56
52
  };
57
- const Dense = Template.bind({});
58
- exports.Dense = Dense;
53
+ const Dense = exports.Dense = Template.bind({});
59
54
  Dense.args = {
60
55
  dense: true
61
56
  };
62
- const Destructive = Template.bind({});
63
- exports.Destructive = Destructive;
57
+ const Destructive = exports.Destructive = Template.bind({});
64
58
  Destructive.args = {
65
59
  destructive: true
66
60
  };
@@ -71,8 +65,7 @@ Destructive.parameters = {
71
65
  }
72
66
  }
73
67
  };
74
- const Disabled = Template.bind({});
75
- exports.Disabled = Disabled;
68
+ const Disabled = exports.Disabled = Template.bind({});
76
69
  Disabled.args = {
77
70
  disabled: true
78
71
  };
@@ -83,13 +76,11 @@ Disabled.parameters = {
83
76
  }
84
77
  }
85
78
  };
86
- const Link = Template.bind({});
87
- exports.Link = Link;
79
+ const Link = exports.Link = Template.bind({});
88
80
  Link.args = {
89
81
  target: '_blank',
90
82
  href: 'http://dhis2.org'
91
83
  };
92
-
93
84
  const Icon = args => {
94
85
  // import { IconApps24 } from '@dhis2/ui'
95
86
  return /*#__PURE__*/_react.default.createElement(_index.Menu, null, /*#__PURE__*/_react.default.createElement(_menuItem.MenuItem, _extends({}, args, {
@@ -102,7 +93,6 @@ const Icon = args => {
102
93
  label: "Menu item - with custom icon fill"
103
94
  }));
104
95
  };
105
-
106
96
  exports.Icon = Icon;
107
97
  Icon.parameters = {
108
98
  docs: {
@@ -114,8 +104,7 @@ Icon.parameters = {
114
104
  }
115
105
  }
116
106
  };
117
- const Suffix = Template.bind({});
118
- exports.Suffix = Suffix;
107
+ const Suffix = exports.Suffix = Template.bind({});
119
108
  Suffix.args = {
120
109
  label: 'Open in Data Visualizer',
121
110
  icon: /*#__PURE__*/_react.default.createElement(_uiIcons.IconVisualizationColumn24, {
@@ -125,14 +114,12 @@ Suffix.args = {
125
114
  color: _uiConstants.colors.grey600
126
115
  })
127
116
  };
128
- const SuffixAndChevron = Template.bind({});
129
- exports.SuffixAndChevron = SuffixAndChevron;
117
+ const SuffixAndChevron = exports.SuffixAndChevron = Template.bind({});
130
118
  SuffixAndChevron.args = {
131
119
  label: 'Security notifications',
132
120
  chevron: true,
133
121
  suffix: /*#__PURE__*/_react.default.createElement(_ui.Tag, null, "3")
134
122
  };
135
-
136
123
  const OnClick = args => /*#__PURE__*/_react.default.createElement(_index.Menu, null, /*#__PURE__*/_react.default.createElement(_menuItem.MenuItem, _extends({
137
124
  onClick: (payload, event) => {
138
125
  console.log(payload.value, event.target);
@@ -140,7 +127,6 @@ const OnClick = args => /*#__PURE__*/_react.default.createElement(_index.Menu, n
140
127
  value: "myValue",
141
128
  label: "Menu item"
142
129
  }, args)));
143
-
144
130
  exports.OnClick = OnClick;
145
131
  OnClick.parameters = {
146
132
  docs: {
@@ -152,12 +138,9 @@ OnClick.parameters = {
152
138
  OnClick.args = {
153
139
  onClick: console.log
154
140
  };
155
-
156
141
  const ToggleMenuItem = args => {
157
142
  const [on, setOn] = (0, _react.useState)(false);
158
-
159
143
  const toggleOn = () => setOn(!on);
160
-
161
144
  const checkMarkStyle = {
162
145
  fontSize: '24px',
163
146
  lineHeight: '24px'
@@ -173,7 +156,6 @@ const ToggleMenuItem = args => {
173
156
  checked: on
174
157
  })));
175
158
  };
176
-
177
159
  exports.ToggleMenuItem = ToggleMenuItem;
178
160
  ToggleMenuItem.parameters = {
179
161
  docs: {
@@ -182,12 +164,9 @@ ToggleMenuItem.parameters = {
182
164
  }
183
165
  }
184
166
  };
185
-
186
167
  const SubMenus = args => {
187
168
  const [showSubMenu, setShowSubMenu] = _react.default.useState(false);
188
-
189
169
  const toggleSubMenu = () => setShowSubMenu(!showSubMenu);
190
-
191
170
  return /*#__PURE__*/_react.default.createElement(_index.Menu, null, /*#__PURE__*/_react.default.createElement(_menuItem.MenuItem, _extends({
192
171
  showSubMenu: showSubMenu,
193
172
  toggleSubMenu: toggleSubMenu
@@ -201,7 +180,6 @@ const SubMenus = args => {
201
180
  label: "Regular item"
202
181
  })));
203
182
  };
204
-
205
183
  exports.SubMenus = SubMenus;
206
184
  SubMenus.parameters = {
207
185
  docs: {
@@ -213,11 +191,9 @@ SubMenus.parameters = {
213
191
  }
214
192
  }
215
193
  };
216
-
217
194
  const RTLSuffixAndChevron = args => /*#__PURE__*/_react.default.createElement("div", {
218
195
  dir: "rtl"
219
196
  }, /*#__PURE__*/_react.default.createElement(Template, args));
220
-
221
197
  exports.RTLSuffixAndChevron = RTLSuffixAndChevron;
222
198
  RTLSuffixAndChevron.args = {
223
199
  label: 'Security notifications',
@@ -4,10 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _uiConstants = require("@dhis2/ui-constants");
9
-
10
- const _defaultExport = ["li.jsx-3192368000{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0;cursor:pointer;list-style:none;background-color:".concat(_uiConstants.colors.white, ";color:").concat(_uiConstants.colors.grey900, ";fill:").concat(_uiConstants.colors.grey900, ";font-size:14px;line-height:16px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}"), "li.jsx-3192368000:hover{background-color:".concat(_uiConstants.colors.grey200, ";}"), "li.jsx-3192368000:active,li.active.jsx-3192368000{background-color:".concat(_uiConstants.colors.grey300, ";}"), "li.destructive.jsx-3192368000{color:".concat(_uiConstants.colors.red700, ";fill:").concat(_uiConstants.colors.red600, ";}"), "li.destructive.jsx-3192368000:hover{background-color:".concat(_uiConstants.colors.red050, ";}"), "li.destructive.jsx-3192368000:active,li.destructive.active.jsx-3192368000{background-color:".concat(_uiConstants.colors.red100, ";}"), "li.disabled.jsx-3192368000{cursor:not-allowed;color:".concat(_uiConstants.colors.grey500, ";fill:").concat(_uiConstants.colors.grey500, ";}"), "li.disabled.jsx-3192368000:hover{background-color:".concat(_uiConstants.colors.white, ";}"), "a.jsx-3192368000{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 ".concat(_uiConstants.spacers.dp16, ";min-height:40px;-webkit-text-decoration:none;text-decoration:none;color:inherit;}"), "a.jsx-3192368000:focus{outline:3px solid ".concat(_uiConstants.theme.focus, ";outline-offset:-3px;}"), "a.jsx-3192368000:focus.jsx-3192368000:not(:focus-visible){outline:none;}", "li.with-chevron.jsx-3192368000 a.jsx-3192368000{padding-inline-end:".concat(_uiConstants.spacers.dp8, ";}"), "li.dense.jsx-3192368000 a.jsx-3192368000{padding:0 ".concat(_uiConstants.spacers.dp12, ";min-height:32px;}"), "li.with-chevron.dense.jsx-3192368000 a.jsx-3192368000{padding-inline-end:".concat(_uiConstants.spacers.dp4, ";}"), ".label.jsx-3192368000{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:".concat(_uiConstants.spacers.dp12, " 0;}"), "li.dense.jsx-3192368000 .label.jsx-3192368000{padding:".concat(_uiConstants.spacers.dp8, " 0;}"), ".icon.jsx-3192368000{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-inline-end:".concat(_uiConstants.spacers.dp12, ";width:24px;height:24px;}"), ".suffix.jsx-3192368000{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-inline-start:".concat(_uiConstants.spacers.dp8, ";}"), ".chevron.jsx-3192368000{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-inline-start:".concat(_uiConstants.spacers.dp24, ";}"), ".chevron.jsx-3192368000:dir(rtl){-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}", "li.dense.jsx-3192368000 .icon.jsx-3192368000{margin-inline-end:".concat(_uiConstants.spacers.dp8, ";width:16px;height:16px;}"), "li.jsx-3192368000 .icon.jsx-3192368000>svg{width:24px;height:24px;}", "li.dense.jsx-3192368000 .icon.jsx-3192368000>svg,li.jsx-3192368000 .chevron.jsx-3192368000>svg{width:16px;height:16px;}"];
8
+ const _defaultExport = [`li.jsx-3192368000{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0;cursor:pointer;list-style:none;background-color:${_uiConstants.colors.white};color:${_uiConstants.colors.grey900};fill:${_uiConstants.colors.grey900};font-size:14px;line-height:16px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}`, `li.jsx-3192368000:hover{background-color:${_uiConstants.colors.grey200};}`, `li.jsx-3192368000:active,li.active.jsx-3192368000{background-color:${_uiConstants.colors.grey300};}`, `li.destructive.jsx-3192368000{color:${_uiConstants.colors.red700};fill:${_uiConstants.colors.red600};}`, `li.destructive.jsx-3192368000:hover{background-color:${_uiConstants.colors.red050};}`, `li.destructive.jsx-3192368000:active,li.destructive.active.jsx-3192368000{background-color:${_uiConstants.colors.red100};}`, `li.disabled.jsx-3192368000{cursor:not-allowed;color:${_uiConstants.colors.grey500};fill:${_uiConstants.colors.grey500};}`, `li.disabled.jsx-3192368000:hover{background-color:${_uiConstants.colors.white};}`, `a.jsx-3192368000{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 ${_uiConstants.spacers.dp16};min-height:40px;-webkit-text-decoration:none;text-decoration:none;color:inherit;}`, `a.jsx-3192368000:focus{outline:3px solid ${_uiConstants.theme.focus};outline-offset:-3px;}`, "a.jsx-3192368000:focus.jsx-3192368000:not(:focus-visible){outline:none;}", `li.with-chevron.jsx-3192368000 a.jsx-3192368000{padding-inline-end:${_uiConstants.spacers.dp8};}`, `li.dense.jsx-3192368000 a.jsx-3192368000{padding:0 ${_uiConstants.spacers.dp12};min-height:32px;}`, `li.with-chevron.dense.jsx-3192368000 a.jsx-3192368000{padding-inline-end:${_uiConstants.spacers.dp4};}`, `.label.jsx-3192368000{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:${_uiConstants.spacers.dp12} 0;}`, `li.dense.jsx-3192368000 .label.jsx-3192368000{padding:${_uiConstants.spacers.dp8} 0;}`, `.icon.jsx-3192368000{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-inline-end:${_uiConstants.spacers.dp12};width:24px;height:24px;}`, `.suffix.jsx-3192368000{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-inline-start:${_uiConstants.spacers.dp8};}`, `.chevron.jsx-3192368000{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-inline-start:${_uiConstants.spacers.dp24};}`, ".chevron.jsx-3192368000:dir(rtl){-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}", `li.dense.jsx-3192368000 .icon.jsx-3192368000{margin-inline-end:${_uiConstants.spacers.dp8};width:16px;height:16px;}`, "li.jsx-3192368000 .icon.jsx-3192368000>svg{width:24px;height:24px;}", "li.dense.jsx-3192368000 .icon.jsx-3192368000>svg,li.jsx-3192368000 .chevron.jsx-3192368000>svg{width:16px;height:16px;}"];
11
9
  _defaultExport.__hash = "3192368000";
12
- var _default = _defaultExport;
13
- exports.default = _default;
10
+ var _default = exports.default = _defaultExport;
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  var _cypressCucumberPreprocessor = require("@badeball/cypress-cucumber-preprocessor");
4
-
5
4
  (0, _cypressCucumberPreprocessor.Given)('a MenuSectionHeader supplied with a label is rendered', () => {
6
5
  cy.visitStory('MenuSectionHeader', 'With Label');
7
6
  cy.get('[data-test="dhis2-uicore-menusectionheader"]').should('be.visible');
8
7
  });
9
8
  (0, _cypressCucumberPreprocessor.Then)('the label is visible', () => {
10
- cy.contains('label').should('be.visible');
9
+ cy.get(':contains("label")').should('be.visible');
11
10
  });
@@ -9,5 +9,4 @@ Object.defineProperty(exports, "MenuSectionHeader", {
9
9
  return _menuSectionHeader.MenuSectionHeader;
10
10
  }
11
11
  });
12
-
13
12
  var _menuSectionHeader = require("./menu-section-header.js");
@@ -4,24 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.WithLabel = void 0;
7
-
8
7
  var _react = _interopRequireDefault(require("react"));
9
-
10
8
  var _index = require("../index.js");
11
-
12
9
  var _index2 = require("./index.js");
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- var _default = {
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ var _default = exports.default = {
17
12
  title: 'MenuSectionHeader',
18
13
  component: _index2.MenuSectionHeader,
19
14
  decorators: [story => /*#__PURE__*/_react.default.createElement(_index.Menu, null, story())]
20
15
  };
21
- exports.default = _default;
22
-
23
16
  const WithLabel = () => /*#__PURE__*/_react.default.createElement(_index2.MenuSectionHeader, {
24
17
  label: "label"
25
18
  });
26
-
27
19
  exports.WithLabel = WithLabel;
@@ -4,21 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.MenuSectionHeader = void 0;
7
-
8
7
  var _style = _interopRequireDefault(require("styled-jsx/style"));
9
-
10
- var _divider = require("@dhis2-ui/divider");
11
-
12
8
  var _uiConstants = require("@dhis2/ui-constants");
13
-
9
+ var _divider = require("@dhis2-ui/divider");
14
10
  var _classnames = _interopRequireDefault(require("classnames"));
15
-
16
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
-
18
12
  var _react = _interopRequireDefault(require("react"));
19
-
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
-
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
14
  const MenuSectionHeader = _ref => {
23
15
  let {
24
16
  className,
@@ -39,9 +31,8 @@ const MenuSectionHeader = _ref => {
39
31
  }, label), /*#__PURE__*/_react.default.createElement(_style.default, {
40
32
  id: "1160864328",
41
33
  dynamic: [_uiConstants.colors.white, _uiConstants.spacers.dp8, _uiConstants.spacers.dp16, _uiConstants.spacers.dp8, _uiConstants.spacers.dp16, _uiConstants.colors.grey700, _uiConstants.spacers.dp8, _uiConstants.spacers.dp12, _uiConstants.spacers.dp4, _uiConstants.spacers.dp12]
42
- }, ["li.__jsx-style-dynamic-selector{list-style:none;background-color:".concat(_uiConstants.colors.white, ";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:0;line-height:0;}"), "h6.__jsx-style-dynamic-selector{margin:0;padding:".concat(_uiConstants.spacers.dp8, " ").concat(_uiConstants.spacers.dp16, " ").concat(_uiConstants.spacers.dp8, " ").concat(_uiConstants.spacers.dp16, ";font-size:13px;line-height:16px;font-weight:500;color:").concat(_uiConstants.colors.grey700, ";}"), "li.dense.__jsx-style-dynamic-selector h6.__jsx-style-dynamic-selector{padding:".concat(_uiConstants.spacers.dp8, " ").concat(_uiConstants.spacers.dp12, " ").concat(_uiConstants.spacers.dp4, " ").concat(_uiConstants.spacers.dp12, ";}")]));
34
+ }, [`li.__jsx-style-dynamic-selector{list-style:none;background-color:${_uiConstants.colors.white};-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:0;line-height:0;}`, `h6.__jsx-style-dynamic-selector{margin:0;padding:${_uiConstants.spacers.dp8} ${_uiConstants.spacers.dp16} ${_uiConstants.spacers.dp8} ${_uiConstants.spacers.dp16};font-size:13px;line-height:16px;font-weight:500;color:${_uiConstants.colors.grey700};}`, `li.dense.__jsx-style-dynamic-selector h6.__jsx-style-dynamic-selector{padding:${_uiConstants.spacers.dp8} ${_uiConstants.spacers.dp12} ${_uiConstants.spacers.dp4} ${_uiConstants.spacers.dp12};}`]));
43
35
  };
44
-
45
36
  exports.MenuSectionHeader = MenuSectionHeader;
46
37
  MenuSectionHeader.defaultProps = {
47
38
  dataTest: 'dhis2-uicore-menusectionheader'
@@ -4,19 +4,19 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.WithoutDivider = exports.TopOfList = exports.Dense = exports.Default = void 0;
7
-
8
7
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
-
10
8
  var _react = _interopRequireDefault(require("react"));
11
-
12
9
  var _index = require("../index.js");
13
-
14
10
  var _menuSectionHeader = require("./menu-section-header.js");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const description = `
13
+ Items in a menu can be split into separate sections by using Dividers. Group relevant menu items together to help the user understand the options quickly. A Divider can be used alone. If using a Menu Section Header, a divider will be automatically included. Try not to group single menu items together. An exception to this is a critical destructive menu item, like 'Delete', which can be separated from other menu items.
15
14
 
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- const description = "\nItems in a menu can be split into separate sections by using Dividers. Group relevant menu items together to help the user understand the options quickly. A Divider can be used alone. If using a Menu Section Header, a divider will be automatically included. Try not to group single menu items together. An exception to this is a critical destructive menu item, like 'Delete', which can be separated from other menu items.\n\n```js\nimport { MenuSectionHeader } from '@dhis2/ui'\n```\n";
19
- var _default = {
15
+ \`\`\`js
16
+ import { MenuSectionHeader } from '@dhis2/ui'
17
+ \`\`\`
18
+ `;
19
+ var _default = exports.default = {
20
20
  title: 'Menu Section Header',
21
21
  component: _menuSectionHeader.MenuSectionHeader,
22
22
  args: {
@@ -30,8 +30,6 @@ var _default = {
30
30
  }
31
31
  }
32
32
  };
33
- exports.default = _default;
34
-
35
33
  const Template = _ref => {
36
34
  let {
37
35
  menuArgs,
@@ -43,32 +41,26 @@ const Template = _ref => {
43
41
  label: "Menu item below"
44
42
  }));
45
43
  };
46
-
47
44
  Template.propTypes = {
48
45
  menuArgs: _propTypes.default.shape()
49
46
  };
50
- const Default = Template.bind({});
51
- exports.Default = Default;
52
- const Dense = Template.bind({});
53
- exports.Dense = Dense;
47
+ const Default = exports.Default = Template.bind({});
48
+ const Dense = exports.Dense = Template.bind({});
54
49
  Dense.args = {
55
50
  menuArgs: {
56
51
  dense: true
57
52
  },
58
53
  dense: true
59
54
  };
60
- const WithoutDivider = Template.bind({});
61
- exports.WithoutDivider = WithoutDivider;
55
+ const WithoutDivider = exports.WithoutDivider = Template.bind({});
62
56
  WithoutDivider.args = {
63
57
  hideDivider: true
64
58
  };
65
-
66
59
  const TopOfList = args => /*#__PURE__*/_react.default.createElement(_index.Menu, null, /*#__PURE__*/_react.default.createElement(_menuSectionHeader.MenuSectionHeader, args), /*#__PURE__*/_react.default.createElement(_index.MenuItem, {
67
60
  label: "Item 1"
68
61
  }), /*#__PURE__*/_react.default.createElement(_index.MenuItem, {
69
62
  label: "Item 2"
70
63
  }));
71
-
72
64
  exports.TopOfList = TopOfList;
73
65
  TopOfList.args = {
74
66
  label: 'Top of list (so <Menu> hides divider)'
@@ -0,0 +1,41 @@
1
+ import { render } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+ import React from 'react';
4
+ import { MenuItem } from '../../menu-item/menu-item.js';
5
+ import { FlyoutMenu } from '../flyout-menu.js';
6
+ describe('Flyout Menu Component', () => {
7
+ it('can handle navigation of submenus', () => {
8
+ const {
9
+ getByText,
10
+ queryByText,
11
+ getAllByRole
12
+ } = render( /*#__PURE__*/React.createElement(FlyoutMenu, null, /*#__PURE__*/React.createElement(MenuItem, {
13
+ label: "Item 1"
14
+ }), /*#__PURE__*/React.createElement(MenuItem, {
15
+ label: "Item 2"
16
+ }, /*#__PURE__*/React.createElement(MenuItem, {
17
+ label: "Item 2 a"
18
+ }))));
19
+ const itemOne = getByText(/Item 1/i);
20
+ const itemTwo = getByText(/Item 2/i);
21
+ let submenuChild = queryByText(/Item 2 a/i);
22
+ const menuItems = getAllByRole('menuitem');
23
+ expect(menuItems.length).toBe(2);
24
+ expect(menuItems[0]).toBe(itemOne.parentNode);
25
+ expect(menuItems[1]).toBe(itemTwo.parentNode);
26
+ expect(submenuChild).not.toBeInTheDocument();
27
+ userEvent.tab();
28
+ expect(menuItems[0].parentNode).toHaveFocus();
29
+ expect(menuItems[1].parentNode).not.toHaveFocus();
30
+ userEvent.keyboard('{ArrowDown}');
31
+ expect(menuItems[0].parentNode).not.toHaveFocus();
32
+ expect(menuItems[1].parentNode).toHaveFocus();
33
+ userEvent.keyboard('{ArrowRight}');
34
+ submenuChild = getByText(/Item 2 a/i);
35
+ expect(submenuChild).toBeInTheDocument();
36
+ expect(submenuChild.parentElement.parentElement).toHaveFocus();
37
+ userEvent.keyboard('{ArrowLeft}');
38
+ expect(queryByText(/Item 2 a/i)).not.toBeInTheDocument();
39
+ expect(menuItems[1].parentNode).toHaveFocus();
40
+ });
41
+ });
@@ -27,8 +27,10 @@ Then('the left of the MenuItem is aligned with the right of the SubMenu', () =>
27
27
  Then('the SubMenu is rendered on top of the MenuItem', () => {
28
28
  getMenuItemAndSubMenuRects().should(_ref3 => {
29
29
  let [menuItemRect, subMenuRect] = _ref3;
30
- expect(subMenuRect.left).to.be.at.most(menuItemRect.left);
31
- expect(subMenuRect.right).to.be.at.least(menuItemRect.right);
30
+ expect(subMenuRect.left).to.be.at.most(menuItemRect.right);
31
+ expect(subMenuRect.right).to.be.at.least(menuItemRect.left);
32
+ expect(subMenuRect.top).to.be.at.most(menuItemRect.bottom);
33
+ expect(subMenuRect.bottom).to.be.at.least(menuItemRect.top);
32
34
  });
33
35
  });
34
36
  Then('the top of the MenuItem is aligned with the top of the SubMenu wrapper', () => {
@@ -37,7 +39,6 @@ Then('the top of the MenuItem is aligned with the top of the SubMenu wrapper', (
37
39
  expect(menuItemRect.top).to.closeTo(popperRect.top, CLOSE_TO_DELTA);
38
40
  });
39
41
  });
40
-
41
42
  function getMenuItemAndSubMenuRects() {
42
43
  return cy.getPositionsBySelectors('[data-test="dhis2-uicore-menuitem"]', '[data-test="dhis2-uicore-popper"]');
43
44
  }
@@ -6,7 +6,6 @@ export default {
6
6
  title: 'FlyoutMenu',
7
7
  component: FlyoutMenu
8
8
  };
9
-
10
9
  const MenuItemSubMenuPositions = () => /*#__PURE__*/React.createElement(FlyoutMenu, null, /*#__PURE__*/React.createElement(MenuItem, {
11
10
  label: "Item 1"
12
11
  }, /*#__PURE__*/React.createElement("div", {
@@ -14,7 +13,6 @@ const MenuItemSubMenuPositions = () => /*#__PURE__*/React.createElement(FlyoutMe
14
13
  padding: 30
15
14
  }
16
15
  }, "SubMenu 1")));
17
-
18
16
  export const WithChildren = () => /*#__PURE__*/React.createElement(FlyoutMenu, null, "I am a child");
19
17
  export const TogglesSubMenus = () => /*#__PURE__*/React.createElement(FlyoutMenu, null, /*#__PURE__*/React.createElement(MenuItem, {
20
18
  label: "Item 1"