rsuite 5.12.0 → 5.13.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 (146) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/Nav/styles/index.less +7 -1
  3. package/Navbar/styles/index.less +6 -1
  4. package/Sidenav/styles/index.less +7 -5
  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/Menu/Menu.d.ts +1 -0
  13. package/cjs/Menu/Menu.js +1 -0
  14. package/cjs/Menu/MenuItem.d.ts +1 -0
  15. package/cjs/Menu/MenuItem.js +1 -0
  16. package/cjs/Menu/Menubar.d.ts +3 -0
  17. package/cjs/Menu/Menubar.js +4 -0
  18. package/cjs/Nav/Nav.d.ts +7 -2
  19. package/cjs/Nav/Nav.js +105 -5
  20. package/cjs/Nav/NavContext.d.ts +2 -8
  21. package/cjs/Nav/NavContext.js +1 -7
  22. package/cjs/Nav/NavDropdown.d.ts +71 -0
  23. package/cjs/Nav/NavDropdown.js +193 -0
  24. package/cjs/Nav/NavDropdownItem.d.ts +39 -0
  25. package/cjs/Nav/NavDropdownItem.js +141 -0
  26. package/cjs/Nav/NavDropdownMenu.d.ts +26 -0
  27. package/cjs/Nav/NavDropdownMenu.js +156 -0
  28. package/cjs/Nav/NavDropdownToggle.d.ts +21 -0
  29. package/cjs/Nav/NavDropdownToggle.js +74 -0
  30. package/cjs/Nav/NavItem.d.ts +2 -0
  31. package/cjs/Nav/NavItem.js +13 -26
  32. package/cjs/Nav/NavMenu.d.ts +38 -0
  33. package/cjs/Nav/NavMenu.js +122 -0
  34. package/cjs/Navbar/NavbarDropdown.d.ts +57 -0
  35. package/cjs/Navbar/NavbarDropdown.js +147 -0
  36. package/cjs/Navbar/NavbarDropdownItem.d.ts +41 -0
  37. package/cjs/Navbar/NavbarDropdownItem.js +149 -0
  38. package/cjs/Navbar/NavbarDropdownMenu.d.ts +37 -0
  39. package/cjs/Navbar/NavbarDropdownMenu.js +155 -0
  40. package/cjs/Navbar/NavbarDropdownToggle.d.ts +19 -0
  41. package/cjs/Navbar/NavbarDropdownToggle.js +72 -0
  42. package/cjs/Navbar/NavbarItem.d.ts +5 -2
  43. package/cjs/Navbar/NavbarItem.js +10 -4
  44. package/cjs/Picker/utils.js +22 -15
  45. package/cjs/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  46. package/cjs/Sidenav/ExpandedSidenavDropdown.js +166 -0
  47. package/cjs/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  48. package/cjs/Sidenav/ExpandedSidenavDropdownItem.js +141 -0
  49. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  50. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.js +145 -0
  51. package/cjs/Sidenav/Sidenav.d.ts +8 -2
  52. package/cjs/Sidenav/Sidenav.js +1 -2
  53. package/cjs/Sidenav/SidenavDropdown.d.ts +30 -8
  54. package/cjs/Sidenav/SidenavDropdown.js +144 -73
  55. package/cjs/Sidenav/SidenavDropdownItem.d.ts +22 -5
  56. package/cjs/Sidenav/SidenavDropdownItem.js +88 -72
  57. package/cjs/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  58. package/cjs/Sidenav/SidenavDropdownMenu.js +122 -90
  59. package/cjs/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  60. package/cjs/Sidenav/SidenavDropdownToggle.js +72 -0
  61. package/cjs/Sidenav/SidenavItem.d.ts +3 -0
  62. package/cjs/Sidenav/SidenavItem.js +22 -14
  63. package/cjs/utils/deprecateComponent.js +4 -6
  64. package/cjs/utils/deprecatePropType.d.ts +1 -5
  65. package/cjs/utils/deprecatePropType.js +7 -14
  66. package/cjs/utils/useInternalId.d.ts +1 -1
  67. package/cjs/utils/useInternalId.js +2 -2
  68. package/cjs/utils/warnOnce.d.ts +9 -0
  69. package/cjs/utils/warnOnce.js +22 -0
  70. package/dist/rsuite-rtl.css +18 -9
  71. package/dist/rsuite-rtl.min.css +1 -1
  72. package/dist/rsuite-rtl.min.css.map +1 -1
  73. package/dist/rsuite.css +18 -9
  74. package/dist/rsuite.js +275 -22
  75. package/dist/rsuite.js.map +1 -1
  76. package/dist/rsuite.min.css +1 -1
  77. package/dist/rsuite.min.css.map +1 -1
  78. package/dist/rsuite.min.js +1 -1
  79. package/dist/rsuite.min.js.map +1 -1
  80. package/esm/Cascader/DropdownMenu.js +8 -3
  81. package/esm/Disclosure/Disclosure.d.ts +1 -1
  82. package/esm/Disclosure/DisclosureContext.d.ts +1 -1
  83. package/esm/Dropdown/Dropdown.js +25 -105
  84. package/esm/Dropdown/DropdownItem.js +13 -55
  85. package/esm/Dropdown/DropdownMenu.js +31 -76
  86. package/esm/Dropdown/DropdownToggle.js +4 -14
  87. package/esm/Menu/Menu.d.ts +1 -0
  88. package/esm/Menu/Menu.js +1 -0
  89. package/esm/Menu/MenuItem.d.ts +1 -0
  90. package/esm/Menu/MenuItem.js +1 -0
  91. package/esm/Menu/Menubar.d.ts +3 -0
  92. package/esm/Menu/Menubar.js +4 -0
  93. package/esm/Nav/Nav.d.ts +7 -2
  94. package/esm/Nav/Nav.js +96 -5
  95. package/esm/Nav/NavContext.d.ts +2 -8
  96. package/esm/Nav/NavContext.js +1 -6
  97. package/esm/Nav/NavDropdown.d.ts +71 -0
  98. package/esm/Nav/NavDropdown.js +170 -0
  99. package/esm/Nav/NavDropdownItem.d.ts +39 -0
  100. package/esm/Nav/NavDropdownItem.js +123 -0
  101. package/esm/Nav/NavDropdownMenu.d.ts +26 -0
  102. package/esm/Nav/NavDropdownMenu.js +138 -0
  103. package/esm/Nav/NavDropdownToggle.d.ts +21 -0
  104. package/esm/Nav/NavDropdownToggle.js +57 -0
  105. package/esm/Nav/NavItem.d.ts +2 -0
  106. package/esm/Nav/NavItem.js +13 -21
  107. package/esm/Nav/NavMenu.d.ts +38 -0
  108. package/esm/Nav/NavMenu.js +98 -0
  109. package/esm/Navbar/NavbarDropdown.d.ts +57 -0
  110. package/esm/Navbar/NavbarDropdown.js +124 -0
  111. package/esm/Navbar/NavbarDropdownItem.d.ts +41 -0
  112. package/esm/Navbar/NavbarDropdownItem.js +128 -0
  113. package/esm/Navbar/NavbarDropdownMenu.d.ts +37 -0
  114. package/esm/Navbar/NavbarDropdownMenu.js +135 -0
  115. package/esm/Navbar/NavbarDropdownToggle.d.ts +19 -0
  116. package/esm/Navbar/NavbarDropdownToggle.js +55 -0
  117. package/esm/Navbar/NavbarItem.d.ts +5 -2
  118. package/esm/Navbar/NavbarItem.js +11 -4
  119. package/esm/Picker/utils.js +22 -14
  120. package/esm/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  121. package/esm/Sidenav/ExpandedSidenavDropdown.js +140 -0
  122. package/esm/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  123. package/esm/Sidenav/ExpandedSidenavDropdownItem.js +120 -0
  124. package/esm/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  125. package/esm/Sidenav/ExpandedSidenavDropdownMenu.js +121 -0
  126. package/esm/Sidenav/Sidenav.d.ts +8 -2
  127. package/esm/Sidenav/Sidenav.js +1 -2
  128. package/esm/Sidenav/SidenavDropdown.d.ts +30 -8
  129. package/esm/Sidenav/SidenavDropdown.js +145 -75
  130. package/esm/Sidenav/SidenavDropdownItem.d.ts +22 -5
  131. package/esm/Sidenav/SidenavDropdownItem.js +87 -71
  132. package/esm/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  133. package/esm/Sidenav/SidenavDropdownMenu.js +122 -86
  134. package/esm/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  135. package/esm/Sidenav/SidenavDropdownToggle.js +55 -0
  136. package/esm/Sidenav/SidenavItem.d.ts +3 -0
  137. package/esm/Sidenav/SidenavItem.js +23 -15
  138. package/esm/utils/deprecateComponent.js +3 -4
  139. package/esm/utils/deprecatePropType.d.ts +1 -5
  140. package/esm/utils/deprecatePropType.js +3 -13
  141. package/esm/utils/useInternalId.d.ts +1 -1
  142. package/esm/utils/useInternalId.js +2 -2
  143. package/esm/utils/warnOnce.d.ts +9 -0
  144. package/esm/utils/warnOnce.js +18 -0
  145. package/package.json +1 -1
  146. package/styles/variables.less +1 -0
