rsuite 5.0.0-beta.8 → 5.0.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 (58) hide show
  1. package/README.md +4 -4
  2. package/Sidenav/styles/index.less +99 -37
  3. package/cjs/@types/common.d.ts +2 -0
  4. package/cjs/DateRangePicker/Calendar.d.ts +2 -1
  5. package/cjs/DateRangePicker/Calendar.js +4 -3
  6. package/cjs/DateRangePicker/DateRangePicker.d.ts +1 -1
  7. package/cjs/DateRangePicker/DateRangePicker.js +58 -43
  8. package/cjs/DateRangePicker/utils.d.ts +1 -1
  9. package/cjs/DateRangePicker/utils.js +9 -5
  10. package/cjs/Dropdown/Dropdown.js +31 -18
  11. package/cjs/Dropdown/DropdownContext.d.ts +4 -1
  12. package/cjs/Dropdown/DropdownItem.js +31 -4
  13. package/cjs/Dropdown/DropdownState.d.ts +37 -0
  14. package/cjs/Dropdown/DropdownState.js +66 -0
  15. package/cjs/SelectPicker/SelectPicker.d.ts +1 -3
  16. package/cjs/Sidenav/SidenavDropdown.js +6 -1
  17. package/cjs/Sidenav/SidenavItem.js +4 -12
  18. package/cjs/utils/dateUtils.d.ts +1 -0
  19. package/cjs/utils/dateUtils.js +5 -1
  20. package/cjs/utils/useInternalId.d.ts +4 -0
  21. package/cjs/utils/useInternalId.js +24 -0
  22. package/cjs/utils/useUniqueId.d.ts +1 -1
  23. package/cjs/utils/useUniqueId.js +1 -1
  24. package/dist/rsuite-rtl.css +142 -72
  25. package/dist/rsuite-rtl.min.css +1 -1
  26. package/dist/rsuite-rtl.min.css.map +1 -1
  27. package/dist/rsuite.css +142 -72
  28. package/dist/rsuite.js +54 -10
  29. package/dist/rsuite.js.map +1 -1
  30. package/dist/rsuite.min.css +1 -1
  31. package/dist/rsuite.min.css.map +1 -1
  32. package/dist/rsuite.min.js +1 -1
  33. package/dist/rsuite.min.js.map +1 -1
  34. package/esm/@types/common.d.ts +2 -0
  35. package/esm/DateRangePicker/Calendar.d.ts +2 -1
  36. package/esm/DateRangePicker/Calendar.js +4 -3
  37. package/esm/DateRangePicker/DateRangePicker.d.ts +1 -1
  38. package/esm/DateRangePicker/DateRangePicker.js +27 -12
  39. package/esm/DateRangePicker/utils.d.ts +1 -1
  40. package/esm/DateRangePicker/utils.js +7 -3
  41. package/esm/Dropdown/Dropdown.js +30 -19
  42. package/esm/Dropdown/DropdownContext.d.ts +4 -1
  43. package/esm/Dropdown/DropdownItem.js +30 -6
  44. package/esm/Dropdown/DropdownState.d.ts +37 -0
  45. package/esm/Dropdown/DropdownState.js +55 -0
  46. package/esm/SelectPicker/SelectPicker.d.ts +1 -3
  47. package/esm/Sidenav/SidenavDropdown.js +5 -1
  48. package/esm/Sidenav/SidenavItem.js +4 -10
  49. package/esm/utils/dateUtils.d.ts +1 -0
  50. package/esm/utils/dateUtils.js +1 -0
  51. package/esm/utils/useInternalId.d.ts +4 -0
  52. package/esm/utils/useInternalId.js +16 -0
  53. package/esm/utils/useUniqueId.d.ts +1 -1
  54. package/esm/utils/useUniqueId.js +1 -1
  55. package/package.json +2 -2
  56. package/styles/color-modes/dark.less +16 -0
  57. package/styles/color-modes/high-contrast.less +17 -0
  58. package/styles/color-modes/light.less +16 -0
@@ -72,6 +72,8 @@ export interface PickerBaseProps<LocaleType = any> extends WithAsProps, Animatio
72
72
  defaultOpen?: boolean;
73
73
  /** A picker that can clear values */
74
74
  cleanable?: boolean;
75
+ /** A picker can have different sizes */
76
+ size?: TypeAttributes.Size;
75
77
  /** Called when Modal is displayed */
76
78
  onOpen?: () => void;
77
79
  /** Called when Modal is closed */
