rsuite 5.31.0 → 5.32.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 (80) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/Calendar/styles/index.less +3 -2
  3. package/Toggle/styles/mixin.less +14 -0
  4. package/cjs/Calendar/Calendar.d.ts +3 -3
  5. package/cjs/Calendar/Calendar.js +4 -4
  6. package/cjs/Calendar/CalendarContainer.d.ts +2 -2
  7. package/cjs/Calendar/CalendarContainer.js +8 -11
  8. package/cjs/Calendar/MonthDropdown.js +1 -1
  9. package/cjs/Cascader/Cascader.d.ts +2 -2
  10. package/cjs/Cascader/Cascader.js +83 -71
  11. package/cjs/Cascader/DropdownMenu.d.ts +6 -2
  12. package/cjs/Cascader/DropdownMenu.js +8 -4
  13. package/cjs/Cascader/utils.d.ts +52 -17
  14. package/cjs/Cascader/utils.js +99 -138
  15. package/cjs/DatePicker/DatePicker.d.ts +3 -1
  16. package/cjs/DatePicker/DatePicker.js +4 -5
  17. package/cjs/DateRangePicker/Calendar.d.ts +1 -0
  18. package/cjs/DateRangePicker/Calendar.js +4 -5
  19. package/cjs/DateRangePicker/DateRangePicker.d.ts +3 -1
  20. package/cjs/DateRangePicker/DateRangePicker.js +4 -1
  21. package/cjs/MultiCascader/DropdownMenu.d.ts +2 -2
  22. package/cjs/MultiCascader/MultiCascader.d.ts +1 -1
  23. package/cjs/MultiCascader/MultiCascader.js +12 -7
  24. package/cjs/MultiCascader/utils.d.ts +2 -2
  25. package/cjs/MultiCascader/utils.js +3 -3
  26. package/cjs/Picker/utils.d.ts +4 -3
  27. package/cjs/Picker/utils.js +8 -4
  28. package/cjs/locales/ru_RU.js +6 -6
  29. package/cjs/utils/getDataGroupBy.js +1 -1
  30. package/cjs/utils/treeUtils.d.ts +5 -1
  31. package/cjs/utils/treeUtils.js +31 -6
  32. package/cjs/utils/useMap.d.ts +6 -0
  33. package/cjs/utils/useMap.js +35 -0
  34. package/dist/rsuite-no-reset-rtl.css +31 -2
  35. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  36. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  37. package/dist/rsuite-no-reset.css +31 -2
  38. package/dist/rsuite-no-reset.min.css +1 -1
  39. package/dist/rsuite-no-reset.min.css.map +1 -1
  40. package/dist/rsuite-rtl.css +31 -2
  41. package/dist/rsuite-rtl.min.css +1 -1
  42. package/dist/rsuite-rtl.min.css.map +1 -1
  43. package/dist/rsuite.css +31 -2
  44. package/dist/rsuite.js +187 -15
  45. package/dist/rsuite.js.map +1 -1
  46. package/dist/rsuite.min.css +1 -1
  47. package/dist/rsuite.min.css.map +1 -1
  48. package/dist/rsuite.min.js +1 -1
  49. package/dist/rsuite.min.js.map +1 -1
  50. package/esm/Calendar/Calendar.d.ts +3 -3
  51. package/esm/Calendar/Calendar.js +6 -6
  52. package/esm/Calendar/CalendarContainer.d.ts +2 -2
  53. package/esm/Calendar/CalendarContainer.js +10 -13
  54. package/esm/Calendar/MonthDropdown.js +1 -1
  55. package/esm/Cascader/Cascader.d.ts +2 -2
  56. package/esm/Cascader/Cascader.js +85 -75
  57. package/esm/Cascader/DropdownMenu.d.ts +6 -2
  58. package/esm/Cascader/DropdownMenu.js +8 -4
  59. package/esm/Cascader/utils.d.ts +52 -17
  60. package/esm/Cascader/utils.js +100 -135
  61. package/esm/DatePicker/DatePicker.d.ts +3 -1
  62. package/esm/DatePicker/DatePicker.js +4 -5
  63. package/esm/DateRangePicker/Calendar.d.ts +1 -0
  64. package/esm/DateRangePicker/Calendar.js +5 -6
  65. package/esm/DateRangePicker/DateRangePicker.d.ts +3 -1
  66. package/esm/DateRangePicker/DateRangePicker.js +4 -1
  67. package/esm/MultiCascader/DropdownMenu.d.ts +2 -2
  68. package/esm/MultiCascader/MultiCascader.d.ts +1 -1
  69. package/esm/MultiCascader/MultiCascader.js +12 -7
  70. package/esm/MultiCascader/utils.d.ts +2 -2
  71. package/esm/MultiCascader/utils.js +4 -4
  72. package/esm/Picker/utils.d.ts +4 -3
  73. package/esm/Picker/utils.js +8 -4
  74. package/esm/locales/ru_RU.js +6 -6
  75. package/esm/utils/getDataGroupBy.js +2 -2
  76. package/esm/utils/treeUtils.d.ts +5 -1
  77. package/esm/utils/treeUtils.js +30 -6
  78. package/esm/utils/useMap.d.ts +6 -0
  79. package/esm/utils/useMap.js +29 -0
  80. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [5.32.0](https://github.com/rsuite/rsuite/compare/v5.31.1...v5.32.0) (2023-04-21)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **build:** fix broken lodash currying in CDN bundles ([#3159](https://github.com/rsuite/rsuite/issues/3159)) ([896a9d5](https://github.com/rsuite/rsuite/commit/896a9d53cf2c1e0140e43eea024c4f0361c04328))
6
+ - **Cascader:** avoid mutating data prop ([#3157](https://github.com/rsuite/rsuite/issues/3157)) ([6d13318](https://github.com/rsuite/rsuite/commit/6d133185ea1c65b47b35da61499d5cff77dde122))
7
+
8
+ ### Features
9
+
10
+ - **DateRangePicker:** add `limitStartYear` prop ([#3163](https://github.com/rsuite/rsuite/issues/3163)) ([fd27df2](https://github.com/rsuite/rsuite/commit/fd27df21e1c36372ea8b444f79521c901a65780c))
11
+
12
+ ## [5.31.1](https://github.com/rsuite/rsuite/compare/v5.31.0...v5.31.1) (2023-04-14)
13
+
14
+ ### Bug Fixes
15
+
16
+ - **Calendar:** fix style errors that are not as designed ([#3146](https://github.com/rsuite/rsuite/issues/3146)) ([f3fe484](https://github.com/rsuite/rsuite/commit/f3fe484a8f63e877c517061e5911116d3107b68b))
17
+ - **i18n:** update ru_RU locale ([#3153](https://github.com/rsuite/rsuite/issues/3153)) ([5c626a9](https://github.com/rsuite/rsuite/commit/5c626a99ca70d9e30836b02f81b90a37f5f2de2d))
18
+ - **Toggle:** fix spinner size in sm/lg Toggles ([#3156](https://github.com/rsuite/rsuite/issues/3156)) ([896ee49](https://github.com/rsuite/rsuite/commit/896ee492bbdd2277dbe23f6667305ceaf9154a8a))
19
+
1
20
  # [5.31.0](https://github.com/rsuite/rsuite/compare/v5.30.0...v5.31.0) (2023-04-07)
2
21
 
3
22
  ### Bug Fixes
@@ -18,7 +18,7 @@
18
18
  }
19
19
 
20
20
  &-bordered &-table-row:not(:last-child) &-table-cell,
21
- &-bordered &-table-header-row &-table-cell {
21
+ &-bordered &-table-header-row &-table-header-cell {
22
22
  border-bottom: 1px solid var(--rs-border-secondary);
23
23
  }
24
24
 
@@ -63,7 +63,7 @@
63
63
  padding-right: 0;
64
64
  }
65
65
 
66
- &-panel &-table-header-row &-table-cell-content {
66
+ &-panel &-table-header-row &-table-header-cell-content {
67
67
  padding-top: 8px; // padding + border = 10px
68
68
  padding-bottom: 8px;
69
69
  }
@@ -420,6 +420,7 @@
420
420
 
421
421
  // Table header row
422
422
  .rs-calendar-table-header-cell-content {
423
+ display: inline-block;
423
424
  color: var(--rs-text-secondary);
424
425
  font-size: @font-size-small;
425
426
  line-height: @line-height-small;
@@ -6,6 +6,20 @@
6
6
  height: @handle-diameter;
7
7
  left: @toggle-handle-gap;
8
8
  top: @toggle-handle-gap;
9
+
10
+ .rs-loader-spin,
11
+ .rs-loader-spin::before,
12
+ .rs-loader-spin::after {
13
+ width: @handle-diameter;
14
+ height: @handle-diameter;
15
+ }
16
+
17
+ & when (@handle-diameter < 16px) {
18
+ .rs-loader-spin::before,
19
+ .rs-loader-spin::after {
20
+ border-width: 2px;
21
+ }
22
+ }
9
23
  }
10
24
 
11
25
  .rs-toggle-presentation {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import Calendar from './CalendarContainer';
2
+ import CalendarContainer from './CalendarContainer';
3
3
  import { CalendarLocale } from '../locales';
4
4
  import { RsRefForwardingComponent, WithAsProps } from '../@types/common';
5
5
  export interface CalendarProps extends WithAsProps {
@@ -24,5 +24,5 @@ export interface CalendarProps extends WithAsProps {
24
24
  /** Custom render calendar cells */
25
25
  renderCell?: (date: Date) => React.ReactNode;
26
26
  }
27
- declare const CalendarPanel: RsRefForwardingComponent<typeof Calendar, CalendarProps>;
28
- export default CalendarPanel;
27
+ declare const Calendar: RsRefForwardingComponent<typeof CalendarContainer, CalendarProps>;
28
+ export default Calendar;
@@ -27,7 +27,7 @@ var _utils = require("../utils");
27
27
 
28
28
  var _useCalendarDate2 = _interopRequireDefault(require("./useCalendarDate"));
29
29
 
30
- var CalendarPanel = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
30
+ var Calendar = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
31
31
  var _props$as = props.as,
32
32
  Component = _props$as === void 0 ? _CalendarContainer.default : _props$as,
33
33
  bordered = props.bordered,
@@ -115,8 +115,8 @@ var CalendarPanel = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
115
115
  }));
116
116
  });
117
117
 
118
- CalendarPanel.displayName = 'CalendarPanel';
119
- CalendarPanel.propTypes = {
118
+ Calendar.displayName = 'Calendar';
119
+ Calendar.propTypes = {
120
120
  value: _propTypes.default.instanceOf(Date),
121
121
  defaultValue: _propTypes.default.instanceOf(Date),
122
122
  isoWeek: _propTypes.default.bool,
@@ -129,5 +129,5 @@ CalendarPanel.propTypes = {
129
129
  onSelect: _propTypes.default.func,
130
130
  renderCell: _propTypes.default.func
131
131
  };
132
- var _default = CalendarPanel;
132
+ var _default = Calendar;
133
133
  exports.default = _default;
@@ -30,12 +30,12 @@ export interface CalendarProps extends WithAsProps, Omit<HTMLAttributes<HTMLDivE
30
30
  hideSeconds?: (second: number, date: Date) => boolean;
31
31
  /** The value that mouse hover on in range selection */
32
32
  hoverRangeValue?: [Date, Date];
33
- /** Is it in the same month as today */
34
- inSameMonth?: (date: Date) => boolean;
35
33
  /** ISO 8601 standard, each calendar week begins on Monday and Sunday on the seventh day */
36
34
  isoWeek?: boolean;
37
35
  /** Limit showing how many years in the future */
38
36
  limitEndYear?: number;
37
+ /** Limit showing how many years in the past */
38
+ limitStartYear?: number;
39
39
  /** Custom locale */
40
40
  locale: CalendarLocale;
41
41
  /** Callback after the date has changed */
@@ -48,10 +48,10 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
48
48
  disabledForward = props.disabledForward,
49
49
  format = props.format,
50
50
  hoverRangeValue = props.hoverRangeValue,
51
- inSameMonth = props.inSameMonth,
52
51
  _props$isoWeek = props.isoWeek,
53
52
  isoWeek = _props$isoWeek === void 0 ? false : _props$isoWeek,
54
53
  limitEndYear = props.limitEndYear,
54
+ limitStartYear = props.limitStartYear,
55
55
  locale = props.locale,
56
56
  onChangeMonth = props.onChangeMonth,
57
57
  onChangeTime = props.onChangeTime,
@@ -69,7 +69,7 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
69
69
  showMeridian = props.showMeridian,
70
70
  showWeekNumbers = props.showWeekNumbers,
71
71
  inline = props.inline,
72
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "inSameMonth", "isoWeek", "limitEndYear", "locale", "onChangeMonth", "onChangeTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
72
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "isoWeek", "limitEndYear", "limitStartYear", "locale", "onChangeMonth", "onChangeTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
73
73
 
74
74
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
75
75
  withClassPrefix = _useClassNames.withClassPrefix,
@@ -129,12 +129,8 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
129
129
  var showTime = calendarState === _useCalendarState2.CalendarState.TIME || onlyShowTime;
130
130
  var showMonth = calendarState === _useCalendarState2.CalendarState.MONTH || onlyShowMonth;
131
131
  var inSameThisMonthDate = (0, _react.useCallback)(function (date) {
132
- return (0, _utils.composeFunctions)(function (d) {
133
- return (0, _dateUtils.setDate)(d, 1);
134
- }, function (d) {
135
- return (0, _dateUtils.isSameMonth)(d, date);
136
- })(date);
137
- }, []);
132
+ return (0, _dateUtils.isSameMonth)(calendarDate, date);
133
+ }, [calendarDate]);
138
134
  var calendarClasses = merge(className, withClassPrefix({
139
135
  'time-view': showTime,
140
136
  'month-view': showMonth,
@@ -152,7 +148,7 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
152
148
  disabledDate: isDisabledDate,
153
149
  format: format,
154
150
  hoverRangeValue: hoverRangeValue,
155
- inSameMonth: inSameMonth !== null && inSameMonth !== void 0 ? inSameMonth : inSameThisMonthDate,
151
+ inSameMonth: inSameThisMonthDate,
156
152
  isoWeek: isoWeek,
157
153
  locale: locale,
158
154
  onChangeMonth: handleChangeMonth,
@@ -163,7 +159,7 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
163
159
  showWeekNumbers: showWeekNumbers,
164
160
  inline: inline
165
161
  };
166
- }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameMonth, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
162
+ }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
167
163
  return /*#__PURE__*/_react.default.createElement(_CalendarContext.CalendarProvider, {
168
164
  value: contextValue
169
165
  }, /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, (0, _dateUtils.omitHideDisabledProps)(rest), {
@@ -187,6 +183,7 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
187
183
  }), renderDate && /*#__PURE__*/_react.default.createElement(_CalendarBody.default, null), renderMonth && /*#__PURE__*/_react.default.createElement(_MonthDropdown.default, {
188
184
  show: showMonth,
189
185
  limitEndYear: limitEndYear,
186
+ limitStartYear: limitStartYear,
190
187
  disabledMonth: isDisabledDate
191
188
  }), renderTime && /*#__PURE__*/_react.default.createElement(_TimeDropdown.default, (0, _extends2.default)({}, timeDropdownProps, {
192
189
  show: showTime,
@@ -210,9 +207,9 @@ CalendarContainer.propTypes = {
210
207
  hideHours: _propTypes.default.func,
211
208
  hideMinutes: _propTypes.default.func,
212
209
  hideSeconds: _propTypes.default.func,
213
- inSameMonth: _propTypes.default.func,
214
210
  isoWeek: _propTypes.default.bool,
215
211
  limitEndYear: _propTypes.default.number,
212
+ limitStartYear: _propTypes.default.number,
216
213
  locale: _propTypes.default.object,
217
214
  onChangeMonth: _propTypes.default.func,
218
215
  onChangeTime: _propTypes.default.func,
@@ -66,7 +66,7 @@ var MonthDropdown = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
66
66
 
67
67
  var thisYear = _utils.DateUtils.getYear(new Date());
68
68
 
69
- var startYear = limitStartYear ? thisYear - limitStartYear : 1900;
69
+ var startYear = limitStartYear ? thisYear - limitStartYear + 1 : 1900;
70
70
  var rowCount = (0, _react.useMemo)(function () {
71
71
  var endYear = thisYear + limitEndYear;
72
72
  return endYear - startYear;
@@ -15,7 +15,7 @@ export interface CascaderProps<T = ValueType> extends FormControlPickerProps<T |
15
15
  /** When true, make the parent node selectable */
16
16
  parentSelectable?: boolean;
17
17
  /** Custom render menu */
18
- renderMenu?: (items: ItemDataType[], menu: React.ReactNode, parentNode?: any, layer?: number) => React.ReactNode;
18
+ renderMenu?: (items: readonly ItemDataType[], menu: React.ReactNode, parentNode?: any, layer?: number) => React.ReactNode;
19
19
  /** Custom render menu items */
20
20
  renderMenuItem?: (itemLabel: React.ReactNode, item: ItemDataType) => React.ReactNode;
21
21
  /** Custom render search items */
@@ -29,7 +29,7 @@ export interface CascaderProps<T = ValueType> extends FormControlPickerProps<T |
29
29
  /** Called when searching */
30
30
  onSearch?: (searchKeyword: string, event: React.SyntheticEvent) => void;
31
31
  /** Asynchronously load the children of the tree node. */
32
- getChildren?: (node: ItemDataType) => ItemDataType[] | Promise<ItemDataType[]>;
32
+ getChildren?: (node: ItemDataType<T>) => ItemDataType<T>[] | Promise<ItemDataType<T>[]>;
33
33
  }
34
34
  export interface CascaderComponent {
35
35
  <T>(props: CascaderProps<T> & {
@@ -13,6 +13,8 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
13
13
 
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
+ var _reactUseSet = require("react-use-set");
17
+
16
18
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
19
 
18
20
  var _omit = _interopRequireDefault(require("lodash/omit"));
@@ -35,6 +37,8 @@ var _utils2 = require("../utils");
35
37
 
36
38
  var _Picker = require("../Picker");
37
39
 
40
+ var _useMap = require("../utils/useMap");
41
+
38
42
  var emptyArray = [];
39
43
 
40
44
  var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
@@ -94,10 +98,6 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
94
98
  active = _useState[0],
95
99
  setActive = _useState[1];
96
100
 
97
- var _useState2 = (0, _react.useState)((0, _treeUtils.flattenTree)(data, childrenKey)),
98
- flattenData = _useState2[0],
99
- setFlattenData = _useState2[1];
100
-
101
101
  var triggerRef = (0, _react.useRef)(null);
102
102
  var overlayRef = (0, _react.useRef)(null);
103
103
  var targetRef = (0, _react.useRef)(null);
@@ -107,25 +107,47 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
107
107
  value = _ref[0],
108
108
  setValue = _ref[1];
109
109
 
110
+ var isMounted = (0, _utils2.useIsMounted)();
111
+ var loadingItemsSet = (0, _reactUseSet.useSet)();
112
+ var asyncChildrenMap = (0, _useMap.useMap)();
113
+ var parentMap = (0, _react.useMemo)(function () {
114
+ return (0, _utils.getParentMap)(data, function (item) {
115
+ var _asyncChildrenMap$get;
116
+
117
+ return (_asyncChildrenMap$get = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get !== void 0 ? _asyncChildrenMap$get : item[childrenKey];
118
+ });
119
+ }, [asyncChildrenMap, childrenKey, data]);
120
+ var flattenedData = (0, _react.useMemo)(function () {
121
+ return (0, _treeUtils.flattenTree)(data, function (item) {
122
+ var _asyncChildrenMap$get2;
123
+
124
+ return (_asyncChildrenMap$get2 = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get2 !== void 0 ? _asyncChildrenMap$get2 : item[childrenKey];
125
+ });
126
+ }, [asyncChildrenMap, childrenKey, data]); // The item that focus is on
127
+
128
+ var _useState2 = (0, _react.useState)(),
129
+ activeItem = _useState2[0],
130
+ setActiveItem = _useState2[1];
131
+
110
132
  var _usePaths = (0, _utils.usePaths)({
111
133
  data: data,
112
- valueKey: valueKey,
113
- childrenKey: childrenKey,
114
- value: value
134
+ activeItem: activeItem,
135
+ selectedItem: flattenedData.find(function (item) {
136
+ return item[valueKey] === value;
137
+ }),
138
+ getParent: function getParent(item) {
139
+ return parentMap.get(item);
140
+ },
141
+ getChildren: function getChildren(item) {
142
+ var _asyncChildrenMap$get3;
143
+
144
+ return (_asyncChildrenMap$get3 = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get3 !== void 0 ? _asyncChildrenMap$get3 : item[childrenKey];
145
+ }
115
146
  }),
116
- selectedPaths = _usePaths.selectedPaths,
117
- valueToPaths = _usePaths.valueToPaths,
118
- columnData = _usePaths.columnData,
119
- addColumn = _usePaths.addColumn,
120
- removeColumnByIndex = _usePaths.removeColumnByIndex,
121
- setValueToPaths = _usePaths.setValueToPaths,
122
- setColumnData = _usePaths.setColumnData,
123
- setSelectedPaths = _usePaths.setSelectedPaths,
124
- enforceUpdate = _usePaths.enforceUpdate;
125
-
126
- (0, _react.useEffect)(function () {
127
- setFlattenData((0, _treeUtils.flattenTree)(data, childrenKey));
128
- }, [data, childrenKey]);
147
+ columnsToDisplay = _usePaths.columnsToDisplay,
148
+ pathTowardsActiveItem = _usePaths.pathTowardsActiveItem,
149
+ pathTowardsSelectedItem = _usePaths.pathTowardsSelectedItem;
150
+
129
151
  (0, _Picker.usePublicMethods)(ref, {
130
152
  triggerRef: triggerRef,
131
153
  overlayRef: overlayRef,
@@ -141,7 +163,7 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
141
163
  */
142
164
 
143
165
 
144
- var hasValue = valueToPaths.length > 0 || !(0, _isNil.default)(value) && (0, _isFunction.default)(renderValue);
166
+ var hasValue = pathTowardsSelectedItem.length > 0 || !(0, _isNil.default)(value) && (0, _isFunction.default)(renderValue);
145
167
 
146
168
  var _useClassNames = (0, _utils2.useClassNames)(classPrefix),
147
169
  prefix = _useClassNames.prefix,
@@ -156,15 +178,17 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
156
178
  return true;
157
179
  }
158
180
 
159
- if (item.parent && someKeyword(item.parent)) {
181
+ var parent = parentMap.get(item);
182
+
183
+ if (parent && someKeyword(parent)) {
160
184
  return true;
161
185
  }
162
186
 
163
187
  return false;
164
- }, [labelKey, searchKeyword]);
188
+ }, [labelKey, parentMap, searchKeyword]);
165
189
  var getSearchResult = (0, _react.useCallback)(function (keyword) {
166
190
  var items = [];
167
- var result = flattenData.filter(function (item) {
191
+ var result = flattenedData.filter(function (item) {
168
192
  if (!parentSelectable && item[childrenKey]) {
169
193
  return false;
170
194
  }
@@ -181,19 +205,24 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
181
205
  }
182
206
 
183
207
  return items;
184
- }, [childrenKey, flattenData, someKeyword, parentSelectable]); // Used to hover the focuse item when trigger `onKeydown`
208
+ }, [childrenKey, flattenedData, someKeyword, parentSelectable]); // Used to hover the focuse item when trigger `onKeydown`
185
209
 
186
210
  var _useFocusItemValue = (0, _Picker.useFocusItemValue)(value, {
187
211
  rtl: rtl,
188
- data: flattenData,
212
+ data: flattenedData,
189
213
  valueKey: valueKey,
190
- defaultLayer: valueToPaths !== null && valueToPaths !== void 0 && valueToPaths.length ? valueToPaths.length - 1 : 0,
214
+ defaultLayer: pathTowardsSelectedItem !== null && pathTowardsSelectedItem !== void 0 && pathTowardsSelectedItem.length ? pathTowardsSelectedItem.length - 1 : 0,
191
215
  target: function target() {
192
216
  return overlayRef.current;
193
217
  },
218
+ getParent: function getParent(item) {
219
+ return parentMap.get(item);
220
+ },
194
221
  callback: (0, _react.useCallback)(function (value) {
195
- enforceUpdate(value, true);
196
- }, [enforceUpdate])
222
+ setActiveItem(flattenedData.find(function (item) {
223
+ return item[valueKey] === value;
224
+ }));
225
+ }, [flattenedData, setActiveItem, valueKey])
197
226
  }),
198
227
  focusItemValue = _useFocusItemValue.focusItemValue,
199
228
  setFocusItemValue = _useFocusItemValue.setFocusItemValue,
@@ -239,12 +268,9 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
239
268
  return;
240
269
  }
241
270
 
242
- setColumnData([data]);
243
271
  setValue(null);
244
- setSelectedPaths([]);
245
- setValueToPaths([]);
246
272
  onChange === null || onChange === void 0 ? void 0 : onChange(null, event);
247
- }, [data, disabled, onChange, setSelectedPaths, setColumnData, setValueToPaths, setValue]);
273
+ }, [disabled, onChange, setValue]);
248
274
  var handleMenuPressEnter = (0, _react.useCallback)(function (event) {
249
275
  var focusItem = (0, _treeUtils.findNodeOfTree)(data, function (item) {
250
276
  return item[valueKey] === focusItemValue;
@@ -253,10 +279,9 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
253
279
 
254
280
  if (isLeafNode) {
255
281
  setValue(focusItemValue);
256
- setValueToPaths(selectedPaths);
257
282
 
258
- if (selectedPaths.length) {
259
- setLayer(selectedPaths.length - 1);
283
+ if (pathTowardsActiveItem.length) {
284
+ setLayer(pathTowardsActiveItem.length - 1);
260
285
  }
261
286
 
262
287
  if (!(0, _shallowEqual.default)(value, focusItemValue)) {
@@ -265,7 +290,7 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
265
290
 
266
291
  handleClose();
267
292
  }
268
- }, [childrenKey, data, focusItemValue, handleClose, onChange, selectedPaths, setLayer, setValue, setValueToPaths, value, valueKey]);
293
+ }, [childrenKey, data, focusItemValue, handleClose, onChange, pathTowardsActiveItem, setLayer, setValue, value, valueKey]);
269
294
  var onPickerKeyDown = (0, _Picker.useToggleKeyDownEvent)((0, _extends3.default)({
270
295
  toggle: !focusItemValue || !active,
271
296
  triggerRef: triggerRef,
@@ -279,44 +304,32 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
279
304
  }, rest));
280
305
 
281
306
  var handleSelect = function handleSelect(node, cascadePaths, isLeafNode, event) {
282
- var _node$childrenKey, _node$childrenKey2, _triggerRef$current2;
307
+ var _node$childrenKey, _triggerRef$current2;
283
308
 
284
309
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
285
- setSelectedPaths(cascadePaths);
286
- var nextValue = node[valueKey];
287
- var columnIndex = cascadePaths.length; // Lazy load node's children
310
+ setActiveItem(node);
311
+ var nextValue = node[valueKey]; // Lazy load node's children
288
312
 
289
- if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0) {
290
- node.loading = true;
313
+ if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0 && !asyncChildrenMap.has(node)) {
314
+ loadingItemsSet.add(node);
291
315
  var children = getChildren(node);
292
316
 
293
317
  if (children instanceof Promise) {
294
318
  children.then(function (data) {
295
- node.loading = false;
296
- node[childrenKey] = data;
297
-
298
- if (targetRef.current || inline) {
299
- addColumn(data, columnIndex);
319
+ if (isMounted()) {
320
+ loadingItemsSet.delete(node);
321
+ asyncChildrenMap.set(node, data);
300
322
  }
301
323
  });
302
324
  } else {
303
- node.loading = false;
304
- node[childrenKey] = children;
305
- addColumn(children, columnIndex);
325
+ loadingItemsSet.delete(node);
326
+ asyncChildrenMap.set(node, children);
306
327
  }
307
- } else if ((_node$childrenKey2 = node[childrenKey]) !== null && _node$childrenKey2 !== void 0 && _node$childrenKey2.length) {
308
- addColumn(node[childrenKey], columnIndex);
309
- } else {
310
- // Removes subsequent columns of the current column when the clicked node is a leaf node.
311
- removeColumnByIndex(columnIndex);
312
328
  }
313
329
 
314
330
  if (isLeafNode) {
315
331
  // Determines whether the option is a leaf node, and if so, closes the picker.
316
- handleClose(); // Update the selected path to the value path.
317
- // That is, the selected path will be displayed on the button after clicking the child node.
318
-
319
- setValueToPaths(cascadePaths);
332
+ handleClose();
320
333
  setValue(nextValue);
321
334
 
322
335
  if (!(0, _shallowEqual.default)(value, nextValue)) {
@@ -331,7 +344,6 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
331
344
  if (parentSelectable && !(0, _shallowEqual.default)(value, nextValue)) {
332
345
  setValue(nextValue);
333
346
  onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
334
- setValueToPaths(cascadePaths);
335
347
  } // Update menu position
336
348
 
337
349
 
@@ -347,16 +359,15 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
347
359
  handleClose();
348
360
  setSearchKeyword('');
349
361
  setValue(nextValue);
350
- setValueToPaths(nodes);
351
- enforceUpdate(nextValue);
352
362
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, nodes, event);
353
363
  onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
354
364
  };
355
365
 
356
366
  var renderSearchRow = function renderSearchRow(item, key) {
357
367
  var regx = new RegExp((0, _utils2.getSafeRegExpString)(searchKeyword), 'ig');
358
- var nodes = (0, _treeUtils.getNodeParents)(item);
359
- nodes.push(item);
368
+ var nodes = (0, _utils.getPathTowardsItem)(item, function (item) {
369
+ return parentMap.get(item);
370
+ });
360
371
  var formattedNodes = nodes.map(function (node) {
361
372
  var _extends2;
362
373
 
@@ -448,12 +459,13 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
448
459
  menuWidth: menuWidth,
449
460
  menuHeight: menuHeight,
450
461
  disabledItemValues: disabledItemValues,
462
+ loadingItemsSet: loadingItemsSet,
451
463
  valueKey: valueKey,
452
464
  labelKey: labelKey,
453
465
  childrenKey: childrenKey,
454
466
  classPrefix: 'picker-cascader-menu',
455
- cascadeData: columnData,
456
- cascadePaths: selectedPaths,
467
+ cascadeData: columnsToDisplay,
468
+ cascadePaths: pathTowardsActiveItem,
457
469
  activeItemValue: value // FIXME make onSelect generic
458
470
  ,
459
471
  onSelect: handleSelect,
@@ -464,15 +476,15 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
464
476
 
465
477
  var selectedElement = placeholder;
466
478
 
467
- if (valueToPaths.length > 0) {
479
+ if (pathTowardsSelectedItem.length > 0) {
468
480
  selectedElement = [];
469
- valueToPaths.forEach(function (item, index) {
481
+ pathTowardsSelectedItem.forEach(function (item, index) {
470
482
  var key = item[valueKey] || item[labelKey];
471
483
  selectedElement.push( /*#__PURE__*/_react.default.createElement("span", {
472
484
  key: key
473
485
  }, item[labelKey]));
474
486
 
475
- if (index < valueToPaths.length - 1) {
487
+ if (index < pathTowardsSelectedItem.length - 1) {
476
488
  selectedElement.push( /*#__PURE__*/_react.default.createElement("span", {
477
489
  className: "separator",
478
490
  key: key + "-separator"
@@ -482,7 +494,7 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
482
494
  }
483
495
 
484
496
  if (!(0, _isNil.default)(value) && (0, _isFunction.default)(renderValue)) {
485
- selectedElement = renderValue(value, valueToPaths, selectedElement); // If renderValue returns null or undefined, hasValue is false.
497
+ selectedElement = renderValue(value, pathTowardsSelectedItem, selectedElement); // If renderValue returns null or undefined, hasValue is false.
486
498
 
487
499
  if ((0, _isNil.default)(selectedElement)) {
488
500
  hasValue = false;
@@ -2,19 +2,23 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { ItemDataType, WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
4
  import { ValueType } from './Cascader';
5
+ declare type SetLike<T = unknown> = {
6
+ has(value: T): boolean;
7
+ };
5
8
  export interface DropdownMenuProps extends Omit<WithAsProps, 'classPrefix'> {
6
9
  classPrefix: string;
7
10
  disabledItemValues: ValueType[];
8
11
  activeItemValue?: ValueType | null;
9
12
  childrenKey: string;
10
- cascadeData: ItemDataType[][];
13
+ cascadeData: (readonly ItemDataType[])[];
14
+ loadingItemsSet?: SetLike<ItemDataType>;
11
15
  cascadePaths: ItemDataType[];
12
16
  valueKey: string;
13
17
  labelKey: string;
14
18
  menuWidth?: number;
15
19
  menuHeight?: number | string;
16
20
  renderMenuItem?: (itemLabel: React.ReactNode, item: ItemDataType) => React.ReactNode;
17
- renderMenu?: (items: ItemDataType[], menu: React.ReactNode, parentNode?: ItemDataType, layer?: number) => React.ReactNode;
21
+ renderMenu?: (items: readonly ItemDataType[], menu: React.ReactNode, parentNode?: ItemDataType, layer?: number) => React.ReactNode;
18
22
  onSelect?: (node: ItemDataType, cascadePaths: ItemDataType[], isLeafNode: boolean, event: React.MouseEvent) => void;
19
23
  }
20
24
  declare const DropdownMenu: RsRefForwardingComponent<'div', DropdownMenuProps>;
@@ -55,12 +55,13 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
55
55
  cascadeData = _props$cascadeData === void 0 ? emptyArray : _props$cascadeData,
56
56
  _props$cascadePaths = props.cascadePaths,
57
57
  cascadePaths = _props$cascadePaths === void 0 ? emptyArray : _props$cascadePaths,
58
+ loadingItemsSet = props.loadingItemsSet,
58
59
  _props$labelKey = props.labelKey,
59
60
  labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
60
61
  renderMenu = props.renderMenu,
61
62
  renderMenuItem = props.renderMenuItem,
62
63
  onSelect = props.onSelect,
63
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "labelKey", "renderMenu", "renderMenuItem", "onSelect"]);
64
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "loadingItemsSet", "labelKey", "renderMenu", "renderMenuItem", "onSelect"]);
64
65
 
65
66
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
66
67
  merge = _useClassNames.merge,
@@ -114,15 +115,18 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
114
115
  };
115
116
 
116
117
  var renderCascadeNode = function renderCascadeNode(node, index, layer, focus) {
118
+ var _loadingItemsSet$has;
119
+
117
120
  var children = node[childrenKey];
118
121
  var value = node[valueKey];
119
122
  var label = node[labelKey];
120
123
  var disabled = disabledItemValues.some(function (disabledValue) {
121
124
  return (0, _utils.shallowEqual)(disabledValue, value);
122
- }); // Use `value` in keys when If `value` is string or number
125
+ });
126
+ var loading = (_loadingItemsSet$has = loadingItemsSet === null || loadingItemsSet === void 0 ? void 0 : loadingItemsSet.has(node)) !== null && _loadingItemsSet$has !== void 0 ? _loadingItemsSet$has : false; // Use `value` in keys when If `value` is string or number
123
127
 
124
128
  var onlyKey = typeof value === 'number' || typeof value === 'string' ? value : index;
125
- var Icon = node.loading ? _Spinner.default : rtl ? _AngleLeft.default : _AngleRight.default;
129
+ var Icon = loading ? _Spinner.default : rtl ? _AngleLeft.default : _AngleRight.default;
126
130
  return /*#__PURE__*/_react.default.createElement(_Picker.DropdownMenuItem, {
127
131
  classPrefix: "picker-cascader-menu-item",
128
132
  as: 'li',
@@ -139,7 +143,7 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
139
143
  }
140
144
  }, renderMenuItem ? renderMenuItem(label, node) : label, children ? /*#__PURE__*/_react.default.createElement(Icon, {
141
145
  className: prefix('caret'),
142
- spin: node.loading
146
+ spin: loading
143
147
  }) : null);
144
148
  };
145
149