rsuite 5.17.0-beta.1 → 5.17.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/Button/styles/index.less +1 -1
  2. package/CHANGELOG.md +22 -0
  3. package/Calendar/styles/index.less +0 -0
  4. package/DatePicker/styles/index.less +0 -10
  5. package/DateRangePicker/styles/index.less +12 -5
  6. package/FormControl/styles/index.less +0 -0
  7. package/Windowing/package.json +7 -0
  8. package/cjs/Calendar/Header.js +2 -4
  9. package/cjs/Calendar/MonthDropdown.d.ts +1 -0
  10. package/cjs/Calendar/MonthDropdown.js +27 -40
  11. package/cjs/Calendar/useCalendarDate.d.ts +1 -0
  12. package/cjs/Calendar/useCalendarDate.js +7 -1
  13. package/cjs/Cascader/Cascader.d.ts +2 -2
  14. package/cjs/Cascader/DropdownMenu.js +5 -2
  15. package/cjs/CheckPicker/CheckPicker.d.ts +2 -2
  16. package/cjs/CheckPicker/CheckPicker.js +4 -1
  17. package/cjs/CheckTreePicker/CheckTreePicker.js +31 -31
  18. package/cjs/DatePicker/DatePicker.js +4 -3
  19. package/cjs/DatePicker/PredefinedRanges.d.ts +13 -0
  20. package/cjs/DatePicker/PredefinedRanges.js +79 -0
  21. package/cjs/DatePicker/Toolbar.d.ts +2 -9
  22. package/cjs/DatePicker/Toolbar.js +45 -62
  23. package/cjs/DateRangePicker/DateRangePicker.js +57 -9
  24. package/cjs/DateRangePicker/types.d.ts +2 -1
  25. package/cjs/FormControl/FormControl.js +3 -5
  26. package/cjs/InputPicker/InputPicker.js +4 -1
  27. package/cjs/MultiCascader/DropdownMenu.js +5 -2
  28. package/cjs/Overlay/OverlayTrigger.d.ts +2 -2
  29. package/cjs/Picker/DropdownMenu.d.ts +2 -1
  30. package/cjs/Picker/DropdownMenu.js +39 -33
  31. package/cjs/Picker/PickerOverlay.d.ts +2 -2
  32. package/cjs/Picker/PickerToggleTrigger.d.ts +2 -2
  33. package/cjs/Picker/index.d.ts +3 -3
  34. package/cjs/Picker/types.d.ts +7 -5
  35. package/cjs/Picker/types.js +0 -0
  36. package/cjs/Picker/utils.d.ts +11 -12
  37. package/cjs/Picker/utils.js +4 -0
  38. package/cjs/SelectPicker/SelectPicker.d.ts +4 -5
  39. package/cjs/SelectPicker/SelectPicker.js +4 -1
  40. package/cjs/Tree/Tree.d.ts +2 -5
  41. package/cjs/TreePicker/TreePicker.js +34 -34
  42. package/cjs/TreePicker/test/TreePicker.test.js +14 -0
  43. package/cjs/Whisper/Whisper.d.ts +3 -3
  44. package/cjs/Windowing/AutoSizer.d.ts +25 -0
  45. package/cjs/Windowing/AutoSizer.js +107 -0
  46. package/cjs/Windowing/List.d.ts +45 -0
  47. package/cjs/Windowing/List.js +72 -0
  48. package/cjs/Windowing/index.d.ts +5 -0
  49. package/cjs/Windowing/index.js +19 -0
  50. package/cjs/index.d.ts +1 -0
  51. package/cjs/utils/dateUtils.d.ts +1 -0
  52. package/cjs/utils/dateUtils.js +5 -1
  53. package/cjs/utils/treeUtils.d.ts +2 -2
  54. package/dist/rsuite-rtl.css +10 -18
  55. package/dist/rsuite-rtl.min.css +1 -1
  56. package/dist/rsuite-rtl.min.css.map +1 -1
  57. package/dist/rsuite.css +10 -18
  58. package/dist/rsuite.js +110 -377
  59. package/dist/rsuite.js.map +1 -1
  60. package/dist/rsuite.min.css +1 -1
  61. package/dist/rsuite.min.css.map +1 -1
  62. package/dist/rsuite.min.js +1 -1
  63. package/dist/rsuite.min.js.map +1 -1
  64. package/esm/Calendar/Header.js +2 -4
  65. package/esm/Calendar/MonthDropdown.d.ts +1 -0
  66. package/esm/Calendar/MonthDropdown.js +26 -41
  67. package/esm/Calendar/useCalendarDate.d.ts +1 -0
  68. package/esm/Calendar/useCalendarDate.js +7 -1
  69. package/esm/Cascader/Cascader.d.ts +2 -2
  70. package/esm/Cascader/DropdownMenu.js +5 -2
  71. package/esm/CheckPicker/CheckPicker.d.ts +2 -2
  72. package/esm/CheckPicker/CheckPicker.js +4 -1
  73. package/esm/CheckTreePicker/CheckTreePicker.js +31 -30
  74. package/esm/DatePicker/DatePicker.js +4 -3
  75. package/esm/DatePicker/PredefinedRanges.d.ts +13 -0
  76. package/esm/DatePicker/PredefinedRanges.js +62 -0
  77. package/esm/DatePicker/Toolbar.d.ts +2 -9
  78. package/esm/DatePicker/Toolbar.js +45 -61
  79. package/esm/DateRangePicker/DateRangePicker.js +55 -9
  80. package/esm/DateRangePicker/types.d.ts +2 -1
  81. package/esm/FormControl/FormControl.js +3 -5
  82. package/esm/InputPicker/InputPicker.js +4 -1
  83. package/esm/MultiCascader/DropdownMenu.js +5 -2
  84. package/esm/Overlay/OverlayTrigger.d.ts +2 -2
  85. package/esm/Picker/DropdownMenu.d.ts +2 -1
  86. package/esm/Picker/DropdownMenu.js +39 -35
  87. package/esm/Picker/PickerOverlay.d.ts +2 -2
  88. package/esm/Picker/PickerToggleTrigger.d.ts +2 -2
  89. package/esm/Picker/index.d.ts +3 -3
  90. package/esm/Picker/types.d.ts +7 -5
  91. package/esm/Picker/types.js +0 -0
  92. package/esm/Picker/utils.d.ts +11 -12
  93. package/esm/Picker/utils.js +4 -0
  94. package/esm/SelectPicker/SelectPicker.d.ts +4 -5
  95. package/esm/SelectPicker/SelectPicker.js +4 -1
  96. package/esm/Tree/Tree.d.ts +2 -5
  97. package/esm/TreePicker/TreePicker.js +33 -32
  98. package/esm/TreePicker/test/TreePicker.test.js +14 -0
  99. package/esm/Whisper/Whisper.d.ts +3 -3
  100. package/esm/Windowing/AutoSizer.d.ts +25 -0
  101. package/esm/Windowing/AutoSizer.js +92 -0
  102. package/esm/Windowing/List.d.ts +45 -0
  103. package/esm/Windowing/List.js +58 -0
  104. package/esm/Windowing/index.d.ts +5 -0
  105. package/esm/Windowing/index.js +3 -0
  106. package/esm/index.d.ts +1 -0
  107. package/esm/utils/dateUtils.d.ts +1 -0
  108. package/esm/utils/dateUtils.js +1 -0
  109. package/esm/utils/treeUtils.d.ts +2 -2
  110. package/package.json +4 -4
  111. package/cjs/Picker/VirtualizedList.d.ts +0 -37
  112. package/cjs/Picker/VirtualizedList.js +0 -15
  113. package/esm/Picker/VirtualizedList.d.ts +0 -37
  114. package/esm/Picker/VirtualizedList.js +0 -4
