rsuite 5.50.0 → 5.51.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 (177) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/CheckTreePicker/styles/index.less +3 -3
  3. package/DatePicker/styles/index.less +1 -1
  4. package/Form/styles/mixin.less +1 -2
  5. package/InputGroup/styles/index.less +0 -14
  6. package/InputPicker/styles/index.less +1 -1
  7. package/Picker/styles/index.less +2 -2
  8. package/Picker/styles/mixin.less +3 -3
  9. package/TagInput/styles/index.less +1 -1
  10. package/TagPicker/styles/index.less +5 -1
  11. package/TreePicker/styles/index.less +2 -2
  12. package/cjs/@types/common.d.ts +8 -0
  13. package/cjs/AutoComplete/AutoComplete.js +14 -11
  14. package/cjs/AutoComplete/Combobox.d.ts +8 -0
  15. package/cjs/AutoComplete/Combobox.js +31 -0
  16. package/cjs/Calendar/CalendarContainer.js +35 -37
  17. package/cjs/Cascader/Cascader.js +12 -11
  18. package/cjs/Cascader/DropdownMenu.d.ts +3 -20
  19. package/cjs/Cascader/DropdownMenu.js +48 -48
  20. package/cjs/Cascader/TreeView.d.ts +24 -0
  21. package/cjs/Cascader/TreeView.js +174 -0
  22. package/cjs/CheckPicker/CheckPicker.js +9 -8
  23. package/cjs/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  24. package/cjs/CheckTreePicker/CheckTreeNode.js +31 -59
  25. package/cjs/CheckTreePicker/CheckTreePicker.js +20 -20
  26. package/cjs/DatePicker/DatePicker.js +5 -6
  27. package/cjs/DateRangePicker/DateRangePicker.js +3 -4
  28. package/cjs/Form/Form.d.ts +14 -0
  29. package/cjs/Form/Form.js +39 -30
  30. package/cjs/Form/FormContext.d.ts +1 -0
  31. package/cjs/FormControl/FormControl.js +40 -18
  32. package/cjs/FormGroup/FormGroup.js +2 -1
  33. package/cjs/InputPicker/InputPicker.js +46 -29
  34. package/cjs/InputPicker/InputSearch.js +3 -15
  35. package/cjs/InputPicker/TagList.d.ts +3 -0
  36. package/cjs/InputPicker/TagList.js +29 -0
  37. package/cjs/InputPicker/TextBox.d.ts +18 -0
  38. package/cjs/InputPicker/TextBox.js +48 -0
  39. package/cjs/MultiCascader/MultiCascader.js +13 -10
  40. package/cjs/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  41. package/cjs/MultiCascader/{DropdownMenu.js → TreeView.js} +77 -74
  42. package/{esm/Picker/DropdownMenuCheckItem.d.ts → cjs/Picker/ListCheckItem.d.ts} +3 -3
  43. package/cjs/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +14 -30
  44. package/{esm/Picker/DropdownMenuItem.d.ts → cjs/Picker/ListItem.d.ts} +4 -4
  45. package/cjs/Picker/{DropdownMenuItem.js → ListItem.js} +15 -24
  46. package/cjs/Picker/ListItemGroup.d.ts +6 -0
  47. package/cjs/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  48. package/cjs/Picker/Listbox.d.ts +35 -0
  49. package/cjs/Picker/{DropdownMenu.js → Listbox.js} +49 -64
  50. package/cjs/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  51. package/cjs/Picker/{PickerOverlay.js → PickerPopup.js} +9 -7
  52. package/cjs/Picker/PickerToggle.d.ts +1 -1
  53. package/cjs/Picker/PickerToggle.js +16 -9
  54. package/cjs/Picker/PickerToggleTrigger.d.ts +15 -0
  55. package/cjs/Picker/PickerToggleTrigger.js +21 -5
  56. package/cjs/Picker/SearchBar.js +7 -9
  57. package/cjs/Picker/TreeView.d.ts +7 -0
  58. package/cjs/Picker/TreeView.js +31 -0
  59. package/cjs/Picker/hooks/index.d.ts +6 -0
  60. package/cjs/Picker/hooks/index.js +18 -0
  61. package/cjs/Picker/hooks/useCombobox.d.ts +7 -0
  62. package/cjs/Picker/hooks/useCombobox.js +22 -0
  63. package/cjs/Picker/hooks/useFocusItemValue.d.ts +30 -0
  64. package/cjs/Picker/hooks/useFocusItemValue.js +246 -0
  65. package/cjs/Picker/hooks/usePickerClassName.d.ts +21 -0
  66. package/cjs/Picker/hooks/usePickerClassName.js +39 -0
  67. package/cjs/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +2 -2
  68. package/cjs/Picker/{usePickerRef.js → hooks/usePickerRef.js} +1 -1
  69. package/cjs/Picker/hooks/useSearch.d.ts +18 -0
  70. package/cjs/Picker/hooks/useSearch.js +57 -0
  71. package/cjs/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  72. package/cjs/Picker/hooks/useToggleKeyDownEvent.js +101 -0
  73. package/cjs/Picker/index.d.ts +7 -6
  74. package/cjs/Picker/index.js +26 -19
  75. package/cjs/Picker/propTypes.d.ts +0 -6
  76. package/cjs/Picker/propTypes.js +0 -5
  77. package/cjs/Picker/utils.d.ts +2 -96
  78. package/cjs/Picker/utils.js +1 -406
  79. package/cjs/SelectPicker/SelectPicker.js +8 -8
  80. package/cjs/TagInput/index.js +4 -0
  81. package/cjs/TreePicker/TreeNode.d.ts +2 -2
  82. package/cjs/TreePicker/TreeNode.js +22 -56
  83. package/cjs/TreePicker/TreePicker.js +19 -20
  84. package/dist/rsuite-no-reset-rtl.css +109 -117
  85. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  86. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  87. package/dist/rsuite-no-reset.css +109 -117
  88. package/dist/rsuite-no-reset.min.css +1 -1
  89. package/dist/rsuite-no-reset.min.css.map +1 -1
  90. package/dist/rsuite-rtl.css +109 -117
  91. package/dist/rsuite-rtl.min.css +1 -1
  92. package/dist/rsuite-rtl.min.css.map +1 -1
  93. package/dist/rsuite.css +109 -117
  94. package/dist/rsuite.js +184 -74
  95. package/dist/rsuite.js.map +1 -1
  96. package/dist/rsuite.min.css +1 -1
  97. package/dist/rsuite.min.css.map +1 -1
  98. package/dist/rsuite.min.js +1 -1
  99. package/dist/rsuite.min.js.map +1 -1
  100. package/esm/@types/common.d.ts +8 -0
  101. package/esm/AutoComplete/AutoComplete.js +15 -12
  102. package/esm/AutoComplete/Combobox.d.ts +8 -0
  103. package/esm/AutoComplete/Combobox.js +25 -0
  104. package/esm/Calendar/CalendarContainer.js +37 -39
  105. package/esm/Cascader/Cascader.js +13 -12
  106. package/esm/Cascader/DropdownMenu.d.ts +3 -20
  107. package/esm/Cascader/DropdownMenu.js +50 -49
  108. package/esm/Cascader/TreeView.d.ts +24 -0
  109. package/esm/Cascader/TreeView.js +167 -0
  110. package/esm/CheckPicker/CheckPicker.js +10 -9
  111. package/esm/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  112. package/esm/CheckTreePicker/CheckTreeNode.js +33 -61
  113. package/esm/CheckTreePicker/CheckTreePicker.js +21 -21
  114. package/esm/DatePicker/DatePicker.js +5 -6
  115. package/esm/DateRangePicker/DateRangePicker.js +3 -4
  116. package/esm/Form/Form.d.ts +14 -0
  117. package/esm/Form/Form.js +41 -32
  118. package/esm/Form/FormContext.d.ts +1 -0
  119. package/esm/FormControl/FormControl.js +39 -17
  120. package/esm/FormGroup/FormGroup.js +3 -2
  121. package/esm/InputPicker/InputPicker.js +47 -30
  122. package/esm/InputPicker/InputSearch.js +4 -15
  123. package/esm/InputPicker/TagList.d.ts +3 -0
  124. package/esm/InputPicker/TagList.js +23 -0
  125. package/esm/InputPicker/TextBox.d.ts +18 -0
  126. package/esm/InputPicker/TextBox.js +42 -0
  127. package/esm/MultiCascader/MultiCascader.js +14 -11
  128. package/esm/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  129. package/esm/MultiCascader/{DropdownMenu.js → TreeView.js} +79 -75
  130. package/{cjs/Picker/DropdownMenuCheckItem.d.ts → esm/Picker/ListCheckItem.d.ts} +3 -3
  131. package/esm/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +15 -30
  132. package/{cjs/Picker/DropdownMenuItem.d.ts → esm/Picker/ListItem.d.ts} +4 -4
  133. package/esm/Picker/{DropdownMenuItem.js → ListItem.js} +16 -24
  134. package/esm/Picker/ListItemGroup.d.ts +6 -0
  135. package/esm/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  136. package/esm/Picker/Listbox.d.ts +35 -0
  137. package/esm/Picker/{DropdownMenu.js → Listbox.js} +50 -64
  138. package/esm/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  139. package/esm/Picker/{PickerOverlay.js → PickerPopup.js} +10 -8
  140. package/esm/Picker/PickerToggle.d.ts +1 -1
  141. package/esm/Picker/PickerToggle.js +16 -9
  142. package/esm/Picker/PickerToggleTrigger.d.ts +15 -0
  143. package/esm/Picker/PickerToggleTrigger.js +20 -5
  144. package/esm/Picker/SearchBar.js +8 -9
  145. package/esm/Picker/TreeView.d.ts +7 -0
  146. package/esm/Picker/TreeView.js +25 -0
  147. package/esm/Picker/hooks/index.d.ts +6 -0
  148. package/esm/Picker/hooks/index.js +7 -0
  149. package/esm/Picker/hooks/useCombobox.d.ts +7 -0
  150. package/esm/Picker/hooks/useCombobox.js +17 -0
  151. package/esm/Picker/hooks/useFocusItemValue.d.ts +30 -0
  152. package/esm/Picker/hooks/useFocusItemValue.js +240 -0
  153. package/esm/Picker/hooks/usePickerClassName.d.ts +21 -0
  154. package/esm/Picker/hooks/usePickerClassName.js +33 -0
  155. package/esm/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +2 -2
  156. package/esm/Picker/{usePickerRef.js → hooks/usePickerRef.js} +1 -1
  157. package/esm/Picker/hooks/useSearch.d.ts +18 -0
  158. package/esm/Picker/hooks/useSearch.js +51 -0
  159. package/esm/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  160. package/esm/Picker/hooks/useToggleKeyDownEvent.js +96 -0
  161. package/esm/Picker/index.d.ts +7 -6
  162. package/esm/Picker/index.js +7 -6
  163. package/esm/Picker/propTypes.d.ts +0 -6
  164. package/esm/Picker/propTypes.js +0 -5
  165. package/esm/Picker/utils.d.ts +2 -96
  166. package/esm/Picker/utils.js +2 -401
  167. package/esm/SelectPicker/SelectPicker.js +9 -9
  168. package/esm/TagInput/index.js +4 -0
  169. package/esm/TreePicker/TreeNode.d.ts +2 -2
  170. package/esm/TreePicker/TreeNode.js +24 -58
  171. package/esm/TreePicker/TreePicker.js +20 -21
  172. package/package.json +1 -1
  173. package/styles/variables.less +1 -3
  174. package/cjs/Picker/DropdownMenu.d.ts +0 -59
  175. package/cjs/Picker/DropdownMenuGroup.d.ts +0 -6
  176. package/esm/Picker/DropdownMenu.d.ts +0 -59
  177. package/esm/Picker/DropdownMenuGroup.d.ts +0 -6
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTemplateLiteralLoose";
4
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
+ var _templateObject;
6
+ import React from 'react';
7
+ import TagList from './TagList';
8
+ import { useClassNames } from '../utils';
9
+ import InputSearch from './InputSearch';
10
+ var TextBox = /*#__PURE__*/React.forwardRef(function (props, ref) {
11
+ var tags = props.tags,
12
+ inputProps = props.inputProps,
13
+ readOnly = props.readOnly,
14
+ disabled = props.disabled,
15
+ multiple = props.multiple,
16
+ onBlur = props.onBlur,
17
+ onFocus = props.onFocus,
18
+ onChange = props.onChange,
19
+ inputValue = props.inputValue,
20
+ inputRef = props.inputRef,
21
+ editable = props.editable,
22
+ showTagList = props.showTagList,
23
+ rest = _objectWithoutPropertiesLoose(props, ["tags", "inputProps", "readOnly", "disabled", "multiple", "onBlur", "onFocus", "onChange", "inputValue", "inputRef", "editable", "showTagList"]);
24
+ var _useClassNames = useClassNames('picker'),
25
+ prefix = _useClassNames.prefix;
26
+ if (!multiple && disabled) {
27
+ return null;
28
+ }
29
+ return /*#__PURE__*/React.createElement("div", _extends({
30
+ className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["textbox"]))),
31
+ ref: ref
32
+ }, rest), showTagList ? /*#__PURE__*/React.createElement(TagList, null, tags) : null, editable && /*#__PURE__*/React.createElement(InputSearch, _extends({}, inputProps, {
33
+ tabIndex: -1,
34
+ readOnly: readOnly,
35
+ onBlur: onBlur,
36
+ onFocus: onFocus,
37
+ inputRef: inputRef,
38
+ onChange: onChange,
39
+ value: inputValue
40
+ })));
41
+ });
42
+ export default TextBox;
@@ -7,13 +7,13 @@ import pick from 'lodash/pick';
7
7
  import omit from 'lodash/omit';