@@ -15,11 +15,9 @@ var _react = _interopRequireWildcard(require("react"));
15
15
 
16
16
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
17
 
18
- var _kebabCase = _interopRequireDefault(require("lodash/kebabCase"));
19
-
20
18
  var _omit = _interopRequireDefault(require("lodash/omit"));
21
19
 
22
- var _DropdownToggle = _interopRequireDefault(require("../Dropdown/DropdownToggle"));
20
+ var _pick = _interopRequireDefault(require("lodash/pick"));
23
21
 
24
22
  var _utils = require("../utils");
25
23
 
@@ -27,106 +25,180 @@ var _Sidenav = require("./Sidenav");
27
25
 
28
26
  var _deprecatePropType = _interopRequireDefault(require("../utils/deprecatePropType"));
29
27
 
30
- var _SidenavDropdownCollapse = _interopRequireDefault(require("./SidenavDropdownCollapse"));
28
+ var _Menu = _interopRequireDefault(require("../Menu/Menu"));
29
+
30
+ var _MenuItem = _interopRequireDefault(require("../Menu/MenuItem"));
31
+
32
+ var _kebabCase = _interopRequireDefault(require("lodash/kebabCase"));
33
+
34
+ var _ExpandedSidenavDropdown = _interopRequireDefault(require("./ExpandedSidenavDropdown"));
31
35
 
