@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.
- package/build/cjs/flyout-menu/__tests__/flyout-menu.test.js +44 -0
- package/build/cjs/flyout-menu/features/accepts_children/index.js +0 -1
- package/build/cjs/flyout-menu/features/position/index.js +4 -4
- package/build/cjs/flyout-menu/features/toggles_submenus/index.js +0 -1
- package/build/cjs/flyout-menu/{flyout-menu.stories.e2e.js → flyout-menu.e2e.stories.js} +2 -20
- package/build/cjs/flyout-menu/flyout-menu.js +37 -19
- package/build/cjs/flyout-menu/{flyout-menu.stories.js → flyout-menu.prod.stories.js} +28 -38
- package/build/cjs/flyout-menu/index.js +0 -1
- package/build/cjs/index.js +0 -5
- package/build/cjs/menu/__tests__/menu.test.js +11 -50
- package/build/cjs/menu/features/accepts_children/index.js +0 -1
- package/build/cjs/menu/helpers.js +2 -10
- package/build/cjs/menu/index.js +0 -1
- package/build/cjs/menu/menu.e2e.stories.js +14 -0
- package/build/cjs/menu/menu.js +12 -20
- package/build/cjs/menu/{menu.stories.js → menu.prod.stories.js} +18 -17
- package/build/cjs/menu/use-menu.js +12 -20
- package/build/cjs/menu-divider/index.js +0 -1
- package/build/cjs/menu-divider/menu-divider.js +3 -11
- package/build/cjs/menu-divider/{menu-divider.stories.js → menu-divider.prod.stories.js} +11 -15
- package/build/cjs/menu-item/__tests__/menu-item.test.js +1 -5
- package/build/cjs/menu-item/features/accepts_href/index.js +1 -2
- package/build/cjs/menu-item/features/accepts_icon/index.js +0 -1
- package/build/cjs/menu-item/features/accepts_label/index.js +1 -2
- package/build/cjs/menu-item/features/accepts_suffix/index.js +0 -1
- package/build/cjs/menu-item/features/accepts_target/index.js +1 -2
- package/build/cjs/menu-item/features/is_clickable/index.js +0 -1
- package/build/cjs/menu-item/index.js +0 -1
- package/build/cjs/menu-item/{menu-item.stories.e2e.js → menu-item.e2e.stories.js} +2 -20
- package/build/cjs/menu-item/menu-item.js +48 -38
- package/build/cjs/menu-item/{menu-item.stories.js → menu-item.prod.stories.js} +22 -46
- package/build/cjs/menu-item/menu-item.styles.js +2 -5
- package/build/cjs/menu-section-header/features/accepts_label/index.js +1 -2
- package/build/cjs/menu-section-header/index.js +0 -1
- package/build/cjs/menu-section-header/{menu-section-header.stories.e2e.js → menu-section-header.e2e.stories.js} +2 -10
- package/build/cjs/menu-section-header/menu-section-header.js +3 -12
- package/build/cjs/menu-section-header/{menu-section-header.stories.js → menu-section-header.prod.stories.js} +11 -19
- package/build/es/flyout-menu/__tests__/flyout-menu.test.js +41 -0
- package/build/es/flyout-menu/features/position/index.js +4 -3
- package/build/es/flyout-menu/{flyout-menu.stories.e2e.js → flyout-menu.e2e.stories.js} +0 -2
- package/build/es/flyout-menu/flyout-menu.js +35 -9
- package/build/es/flyout-menu/{flyout-menu.stories.js → flyout-menu.prod.stories.js} +28 -13
- package/build/es/menu/__tests__/menu.test.js +10 -8
- package/build/es/menu/helpers.js +2 -6
- package/build/es/menu/menu.e2e.stories.js +6 -0
- package/build/es/menu/menu.js +9 -9
- package/build/es/menu/{menu.stories.js → menu.prod.stories.js} +18 -1
- package/build/es/menu/use-menu.js +12 -16
- package/build/es/menu-divider/menu-divider.js +2 -4
- package/build/es/menu-divider/{menu-divider.stories.js → menu-divider.prod.stories.js} +7 -3
- package/build/es/menu-item/features/accepts_href/index.js +1 -1
- package/build/es/menu-item/features/accepts_label/index.js +1 -1
- package/build/es/menu-item/features/accepts_target/index.js +1 -1
- package/build/es/menu-item/menu-item.js +46 -24
- package/build/es/menu-item/{menu-item.stories.js → menu-item.prod.stories.js} +14 -9
- package/build/es/menu-item/menu-item.styles.js +1 -1
- package/build/es/menu-section-header/features/accepts_label/index.js +1 -1
- package/build/es/menu-section-header/menu-section-header.js +2 -4
- package/build/es/menu-section-header/{menu-section-header.stories.js → menu-section-header.prod.stories.js} +7 -3
- package/package.json +11 -11
- package/types/index.d.ts +4 -0
- package/build/cjs/menu/menu.stories.e2e.js +0 -11
- package/build/es/menu/menu.stories.e2e.js +0 -4
- /package/build/es/menu-item/{menu-item.stories.e2e.js → menu-item.e2e.stories.js} +0 -0
- /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
|
|
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
|
-
|
|
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:
|
|
127
|
+
className: `jsx-${_menuItemStyles.default.__hash}`
|
|
107
128
|
}, icon && /*#__PURE__*/_react.default.createElement("span", {
|
|
108
|
-
className:
|
|
129
|
+
className: `jsx-${_menuItemStyles.default.__hash}` + " " + "icon"
|
|
109
130
|
}, icon), /*#__PURE__*/_react.default.createElement("span", {
|
|
110
|
-
className:
|
|
131
|
+
className: `jsx-${_menuItemStyles.default.__hash}` + " " + "label"
|
|
111
132
|
}, label), suffix && /*#__PURE__*/_react.default.createElement("span", {
|
|
112
|
-
className:
|
|
133
|
+
className: `jsx-${_menuItemStyles.default.__hash}` + " " + "suffix"
|
|
113
134
|
}, suffix), (chevron || children) && /*#__PURE__*/_react.default.createElement("span", {
|
|
114
|
-
className:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
+
See the [design system](https://github.com/dhis2/design-system/blob/master/molecules/menu.md) for more information about menus.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
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(
|
|
9
|
+
cy.get(':contains("label")').should('be.visible');
|
|
11
10
|
});
|
|
@@ -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
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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.
|
|
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.
|
|
31
|
-
expect(subMenuRect.right).to.be.at.least(menuItemRect.
|
|
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"
|