rsuite 5.11.0 → 5.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/Nav/styles/index.less +7 -1
  3. package/Navbar/styles/index.less +6 -1
  4. package/Sidenav/styles/index.less +47 -9
  5. package/cjs/Cascader/DropdownMenu.js +8 -3
  6. package/cjs/Disclosure/Disclosure.d.ts +1 -1
  7. package/cjs/Disclosure/DisclosureContext.d.ts +1 -1
  8. package/cjs/Dropdown/Dropdown.js +26 -110
  9. package/cjs/Dropdown/DropdownItem.js +14 -58
  10. package/cjs/Dropdown/DropdownMenu.js +32 -76
  11. package/cjs/Dropdown/DropdownToggle.js +4 -17
  12. package/cjs/Form/Form.js +21 -7
  13. package/cjs/Form/FormContext.d.ts +18 -13
  14. package/cjs/Form/useSchemaModel.d.ts +9 -0
  15. package/cjs/Form/useSchemaModel.js +46 -0
  16. package/cjs/FormControl/FormControl.d.ts +3 -0
  17. package/cjs/FormControl/FormControl.js +9 -2
  18. package/cjs/FormControl/useRegisterModel.d.ts +4 -0
  19. package/cjs/FormControl/useRegisterModel.js +20 -0
  20. package/cjs/Menu/Menu.d.ts +1 -0
  21. package/cjs/Menu/Menu.js +1 -0
  22. package/cjs/Menu/MenuItem.d.ts +1 -0
  23. package/cjs/Menu/MenuItem.js +1 -0
  24. package/cjs/Menu/Menubar.d.ts +3 -0
  25. package/cjs/Menu/Menubar.js +4 -0
  26. package/cjs/Nav/Nav.d.ts +7 -2
  27. package/cjs/Nav/Nav.js +105 -5
  28. package/cjs/Nav/NavContext.d.ts +2 -8
  29. package/cjs/Nav/NavContext.js +1 -7
  30. package/cjs/Nav/NavDropdown.d.ts +71 -0
  31. package/cjs/Nav/NavDropdown.js +193 -0
  32. package/cjs/Nav/NavDropdownItem.d.ts +39 -0
  33. package/cjs/Nav/NavDropdownItem.js +141 -0
  34. package/cjs/Nav/NavDropdownMenu.d.ts +26 -0
  35. package/cjs/Nav/NavDropdownMenu.js +156 -0
  36. package/cjs/Nav/NavDropdownToggle.d.ts +21 -0
  37. package/cjs/Nav/NavDropdownToggle.js +74 -0
  38. package/cjs/Nav/NavItem.d.ts +2 -0
  39. package/cjs/Nav/NavItem.js +13 -26
  40. package/cjs/Nav/NavMenu.d.ts +38 -0
  41. package/cjs/Nav/NavMenu.js +122 -0
  42. package/cjs/Navbar/NavbarDropdown.d.ts +57 -0
  43. package/cjs/Navbar/NavbarDropdown.js +147 -0
  44. package/cjs/Navbar/NavbarDropdownItem.d.ts +41 -0
  45. package/cjs/Navbar/NavbarDropdownItem.js +149 -0
  46. package/cjs/Navbar/NavbarDropdownMenu.d.ts +37 -0
  47. package/cjs/Navbar/NavbarDropdownMenu.js +155 -0
  48. package/cjs/Navbar/NavbarDropdownToggle.d.ts +19 -0
  49. package/cjs/Navbar/NavbarDropdownToggle.js +72 -0
  50. package/cjs/Navbar/NavbarItem.d.ts +5 -2
  51. package/cjs/Navbar/NavbarItem.js +10 -4
  52. package/cjs/Overlay/OverlayTrigger.d.ts +4 -4
  53. package/cjs/Picker/utils.js +22 -15
  54. package/cjs/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  55. package/cjs/Sidenav/ExpandedSidenavDropdown.js +166 -0
  56. package/cjs/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  57. package/cjs/Sidenav/ExpandedSidenavDropdownItem.js +141 -0
  58. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  59. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.js +145 -0
  60. package/cjs/Sidenav/Sidenav.d.ts +8 -2
  61. package/cjs/Sidenav/Sidenav.js +1 -2
  62. package/cjs/Sidenav/SidenavDropdown.d.ts +30 -8
  63. package/cjs/Sidenav/SidenavDropdown.js +144 -73
  64. package/cjs/Sidenav/SidenavDropdownItem.d.ts +22 -5
  65. package/cjs/Sidenav/SidenavDropdownItem.js +88 -72
  66. package/cjs/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  67. package/cjs/Sidenav/SidenavDropdownMenu.js +122 -90
  68. package/cjs/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  69. package/cjs/Sidenav/SidenavDropdownToggle.js +72 -0
  70. package/cjs/Sidenav/SidenavItem.d.ts +3 -0
  71. package/cjs/Sidenav/SidenavItem.js +22 -14
  72. package/cjs/Sidenav/SidenavToggle.d.ts +5 -1
  73. package/cjs/Sidenav/SidenavToggle.js +25 -9
  74. package/cjs/Whisper/Whisper.d.ts +3 -5
  75. package/cjs/Whisper/test/Whisper.test.d.ts +1 -0
  76. package/cjs/Whisper/test/Whisper.test.js +23 -0
  77. package/cjs/index.d.ts +1 -1
  78. package/cjs/utils/deprecateComponent.js +4 -6
  79. package/cjs/utils/deprecatePropType.d.ts +1 -5
  80. package/cjs/utils/deprecatePropType.js +7 -14
  81. package/cjs/utils/treeUtils.js +8 -10
  82. package/cjs/utils/useInternalId.d.ts +1 -1
  83. package/cjs/utils/useInternalId.js +2 -2
  84. package/cjs/utils/warnOnce.d.ts +9 -0
  85. package/cjs/utils/warnOnce.js +22 -0
  86. package/dist/rsuite-rtl.css +81 -15
  87. package/dist/rsuite-rtl.min.css +1 -1
  88. package/dist/rsuite-rtl.min.css.map +1 -1
  89. package/dist/rsuite.css +81 -15
  90. package/dist/rsuite.js +303 -28
  91. package/dist/rsuite.js.map +1 -1
  92. package/dist/rsuite.min.css +1 -1
  93. package/dist/rsuite.min.css.map +1 -1
  94. package/dist/rsuite.min.js +1 -1
  95. package/dist/rsuite.min.js.map +1 -1
  96. package/esm/Cascader/DropdownMenu.js +8 -3
  97. package/esm/Disclosure/Disclosure.d.ts +1 -1
  98. package/esm/Disclosure/DisclosureContext.d.ts +1 -1
  99. package/esm/Dropdown/Dropdown.js +25 -105
  100. package/esm/Dropdown/DropdownItem.js +13 -55
  101. package/esm/Dropdown/DropdownMenu.js +31 -76
  102. package/esm/Dropdown/DropdownToggle.js +4 -14
  103. package/esm/Form/Form.js +19 -7
  104. package/esm/Form/FormContext.d.ts +18 -13
  105. package/esm/Form/useSchemaModel.d.ts +9 -0
  106. package/esm/Form/useSchemaModel.js +39 -0
  107. package/esm/FormControl/FormControl.d.ts +3 -0
  108. package/esm/FormControl/FormControl.js +9 -6
  109. package/esm/FormControl/useRegisterModel.d.ts +4 -0
  110. package/esm/FormControl/useRegisterModel.js +14 -0
  111. package/esm/Menu/Menu.d.ts +1 -0
  112. package/esm/Menu/Menu.js +1 -0
  113. package/esm/Menu/MenuItem.d.ts +1 -0
  114. package/esm/Menu/MenuItem.js +1 -0
  115. package/esm/Menu/Menubar.d.ts +3 -0
  116. package/esm/Menu/Menubar.js +4 -0
  117. package/esm/Nav/Nav.d.ts +7 -2
  118. package/esm/Nav/Nav.js +96 -5
  119. package/esm/Nav/NavContext.d.ts +2 -8
  120. package/esm/Nav/NavContext.js +1 -6
  121. package/esm/Nav/NavDropdown.d.ts +71 -0
  122. package/esm/Nav/NavDropdown.js +170 -0
  123. package/esm/Nav/NavDropdownItem.d.ts +39 -0
  124. package/esm/Nav/NavDropdownItem.js +123 -0
  125. package/esm/Nav/NavDropdownMenu.d.ts +26 -0
  126. package/esm/Nav/NavDropdownMenu.js +138 -0
  127. package/esm/Nav/NavDropdownToggle.d.ts +21 -0
  128. package/esm/Nav/NavDropdownToggle.js +57 -0
  129. package/esm/Nav/NavItem.d.ts +2 -0
  130. package/esm/Nav/NavItem.js +13 -21
  131. package/esm/Nav/NavMenu.d.ts +38 -0
  132. package/esm/Nav/NavMenu.js +98 -0
  133. package/esm/Navbar/NavbarDropdown.d.ts +57 -0
  134. package/esm/Navbar/NavbarDropdown.js +124 -0
  135. package/esm/Navbar/NavbarDropdownItem.d.ts +41 -0
  136. package/esm/Navbar/NavbarDropdownItem.js +128 -0
  137. package/esm/Navbar/NavbarDropdownMenu.d.ts +37 -0
  138. package/esm/Navbar/NavbarDropdownMenu.js +135 -0
  139. package/esm/Navbar/NavbarDropdownToggle.d.ts +19 -0
  140. package/esm/Navbar/NavbarDropdownToggle.js +55 -0
  141. package/esm/Navbar/NavbarItem.d.ts +5 -2
  142. package/esm/Navbar/NavbarItem.js +11 -4
  143. package/esm/Overlay/OverlayTrigger.d.ts +4 -4
  144. package/esm/Picker/utils.js +22 -14
  145. package/esm/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  146. package/esm/Sidenav/ExpandedSidenavDropdown.js +140 -0
  147. package/esm/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  148. package/esm/Sidenav/ExpandedSidenavDropdownItem.js +120 -0
  149. package/esm/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  150. package/esm/Sidenav/ExpandedSidenavDropdownMenu.js +121 -0
  151. package/esm/Sidenav/Sidenav.d.ts +8 -2
  152. package/esm/Sidenav/Sidenav.js +1 -2
  153. package/esm/Sidenav/SidenavDropdown.d.ts +30 -8
  154. package/esm/Sidenav/SidenavDropdown.js +145 -75
  155. package/esm/Sidenav/SidenavDropdownItem.d.ts +22 -5
  156. package/esm/Sidenav/SidenavDropdownItem.js +87 -71
  157. package/esm/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  158. package/esm/Sidenav/SidenavDropdownMenu.js +122 -86
  159. package/esm/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  160. package/esm/Sidenav/SidenavDropdownToggle.js +55 -0
  161. package/esm/Sidenav/SidenavItem.d.ts +3 -0
  162. package/esm/Sidenav/SidenavItem.js +23 -15
  163. package/esm/Sidenav/SidenavToggle.d.ts +5 -1
  164. package/esm/Sidenav/SidenavToggle.js +22 -9
  165. package/esm/Whisper/Whisper.d.ts +3 -5
  166. package/esm/Whisper/test/Whisper.test.d.ts +1 -0
  167. package/esm/Whisper/test/Whisper.test.js +16 -0
  168. package/esm/index.d.ts +1 -1
  169. package/esm/utils/deprecateComponent.js +3 -4
  170. package/esm/utils/deprecatePropType.d.ts +1 -5
  171. package/esm/utils/deprecatePropType.js +3 -13
  172. package/esm/utils/treeUtils.js +8 -10
  173. package/esm/utils/useInternalId.d.ts +1 -1
  174. package/esm/utils/useInternalId.js +2 -2
  175. package/esm/utils/warnOnce.d.ts +9 -0
  176. package/esm/utils/warnOnce.js +18 -0
  177. package/package.json +1 -1
  178. package/styles/color-modes/dark.less +3 -0
  179. package/styles/color-modes/high-contrast.less +3 -0
  180. package/styles/color-modes/light.less +3 -0
  181. package/styles/variables.less +3 -0