@@ -9,6 +9,8 @@ import PropTypes from 'prop-types';
9
9
  import React, { useCallback, useEffect, useRef, useState } from 'react';
10
10
  import { FormattedDate } from '../CustomProvider';
11
11
  import Toolbar from '../DatePicker/Toolbar';
12
+ import PredefinedRanges from '../DatePicker/PredefinedRanges';
13
+ import Stack from '../Stack';
12
14
  import { omitTriggerPropKeys, PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
13
15
  import { createChainedFunction, DATERANGE_DISABLED_TARGET, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
14
16
  import { addMonths, compareAsc, isSameMonth } from '../utils/dateUtils';
@@ -135,11 +137,31 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
135
137
  */
136
138
 
137
139
  var updateCalendarDateRange = useCallback(function (value, calendarKey) {
140
+ var nextValue = value;
141
+ var shouldTime = DateUtils.shouldTime,
142
+ getHours = DateUtils.getHours,
143
+ getMinutes = DateUtils.getMinutes,
144
+ getSeconds = DateUtils.getSeconds,
145
+ set = DateUtils.set;
146
+
147
+ if (shouldTime(formatStr) && calendarKey === undefined && (value === null || value === void 0 ? void 0 : value.length) === 1 && (defaultCalendarValue === null || defaultCalendarValue === void 0 ? void 0 : defaultCalendarValue.length) === 2) {
148
+ var calendarEndDate = (calendarDate === null || calendarDate === void 0 ? void 0 : calendarDate[1]) || defaultCalendarValue[1];
149
+ var _startDate = value[0]; // When updating the start date, the time of the end date should keep the time set by the user by default.
150
+
151
+ var _endDate = set(addMonths(_startDate, 1), {
152
+ hours: getHours(calendarEndDate),
153
+ minutes: getMinutes(calendarEndDate),
154
+ seconds: getSeconds(calendarEndDate)
155
+ });
156
+
157
+ nextValue = [_startDate, _endDate];
158
+ }
159
+
138
160
  setCalendarDate(getCalendarDate({
139
- value: value,
161
+ value: nextValue,
140
162
  calendarKey: calendarKey
141
163
  }));
142
- }, []); // if valueProp changed then update selectValue/hoverValue
164
+ }, [calendarDate, defaultCalendarValue, formatStr]); // if valueProp changed then update selectValue/hoverValue
143
165
 