32
- var _Disclosure = _interopRequireDefault(require("../Disclosure/Disclosure"));
36
+ var _NavContext = _interopRequireDefault(require("../Nav/NavContext"));
33
37
 
34
- var _DropdownContext = _interopRequireDefault(require("../Dropdown/DropdownContext"));
38
+ var _NavDropdownItem = _interopRequireDefault(require("../Nav/NavDropdownItem"));
35
39
 
36
- var _useInternalId = _interopRequireDefault(require("../utils/useInternalId"));
40
+ var _NavDropdownMenu = _interopRequireDefault(require("../Nav/NavDropdownMenu"));
37
41
 
42
+ var _SidenavDropdownToggle = _interopRequireDefault(require("./SidenavDropdownToggle"));
43
+
44
+ var _NavMenu = require("../Nav/NavMenu");
45
+
46
+ /**
47
+ * @private this component is not supposed to be used directly
48
+ * Instead it's rendered by a <Nav.Menu> within a <Sidenav>
49
+ *
50
+ * <Sidenav>
51
+ * <Nav>
52
+ * <Nav.Menu> -> This submenu will render <SidenavDropdown> component
53
+ * </Nav.Menu>
54
+ * </Nav>
55
+ * </Sidenav>
56
+ */
38
57
  var SidenavDropdown = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
58
+ var sidenav = (0, _react.useContext)(_Sidenav.SidenavContext);
59
+ var nav = (0, _react.useContext)(_NavContext.default);
60
+ var navMenu = (0, _react.useContext)(_NavMenu.NavMenuContext);
61
+
62
+ if (!sidenav || !nav || !navMenu) {
63
+ throw new Error('<Sidenav.Dropdown> must be rendered within a <Nav> component within a <Sidenav> component.');
64
+ }
65
+
39
66
  var _props$as = props.as,
40
67
  Component = _props$as === void 0 ? 'div' : _props$as,
41
68
  title = props.title,
42
- children = props.children,
43
- className = props.className,
44
- menuStyle = props.menuStyle,
45
- disabled = props.disabled,
46
- renderTitle = props.renderTitle,
47
- renderToggle = props.renderToggle,
48
- _props$classPrefix = props.classPrefix,
49
- classPrefix = _props$classPrefix === void 0 ? 'dropdown' : _props$classPrefix,
69
+ onClose = props.onClose,
70
+ onOpen = props.onOpen,
71
+ onToggle = props.onToggle,
72
+ eventKey = props.eventKey,
73
+ _props$trigger = props.trigger,
74
+ trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
50
75
  _props$placement = props.placement,
51
76
  placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
52
- toggleClassName = props.toggleClassName,
53
- icon = props.icon,
54
- eventKey = props.eventKey,
55
77
  toggleAs = props.toggleAs,
56
- noCaret = props.noCaret,
78
+ toggleClassName = props.toggleClassName,
79
+ _props$classPrefix = props.classPrefix,
80
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown' : _props$classPrefix,
81
+ className = props.className,
82
+ disabled = props.disabled,
83
+ children = props.children,
84
+ menuStyle = props.menuStyle,
57
85
  style = props.style,
58
- onOpen = props.onOpen,
59
- onClose = props.onClose,
60
- openProp = props.open,
61
- onToggle = props.onToggle,
62
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "title", "children", "className", "menuStyle", "disabled", "renderTitle", "renderToggle", "classPrefix", "placement", "toggleClassName", "icon", "eventKey", "toggleAs", "noCaret", "style", "onOpen", "onClose", "open", "onToggle"]);
63
- var sidenavContext = (0, _react.useContext)(_Sidenav.SidenavContext);
64
- var dropdownContext = (0, _react.useContext)(_DropdownContext.default);
86
+ toggleProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "title", "onClose", "onOpen", "onToggle", "eventKey", "trigger", "placement", "toggleAs", "toggleClassName", "classPrefix", "className", "disabled", "children", "menuStyle", "style"]);
65
87
 
