rsuite 5.37.4 → 5.39.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 +25 -0
- package/Dropdown/styles/mixin.less +0 -1
- package/Nav/styles/index.less +10 -11
- package/SelectPicker/styles/index.less +8 -4
- package/cjs/Calendar/Calendar.d.ts +6 -1
- package/cjs/Calendar/Calendar.js +12 -13
- package/cjs/Calendar/CalendarContainer.d.ts +2 -0
- package/cjs/Calendar/CalendarContainer.js +4 -2
- package/cjs/Calendar/TableRow.js +6 -3
- package/cjs/Calendar/types.d.ts +1 -0
- package/cjs/SelectPicker/Listbox.d.ts +34 -0
- package/cjs/SelectPicker/Listbox.js +263 -0
- package/cjs/SelectPicker/ListboxOption.d.ts +11 -0
- package/cjs/SelectPicker/ListboxOption.js +50 -0
- package/cjs/SelectPicker/ListboxOptionGroup.d.ts +9 -0
- package/cjs/SelectPicker/ListboxOptionGroup.js +69 -0
- package/cjs/SelectPicker/SelectPicker.js +33 -36
- package/cjs/Windowing/List.d.ts +2 -2
- package/cjs/locales/index.d.ts +1 -0
- package/cjs/locales/index.js +6 -2
- package/cjs/locales/ne_NP.d.ts +117 -0
- package/cjs/locales/ne_NP.js +89 -0
- package/cjs/utils/getDataGroupBy.d.ts +23 -0
- package/cjs/utils/getDataGroupBy.js +33 -0
- package/dist/rsuite-no-reset-rtl.css +22 -15
- 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 +22 -15
- package/dist/rsuite-no-reset.min.css +1 -1
- package/dist/rsuite-no-reset.min.css.map +1 -1
- package/dist/rsuite-rtl.css +22 -15
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +22 -15
- package/dist/rsuite.js +39 -6
- 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 +6 -1
- package/esm/Calendar/Calendar.js +12 -13
- package/esm/Calendar/CalendarContainer.d.ts +2 -0
- package/esm/Calendar/CalendarContainer.js +4 -2
- package/esm/Calendar/TableRow.js +6 -3
- package/esm/Calendar/types.d.ts +1 -0
- package/esm/SelectPicker/Listbox.d.ts +34 -0
- package/esm/SelectPicker/Listbox.js +240 -0
- package/esm/SelectPicker/ListboxOption.d.ts +11 -0
- package/esm/SelectPicker/ListboxOption.js +37 -0
- package/esm/SelectPicker/ListboxOptionGroup.d.ts +9 -0
- package/esm/SelectPicker/ListboxOptionGroup.js +53 -0
- package/esm/SelectPicker/SelectPicker.js +33 -36
- package/esm/Windowing/List.d.ts +2 -2
- package/esm/locales/index.d.ts +1 -0
- package/esm/locales/index.js +2 -1
- package/esm/locales/ne_NP.d.ts +117 -0
- package/esm/locales/ne_NP.js +79 -0
- package/esm/utils/getDataGroupBy.d.ts +23 -0
- package/esm/utils/getDataGroupBy.js +32 -0
- package/locales/ne_NP/package.json +7 -0
- package/package.json +1 -1
- package/styles/mixins/listbox.less +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
# [5.39.0](https://github.com/rsuite/rsuite/compare/v5.38.0...v5.39.0) (2023-09-04)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
- **Nav.Item:** fix vertical mis-alignment of icon ([#3344](https://github.com/rsuite/rsuite/issues/3344)) ([283c013](https://github.com/rsuite/rsuite/commit/283c013b656e19f12ec9b628af83fb1798bc5086))
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- **i18n:** Create ne_NP.ts for Nepali Locale Support. ([#3351](https://github.com/rsuite/rsuite/issues/3351)) ([4b16982](https://github.com/rsuite/rsuite/commit/4b16982b5ac5cec06d9eb707b1ba37ae616cf19f))
|
|
10
|
+
|
|
11
|
+
### Reverts
|
|
12
|
+
|
|
13
|
+
- Revert "ci: run ci check on \*.x branches" ([0a98b0c](https://github.com/rsuite/rsuite/commit/0a98b0c765270923f321f1d859ccebbf7adeed37))
|
|
14
|
+
|
|
15
|
+
# [5.38.0](https://github.com/rsuite/rsuite/compare/v5.37.4...v5.38.0) (2023-08-18)
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
- **Calendar:** fix onMonthChange not fired when clicking on dates ([#3335](https://github.com/rsuite/rsuite/issues/3335)) ([035d287](https://github.com/rsuite/rsuite/commit/035d287c0f998e1f1aeed62dca7d2cfeded46167))
|
|
20
|
+
- **InputPicker:** cursor should be text ([#3334](https://github.com/rsuite/rsuite/issues/3334)) ([eed2337](https://github.com/rsuite/rsuite/commit/eed2337546665878c51cf3d88d0801c8a37a908d))
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
- **Calendar:** add cellClassName prop ([#3336](https://github.com/rsuite/rsuite/issues/3336)) ([cb7c2ae](https://github.com/rsuite/rsuite/commit/cb7c2aee30985219cb0d29155a3ae3d2f739d1d2)), closes [#3333](https://github.com/rsuite/rsuite/issues/3333)
|
|
25
|
+
|
|
1
26
|
## [5.37.4](https://github.com/rsuite/rsuite/compare/v5.37.3...v5.37.4) (2023-08-11)
|
|
2
27
|
|
|
3
28
|
### Bug Fixes
|
package/Nav/styles/index.less
CHANGED
|
@@ -98,6 +98,12 @@
|
|
|
98
98
|
.rs-nav-horizontal {
|
|
99
99
|
white-space: nowrap;
|
|
100
100
|
|
|
101
|
+
> .rs-nav-item {
|
|
102
|
+
display: inline-flex;
|
|
103
|
+
align-items: center;
|
|
104
|
+
vertical-align: top;
|
|
105
|
+
}
|
|
106
|
+
|
|
101
107
|
// Waterline
|
|
102
108
|
.rs-nav-bar {
|
|
103
109
|
position: absolute;
|
|
@@ -112,19 +118,12 @@
|
|
|
112
118
|
}
|
|
113
119
|
}
|
|
114
120
|
|
|
115
|
-
.rs-nav-
|
|
116
|
-
.rs-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
vertical-align: top;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
.rs-nav-vertical > & {
|
|
123
|
-
display: block;
|
|
121
|
+
.rs-nav-vertical {
|
|
122
|
+
> .rs-nav-item {
|
|
123
|
+
display: flex;
|
|
124
|
+
align-items: center;
|
|
124
125
|
}
|
|
125
|
-
}
|
|
126
126
|
|
|
127
|
-
.rs-nav-vertical {
|
|
128
127
|
> .rs-dropdown {
|
|
129
128
|
width: 100%;
|
|
130
129
|
|
|
@@ -11,10 +11,6 @@
|
|
|
11
11
|
.picker-menu-group-common(picker);
|
|
12
12
|
.picker-menu-group-title(picker);
|
|
13
13
|
.picker-menu-group-closed(picker);
|
|
14
|
-
|
|
15
|
-
.rs-picker-menu-group ~ [role='option'] > .rs-picker-select-menu-item {
|
|
16
|
-
padding-left: 26px;
|
|
17
|
-
}
|
|
18
14
|
}
|
|
19
15
|
|
|
20
16
|
// Menu item (the option)
|
|
@@ -45,3 +41,11 @@
|
|
|
45
41
|
padding-left: @picker-group-children-padding-left;
|
|
46
42
|
}
|
|
47
43
|
}
|
|
44
|
+
|
|
45
|
+
.rs-picker-menu-group .rs-picker-select-menu-item {
|
|
46
|
+
padding-left: @picker-group-children-padding-left;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.rs-picker-menu-group.folded [role='option'] {
|
|
50
|
+
display: none;
|
|
51
|
+
}
|
|
@@ -17,12 +17,17 @@ export interface CalendarProps extends WithAsProps {
|
|
|
17
17
|
locale?: CalendarLocale;
|
|
18
18
|
/** Callback fired before the value changed */
|
|
19
19
|
onChange?: (date: Date) => void;
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Callback fired before the month changed
|
|
22
|
+
* @todo-Doma Change signature to `onMonthChange(year: number, month: number, reason: string)`?
|
|
23
|
+
*/
|
|
21
24
|
onMonthChange?: (date: Date) => void;
|
|
22
25
|
/** Callback fired before the date selected */
|
|
23
26
|
onSelect?: (date: Date) => void;
|
|
24
27
|
/** Custom render calendar cells */
|
|
25
28
|
renderCell?: (date: Date) => React.ReactNode;
|
|
29
|
+
/** Custom cell classes base on it's date */
|
|
30
|
+
cellClassName?: (date: Date) => string | undefined;
|
|
26
31
|
}
|
|
27
32
|
declare const Calendar: RsRefForwardingComponent<typeof CalendarContainer, CalendarProps>;
|
|
28
33
|
export default Calendar;
|
package/cjs/Calendar/Calendar.js
CHANGED
|
@@ -44,7 +44,8 @@ var Calendar = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
44
44
|
onSelect = props.onSelect,
|
|
45
45
|
renderCell = props.renderCell,
|
|
46
46
|
value = props.value,
|
|
47
|
-
|
|
47
|
+
cellClassName = props.cellClassName,
|
|
48
|
+
rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "bordered", "className", "classPrefix", "compact", "defaultValue", "isoWeek", "locale", "onChange", "onMonthChange", "onSelect", "renderCell", "value", "cellClassName"]);
|
|
48
49
|
|
|
49
50
|
var _useCalendarDate = (0, _useCalendarDate2.default)(value, defaultValue),
|
|
50
51
|
calendarDate = _useCalendarDate.calendarDate,
|
|
@@ -56,21 +57,18 @@ var Calendar = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
56
57
|
var handleChange = (0, _react.useCallback)(function (nextValue) {
|
|
57
58
|
setCalendarDate(nextValue);
|
|
58
59
|
onChange === null || onChange === void 0 ? void 0 : onChange(nextValue);
|
|
59
|
-
|
|
60
|
+
|
|
61
|
+
if (!(0, _isSameMonth.default)(nextValue, calendarDate)) {
|
|
62
|
+
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(nextValue);
|
|
63
|
+
}
|
|
64
|
+
}, [setCalendarDate, onChange, calendarDate, onMonthChange]);
|
|
60
65
|
var handleClickToday = (0, _react.useCallback)(function () {
|
|
61
66
|
handleChange(new Date());
|
|
62
67
|
}, [handleChange]);
|
|
63
68
|
var handleSelect = (0, _react.useCallback)(function (nextValue) {
|
|
64
69
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(nextValue);
|
|
65
70
|
handleChange(nextValue);
|
|
66
|
-
}, [handleChange, onSelect]);
|
|
67
|
-
|
|
68
|
-
var handleMonthChange = (0, _react.useCallback)(function (nextValue) {
|
|
69
|
-
if (!(0, _isSameMonth.default)(nextValue, calendarDate)) {
|
|
70
|
-
handleChange(nextValue);
|
|
71
|
-
onMonthChange === null || onMonthChange === void 0 ? void 0 : onMonthChange(nextValue);
|
|
72
|
-
}
|
|
73
|
-
}, [calendarDate, handleChange, onMonthChange]);
|
|
71
|
+
}, [handleChange, onSelect]);
|
|
74
72
|
|
|
75
73
|
var _useClassNames = (0, _utils.useClassNames)(classPrefix),
|
|
76
74
|
prefix = _useClassNames.prefix,
|
|
@@ -108,9 +106,10 @@ var Calendar = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
108
106
|
},
|
|
109
107
|
renderToolbar: renderToolbar,
|
|
110
108
|
renderCell: customRenderCell,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
cellClassName: cellClassName,
|
|
110
|
+
onMoveForward: handleChange,
|
|
111
|
+
onMoveBackward: handleChange,
|
|
112
|
+
onChangeMonth: handleChange,
|
|
114
113
|
onSelect: handleSelect
|
|
115
114
|
}));
|
|
116
115
|
});
|
|
@@ -52,6 +52,8 @@ export interface CalendarProps extends WithAsProps, Omit<HTMLAttributes<HTMLDivE
|
|
|
52
52
|
onSelect?: (date: Date, event: React.MouseEvent) => void;
|
|
53
53
|
/** Custom rendering cell*/
|
|
54
54
|
renderCell?: (date: Date) => React.ReactNode;
|
|
55
|
+
/** Custom cell classes base on it's date */
|
|
56
|
+
cellClassName?: (date: Date) => string | undefined;
|
|
55
57
|
/** Called when opening the month view */
|
|
56
58
|
onToggleMonthDropdown?: (toggle: boolean) => void;
|
|
57
59
|
/** Called when opening the time view */
|
|
@@ -63,13 +63,14 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
|
|
|
63
63
|
onToggleMonthDropdown = props.onToggleMonthDropdown,
|
|
64
64
|
onToggleTimeDropdown = props.onToggleTimeDropdown,
|
|
65
65
|
calendarDate = props.calendarDate,
|
|
66
|
+
cellClassName = props.cellClassName,
|
|
66
67
|
renderCell = props.renderCell,
|
|
67
68
|
renderTitle = props.renderTitle,
|
|
68
69
|
renderToolbar = props.renderToolbar,
|
|
69
70
|
showMeridian = props.showMeridian,
|
|
70
71
|
showWeekNumbers = props.showWeekNumbers,
|
|
71
72
|
inline = props.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
|
+
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", "cellClassName", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
|
|
73
74
|
|
|
74
75
|
var _useClassNames = (0, _utils.useClassNames)(classPrefix),
|
|
75
76
|
withClassPrefix = _useClassNames.withClassPrefix,
|
|
@@ -155,11 +156,12 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
|
|
|
155
156
|
onChangeTime: onChangeTime,
|
|
156
157
|
onMouseMove: onMouseMove,
|
|
157
158
|
onSelect: onSelect,
|
|
159
|
+
cellClassName: cellClassName,
|
|
158
160
|
renderCell: renderCell,
|
|
159
161
|
showWeekNumbers: showWeekNumbers,
|
|
160
162
|
inline: inline
|
|
161
163
|
};
|
|
162
|
-
}, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
|
|
164
|
+
}, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, cellClassName, renderCell, showWeekNumbers]);
|
|
163
165
|
return /*#__PURE__*/_react.default.createElement(_CalendarContext.CalendarProvider, {
|
|
164
166
|
value: contextValue
|
|
165
167
|
}, /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, (0, _dateUtils.omitHideDisabledProps)(rest), {
|
package/cjs/Calendar/TableRow.js
CHANGED
|
@@ -41,6 +41,7 @@ var TableRow = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
41
41
|
isoWeek = _useCalendarContext.isoWeek,
|
|
42
42
|
onMouseMove = _useCalendarContext.onMouseMove,
|
|
43
43
|
onSelect = _useCalendarContext.onSelect,
|
|
44
|
+
cellClassName = _useCalendarContext.cellClassName,
|
|
44
45
|
renderCell = _useCalendarContext.renderCell,
|
|
45
46
|
overrideLocale = _useCalendarContext.locale,
|
|
46
47
|
showWeekNumbers = _useCalendarContext.showWeekNumbers;
|
|
@@ -89,7 +90,9 @@ var TableRow = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
89
90
|
|
|
90
91
|
var isEndSelected = !unSameMonth && selectedEndDate && _utils.DateUtils.isSameDay(thisDate, selectedEndDate);
|
|
91
92
|
|
|
92
|
-
var isSelected = isRangeSelectionMode ? isStartSelected || isEndSelected : _utils.DateUtils.isSameDay(thisDate, selected);
|
|
93
|
+
var isSelected = isRangeSelectionMode ? isStartSelected || isEndSelected : _utils.DateUtils.isSameDay(thisDate, selected); // TODO-Doma Move those logic that's for DatePicker/DateRangePicker to a separate component
|
|
94
|
+
// Calendar is not supposed to be reused this way
|
|
95
|
+
|
|
93
96
|
var inRange = false; // for Selected
|
|
94
97
|
|
|
95
98
|
if (selectedStartDate && selectedEndDate) {
|
|
@@ -113,7 +116,7 @@ var TableRow = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
113
116
|
}
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
var _classes = prefix('cell', {
|
|
119
|
+
var _classes = merge(prefix('cell', {
|
|
117
120
|
'cell-un-same-month': unSameMonth,
|
|
118
121
|
'cell-is-today': isToday,
|
|
119
122
|
'cell-selected': isSelected,
|
|
@@ -121,7 +124,7 @@ var TableRow = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
|
121
124
|
'cell-selected-end': isEndSelected,
|
|
122
125
|
'cell-in-range': !unSameMonth && inRange,
|
|
123
126
|
'cell-disabled': disabled
|
|
124
|
-
});
|
|
127
|
+
}), cellClassName === null || cellClassName === void 0 ? void 0 : cellClassName(thisDate));
|
|
125
128
|
|
|
126
129
|
var title = formatDate ? formatDate(thisDate, formatStr) : _utils.DateUtils.format(thisDate, formatStr);
|
|
127
130
|
days.push( /*#__PURE__*/_react.default.createElement("div", {
|
package/cjs/Calendar/types.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface CalendarInnerContextValue {
|
|
|
13
13
|
onMouseMove?: (date: Date) => void;
|
|
14
14
|
onSelect?: (date: Date, event: React.MouseEvent) => void;
|
|
15
15
|
renderCell?: (date: Date) => React.ReactNode;
|
|
16
|
+
cellClassName?: (date: Date) => string | undefined;
|
|
16
17
|
showWeekNumbers?: boolean;
|
|
17
18
|
inline?: boolean;
|
|
18
19
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ListProps, ListHandle } from '../Windowing';
|
|
3
|
+
import { CompareFn, Group } from '../utils/getDataGroupBy';
|
|
4
|
+
import { StandardProps } from '../@types/common';
|
|
5
|
+
interface ListboxProps<T, K> extends StandardProps, Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {
|
|
6
|
+
classPrefix: string;
|
|
7
|
+
options: readonly T[];
|
|
8
|
+
getOptionKey?: (option: T) => K;
|
|
9
|
+
sort?: <B extends boolean>(isGroup: B) => B extends true ? CompareFn<Group<T>> : CompareFn<T>;
|
|
10
|
+
groupBy?: string;
|
|
11
|
+
disabledOptionKeys?: readonly K[];
|
|
12
|
+
selectedOptionKey?: K;
|
|
13
|
+
activeOptionKey?: K;
|
|
14
|
+
maxHeight?: number;
|
|
15
|
+
labelKey?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
optionClassPrefix?: string;
|
|
19
|
+
rowHeight?: number;
|
|
20
|
+
rowGroupHeight?: number;
|
|
21
|
+
virtualized?: boolean;
|
|
22
|
+
listProps?: Partial<ListProps>;
|
|
23
|
+
listRef?: React.Ref<ListHandle>;
|
|
24
|
+
/** Custom selected option */
|
|
25
|
+
renderMenuItem?: (itemLabel: React.ReactNode, item: any) => React.ReactNode;
|
|
26
|
+
renderMenuGroup?: (title: React.ReactNode, item: any) => React.ReactNode;
|
|
27
|
+
onSelect?: (value: K, item: T, event: React.MouseEvent) => void;
|
|
28
|
+
onGroupTitleClick?: (event: React.MouseEvent) => void;
|
|
29
|
+
}
|
|
30
|
+
declare type ListboxComponent = <T, K>(p: ListboxProps<T, K> & {
|
|
31
|
+
ref?: React.ForwardedRef<HTMLDivElement>;
|
|
32
|
+
}) => JSX.Element;
|
|
33
|
+
declare const Listbox: ListboxComponent;
|
|
34
|
+
export default Listbox;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
4
|
+
|
|
5
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
6
|
+
|
|
7
|
+
exports.__esModule = true;
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
|
|
10
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
|
+
|
|
12
|
+
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
|
|
16
|
+
var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
|
|
17
|
+
|
|
18
|
+
var _getPosition = _interopRequireDefault(require("dom-lib/getPosition"));
|
|
19
|
+
|
|
20
|
+
var _scrollTop = _interopRequireDefault(require("dom-lib/scrollTop"));
|
|
21
|
+
|
|
22
|
+
var _getHeight = _interopRequireDefault(require("dom-lib/getHeight"));
|
|
23
|
+
|
|
24
|
+
var _Windowing = require("../Windowing");
|
|
25
|
+
|
|
26
|
+
var _shallowEqual = _interopRequireDefault(require("../utils/shallowEqual"));
|
|
27
|
+
|
|
28
|
+
var _utils = require("../utils");
|
|
29
|
+
|
|
30
|
+
var _ListboxOptionGroup = _interopRequireDefault(require("./ListboxOptionGroup"));
|
|
31
|
+
|
|
32
|
+
var _getDataGroupBy = require("../utils/getDataGroupBy");
|
|
33
|
+
|
|
34
|
+
var _ListboxOption = _interopRequireDefault(require("./ListboxOption"));
|
|
35
|
+
|
|
36
|
+
var Listbox = /*#__PURE__*/_react.default.forwardRef(function Listbox(props, ref) {
|
|
37
|
+
var _props$options = props.options,
|
|
38
|
+
options = _props$options === void 0 ? [] : _props$options,
|
|
39
|
+
getOptionKey = props.getOptionKey,
|
|
40
|
+
groupBy = props.groupBy,
|
|
41
|
+
sort = props.sort,
|
|
42
|
+
_props$maxHeight = props.maxHeight,
|
|
43
|
+
maxHeight = _props$maxHeight === void 0 ? 320 : _props$maxHeight,
|
|
44
|
+
selectedOptionKey = props.selectedOptionKey,
|
|
45
|
+
_props$disabledOption = props.disabledOptionKeys,
|
|
46
|
+
disabledOptionKeys = _props$disabledOption === void 0 ? [] : _props$disabledOption,
|
|
47
|
+
_props$classPrefix = props.classPrefix,
|
|
48
|
+
classPrefix = _props$classPrefix === void 0 ? 'dropdown-menu' : _props$classPrefix,
|
|
49
|
+
_props$labelKey = props.labelKey,
|
|
50
|
+
labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
|
|
51
|
+
virtualized = props.virtualized,
|
|
52
|
+
listProps = props.listProps,
|
|
53
|
+
virtualizedListRef = props.listRef,
|
|
54
|
+
className = props.className,
|
|
55
|
+
style = props.style,
|
|
56
|
+
activeOptionKey = props.activeOptionKey,
|
|
57
|
+
optionClassPrefix = props.optionClassPrefix,
|
|
58
|
+
_props$rowHeight = props.rowHeight,
|
|
59
|
+
rowHeight = _props$rowHeight === void 0 ? 36 : _props$rowHeight,
|
|
60
|
+
_props$rowGroupHeight = props.rowGroupHeight,
|
|
61
|
+
rowGroupHeight = _props$rowGroupHeight === void 0 ? 48 : _props$rowGroupHeight,
|
|
62
|
+
renderMenuGroup = props.renderMenuGroup,
|
|
63
|
+
renderMenuItem = props.renderMenuItem,
|
|
64
|
+
onGroupTitleClick = props.onGroupTitleClick,
|
|
65
|
+
onSelect = props.onSelect,
|
|
66
|
+
rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["options", "getOptionKey", "groupBy", "sort", "maxHeight", "selectedOptionKey", "disabledOptionKeys", "classPrefix", "labelKey", "virtualized", "listProps", "listRef", "className", "style", "activeOptionKey", "optionClassPrefix", "rowHeight", "rowGroupHeight", "renderMenuGroup", "renderMenuItem", "onGroupTitleClick", "onSelect"]);
|
|
67
|
+
var group = typeof groupBy !== 'undefined';
|
|
68
|
+
|
|
69
|
+
var _useClassNames = (0, _utils.useClassNames)(classPrefix),
|
|
70
|
+
withClassPrefix = _useClassNames.withClassPrefix,
|
|
71
|
+
prefix = _useClassNames.prefix,
|
|
72
|
+
merge = _useClassNames.merge;
|
|
73
|
+
|
|
74
|
+
var classes = merge(className, withClassPrefix('items', {
|
|
75
|
+
grouped: group
|
|
76
|
+
}));
|
|
77
|
+
var menuBodyContainerRef = (0, _react.useRef)(null);
|
|
78
|
+
var listRef = (0, _react.useRef)(null);
|
|
79
|
+
|
|
80
|
+
var _useState = (0, _react.useState)([]),
|
|
81
|
+
foldedGroupKeys = _useState[0],
|
|
82
|
+
setFoldedGroupKeys = _useState[1];
|
|
83
|
+
|
|
84
|
+
var handleGroupTitleClick = (0, _react.useCallback)(function (key, event) {
|
|
85
|
+
var _listRef$current;
|
|
86
|
+
|
|
87
|
+
var nextGroupKeys = foldedGroupKeys.filter(function (item) {
|
|
88
|
+
return item !== key;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
if (nextGroupKeys.length === foldedGroupKeys.length) {
|
|
92
|
+
nextGroupKeys.push(key);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
setFoldedGroupKeys(nextGroupKeys);
|
|
96
|
+
onGroupTitleClick === null || onGroupTitleClick === void 0 ? void 0 : onGroupTitleClick(event); // See example https://codesandbox.io/s/grouped-list-with-sticky-headers-shgok?fontsize=14&file=/index.js:1314-1381
|
|
97
|
+
|
|
98
|
+
(_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : _listRef$current.resetAfterIndex(0); // use group index to reduce calculation
|
|
99
|
+
}, [onGroupTitleClick, foldedGroupKeys]);
|
|
100
|
+
(0, _react.useEffect)(function () {
|
|
101
|
+
var container = menuBodyContainerRef.current;
|
|
102
|
+
|
|
103
|
+
if (!container) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
var activeItem = container.querySelector("." + prefix('item-focus'));
|
|
108
|
+
|
|
109
|
+
if (!activeItem) {
|
|
110
|
+
activeItem = container.querySelector("." + prefix('item-active'));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (!activeItem) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var position = (0, _getPosition.default)(activeItem, container);
|
|
118
|
+
var sTop = (0, _scrollTop.default)(container);
|
|
119
|
+
var sHeight = (0, _getHeight.default)(container);
|
|
120
|
+
|
|
121
|
+
if (sTop > position.top) {
|
|
122
|
+
(0, _scrollTop.default)(container, Math.max(0, position.top - 20));
|
|
123
|
+
} else if (position.top > sTop + sHeight) {
|
|
124
|
+
(0, _scrollTop.default)(container, Math.max(0, position.top - sHeight + 32));
|
|
125
|
+
}
|
|
126
|
+
}, [activeOptionKey, menuBodyContainerRef, prefix]);
|
|
127
|
+
(0, _utils.useMount)(function scrollToSelectedOption() {
|
|
128
|
+
if (virtualized && selectedOptionKey) {
|
|
129
|
+
if (typeof groupBy === 'undefined') {
|
|
130
|
+
var _listRef$current2;
|
|
131
|
+
|
|
132
|
+
var selectedOptionIndex = options.findIndex(function (option) {
|
|
133
|
+
return (getOptionKey === null || getOptionKey === void 0 ? void 0 : getOptionKey(option)) === selectedOptionKey;
|
|
134
|
+
});
|
|
135
|
+
(_listRef$current2 = listRef.current) === null || _listRef$current2 === void 0 ? void 0 : _listRef$current2.scrollToItem(selectedOptionIndex);
|
|
136
|
+
} else {
|
|
137
|
+
var _listRef$current3;
|
|
138
|
+
|
|
139
|
+
var groups = (0, _getDataGroupBy.groupOptions)(options, groupBy, sort === null || sort === void 0 ? void 0 : sort(false), sort === null || sort === void 0 ? void 0 : sort(true));
|
|
140
|
+
var selectedGroupIndex = groups.findIndex(function (group) {
|
|
141
|
+
return group.key === selectedOptionKey;
|
|
142
|
+
}); // TODO-Doma
|
|
143
|
+
// This only scrolls the list to the group, not to the selected item within the group
|
|
144
|
+
// .scrollToItem does not support specifying an px offset
|
|
145
|
+
// Find a way to scroll to the selected item within the group
|
|
146
|
+
|
|
147
|
+
(_listRef$current3 = listRef.current) === null || _listRef$current3 === void 0 ? void 0 : _listRef$current3.scrollToItem(selectedGroupIndex);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
var renderOption = (0, _react.useCallback)(function (option) {
|
|
152
|
+
var _getOptionKey;
|
|
153
|
+
|
|
154
|
+
var optionKey = (_getOptionKey = getOptionKey === null || getOptionKey === void 0 ? void 0 : getOptionKey(option)) !== null && _getOptionKey !== void 0 ? _getOptionKey : JSON.stringify(option);
|
|
155
|
+
var label = option[labelKey];
|
|
156
|
+
var disabled = disabledOptionKeys === null || disabledOptionKeys === void 0 ? void 0 : disabledOptionKeys.some(function (disabledValue) {
|
|
157
|
+
return (0, _shallowEqual.default)(disabledValue, optionKey);
|
|
158
|
+
});
|
|
159
|
+
var selected = (0, _shallowEqual.default)(selectedOptionKey, optionKey);
|
|
160
|
+
var focus = !(0, _isUndefined.default)(activeOptionKey) && (0, _shallowEqual.default)(activeOptionKey, optionKey);
|
|
161
|
+
return /*#__PURE__*/_react.default.createElement(_ListboxOption.default, {
|
|
162
|
+
key: optionKey,
|
|
163
|
+
disabled: disabled,
|
|
164
|
+
selected: selected,
|
|
165
|
+
active: focus,
|
|
166
|
+
"data-key": optionKey,
|
|
167
|
+
classPrefix: optionClassPrefix,
|
|
168
|
+
onClick: function onClick(event) {
|
|
169
|
+
if (!disabled) {
|
|
170
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect(optionKey, option, event);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}, renderMenuItem ? renderMenuItem(label, option) : label);
|
|
174
|
+
}, [getOptionKey, labelKey, disabledOptionKeys, selectedOptionKey, activeOptionKey, optionClassPrefix, renderMenuItem, onSelect]);
|
|
175
|
+
var renderOptions = (0, _react.useCallback)(function (options) {
|
|
176
|
+
return options.map(function (option) {
|
|
177
|
+
return renderOption(option);
|
|
178
|
+
});
|
|
179
|
+
}, [renderOption]);
|
|
180
|
+
var renderOptionGroup = (0, _react.useCallback)(function (group) {
|
|
181
|
+
var groupKey = group.key;
|
|
182
|
+
var expanded = !foldedGroupKeys.includes(groupKey);
|
|
183
|
+
return /*#__PURE__*/_react.default.createElement(_ListboxOptionGroup.default, {
|
|
184
|
+
key: groupKey,
|
|
185
|
+
title: renderMenuGroup ? renderMenuGroup(groupKey, group) : groupKey,
|
|
186
|
+
classPrefix: 'picker-menu-group',
|
|
187
|
+
expanded: expanded,
|
|
188
|
+
onClickTitle: function onClickTitle(e) {
|
|
189
|
+
return handleGroupTitleClick(group.key, e);
|
|
190
|
+
}
|
|
191
|
+
}, renderOptions(group.options));
|
|
192
|
+
}, [foldedGroupKeys, handleGroupTitleClick, renderMenuGroup, renderOptions]);
|
|
193
|
+
var renderOptionGroups = (0, _react.useCallback)(function (groupKey) {
|
|
194
|
+
var groups = (0, _getDataGroupBy.groupOptions)(options, groupKey, sort === null || sort === void 0 ? void 0 : sort(false), sort === null || sort === void 0 ? void 0 : sort(true));
|
|
195
|
+
return groups.map(function (group) {
|
|
196
|
+
return renderOptionGroup(group);
|
|
197
|
+
});
|
|
198
|
+
}, [options, renderOptionGroup, sort]);
|
|
199
|
+
var renderVirtualizedOptions = (0, _react.useCallback)(function () {
|
|
200
|
+
return /*#__PURE__*/_react.default.createElement(_Windowing.AutoSizer, {
|
|
201
|
+
defaultHeight: maxHeight,
|
|
202
|
+
style: {
|
|
203
|
+
width: 'auto',
|
|
204
|
+
height: 'auto'
|
|
205
|
+
}
|
|
206
|
+
}, function (_ref) {
|
|
207
|
+
var height = _ref.height;
|
|
208
|
+
return /*#__PURE__*/_react.default.createElement(_Windowing.List, (0, _extends2.default)({
|
|
209
|
+
ref: (0, _utils.mergeRefs)(listRef, virtualizedListRef),
|
|
210
|
+
height: height || maxHeight,
|
|
211
|
+
itemCount: options.length,
|
|
212
|
+
itemSize: rowHeight
|
|
213
|
+
}, listProps), function (_ref2) {
|
|
214
|
+
var index = _ref2.index;
|
|
215
|
+
return renderOption(options[index]);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}, [listProps, maxHeight, options, renderOption, rowHeight, virtualizedListRef]); // Example of rendering option groups in VariableSizeList
|
|
219
|
+
// https://github.com/bvaughn/react-window/issues/358
|
|
220
|
+
|
|
221
|
+
var renderVirtualizedOptionGroups = (0, _react.useCallback)(function (groupKey) {
|
|
222
|
+
var groups = (0, _getDataGroupBy.groupOptions)(options, groupKey, sort === null || sort === void 0 ? void 0 : sort(false), sort === null || sort === void 0 ? void 0 : sort(true));
|
|
223
|
+
return /*#__PURE__*/_react.default.createElement(_Windowing.AutoSizer, {
|
|
224
|
+
defaultHeight: maxHeight,
|
|
225
|
+
style: {
|
|
226
|
+
width: 'auto',
|
|
227
|
+
height: 'auto'
|
|
228
|
+
}
|
|
229
|
+
}, function (_ref3) {
|
|
230
|
+
var height = _ref3.height;
|
|
231
|
+
return /*#__PURE__*/_react.default.createElement(_Windowing.List, (0, _extends2.default)({
|
|
232
|
+
ref: (0, _utils.mergeRefs)(listRef, virtualizedListRef),
|
|
233
|
+
height: height || maxHeight,
|
|
234
|
+
itemCount: groups.length,
|
|
235
|
+
itemSize: function itemSize(index) {
|
|
236
|
+
var item = groups[index];
|
|
237
|
+
var expanded = !foldedGroupKeys.includes(item.key);
|
|
238
|
+
|
|
239
|
+
if (expanded) {
|
|
240
|
+
return item.options.length * rowHeight + rowGroupHeight;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return rowGroupHeight;
|
|
244
|
+
}
|
|
245
|
+
}, listProps), function (_ref4) {
|
|
246
|
+
var index = _ref4.index;
|
|
247
|
+
return renderOptionGroup(groups[index]);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
}, [foldedGroupKeys, listProps, maxHeight, options, renderOptionGroup, rowGroupHeight, rowHeight, sort, virtualizedListRef]);
|
|
251
|
+
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
|
|
252
|
+
role: "listbox"
|
|
253
|
+
}, rest, {
|
|
254
|
+
className: classes,
|
|
255
|
+
ref: (0, _utils.mergeRefs)(menuBodyContainerRef, ref),
|
|
256
|
+
style: (0, _extends2.default)({}, style, {
|
|
257
|
+
maxHeight: maxHeight
|
|
258
|
+
})
|
|
259
|
+
}), typeof groupBy === 'undefined' ? virtualized ? renderVirtualizedOptions() : renderOptions(options) : virtualized ? renderVirtualizedOptionGroups(groupBy) : renderOptionGroups(groupBy));
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
var _default = Listbox;
|
|
263
|
+
exports.default = _default;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StandardProps } from '../@types/common';
|
|
3
|
+
interface ListboxOptionProps extends StandardProps, React.HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
selected?: boolean;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
active?: boolean;
|
|
7
|
+
title?: string;
|
|
8
|
+
onKeyDown?: (event: React.KeyboardEvent) => void;
|
|
9
|
+
}
|
|
10
|
+
declare const ListboxOption: React.ForwardRefExoticComponent<ListboxOptionProps & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
export default ListboxOption;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
exports.__esModule = true;
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
|
|
10
|
+
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
|
|
14
|
+
var _utils = require("../utils");
|
|
15
|
+
|
|
16
|
+
var ListboxOption = /*#__PURE__*/_react.default.forwardRef(function ListboxOption(props, ref) {
|
|
17
|
+
var selected = props.selected,
|
|
18
|
+
_props$classPrefix = props.classPrefix,
|
|
19
|
+
classPrefix = _props$classPrefix === void 0 ? 'dropdown-menu-item' : _props$classPrefix,
|
|
20
|
+
children = props.children,
|
|
21
|
+
className = props.className,
|
|
22
|
+
disabled = props.disabled,
|
|
23
|
+
active = props.active,
|
|
24
|
+
onKeyDown = props.onKeyDown,
|
|
25
|
+
rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["selected", "classPrefix", "children", "className", "disabled", "active", "onKeyDown"]);
|
|
26
|
+
|
|
27
|
+
var _useClassNames = (0, _utils.useClassNames)(classPrefix),
|
|
28
|
+
withClassPrefix = _useClassNames.withClassPrefix;
|
|
29
|
+
|
|
30
|
+
var classes = withClassPrefix({
|
|
31
|
+
active: selected,
|
|
32
|
+
focus: active,
|
|
33
|
+
disabled: disabled
|
|
34
|
+
});
|
|
35
|
+
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
|
|
36
|
+
ref: ref,
|
|
37
|
+
role: "option",
|
|
38
|
+
"aria-selected": selected || undefined,
|
|
39
|
+
"aria-disabled": disabled
|
|
40
|
+
}, rest, {
|
|
41
|
+
className: className,
|
|
42
|
+
onKeyDown: disabled ? undefined : onKeyDown
|
|
43
|
+
}), /*#__PURE__*/_react.default.createElement("span", {
|
|
44
|
+
className: classes
|
|
45
|
+
}, children));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
ListboxOption.displayName = 'Listbox.Option';
|
|
49
|
+
var _default = ListboxOption;
|
|
50
|
+
exports.default = _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { StandardProps } from '../@types/common';
|
|
3
|
+
interface ListboxOptionGroupProps extends StandardProps, Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
4
|
+
title?: React.ReactNode;
|
|
5
|
+
expanded?: boolean;
|
|
6
|
+
onClickTitle?: React.MouseEventHandler;
|
|
7
|
+
}
|
|
8
|
+
declare const ListboxOptionGroup: React.ForwardRefExoticComponent<ListboxOptionGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
export default ListboxOptionGroup;
|