144
166
  useEffect(function () {
145
167
  setSelectedDates(valueProp !== null && valueProp !== void 0 ? valueProp : []);
@@ -371,10 +393,17 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
371
393
  closeOverlay = false;
372
394
  }
373
395
 
374
- handleValueUpdate(event, value, closeOverlay); // End unfinished selections.
396
+ updateCalendarDateRange(value);
397
+
398
+ if (closeOverlay) {
399
+ handleValueUpdate(event, value, closeOverlay);
400
+ } else {
401
+ setSelectedDates(value !== null && value !== void 0 ? value : []);
402
+ } // End unfinished selections.
403
+
375
404
 
376
405
  hasDoneSelect.current = true;
377
- }, [handleValueUpdate]);
406
+ }, [handleValueUpdate, updateCalendarDateRange]);
378
407
  var handleOK = useCallback(function (event) {
379
408
  handleValueUpdate(event, selectedDates);
380
409
  onOk === null || onOk === void 0 ? void 0 : onOk(selectedDates, event);
@@ -435,10 +464,11 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
435
464
  var nextCalendarDate;
436
465
 
437
466
  if (value && value.length) {
438
- var _startDate = value[0],
467
+ var _startDate2 = value[0],
439
468
  endData = value[1];
440
- nextCalendarDate = [_startDate, isSameMonth(_startDate, endData) ? addMonths(endData, 1) : endData];
469
+ nextCalendarDate = [_startDate2, isSameMonth(_startDate2, endData) ? addMonths(endData, 1) : endData];
441
470
  } else {
471
+ // Reset the date on the calendar to the default date
442
472
  nextCalendarDate = getCalendarDate({
443
473
  value: defaultCalendarValue !== null && defaultCalendarValue !== void 0 ? defaultCalendarValue : null
444
474
  });
@@ -542,13 +572,27 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
542
572
  renderTitle: renderTitle
543
573
  };
544
574
  return /*#__PURE__*/React.createElement(PickerOverlay, {
575
+ role: "dialog",
545
576
  className: classes,
546
577
  ref: mergeRefs(overlayRef, speakerRef),
547
578
  target: triggerRef,
548
579
  style: styles
549
580
  }, /*#__PURE__*/React.createElement("div", {
550
581
  className: panelClasses
551
- }, /*#__PURE__*/React.createElement("div", {
582
+ }, /*#__PURE__*/React.createElement(Stack, {
583
+ alignItems: "flex-start"
584
+ }, /*#__PURE__*/React.createElement(PredefinedRanges, {
585
+ direction: "column",
586
+ spacing: 0,
587
+ className: prefix('daterange-predefined'),
588
+ ranges: (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
589
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'left';
590
+ })) || [],
591
+ calendarDate: calendarDate,
592
+ locale: locale,
593
+ disabledShortcut: disabledShortcutButton,
594
+ onClickShortcut: handleShortcutPageDate
595
+ }), /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
552
596
  className: prefix('daterange-content')
553
597
  }, /*#__PURE__*/React.createElement("div", {
554
598
  className: prefix('daterange-header')
@@ -566,8 +610,10 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
566
610
  hideOkBtn: oneTap,
567
611
  onOk: handleOK,
568
612
  onClickShortcut: handleShortcutPageDate,
569
- ranges: ranges
570
- })));
613
+ ranges: ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
614
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
615
+ })
616
+ })))));
571
617
  };
572
618
 
573
619
  var hasValue = !isNil(value) && value.length > 1;
@@ -4,8 +4,9 @@ export declare type ValueType = [Date?, Date?];
4
4
  export declare type DateRange = [Date, Date];
5
5
  export interface RangeType {
6
6
  label: React.ReactNode;
7
- closeOverlay?: boolean;
8
7
  value: DateRange | ((value?: ValueType) => DateRange);
8
+ closeOverlay?: boolean;
9
+ placement?: 'bottom' | 'left';
9
10
  }