66
88
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
67
89
  merge = _useClassNames.merge,
68
- withClassPrefix = _useClassNames.withClassPrefix;
90
+ withClassPrefix = _useClassNames.withClassPrefix,
91
+ prefix = _useClassNames.prefix;
92
+
93
+ var _useClassNames2 = (0, _utils.useClassNames)('dropdown-menu'),
94
+ withMenuClassPrefix = _useClassNames2.withClassPrefix,
95
+ mergeMenuClassName = _useClassNames2.merge;
96
+
97
+ var _useClassNames3 = (0, _utils.useClassNames)('nav-item'),
98
+ withNavItemClassPrefix = _useClassNames3.withClassPrefix,
99
+ mergeNavItemClassNames = _useClassNames3.merge;
100
+
101
+ var items = navMenu[0].items;
102
+ var hasSelectedItems = // has items that is active indicated by <Nav activeKey>
103
+ nav.activeKey && items.some(function (item) {
104
+ return item.eventKey === nav.activeKey;
105
+ }) || // has items that is active indicated by <Nav.Item active>
106
+ items.some(function (item) {
107
+ return item.active;
108
+ });
109
+ var menuButtonTriggers = (0, _react.useMemo)(function () {
110
+ if (!trigger) {
111
+ return undefined;
112
+ }
113
+
114
+ var triggerMap = {
115
+ hover: 'mouseover',
116
+ click: 'click',
117
+ contextMenu: 'contextmenu'
118
+ };
69
119
 
70
- var internalId = (0, _useInternalId.default)('SidenavDropdown');
71
- var uniqueKey = eventKey !== null && eventKey !== void 0 ? eventKey : internalId;
120
+ if (!Array.isArray(trigger)) {
121
+ return [triggerMap[trigger]];
122
+ }
123
+
124
+ return trigger.map(function (t) {
125
+ return triggerMap[t];
126
+ });
127
+ }, [trigger]); // Render a disclosure when inside expanded <Sidenav>
72
128
 