@@ -0,0 +1,121 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTemplateLiteralLoose";
3
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
+
5
+ var _templateObject, _templateObject2;
6
+
7
+ import React, { useCallback, useContext } from 'react';
8
+ import isNil from 'lodash/isNil';
9
+ import omit from 'lodash/omit';
10
+ import { createChainedFunction, useClassNames } from '../utils';
11
+ import { SidenavContext } from './Sidenav';
12
+ import useCustom from '../utils/useCustom';
13
+ import ArrowLeftLine from '@rsuite/icons/ArrowLeftLine';
14
+ import ArrowRightLine from '@rsuite/icons/ArrowRightLine';
15
+ import PropTypes from 'prop-types';
16
+ import SidenavDropdownCollapse from './SidenavDropdownCollapse';
17
+ import Ripple from '../Ripple';
18
+ import Disclosure from '../Disclosure/Disclosure';
19
+
20
+ /**
21
+ * Tree View Node
22
+ * @see https://www.w3.org/TR/wai-aria-practices-1.2/#TreeView
23
+ */
24
+ var ExpandedSidenavDropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
25
+ var sidenavContext = useContext(SidenavContext);
26
+
27
+ if (!sidenavContext) {
28
+ throw new Error('<SidenavDropdownMenu> component is not supposed to be used standalone. Use <Nav.Menu> inside <Sidenav> instead.');
29
+ }
30
+
31
+ var _props$as = props.as,
32
+ Component = _props$as === void 0 ? 'li' : _props$as,
33
+ children = props.children,
34
+ disabled = props.disabled,
35
+ className = props.className,
36
+ style = props.style,
37
+ _props$classPrefix = props.classPrefix,
38
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown-item' : _props$classPrefix,
39
+ tabIndex = props.tabIndex,
40
+ icon = props.icon,
41
+ title = props.title,
42
+ eventKey = props.eventKey,
43
+ onClick = props.onClick,
44
+ onSelect = props.onSelect,
45
+ rest = _objectWithoutPropertiesLoose(props, ["as", "children", "disabled", "className", "style", "classPrefix", "tabIndex", "icon", "title", "eventKey", "onClick", "onSelect"]);
46
+
47
+ var _useCustom = useCustom('DropdownMenu'),
48
+ rtl = _useCustom.rtl;
49
+
50
+ var _useClassNames = useClassNames(classPrefix),
51
+ merge = _useClassNames.merge,
52
+ withClassPrefix = _useClassNames.withClassPrefix,
53
+ prefix = _useClassNames.prefix;
54
+
55
+ var _sidenavContext$openK = sidenavContext.openKeys,
56
+ openKeys = _sidenavContext$openK === void 0 ? [] : _sidenavContext$openK,
57
+ onOpenChange = sidenavContext.onOpenChange,
58
+ onSidenavSelect = sidenavContext.onSelect;
59
+ var handleClick = useCallback(function (event) {
60
+ if (disabled) return;
61
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(eventKey, event);
62
+ onSidenavSelect === null || onSidenavSelect === void 0 ? void 0 : onSidenavSelect(eventKey, event);
63
+ }, [disabled, onSelect, onSidenavSelect, eventKey]);
64
+ var menuitemEventHandlers = {
65
+ onClick: createChainedFunction(handleClick, onClick)
66
+ };
67
+ var Icon = rtl ? ArrowLeftLine : ArrowRightLine;
68
+ return /*#__PURE__*/React.createElement(Disclosure, {
69
+ open: !isNil(eventKey) && openKeys.includes(eventKey),
70
+ onToggle: function onToggle(_, event) {
71
+ return onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(eventKey, event);
72
+ }
73
+ }, function (_ref) {
74
+ var open = _ref.open;
75
+ var classes = merge(className, prefix('submenu'), prefix("pull-" + (rtl ? 'left' : 'right')), prefix(open ? 'expand' : 'collapse'), withClassPrefix({
76
+ 'with-icon': icon,
77
+ // open,
78
+ disabled: disabled
79
+ }));
80
+ return /*#__PURE__*/React.createElement(Component, _extends({
81
+ ref: ref
82
+ }, rest, {
83
+ tabIndex: disabled ? -1 : tabIndex,
84
+ style: style,
85
+ className: classes
86
+ }, menuitemEventHandlers), /*#__PURE__*/React.createElement(Disclosure.Button, null, function (buttonProps) {
87
+ return /*#__PURE__*/React.createElement("button", _extends({
88
+ className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["toggle"]))),
89
+ onClick: handleClick
90
+ }, omit(buttonProps, ['open'])), icon && /*#__PURE__*/React.cloneElement(icon, {
91
+ className: prefix('menu-icon')
92
+ }), title, /*#__PURE__*/React.createElement(Icon, {
93
+ className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["toggle-icon"])))
94
+ }), /*#__PURE__*/React.createElement(Ripple, null));
95
+ }), /*#__PURE__*/React.createElement(Disclosure.Content, null, function (_ref2) {
96
+ var open = _ref2.open;
97
+ return /*#__PURE__*/React.createElement(SidenavDropdownCollapse, {
98
+ open: open
99
+ }, children);
100
+ }));
101
+ });
102
+ });
103
+ ExpandedSidenavDropdownMenu.displayName = 'Sidenav.Dropdown.Menu';
104
+ ExpandedSidenavDropdownMenu.propTypes = {
105
+ as: PropTypes.elementType,
106
+ expanded: PropTypes.bool,
107
+ disabled: PropTypes.bool,
108
+ onSelect: PropTypes.func,
109
+ onClick: PropTypes.func,
110
+ icon: PropTypes.node,
111
+ eventKey: PropTypes.any,
112
+ className: PropTypes.string,
113
+ style: PropTypes.object,
114
+ children: PropTypes.node,
115
+ classPrefix: PropTypes.string,
116
+ tabIndex: PropTypes.number,
117
+ title: PropTypes.node,
118
+ onMouseOver: PropTypes.func,
119
+ onMouseOut: PropTypes.func
120
+ };
121
+ export default ExpandedSidenavDropdownMenu;
@@ -21,17 +21,23 @@ export interface SidenavProps<T = string> extends WithAsProps {
21
21
  onOpenChange?: (openKeys: T[], event: React.SyntheticEvent) => void;
22
22
  /**
23
23
  * Select the callback function for the menu
24
- * @deprecated Use <Sidenav onSelect> instead
24
+ * @deprecated Use <Nav onSelect> instead
25
25
  */
26
26
  onSelect?: (eventKey: T | undefined, event: React.SyntheticEvent) => void;
27
27
  }