10
11
  export declare type DisabledDateFunction = (
11
12
  /** Date used to determine if disabling is required. */
@@ -39,7 +39,6 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
39
39
  AccepterComponent = _props$accepter === void 0 ? Input : _props$accepter,
40
40
  _props$classPrefix = props.classPrefix,
41
41
  classPrefix = _props$classPrefix === void 0 ? 'form-control' : _props$classPrefix,
42
- className = props.className,
43
42
  checkAsync = props.checkAsync,
44
43
  checkTrigger = props.checkTrigger,
45
44
  _props$errorPlacement = props.errorPlacement,
@@ -59,7 +58,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
59
58
  _props$shouldResetWit = props.shouldResetWithUnmount,
60
59
  shouldResetWithUnmount = _props$shouldResetWit === void 0 ? false : _props$shouldResetWit,
61
60
  rule = props.rule,
62
- rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "className", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount", "rule"]);
61
+ rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount", "rule"]);
63
62
 
64
63
  var _useContext2 = useContext(FormGroupContext),
65
64
  controlId = _useContext2.controlId;
@@ -81,10 +80,9 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
81
80
 
82
81
  var _useClassNames = useClassNames(classPrefix),
83
82
  withClassPrefix = _useClassNames.withClassPrefix,
84
- prefix = _useClassNames.prefix,
85
- merge = _useClassNames.merge;
83
+ prefix = _useClassNames.prefix;
86
84
 
87
- var classes = merge(className, withClassPrefix('wrapper'));
85
+ var classes = withClassPrefix('wrapper');
88
86
 
89
87
  var handleFieldChange = function handleFieldChange(value, event) {
90
88
  handleFieldCheck(value, trigger === 'change');
@@ -112,6 +112,7 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
112
112
  var targetRef = useRef(null);
113
113
  var triggerRef = useRef(null);
114
114
  var inputRef = useRef();
115
+ var listRef = useRef(null);
115
116
 
116
117
  var _useCustom = useCustom(['Picker', 'InputPicker'], overrideLocale),
117
118
  locale = _useCustom.locale;
@@ -403,7 +404,8 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
403
404
  usePublicMethods(ref, {
404
405
  triggerRef: triggerRef,
405
406
  overlayRef: overlayRef,
406
- targetRef: targetRef
407
+ targetRef: targetRef,
408
+ listRef: listRef
407
409
  });
408
410
  /**
409
411
  * Remove the last item, after pressing the back key on the keyboard.
@@ -605,6 +607,7 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
605
607
  var menu = items.length ? /*#__PURE__*/React.createElement(DropdownMenu, {
606
608
  id: id ? id + "-listbox" : undefined,
607
609
  listProps: listProps,
610
+ listRef: listRef,
608
611
  disabledItemValues: disabledItemValues,
609
612
  valueKey: valueKey,
610
613
  labelKey: labelKey,
@@ -50,7 +50,10 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
50
50
  prefix = _useClassNames.prefix;
51
51
 
52
52
  var classes = merge(className, prefix('items'));
53
- var rtl = useCustom('DropdownMenu');
53
+
54
+ var _useCustom = useCustom('DropdownMenu'),
55
+ rtl = _useCustom.rtl;
56
+
54
57
  var getCascadePaths = useCallback(function (layer, node) {
55
58
  var paths = [];
56
59
 
@@ -77,7 +80,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
77
80
  }); // Use `value` in keys when If `value` is string or number
78
81
 
79
82
  var onlyKey = typeof value === 'number' || typeof value === 'string' ? value : index;
80
- var Icon = node.loading ? SpinnerIcon : rtl ? AngleRightIcon : AngleLeftIcon;
83
+ var Icon = node.loading ? SpinnerIcon : rtl ? AngleLeftIcon : AngleRightIcon;
81
84
  var active = value.some(function (v) {
82
85
  return v === nodeValue;
83
86
  });
@@ -63,11 +63,11 @@ export interface OverlayTriggerProps extends StandardProps, AnimationEventProps
63
63
  /** Whether speaker to follow the cursor */
64
64
  followCursor?: boolean;
65
65
  }
66
- export interface OverlayTriggerInstance {
66
+ export interface OverlayTriggerHandle {
67
67
  root: HTMLElement | undefined;
68
68
  updatePosition: () => void;
69
69
  open: (delay?: number) => void;
70
70
  close: (delay?: number) => void;
71
71
  }
72
- declare const OverlayTrigger: React.ForwardRefExoticComponent<OverlayTriggerProps & React.RefAttributes<OverlayTriggerInstance>>;
72
+ declare const OverlayTrigger: React.ForwardRefExoticComponent<OverlayTriggerProps & React.RefAttributes<OverlayTriggerHandle>>;
73
73
  export default OverlayTrigger;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { ListProps } from './VirtualizedList';
3
+ import { ListProps, ListHandle } from '../Windowing';
4
4
  import { StandardProps, ItemDataType } from '../@types/common';
5
5
  export interface DropdownMenuProps<Multiple = false> extends StandardProps, Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {
6
6
  classPrefix: string;
@@ -20,6 +20,7 @@ export interface DropdownMenuProps<Multiple = false> extends StandardProps, Omit
20
20
  rowGroupHeight?: number;
21
21
  virtualized?: boolean;
22
22
  listProps?: Partial<ListProps>;
23
+ listRef?: React.Ref<ListHandle>;
23
24
  /** Custom selected option */
24
25
  renderMenuItem?: (itemLabel: React.ReactNode, item: any) => React.ReactNode;
25
26
  renderMenuGroup?: (title: React.ReactNode, item: any) => React.ReactNode;
@@ -13,9 +13,9 @@ import getPosition from 'dom-lib/getPosition';
13
13
  import scrollTop from 'dom-lib/scrollTop';
14
14
  import getHeight from 'dom-lib/getHeight';
15
15
  import classNames from 'classnames';
16
- import { List, AutoSizer } from './VirtualizedList';
16
+ import { List, AutoSizer, VariableSizeList } from '../Windowing';
17
17
  import shallowEqual from '../utils/shallowEqual';
18
- import { mergeRefs, useClassNames } from '../utils';
18
+ import { mergeRefs, useClassNames, useMount } from '../utils';
19
19
  import DropdownMenuGroup from './DropdownMenuGroup';
20
20
  import { KEY_GROUP, KEY_GROUP_TITLE } from '../utils/getDataGroupBy';
21
21
  var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
@@ -36,6 +36,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
36
36
  labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
37
37
  virtualized = props.virtualized,
38
38
  listProps = props.listProps,
39
+ virtualizedListRef = props.listRef,
39
40
  className = props.className,
40
41
  style = props.style,
41
42
  focusItemValue = props.focusItemValue,
@@ -49,7 +50,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
49
50
  renderMenuItem = props.renderMenuItem,
50
51
  onGroupTitleClick = props.onGroupTitleClick,
51
52
  onSelect = props.onSelect,
52
- rest = _objectWithoutPropertiesLoose(props, ["data", "group", "maxHeight", "activeItemValues", "disabledItemValues", "classPrefix", "valueKey", "labelKey", "virtualized", "listProps", "className", "style", "focusItemValue", "dropdownMenuItemClassPrefix", "dropdownMenuItemAs", "rowHeight", "rowGroupHeight", "renderMenuGroup", "renderMenuItem", "onGroupTitleClick", "onSelect"]);
53
+ rest = _objectWithoutPropertiesLoose(props, ["data", "group", "maxHeight", "activeItemValues", "disabledItemValues", "classPrefix", "valueKey", "labelKey", "virtualized", "listProps", "listRef", "className", "style", "focusItemValue", "dropdownMenuItemClassPrefix", "dropdownMenuItemAs", "rowHeight", "rowGroupHeight", "renderMenuGroup", "renderMenuItem", "onGroupTitleClick", "onSelect"]);
53
54
 
54
55
  var _useClassNames = useClassNames(classPrefix),
55
56
  withClassPrefix = _useClassNames.withClassPrefix,
@@ -59,12 +60,8 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
59
60
  var classes = merge(className, withClassPrefix('items', {
60
61
  grouped: group
61
62
  }));
62
-
63
- var styles = _extends({}, style, {
64
- maxHeight: maxHeight
65
- });
66
-
67
63
  var menuBodyContainerRef = useRef(null);
64
+ var listRef = useRef(null);
68
65
 
69
66
  var _useState = useState([]),
70
67
  foldedGroupKeys = _useState[0],
@@ -86,8 +83,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
86
83
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(value, item, event, checked);
87
84
  }, [onSelect]);
88
85
 
89
- var getRowHeight = function getRowHeight(list, _ref) {
90
- var index = _ref.index;
86
+ var getRowHeight = function getRowHeight(list, index) {
91
87
  var item = list[index];
92
88
 
93
89
  if (group && item[KEY_GROUP] && index !== 0) {
@@ -125,10 +121,13 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
125
121
  }
126
122
  }, [focusItemValue, menuBodyContainerRef, prefix]);
127
123
 
128
- var renderItem = function renderItem(list, _ref2) {
129
- var index = _ref2.index,
130
- style = _ref2.style;
131
- var item = list[index];
124
+ var renderItem = function renderItem(_ref) {
125
+ var _ref$index = _ref.index,
126
+ index = _ref$index === void 0 ? 0 : _ref$index,
127
+ style = _ref.style,
128
+ data = _ref.data,
129
+ itemData = _ref.item;
130
+ var item = itemData || data[index];
132
131
  var value = item[valueKey];
133
132
  var label = item[labelKey];
134
133
 
@@ -187,40 +186,45 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
187
186
  return key === ((_item$parent = item.parent) === null || _item$parent === void 0 ? void 0 : _item$parent[KEY_GROUP_TITLE]);
188
187
  }));
189
188
  }) : data;