@@ -13,7 +13,8 @@ export interface CalendarProps extends WithAsProps, Omit<CalendarCoreProps, Omit
13
13
  isoWeek?: boolean;
14
14
  limitEndYear?: number;
15
15
  locale?: DatePickerLocale;
16
- onChangeCalendarDate?: (index: number, nextPageDate: Date) => void;
16
+ onChangeCalendarDate?: (index: number, date: Date) => void;
17
+ onChangeCalendarTime?: (index: number, date: Date) => void;
17
18
  onMouseMove?: (date: Date) => void;
18
19
  onSelect?: (date: Date, event?: React.SyntheticEvent<any>) => void;
19
20
  showOneCalendar?: boolean;
@@ -19,9 +19,10 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
19
19
  index = props.index,
20
20
  limitEndYear = props.limitEndYear,
21
21
  onChangeCalendarDate = props.onChangeCalendarDate,
22
+ onChangeCalendarTime = props.onChangeCalendarTime,
22
23
  showOneCalendar = props.showOneCalendar,
23
24
  value = props.value,
24
- rest = _objectWithoutPropertiesLoose(props, ["as", "calendarDate", "disabledDate", "index", "limitEndYear", "onChangeCalendarDate", "showOneCalendar", "value"]);
25
+ rest = _objectWithoutPropertiesLoose(props, ["as", "calendarDate", "disabledDate", "index", "limitEndYear", "onChangeCalendarDate", "onChangeCalendarTime", "showOneCalendar", "value"]);
25
26
 
26
27
  var _useState = useState(),
27
28
  calendarState = _useState[0],
@@ -38,8 +39,8 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
38
39
  setCalendarState(undefined);
39
40
  }, [index, onChangeCalendarDate]);
40
41
  var handleChangePageTime = useCallback(function (nextPageDate) {
41
- onChangeCalendarDate(index, nextPageDate);
42
- }, [index, onChangeCalendarDate]);
42
+ onChangeCalendarTime(index, nextPageDate);
43
+ }, [index, onChangeCalendarTime]);
43
44
  var toggleMonthDropdown = useCallback(function () {
44
45
  setCalendarState(calendarState === CalendarState.DROP_MONTH ? undefined : CalendarState.DROP_MONTH);
45
46
  }, [calendarState]);
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- import { PickerComponent } from '../Picker';
3
2
  import { FormControlBaseProps, PickerBaseProps } from '../@types/common';
3
+ import { PickerComponent } from '../Picker';
4
4
  import { DisabledDateFunction, RangeType, ValueType } from './types';
