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.
- package/CHANGELOG.md +19 -0
- package/Calendar/styles/index.less +3 -2
- package/Toggle/styles/mixin.less +14 -0
- package/cjs/Calendar/Calendar.d.ts +3 -3
- package/cjs/Calendar/Calendar.js +4 -4
- package/cjs/Calendar/CalendarContainer.d.ts +2 -2
- package/cjs/Calendar/CalendarContainer.js +8 -11
- package/cjs/Calendar/MonthDropdown.js +1 -1
- package/cjs/Cascader/Cascader.d.ts +2 -2
- package/cjs/Cascader/Cascader.js +83 -71
- package/cjs/Cascader/DropdownMenu.d.ts +6 -2
- package/cjs/Cascader/DropdownMenu.js +8 -4
- package/cjs/Cascader/utils.d.ts +52 -17
- package/cjs/Cascader/utils.js +99 -138
- package/cjs/DatePicker/DatePicker.d.ts +3 -1
- package/cjs/DatePicker/DatePicker.js +4 -5
- package/cjs/DateRangePicker/Calendar.d.ts +1 -0
- package/cjs/DateRangePicker/Calendar.js +4 -5
- package/cjs/DateRangePicker/DateRangePicker.d.ts +3 -1
- package/cjs/DateRangePicker/DateRangePicker.js +4 -1
- package/cjs/MultiCascader/DropdownMenu.d.ts +2 -2
- package/cjs/MultiCascader/MultiCascader.d.ts +1 -1
- package/cjs/MultiCascader/MultiCascader.js +12 -7
- package/cjs/MultiCascader/utils.d.ts +2 -2
- package/cjs/MultiCascader/utils.js +3 -3
- package/cjs/Picker/utils.d.ts +4 -3
- package/cjs/Picker/utils.js +8 -4
- package/cjs/locales/ru_RU.js +6 -6
- package/cjs/utils/getDataGroupBy.js +1 -1
- package/cjs/utils/treeUtils.d.ts +5 -1
- package/cjs/utils/treeUtils.js +31 -6
- package/cjs/utils/useMap.d.ts +6 -0
- package/cjs/utils/useMap.js +35 -0
- package/dist/rsuite-no-reset-rtl.css +31 -2
- package/dist/rsuite-no-reset-rtl.min.css +1 -1
- package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
- package/dist/rsuite-no-reset.css +31 -2
- package/dist/rsuite-no-reset.min.css +1 -1
- package/dist/rsuite-no-reset.min.css.map +1 -1
- package/dist/rsuite-rtl.css +31 -2
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +31 -2
- package/dist/rsuite.js +187 -15
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/Calendar/Calendar.d.ts +3 -3
- package/esm/Calendar/Calendar.js +6 -6
- package/esm/Calendar/CalendarContainer.d.ts +2 -2
- package/esm/Calendar/CalendarContainer.js +10 -13
- package/esm/Calendar/MonthDropdown.js +1 -1
- package/esm/Cascader/Cascader.d.ts +2 -2
- package/esm/Cascader/Cascader.js +85 -75
- package/esm/Cascader/DropdownMenu.d.ts +6 -2
- package/esm/Cascader/DropdownMenu.js +8 -4
- package/esm/Cascader/utils.d.ts +52 -17
- package/esm/Cascader/utils.js +100 -135
- package/esm/DatePicker/DatePicker.d.ts +3 -1
- package/esm/DatePicker/DatePicker.js +4 -5
- package/esm/DateRangePicker/Calendar.d.ts +1 -0
- package/esm/DateRangePicker/Calendar.js +5 -6
- package/esm/DateRangePicker/DateRangePicker.d.ts +3 -1
- package/esm/DateRangePicker/DateRangePicker.js +4 -1
- package/esm/MultiCascader/DropdownMenu.d.ts +2 -2
- package/esm/MultiCascader/MultiCascader.d.ts +1 -1
- package/esm/MultiCascader/MultiCascader.js +12 -7
- package/esm/MultiCascader/utils.d.ts +2 -2
- package/esm/MultiCascader/utils.js +4 -4
- package/esm/Picker/utils.d.ts +4 -3
- package/esm/Picker/utils.js +8 -4
- package/esm/locales/ru_RU.js +6 -6
- package/esm/utils/getDataGroupBy.js +2 -2
- package/esm/utils/treeUtils.d.ts +5 -1
- package/esm/utils/treeUtils.js +30 -6
- package/esm/utils/useMap.d.ts +6 -0
- package/esm/utils/useMap.js +29 -0
- package/package.json +2 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
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
|
|
28
|
-
export default
|
|
27
|
+
declare const Calendar: RsRefForwardingComponent<typeof CalendarContainer, CalendarProps>;
|
|
28
|
+
export default Calendar;
|
package/esm/Calendar/Calendar.js
CHANGED
|
@@ -3,14 +3,14 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
|
|
|
3
3
|
import React, { useCallback } from 'react';
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
import isSameMonth from 'date-fns/isSameMonth';
|
|
6
|
-
import
|
|
6
|
+
import CalendarContainer from './CalendarContainer';
|
|
7
7
|
import Button from '../Button';
|
|
8
8
|
import { FormattedDate } from '../CustomProvider';
|
|
9
9
|
import { useClassNames, useCustom } from '../utils';
|
|
10
10
|
import useCalendarDate from './useCalendarDate';
|
|
11
|
-
var
|
|
11
|
+
var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
12
12
|
var _props$as = props.as,
|
|
13
|
-
Component = _props$as === void 0 ?
|
|
13
|
+
Component = _props$as === void 0 ? CalendarContainer : _props$as,
|
|
14
14
|
bordered = props.bordered,
|
|
15
15
|
className = props.className,
|
|
16
16
|
_props$classPrefix = props.classPrefix,
|
|
@@ -95,8 +95,8 @@ var CalendarPanel = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
95
95
|
onSelect: handleSelect
|
|
96
96
|
}));
|
|
97
97
|
});
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
Calendar.displayName = 'Calendar';
|
|
99
|
+
Calendar.propTypes = {
|
|
100
100
|
value: PropTypes.instanceOf(Date),
|
|
101
101
|
defaultValue: PropTypes.instanceOf(Date),
|
|
102
102
|
isoWeek: PropTypes.bool,
|
|
@@ -109,4 +109,4 @@ CalendarPanel.propTypes = {
|
|
|
109
109
|
onSelect: PropTypes.func,
|
|
110
110
|
renderCell: PropTypes.func
|
|
111
111
|
};
|
|
112
|
-
export default
|
|
112
|
+
export default Calendar;
|
|
@@ -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 */
|
|
@@ -7,8 +7,8 @@ import MonthDropdown from './MonthDropdown';
|
|
|
7
7
|
import TimeDropdown from './TimeDropdown';
|
|
8
8
|
import CalendarBody from './CalendarBody';
|
|
9
9
|
import CalendarHeader from './CalendarHeader';
|
|
10
|
-
import { useClassNames
|
|
11
|
-
import { disabledTime, addMonths, shouldRenderDate, shouldRenderTime, shouldRenderMonth,
|
|
10
|
+
import { useClassNames } from '../utils';
|
|
11
|
+
import { disabledTime, addMonths, shouldRenderDate, shouldRenderTime, shouldRenderMonth, isSameMonth, calendarOnlyProps, omitHideDisabledProps } from '../utils/dateUtils';
|
|
12
12
|
import { CalendarProvider } from './CalendarContext';
|
|
13
13
|
import useCalendarState, { CalendarState } from './useCalendarState';
|
|
14
14
|
import AngleUpIcon from '@rsuite/icons/legacy/AngleUp';
|
|
@@ -25,10 +25,10 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
25
25
|
disabledForward = props.disabledForward,
|
|
26
26
|
format = props.format,
|
|
27
27
|
hoverRangeValue = props.hoverRangeValue,
|
|
28
|
-
inSameMonth = props.inSameMonth,
|
|
29
28
|
_props$isoWeek = props.isoWeek,
|
|
30
29
|
isoWeek = _props$isoWeek === void 0 ? false : _props$isoWeek,
|
|
31
30
|
limitEndYear = props.limitEndYear,
|
|
31
|
+
limitStartYear = props.limitStartYear,
|
|
32
32
|
locale = props.locale,
|
|
33
33
|
onChangeMonth = props.onChangeMonth,
|
|
34
34
|
onChangeTime = props.onChangeTime,
|
|
@@ -46,7 +46,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
46
46
|
showMeridian = props.showMeridian,
|
|
47
47
|
showWeekNumbers = props.showWeekNumbers,
|
|
48
48
|
inline = props.inline,
|
|
49
|
-
rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "
|
|
49
|
+
rest = _objectWithoutPropertiesLoose(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"]);
|
|
50
50
|
|
|
51
51
|
var _useClassNames = useClassNames(classPrefix),
|
|
52
52
|
withClassPrefix = _useClassNames.withClassPrefix,
|
|
@@ -106,12 +106,8 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
106
106
|
var showTime = calendarState === CalendarState.TIME || onlyShowTime;
|
|
107
107
|
var showMonth = calendarState === CalendarState.MONTH || onlyShowMonth;
|
|
108
108
|
var inSameThisMonthDate = useCallback(function (date) {
|
|
109
|
-
return
|
|
110
|
-
|
|
111
|
-
}, function (d) {
|
|
112
|
-
return isSameMonth(d, date);
|
|
113
|
-
})(date);
|
|
114
|
-
}, []);
|
|
109
|
+
return isSameMonth(calendarDate, date);
|
|
110
|
+
}, [calendarDate]);
|
|
115
111
|
var calendarClasses = merge(className, withClassPrefix({
|
|
116
112
|
'time-view': showTime,
|
|
117
113
|
'month-view': showMonth,
|
|
@@ -129,7 +125,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
129
125
|
disabledDate: isDisabledDate,
|
|
130
126
|
format: format,
|
|
131
127
|
hoverRangeValue: hoverRangeValue,
|
|
132
|
-
inSameMonth:
|
|
128
|
+
inSameMonth: inSameThisMonthDate,
|
|
133
129
|
isoWeek: isoWeek,
|
|
134
130
|
locale: locale,
|
|
135
131
|
onChangeMonth: handleChangeMonth,
|
|
@@ -140,7 +136,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
140
136
|
showWeekNumbers: showWeekNumbers,
|
|
141
137
|
inline: inline
|
|
142
138
|
};
|
|
143
|
-
}, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue,
|
|
139
|
+
}, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
|
|
144
140
|
return /*#__PURE__*/React.createElement(CalendarProvider, {
|
|
145
141
|
value: contextValue
|
|
146
142
|
}, /*#__PURE__*/React.createElement(Component, _extends({}, omitHideDisabledProps(rest), {
|
|
@@ -164,6 +160,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
164
160
|
}), renderDate && /*#__PURE__*/React.createElement(CalendarBody, null), renderMonth && /*#__PURE__*/React.createElement(MonthDropdown, {
|
|
165
161
|
show: showMonth,
|
|
166
162
|
limitEndYear: limitEndYear,
|
|
163
|
+
limitStartYear: limitStartYear,
|
|
167
164
|
disabledMonth: isDisabledDate
|
|
168
165
|
}), renderTime && /*#__PURE__*/React.createElement(TimeDropdown, _extends({}, timeDropdownProps, {
|
|
169
166
|
show: showTime,
|
|
@@ -186,9 +183,9 @@ CalendarContainer.propTypes = {
|
|
|
186
183
|
hideHours: PropTypes.func,
|
|
187
184
|
hideMinutes: PropTypes.func,
|
|
188
185
|
hideSeconds: PropTypes.func,
|
|
189
|
-
inSameMonth: PropTypes.func,
|
|
190
186
|
isoWeek: PropTypes.bool,
|
|
191
187
|
limitEndYear: PropTypes.number,
|
|
188
|
+
limitStartYear: PropTypes.number,
|
|
192
189
|
locale: PropTypes.object,
|
|
193
190
|
onChangeMonth: PropTypes.func,
|
|
194
191
|
onChangeTime: PropTypes.func,
|
|
@@ -45,7 +45,7 @@ var MonthDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
45
45
|
withClassPrefix = _useClassNames.withClassPrefix;
|
|
46
46
|
|
|
47
47
|
var thisYear = DateUtils.getYear(new Date());
|
|
48
|
-
var startYear = limitStartYear ? thisYear - limitStartYear : 1900;
|
|
48
|
+
var startYear = limitStartYear ? thisYear - limitStartYear + 1 : 1900;
|
|
49
49
|
var rowCount = useMemo(function () {
|
|
50
50
|
var endYear = thisYear + limitEndYear;
|
|
51
51
|
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> & {
|
package/esm/Cascader/Cascader.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
3
|
-
import React, { useRef, useState, useCallback,
|
|
3
|
+
import React, { useRef, useState, useCallback, useMemo } from 'react';
|
|
4
|
+
import { useSet } from 'react-use-set';
|
|
4
5
|
import PropTypes from 'prop-types';
|
|
5
6
|
import omit from 'lodash/omit';
|
|
6
7
|
import pick from 'lodash/pick';
|
|
@@ -8,10 +9,11 @@ import isNil from 'lodash/isNil';
|
|
|
8
9
|
import isFunction from 'lodash/isFunction';
|
|
9
10
|
import shallowEqual from '../utils/shallowEqual';
|
|
10
11
|
import DropdownMenu from './DropdownMenu';
|
|
11
|
-
import { findNodeOfTree, flattenTree
|
|
12
|
-
import { usePaths } from './utils';
|
|
13
|
-
import { getSafeRegExpString, createChainedFunction, mergeRefs, useControlled, useCustom, useClassNames } from '../utils';
|
|
12
|
+
import { findNodeOfTree, flattenTree } from '../utils/treeUtils';
|
|
13
|
+
import { getParentMap, getPathTowardsItem, usePaths } from './utils';
|
|
14
|
+
import { getSafeRegExpString, createChainedFunction, mergeRefs, useControlled, useCustom, useClassNames, useIsMounted } from '../utils';
|
|
14
15
|
import { PickerToggle, PickerOverlay, SearchBar, PickerToggleTrigger, usePickerClassName, usePublicMethods, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
|
|
16
|
+
import { useMap } from '../utils/useMap';
|
|
15
17
|
var emptyArray = [];
|
|
16
18
|
var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
17
19
|
var _props$as = props.as,
|
|
@@ -71,10 +73,6 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
71
73
|
active = _useState[0],
|
|
72
74
|
setActive = _useState[1];
|
|
73
75
|
|
|
74
|
-
var _useState2 = useState(flattenTree(data, childrenKey)),
|
|
75
|
-
flattenData = _useState2[0],
|
|
76
|
-
setFlattenData = _useState2[1];
|
|
77
|
-
|
|
78
76
|
var triggerRef = useRef(null);
|
|
79
77
|
var overlayRef = useRef(null);
|
|
80
78
|
var targetRef = useRef(null);
|
|
@@ -84,25 +82,47 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
84
82
|
value = _ref[0],
|
|
85
83
|
setValue = _ref[1];
|
|
86
84
|
|
|
85
|
+
var isMounted = useIsMounted();
|
|
86
|
+
var loadingItemsSet = useSet();
|
|
87
|
+
var asyncChildrenMap = useMap();
|
|
88
|
+
var parentMap = useMemo(function () {
|
|
89
|
+
return getParentMap(data, function (item) {
|
|
90
|
+
var _asyncChildrenMap$get;
|
|
91
|
+
|
|
92
|
+
return (_asyncChildrenMap$get = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get !== void 0 ? _asyncChildrenMap$get : item[childrenKey];
|
|
93
|
+
});
|
|
94
|
+
}, [asyncChildrenMap, childrenKey, data]);
|
|
95
|
+
var flattenedData = useMemo(function () {
|
|
96
|
+
return flattenTree(data, function (item) {
|
|
97
|
+
var _asyncChildrenMap$get2;
|
|
98
|
+
|
|
99
|
+
return (_asyncChildrenMap$get2 = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get2 !== void 0 ? _asyncChildrenMap$get2 : item[childrenKey];
|
|
100
|
+
});
|
|
101
|
+
}, [asyncChildrenMap, childrenKey, data]); // The item that focus is on
|
|
102
|
+
|
|
103
|
+
var _useState2 = useState(),
|
|
104
|
+
activeItem = _useState2[0],
|
|
105
|
+
setActiveItem = _useState2[1];
|
|
106
|
+
|
|
87
107
|
var _usePaths = usePaths({
|
|
88
108
|
data: data,
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
109
|
+
activeItem: activeItem,
|
|
110
|
+
selectedItem: flattenedData.find(function (item) {
|
|
111
|
+
return item[valueKey] === value;
|
|
112
|
+
}),
|
|
113
|
+
getParent: function getParent(item) {
|
|
114
|
+
return parentMap.get(item);
|
|
115
|
+
},
|
|
116
|
+
getChildren: function getChildren(item) {
|
|
117
|
+
var _asyncChildrenMap$get3;
|
|
118
|
+
|
|
119
|
+
return (_asyncChildrenMap$get3 = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get3 !== void 0 ? _asyncChildrenMap$get3 : item[childrenKey];
|
|
120
|
+
}
|
|
92
121
|
}),
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
removeColumnByIndex = _usePaths.removeColumnByIndex,
|
|
98
|
-
setValueToPaths = _usePaths.setValueToPaths,
|
|
99
|
-
setColumnData = _usePaths.setColumnData,
|
|
100
|
-
setSelectedPaths = _usePaths.setSelectedPaths,
|
|
101
|
-
enforceUpdate = _usePaths.enforceUpdate;
|
|
102
|
-
|
|
103
|
-
useEffect(function () {
|
|
104
|
-
setFlattenData(flattenTree(data, childrenKey));
|
|
105
|
-
}, [data, childrenKey]);
|
|
122
|
+
columnsToDisplay = _usePaths.columnsToDisplay,
|
|
123
|
+
pathTowardsActiveItem = _usePaths.pathTowardsActiveItem,
|
|
124
|
+
pathTowardsSelectedItem = _usePaths.pathTowardsSelectedItem;
|
|
125
|
+
|
|
106
126
|
usePublicMethods(ref, {
|
|
107
127
|
triggerRef: triggerRef,
|
|
108
128
|
overlayRef: overlayRef,
|
|
@@ -118,7 +138,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
118
138
|
*/
|
|
119
139
|
|
|
120
140
|
|
|
121
|
-
var hasValue =
|
|
141
|
+
var hasValue = pathTowardsSelectedItem.length > 0 || !isNil(value) && isFunction(renderValue);
|
|
122
142
|
|
|
123
143
|
var _useClassNames = useClassNames(classPrefix),
|
|
124
144
|
prefix = _useClassNames.prefix,
|
|
@@ -133,15 +153,17 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
133
153
|
return true;
|
|
134
154
|
}
|
|
135
155
|
|
|
136
|
-
|
|
156
|
+
var parent = parentMap.get(item);
|
|
157
|
+
|
|
158
|
+
if (parent && someKeyword(parent)) {
|
|
137
159
|
return true;
|
|
138
160
|
}
|
|
139
161
|
|
|
140
162
|
return false;
|
|
141
|
-
}, [labelKey, searchKeyword]);
|
|
163
|
+
}, [labelKey, parentMap, searchKeyword]);
|
|
142
164
|
var getSearchResult = useCallback(function (keyword) {
|
|
143
165
|
var items = [];
|
|
144
|
-
var result =
|
|
166
|
+
var result = flattenedData.filter(function (item) {
|
|
145
167
|
if (!parentSelectable && item[childrenKey]) {
|
|
146
168
|
return false;
|
|
147
169
|
}
|
|
@@ -158,19 +180,24 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
158
180
|
}
|
|
159
181
|
|
|
160
182
|
return items;
|
|
161
|
-
}, [childrenKey,
|
|
183
|
+
}, [childrenKey, flattenedData, someKeyword, parentSelectable]); // Used to hover the focuse item when trigger `onKeydown`
|
|
162
184
|
|
|
163
185
|
var _useFocusItemValue = useFocusItemValue(value, {
|
|
164
186
|
rtl: rtl,
|
|
165
|
-
data:
|
|
187
|
+
data: flattenedData,
|
|
166
188
|
valueKey: valueKey,
|
|
167
|
-
defaultLayer:
|
|
189
|
+
defaultLayer: pathTowardsSelectedItem !== null && pathTowardsSelectedItem !== void 0 && pathTowardsSelectedItem.length ? pathTowardsSelectedItem.length - 1 : 0,
|
|
168
190
|
target: function target() {
|
|
169
191
|
return overlayRef.current;
|
|
170
192
|
},
|
|
193
|
+
getParent: function getParent(item) {
|
|
194
|
+
return parentMap.get(item);
|
|
195
|
+
},
|
|
171
196
|
callback: useCallback(function (value) {
|
|
172
|
-
|
|
173
|
-
|
|
197
|
+
setActiveItem(flattenedData.find(function (item) {
|
|
198
|
+
return item[valueKey] === value;
|
|
199
|
+
}));
|
|
200
|
+
}, [flattenedData, setActiveItem, valueKey])
|
|
174
201
|
}),
|
|
175
202
|
focusItemValue = _useFocusItemValue.focusItemValue,
|
|
176
203
|
setFocusItemValue = _useFocusItemValue.setFocusItemValue,
|
|
@@ -216,12 +243,9 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
216
243
|
return;
|
|
217
244
|
}
|
|
218
245
|
|
|
219
|
-
setColumnData([data]);
|
|
220
246
|
setValue(null);
|
|
221
|
-
setSelectedPaths([]);
|
|
222
|
-
setValueToPaths([]);
|
|
223
247
|
onChange === null || onChange === void 0 ? void 0 : onChange(null, event);
|
|
224
|
-
}, [
|
|
248
|
+
}, [disabled, onChange, setValue]);
|
|
225
249
|
var handleMenuPressEnter = useCallback(function (event) {
|
|
226
250
|
var focusItem = findNodeOfTree(data, function (item) {
|
|
227
251
|
return item[valueKey] === focusItemValue;
|
|
@@ -230,10 +254,9 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
230
254
|
|
|
231
255
|
if (isLeafNode) {
|
|
232
256
|
setValue(focusItemValue);
|
|
233
|
-
setValueToPaths(selectedPaths);
|
|
234
257
|
|
|
235
|
-
if (
|
|
236
|
-
setLayer(
|
|
258
|
+
if (pathTowardsActiveItem.length) {
|
|
259
|
+
setLayer(pathTowardsActiveItem.length - 1);
|
|
237
260
|
}
|
|
238
261
|
|
|
239
262
|
if (!shallowEqual(value, focusItemValue)) {
|
|
@@ -242,7 +265,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
242
265
|
|
|
243
266
|
handleClose();
|
|
244
267
|
}
|
|
245
|
-
}, [childrenKey, data, focusItemValue, handleClose, onChange,
|
|
268
|
+
}, [childrenKey, data, focusItemValue, handleClose, onChange, pathTowardsActiveItem, setLayer, setValue, value, valueKey]);
|
|
246
269
|
var onPickerKeyDown = useToggleKeyDownEvent(_extends({
|
|
247
270
|
toggle: !focusItemValue || !active,
|
|
248
271
|
triggerRef: triggerRef,
|
|
@@ -256,44 +279,32 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
256
279
|
}, rest));
|
|
257
280
|
|
|
258
281
|
var handleSelect = function handleSelect(node, cascadePaths, isLeafNode, event) {
|
|
259
|
-
var _node$childrenKey,
|
|
282
|
+
var _node$childrenKey, _triggerRef$current2;
|
|
260
283
|
|
|
261
284
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
|
|
262
|
-
|
|
263
|
-
var nextValue = node[valueKey];
|
|
264
|
-
var columnIndex = cascadePaths.length; // Lazy load node's children
|
|
285
|
+
setActiveItem(node);
|
|
286
|
+
var nextValue = node[valueKey]; // Lazy load node's children
|
|
265
287
|
|
|
266
|
-
if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0) {
|
|
267
|
-
node
|
|
288
|
+
if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0 && !asyncChildrenMap.has(node)) {
|
|
289
|
+
loadingItemsSet.add(node);
|
|
268
290
|
var children = getChildren(node);
|
|
269
291
|
|
|
270
292
|
if (children instanceof Promise) {
|
|
271
293
|
children.then(function (data) {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
if (targetRef.current || inline) {
|
|
276
|
-
addColumn(data, columnIndex);
|
|
294
|
+
if (isMounted()) {
|
|
295
|
+
loadingItemsSet.delete(node);
|
|
296
|
+
asyncChildrenMap.set(node, data);
|
|
277
297
|
}
|
|
278
298
|
});
|
|
279
299
|
} else {
|
|
280
|
-
node
|
|
281
|
-
node
|
|
282
|
-
addColumn(children, columnIndex);
|
|
300
|
+
loadingItemsSet.delete(node);
|
|
301
|
+
asyncChildrenMap.set(node, children);
|
|
283
302
|
}
|
|
284
|
-
} else if ((_node$childrenKey2 = node[childrenKey]) !== null && _node$childrenKey2 !== void 0 && _node$childrenKey2.length) {
|
|
285
|
-
addColumn(node[childrenKey], columnIndex);
|
|
286
|
-
} else {
|
|
287
|
-
// Removes subsequent columns of the current column when the clicked node is a leaf node.
|
|
288
|
-
removeColumnByIndex(columnIndex);
|
|
289
303
|
}
|
|
290
304
|
|
|
291
305
|
if (isLeafNode) {
|
|
292
306
|
// Determines whether the option is a leaf node, and if so, closes the picker.
|
|
293
|
-
handleClose();
|
|
294
|
-
// That is, the selected path will be displayed on the button after clicking the child node.
|
|
295
|
-
|
|
296
|
-
setValueToPaths(cascadePaths);
|
|
307
|
+
handleClose();
|
|
297
308
|
setValue(nextValue);
|
|
298
309
|
|
|
299
310
|
if (!shallowEqual(value, nextValue)) {
|
|
@@ -308,7 +319,6 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
308
319
|
if (parentSelectable && !shallowEqual(value, nextValue)) {
|
|
309
320
|
setValue(nextValue);
|
|
310
321
|
onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
|
|
311
|
-
setValueToPaths(cascadePaths);
|
|
312
322
|
} // Update menu position
|
|
313
323
|
|
|
314
324
|
|
|
@@ -324,16 +334,15 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
324
334
|
handleClose();
|
|
325
335
|
setSearchKeyword('');
|
|
326
336
|
setValue(nextValue);
|
|
327
|
-
setValueToPaths(nodes);
|
|
328
|
-
enforceUpdate(nextValue);
|
|
329
337
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, nodes, event);
|
|
330
338
|
onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
|
|
331
339
|
};
|
|
332
340
|
|
|
333
341
|
var renderSearchRow = function renderSearchRow(item, key) {
|
|
334
342
|
var regx = new RegExp(getSafeRegExpString(searchKeyword), 'ig');
|
|
335
|
-
var nodes =
|
|
336
|
-
|
|
343
|
+
var nodes = getPathTowardsItem(item, function (item) {
|
|
344
|
+
return parentMap.get(item);
|
|
345
|
+
});
|
|
337
346
|
var formattedNodes = nodes.map(function (node) {
|
|
338
347
|
var _extends2;
|
|
339
348
|
|
|
@@ -426,12 +435,13 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
426
435
|
menuWidth: menuWidth,
|
|
427
436
|
menuHeight: menuHeight,
|
|
428
437
|
disabledItemValues: disabledItemValues,
|
|
438
|
+
loadingItemsSet: loadingItemsSet,
|
|
429
439
|
valueKey: valueKey,
|
|
430
440
|
labelKey: labelKey,
|
|
431
441
|
childrenKey: childrenKey,
|
|
432
442
|
classPrefix: 'picker-cascader-menu',
|
|
433
|
-
cascadeData:
|
|
434
|
-
cascadePaths:
|
|
443
|
+
cascadeData: columnsToDisplay,
|
|
444
|
+
cascadePaths: pathTowardsActiveItem,
|
|
435
445
|
activeItemValue: value // FIXME make onSelect generic
|
|
436
446
|
,
|
|
437
447
|
onSelect: handleSelect,
|
|
@@ -442,15 +452,15 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
442
452
|
|
|
443
453
|
var selectedElement = placeholder;
|
|
444
454
|
|
|
445
|
-
if (
|
|
455
|
+
if (pathTowardsSelectedItem.length > 0) {
|
|
446
456
|
selectedElement = [];
|
|
447
|
-
|
|
457
|
+
pathTowardsSelectedItem.forEach(function (item, index) {
|
|
448
458
|
var key = item[valueKey] || item[labelKey];
|
|
449
459
|
selectedElement.push( /*#__PURE__*/React.createElement("span", {
|
|
450
460
|
key: key
|
|
451
461
|
}, item[labelKey]));
|
|
452
462
|
|
|
453
|
-
if (index <
|
|
463
|
+
if (index < pathTowardsSelectedItem.length - 1) {
|
|
454
464
|
selectedElement.push( /*#__PURE__*/React.createElement("span", {
|
|
455
465
|
className: "separator",
|
|
456
466
|
key: key + "-separator"
|
|
@@ -460,7 +470,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
460
470
|
}
|
|
461
471
|
|
|
462
472
|
if (!isNil(value) && isFunction(renderValue)) {
|
|
463
|
-
selectedElement = renderValue(value,
|
|
473
|
+
selectedElement = renderValue(value, pathTowardsSelectedItem, selectedElement); // If renderValue returns null or undefined, hasValue is false.
|
|
464
474
|
|
|
465
475
|
if (isNil(selectedElement)) {
|
|
466
476
|
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>;
|
|
@@ -32,12 +32,13 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
32
32
|
cascadeData = _props$cascadeData === void 0 ? emptyArray : _props$cascadeData,
|
|
33
33
|
_props$cascadePaths = props.cascadePaths,
|
|
34
34
|
cascadePaths = _props$cascadePaths === void 0 ? emptyArray : _props$cascadePaths,
|
|
35
|
+
loadingItemsSet = props.loadingItemsSet,
|
|
35
36
|
_props$labelKey = props.labelKey,
|
|
36
37
|
labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
|
|
37
38
|
renderMenu = props.renderMenu,
|
|
38
39
|
renderMenuItem = props.renderMenuItem,
|
|
39
40
|
onSelect = props.onSelect,
|
|
40
|
-
rest = _objectWithoutPropertiesLoose(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "labelKey", "renderMenu", "renderMenuItem", "onSelect"]);
|
|
41
|
+
rest = _objectWithoutPropertiesLoose(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "loadingItemsSet", "labelKey", "renderMenu", "renderMenuItem", "onSelect"]);
|
|
41
42
|
|
|
42
43
|
var _useClassNames = useClassNames(classPrefix),
|
|
43
44
|
merge = _useClassNames.merge,
|
|
@@ -91,15 +92,18 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
91
92
|
};
|
|
92
93
|
|
|
93
94
|
var renderCascadeNode = function renderCascadeNode(node, index, layer, focus) {
|
|
95
|
+
var _loadingItemsSet$has;
|
|
96
|
+
|
|
94
97
|
var children = node[childrenKey];
|
|
95
98
|
var value = node[valueKey];
|
|
96
99
|
var label = node[labelKey];
|
|
97
100
|
var disabled = disabledItemValues.some(function (disabledValue) {
|
|
98
101
|
return shallowEqual(disabledValue, value);
|
|
99
|
-
});
|
|
102
|
+
});
|
|
103
|
+
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
|
|
100
104
|
|
|
101
105
|
var onlyKey = typeof value === 'number' || typeof value === 'string' ? value : index;
|
|
102
|
-
var Icon =
|
|
106
|
+
var Icon = loading ? SpinnerIcon : rtl ? AngleLeftIcon : AngleRightIcon;
|
|
103
107
|
return /*#__PURE__*/React.createElement(DropdownMenuItem, {
|
|
104
108
|
classPrefix: "picker-cascader-menu-item",
|
|
105
109
|
as: 'li',
|
|
@@ -116,7 +120,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
116
120
|
}
|
|
117
121
|
}, renderMenuItem ? renderMenuItem(label, node) : label, children ? /*#__PURE__*/React.createElement(Icon, {
|
|
118
122
|
className: prefix('caret'),
|
|
119
|
-
spin:
|
|
123
|
+
spin: loading
|
|
120
124
|
}) : null);
|
|
121
125
|
};
|
|
122
126
|
|
package/esm/Cascader/utils.d.ts
CHANGED
|
@@ -1,23 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
declare type GetColumnsAndPathsOptions<T> = {
|
|
2
|
+
getParent: (item: T) => T | undefined;
|
|
3
|
+
getChildren: (item: T) => readonly T[] | undefined;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Calculate columns to be displayed:
|
|
7
|
+
*
|
|
8
|
+
* - Every ancestor level of activeItem should be displayed
|
|
9
|
+
* - The level that activeItem is at should be displayed
|
|
10
|
+
* - If activeItem is a parent node, its child level should be displayed
|
|
11
|
+
*
|
|
12
|
+
* @param items
|
|
13
|
+
* @param value
|
|
14
|
+
* @param options
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
export declare function getColumnsAndPaths<T extends Record<string, unknown>>(items: readonly T[], pathTarget: T | undefined, options: GetColumnsAndPathsOptions<T>): {
|
|
18
|
+
columns: (readonly T[])[];
|
|
19
|
+
path: T[];
|
|
5
20
|
};
|
|
6
21
|
declare type UsePathsParams<T> = {
|
|
7
22
|
data: T[];
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The item where the focus is on
|
|
25
|
+
*/
|
|
26
|
+
activeItem: T | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* The item selected by Cascader's value
|
|
29
|
+
*/
|
|
30
|
+
selectedItem: T | undefined;
|
|
31
|
+
getParent: (item: T) => T | undefined;
|
|
32
|
+
getChildren: (item: T) => readonly T[] | undefined;
|
|
11
33
|
};
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Caculate following 3 things
|
|
36
|
+
*
|
|
37
|
+
* - The columns of items to be displayed
|
|
38
|
+
* - The path towards the current focused item
|
|
39
|
+
* - The path towards the current selected item (referred to by Cascader's value)
|
|
40
|
+
*
|
|
41
|
+
* @param params
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
export declare function usePaths<T extends Record<string, unknown>>({ data, activeItem, selectedItem, getParent, getChildren }: UsePathsParams<T>): {
|
|
45
|
+
columnsToDisplay: (readonly T[])[];
|
|
46
|
+
pathTowardsSelectedItem: T[];
|
|
47
|
+
pathTowardsActiveItem: T[];
|
|
22
48
|
};
|
|
49
|
+
/**
|
|
50
|
+
* Returns a WeakMap that maps each item in `items` to its parent
|
|
51
|
+
* indicated by `getChildren` function
|
|
52
|
+
*/
|
|
53
|
+
export declare function getParentMap<T extends Record<string, unknown>>(items: readonly T[], getChildren: (item: T) => readonly T[] | undefined): WeakMap<T, T>;
|
|
54
|
+
/**
|
|
55
|
+
* Returns an array indicating the hirearchy path from root towards `target` item
|
|
56
|
+
*/
|
|
57
|
+
export declare function getPathTowardsItem<T>(target: T | undefined, getParent: (item: T) => T | undefined): T[];
|
|
23
58
|
export {};
|