190
- var rowCount = filteredItems.length; // Check whether the height of the data exceeds the height of the container.
189
+ var rowCount = filteredItems.length;
190
+ useMount(function () {
191
+ var _listRef$current, _listRef$current$scro;
191
192
 
192
- var useVirtualized = virtualized && rowCount * rowHeight > maxHeight;
193
+ var itemIndex = findIndex(filteredItems, function (item) {
194
+ return item[valueKey] === (activeItemValues === null || activeItemValues === void 0 ? void 0 : activeItemValues[0]);
195
+ });
196
+ (_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : (_listRef$current$scro = _listRef$current.scrollToItem) === null || _listRef$current$scro === void 0 ? void 0 : _listRef$current$scro.call(_listRef$current, itemIndex);
197
+ });
193
198
  return /*#__PURE__*/React.createElement("div", _extends({
194
- role: !useVirtualized ? 'listbox' : undefined
199
+ role: "listbox"
195
200
  }, rest, {
196
201
  className: classes,
197
202
  ref: mergeRefs(menuBodyContainerRef, ref),
198
- style: styles
199
- }), useVirtualized ? /*#__PURE__*/React.createElement(AutoSizer, {
203
+ style: _extends({}, style, {
204
+ maxHeight: maxHeight
205
+ })
206
+ }), virtualized ? /*#__PURE__*/React.createElement(AutoSizer, {
200
207
  defaultHeight: maxHeight,
201
208
  style: {
202
209
  width: 'auto',
203
210
  height: 'auto'
204
211
  }
205
- }, function (_ref3) {
206
- var height = _ref3.height,
207
- width = _ref3.width;
212
+ }, function (_ref2) {
213
+ var height = _ref2.height,
214
+ width = _ref2.width;
208
215
  return /*#__PURE__*/React.createElement(List, _extends({
209
- role: "listbox",
210
- containerRole: '',
211
- "aria-readonly": undefined,
216
+ as: VariableSizeList,
217
+ ref: mergeRefs(listRef, virtualizedListRef),
212
218
  width: width,
213
219
  height: height || maxHeight,
214
- scrollToIndex: findIndex(data, function (item) {
215
- return item[valueKey] === (activeItemValues === null || activeItemValues === void 0 ? void 0 : activeItemValues[0]);
216
- }),
217
- rowCount: rowCount,
218
- rowHeight: getRowHeight.bind(_this, filteredItems),
219
- rowRenderer: renderItem.bind(null, filteredItems)
220
- }, listProps));
221
- }) : filteredItems.map(function (_item, index) {
222
- return renderItem(filteredItems, {
223
- index: index
220
+ itemCount: rowCount,
221
+ itemData: filteredItems,
222
+ itemSize: getRowHeight.bind(_this, filteredItems)
223
+ }, listProps), renderItem);
224
+ }) : filteredItems.map(function (item, index) {
225
+ return renderItem({
226
+ index: index,
227
+ item: item
224
228
  });
225
229
  }));