5
5
  export interface DateRangePickerProps extends PickerBaseProps, FormControlBaseProps<ValueType> {
6
6
  /** Configure shortcut options */
@@ -1,20 +1,20 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- import React, { useCallback, useEffect, useRef, useState } from 'react';
4
- import PropTypes from 'prop-types';
3
+ import IconCalendar from '@rsuite/icons/legacy/Calendar';
4
+ import isUndefined from 'lodash/isUndefined';
5
5
  import omit from 'lodash/omit';
6
+ import partial from 'lodash/partial';
6
7
  import pick from 'lodash/pick';
7
- import isUndefined from 'lodash/isUndefined';
8
- import { addMonths, compareAsc, isSameDay, isSameMonth } from '../utils/dateUtils';
9
- import * as disabledDateUtils from './disabledDateUtils';
8
+ import PropTypes from 'prop-types';
9
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
10
10
  import { FormattedDate } from '../CustomProvider';
11
11
  import Toolbar from '../DatePicker/Toolbar';
12
- import Calendar from './Calendar';
13
- import { getCalendarDate, getMonthHoverRange, getWeekHoverRange, setTimingMargin } from './utils';
12
+ import { omitTriggerPropKeys, pickerDefaultProps, PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
14
13
  import { createChainedFunction, DATERANGE_DISABLED_TARGET, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
15
- import { PickerOverlay, pickerDefaultProps, pickerPropTypes, usePublicMethods, useToggleKeyDownEvent, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, omitTriggerPropKeys, usePickerClassName } from '../Picker';
16
- import partial from 'lodash/partial';
17
- import IconCalendar from '@rsuite/icons/legacy/Calendar';
14
+ import { addMonths, compareAsc, isSameMonth } from '../utils/dateUtils';
15
+ import Calendar from './Calendar';
16
+ import * as disabledDateUtils from './disabledDateUtils';
17
+ import { getCalendarDate, getMonthHoverRange, getWeekHoverRange, isSameRange, setTimingMargin } from './utils';
18
18
 
19
19
  var defaultProps = _extends({}, pickerDefaultProps, {
20
20
  as: 'div',
@@ -234,7 +234,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
234
234
  var nextValue = !isUndefined(nextSelectValue) ? nextSelectValue : selectValue;
235
235
  setSelectValue(nextValue || []);
236
236
 
237
- if (!isSameDay(nextValue[0], value[0]) || !isSameDay(nextValue[1], value[1])) {
237
+ if (!isSameRange(nextValue, value, formatStr)) {
238
238
  setValue(nextValue);
239
239
  onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
240
240
  } // `closeOverlay` default value is `true`
@@ -243,7 +243,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
243
243
  if (closeOverlay !== false) {
244
244
  handleCloseDropdown();
245
245
  }
246
- }, [handleCloseDropdown, onChange, selectValue, setSelectValue, setValue, value]);
246
+ }, [formatStr, handleCloseDropdown, onChange, selectValue, setValue, value]);
247
247
  /**
248
248
  * Select the date range. If oneTap is not set, you need to click twice to select the start time and end time.
249
249
  * The MouseMove event is called between the first click and the second click to update the selection state.
@@ -332,6 +332,20 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
332
332
  nextCalendarDate[index] = date;
333
333
  updateCalendarDate(nextCalendarDate);
334
334
  }, [calendarDate, updateCalendarDate]);
335
+ var handleChangeCalendarTime = useCallback(function (index, date) {
336
+ setSelectValue(function (prev) {
337
+ var next = [].concat(prev);
338
+ var clonedDate = new Date(date.valueOf()); // if next[index] is not empty, only update the time after aligning the year, month and day
339
+
340
+ if (next[index]) {
341
+ clonedDate.setFullYear(next[index].getFullYear(), next[index].getMonth(), next[index].getDate());
342
+ }
343
+
344
+ next[index] = clonedDate;
345
+ return next;
346
+ });
347
+ handleChangeCalendarDate(index, date);
348
+ }, [handleChangeCalendarDate]);
335
349
  /**
336
350
  * Toolbar operation callback function
337
351
  */
@@ -496,6 +510,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
496
510
  showWeekNumbers: showWeekNumbers,
497
511
  value: selectValue,
498
512
  onChangeCalendarDate: handleChangeCalendarDate,
513
+ onChangeCalendarTime: handleChangeCalendarTime,
499
514
  onMouseMove: handleMouseMove,
500
515
  onSelect: handleSelectValueChange
501
516
  };
@@ -4,6 +4,6 @@ export declare function getCalendarDate({ value }: {
4
4
  value?: ValueType;
5
5
  }): ValueType;
6
6
  export declare const getDefaultRanges: () => RangeType[];
7
- export declare const isSameValueType: (source: ValueType, dest: ValueType) => boolean;
7
+ export declare const isSameRange: (source: ValueType, dest: ValueType, format: string) => boolean;
8
8
  export declare const getMonthHoverRange: (date: Date) => ValueType;
9
9
  export declare const getWeekHoverRange: (isoWeek: boolean, date: Date) => ValueType;
@@ -36,10 +36,14 @@ export var getDefaultRanges = function getDefaultRanges() {
36
36
  value: [setTimingMargin(DateUtils.subDays(todayDate, 6)), setTimingMargin(todayDate, 'right')]
37
37
  }];
38
38
  };