8
8
  import isFunction from 'lodash/isFunction';
9
9
  import isNil from 'lodash/isNil';
10
- import DropdownMenu from './DropdownMenu';
10
+ import TreeView from './TreeView';
11
11
  import Checkbox from '../Checkbox';
12
12
  import { useCascadeValue, useColumnData, useFlattenData, isSomeChildChecked } from './utils';
13
13
  import { getNodeParents, findNodeOfTree } from '../utils/treeUtils';
14
14
  import { getColumnsAndPaths } from '../Cascader/utils';
15
15
  import { createChainedFunction, mergeRefs, getSafeRegExpString, useClassNames, useCustom, useUpdateEffect, useControlled, useEventCallback } from '../utils';
16
- import { PickerToggle, PickerOverlay, SearchBar, SelectedElement, PickerToggleTrigger, usePickerClassName, usePickerRef, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
16
+ import { PickerToggle, PickerPopup, SearchBar, SelectedElement, PickerToggleTrigger, usePickerClassName, usePickerRef, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
17
17
  var emptyArray = [];
18
18
 
19
19
  /**
@@ -328,9 +328,10 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
328
328
  'cascader-row-focus': item[valueKey] === focusItemValue
329
329
  });
330
330
  return /*#__PURE__*/React.createElement("div", {
331
+ role: "treeitem",
332
+ "aria-disabled": disabled,
331
333
  key: key,
332
334
  className: itemClasses,
333
- "aria-disabled": disabled,
334
335
  "data-key": item[valueKey]
335
336
  }, /*#__PURE__*/React.createElement(Checkbox, {
336
337
  disabled: disabled,
@@ -359,12 +360,13 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
359
360
  var items = getSearchResult();
360
361
  return /*#__PURE__*/React.createElement("div", {
361
362
  className: prefix('cascader-search-panel'),
362
- "data-layer": 0
363
+ "data-layer": 0,
364
+ role: "tree"
363
365
  }, items.length ? items.map(renderSearchRow) : /*#__PURE__*/React.createElement("div", {
364
366
  className: prefix('none')
365
367
  }, locale.noResultsText));
366
368
  };
367
- var renderDropdownMenu = function renderDropdownMenu(positionProps, speakerRef) {
369
+ var renderTreeView = function renderTreeView(positionProps, speakerRef) {
368
370
  var _ref = positionProps || {},
369
371
  left = _ref.left,
370
372
  top = _ref.top,
@@ -376,7 +378,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
376
378
  var classes = merge(className, menuClassName, prefix('cascader-menu', 'multi-cascader-menu', {
377
379
  inline: inline
378
380
  }));
379
- return /*#__PURE__*/React.createElement(PickerOverlay, {
381
+ return /*#__PURE__*/React.createElement(PickerPopup, {
380
382
  ref: mergeRefs(overlay, speakerRef),
381
383
  className: classes,
382
384
  style: styles,
@@ -387,8 +389,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
387
389
  onChange: handleSearch,
388
390
  value: searchKeyword,
389
391
  inputRef: searchInput
390
- }), renderSearchResultPanel(), searchKeyword === '' && /*#__PURE__*/React.createElement(DropdownMenu, {
391
- id: id ? id + "-listbox" : undefined,
392
+ }), renderSearchResultPanel(), searchKeyword === '' && /*#__PURE__*/React.createElement(TreeView, {
392
393
  cascade: cascade,
393
394
  menuWidth: menuWidth,
394
395
  menuHeight: menuHeight,
@@ -438,22 +439,24 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
438
439
  classes = _usePickerClassName[0],
439
440
  usedClassNamePropKeys = _usePickerClassName[1];
440
441
  if (inline) {
441
- return renderDropdownMenu();
442
+ return renderTreeView();
442
443
  }
443
444
  return /*#__PURE__*/React.createElement(PickerToggleTrigger, {
445
+ id: id,
446
+ popupType: "tree",
447
+ multiple: true,
444
448
  pickerProps: pick(props, pickTriggerPropKeys),
445
449
  ref: trigger,
446
450
  placement: placement,
447
451
  onEnter: createChainedFunction(handleEntered, onEnter),
448
452
  onExited: createChainedFunction(handleExited, onExited),
449
453
  onExit: createChainedFunction(onClose, onExit),
450
- speaker: renderDropdownMenu
454
+ speaker: renderTreeView
451
455
  }, /*#__PURE__*/React.createElement(Component, {
452
456
  className: classes,
453
457
  style: style,
454
458
  ref: root
455
459
  }, /*#__PURE__*/React.createElement(PickerToggle, _extends({}, omit(rest, [].concat(omitTriggerPropKeys, usedClassNamePropKeys)), {
456
- id: id,
457
460
  as: toggleAs,
458
461
  appearance: appearance,
459
462
  disabled: disabled,
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { ItemDataType, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
3
  import { ValueType } from './MultiCascader';
4
- export interface DropdownMenuProps extends WithAsProps {
4
+ export interface TreeViewProps extends WithAsProps {
5
5
  disabledItemValues: ValueType;
6
6
  value: ValueType;
7
7
  childrenKey: string;
@@ -21,5 +21,5 @@ export interface DropdownMenuProps extends WithAsProps {
21
21
  /**
22
22
  * TODO: reuse Menu from Cascader for consistent behavior
23
23
  */
24
- declare const DropdownMenu: RsRefForwardingComponent<'div', DropdownMenuProps>;
25
- export default DropdownMenu;
24
+ declare const TreeView: RsRefForwardingComponent<'div', TreeViewProps>;
25
+ export default TreeView;
@@ -1,20 +1,19 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import React, { useCallback } from 'react';
5
- import PropTypes from 'prop-types';
4
+ import React from 'react';
6
5
  import SpinnerIcon from '@rsuite/icons/legacy/Spinner';
7
6
  import AngleLeftIcon from '@rsuite/icons/legacy/AngleLeft';
8
7
  import AngleRightIcon from '@rsuite/icons/legacy/AngleRight';
9
- import { useClassNames, shallowEqual, useCustom } from '../utils';
10
- import { DropdownMenuCheckItem } from '../Picker';
8
+ import { useClassNames, shallowEqual, useCustom, useEventCallback } from '../utils';
9
+ import { ListCheckItem, useCombobox } from '../Picker';
11
10
  import { isSomeParentChecked, isSomeChildChecked } from './utils';
12
11
  var emptyArray = [];
13
12
 
14
13
  /**
15
14
  * TODO: reuse Menu from Cascader for consistent behavior
16
15
  */
17
- var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
16
+ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
18
17
  var _props$as = props.as,
19
18
  Component = _props$as === void 0 ? 'div' : _props$as,
20
19
  _props$classPrefix = props.classPrefix,
@@ -40,18 +39,24 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
40
39
  valueKey = _props$valueKey === void 0 ? 'value' : _props$valueKey,
41
40
  _props$labelKey = props.labelKey,
42
41
  labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
42
+ style = props.style,
43
43
  renderMenuItem = props.renderMenuItem,
44
44
  renderMenu = props.renderMenu,
45
45
  _onCheck = props.onCheck,
46
46
  onSelect = props.onSelect,
47
- rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "cascade", "cascadeData", "cascadePaths", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "uncheckableItemValues", "value", "valueKey", "labelKey", "renderMenuItem", "renderMenu", "onCheck", "onSelect"]);
47
+ rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "cascade", "cascadeData", "cascadePaths", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "uncheckableItemValues", "value", "valueKey", "labelKey", "style", "renderMenuItem", "renderMenu", "onCheck", "onSelect"]);
48
48
  var _useClassNames = useClassNames(classPrefix),
49
49
  merge = _useClassNames.merge,
50
50
  prefix = _useClassNames.prefix;
51
51
  var classes = merge(className, prefix('items'));
52
- var _useCustom = useCustom('DropdownMenu'),
52
+ var _useCustom = useCustom(),
53
53
  rtl = _useCustom.rtl;
54
- var getCascadePaths = useCallback(function (layer, node) {
54
+ var _useCombobox = useCombobox(),
55
+ id = _useCombobox.id,
56
+ labelId = _useCombobox.labelId,
57
+ popupType = _useCombobox.popupType,
58
+ multiple = _useCombobox.multiple;
59
+ var getCascadePaths = function getCascadePaths(layer, node) {
55
60
  var paths = [];
56
61
  for (var i = 0; i < cascadeData.length && i < layer; i += 1) {
57
62
  if (i < layer - 1 && cascadePaths) {
@@ -60,15 +65,21 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
60
65
  }
61
66
  paths.push(node);
62
67
  return paths;
63
- }, [cascadeData, cascadePaths]);
64
- var handleSelect = useCallback(function (layer, node, event) {
68
+ };
69
+ var handleSelect = useEventCallback(function (layer, node, event) {
65
70
  var cascadePaths = getCascadePaths(layer + 1, node);
66
71
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
67
- }, [getCascadePaths, onSelect]);
68
- var renderCascadeNode = function renderCascadeNode(node, index, layer, focus, uncheckable) {
72
+ });
73
+ var renderCascadeNode = function renderCascadeNode(nodeProps) {
74
+ var node = nodeProps.node,
75
+ index = nodeProps.index,
76
+ layer = nodeProps.layer,
77
+ focus = nodeProps.focus,
78
+ uncheckable = nodeProps.uncheckable,
79
+ size = nodeProps.size;
69
80
  var children = node[childrenKey];
70
81
  var nodeValue = node[valueKey];
71
- var nodeLabel = node[labelKey];
82
+ var label = node[labelKey];
72
83
  var disabled = disabledItemValues.some(function (disabledValue) {
73
84
  return shallowEqual(disabledValue, nodeValue);
74
85
  });
@@ -84,8 +95,13 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
84
95
  valueKey: valueKey
85
96
  });
86
97
  }
87
- return /*#__PURE__*/React.createElement(DropdownMenuCheckItem, {
98
+ return /*#__PURE__*/React.createElement(ListCheckItem, {
88
99
  as: "li",
100
+ role: "treeitem",
101
+ "aria-level": layer + 1,
102
+ "aria-setsize": size,
103
+ "aria-posinset": index + 1,
104
+ "aria-label": typeof label === 'string' ? label : undefined,
89
105
  key: layer + "-" + onlyKey,
90
106
  disabled: disabled,
91
107
  active: active,
@@ -105,72 +121,60 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
105
121
  return _onCheck === null || _onCheck === void 0 ? void 0 : _onCheck(node, event, checked);
106
122
  },
107
123
  checkable: !uncheckable
108
- }, renderMenuItem ? renderMenuItem(nodeLabel, node) : nodeLabel, children ? /*#__PURE__*/React.createElement(Icon, {
124
+ }, renderMenuItem ? renderMenuItem(label, node) : label, children ? /*#__PURE__*/React.createElement(Icon, {
109
125
  className: prefix('caret'),
110
126
  spin: node.loading
111
127
  }) : null);
112
128
  };
113
- var renderCascade = function renderCascade() {
114
- var styles = {
115
- width: cascadeData.length * menuWidth
116
- };
117
- var columnStyles = {
118
- height: menuHeight,
119
- width: menuWidth
120
- };
121
- var cascadeNodes = cascadeData.map(function (children, layer) {
122
- var uncheckableCount = 0;
123
- var onlyKey = layer + "_" + children.length;
124
- var menu = /*#__PURE__*/React.createElement("ul", {
125
- role: "listbox"
126
- }, children.map(function (item, index) {
127
- var uncheckable = uncheckableItemValues.some(function (uncheckableValue) {
128
- return shallowEqual(uncheckableValue, item[valueKey]);
129
- });
130
- if (uncheckable) {
131
- uncheckableCount++;
132
- }
133
- return renderCascadeNode(item, index, layer, cascadePaths[layer] && shallowEqual(cascadePaths[layer][valueKey], item[valueKey]), uncheckable);
134
- }));
135
- var parentNode = cascadePaths[layer - 1];
136
- var columnClasses = prefix('column', {
137
- 'column-uncheckable': uncheckableCount === children.length
129
+ var columnStyles = {
130
+ height: menuHeight,
131
+ width: menuWidth
132
+ };
133
+ var cascadeNodes = cascadeData.map(function (children, layer) {
134
+ var uncheckableCount = 0;
135
+ var onlyKey = layer + "_" + children.length;
136
+ var menu = /*#__PURE__*/React.createElement(React.Fragment, null, children.map(function (item, index) {
137
+ var uncheckable = uncheckableItemValues.some(function (uncheckableValue) {
138
+ return shallowEqual(uncheckableValue, item[valueKey]);
138
139
  });
139
- return /*#__PURE__*/React.createElement("div", {
140
- key: onlyKey,
141
- className: columnClasses,
142
- "data-layer": layer,
143
- style: columnStyles
144
- }, renderMenu ? renderMenu(children, menu, parentNode, layer) : menu);
140
+ if (uncheckable) {
141
+ uncheckableCount++;
142
+ }
143
+ var focus = cascadePaths[layer] && shallowEqual(cascadePaths[layer][valueKey], item[valueKey]);
144
+ return renderCascadeNode({
145
+ node: item,
146
+ index: index,
147
+ layer: layer,
148
+ focus: focus,
149
+ uncheckable: uncheckable,
150
+ size: children.length
151
+ });
152
+ }));
153
+ var parentNode = cascadePaths[layer - 1];
154
+ var columnClasses = prefix('column', {
155
+ 'column-uncheckable': uncheckableCount === children.length
145
156
  });
146
- return /*#__PURE__*/React.createElement("div", {
147
- style: styles
148
- }, cascadeNodes);
149
- };
150
- return /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
157
+ return /*#__PURE__*/React.createElement("ul", {
158
+ role: "group",
159
+ key: onlyKey,
160
+ className: columnClasses,
161
+ "data-layer": layer,
162
+ style: columnStyles
163
+ }, renderMenu ? renderMenu(children, menu, parentNode, layer) : menu);
164
+ });
165
+ var styles = _extends({}, style, {
166
+ width: cascadeData.length * menuWidth
167
+ });
168
+ return /*#__PURE__*/React.createElement(Component, _extends({
169
+ role: "tree",
170
+ id: id + "-" + popupType,
171
+ "aria-labelledby": labelId,
172
+ "aria-multiselectable": multiple
173
+ }, rest, {
151
174
  ref: ref,
152
- className: classes
153
- }), renderCascade());
175
+ className: classes,
176
+ style: styles
177
+ }), cascadeNodes);
154
178
  });
155
- DropdownMenu.displayName = 'DropdownMenu';
156
- DropdownMenu.propTypes = {
157
- classPrefix: PropTypes.string,
158
- data: PropTypes.array,
159
- disabledItemValues: PropTypes.array,
160
- value: PropTypes.array,
161
- childrenKey: PropTypes.string,
162
- valueKey: PropTypes.string,
163
- labelKey: PropTypes.string,
164
- menuWidth: PropTypes.number,
165
- menuHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
166
- className: PropTypes.string,
167
- cascade: PropTypes.bool,
168
- cascadeData: PropTypes.array,
169
- cascadePaths: PropTypes.array,
170
- uncheckableItemValues: PropTypes.array,
171
- renderMenuItem: PropTypes.func,
172
- renderMenu: PropTypes.func,
173
- onSelect: PropTypes.func,
174
- onCheck: PropTypes.func
175
- };
176
- export default DropdownMenu;
179
+ TreeView.displayName = 'TreeView';
180
+ export default TreeView;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { CheckboxProps } from '../Checkbox';
3
3
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
- export interface DropdownMenuCheckItemProps extends WithAsProps {
4
+ export interface ListCheckItemProps extends WithAsProps {
5
5
  active?: boolean;
6
6
  checkboxAs?: React.ElementType | string;
7
7
  classPrefix?: string;
@@ -19,5 +19,5 @@ export interface DropdownMenuCheckItemProps extends WithAsProps {
19
19
  onKeyDown?: (event: React.KeyboardEvent) => void;
20
20
  renderMenuItemCheckbox?: (checkboxProps: CheckboxProps) => React.ReactNode;
21
21
  }
22
- declare const DropdownMenuCheckItem: RsRefForwardingComponent<'div', DropdownMenuCheckItemProps>;
23
- export default DropdownMenuCheckItem;
22
+ declare const ListCheckItem: RsRefForwardingComponent<'div', ListCheckItemProps>;
23
+ export default ListCheckItem;
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import React, { useCallback } from 'react';
5
- import PropTypes from 'prop-types';
6
- import { useClassNames } from '../utils';
4
+ import React from 'react';
5
+ import { useClassNames, useEventCallback } from '../utils';
7
6
  import Checkbox from '../Checkbox';
8
- var DropdownMenuCheckItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
7
+ import useCombobox from './hooks/useCombobox';
8
+ var ListCheckItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
9
9
  var _props$active = props.active,
10
10
  active = _props$active === void 0 ? false : _props$active,
11
11
  _props$as = props.as,
@@ -28,19 +28,21 @@ var DropdownMenuCheckItem = /*#__PURE__*/React.forwardRef(function (props, ref)
28
28
  onSelectItem = props.onSelectItem,
29
29
  renderMenuItemCheckbox = props.renderMenuItemCheckbox,
30
30
  rest = _objectWithoutPropertiesLoose(props, ["active", "as", "checkboxAs", "classPrefix", "checkable", "disabled", "value", "focus", "children", "className", "indeterminate", "onKeyDown", "onSelect", "onCheck", "onSelectItem", "renderMenuItemCheckbox"]);
31
- var handleChange = useCallback(function (value, checked, event) {
31
+ var handleChange = useEventCallback(function (value, checked, event) {
32
32
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(value, event, checked);
33
- }, [onSelect]);
34
- var handleCheck = useCallback(function (event) {
33
+ });
34
+ var handleCheck = useEventCallback(function (event) {
35
35
  if (!disabled) {
36
36
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(value, event, !active);
37
37
  }
38
- }, [value, disabled, onCheck, active]);
39
- var handleSelectItem = useCallback(function (event) {
38
+ });
39
+ var handleSelectItem = useEventCallback(function (event) {
40
40
  if (!disabled) {
41
41
  onSelectItem === null || onSelectItem === void 0 ? void 0 : onSelectItem(value, event, !active);
42
42
  }
43
- }, [value, disabled, onSelectItem, active]);
43
+ });
44
+ var _useCombobox = useCombobox(),
45
+ id = _useCombobox.id;
44
46
  var _useClassNames = useClassNames(classPrefix),
45
47
  withClassPrefix = _useClassNames.withClassPrefix;
46
48
  var checkboxItemClasses = withClassPrefix({
@@ -63,6 +65,7 @@ var DropdownMenuCheckItem = /*#__PURE__*/React.forwardRef(function (props, ref)
63
65
  role: "option",
64
66
  "aria-selected": active,
65
67
  "aria-disabled": disabled,
68
+ id: id ? id + "-opt-" + value : undefined,
66
69
  "data-key": value
67
70
  }, rest, {
68
71
  ref: ref,
@@ -72,23 +75,5 @@ var DropdownMenuCheckItem = /*#__PURE__*/React.forwardRef(function (props, ref)
72
75
  role: "checkbox"
73
76
  }, checkboxProps)));
74
77
  });
75
- DropdownMenuCheckItem.displayName = 'DropdownMenuCheckItem';
76
- DropdownMenuCheckItem.propTypes = {
77
- classPrefix: PropTypes.string,
78
- active: PropTypes.bool,
79
- disabled: PropTypes.bool,
80
- checkable: PropTypes.bool,
81
- indeterminate: PropTypes.bool,
82
- value: PropTypes.any,
83
- onSelect: PropTypes.func,
84
- onCheck: PropTypes.func,
85
- onSelectItem: PropTypes.func,
86
- onKeyDown: PropTypes.func,
87
- focus: PropTypes.bool,
88
- title: PropTypes.string,
89
- className: PropTypes.string,
90
- children: PropTypes.node,
91
- as: PropTypes.elementType,
92
- checkboxAs: PropTypes.elementType
93
- };
94
- export default DropdownMenuCheckItem;
78
+ ListCheckItem.displayName = 'ListCheckItem';
79
+ export default ListCheckItem;
@@ -1,14 +1,14 @@
1
1
  import React from 'react';
2
2
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
- export interface DropdownMenuItemProps extends WithAsProps {
3
+ export interface ListItemProps extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect'> {
4
4
  active?: boolean;
5
5
  disabled?: boolean;
6
- value?: any;
6
+ value?: string | number;
7
7
  focus?: boolean;
8
8
  title?: string;
9
9
  onSelect?: (value: any, event: React.MouseEvent) => void;
10
10
  onKeyDown?: (event: React.KeyboardEvent) => void;
11
11
  renderItem?: (value: any) => React.ReactNode;
12
12
  }
13
- declare const DropdownMenuItem: RsRefForwardingComponent<'div', DropdownMenuItemProps>;
14
- export default DropdownMenuItem;
13
+ declare const ListItem: RsRefForwardingComponent<'div', ListItemProps>;
14
+ export default ListItem;
@@ -1,15 +1,17 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import React, { useCallback } from 'react';
5
- import PropTypes from 'prop-types';
6
- import { useClassNames } from '../utils';
7
- var DropdownMenuItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
4
+ import React from 'react';
5
+ import { useClassNames, useEventCallback } from '../utils';
6
+ import useCombobox from './hooks/useCombobox';
7
+ var ListItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
8
8
  var _props$as = props.as,
9
9
  Component = _props$as === void 0 ? 'div' : _props$as,
10
- active = props.active,
10
+ _props$role = props.role,
11
+ role = _props$role === void 0 ? 'option' : _props$role,
11
12
  _props$classPrefix = props.classPrefix,
12
13
  classPrefix = _props$classPrefix === void 0 ? 'dropdown-menu-item' : _props$classPrefix,
14
+ active = props.active,
13
15
  children = props.children,
14
16
  className = props.className,
15
17
  disabled = props.disabled,
@@ -18,13 +20,15 @@ var DropdownMenuItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
18
20
  onKeyDown = props.onKeyDown,
19
21
  onSelect = props.onSelect,
20
22
  renderItem = props.renderItem,
21
- rest = _objectWithoutPropertiesLoose(props, ["as", "active", "classPrefix", "children", "className", "disabled", "focus", "value", "onKeyDown", "onSelect", "renderItem"]);
22
- var handleClick = useCallback(function (event) {
23
+ rest = _objectWithoutPropertiesLoose(props, ["as", "role", "classPrefix", "active", "children", "className", "disabled", "focus", "value", "onKeyDown", "onSelect", "renderItem"]);
24
+ var _useCombobox = useCombobox(),
25
+ id = _useCombobox.id;
26
+ var handleClick = useEventCallback(function (event) {
23
27
  event.preventDefault();
24
28
  if (!disabled) {
25
29
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(value, event);
26
30
  }
27
- }, [onSelect, disabled, value]);
31
+ });
28
32
  var _useClassNames = useClassNames(classPrefix),
29
33
  withClassPrefix = _useClassNames.withClassPrefix;
30
34
  var classes = withClassPrefix({
@@ -33,9 +37,10 @@ var DropdownMenuItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
33
37
  disabled: disabled
34
38
  });
35
39
  return /*#__PURE__*/React.createElement(Component, _extends({
36
- role: "option",
40
+ role: role,
37
41
  "aria-selected": active,
38
42
  "aria-disabled": disabled,
43
+ id: id ? id + "-opt-" + value : undefined,
39
44
  "data-key": value
40
45
  }, rest, {
41
46
  ref: ref,
@@ -47,18 +52,5 @@ var DropdownMenuItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
47
52
  className: classes
48
53
  }, renderItem ? renderItem(value) : children));
49
54
  });
50
- DropdownMenuItem.displayName = 'DropdownMenuItem';
51
- DropdownMenuItem.propTypes = {
52
- classPrefix: PropTypes.string,
53
- active: PropTypes.bool,
54
- disabled: PropTypes.bool,
55
- value: PropTypes.any,
56
- onSelect: PropTypes.func,
57
- onKeyDown: PropTypes.func,
58
- focus: PropTypes.bool,
59
- title: PropTypes.string,
60
- className: PropTypes.string,
61
- children: PropTypes.node,
62
- as: PropTypes.elementType
63
- };
64
- export default DropdownMenuItem;
55
+ ListItem.displayName = 'ListItem';
56
+ export default ListItem;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { WithAsProps } from '../@types/common';
3
+ export interface ListItemGroupProps extends WithAsProps, React.HTMLAttributes<HTMLDivElement> {
4
+ }
5
+ declare const ListItemGroup: React.ForwardRefExoticComponent<ListItemGroupProps & React.RefAttributes<HTMLDivElement>>;
6
+ export default ListItemGroup;
@@ -4,10 +4,9 @@ import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTempla
4
4
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
5
  var _templateObject, _templateObject2;
6
6
  import React from 'react';
7
- import PropTypes from 'prop-types';
8
7
  import { useClassNames } from '../utils';
9
8
  import ArrowDown from '@rsuite/icons/legacy/ArrowDown';
10
- var DropdownMenuGroup = /*#__PURE__*/React.forwardRef(function (props, ref) {
9
+ var ListItemGroup = /*#__PURE__*/React.forwardRef(function (props, ref) {
11
10
  var _props$as = props.as,
12
11
  Component = _props$as === void 0 ? 'div' : _props$as,
13
12
  _props$classPrefix = props.classPrefix,
@@ -33,10 +32,5 @@ var DropdownMenuGroup = /*#__PURE__*/React.forwardRef(function (props, ref) {
33
32
  className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["caret"])))
34
33
  })));
35
34
  });
36
- DropdownMenuGroup.displayName = 'DropdownMenuGroup';
37
- DropdownMenuGroup.propTypes = {
38
- classPrefix: PropTypes.string,
39
- className: PropTypes.string,
40
- children: PropTypes.node
41
- };
42
- export default DropdownMenuGroup;
35
+ ListItemGroup.displayName = 'ListItemGroup';
36
+ export default ListItemGroup;
@@ -0,0 +1,35 @@
1
+ import React from 'react';
2
+ import { ListProps, ListHandle } from '../Windowing';
3
+ import { StandardProps, ItemDataType } from '../@types/common';
4
+ export interface ListboxProps<Multiple = false> extends StandardProps, Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {
5
+ classPrefix: string;
6
+ data?: ItemDataType[];
7
+ group?: boolean;
8
+ groupBy?: string;
9
+ disabledItemValues?: any[];
10
+ activeItemValues?: any[];
11
+ focusItemValue?: any;
12
+ maxHeight?: number;
13
+ valueKey?: string;
14
+ labelKey?: string;
15
+ className?: string;
16
+ style?: React.CSSProperties;
17
+ listItemAs: React.ElementType | string;
18
+ listItemClassPrefix?: string;
19
+ listItemProps?: any;
20
+ rowHeight?: number;
21
+ rowGroupHeight?: number;
22
+ virtualized?: boolean;
23
+ listProps?: Partial<ListProps>;
24
+ listRef?: React.Ref<ListHandle>;
25
+ /** Custom selected option */
26
+ renderMenuItem?: (itemLabel: React.ReactNode, item: any) => React.ReactNode;
27
+ renderMenuGroup?: (title: React.ReactNode, item: any) => React.ReactNode;
28
+ onSelect?: Multiple extends true ? (value: any, item: any, event: React.MouseEvent, checked: boolean) => void : Multiple extends false ? (value: any, item: any, event: React.MouseEvent) => void : any;
29
+ onGroupTitleClick?: (event: React.MouseEvent) => void;
30
+ }
31
+ export declare type ListboxComponent = React.ForwardRefExoticComponent<ListboxProps> & {
32
+ <Multiple = false>(props: ListboxProps<Multiple>): React.ReactElement | null;
33
+ };
34
+ declare const Listbox: ListboxComponent;
35
+ export default Listbox;