226
230
  });
@@ -1,11 +1,11 @@
1
1
  import React from 'react';
2
2
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
- import { OverlayTriggerInstance } from '../Picker';
3
+ import { OverlayTriggerHandle } from '../Picker';
4
4
  export interface PickerOverlayProps extends WithAsProps {
5
5
  placement?: string;
6
6
  autoWidth?: boolean;
7
7
  children?: React.ReactNode;
8
- target?: React.RefObject<OverlayTriggerInstance>;
8
+ target?: React.RefObject<OverlayTriggerHandle>;
9
9
  onKeyDown?: (event: React.KeyboardEvent) => void;
10
10
  }
11
11
  declare const PickerOverlay: RsRefForwardingComponent<'div', PickerOverlayProps>;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import { OverlayTriggerInstance, OverlayTriggerProps, OverlayTriggerType } from '../Overlay/OverlayTrigger';
2
+ import { OverlayTriggerHandle, OverlayTriggerProps, OverlayTriggerType } from '../Overlay/OverlayTrigger';
3
3
  import { PositionChildProps } from '../Overlay/Position';
4
4
  import { TypeAttributes, AnimationEventProps } from '../@types/common';
5
- export type { OverlayTriggerInstance, PositionChildProps };
5
+ export type { OverlayTriggerHandle, PositionChildProps };
6
6
  export interface PickerToggleTriggerProps extends Omit<AnimationEventProps, 'onEntering' | 'onExiting'>, Pick<OverlayTriggerProps, 'speaker'> {
7
7
  placement?: TypeAttributes.Placement;
8
8
  pickerProps: any;
@@ -1,6 +1,6 @@
1
- import { pickTriggerPropKeys, omitTriggerPropKeys, OverlayTriggerInstance, PositionChildProps } from './PickerToggleTrigger';
1
+ import { pickTriggerPropKeys, omitTriggerPropKeys, OverlayTriggerHandle, PositionChildProps } from './PickerToggleTrigger';
2
2
  import { PickerToggleProps } from './PickerToggle';
3
- import { PickerInstance, PickerComponent } from './types';
3
+ import { PickerHandle, PickerComponent } from './types';
4
4
  export { default as DropdownMenu } from './DropdownMenu';
5
5
  export { default as DropdownMenuCheckItem } from './DropdownMenuCheckItem';
6
6
  export { default as DropdownMenuGroup } from './DropdownMenuGroup';
@@ -11,6 +11,6 @@ export { default as PickerToggleTrigger } from './PickerToggleTrigger';
11
11
  export { default as SearchBar } from './SearchBar';
12
12
  export { default as SelectedElement } from './SelectedElement';
13
13
  export { pickTriggerPropKeys, omitTriggerPropKeys };
14
- export type { OverlayTriggerInstance, PositionChildProps, PickerInstance, PickerComponent, PickerToggleProps };
14
+ export type { OverlayTriggerHandle, PositionChildProps, PickerHandle, PickerComponent, PickerToggleProps };
15
15
  export * from './utils';
16
16
  export * from './propTypes';
@@ -1,13 +1,15 @@
1
1
  /// <reference types="react" />
2
2
  import { RsRefForwardingComponent } from '../@types/common';
3
- export interface PickerInstance {
4
- root?: Element;
5
- overlay?: Element;
6
- target?: HTMLElement;
3
+ import type { ListHandle } from '../Windowing';
4
+ export interface PickerHandle {
5
+ root: HTMLElement | null;
6
+ list?: ListHandle;
7
+ overlay?: HTMLElement | null;
8
+ target?: HTMLElement | null;
7
9
  updatePosition?: () => void;
8
10
  open?: () => void;
9
11
  close?: () => void;
10
12
  }
11
13
  export declare type PickerComponent<P> = RsRefForwardingComponent<'div', P & {
12
- ref?: React.Ref<PickerInstance>;
14
+ ref?: React.Ref<PickerHandle>;
13
15
  }>;
File without changes
@@ -1,14 +1,14 @@
1
1
  import React from 'react';
2
- import { OverlayTriggerInstance } from './PickerToggleTrigger';
2
+ import { OverlayTriggerHandle } from './PickerToggleTrigger';
3
3
  import { TypeAttributes, ItemDataType } from '../@types/common';
4
- import { ListInstance } from './VirtualizedList';
5
- interface NodeKeys {
4
+ import type { ListHandle } from '../Windowing';
5
+ export interface NodeKeys {
6
6
  valueKey: string;
7
7
  childrenKey: string;
8
8
  }
9
9
  export declare function createConcatChildrenFunction<T = any>(node: any, nodeValue?: any, nodeKeys?: NodeKeys): (data: T[], children: T[]) => T[];
10
10
  export declare function shouldDisplay(label: React.ReactNode, searchKeyword: string): boolean;
11
- interface PickerClassNameProps {
11
+ export interface PickerClassNameProps {
12
12
  name?: string;
13
13
  classPrefix: string;
14
14
  className?: string;
@@ -27,7 +27,7 @@ interface PickerClassNameProps {
27
27
  * The className of the assembled Toggle is on the Picker.
28
28
  */
29
29
  export declare function usePickerClassName(props: PickerClassNameProps): [string, string[]];
30
- interface EventsProps {
30
+ export interface EventsProps {
31
31
  down?: React.KeyboardEventHandler;
32
32
  up?: React.KeyboardEventHandler;
33
33
  enter?: React.KeyboardEventHandler;
@@ -42,7 +42,7 @@ interface EventsProps {
42
42
  * @param events Event callback functions
43
43
  */
44
44
  export declare function onMenuKeyDown(event: React.KeyboardEvent, events: EventsProps): void;
45
- interface FocusItemValueProps {
45
+ export interface FocusItemValueProps {
46
46
  target: HTMLElement | null | (() => HTMLElement | null);
47
47
  data?: any[];
48
48
  valueKey?: string;
@@ -65,7 +65,7 @@ export declare const useFocusItemValue: <T>(defaultFocusItemValue: T | null | un
65
65
  setKeys: React.Dispatch<React.SetStateAction<any[]>>;
66
66
  onKeyDown: (event: any) => void;
67
67
  };
68
- interface ToggleKeyDownEventProps {
68
+ export interface ToggleKeyDownEventProps {
69
69
  toggle?: boolean;
70
70
  triggerRef: React.RefObject<any>;
71
71
  targetRef: React.RefObject<any>;
@@ -86,7 +86,7 @@ interface ToggleKeyDownEventProps {
86
86
  * @param props
87
87
  */
88
88
  export declare const useToggleKeyDownEvent: (props: ToggleKeyDownEventProps) => (event: React.KeyboardEvent) => void;
89
- interface SearchProps {
89
+ export interface SearchProps {
90
90
  labelKey: string;
91
91
  data: ItemDataType[];
92
92
  searchBy?: (keyword: any, label: any, item: any) => boolean;
@@ -104,16 +104,15 @@ export declare function useSearch(props: SearchProps): {
104
104
  checkShouldDisplay: (item: ItemDataType, keyword?: string) => boolean;
105
105
  handleSearch: (searchKeyword: string, event: React.SyntheticEvent) => void;
106
106
  };
107
- interface PickerDependentParameters {
108
- triggerRef?: React.RefObject<OverlayTriggerInstance>;
107
+ export interface PickerDependentParameters {
108
+ triggerRef?: React.RefObject<OverlayTriggerHandle>;
109
109
  rootRef?: React.RefObject<HTMLElement>;
110
110
  overlayRef?: React.RefObject<HTMLElement>;
111
111
  targetRef?: React.RefObject<HTMLElement>;
112
- listRef?: React.RefObject<ListInstance>;
112
+ listRef?: React.RefObject<ListHandle>;
113
113
  inline?: boolean;
114
114
  }
115
115
  /**
116
116
  * A hook of the exposed method of Picker
117
117
  */
118
118
  export declare function usePublicMethods(ref: any, parmas: PickerDependentParameters): void;
119
- export {};
@@ -522,6 +522,10 @@ export function usePublicMethods(ref, parmas) {
522
522
  get overlay() {
523
523
  var _overlayRef$current;
524
524
 
525
+ if (!(overlayRef !== null && overlayRef !== void 0 && overlayRef.current)) {
526
+ throw new Error('The overlay is not found. Please confirm whether the picker is open.');
527
+ }
528
+
525
529
  return (_overlayRef$current = overlayRef === null || overlayRef === void 0 ? void 0 : overlayRef.current) !== null && _overlayRef$current !== void 0 ? _overlayRef$current : null;
526
530
  },
527
531
 
@@ -1,7 +1,7 @@
1
1
  import React, { Ref } from 'react';
2
2
  import { PickerLocale } from '../locales';
3
- import { PickerInstance, PickerToggleProps } from '../Picker';
4
- import { ListProps } from '../Picker/VirtualizedList';
3
+ import { PickerHandle, PickerToggleProps } from '../Picker';
4
+ import { ListProps } from '../Windowing';
5
5
  import { FormControlPickerProps, ItemDataType } from '../@types/common';
6
6
  export interface SelectProps<T> {
7
7
  /** Set group condition key in data */
@@ -11,8 +11,7 @@ export interface SelectProps<T> {
11
11
  /** Whether using virtualized list */
12
12
  virtualized?: boolean;
13
13
  /**
14
- * List-related properties in `react-virtualized`
15
- * https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#prop-types
14
+ * Virtualized List Props
16
15
  */
17
16
  listProps?: Partial<ListProps>;
18
17
  /** Custom search rules. */
@@ -50,7 +49,7 @@ export interface SelectPickerProps<T> extends Omit<FormControlPickerProps<T, Pic
50
49
  }
51
50
  export interface SelectPickerComponent {
52
51
  <T>(props: SelectPickerProps<T> & {
53
- ref?: Ref<PickerInstance>;
52
+ ref?: Ref<PickerHandle>;
54
53
  }): JSX.Element | null;
55
54
  displayName?: string;
56
55
  propTypes?: React.WeakValidationMap<SelectPickerProps<any>>;
@@ -74,6 +74,7 @@ var SelectPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
74
74
  var targetRef = useRef(null);
75
75
  var overlayRef = useRef(null);
76
76
  var searchInputRef = useRef(null);
77
+ var listRef = useRef(null);
77
78
 
78
79
  var _useCustom = useCustom('Picker', overrideLocale),
79
80
  locale = _useCustom.locale;
@@ -193,7 +194,8 @@ var SelectPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
193
194
  usePublicMethods(ref, {
194
195
  triggerRef: triggerRef,
195
196
  overlayRef: overlayRef,
196
- targetRef: targetRef
197
+ targetRef: targetRef,
198
+ listRef: listRef
197
199
  }); // Find active `MenuItem` by `value`
198
200
 
199
201
  var activeItem = data.find(function (item) {
@@ -246,6 +248,7 @@ var SelectPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
246
248
  var menu = items.length ? /*#__PURE__*/React.createElement(DropdownMenu, {
247
249
  id: id ? id + "-listbox" : undefined,
248
250
  listProps: listProps,
251
+ listRef: listRef,
249
252
  disabledItemValues: disabledItemValues,
250
253
  valueKey: valueKey,
251
254
  labelKey: labelKey,
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { StandardProps, ItemDataType, RsRefForwardingComponent } from '../@types/common';
3
- import { ListProps } from '../Picker/VirtualizedList';
3
+ import { ListProps } from '../Windowing';
4
4
  /**
5
5
  * Tree Node Drag Type
6
6
  */
@@ -46,10 +46,7 @@ export interface TreeBaseProps<ValueType = string | number, ItemDataType = Recor
46
46
  showIndentLine?: boolean;
47
47
  /** Whether using virtualized list */
48
48
  virtualized?: boolean;
49
- /**
50
- * List-related properties in `react-virtualized`
51
- * https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#prop-types
52
- */
49
+ /** Virtualized List props */
53
50
  listProps?: Partial<ListProps>;
54
51
  /** Expand all nodes By default */
55
52
  defaultExpandAll?: boolean;