28
28
  export declare const SidenavContext: React.Context<SidenavContextType<string> | null>;
29
29
  export interface SidenavContextType<T = string> {
30
30
  openKeys: T[];
31
- activeKey: T | null;
31
+ /**
32
+ * @deprecated Use activeKey from NavContext instead
33
+ */
34
+ activeKey: T | undefined;
32
35
  sidenav: boolean;
33
36
  expanded: boolean;
34
37
  onOpenChange: (eventKey: T, event: React.SyntheticEvent) => void;
38
+ /**
39
+ * @deprecated Use onSelect from NavContext instead
40
+ */
35
41
  onSelect?: (eventKey: T | undefined, event: React.SyntheticEvent) => void;
36
42
  }
37
43
  export interface SidenavComponent extends RsRefForwardingComponent<'div', SidenavProps> {
@@ -22,8 +22,7 @@ var Sidenav = /*#__PURE__*/React.forwardRef(function (props, ref) {
22
22
  appearance = _props$appearance === void 0 ? 'default' : _props$appearance,
23
23
  _props$expanded = props.expanded,
24
24
  expanded = _props$expanded === void 0 ? true : _props$expanded,
25
- _props$activeKey = props.activeKey,
26
- activeKey = _props$activeKey === void 0 ? null : _props$activeKey,
25
+ activeKey = props.activeKey,
27
26
  _props$defaultOpenKey = props.defaultOpenKeys,
28
27
  defaultOpenKeys = _props$defaultOpenKey === void 0 ? emptyArray : _props$defaultOpenKey,
29
28
  openKeysProp = props.openKeys,
@@ -1,13 +1,17 @@
1
1
  import React from 'react';
2
2
  import { TypeAttributes, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
3
  import { IconProps } from '@rsuite/icons/lib/Icon';
4
- export interface SidenavDropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
4
+ import Button from '../Button';
5
+ import NavDropdownItem from '../Nav/NavDropdownItem';
6
+ import NavDropdownMenu from '../Nav/NavDropdownMenu';
7
+ export declare type SidenavDropdownTrigger = 'click' | 'hover' | 'contextMenu';
8
+ export interface NavDropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect' | 'title'> {
5
9
  /** Define the title as a submenu */
6
10
  title?: React.ReactNode;
7
11
  /** Set the icon */
8
12
  icon?: React.ReactElement<IconProps>;
9
- /** The option to activate the state, corresponding to the eventkey in the Dropdown.item */
10
- activeKey?: T;
13
+ /** Triggering events */
14
+ trigger?: SidenavDropdownTrigger | readonly SidenavDropdownTrigger[];
11
15
  /** The placement of Menu */
12
16
  placement?: TypeAttributes.Placement8;
13
17
  /** Whether or not component is disabled */
@@ -28,10 +32,9 @@ export interface SidenavDropdownProps<T = any> extends WithAsProps, Omit<React.H
28
32
  */
29
33
  open?: boolean;
30
34
  /**
31
- * Custom title
32
- * @deprecated Use `renderToggle` instead.
35
+ * @deprecated
33
36
  */
34
- renderTitle?: (children?: React.ReactNode) => React.ReactNode;
37
+ renderTitle?: (children: React.ReactNode) => React.ReactNode;
35
38
  /** Custom Toggle */
36
39
  renderToggle?: (props: WithAsProps, ref: React.Ref<any>) => any;
37
40
  /** The callback function that the menu closes */
@@ -39,7 +42,26 @@ export interface SidenavDropdownProps<T = any> extends WithAsProps, Omit<React.H
39
42
  /** Menu Pop-up callback function */
40
43
  onOpen?: () => void;
41
44
  /** Callback function for menu state switching */
42
- onToggle?: (open?: boolean) => void;
45
+ onToggle?: (open: boolean, eventKey?: T | undefined, event?: React.SyntheticEvent) => void;
46
+ }
47
+ export interface SidenavDropdownComponent extends RsRefForwardingComponent<'div', NavDropdownProps> {
48
+ <ToggleAs extends React.ElementType = typeof Button>(props: NavDropdownProps & {
49
+ ref?: React.Ref<any>;
50
+ toggleAs?: ToggleAs;
51
+ } & React.ComponentProps<ToggleAs>, context: any): JSX.Element | null;
52
+ Item: typeof NavDropdownItem;
53
+ Menu: typeof NavDropdownMenu;
43
54
  }
44
- declare const SidenavDropdown: RsRefForwardingComponent<'li', SidenavDropdownProps>;
55
+ /**
56
+ * @private this component is not supposed to be used directly
57
+ * Instead it's rendered by a <Nav.Menu> within a <Sidenav>
58
+ *
59
+ * <Sidenav>
60
+ * <Nav>
61
+ * <Nav.Menu> -> This submenu will render <SidenavDropdown> component
62
+ * </Nav.Menu>
63
+ * </Nav>
64
+ * </Sidenav>
65
+ */
66
+ declare const SidenavDropdown: SidenavDropdownComponent;
45
67
  export default SidenavDropdown;
@@ -1,109 +1,180 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useContext, useCallback } from 'react';
3
+ import React, { useContext, useMemo } from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import kebabCase from 'lodash/kebabCase';
6
5
  import omit from 'lodash/omit';
7
- import DropdownToggle from '../Dropdown/DropdownToggle';
8
- import { useClassNames, placementPolyfill, PLACEMENT_8, mergeRefs } from '../utils';
6
+ import pick from 'lodash/pick';
7
+ import { mergeRefs, PLACEMENT_8, placementPolyfill, useClassNames } from '../utils';
9
8
  import { SidenavContext } from './Sidenav';
10
9
  import deprecatePropType from '../utils/deprecatePropType';
11
- import SidenavDropdownCollapse from './SidenavDropdownCollapse';
12
- import Disclosure from '../Disclosure/Disclosure';
13
- import DropdownContext from '../Dropdown/DropdownContext';
14
- import useInternalId from '../utils/useInternalId';
10
+ import Menu from '../Menu/Menu';
11
+ import MenuItem from '../Menu/MenuItem';
12
+ import kebabCase from 'lodash/kebabCase';
13
+ import ExpandedSidenavDropdown from './ExpandedSidenavDropdown';
14
+ import NavContext from '../Nav/NavContext';
15
+ import NavDropdownItem from '../Nav/NavDropdownItem';
16
+ import NavDropdownMenu from '../Nav/NavDropdownMenu';
17
+ import SidenavDropdownToggle from './SidenavDropdownToggle';
18
+ import { NavMenuContext } from '../Nav/NavMenu';
19
+
20
+ /**
21
+ * @private this component is not supposed to be used directly
22
+ * Instead it's rendered by a <Nav.Menu> within a <Sidenav>
23
+ *
24
+ * <Sidenav>
25
+ * <Nav>
26
+ * <Nav.Menu> -> This submenu will render <SidenavDropdown> component
27
+ * </Nav.Menu>
28
+ * </Nav>
29
+ * </Sidenav>
30
+ */
15
31
  var SidenavDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
32
+ var sidenav = useContext(SidenavContext);
33
+ var nav = useContext(NavContext);
34
+ var navMenu = useContext(NavMenuContext);
35
+
36
+ if (!sidenav || !nav || !navMenu) {
37
+ throw new Error('<Sidenav.Dropdown> must be rendered within a <Nav> component within a <Sidenav> component.');
38
+ }
39
+
16
40
  var _props$as = props.as,
17
41
  Component = _props$as === void 0 ? 'div' : _props$as,
18
42
  title = props.title,
19
- children = props.children,
20
- className = props.className,
21
- menuStyle = props.menuStyle,
22
- disabled = props.disabled,
23
- renderTitle = props.renderTitle,
24
- renderToggle = props.renderToggle,
25
- _props$classPrefix = props.classPrefix,
26
- classPrefix = _props$classPrefix === void 0 ? 'dropdown' : _props$classPrefix,
43
+ onClose = props.onClose,
44
+ onOpen = props.onOpen,
45
+ onToggle = props.onToggle,
46
+ eventKey = props.eventKey,
47
+ _props$trigger = props.trigger,
48
+ trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
27
49
  _props$placement = props.placement,
28
50
  placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
29
- toggleClassName = props.toggleClassName,
30
- icon = props.icon,
31
- eventKey = props.eventKey,
32
51
  toggleAs = props.toggleAs,
33
- noCaret = props.noCaret,
52
+ toggleClassName = props.toggleClassName,
53
+ _props$classPrefix = props.classPrefix,
54
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown' : _props$classPrefix,
55
+ className = props.className,
56
+ disabled = props.disabled,
57
+ children = props.children,
58
+ menuStyle = props.menuStyle,
34
59
  style = props.style,
35
- onOpen = props.onOpen,
36
- onClose = props.onClose,
37
- openProp = props.open,
38
- onToggle = props.onToggle,
39
- rest = _objectWithoutPropertiesLoose(props, ["as", "title", "children", "className", "menuStyle", "disabled", "renderTitle", "renderToggle", "classPrefix", "placement", "toggleClassName", "icon", "eventKey", "toggleAs", "noCaret", "style", "onOpen", "onClose", "open", "onToggle"]);
40
-
41
- var sidenavContext = useContext(SidenavContext);
42
- var dropdownContext = useContext(DropdownContext);
60
+ toggleProps = _objectWithoutPropertiesLoose(props, ["as", "title", "onClose", "onOpen", "onToggle", "eventKey", "trigger", "placement", "toggleAs", "toggleClassName", "classPrefix", "className", "disabled", "children", "menuStyle", "style"]);
43
61
 
44
62
  var _useClassNames = useClassNames(classPrefix),
45
63
  merge = _useClassNames.merge,
46
- withClassPrefix = _useClassNames.withClassPrefix;
64
+ withClassPrefix = _useClassNames.withClassPrefix,
65
+ prefix = _useClassNames.prefix;
47
66
 
48
- var internalId = useInternalId('SidenavDropdown');
49
- var uniqueKey = eventKey !== null && eventKey !== void 0 ? eventKey : internalId;
67
+ var _useClassNames2 = useClassNames('dropdown-menu'),
68
+ withMenuClassPrefix = _useClassNames2.withClassPrefix,
69
+ mergeMenuClassName = _useClassNames2.merge;
50
70
 
51
- if (!sidenavContext || !dropdownContext) {
52
- throw new Error('<SidenavDropdown> component is not supposed to be used standalone. Use <Dropdown> inside <Sidenav> instead.');
53
- }
71
+ var _useClassNames3 = useClassNames('nav-item'),
72
+ withNavItemClassPrefix = _useClassNames3.withClassPrefix,
73
+ mergeNavItemClassNames = _useClassNames3.merge;
74
+
75
+ var items = navMenu[0].items;
76
+ var hasSelectedItems = // has items that is active indicated by <Nav activeKey>
77
+ nav.activeKey && items.some(function (item) {
78
+ return item.eventKey === nav.activeKey;
79
+ }) || // has items that is active indicated by <Nav.Item active>
80
+ items.some(function (item) {
81
+ return item.active;
82
+ });
83
+ var menuButtonTriggers = useMemo(function () {
84
+ if (!trigger) {
85
+ return undefined;
86
+ }
87
+
88
+ var triggerMap = {
89
+ hover: 'mouseover',
90
+ click: 'click',
91
+ contextMenu: 'contextmenu'
92
+ };
54
93
 
55
- var _sidenavContext$openK = sidenavContext.openKeys,
56
- openKeys = _sidenavContext$openK === void 0 ? [] : _sidenavContext$openK,
57
- onOpenChange = sidenavContext.onOpenChange;
58
- var hasSelectedItem = dropdownContext.hasSelectedItem;
59
- var handleToggleDisclosure = useCallback(function (open, event) {
60
- if (open) {
61
- onClose === null || onClose === void 0 ? void 0 : onClose();
62
- } else {
63
- onOpen === null || onOpen === void 0 ? void 0 : onOpen();
94
+ if (!Array.isArray(trigger)) {
95
+ return [triggerMap[trigger]];
64
96
  }
65
97
 
66
- onToggle === null || onToggle === void 0 ? void 0 : onToggle(open);
67
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(uniqueKey, event);
68
- }, [onClose, onOpen, onToggle, uniqueKey, onOpenChange]);
69
- var open = openProp !== null && openProp !== void 0 ? openProp : openKeys.includes(uniqueKey);
70
- return /*#__PURE__*/React.createElement(Disclosure, {
71
- open: open,
72
- onToggle: handleToggleDisclosure
73
- }, function (_ref, containerRef) {
98
+ return trigger.map(function (t) {
99
+ return triggerMap[t];
100
+ });
101
+ }, [trigger]); // Render a disclosure when inside expanded <Sidenav>
102
+
103
+ if (sidenav.expanded) {
104
+ return /*#__PURE__*/React.createElement(ExpandedSidenavDropdown, _extends({
105
+ ref: ref
106
+ }, props));
107
+ }
108
+
109
+ var renderMenuButton = function renderMenuButton(menuButtonProps, buttonRef) {
110
+ return /*#__PURE__*/React.createElement(MenuItem, {
111
+ disabled: disabled
112
+ }, function (_ref, menuitemRef) {
113
+ var active = _ref.active,
114
+ menuitemProps = _objectWithoutPropertiesLoose(_ref, ["active"]);
115
+
116
+ return /*#__PURE__*/React.createElement(SidenavDropdownToggle, _extends({
117
+ ref: mergeRefs(buttonRef, menuitemRef),
118
+ as: toggleAs,
119
+ className: mergeNavItemClassNames(toggleClassName, withNavItemClassPrefix({
120
+ focus: active
121
+ }))
122
+ }, menuButtonProps, omit(menuitemProps, ['onClick']), omit(toggleProps, 'data-testid')), title);
123
+ });
124
+ };
125
+
126
+ return /*#__PURE__*/React.createElement(Menu, {
127
+ menuButtonText: title,
128
+ renderMenuButton: renderMenuButton,
129
+ openMenuOn: menuButtonTriggers,
130
+ renderMenuPopup: function renderMenuPopup(_ref2, popupRef) {
131
+ var open = _ref2.open,
132
+ popupProps = _objectWithoutPropertiesLoose(_ref2, ["open"]);
133
+
134
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix({})); // When inside a collapsed <Sidenav>, render a header in menu
135
+
136
+ var showHeader = !!sidenav;
137
+ return /*#__PURE__*/React.createElement("ul", _extends({
138
+ ref: popupRef,
139
+ className: menuClassName,
140
+ style: menuStyle,
141
+ hidden: !open
142
+ }, popupProps), showHeader && /*#__PURE__*/React.createElement("div", {
143
+ className: prefix('header')
144
+ }, title), children);
145
+ },
146
+ onToggleMenu: function onToggleMenu(open, event) {
147
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(open, eventKey, event);
148
+ sidenav === null || sidenav === void 0 ? void 0 : sidenav.onOpenChange(eventKey, event);
149
+
150
+ if (open) {
151
+ onOpen === null || onOpen === void 0 ? void 0 : onOpen();
152
+ } else {
153
+ onClose === null || onClose === void 0 ? void 0 : onClose();
154
+ }
155
+ }
156
+ }, function (_ref3, menuContainerRef) {
74
157
  var _withClassPrefix;
75
158
 
76
- var open = _ref.open;
77
- var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _withClassPrefix[open ? 'expand' : 'collapse'] = true, _withClassPrefix.disabled = disabled, _withClassPrefix['selected-within'] = hasSelectedItem, _withClassPrefix['no-caret'] = noCaret, _withClassPrefix)));
159
+ var open = _ref3.open,
160
+ menuContainer = _objectWithoutPropertiesLoose(_ref3, ["open"]);
161
+
162
+ var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix.disabled = disabled, _withClassPrefix.open = open, _withClassPrefix.submenu = true, _withClassPrefix['selected-within'] = hasSelectedItems, _withClassPrefix)));
78
163
  return /*#__PURE__*/React.createElement(Component, _extends({
79
- ref: mergeRefs(ref, containerRef),
80
- style: style,
164
+ ref: mergeRefs(ref, menuContainerRef),
81
165
  className: classes
82
- }, rest, {
83
- "data-event-key": eventKey
84
- }), /*#__PURE__*/React.createElement(Disclosure.Button, null, function (buttonProps, buttonRef) {
85
- return /*#__PURE__*/React.createElement(DropdownToggle, _extends({
86
- ref: buttonRef,
87
- as: toggleAs,
88
- noCaret: noCaret,
89
- className: toggleClassName,
90
- renderToggle: renderToggle,
91
- icon: icon,
92
- placement: placement
93
- }, omit(buttonProps, ['open'])), title);
94
- }), /*#__PURE__*/React.createElement(Disclosure.Content, null, function (_ref2) {
95
- var open = _ref2.open;
96
- return /*#__PURE__*/React.createElement(SidenavDropdownCollapse, {
97
- open: open,
98
- style: menuStyle
99
- }, children);
166
+ }, menuContainer, pick(toggleProps, ['data-testid']), {
167
+ style: style
100
168
  }));