39
- export var isSameValueType = function isSameValueType(source, dest) {
40
- var _source$, _dest$, _source$2, _dest$2;
39
+ export var isSameRange = function isSameRange(source, dest, format) {
40
+ var result = DateUtils.isSameDay(source === null || source === void 0 ? void 0 : source[0], dest === null || dest === void 0 ? void 0 : dest[0]) && DateUtils.isSameDay(source === null || source === void 0 ? void 0 : source[1], dest === null || dest === void 0 ? void 0 : dest[1]);
41
41
 
42
- return (source === null || source === void 0 ? void 0 : (_source$ = source[0]) === null || _source$ === void 0 ? void 0 : _source$.valueOf()) === (dest === null || dest === void 0 ? void 0 : (_dest$ = dest[0]) === null || _dest$ === void 0 ? void 0 : _dest$.valueOf()) && (source === null || source === void 0 ? void 0 : (_source$2 = source[1]) === null || _source$2 === void 0 ? void 0 : _source$2.valueOf()) === (dest === null || dest === void 0 ? void 0 : (_dest$2 = dest[1]) === null || _dest$2 === void 0 ? void 0 : _dest$2.valueOf());
42
+ if (DateUtils.shouldTime(format)) {
43
+ result && (result = DateUtils.isSameSecond(source === null || source === void 0 ? void 0 : source[0], dest === null || dest === void 0 ? void 0 : dest[0]) && DateUtils.isSameSecond(source === null || source === void 0 ? void 0 : source[1], dest === null || dest === void 0 ? void 0 : dest[1]));
44
+ }
45
+
46
+ return result;
43
47
  };
44
48
  export var getMonthHoverRange = function getMonthHoverRange(date) {
45
49
  return [DateUtils.startOfMonth(date), DateUtils.endOfMonth(date)];
@@ -1,8 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useCallback, useContext, useMemo } from 'react';
3
+ import React, { useCallback, useContext, useMemo, useReducer } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import omit from 'lodash/omit';
6
+ import pick from 'lodash/pick';
6
7
  import DropdownMenu from './DropdownMenu';
7
8
  import { mergeRefs, PLACEMENT_8, placementPolyfill, useClassNames } from '../utils';
8
9
  import { SidenavContext } from '../Sidenav/Sidenav';
@@ -18,6 +19,7 @@ import { NavbarContext } from '../Navbar/Navbar';
18
19
  import Disclosure from '../Disclosure/Disclosure';
19
20
  import SidenavDropdown from '../Sidenav/SidenavDropdown';
20
21
  import NavContext from '../Nav/NavContext';
22
+ import { initialState, reducer } from './DropdownState';
21
23
  var defaultProps = {
22
24
  as: 'div',
23
25
  classPrefix: 'dropdown',
@@ -96,14 +98,29 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
96
98
  }, [trigger]);
97
99
  var parentMenu = useContext(MenuContext);
98
100
  var sidenav = useContext(SidenavContext);
99
- var navbar = useContext(NavbarContext); // Render a disclosure when inside expanded <Sidenav>
101
+ var navbar = useContext(NavbarContext);
102
+
103
+ var _useReducer = useReducer(reducer, initialState),
104
+ items = _useReducer[0].items,
105
+ dispatch = _useReducer[1];
106
+
107
+ var hasSelectedItem = useMemo(function () {
108
+ return items.some(function (item) {
109
+ return item.props.selected;
110
+ });
111
+ }, [items]);
112
+ var dropdownContextValue = useMemo(function () {
113
+ return {
114
+ activeKey: activeKey,
115
+ onSelect: emitSelect,
116
+ hasSelectedItem: hasSelectedItem,
117
+ dispatch: dispatch
118
+ };
119
+ }, [activeKey, emitSelect, hasSelectedItem, dispatch]); // Render a disclosure when inside expanded <Sidenav>
100
120
 
101
121
  if (sidenav !== null && sidenav !== void 0 && sidenav.expanded) {
102
122
  return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
103
- value: {
104
- activeKey: activeKey,
105
- onSelect: emitSelect
106
- }
123
+ value: dropdownContextValue
107
124
  }, /*#__PURE__*/React.createElement(SidenavDropdown, _extends({
108
125
  ref: ref
109
126
  }, rest)));
@@ -112,10 +129,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
112
129
 
113
130
  if (navbar) {
114
131
  return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
115
- value: {
116
- activeKey: activeKey,
117
- onSelect: emitSelect
118
- }
132
+ value: dropdownContextValue
119
133
  }, /*#__PURE__*/React.createElement(Disclosure, {
120
134
  hideOnClickOutside: true
121
135
  }, function (_ref, containerRef) {
@@ -155,7 +169,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
155
169
  className: toggleClassName,
156
170
  placement: placement,
157
171
  disabled: disabled
158
- }, omit(menuButtonProps, ['open']), toggleProps), title);
172
+ }, omit(menuButtonProps, ['open']), omit(toggleProps, ['data-testid'])), title);
159
173
  };
160
174
 
161
175
  if (parentMenu) {
@@ -172,16 +186,13 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
172
186
  className: mergeNavItemClassNames(toggleClassName, withNavItemClassPrefix({
173
187
  focus: active
174
188
  }))
175
- }, menuButtonProps, omit(menuitemProps, ['onClick']), toggleProps), title);
189
+ }, menuButtonProps, omit(menuitemProps, ['onClick']), omit(toggleProps, 'data-testid')), title);
176
190
  });
177
191
  };
178
192
  }
179
193
 
180
194
  return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
