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.
Files changed (63) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/Dropdown/styles/mixin.less +0 -1
  3. package/Nav/styles/index.less +10 -11
  4. package/SelectPicker/styles/index.less +8 -4
  5. package/cjs/Calendar/Calendar.d.ts +6 -1
  6. package/cjs/Calendar/Calendar.js +12 -13
  7. package/cjs/Calendar/CalendarContainer.d.ts +2 -0
  8. package/cjs/Calendar/CalendarContainer.js +4 -2
  9. package/cjs/Calendar/TableRow.js +6 -3
  10. package/cjs/Calendar/types.d.ts +1 -0
  11. package/cjs/SelectPicker/Listbox.d.ts +34 -0
  12. package/cjs/SelectPicker/Listbox.js +263 -0
  13. package/cjs/SelectPicker/ListboxOption.d.ts +11 -0
  14. package/cjs/SelectPicker/ListboxOption.js +50 -0
  15. package/cjs/SelectPicker/ListboxOptionGroup.d.ts +9 -0
  16. package/cjs/SelectPicker/ListboxOptionGroup.js +69 -0
  17. package/cjs/SelectPicker/SelectPicker.js +33 -36
  18. package/cjs/Windowing/List.d.ts +2 -2
  19. package/cjs/locales/index.d.ts +1 -0
  20. package/cjs/locales/index.js +6 -2
  21. package/cjs/locales/ne_NP.d.ts +117 -0
  22. package/cjs/locales/ne_NP.js +89 -0
  23. package/cjs/utils/getDataGroupBy.d.ts +23 -0
  24. package/cjs/utils/getDataGroupBy.js +33 -0
  25. package/dist/rsuite-no-reset-rtl.css +22 -15
  26. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  27. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  28. package/dist/rsuite-no-reset.css +22 -15
  29. package/dist/rsuite-no-reset.min.css +1 -1
  30. package/dist/rsuite-no-reset.min.css.map +1 -1
  31. package/dist/rsuite-rtl.css +22 -15
  32. package/dist/rsuite-rtl.min.css +1 -1
  33. package/dist/rsuite-rtl.min.css.map +1 -1
  34. package/dist/rsuite.css +22 -15
  35. package/dist/rsuite.js +39 -6
  36. package/dist/rsuite.js.map +1 -1
  37. package/dist/rsuite.min.css +1 -1
  38. package/dist/rsuite.min.css.map +1 -1
  39. package/dist/rsuite.min.js +1 -1
  40. package/dist/rsuite.min.js.map +1 -1
  41. package/esm/Calendar/Calendar.d.ts +6 -1
  42. package/esm/Calendar/Calendar.js +12 -13
  43. package/esm/Calendar/CalendarContainer.d.ts +2 -0
  44. package/esm/Calendar/CalendarContainer.js +4 -2
  45. package/esm/Calendar/TableRow.js +6 -3
  46. package/esm/Calendar/types.d.ts +1 -0
  47. package/esm/SelectPicker/Listbox.d.ts +34 -0
  48. package/esm/SelectPicker/Listbox.js +240 -0
  49. package/esm/SelectPicker/ListboxOption.d.ts +11 -0
  50. package/esm/SelectPicker/ListboxOption.js +37 -0
  51. package/esm/SelectPicker/ListboxOptionGroup.d.ts +9 -0
  52. package/esm/SelectPicker/ListboxOptionGroup.js +53 -0
  53. package/esm/SelectPicker/SelectPicker.js +33 -36
  54. package/esm/Windowing/List.d.ts +2 -2
  55. package/esm/locales/index.d.ts +1 -0
  56. package/esm/locales/index.js +2 -1
  57. package/esm/locales/ne_NP.d.ts +117 -0
  58. package/esm/locales/ne_NP.js +79 -0
  59. package/esm/utils/getDataGroupBy.d.ts +23 -0
  60. package/esm/utils/getDataGroupBy.js +32 -0
  61. package/locales/ne_NP/package.json +7 -0
  62. package/package.json +1 -1
  63. 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
@@ -39,7 +39,6 @@
39
39
  padding-right: @dropdown-toggle-padding-right;
40
40
  // Fixed: Content is not centered when customizing renderTitle.
41
41
  display: inline-block;
42
- cursor: pointer;
43
42
  }
44
43
 
45
44
  // Horizontal dividers
@@ -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-item,
116
- .rs-dropdown {
117
- .rs-nav-horizontal > & {
118
- display: inline-block;
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
- /** Callback fired before the month changed */
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;
@@ -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
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "bordered", "className", "classPrefix", "compact", "defaultValue", "isoWeek", "locale", "onChange", "onMonthChange", "onSelect", "renderCell", "value"]);
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
- }, [setCalendarDate, onChange]);
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]); // Trigger onMonthChange when the month changes
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
- onMoveForward: handleMonthChange,
112
- onMoveBackward: handleMonthChange,
113
- onChangeMonth: handleMonthChange,
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), {
@@ -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", {
@@ -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;