101
169
  });
102
170
  });
171
+ SidenavDropdown.Item = NavDropdownItem;
172
+ SidenavDropdown.Menu = NavDropdownMenu;
103
173
  SidenavDropdown.displayName = 'Sidenav.Dropdown';
104
174
  SidenavDropdown.propTypes = {
105
175
  activeKey: PropTypes.any,
106
176
  classPrefix: PropTypes.string,
177
+ trigger: PropTypes.oneOfType([PropTypes.array, PropTypes.oneOf(['click', 'hover', 'contextMenu'])]),
107
178
  placement: PropTypes.oneOf(PLACEMENT_8),
108
179
  title: PropTypes.node,
109
180
  disabled: PropTypes.bool,
@@ -112,7 +183,6 @@ SidenavDropdown.propTypes = {
112
183
  className: PropTypes.string,
113
184
  toggleClassName: PropTypes.string,
114
185
  children: PropTypes.node,
115
- tabIndex: PropTypes.number,
116
186
  open: deprecatePropType(PropTypes.bool),
117
187
  eventKey: PropTypes.any,
118
188
  as: PropTypes.elementType,
@@ -122,11 +192,11 @@ SidenavDropdown.propTypes = {
122
192
  onClose: PropTypes.func,
123
193
  onOpen: PropTypes.func,
124
194
  onToggle: PropTypes.func,
195
+ onSelect: PropTypes.func,
125
196
  onMouseEnter: PropTypes.func,
126
197
  onMouseLeave: PropTypes.func,
127
198
  onContextMenu: PropTypes.func,
128
199
  onClick: PropTypes.func,
129
- renderTitle: deprecatePropType(PropTypes.func),
130
200
  renderToggle: PropTypes.func
131
201
  };
132
202
  export default SidenavDropdown;
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
1
  import { RsRefForwardingComponent, WithAsProps } from '../@types/common';
2
+ import React from 'react';
3
3
  import { IconProps } from '@rsuite/icons/lib/Icon';
4
4
  export interface SidenavDropdownItemProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect'> {
5
5
  /** Active the current option */
@@ -20,14 +20,31 @@ export interface SidenavDropdownItemProps<T = any> extends WithAsProps, Omit<Rea
20
20
  icon?: React.ReactElement<IconProps>;
21
21
  /** The submenu that this menuitem controls (if exists) */
22
22
  submenu?: React.ReactElement;
23
- /** Whether the submenu is expanded, used in Sidenav. */
24
- expanded?: boolean;
23
+ /**
24
+ * The sub-level menu appears from the right side by default, and when `pullLeft` is set, it appears from the left.
25
+ * @deprecated Submenus are now pointing the same direction.
26
+ */
27
+ pullLeft?: boolean;
28
+ /**
29
+ * Whether the submenu is opened.
30
+ * @deprecated
31
+ * @internal
32
+ */
33
+ open?: boolean;
25
34
  /** Select the callback function for the current option */
26
35
  onSelect?: (eventKey: T, event: React.SyntheticEvent) => void;
27
36
  }
28
37
  /**
29
- * Tree View Node
30
- * @see https://www.w3.org/TR/wai-aria-practices-1.2/#TreeView
38
+ * @private this component is not supposed to be used directly
39
+ * Instead it's rendered by a <Nav.Item> within a <Sidenav>
40
+ *
41
+ * <Sidenav>
42
+ * <Nav>
43
+ * <Nav.Menu>
44
+ * <Nav.Item></Nav.Item> -> This will render <SidenavDropdownItem> component
45
+ * </Nav.Menu>
46
+ * </Nav>
47
+ * </Sidenav>
31
48
  */
32
49
  declare const SidenavDropdownItem: RsRefForwardingComponent<'li', SidenavDropdownItemProps>;
33
50
  export default SidenavDropdownItem;