73
- if (!sidenavContext || !dropdownContext) {
74
- throw new Error('<SidenavDropdown> component is not supposed to be used standalone. Use <Dropdown> inside <Sidenav> instead.');
129
+ if (sidenav.expanded) {
130
+ return /*#__PURE__*/_react.default.createElement(_ExpandedSidenavDropdown.default, (0, _extends2.default)({
131
+ ref: ref
132
+ }, props));
75
133
  }
76
134
 
77
- var _sidenavContext$openK = sidenavContext.openKeys,
78
- openKeys = _sidenavContext$openK === void 0 ? [] : _sidenavContext$openK,
79
- onOpenChange = sidenavContext.onOpenChange;
80
- var hasSelectedItem = dropdownContext.hasSelectedItem;
81
- var handleToggleDisclosure = (0, _react.useCallback)(function (open, event) {
82
- if (open) {
83
- onClose === null || onClose === void 0 ? void 0 : onClose();
84
- } else {
85
- onOpen === null || onOpen === void 0 ? void 0 : onOpen();
135
+ var renderMenuButton = function renderMenuButton(menuButtonProps, buttonRef) {
136
+ return /*#__PURE__*/_react.default.createElement(_MenuItem.default, {
137
+ disabled: disabled
138
+ }, function (_ref, menuitemRef) {
139
+ var active = _ref.active,
140
+ menuitemProps = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["active"]);
141
+ return /*#__PURE__*/_react.default.createElement(_SidenavDropdownToggle.default, (0, _extends2.default)({
142
+ ref: (0, _utils.mergeRefs)(buttonRef, menuitemRef),
143
+ as: toggleAs,
144
+ className: mergeNavItemClassNames(toggleClassName, withNavItemClassPrefix({
145
+ focus: active
146
+ }))
147
+ }, menuButtonProps, (0, _omit.default)(menuitemProps, ['onClick']), (0, _omit.default)(toggleProps, 'data-testid')), title);
148
+ });
149
+ };
150
+
151
+ return /*#__PURE__*/_react.default.createElement(_Menu.default, {
152
+ menuButtonText: title,
153
+ renderMenuButton: renderMenuButton,
154
+ openMenuOn: menuButtonTriggers,
155
+ renderMenuPopup: function renderMenuPopup(_ref2, popupRef) {
156
+ var open = _ref2.open,
157
+ popupProps = (0, _objectWithoutPropertiesLoose2.default)(_ref2, ["open"]);
158
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix({})); // When inside a collapsed <Sidenav>, render a header in menu
159
+
160
+ var showHeader = !!sidenav;
161
+ return /*#__PURE__*/_react.default.createElement("ul", (0, _extends2.default)({
162
+ ref: popupRef,
163
+ className: menuClassName,
164
+ style: menuStyle,
165
+ hidden: !open
166
+ }, popupProps), showHeader && /*#__PURE__*/_react.default.createElement("div", {
167
+ className: prefix('header')
168
+ }, title), children);
169
+ },
170
+ onToggleMenu: function onToggleMenu(open, event) {
171
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(open, eventKey, event);
172
+ sidenav === null || sidenav === void 0 ? void 0 : sidenav.onOpenChange(eventKey, event);
173
+
174
+ if (open) {
175
+ onOpen === null || onOpen === void 0 ? void 0 : onOpen();
176
+ } else {
177
+ onClose === null || onClose === void 0 ? void 0 : onClose();
178
+ }
86
179
  }
87
-
88
- onToggle === null || onToggle === void 0 ? void 0 : onToggle(open);
89
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(uniqueKey, event);
90
- }, [onClose, onOpen, onToggle, uniqueKey, onOpenChange]);
91
- var open = openProp !== null && openProp !== void 0 ? openProp : openKeys.includes(uniqueKey);
92
- return /*#__PURE__*/_react.default.createElement(_Disclosure.default, {
93
- open: open,
94
- onToggle: handleToggleDisclosure
95
- }, function (_ref, containerRef) {
180
+ }, function (_ref3, menuContainerRef) {
96
181
  var _withClassPrefix;
97
182
 
98
- var open = _ref.open;
99
- var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + (0, _kebabCase.default)((0, _utils.placementPolyfill)(placement))] = placement, _withClassPrefix[open ? 'expand' : 'collapse'] = true, _withClassPrefix.disabled = disabled, _withClassPrefix['selected-within'] = hasSelectedItem, _withClassPrefix['no-caret'] = noCaret, _withClassPrefix)));
183
+ var open = _ref3.open,
184
+ menuContainer = (0, _objectWithoutPropertiesLoose2.default)(_ref3, ["open"]);
185
+ var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + (0, _kebabCase.default)((0, _utils.placementPolyfill)(placement))] = !!placement, _withClassPrefix.disabled = disabled, _withClassPrefix.open = open, _withClassPrefix.submenu = true, _withClassPrefix['selected-within'] = hasSelectedItems, _withClassPrefix)));
100
186
  return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({
101
- ref: (0, _utils.mergeRefs)(ref, containerRef),
102
- style: style,
187
+ ref: (0, _utils.mergeRefs)(ref, menuContainerRef),
103
188
  className: classes
104
- }, rest, {
105
- "data-event-key": eventKey
106
- }), /*#__PURE__*/_react.default.createElement(_Disclosure.default.Button, null, function (buttonProps, buttonRef) {
107
- return /*#__PURE__*/_react.default.createElement(_DropdownToggle.default, (0, _extends2.default)({
108
- ref: buttonRef,
109
- as: toggleAs,
110
- noCaret: noCaret,
111
- className: toggleClassName,
112
- renderToggle: renderToggle,
113
- icon: icon,
114
- placement: placement
115
- }, (0, _omit.default)(buttonProps, ['open'])), title);
116
- }), /*#__PURE__*/_react.default.createElement(_Disclosure.default.Content, null, function (_ref2) {
117
- var open = _ref2.open;
118
- return /*#__PURE__*/_react.default.createElement(_SidenavDropdownCollapse.default, {
119
- open: open,
120
- style: menuStyle
121
- }, children);
189
+ }, menuContainer, (0, _pick.default)(toggleProps, ['data-testid']), {
190
+ style: style
122
191
  }));
123
192
  });
124
193
  });
125
194
 
195
+ SidenavDropdown.Item = _NavDropdownItem.default;
196
+ SidenavDropdown.Menu = _NavDropdownMenu.default;
126
197
  SidenavDropdown.displayName = 'Sidenav.Dropdown';