181
- value: {
182
- activeKey: activeKey,
183
- onSelect: emitSelect
184
- }
195
+ value: dropdownContextValue
185
196
  }, /*#__PURE__*/React.createElement(Menu, {
186
197
  menuButtonText: title,
187
198
  renderMenuButton: renderMenuButton,
@@ -190,7 +201,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
190
201
  var open = _ref4.open,
191
202
  popupProps = _objectWithoutPropertiesLoose(_ref4, ["open"]);
192
203
 
193
- var menuClassName = mergeMenuClassName(className, withMenuClassPrefix()); // When inside a collapsed <Sidenav>, render a header in menu
204
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix({})); // When inside a collapsed <Sidenav>, render a header in menu
194
205
 
195
206
  var showHeader = !!sidenav;
196
207
  return /*#__PURE__*/React.createElement("ul", _extends({
@@ -218,11 +229,11 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
218
229
  var open = _ref5.open,
219
230
  menuContainer = _objectWithoutPropertiesLoose(_ref5, ["open"]);
220
231
 
221
- var classes = merge(className, withClassPrefix((_withClassPrefix2 = {}, _withClassPrefix2["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix2.disabled = disabled, _withClassPrefix2.open = open, _withClassPrefix2.submenu = !!parentMenu, _withClassPrefix2)));
232
+ var classes = merge(className, withClassPrefix((_withClassPrefix2 = {}, _withClassPrefix2["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix2.disabled = disabled, _withClassPrefix2.open = open, _withClassPrefix2.submenu = !!parentMenu, _withClassPrefix2['selected-within'] = hasSelectedItem, _withClassPrefix2)));
222
233
  return /*#__PURE__*/React.createElement(Component, _extends({
223
234
  ref: mergeRefs(ref, menuContainerRef),
224
235
  className: classes
225
- }, menuContainer, {
236
+ }, menuContainer, pick(toggleProps, ['data-testid']), {
226
237
  style: style
227
238
  }));
228
239
  }));
@@ -1,7 +1,10 @@
1
- import React from 'react';
1
+ import React, { Dispatch } from 'react';
2
+ import { DropdownAction } from './DropdownState';
2
3
  export interface DropdownContextProps {
3
4
  activeKey?: string;
4
5
  onSelect: (eventKey: string, event: React.SyntheticEvent) => void;
6
+ hasSelectedItem?: boolean;
7
+ dispatch?: Dispatch<DropdownAction>;
5
8
  }
6
9
  declare const DropdownContext: React.Context<DropdownContextProps>;
7
10
  export default DropdownContext;
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useCallback, useContext } from 'react';
3
+ import React, { useCallback, useContext, useEffect } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import { SidenavContext } from '../Sidenav/Sidenav';
6
6
  import deprecatePropType from '../utils/deprecatePropType';
@@ -13,6 +13,8 @@ import SidenavDropdownItem from '../Sidenav/SidenavDropdownItem';
13
13
  import DisclosureContext, { DisclosureActionTypes } from '../Disclosure/DisclosureContext';
14
14
  import SafeAnchor from '../SafeAnchor';
15
15
  import NavContext from '../Nav/NavContext';
16
+ import useInternalId from '../utils/useInternalId';
17
+ import { DropdownActionType } from './DropdownState';
16
18
  var defaultProps = {
17
19
  as: 'li',
18
20
  classPrefix: 'dropdown-item'
@@ -32,6 +34,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
32
34
  icon = props.icon,
33
35
  rest = _objectWithoutPropertiesLoose(props, ["classPrefix", "className", "active", "eventKey", "onSelect", "icon"]);
34
36
 
37
+ var internalId = useInternalId('DropdownItem');
35
38
  var nav = useContext(NavContext);
36
39
  var dropdown = useContext(DropdownContext);
37
40
 
@@ -59,6 +62,29 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
59
62
  });
60
63
  handleSelectItem === null || handleSelectItem === void 0 ? void 0 : handleSelectItem(event);
61
64
  }, [dispatchDisclosure, handleSelectItem]);
65
+ var selected = activeProp || !isNil(eventKey) && (shallowEqual(dropdown === null || dropdown === void 0 ? void 0 : dropdown.activeKey, eventKey) || shallowEqual(nav === null || nav === void 0 ? void 0 : nav.activeKey, eventKey));
66
+ var dispatch = dropdown === null || dropdown === void 0 ? void 0 : dropdown.dispatch;
67
+ useEffect(function () {
68
+ if (dispatch) {
69
+ dispatch({
70
+ type: DropdownActionType.RegisterItem,
71
+ payload: {
72
+ id: internalId,
73
+ props: {
74
+ selected: selected
75
+ }
76
+ }
77
+ });
78
+ return function () {
79
+ dispatch({
80
+ type: DropdownActionType.UnregisterItem,
81
+ payload: {
82
+ id: internalId
83
+ }
84
+ });
85
+ };
86
+ }
87
+ }, [internalId, selected, dispatch]);
62
88
 
63
89
  if (sidenav !== null && sidenav !== void 0 && sidenav.expanded) {
64
90
  return /*#__PURE__*/React.createElement(SidenavDropdownItem, _extends({
@@ -66,8 +92,6 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
66
92
  }, props));
67
93
  }
68
94
 
69
- var menuitemSelected = activeProp || !isNil(eventKey) && (shallowEqual(dropdown === null || dropdown === void 0 ? void 0 : dropdown.activeKey, eventKey) || shallowEqual(nav === null || nav === void 0 ? void 0 : nav.activeKey, eventKey));
70
-
71
95
  var Component = rest.as,
72
96
  divider = rest.divider,
73
97
  panel = rest.panel,
@@ -97,7 +121,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
97
121
  disabled: disabled,
98
122
  divider: divider,
99
123
  panel: panel,
100
- active: menuitemSelected
124
+ active: selected
101
125
  }));
102
126
  var dataAttributes = {
103
127
  'data-event-key': eventKey
@@ -110,7 +134,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
110
134
  return /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(SafeAnchor, _extends({
111
135
  ref: ref,
112
136
  className: classes,
113
- "aria-current": menuitemSelected || undefined
137
+ "aria-current": selected || undefined
114
138
  }, dataAttributes, restProps, {
115
139
  onClick: createChainedFunction(handleClickNavbarDropdownItem, restProps.onClick)
116
140
  }), icon && /*#__PURE__*/React.cloneElement(icon, {
@@ -119,7 +143,7 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
119
143
  }
120
144
 
121
145
  return /*#__PURE__*/React.createElement(MenuItem, {
122
- selected: menuitemSelected,
146
+ selected: selected,
123
147
  disabled: disabled,
124
148
  onActivate: handleSelectItem
125
149
  }, function (_ref2, menuitemRef) {
@@ -0,0 +1,37 @@
1
+ interface DropdownItemState {
2
+ /**
3
+ * Internal ID
4
+ */
5
+ id: string;
6
+ /**
7
+ *
8
+ */
9
+ props: {
10
+ selected: boolean;
11
+ };
12
+ }
13
+ interface DropdownState {
14
+ items: DropdownItemState[];
15
+ }
16
+ export declare const initialState: DropdownState;
17
+ export declare enum DropdownActionType {
18
+ RegisterItem = 0,
19
+ UnregisterItem = 1,
20
+ UpdateItem = 2
21
+ }
22
+ export declare type DropdownAction = {
23
+ type: DropdownActionType.RegisterItem;
24
+ payload: {
25
+ id: string;
26
+ props: {
27
+ selected: boolean;
28
+ };
29
+ };
30
+ } | {
31
+ type: DropdownActionType.UnregisterItem;
32
+ payload: {
33
+ id: string;
34
+ };
35
+ };
36
+ export declare function reducer(state: DropdownState, action: DropdownAction): DropdownState;
37
+ export {};
@@ -0,0 +1,55 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ export var initialState = {
3
+ items: []
4
+ };
5
+ export var DropdownActionType;
6
+
7
+ (function (DropdownActionType) {
8
+ DropdownActionType[DropdownActionType["RegisterItem"] = 0] = "RegisterItem";
9
+ DropdownActionType[DropdownActionType["UnregisterItem"] = 1] = "UnregisterItem";
10
+ DropdownActionType[DropdownActionType["UpdateItem"] = 2] = "UpdateItem";
11
+ })(DropdownActionType || (DropdownActionType = {}));
12
+
13
+ export function reducer(state, action) {
14
+ if (state === void 0) {
15
+ state = initialState;
16
+ }
17
+
18
+ switch (action.type) {
19
+ case DropdownActionType.RegisterItem:
20
+ if (state.items.find(function (item) {
21
+ return item.id === action.payload.id;
22
+ })) {
23
+ return _extends({}, state, {
24
+ items: state.items.map(function (item) {
25
+ if (item.id === action.payload.id) {
26
+ return _extends({}, item, {
27
+ props: _extends({}, item.props, {
28
+ selected: action.payload.props.selected
29
+ })
30
+ });
31
+ }
32
+
33
+ return item;
34
+ })
35
+ });
36
+ }
37
+
38
+ return _extends({}, state, {
39
+ items: [].concat(state.items, [{
40
+ id: action.payload.id,
41
+ props: action.payload.props
42
+ }])
43
+ });
44
+
45
+ case DropdownActionType.UnregisterItem:
46
+ return _extends({}, state, {
47
+ items: state.items.filter(function (item) {
48
+ return item.id !== action.payload.id;
49
+ })
50
+ });
51
+
52
+ default:
53
+ return state;
54
+ }
55
+ }
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { PickerLocale } from '../locales';
3
3
  import { PickerComponent } from '../Picker';
4
- import { TypeAttributes, FormControlPickerProps, ItemDataType } from '../@types/common';
4
+ import { FormControlPickerProps, ItemDataType } from '../@types/common';
5
5
  import { ListProps } from 'react-virtualized/dist/commonjs/List';
6
6
  export declare type ValueType = number | string;
7
7
  export interface SelectProps<T = ValueType> {
@@ -16,8 +16,6 @@ export interface SelectProps<T = ValueType> {
16
16
  * https://github.com/bvaughn/react-virtualized/blob/master/docs/List.md#prop-types
17
17
  */
18
18
  listProps?: ListProps;
19
- /** A picker can have different sizes */
20
- size?: TypeAttributes.Size;
21
19
  /** Custom search rules. */
22
20
  searchBy?: (keyword: string, label: React.ReactNode, item: ItemDataType) => boolean;
23
21
  /** Sort options */
@@ -11,6 +11,7 @@ import { SidenavContext } from './Sidenav';
11
11
  import deprecatePropType from '../utils/deprecatePropType';
12
12
  import SidenavDropdownCollapse from './SidenavDropdownCollapse';
13
13
  import Disclosure from '../Disclosure/Disclosure';
14
+ import DropdownContext from '../Dropdown/DropdownContext';
14
15
  var defaultProps = {
15
16
  as: 'div',
16
17
  classPrefix: 'dropdown',
@@ -43,6 +44,9 @@ var SidenavDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
43
44
  openKeys = _useContext$openKeys === void 0 ? [] : _useContext$openKeys,
44
45
  onOpenChange = _useContext.onOpenChange;
45
46
 
47
+ var _useContext2 = useContext(DropdownContext),
48
+ hasSelectedItem = _useContext2.hasSelectedItem;
49
+
46
50
  var _useClassNames = useClassNames(classPrefix),
47
51
  merge = _useClassNames.merge,
48
52
  withClassPrefix = _useClassNames.withClassPrefix;
@@ -65,7 +69,7 @@ var SidenavDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
65
69
  var _withClassPrefix;
66
70
 
67
71
  var open = _ref.open;
68
- var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _withClassPrefix[open ? 'expand' : 'collapse'] = true, _withClassPrefix.disabled = disabled, _withClassPrefix['no-caret'] = noCaret, _withClassPrefix)));
72
+ var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _withClassPrefix[open ? 'expand' : 'collapse'] = true, _withClassPrefix.disabled = disabled, _withClassPrefix['selected-within'] = hasSelectedItem, _withClassPrefix['no-caret'] = noCaret, _withClassPrefix)));
69
73
  return /*#__PURE__*/React.createElement(Component, _extends({
70
74
  ref: mergeRefs(ref, containerRef),
71
75
  style: style,
@@ -61,26 +61,20 @@ var SidenavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
61
61
  focus: active,
62
62
  active: selected,
63
63
  disabled: disabled
64
- }));
65
- var item = /*#__PURE__*/React.createElement(Component, _extends({
66
- ref: mergeRefs(ref, menuitemRef),
67
- disabled: Component === SafeAnchor ? disabled : undefined,
68
- className: classes,
69
- "data-event-key": eventKey
70
- }, menuitem, omit(rest, ['divider', 'panel'])), icon, _children, /*#__PURE__*/React.createElement(Ripple, null)); // Show tooltip when inside a collapse <Sidenav>
64
+ })); // Show tooltip when inside a collapse <Sidenav>
71
65
 
72
- return sidenav ? appendTooltip({
66
+ return appendTooltip({
73
67
  children: function children(triggerProps, triggerRef) {
74
68
  return /*#__PURE__*/React.createElement(Component, _extends({
75
69
  ref: mergeRefs(mergeRefs(ref, menuitemRef), triggerRef),
76
70
  disabled: Component === SafeAnchor ? disabled : undefined,
77
71
  className: classes,
78
72
  "data-event-key": eventKey
79
- }, menuitem, omit(rest, ['divider', 'panel']), triggerProps), icon, _children, /*#__PURE__*/React.createElement(Ripple, null));
73
+ }, omit(rest, ['divider', 'panel']), triggerProps, menuitem), icon, _children, /*#__PURE__*/React.createElement(Ripple, null));
80
74
  },
81
75
  message: _children,
82
76
  placement: 'right'
83
- }) : item;
77
+ });
84
78
  });
