@dhis2/analytics 25.1.22 → 25.2.0

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 (56) hide show
  1. package/build/cjs/__demo__/FileMenu.stories.js +8 -6
  2. package/build/cjs/__demo__/Toolbar.stories.js +77 -0
  3. package/build/cjs/components/FileMenu/FileMenu.js +21 -59
  4. package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +318 -194
  5. package/build/cjs/components/Options/VisualizationOptions.js +3 -1
  6. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuBar.js +107 -0
  7. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuDropdown.js +66 -0
  8. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuList.js +94 -0
  9. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuListItem.js +99 -0
  10. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuListItem.styles.js +13 -0
  11. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +219 -0
  12. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +23 -0
  13. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +56 -0
  14. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +50 -0
  15. package/build/cjs/components/Toolbar/HoverMenuBar/index.js +37 -0
  16. package/build/cjs/components/Toolbar/InterpretationsAndDetailsToggler.js +50 -0
  17. package/build/cjs/components/Toolbar/MenuButton.styles.js +13 -0
  18. package/build/cjs/components/Toolbar/Toolbar.js +39 -0
  19. package/build/cjs/components/Toolbar/ToolbarSidebar.js +45 -0
  20. package/build/cjs/components/Toolbar/UpdateButton.js +57 -0
  21. package/build/cjs/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +50 -0
  22. package/build/cjs/components/Toolbar/__tests__/Toolbar.spec.js +24 -0
  23. package/build/cjs/components/Toolbar/__tests__/ToolbarSidebar.spec.js +30 -0
  24. package/build/cjs/components/Toolbar/__tests__/UpdateButton.spec.js +44 -0
  25. package/build/cjs/components/Toolbar/index.js +57 -0
  26. package/build/cjs/index.js +304 -46
  27. package/build/cjs/locales/en/translations.json +1 -0
  28. package/build/es/__demo__/FileMenu.stories.js +7 -6
  29. package/build/es/__demo__/Toolbar.stories.js +69 -0
  30. package/build/es/components/FileMenu/FileMenu.js +20 -57
  31. package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +293 -189
  32. package/build/es/components/Options/VisualizationOptions.js +3 -1
  33. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuBar.js +90 -0
  34. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuDropdown.js +44 -0
  35. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuList.js +75 -0
  36. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuListItem.js +78 -0
  37. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuListItem.styles.js +4 -0
  38. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +168 -0
  39. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +16 -0
  40. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +49 -0
  41. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +41 -0
  42. package/build/es/components/Toolbar/HoverMenuBar/index.js +4 -0
  43. package/build/es/components/Toolbar/InterpretationsAndDetailsToggler.js +33 -0
  44. package/build/es/components/Toolbar/MenuButton.styles.js +4 -0
  45. package/build/es/components/Toolbar/Toolbar.js +24 -0
  46. package/build/es/components/Toolbar/ToolbarSidebar.js +29 -0
  47. package/build/es/components/Toolbar/UpdateButton.js +38 -0
  48. package/build/es/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +43 -0
  49. package/build/es/components/Toolbar/__tests__/Toolbar.spec.js +17 -0
  50. package/build/es/components/Toolbar/__tests__/ToolbarSidebar.spec.js +23 -0
  51. package/build/es/components/Toolbar/__tests__/UpdateButton.spec.js +37 -0
  52. package/build/es/components/Toolbar/index.js +5 -0
  53. package/build/es/index.js +1 -0
  54. package/build/es/locales/en/translations.json +1 -0
  55. package/package.json +3 -1
  56. package/CHANGELOG.md +0 -4044
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useHoverMenubarContext = exports.HoverMenuBar = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _react = _interopRequireWildcard(require("react"));
13
+
14
+ 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); }
15
+
16
+ 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; }
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const throwErrorIfNotInitialized = () => {
21
+ throw new Error('`HoverMenubarContext` has not been initialised');
22
+ };
23
+
24
+ const HoverMenubarContext = /*#__PURE__*/(0, _react.createContext)({
25
+ closeMenu: throwErrorIfNotInitialized,
26
+ onDropDownButtonClick: throwErrorIfNotInitialized,
27
+ onDropDownButtonMouseOver: throwErrorIfNotInitialized,
28
+ setLastHoveredSubMenuEl: throwErrorIfNotInitialized,
29
+ openedDropdownEl: null
30
+ });
31
+
32
+ const useHoverMenubarContext = () => (0, _react.useContext)(HoverMenubarContext);
33
+
34
+ exports.useHoverMenubarContext = useHoverMenubarContext;
35
+
36
+ const HoverMenuBar = _ref => {
37
+ let {
38
+ children,
39
+ dataTest
40
+ } = _ref;
41
+ const [openedDropdownEl, setOpenedDropdownEl] = (0, _react.useState)(null);
42
+ const [lastHoveredSubMenuEl, setLastHoveredSubMenuEl] = (0, _react.useState)(null);
43
+ const [isInHoverMode, setIsInHoverMode] = (0, _react.useState)(false);
44
+ const closeMenu = (0, _react.useCallback)(() => {
45
+ setIsInHoverMode(false);
46
+ setOpenedDropdownEl(null);
47
+ }, []);
48
+ const onDocumentClick = (0, _react.useCallback)(event => {
49
+ const isClickOnOpenedSubMenuAnchor = lastHoveredSubMenuEl && (lastHoveredSubMenuEl === event.target || lastHoveredSubMenuEl.contains(event.target));
50
+
51
+ if (!isClickOnOpenedSubMenuAnchor) {
52
+ closeMenu();
53
+ }
54
+ }, [closeMenu, lastHoveredSubMenuEl]);
55
+ const onDropDownButtonClick = (0, _react.useCallback)(event => {
56
+ if (!isInHoverMode) {
57
+ setIsInHoverMode(true);
58
+ setOpenedDropdownEl(event.currentTarget);
59
+ } else {
60
+ closeMenu();
61
+ }
62
+ }, [closeMenu, isInHoverMode]);
63
+ const onDropDownButtonMouseOver = (0, _react.useCallback)(event => {
64
+ if (isInHoverMode) {
65
+ setOpenedDropdownEl(event.currentTarget);
66
+ }
67
+ }, [isInHoverMode]);
68
+ const closeMenuWithEsc = (0, _react.useCallback)(event => {
69
+ if (event.keyCode === 27) {
70
+ closeMenu();
71
+ }
72
+ }, [closeMenu]);
73
+ (0, _react.useEffect)(() => {
74
+ if (isInHoverMode) {
75
+ document.addEventListener('click', onDocumentClick, {
76
+ once: true
77
+ });
78
+ }
79
+
80
+ return () => {
81
+ document.removeEventListener('click', onDocumentClick);
82
+ };
83
+ }, [onDocumentClick, isInHoverMode]);
84
+ return /*#__PURE__*/_react.default.createElement(HoverMenubarContext.Provider, {
85
+ value: {
86
+ onDropDownButtonClick,
87
+ onDropDownButtonMouseOver,
88
+ openedDropdownEl,
89
+ setLastHoveredSubMenuEl
90
+ }
91
+ }, /*#__PURE__*/_react.default.createElement("div", {
92
+ onKeyDown: closeMenuWithEsc,
93
+ "data-test": dataTest,
94
+ className: "jsx-3020154784"
95
+ }, children, /*#__PURE__*/_react.default.createElement(_style.default, {
96
+ id: "3020154784"
97
+ }, [".jsx-3020154784{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}"])));
98
+ };
99
+
100
+ exports.HoverMenuBar = HoverMenuBar;
101
+ HoverMenuBar.defaultProps = {
102
+ dataTest: 'dhis2-analytics-hovermenubar'
103
+ };
104
+ HoverMenuBar.propTypes = {
105
+ children: _propTypes.default.node.isRequired,
106
+ dataTest: _propTypes.default.string
107
+ };
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.HoverMenuDropdown = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _popper = require("@dhis2-ui/popper");
11
+
12
+ var _portal = require("@dhis2-ui/portal");
13
+
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _MenuButtonStyles = _interopRequireDefault(require("../MenuButton.styles.js"));
19
+
20
+ var _HoverMenuBar = require("./HoverMenuBar.js");
21
+
22
+ 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); }
23
+
24
+ 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; }
25
+
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+
28
+ const HoverMenuDropdown = _ref => {
29
+ let {
30
+ children,
31
+ label,
32
+ dataTest,
33
+ disabled
34
+ } = _ref;
35
+ const buttonRef = (0, _react.useRef)();
36
+ const {
37
+ onDropDownButtonClick,
38
+ onDropDownButtonMouseOver,
39
+ openedDropdownEl
40
+ } = (0, _HoverMenuBar.useHoverMenubarContext)();
41
+ const isOpen = openedDropdownEl === buttonRef.current;
42
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("button", {
43
+ ref: buttonRef,
44
+ onClick: onDropDownButtonClick,
45
+ disabled: disabled,
46
+ onMouseOver: disabled ? undefined : onDropDownButtonMouseOver,
47
+ "data-test": dataTest,
48
+ className: "jsx-".concat(_MenuButtonStyles.default.__hash)
49
+ }, label, /*#__PURE__*/_react.default.createElement(_style.default, {
50
+ id: _MenuButtonStyles.default.__hash
51
+ }, _MenuButtonStyles.default)), isOpen && /*#__PURE__*/_react.default.createElement(_portal.Portal, null, /*#__PURE__*/_react.default.createElement(_popper.Popper, {
52
+ placement: "bottom-start",
53
+ reference: buttonRef
54
+ }, children)));
55
+ };
56
+
57
+ exports.HoverMenuDropdown = HoverMenuDropdown;
58
+ HoverMenuDropdown.defaultProps = {
59
+ dataTest: 'dhis2-analytics-hovermenudropdown'
60
+ };
61
+ HoverMenuDropdown.propTypes = {
62
+ children: _propTypes.default.node.isRequired,
63
+ label: _propTypes.default.node.isRequired,
64
+ dataTest: _propTypes.default.string,
65
+ disabled: _propTypes.default.bool
66
+ };
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useHoverMenuListContext = exports.HoverMenuList = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _uiConstants = require("@dhis2/ui-constants");
11
+
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _HoverMenuBar = require("./HoverMenuBar.js");
17
+
18
+ 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
+
20
+ 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
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ const throwErrorIfNotInitialized = () => {
25
+ throw new Error('`HoverMenuListContext` has not been initialised');
26
+ };
27
+
28
+ const HoverMenuListContext = /*#__PURE__*/(0, _react.createContext)({
29
+ onSubmenuAnchorMouseEnter: throwErrorIfNotInitialized,
30
+ onMenuItemMouseEnter: throwErrorIfNotInitialized,
31
+ openedSubMenuEl: null,
32
+ dense: false
33
+ });
34
+
35
+ const useHoverMenuListContext = () => (0, _react.useContext)(HoverMenuListContext);
36
+
37
+ exports.useHoverMenuListContext = useHoverMenuListContext;
38
+
39
+ const HoverMenuList = _ref => {
40
+ let {
41
+ children,
42
+ className,
43
+ dataTest,
44
+ dense,
45
+ maxHeight,
46
+ maxWidth
47
+ } = _ref;
48
+ const {
49
+ setLastHoveredSubMenuEl
50
+ } = (0, _HoverMenuBar.useHoverMenubarContext)();
51
+ const [openedSubMenuEl, setOpenedSubMenuEl] = (0, _react.useState)(null);
52
+ const onSubmenuAnchorMouseEnter = (0, _react.useCallback)(event => {
53
+ if (openedSubMenuEl !== event.currentTarget) {
54
+ setOpenedSubMenuEl(event.currentTarget);
55
+ setLastHoveredSubMenuEl(event.currentTarget);
56
+ }
57
+ }, [openedSubMenuEl, setLastHoveredSubMenuEl]);
58
+ const onMenuItemMouseEnter = (0, _react.useCallback)(() => {
59
+ setOpenedSubMenuEl(null);
60
+ setLastHoveredSubMenuEl(null);
61
+ }, [setLastHoveredSubMenuEl]);
62
+ return /*#__PURE__*/_react.default.createElement(HoverMenuListContext.Provider, {
63
+ value: {
64
+ onSubmenuAnchorMouseEnter,
65
+ onMenuItemMouseEnter,
66
+ openedSubMenuEl,
67
+ dense
68
+ }
69
+ }, /*#__PURE__*/_react.default.createElement("ul", {
70
+ "data-test": dataTest,
71
+ className: _style.default.dynamic([["3026610659", [_uiConstants.colors.white, _uiConstants.colors.grey200, _uiConstants.elevations.e300, dense ? '128' : '180', maxWidth, maxHeight, _uiConstants.spacers.dp4]]]) + " " + (className || "")
72
+ }, children, /*#__PURE__*/_react.default.createElement(_style.default, {
73
+ id: "3026610659",
74
+ dynamic: [_uiConstants.colors.white, _uiConstants.colors.grey200, _uiConstants.elevations.e300, dense ? '128' : '180', maxWidth, maxHeight, _uiConstants.spacers.dp4]
75
+ }, ["ul.__jsx-style-dynamic-selector{position:relative;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:".concat(_uiConstants.colors.white, ";border:1px solid ").concat(_uiConstants.colors.grey200, ";border-radius:3px;box-shadow:").concat(_uiConstants.elevations.e300, ";display:inline-block;min-width:").concat(dense ? '128' : '180', "px;max-width:").concat(maxWidth, ";max-height:").concat(maxHeight, ";padding:").concat(_uiConstants.spacers.dp4, " 0;overflow:auto;list-style:none;}")])));
76
+ };
77
+
78
+ exports.HoverMenuList = HoverMenuList;
79
+ HoverMenuList.defaultProps = {
80
+ dataTest: 'dhis2-analytics-hovermenulist',
81
+ maxWidth: '380px',
82
+ maxHeight: 'auto'
83
+ };
84
+ HoverMenuList.propTypes = {
85
+ /** Typically `MenuItem`, `MenuDivider`, and `MenuSectionHeader` */
86
+ children: _propTypes.default.node,
87
+ className: _propTypes.default.string,
88
+ dataTest: _propTypes.default.string,
89
+
90
+ /** Gives all HoverMenuListItem children a dense style */
91
+ dense: _propTypes.default.bool,
92
+ maxHeight: _propTypes.default.string,
93
+ maxWidth: _propTypes.default.string
94
+ };
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.HoverMenuListItem = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _popper = require("@dhis2-ui/popper");
11
+
12
+ var _portal = require("@dhis2-ui/portal");
13
+
14
+ var _uiIcons = require("@dhis2/ui-icons");
15
+
16
+ var _classnames = _interopRequireDefault(require("classnames"));
17
+
18
+ var _propTypes = _interopRequireDefault(require("prop-types"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _HoverMenuList = require("./HoverMenuList.js");
23
+
24
+ var _HoverMenuListItemStyles = _interopRequireDefault(require("./HoverMenuListItem.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
+
32
+ const HoverMenuListItem = _ref => {
33
+ let {
34
+ onClick,
35
+ children,
36
+ icon,
37
+ className,
38
+ destructive,
39
+ disabled,
40
+ dataTest,
41
+ label
42
+ } = _ref;
43
+ const ref = (0, _react.useRef)();
44
+ const {
45
+ onSubmenuAnchorMouseEnter,
46
+ onMenuItemMouseEnter,
47
+ openedSubMenuEl,
48
+ dense
49
+ } = (0, _HoverMenuList.useHoverMenuListContext)();
50
+ const isSubMenuOpen = openedSubMenuEl === ref.current;
51
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("li", {
52
+ ref: ref,
53
+ "data-test": dataTest,
54
+ onClick: !disabled && !children && onClick ? onClick : undefined,
55
+ onMouseEnter: disabled ? undefined : children ? onSubmenuAnchorMouseEnter : onMenuItemMouseEnter,
56
+ className: "jsx-".concat(_HoverMenuListItemStyles.default.__hash) + " " + ((0, _classnames.default)(className, {
57
+ destructive,
58
+ disabled,
59
+ dense,
60
+ active: isSubMenuOpen,
61
+ 'with-chevron': children
62
+ }) || "")
63
+ }, icon && /*#__PURE__*/_react.default.createElement("span", {
64
+ className: "jsx-".concat(_HoverMenuListItemStyles.default.__hash) + " " + "icon"
65
+ }, icon), /*#__PURE__*/_react.default.createElement("span", {
66
+ className: "jsx-".concat(_HoverMenuListItemStyles.default.__hash) + " " + "label"
67
+ }, label), !!children && /*#__PURE__*/_react.default.createElement("span", {
68
+ className: "jsx-".concat(_HoverMenuListItemStyles.default.__hash) + " " + "chevron"
69
+ }, /*#__PURE__*/_react.default.createElement(_uiIcons.IconChevronRight24, null)), /*#__PURE__*/_react.default.createElement(_style.default, {
70
+ id: _HoverMenuListItemStyles.default.__hash
71
+ }, _HoverMenuListItemStyles.default)), children && isSubMenuOpen && /*#__PURE__*/_react.default.createElement(_portal.Portal, null, /*#__PURE__*/_react.default.createElement(_popper.Popper, {
72
+ placement: "right-start",
73
+ reference: ref
74
+ }, /*#__PURE__*/_react.default.createElement(_HoverMenuList.HoverMenuList, {
75
+ dense: dense
76
+ }, children))));
77
+ };
78
+
79
+ exports.HoverMenuListItem = HoverMenuListItem;
80
+ HoverMenuListItem.defaultProps = {
81
+ dataTest: 'dhis2-uicore-hovermenulistitem'
82
+ };
83
+ HoverMenuListItem.propTypes = {
84
+ // Nested menu items become submenus
85
+ children: _propTypes.default.node,
86
+ className: _propTypes.default.string,
87
+ dataTest: _propTypes.default.string,
88
+ destructive: _propTypes.default.bool,
89
+ disabled: _propTypes.default.bool,
90
+
91
+ /** An icon for the left side of the menu item */
92
+ icon: _propTypes.default.node,
93
+
94
+ /** Text in the menu item */
95
+ label: _propTypes.default.node,
96
+
97
+ /** Click handler */
98
+ onClick: _propTypes.default.func
99
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _uiConstants = require("@dhis2/ui-constants");
9
+
10
+ const _defaultExport = ["li.jsx-1056713124{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;padding:0px ".concat(_uiConstants.spacers.dp24, ";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-1056713124:hover{background-color:".concat(_uiConstants.colors.grey200, ";}"), "li.jsx-1056713124:active,li.active.jsx-1056713124{background-color:".concat(_uiConstants.colors.grey300, ";}"), "li.destructive.jsx-1056713124{color:".concat(_uiConstants.colors.red700, ";fill:").concat(_uiConstants.colors.red600, ";}"), "li.destructive.jsx-1056713124:hover{background-color:".concat(_uiConstants.colors.red050, ";}"), "li.destructive.jsx-1056713124:active,li.destructive.active.jsx-1056713124{background-color:".concat(_uiConstants.colors.red100, ";}"), "li.disabled.jsx-1056713124{cursor:not-allowed;color:".concat(_uiConstants.colors.grey500, ";fill:").concat(_uiConstants.colors.grey500, ";}"), "li.disabled.jsx-1056713124:hover{background-color:".concat(_uiConstants.colors.white, ";}"), ".label.jsx-1056713124{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:".concat(_uiConstants.spacers.dp12, " 0;}"), "li.dense.jsx-1056713124 .label.jsx-1056713124{padding:".concat(_uiConstants.spacers.dp8, " 0;}"), ".icon.jsx-1056713124{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:".concat(_uiConstants.spacers.dp12, ";width:24px;height:24px;}"), ".chevron.jsx-1056713124{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-left:".concat(_uiConstants.spacers.dp24, ";}"), "li.dense.jsx-1056713124 .icon.jsx-1056713124{margin-right:".concat(_uiConstants.spacers.dp8, ";width:16px;height:16px;}"), "li.jsx-1056713124 .icon.jsx-1056713124>svg{width:24px;height:24px;}", "li.dense.jsx-1056713124 .icon.jsx-1056713124>svg,li.jsx-1056713124 .chevron.jsx-1056713124>svg{width:16px;height:16px;}"];
11
+ _defaultExport.__hash = "1056713124";
12
+ var _default = _defaultExport;
13
+ exports.default = _default;
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+
3
+ require("@testing-library/jest-dom");
4
+
5
+ var _react = require("@testing-library/react");
6
+
7
+ var _enzyme = require("enzyme");
8
+
9
+ var _react2 = _interopRequireDefault(require("react"));
10
+
11
+ var _index = require("../index.js");
12
+
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+
15
+ describe('<HoverMenuBar/>', () => {
16
+ it('renders children', () => {
17
+ const childNode = 'text node';
18
+ const wrapper = (0, _enzyme.shallow)( /*#__PURE__*/_react2.default.createElement(_index.HoverMenuBar, null, childNode));
19
+ expect(wrapper.containsMatchingElement(childNode)).toBe(true);
20
+ });
21
+ it('accepts a `dataTest` prop', () => {
22
+ const dataTest = 'test';
23
+ const wrapper = (0, _enzyme.shallow)( /*#__PURE__*/_react2.default.createElement(_index.HoverMenuBar, {
24
+ dataTest: dataTest
25
+ }, "children"));
26
+ expect(wrapper.find('div').prop('data-test')).toBe(dataTest);
27
+ });
28
+ describe('mouse interactions', () => {
29
+ it('does not open on hover before a dropdown anchor is clicked', async () => {
30
+ createFullMenuBarWrapper();
31
+
32
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu A'));
33
+
34
+ await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item A.2', false], ['Menu item A.3', false]]);
35
+ });
36
+ it('does not open when a disabled dropdown anchor is clicked', async () => {
37
+ createFullMenuBarWrapper();
38
+
39
+ _react.fireEvent.click(_react.screen.getByText('Menu C'));
40
+
41
+ await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item A.2', false], ['Menu item A.3', false]]);
42
+ });
43
+ it('opens menu list when clicked', async () => {
44
+ createFullMenuBarWrapper();
45
+
46
+ _react.fireEvent.click(_react.screen.getByText('Menu A'));
47
+
48
+ await expectMenuItemsInDocument([['Menu item A.1', true], ['Menu item B.1', false], ['Menu item C.1', false]]);
49
+ });
50
+ it('responds to hover once open', async () => {
51
+ createFullMenuBarWrapper();
52
+
53
+ _react.fireEvent.click(_react.screen.getByText('Menu A'));
54
+
55
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu B'));
56
+
57
+ await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item B.1', true], ['Menu item C.1', false]]);
58
+ });
59
+ it('does not open disabled dropdown on hover in hover mode', async () => {
60
+ createFullMenuBarWrapper();
61
+
62
+ _react.fireEvent.click(_react.screen.getByText('Menu B'));
63
+
64
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu C'));
65
+
66
+ await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item C.1', false]]);
67
+ });
68
+ it('opens submenus when in hover mode', async () => {
69
+ createFullMenuBarWrapper();
70
+
71
+ _react.fireEvent.click(_react.screen.getByText('Menu B'));
72
+
73
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu item B.1'));
74
+
75
+ await expectMenuItemsInDocument([['Menu item B.1.1', true], ['Menu item B.1.2', true], ['Menu item B.1.3', true], ['Menu item B.2.1', false], ['Menu item B.2.2', false], ['Menu item B.2.3', false]]);
76
+
77
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu item B.2'));
78
+
79
+ await expectMenuItemsInDocument([['Menu item B.1.1', false], ['Menu item B.1.2', false], ['Menu item B.1.3', false], ['Menu item B.2.1', true], ['Menu item B.2.2', true], ['Menu item B.2.3', true]]);
80
+ });
81
+ it('does not open disabled submenus when in hover mode', async () => {
82
+ createFullMenuBarWrapper();
83
+
84
+ _react.fireEvent.click(_react.screen.getByText('Menu B'));
85
+
86
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu item B.2'));
87
+
88
+ await expectMenuItemsInDocument([['Menu item B.2.1', true], ['Menu item B.2.2', true], ['Menu item B.2.3', true], ['Menu item B.3.1', false], ['Menu item B.3.2', false], ['Menu item B.3.3', false]]);
89
+
90
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu item B.3'));
91
+
92
+ await expectMenuItemsInDocument([['Menu item B.2.1', true], ['Menu item B.2.2', true], ['Menu item B.2.3', true], ['Menu item B.3.1', false], ['Menu item B.3.2', false], ['Menu item B.3.3', false]]);
93
+ });
94
+ it('closes when clicking on then document', async () => {
95
+ createFullMenuBarWrapper();
96
+
97
+ _react.fireEvent.click(_react.screen.getByText('Menu A'));
98
+
99
+ await expectMenuItemsInDocument([['Menu item A.1', true]]);
100
+
101
+ _react.fireEvent.click(document);
102
+
103
+ await expectMenuItemsInDocument([['Menu item A.1', false]]);
104
+ });
105
+ it('stays open when clicking a open submenu anchor', async () => {
106
+ createFullMenuBarWrapper();
107
+
108
+ _react.fireEvent.click(_react.screen.getByText('Menu B'));
109
+
110
+ await expectMenuItemsInDocument([['Menu item B.1', true]]);
111
+
112
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu item B.1'));
113
+
114
+ await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item B.1.1', true], ['Menu item B.1.2', true], ['Menu item B.1.3', true]]);
115
+
116
+ _react.fireEvent.click(_react.screen.getByText('Menu item B.1'));
117
+
118
+ await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item B.1.1', true], ['Menu item B.1.2', true], ['Menu item B.1.3', true]]);
119
+ });
120
+ it('calls the onClick of the menu item and closes when clicking a menu item', async () => {
121
+ const menuItemOnClickSpy = jest.fn();
122
+ createFullMenuBarWrapper({
123
+ menuItemOnClickSpy
124
+ });
125
+
126
+ _react.fireEvent.click(_react.screen.getByText('Menu A'));
127
+
128
+ await expectMenuItemsInDocument([['Menu item A.1', true]]);
129
+
130
+ _react.fireEvent.click(_react.screen.getByText('Menu item A.1'));
131
+
132
+ expect(menuItemOnClickSpy).toHaveBeenCalledTimes(1);
133
+ await expectMenuItemsInDocument([['Menu item A.1', false]]);
134
+ });
135
+ it('calls the onClick of the menu item and closes when clicking a submenu item', async () => {
136
+ const subMenuItemOnClickSpy = jest.fn();
137
+ createFullMenuBarWrapper({
138
+ subMenuItemOnClickSpy
139
+ });
140
+
141
+ _react.fireEvent.click(_react.screen.getByText('Menu B'));
142
+
143
+ await expectMenuItemsInDocument([['Menu item B.1', true]]);
144
+
145
+ _react.fireEvent.mouseOver(_react.screen.getByText('Menu item B.1'));
146
+
147
+ await expectMenuItemsInDocument([['Menu item B.1.1', true]]);
148
+
149
+ _react.fireEvent.click(_react.screen.getByText('Menu item B.1.1'));
150
+
151
+ expect(subMenuItemOnClickSpy).toHaveBeenCalledTimes(1);
152
+ await expectMenuItemsInDocument([['Menu item B.1', false], ['Menu item B.1.1', false], ['Menu item B.1.1', false]]);
153
+ });
154
+ });
155
+ });
156
+
157
+ function createFullMenuBarWrapper() {
158
+ let {
159
+ menuItemOnClickSpy,
160
+ subMenuItemOnClickSpy
161
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
162
+ return (0, _react.render)( /*#__PURE__*/_react2.default.createElement(_index.HoverMenuBar, null, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuDropdown, {
163
+ label: "Menu A"
164
+ }, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuList, null, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
165
+ label: "Menu item A.1",
166
+ onClick: menuItemOnClickSpy
167
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
168
+ label: "Menu item A.2"
169
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
170
+ label: "Menu item A.3"
171
+ }))), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuDropdown, {
172
+ label: "Menu B"
173
+ }, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuList, null, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
174
+ label: "Menu item B.1"
175
+ }, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
176
+ label: "Menu item B.1.1",
177
+ onClick: subMenuItemOnClickSpy
178
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
179
+ label: "Menu item B.1.2"
180
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
181
+ label: "Menu item B.1.3"
182
+ })), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
183
+ label: "Menu item B.2"
184
+ }, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
185
+ label: "Menu item B.2.1"
186
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
187
+ label: "Menu item B.2.2"
188
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
189
+ label: "Menu item B.2.3"
190
+ })), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
191
+ label: "Menu item B.3",
192
+ disabled: true
193
+ }, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
194
+ label: "Menu item B.3.1"
195
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
196
+ label: "Menu item B.3.2"
197
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
198
+ label: "Menu item B.3.3"
199
+ })))), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuDropdown, {
200
+ label: "Menu C",
201
+ disabled: true
202
+ }, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuList, null, /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
203
+ label: "Menu item C.1"
204
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
205
+ label: "Menu item C.2"
206
+ }), /*#__PURE__*/_react2.default.createElement(_index.HoverMenuListItem, {
207
+ label: "Menu item C.3"
208
+ })))));
209
+ }
210
+
211
+ async function expectMenuItemsInDocument(items) {
212
+ for (const [text, inDocument] of items) {
213
+ if (inDocument) {
214
+ expect(await _react.screen.findByText(text)).toBeInTheDocument();
215
+ } else {
216
+ expect(_react.screen.queryByText(text)).not.toBeInTheDocument();
217
+ }
218
+ }
219
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _enzyme = require("enzyme");
4
+
5
+ var _react = _interopRequireDefault(require("react"));
6
+
7
+ var _index = require("../index.js");
8
+
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+
11
+ describe('<HoverMenuDropdown/>', () => {
12
+ /* Most of the props for this component are included
13
+ * in the mouse interaction tests for the HoverMenuBar.
14
+ * Only the `dataTest` prop needs to be verified here. */
15
+ it('accepts a `dataTest` prop', () => {
16
+ const dataTest = 'test';
17
+ const wrapper = (0, _enzyme.shallow)( /*#__PURE__*/_react.default.createElement(_index.HoverMenuDropdown, {
18
+ label: "test dropdown",
19
+ dataTest: dataTest
20
+ }, "children"));
21
+ expect(wrapper.find('button').prop('data-test')).toBe(dataTest);
22
+ });
23
+ });