127
198
  SidenavDropdown.propTypes = {
128
199
  activeKey: _propTypes.default.any,
129
200
  classPrefix: _propTypes.default.string,
201
+ trigger: _propTypes.default.oneOfType([_propTypes.default.array, _propTypes.default.oneOf(['click', 'hover', 'contextMenu'])]),
130
202
  placement: _propTypes.default.oneOf(_utils.PLACEMENT_8),
131
203
  title: _propTypes.default.node,
132
204
  disabled: _propTypes.default.bool,
@@ -135,7 +207,6 @@ SidenavDropdown.propTypes = {
135
207
  className: _propTypes.default.string,
136
208
  toggleClassName: _propTypes.default.string,
137
209
  children: _propTypes.default.node,
138
- tabIndex: _propTypes.default.number,
139
210
  open: (0, _deprecatePropType.default)(_propTypes.default.bool),
140
211
  eventKey: _propTypes.default.any,
141
212
  as: _propTypes.default.elementType,
@@ -145,11 +216,11 @@ SidenavDropdown.propTypes = {
145
216
  onClose: _propTypes.default.func,
146
217
  onOpen: _propTypes.default.func,
147
218
  onToggle: _propTypes.default.func,
219
+ onSelect: _propTypes.default.func,
148
220
  onMouseEnter: _propTypes.default.func,
149
221
  onMouseLeave: _propTypes.default.func,
150
222
  onContextMenu: _propTypes.default.func,
151
223
  onClick: _propTypes.default.func,
152
- renderTitle: (0, _deprecatePropType.default)(_propTypes.default.func),
153
224
  renderToggle: _propTypes.default.func
154
225
  };
155
226
  var _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;
@@ -13,121 +13,140 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
13
13
 
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
- var _isNil = _interopRequireDefault(require("lodash/isNil"));
17
-
18
- var _utils = require("../utils");
16
+ var _propTypes = _interopRequireDefault(require("prop-types"));
19
17
 
20
18
  var _Sidenav = require("./Sidenav");
21
19
 
22
- var _propTypes = _interopRequireDefault(require("prop-types"));
20
+ var _deprecatePropType = _interopRequireDefault(require("../utils/deprecatePropType"));
23
21
 
24
- var _Ripple = _interopRequireDefault(require("../Ripple"));
22
+ var _MenuItem = _interopRequireDefault(require("../Menu/MenuItem"));
25
23
 
26
- var _SafeAnchor = _interopRequireDefault(require("../SafeAnchor"));
24
+ var _isNil = _interopRequireDefault(require("lodash/isNil"));
27
25
 
28
- var _NavContext = _interopRequireDefault(require("../Nav/NavContext"));
26
+ var _utils = require("../utils");
29
27
 
30
- var _DropdownContext = _interopRequireDefault(require("../Dropdown/DropdownContext"));
28
+ var _NavContext = _interopRequireDefault(require("../Nav/NavContext"));
31
29
 
32
30
  var _useRenderDropdownItem = require("../Dropdown/useRenderDropdownItem");
33
31
 
32
+ var _ExpandedSidenavDropdownItem = _interopRequireDefault(require("./ExpandedSidenavDropdownItem"));
33
+
34
34
  /**
35
- * Tree View Node
36
- * @see https://www.w3.org/TR/wai-aria-practices-1.2/#TreeView
35
+ * @private this component is not supposed to be used directly
36
+ * Instead it's rendered by a <Nav.Item> within a <Sidenav>
37
+ *
38
+ * <Sidenav>
39
+ * <Nav>
40
+ * <Nav.Menu>
41
+ * <Nav.Item></Nav.Item> -> This will render <SidenavDropdownItem> component
42
+ * </Nav.Menu>
43
+ * </Nav>
44
+ * </Sidenav>
37
45
  */
38
46
  var SidenavDropdownItem = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
39
- var _props$as = props.as,
40
- Component = _props$as === void 0 ? 'li' : _props$as,
41
- activeProp = props.active,
42
- children = props.children,
43
- disabled = props.disabled,
44
- divider = props.divider,
45
- panel = props.panel,
46
- className = props.className,
47
- style = props.style,
48
- _props$classPrefix = props.classPrefix,
49
- classPrefix = _props$classPrefix === void 0 ? 'dropdown-item' : _props$classPrefix,
50
- icon = props.icon,
51
- eventKey = props.eventKey,
52
- onClick = props.onClick,
53
- onSelect = props.onSelect,
54
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "active", "children", "disabled", "divider", "panel", "className", "style", "classPrefix", "icon", "eventKey", "onClick", "onSelect"]);
55
- var sidenavContext = (0, _react.useContext)(_Sidenav.SidenavContext);
56
- var dropdown = (0, _react.useContext)(_DropdownContext.default);
47
+ var sidenav = (0, _react.useContext)(_Sidenav.SidenavContext);
48
+ var nav = (0, _react.useContext)(_NavContext.default);
57
49
 
58
- if (!sidenavContext || !dropdown) {
59
- throw new Error('<SidenavDropdownItem> component is not supposed to be used standalone. Use <Dropdown.Item> within <Sidenav> instead.');
50
+ if (!sidenav || !nav) {
51
+ throw new Error('<Sidenav.Dropdown.Item> must be used within a <Nav> within a <Sidenav> component.');
60
52
  }
61
53
 
62
- var activeKey = sidenavContext.activeKey,
63
- onSidenavSelect = sidenavContext.onSelect;
64
- var nav = (0, _react.useContext)(_NavContext.default);
54
+ var _props$classPrefix = props.classPrefix,
55
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown-item' : _props$classPrefix,
56
+ className = props.className,
57
+ activeProp = props.active,
58
+ eventKey = props.eventKey,
59
+ onSelect = props.onSelect,
60
+ icon = props.icon,
61
+ _props$as = props.as,
62
+ Component = _props$as === void 0 ? 'li' : _props$as,
63
+ divider = props.divider,
64
+ panel = props.panel,
65
+ children = props.children,
66
+ disabled = props.disabled,
67
+ restProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["classPrefix", "className", "active", "eventKey", "onSelect", "icon", "as", "divider", "panel", "children", "disabled"]);
65
68
 
