@dhis2/analytics 25.2.1 → 25.2.2

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/CHANGELOG.md +4065 -0
  2. package/build/cjs/__demo__/FileMenu.stories.js +6 -8
  3. package/build/cjs/components/FileMenu/FileMenu.js +59 -21
  4. package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +194 -318
  5. package/build/cjs/components/Options/VisualizationOptions.js +1 -3
  6. package/build/cjs/index.js +46 -304
  7. package/build/cjs/locales/en/translations.json +0 -1
  8. package/build/es/__demo__/FileMenu.stories.js +6 -7
  9. package/build/es/components/FileMenu/FileMenu.js +57 -20
  10. package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +189 -293
  11. package/build/es/components/Options/VisualizationOptions.js +1 -3
  12. package/build/es/index.js +0 -1
  13. package/build/es/locales/en/translations.json +0 -1
  14. package/package.json +1 -3
  15. package/build/cjs/__demo__/Toolbar.stories.js +0 -77
  16. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuBar.js +0 -107
  17. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuDropdown.js +0 -66
  18. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuList.js +0 -94
  19. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuListItem.js +0 -99
  20. package/build/cjs/components/Toolbar/HoverMenuBar/HoverMenuListItem.styles.js +0 -13
  21. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +0 -219
  22. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +0 -23
  23. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +0 -56
  24. package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +0 -50
  25. package/build/cjs/components/Toolbar/HoverMenuBar/index.js +0 -37
  26. package/build/cjs/components/Toolbar/InterpretationsAndDetailsToggler.js +0 -50
  27. package/build/cjs/components/Toolbar/MenuButton.styles.js +0 -13
  28. package/build/cjs/components/Toolbar/Toolbar.js +0 -39
  29. package/build/cjs/components/Toolbar/ToolbarSidebar.js +0 -45
  30. package/build/cjs/components/Toolbar/UpdateButton.js +0 -57
  31. package/build/cjs/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +0 -50
  32. package/build/cjs/components/Toolbar/__tests__/Toolbar.spec.js +0 -24
  33. package/build/cjs/components/Toolbar/__tests__/ToolbarSidebar.spec.js +0 -30
  34. package/build/cjs/components/Toolbar/__tests__/UpdateButton.spec.js +0 -44
  35. package/build/cjs/components/Toolbar/index.js +0 -57
  36. package/build/es/__demo__/Toolbar.stories.js +0 -69
  37. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuBar.js +0 -90
  38. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuDropdown.js +0 -44
  39. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuList.js +0 -75
  40. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuListItem.js +0 -78
  41. package/build/es/components/Toolbar/HoverMenuBar/HoverMenuListItem.styles.js +0 -4
  42. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +0 -168
  43. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +0 -16
  44. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +0 -49
  45. package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +0 -41
  46. package/build/es/components/Toolbar/HoverMenuBar/index.js +0 -4
  47. package/build/es/components/Toolbar/InterpretationsAndDetailsToggler.js +0 -33
  48. package/build/es/components/Toolbar/MenuButton.styles.js +0 -4
  49. package/build/es/components/Toolbar/Toolbar.js +0 -24
  50. package/build/es/components/Toolbar/ToolbarSidebar.js +0 -29
  51. package/build/es/components/Toolbar/UpdateButton.js +0 -38
  52. package/build/es/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +0 -43
  53. package/build/es/components/Toolbar/__tests__/Toolbar.spec.js +0 -17
  54. package/build/es/components/Toolbar/__tests__/ToolbarSidebar.spec.js +0 -23
  55. package/build/es/components/Toolbar/__tests__/UpdateButton.spec.js +0 -37
  56. package/build/es/components/Toolbar/index.js +0 -5