85
79
  }
86
80
 
@@ -19,6 +19,7 @@ export { default as isBefore } from 'date-fns/isBefore';
19
19
  export { default as isEqual } from 'date-fns/isEqual';
20
20
  export { default as isSameDay } from 'date-fns/isSameDay';
21
21
  export { default as isSameMonth } from 'date-fns/isSameMonth';
22
+ export { default as isSameSecond } from 'date-fns/isSameSecond';
22
23
  export { default as parse } from 'date-fns/parse';
23
24
  export { default as parseISO } from 'date-fns/parseISO';
24
25
  export { default as setDate } from 'date-fns/setDate';
@@ -26,6 +26,7 @@ export { default as isBefore } from 'date-fns/isBefore';
26
26
  export { default as isEqual } from 'date-fns/isEqual';
27
27
  export { default as isSameDay } from 'date-fns/isSameDay';
28
28
  export { default as isSameMonth } from 'date-fns/isSameMonth';
29
+ export { default as isSameSecond } from 'date-fns/isSameSecond';
29
30
  export { default as parse } from 'date-fns/parse';
30
31
  export { default as parseISO } from 'date-fns/parseISO';
31
32
  export { default as setDate } from 'date-fns/setDate';
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Used for generating unique ID for DOM elements
3
+ */
4
+ export default function useInternalId(prefix?: string): string;
@@ -0,0 +1,16 @@
1
+ import { useDebugValue, useRef } from 'react';
2
+ import uniqueId from 'lodash/uniqueId';
3
+ /**
4
+ * Used for generating unique ID for DOM elements
5
+ */
6
+
7
+ export default function useInternalId(prefix) {
8
+ var idRef = useRef();
9
+
10
+ if (!idRef.current) {
11
+ idRef.current = uniqueId("internal://" + prefix);
12
+ }
13
+
14
+ useDebugValue(idRef.current);
15
+ return idRef.current;
16
+ }
@@ -1,4 +1,4 @@
1
1
  /**
2
- * Used for generating unique ID for elements
2
+ * Used for generating unique ID for DOM elements
3
3
  */