66
69
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
67
70
  merge = _useClassNames.merge,
68
71
  withClassPrefix = _useClassNames.withClassPrefix,
69
72
  prefix = _useClassNames.prefix;
70
73
 
71
- var selected = activeProp !== null && activeProp !== void 0 ? activeProp : !(0, _isNil.default)(eventKey) && ((0, _utils.shallowEqual)(eventKey, activeKey) || (0, _utils.shallowEqual)(nav === null || nav === void 0 ? void 0 : nav.activeKey, eventKey));
72
- var classes = merge(className, withClassPrefix({
73
- 'with-icon': icon,
74
- active: selected,
75
- disabled: disabled
76
- }));
77
- var handleClick = (0, _react.useCallback)(function (event) {
78
- var _dropdown$onSelect;
74
+ var handleSelectItem = (0, _react.useCallback)(function (event) {
75
+ var _nav$onSelect;
79
76
 
80
- if (disabled) return;
81
77
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(eventKey, event);
82
- (_dropdown$onSelect = dropdown.onSelect) === null || _dropdown$onSelect === void 0 ? void 0 : _dropdown$onSelect.call(dropdown, eventKey, event);
83
- onSidenavSelect === null || onSidenavSelect === void 0 ? void 0 : onSidenavSelect(eventKey, event);
84
- }, [disabled, onSelect, onSidenavSelect, eventKey, dropdown]);
85
- var menuitemEventHandlers = {
86
- onClick: (0, _utils.createChainedFunction)(handleClick, onClick)
87
- };
78
+ (_nav$onSelect = nav.onSelect) === null || _nav$onSelect === void 0 ? void 0 : _nav$onSelect.call(nav, eventKey, event);
79
+ }, [onSelect, eventKey, nav]);
80
+ var selected = activeProp || !(0, _isNil.default)(eventKey) && (0, _utils.shallowEqual)(nav === null || nav === void 0 ? void 0 : nav.activeKey, eventKey);
88
81
  var renderDropdownItem = (0, _useRenderDropdownItem.useRenderDropdownItem)(Component);
89
82
 
83
+ if (sidenav.expanded) {
84
+ return /*#__PURE__*/_react.default.createElement(_ExpandedSidenavDropdownItem.default, (0, _extends2.default)({
85
+ ref: ref
86
+ }, props));
87
+ }
88
+
90
89
  if (divider) {
91
90
  return renderDropdownItem((0, _extends2.default)({
92
91
  ref: ref,
93
92
  role: 'separator',
94
- style: style,
95
93
  className: merge(prefix('divider'), className)
96
- }, rest));
94
+ }, restProps));
97
95
  }
98
96
 
99
97
  if (panel) {
100
98
  return renderDropdownItem((0, _extends2.default)({
101
99
  ref: ref,
102
- role: 'none presentation',
103
- style: style,
104
- className: merge(prefix('panel'), className)
105
- }, rest, {
100
+ className: merge(prefix('panel'), className),
106
101
  children: children
107
- }));
102
+ }, restProps));
108
103
  }
109
104
 
110
- return renderDropdownItem((0, _extends2.default)({
111
- ref: ref
112
- }, rest, {
113
- style: style,
114
- className: classes,
115
- 'aria-current': selected || undefined
116
- }, menuitemEventHandlers, {
117
- children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, icon && /*#__PURE__*/_react.default.cloneElement(icon, {
118
- className: prefix('menu-icon')
119
- }), children, /*#__PURE__*/_react.default.createElement(_Ripple.default, null))
120
- }), _SafeAnchor.default);
105
+ return /*#__PURE__*/_react.default.createElement(_MenuItem.default, {
106
+ selected: selected,
107
+ disabled: disabled,
108
+ onActivate: handleSelectItem
109
+ }, function (_ref, menuitemRef) {
110
+ var selected = _ref.selected,
111
+ active = _ref.active,
112
+ menuitem = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["selected", "active"]);
113
+ var classes = merge(className, withClassPrefix({
114
+ 'with-icon': icon,
115
+ active: selected,
116
+ disabled: disabled,
117
+ focus: active,
118
+ divider: divider,
119
+ panel: panel
120
+ }));
121
+ var dataAttributes = {
122
+ 'data-event-key': eventKey
123
+ };
124
+
125
+ if (!(0, _isNil.default)(eventKey) && typeof eventKey !== 'string') {
126
+ dataAttributes['data-event-key-type'] = typeof eventKey;
127
+ }
128
+
129
+ return renderDropdownItem((0, _extends2.default)({
130
+ ref: (0, _utils.mergeRefs)(ref, menuitemRef),
131
+ className: classes
132
+ }, menuitem, dataAttributes, restProps, {
133
+ children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, icon && /*#__PURE__*/_react.default.cloneElement(icon, {
134
+ className: prefix('menu-icon')
135
+ }), children)
136
+ }));
137
+ });
121
138
  });