@@ -1,90 +0,0 @@
1
- import _JSXStyle from "styled-jsx/style";
2
- import PropTypes from 'prop-types';
3
- import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
4
-
5
- const throwErrorIfNotInitialized = () => {
6
- throw new Error('`HoverMenubarContext` has not been initialised');
7
- };
8
-
9
- const HoverMenubarContext = /*#__PURE__*/createContext({
10
- closeMenu: throwErrorIfNotInitialized,
11
- onDropDownButtonClick: throwErrorIfNotInitialized,
12
- onDropDownButtonMouseOver: throwErrorIfNotInitialized,
13
- setLastHoveredSubMenuEl: throwErrorIfNotInitialized,
14
- openedDropdownEl: null
15
- });
16
-
17
- const useHoverMenubarContext = () => useContext(HoverMenubarContext);
18
-
19
- const HoverMenuBar = _ref => {
20
- let {
21
- children,
22
- dataTest
23
- } = _ref;
24
- const [openedDropdownEl, setOpenedDropdownEl] = useState(null);
25
- const [lastHoveredSubMenuEl, setLastHoveredSubMenuEl] = useState(null);
26
- const [isInHoverMode, setIsInHoverMode] = useState(false);
27
- const closeMenu = useCallback(() => {
28
- setIsInHoverMode(false);
29
- setOpenedDropdownEl(null);
30
- }, []);
31
- const onDocumentClick = useCallback(event => {
32
- const isClickOnOpenedSubMenuAnchor = lastHoveredSubMenuEl && (lastHoveredSubMenuEl === event.target || lastHoveredSubMenuEl.contains(event.target));
33
-
34
- if (!isClickOnOpenedSubMenuAnchor) {
35
- closeMenu();
36
- }
37
- }, [closeMenu, lastHoveredSubMenuEl]);
38
- const onDropDownButtonClick = useCallback(event => {
39
- if (!isInHoverMode) {
40
- setIsInHoverMode(true);
41
- setOpenedDropdownEl(event.currentTarget);
42
- } else {
43
- closeMenu();
44
- }
45
- }, [closeMenu, isInHoverMode]);
46
- const onDropDownButtonMouseOver = useCallback(event => {
47
- if (isInHoverMode) {
48
- setOpenedDropdownEl(event.currentTarget);
49
- }
50
- }, [isInHoverMode]);
51
- const closeMenuWithEsc = useCallback(event => {
52
- if (event.keyCode === 27) {
53
- closeMenu();
54
- }
55
- }, [closeMenu]);
56
- useEffect(() => {
57
- if (isInHoverMode) {
58
- document.addEventListener('click', onDocumentClick, {
59
- once: true
60
- });
61
- }
62
-
63
- return () => {
64
- document.removeEventListener('click', onDocumentClick);
65
- };
66
- }, [onDocumentClick, isInHoverMode]);
67
- return /*#__PURE__*/React.createElement(HoverMenubarContext.Provider, {
68
- value: {
69
- onDropDownButtonClick,
70
- onDropDownButtonMouseOver,
71
- openedDropdownEl,
72
- setLastHoveredSubMenuEl
73
- }
74
- }, /*#__PURE__*/React.createElement("div", {
75
- onKeyDown: closeMenuWithEsc,
76
- "data-test": dataTest,
77
- className: "jsx-3020154784"
78
- }, children, /*#__PURE__*/React.createElement(_JSXStyle, {
79
- id: "3020154784"
80
- }, [".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;}"])));
81
- };
82
-
83
- HoverMenuBar.defaultProps = {
84
- dataTest: 'dhis2-analytics-hovermenubar'
85
- };
86
- HoverMenuBar.propTypes = {
87
- children: PropTypes.node.isRequired,
88
- dataTest: PropTypes.string
89
- };
90
- export { HoverMenuBar, useHoverMenubarContext };
@@ -1,44 +0,0 @@
1
- import _JSXStyle from "styled-jsx/style";
2
- import { Popper } from '@dhis2-ui/popper';
3
- import { Portal } from '@dhis2-ui/portal';
4
- import PropTypes from 'prop-types';
5
- import React, { useRef } from 'react';
6
- import menuButtonStyles from '../MenuButton.styles.js';
7
- import { useHoverMenubarContext } from './HoverMenuBar.js';
8
- export const HoverMenuDropdown = _ref => {
9
- let {
10
- children,
11
- label,
12
- dataTest,
13
- disabled
14
- } = _ref;
15
- const buttonRef = useRef();
16
- const {
17
- onDropDownButtonClick,
18
- onDropDownButtonMouseOver,
19
- openedDropdownEl
20
- } = useHoverMenubarContext();
21
- const isOpen = openedDropdownEl === buttonRef.current;
22
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("button", {
23
- ref: buttonRef,
24
- onClick: onDropDownButtonClick,
25
- disabled: disabled,
26
- onMouseOver: disabled ? undefined : onDropDownButtonMouseOver,
27
- "data-test": dataTest,
28
- className: "jsx-".concat(menuButtonStyles.__hash)
29
- }, label, /*#__PURE__*/React.createElement(_JSXStyle, {
30
- id: menuButtonStyles.__hash
31
- }, menuButtonStyles)), isOpen && /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(Popper, {
32
- placement: "bottom-start",
33
- reference: buttonRef
34
- }, children)));
35
- };
36
- HoverMenuDropdown.defaultProps = {
37
- dataTest: 'dhis2-analytics-hovermenudropdown'
38
- };
39
- HoverMenuDropdown.propTypes = {
40
- children: PropTypes.node.isRequired,
41
- label: PropTypes.node.isRequired,
42
- dataTest: PropTypes.string,
43
- disabled: PropTypes.bool
44
- };
@@ -1,75 +0,0 @@
1
- import _JSXStyle from "styled-jsx/style";
2
- import { colors, elevations, spacers } from '@dhis2/ui-constants';
3
- import PropTypes from 'prop-types';
4
- import React, { createContext, useCallback, useContext, useState } from 'react';
5
- import { useHoverMenubarContext } from './HoverMenuBar.js';
6
-
7
- const throwErrorIfNotInitialized = () => {
8
- throw new Error('`HoverMenuListContext` has not been initialised');
9
- };
10
-
11
- const HoverMenuListContext = /*#__PURE__*/createContext({
12
- onSubmenuAnchorMouseEnter: throwErrorIfNotInitialized,
13
- onMenuItemMouseEnter: throwErrorIfNotInitialized,
14
- openedSubMenuEl: null,
15
- dense: false
16
- });
17
-
18
- const useHoverMenuListContext = () => useContext(HoverMenuListContext);
19
-
20
- const HoverMenuList = _ref => {
21
- let {
22
- children,
23
- className,
24
- dataTest,
25
- dense,
26
- maxHeight,
27
- maxWidth
28
- } = _ref;
29
- const {
30
- setLastHoveredSubMenuEl
31
- } = useHoverMenubarContext();
32
- const [openedSubMenuEl, setOpenedSubMenuEl] = useState(null);
33
- const onSubmenuAnchorMouseEnter = useCallback(event => {
34
- if (openedSubMenuEl !== event.currentTarget) {
35
- setOpenedSubMenuEl(event.currentTarget);
36
- setLastHoveredSubMenuEl(event.currentTarget);
37
- }
38
- }, [openedSubMenuEl, setLastHoveredSubMenuEl]);
39
- const onMenuItemMouseEnter = useCallback(() => {
40
- setOpenedSubMenuEl(null);
41
- setLastHoveredSubMenuEl(null);
42
- }, [setLastHoveredSubMenuEl]);
43
- return /*#__PURE__*/React.createElement(HoverMenuListContext.Provider, {
44
- value: {
45
- onSubmenuAnchorMouseEnter,
46
- onMenuItemMouseEnter,
47
- openedSubMenuEl,
48
- dense
49
- }
50
- }, /*#__PURE__*/React.createElement("ul", {
51
- "data-test": dataTest,
52
- className: _JSXStyle.dynamic([["3026610659", [colors.white, colors.grey200, elevations.e300, dense ? '128' : '180', maxWidth, maxHeight, spacers.dp4]]]) + " " + (className || "")
53
- }, children, /*#__PURE__*/React.createElement(_JSXStyle, {
54
- id: "3026610659",
55
- dynamic: [colors.white, colors.grey200, elevations.e300, dense ? '128' : '180', maxWidth, maxHeight, spacers.dp4]
56
- }, ["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(colors.white, ";border:1px solid ").concat(colors.grey200, ";border-radius:3px;box-shadow:").concat(elevations.e300, ";display:inline-block;min-width:").concat(dense ? '128' : '180', "px;max-width:").concat(maxWidth, ";max-height:").concat(maxHeight, ";padding:").concat(spacers.dp4, " 0;overflow:auto;list-style:none;}")])));
57
- };
58
-
59
- HoverMenuList.defaultProps = {
60
- dataTest: 'dhis2-analytics-hovermenulist',
61
- maxWidth: '380px',
62
- maxHeight: 'auto'
63
- };
64
- HoverMenuList.propTypes = {
65
- /** Typically `MenuItem`, `MenuDivider`, and `MenuSectionHeader` */
66
- children: PropTypes.node,
67
- className: PropTypes.string,
68
- dataTest: PropTypes.string,
69
-
70
- /** Gives all HoverMenuListItem children a dense style */
71
- dense: PropTypes.bool,
72
- maxHeight: PropTypes.string,
73
- maxWidth: PropTypes.string
74
- };
75
- export { HoverMenuList, useHoverMenuListContext };
@@ -1,78 +0,0 @@
1
- import _JSXStyle from "styled-jsx/style";
2
- import { Popper } from '@dhis2-ui/popper';
3
- import { Portal } from '@dhis2-ui/portal';
4
- import { IconChevronRight24 } from '@dhis2/ui-icons';
5
- import cx from 'classnames';
6
- import PropTypes from 'prop-types';
7
- import React, { useRef } from 'react';
8
- import { HoverMenuList, useHoverMenuListContext } from './HoverMenuList.js';
9
- import styles from './HoverMenuListItem.styles.js';
10
-
11
- const HoverMenuListItem = _ref => {
12
- let {
13
- onClick,
14
- children,
15
- icon,
16
- className,
17
- destructive,
18
- disabled,
19
- dataTest,
20
- label
21
- } = _ref;
22
- const ref = useRef();
23
- const {
24
- onSubmenuAnchorMouseEnter,
25
- onMenuItemMouseEnter,
26
- openedSubMenuEl,
27
- dense
28
- } = useHoverMenuListContext();
29
- const isSubMenuOpen = openedSubMenuEl === ref.current;
30
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("li", {
31
- ref: ref,
32
- "data-test": dataTest,
33
- onClick: !disabled && !children && onClick ? onClick : undefined,
34
- onMouseEnter: disabled ? undefined : children ? onSubmenuAnchorMouseEnter : onMenuItemMouseEnter,
35
- className: "jsx-".concat(styles.__hash) + " " + (cx(className, {
36
- destructive,
37
- disabled,
38
- dense,
39
- active: isSubMenuOpen,
40
- 'with-chevron': children
41
- }) || "")
42
- }, icon && /*#__PURE__*/React.createElement("span", {
43
- className: "jsx-".concat(styles.__hash) + " " + "icon"
44
- }, icon), /*#__PURE__*/React.createElement("span", {
45
- className: "jsx-".concat(styles.__hash) + " " + "label"
46
- }, label), !!children && /*#__PURE__*/React.createElement("span", {
47
- className: "jsx-".concat(styles.__hash) + " " + "chevron"
48
- }, /*#__PURE__*/React.createElement(IconChevronRight24, null)), /*#__PURE__*/React.createElement(_JSXStyle, {
49
- id: styles.__hash
50
- }, styles)), children && isSubMenuOpen && /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(Popper, {
51
- placement: "right-start",
52
- reference: ref
53
- }, /*#__PURE__*/React.createElement(HoverMenuList, {
54
- dense: dense
55
- }, children))));
56
- };
57
-
58
- HoverMenuListItem.defaultProps = {
59
- dataTest: 'dhis2-uicore-hovermenulistitem'
60
- };
61
- HoverMenuListItem.propTypes = {
62
- // Nested menu items become submenus
63
- children: PropTypes.node,
64
- className: PropTypes.string,
65
- dataTest: PropTypes.string,
66
- destructive: PropTypes.bool,
67
- disabled: PropTypes.bool,
68
-
69
- /** An icon for the left side of the menu item */
70
- icon: PropTypes.node,
71
-
72
- /** Text in the menu item */
73
- label: PropTypes.node,
74
-
75
- /** Click handler */
76
- onClick: PropTypes.func
77
- };
78
- export { HoverMenuListItem };
@@ -1,4 +0,0 @@
1
- import { colors, spacers } from '@dhis2/ui-constants';
2
- 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(spacers.dp24, ";cursor:pointer;list-style:none;background-color:").concat(colors.white, ";color:").concat(colors.grey900, ";fill:").concat(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(colors.grey200, ";}"), "li.jsx-1056713124:active,li.active.jsx-1056713124{background-color:".concat(colors.grey300, ";}"), "li.destructive.jsx-1056713124{color:".concat(colors.red700, ";fill:").concat(colors.red600, ";}"), "li.destructive.jsx-1056713124:hover{background-color:".concat(colors.red050, ";}"), "li.destructive.jsx-1056713124:active,li.destructive.active.jsx-1056713124{background-color:".concat(colors.red100, ";}"), "li.disabled.jsx-1056713124{cursor:not-allowed;color:".concat(colors.grey500, ";fill:").concat(colors.grey500, ";}"), "li.disabled.jsx-1056713124:hover{background-color:".concat(colors.white, ";}"), ".label.jsx-1056713124{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:".concat(spacers.dp12, " 0;}"), "li.dense.jsx-1056713124 .label.jsx-1056713124{padding:".concat(spacers.dp8, " 0;}"), ".icon.jsx-1056713124{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:".concat(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(spacers.dp24, ";}"), "li.dense.jsx-1056713124 .icon.jsx-1056713124{margin-right:".concat(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;}"];
3
- _defaultExport.__hash = "1056713124";
4
- export default _defaultExport;
@@ -1,168 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- import { render, fireEvent, screen } from '@testing-library/react';
3
- import { shallow } from 'enzyme';
4
- import React from 'react';
5
- import { HoverMenuBar, HoverMenuDropdown, HoverMenuList, HoverMenuListItem } from '../index.js';
6
- describe('<HoverMenuBar/>', () => {
7
- it('renders children', () => {
8
- const childNode = 'text node';
9
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuBar, null, childNode));
10
- expect(wrapper.containsMatchingElement(childNode)).toBe(true);
11
- });
12
- it('accepts a `dataTest` prop', () => {
13
- const dataTest = 'test';
14
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuBar, {
15
- dataTest: dataTest
16
- }, "children"));
17
- expect(wrapper.find('div').prop('data-test')).toBe(dataTest);
18
- });
19
- describe('mouse interactions', () => {
20
- it('does not open on hover before a dropdown anchor is clicked', async () => {
21
- createFullMenuBarWrapper();
22
- fireEvent.mouseOver(screen.getByText('Menu A'));
23
- await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item A.2', false], ['Menu item A.3', false]]);
24
- });
25
- it('does not open when a disabled dropdown anchor is clicked', async () => {
26
- createFullMenuBarWrapper();
27
- fireEvent.click(screen.getByText('Menu C'));
28
- await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item A.2', false], ['Menu item A.3', false]]);
29
- });
30
- it('opens menu list when clicked', async () => {
31
- createFullMenuBarWrapper();
32
- fireEvent.click(screen.getByText('Menu A'));
33
- await expectMenuItemsInDocument([['Menu item A.1', true], ['Menu item B.1', false], ['Menu item C.1', false]]);
34
- });
35
- it('responds to hover once open', async () => {
36
- createFullMenuBarWrapper();
37
- fireEvent.click(screen.getByText('Menu A'));
38
- fireEvent.mouseOver(screen.getByText('Menu B'));
39
- await expectMenuItemsInDocument([['Menu item A.1', false], ['Menu item B.1', true], ['Menu item C.1', false]]);
40
- });
41
- it('does not open disabled dropdown on hover in hover mode', async () => {
42
- createFullMenuBarWrapper();
43
- fireEvent.click(screen.getByText('Menu B'));
44
- fireEvent.mouseOver(screen.getByText('Menu C'));
45
- await expectMenuItemsInDocument([['Menu item B.1', true], ['Menu item C.1', false]]);
46
- });
47
- it('opens submenus when in hover mode', async () => {
48
- createFullMenuBarWrapper();
49
- fireEvent.click(screen.getByText('Menu B'));
50
- fireEvent.mouseOver(screen.getByText('Menu item B.1'));
51
- 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]]);
52
- fireEvent.mouseOver(screen.getByText('Menu item B.2'));
53
- 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]]);
54
- });
55
- it('does not open disabled submenus when in hover mode', async () => {
56
- createFullMenuBarWrapper();
57
- fireEvent.click(screen.getByText('Menu B'));
58
- fireEvent.mouseOver(screen.getByText('Menu item B.2'));
59
- 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]]);
60
- fireEvent.mouseOver(screen.getByText('Menu item B.3'));
61
- 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]]);
62
- });
63
- it('closes when clicking on then document', async () => {
64
- createFullMenuBarWrapper();
65
- fireEvent.click(screen.getByText('Menu A'));
66
- await expectMenuItemsInDocument([['Menu item A.1', true]]);
67
- fireEvent.click(document);
68
- await expectMenuItemsInDocument([['Menu item A.1', false]]);
69
- });
70
- it('stays open when clicking a open submenu anchor', async () => {
71
- createFullMenuBarWrapper();
72
- fireEvent.click(screen.getByText('Menu B'));
73
- await expectMenuItemsInDocument([['Menu item B.1', true]]);
74
- fireEvent.mouseOver(screen.getByText('Menu item B.1'));
75
- 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]]);
76
- fireEvent.click(screen.getByText('Menu item B.1'));
77
- 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]]);
78
- });
79
- it('calls the onClick of the menu item and closes when clicking a menu item', async () => {
80
- const menuItemOnClickSpy = jest.fn();
81
- createFullMenuBarWrapper({
82
- menuItemOnClickSpy
83
- });
84
- fireEvent.click(screen.getByText('Menu A'));
85
- await expectMenuItemsInDocument([['Menu item A.1', true]]);
86
- fireEvent.click(screen.getByText('Menu item A.1'));
87
- expect(menuItemOnClickSpy).toHaveBeenCalledTimes(1);
88
- await expectMenuItemsInDocument([['Menu item A.1', false]]);
89
- });
90
- it('calls the onClick of the menu item and closes when clicking a submenu item', async () => {
91
- const subMenuItemOnClickSpy = jest.fn();
92
- createFullMenuBarWrapper({
93
- subMenuItemOnClickSpy
94
- });
95
- fireEvent.click(screen.getByText('Menu B'));
96
- await expectMenuItemsInDocument([['Menu item B.1', true]]);
97
- fireEvent.mouseOver(screen.getByText('Menu item B.1'));
98
- await expectMenuItemsInDocument([['Menu item B.1.1', true]]);
99
- fireEvent.click(screen.getByText('Menu item B.1.1'));
100
- expect(subMenuItemOnClickSpy).toHaveBeenCalledTimes(1);
101
- await expectMenuItemsInDocument([['Menu item B.1', false], ['Menu item B.1.1', false], ['Menu item B.1.1', false]]);
102
- });
103
- });
104
- });
105
-
106
- function createFullMenuBarWrapper() {
107
- let {
108
- menuItemOnClickSpy,
109
- subMenuItemOnClickSpy
110
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
111
- return render( /*#__PURE__*/React.createElement(HoverMenuBar, null, /*#__PURE__*/React.createElement(HoverMenuDropdown, {
112
- label: "Menu A"
113
- }, /*#__PURE__*/React.createElement(HoverMenuList, null, /*#__PURE__*/React.createElement(HoverMenuListItem, {
114
- label: "Menu item A.1",
115
- onClick: menuItemOnClickSpy
116
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
117
- label: "Menu item A.2"
118
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
119
- label: "Menu item A.3"
120
- }))), /*#__PURE__*/React.createElement(HoverMenuDropdown, {
121
- label: "Menu B"
122
- }, /*#__PURE__*/React.createElement(HoverMenuList, null, /*#__PURE__*/React.createElement(HoverMenuListItem, {
123
- label: "Menu item B.1"
124
- }, /*#__PURE__*/React.createElement(HoverMenuListItem, {
125
- label: "Menu item B.1.1",
126
- onClick: subMenuItemOnClickSpy
127
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
128
- label: "Menu item B.1.2"
129
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
130
- label: "Menu item B.1.3"
131
- })), /*#__PURE__*/React.createElement(HoverMenuListItem, {
132
- label: "Menu item B.2"
133
- }, /*#__PURE__*/React.createElement(HoverMenuListItem, {
134
- label: "Menu item B.2.1"
135
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
136
- label: "Menu item B.2.2"
137
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
138
- label: "Menu item B.2.3"
139
- })), /*#__PURE__*/React.createElement(HoverMenuListItem, {
140
- label: "Menu item B.3",
141
- disabled: true
142
- }, /*#__PURE__*/React.createElement(HoverMenuListItem, {
143
- label: "Menu item B.3.1"
144
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
145
- label: "Menu item B.3.2"
146
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
147
- label: "Menu item B.3.3"
148
- })))), /*#__PURE__*/React.createElement(HoverMenuDropdown, {
149
- label: "Menu C",
150
- disabled: true
151
- }, /*#__PURE__*/React.createElement(HoverMenuList, null, /*#__PURE__*/React.createElement(HoverMenuListItem, {
152
- label: "Menu item C.1"
153
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
154
- label: "Menu item C.2"
155
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
156
- label: "Menu item C.3"
157
- })))));
158
- }
159
-
160
- async function expectMenuItemsInDocument(items) {
161
- for (const [text, inDocument] of items) {
162
- if (inDocument) {
163
- expect(await screen.findByText(text)).toBeInTheDocument();
164
- } else {
165
- expect(screen.queryByText(text)).not.toBeInTheDocument();
166
- }
167
- }
168
- }
@@ -1,16 +0,0 @@
1
- import { shallow } from 'enzyme';
2
- import React from 'react';
3
- import { HoverMenuDropdown } from '../index.js';
4
- describe('<HoverMenuDropdown/>', () => {
5
- /* Most of the props for this component are included
6
- * in the mouse interaction tests for the HoverMenuBar.
7
- * Only the `dataTest` prop needs to be verified here. */
8
- it('accepts a `dataTest` prop', () => {
9
- const dataTest = 'test';
10
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuDropdown, {
11
- label: "test dropdown",
12
- dataTest: dataTest
13
- }, "children"));
14
- expect(wrapper.find('button').prop('data-test')).toBe(dataTest);
15
- });
16
- });
@@ -1,49 +0,0 @@
1
- import { shallow, mount } from 'enzyme';
2
- import React from 'react';
3
- import { HoverMenuList, HoverMenuListItem } from '../index.js';
4
- describe('<HoverMenuList/>', () => {
5
- const dataTest = 'test';
6
- const childNode = 'children';
7
- it('renders children', () => {
8
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuList, null, childNode));
9
- expect(wrapper.containsMatchingElement(childNode)).toBe(true);
10
- });
11
- it('accept a `className` prop', () => {
12
- const className = 'className';
13
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuList, {
14
- className: className
15
- }, childNode));
16
- expect(wrapper.find('ul')).toHaveClassName(className);
17
- });
18
- it('accepts a `dataTest` prop', () => {
19
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuList, {
20
- dataTest: dataTest
21
- }, childNode));
22
- expect(wrapper.find('ul').prop('data-test')).toBe(dataTest);
23
- });
24
- it('accept a `dense` prop', () => {
25
- const wrapper = mount( /*#__PURE__*/React.createElement(HoverMenuList, {
26
- dense: true
27
- }, /*#__PURE__*/React.createElement(HoverMenuListItem, {
28
- label: "item 1"
29
- }), /*#__PURE__*/React.createElement(HoverMenuListItem, {
30
- label: "item 2"
31
- })));
32
- expect(wrapper.find('li').first()).toHaveClassName('dense');
33
- expect(wrapper.find('li').last()).toHaveClassName('dense');
34
- });
35
- it('accept a `maxHeight` prop', () => {
36
- const maxHeight = '100000px';
37
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuList, {
38
- maxHeight: maxHeight
39
- }, childNode));
40
- expect(wrapper.find('style').text()).toContain("max-height: ".concat(maxHeight));
41
- });
42
- it('accept a `maxWidth` prop', () => {
43
- const maxWidth = '100000px';
44
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuList, {
45
- maxWidth: maxWidth
46
- }, childNode));
47
- expect(wrapper.find('style').text()).toContain("max-width: ".concat(maxWidth));
48
- });
49
- });
@@ -1,41 +0,0 @@
1
- import { shallow } from 'enzyme';
2
- import React from 'react';
3
- import { HoverMenuListItem } from '../index.js';
4
- describe('<HoverMenuListItem/>', () => {
5
- /* Some of the props for this component are included
6
- * in the mouse interaction tests for the HoverMenuBar.
7
- * Only the `className`, `dataTest`, `destructive` and
8
- * `icon` prop need to be verified here. */
9
- it('accepts a `className` prop', () => {
10
- const className = 'className';
11
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuListItem, {
12
- className: className
13
- }));
14
- expect(wrapper.find('li')).toHaveClassName(className);
15
- });
16
- it('accepts a `dataTest` prop', () => {
17
- const dataTest = 'test';
18
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuListItem, {
19
- dataTest: dataTest
20
- }));
21
- expect(wrapper.find('li').prop('data-test')).toBe(dataTest);
22
- });
23
- it('accepts a `destructive` prop', () => {
24
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuListItem, {
25
- destructive: true
26
- }));
27
- expect(wrapper.find('li')).toHaveClassName('destructive');
28
- });
29
- it('accepts an `icon` prop', () => {
30
- const iconText = 'I am an icon';
31
- const icon = /*#__PURE__*/React.createElement("span", {
32
- id: "testicon"
33
- }, iconText);
34
- const wrapper = shallow( /*#__PURE__*/React.createElement(HoverMenuListItem, {
35
- icon: icon
36
- }));
37
- expect(wrapper.find('span.icon')).toExist();
38
- expect(wrapper.find('span#testicon')).toExist();
39
- expect(wrapper.find('span#testicon').text()).toBe(iconText);
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- export { HoverMenuBar } from './HoverMenuBar.js';
2
- export { HoverMenuDropdown } from './HoverMenuDropdown.js';
3
- export { HoverMenuList } from './HoverMenuList.js';
4
- export { HoverMenuListItem } from './HoverMenuListItem.js';
@@ -1,33 +0,0 @@
1
- import _JSXStyle from "styled-jsx/style";
2
- import i18n from '@dhis2/d2-i18n';
3
- import { IconChevronRight24, IconChevronLeft24 } from '@dhis2/ui';
4
- import PropTypes from 'prop-types';
5
- import React from 'react';
6
- import menuButtonStyles from './MenuButton.styles.js';
7
- export const InterpretationsAndDetailsToggler = _ref => {
8
- let {
9
- onClick,
10
- dataTest,
11
- disabled,
12
- isShowing
13
- } = _ref;
14
- return /*#__PURE__*/React.createElement("button", {
15
- onClick: onClick,
16
- disabled: disabled,
17
- "data-test": dataTest,
18
- className: "jsx-1238484262 " + "jsx-".concat(menuButtonStyles.__hash)
19
- }, isShowing ? /*#__PURE__*/React.createElement(IconChevronRight24, null) : /*#__PURE__*/React.createElement(IconChevronLeft24, null), i18n.t('Interpretations and details'), /*#__PURE__*/React.createElement(_JSXStyle, {
20
- id: menuButtonStyles.__hash
21
- }, menuButtonStyles), /*#__PURE__*/React.createElement(_JSXStyle, {
22
- id: "1238484262"
23
- }, ["button.jsx-1238484262{gap:8px;}"]));
24
- };
25
- InterpretationsAndDetailsToggler.defaultProps = {
26
- dataTest: 'dhis2-analytics-interpretationsanddetailstoggler'
27
- };
28
- InterpretationsAndDetailsToggler.propTypes = {
29
- onClick: PropTypes.func.isRequired,
30
- dataTest: PropTypes.string,
31
- disabled: PropTypes.bool,
32
- isShowing: PropTypes.bool
33
- };
@@ -1,4 +0,0 @@
1
- import { colors, spacers, theme } from '@dhis2/ui-constants';
2
- const _defaultExport = ["button.jsx-4266781296{all:unset;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;font-size:14px;line-height:14px;padding:0 ".concat(spacers.dp12, ";color:").concat(colors.grey900, ";-webkit-transition:background-color 250ms cubic-bezier(0.4,0,0.2,1) 0ms;transition:background-color 250ms cubic-bezier(0.4,0,0.2,1) 0ms;cursor:pointer;}"), "button.jsx-4266781296:hover.jsx-4266781296:enabled,button.jsx-4266781296:active{background-color:".concat(colors.grey200, ";}"), "button.jsx-4266781296:focus{outline:3px solid ".concat(theme.focus, ";outline-offset:-3px;}"), "button.jsx-4266781296:focus.jsx-4266781296:not(:focus-visible){outline:none;}", "button.jsx-4266781296:disabled{color:".concat(colors.grey500, ";cursor:not-allowed;}")];
3
- _defaultExport.__hash = "4266781296";
4
- export default _defaultExport;
@@ -1,24 +0,0 @@
1
- import _JSXStyle from "styled-jsx/style";
2
- import { colors } from '@dhis2/ui-constants';
3
- import PropTypes from 'prop-types';
4
- import React from 'react';
5
- export const Toolbar = _ref => {
6
- let {
7
- children,
8
- dataTest
9
- } = _ref;
10
- return /*#__PURE__*/React.createElement("div", {
11
- "data-test": dataTest,
12
- className: _JSXStyle.dynamic([["2617706539", [colors.grey400, colors.white]]])
13
- }, children, /*#__PURE__*/React.createElement(_JSXStyle, {
14
- id: "2617706539",
15
- dynamic: [colors.grey400, colors.white]
16
- }, ["div.__jsx-style-dynamic-selector{box-sizing:border-box;min-height:32px;max-height:32px;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;border-bottom:1px solid ".concat(colors.grey400, ";background-color:").concat(colors.white, ";}")]));
17
- };
18
- Toolbar.defaultProps = {
19
- dataTest: 'dhis2-analytics-toolbar'
20
- };
21
- Toolbar.propTypes = {
22
- children: PropTypes.node,
23
- dataTest: PropTypes.string
24
- };