4
4
  export default function useUniqueId(prefix?: string): string;
@@ -1,7 +1,7 @@
1
1
  import { useRef } from 'react';
2
2
  import uniqueId from 'lodash/uniqueId';
3
3
  /**
4
- * Used for generating unique ID for elements
4
+ * Used for generating unique ID for DOM elements
5
5
  */
6
6
 
7
7
  export default function useUniqueId(prefix) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rsuite",
3
- "version": "5.0.0-beta.8",
3
+ "version": "5.0.0",
4
4
  "description": "A suite of react components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -39,7 +39,7 @@
39
39
  "prop-types": "^15.7.2",
40
40
  "react-text-mask": "^5.4.3",
41
41
  "react-virtualized": "^9.22.3",
42
- "rsuite-table": "^5.0.0-beta.3",
42
+ "rsuite-table": "^5.0.0",
43
43
  "schema-typed": "^2.0.1"
44
44
  },
45
45
  "peerDependencies": {
@@ -159,6 +159,22 @@
159
159
  --rs-navbar-subtle-hover-bg: @B700;
160
160
  --rs-navbar-subtle-hover-text: @B050;
161
161
 
162
+ // Sidenav
163
+ --rs-sidenav-default-bg: @B800;
164
+ --rs-sidenav-default-text: @B200;
165
+ --rs-sidenav-default-selected-text: @H500;
166
+ --rs-sidenav-default-hover-bg: @B700;
167
+ --rs-sidenav-default-hover-text: @B050;
168
+ --rs-sidenav-inverse-bg: @H700;
169
+ --rs-sidenav-inverse-text: #fff;
170
+ --rs-sidenav-inverse-selected-bg: @H400;
171
+ --rs-sidenav-inverse-hover-bg: @H600;
172
+ --rs-sidenav-subtle-bg: transparent;
173
+ --rs-sidenav-subtle-text: @B200;
174
+ --rs-sidenav-subtle-selected-text: @H500;
175
+ --rs-sidenav-subtle-hover-bg: @B700;
176
+ --rs-sidenav-subtle-hover-text: @B050;
177
+
162
178
  // Input
163
179
  --rs-input-bg: @B800;
164
180
  --rs-input-focus-border: @H500;