122
139
 
123
140
  SidenavDropdownItem.displayName = 'Sidenav.Dropdown.Item';
124
141
  SidenavDropdownItem.propTypes = {
125
142
  as: _propTypes.default.elementType,
126
- expanded: _propTypes.default.bool,
127
- active: _propTypes.default.bool,
128
143
  divider: _propTypes.default.bool,
129
144
  panel: _propTypes.default.bool,
145
+ trigger: _propTypes.default.oneOfType([_propTypes.default.array, _propTypes.default.oneOf(['click', 'hover'])]),
146
+ open: (0, _deprecatePropType.default)(_propTypes.default.bool),
147
+ active: _propTypes.default.bool,
130
148
  disabled: _propTypes.default.bool,
149
+ pullLeft: (0, _deprecatePropType.default)(_propTypes.default.bool),
131
150
  submenu: _propTypes.default.element,
132
151
  onSelect: _propTypes.default.func,
133
152
  onClick: _propTypes.default.func,
@@ -137,10 +156,7 @@ SidenavDropdownItem.propTypes = {
137
156
  style: _propTypes.default.object,
138
157
  children: _propTypes.default.node,
139
158
  classPrefix: _propTypes.default.string,
140
- tabIndex: _propTypes.default.number,
141
- title: _propTypes.default.node,
142
- onMouseOver: _propTypes.default.func,
143
- onMouseOut: _propTypes.default.func
159
+ tabIndex: _propTypes.default.number
144
160
  };
145
161
  var _default = SidenavDropdownItem;
146
162
  exports.default = _default;
@@ -1,26 +1,36 @@
1
1
  import React from 'react';
2
- import { RsRefForwardingComponent, WithAsProps } from '../@types/common';
2
+ import { StandardProps } from '../@types/common';
3
3
  import { IconProps } from '@rsuite/icons/lib/Icon';
4
- export interface SidenavDropdownMenuProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLLIElement>, 'title' | 'onSelect'> {
5
- /** Primary content */
6
- children?: React.ReactNode;
7
- /** You can use a custom element for this component */
8
- as?: React.ElementType;
9
- /** Disable the current option */
10
- disabled?: boolean;
11
- /** The value of the current option */
4
+ export interface SidenavDropdownMenuProps<T = any> extends StandardProps {
5
+ /** Define the title as a submenu */
6
+ title?: React.ReactNode;
7
+ /** The submenu expands from the left and defaults to the right */
8
+ pullLeft?: boolean;
9
+ /**
10
+ * Only used for setting the default expand state when it's a submenu.
11
+ */
12
12
  eventKey?: T;
13
13
  /** Set the icon */
14
14
  icon?: React.ReactElement<IconProps>;
15
- /** Whether the submenu is expanded, used in Sidenav. */
15
+ open?: boolean;
16
+ collapsible?: boolean;
16
17
  expanded?: boolean;
17
- /** Select the callback function for the current option */
18
- onSelect?: (eventKey: T, event: React.SyntheticEvent) => void;
19
- title?: React.ReactNode;
18
+ active?: boolean;
19
+ disabled?: boolean;
20
+ activeKey?: T;
21
+ onToggle?: (open: boolean, eventKey?: T | undefined, event?: React.SyntheticEvent) => void;
20
22
  }
21
23
  /**
22
- * Tree View Node
23
- * @see https://www.w3.org/TR/wai-aria-practices-1.2/#TreeView
24
+ * @private this component is not supposed to be used directly
25
+ * Instead it's rendered by a <Nav.Menu> within a <Sidenav>
26
+ *
27
+ * <Sidenav>
28
+ * <Nav>
29
+ * <Nav.Menu>
30
+ * <Nav.Menu></Nav.Menu> -> This submenu will render <SidenavDropdownMenu> component
31
+ * </Nav.Menu>
32
+ * </Nav>
33
+ * </Sidenav>
24
34
  */
25
- declare const SidenavDropdownMenu: RsRefForwardingComponent<'li', SidenavDropdownMenuProps>;
35
+ declare const SidenavDropdownMenu: React.ForwardRefExoticComponent<SidenavDropdownMenuProps<any> & Omit<React.HTMLAttributes<HTMLUListElement>, "title" | "onSelect"> & React.RefAttributes<HTMLElement>>;
26
36
  export default SidenavDropdownMenu;