rsuite 5.21.0 → 5.22.1

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 (45) hide show
  1. package/CHANGELOG.md +21 -973
  2. package/DatePicker/styles/index.less +11 -0
  3. package/Table/styles/index.less +12 -7
  4. package/cjs/Calendar/Calendar.js +1 -1
  5. package/cjs/Calendar/CalendarContainer.d.ts +2 -2
  6. package/cjs/Calendar/CalendarContainer.js +11 -11
  7. package/cjs/Calendar/MonthDropdownItem.js +1 -1
  8. package/cjs/Calendar/TimeDropdown.js +1 -1
  9. package/cjs/Calendar/types.d.ts +2 -2
  10. package/cjs/DatePicker/DatePicker.js +29 -7
  11. package/cjs/DatePicker/types.d.ts +1 -0
  12. package/cjs/DateRangePicker/Calendar.d.ts +2 -2
  13. package/cjs/DateRangePicker/Calendar.js +18 -13
  14. package/cjs/DateRangePicker/DateRangePicker.js +100 -55
  15. package/cjs/DateRangePicker/utils.d.ts +1 -1
  16. package/cjs/DateRangePicker/utils.js +11 -6
  17. package/cjs/utils/dateUtils.d.ts +16 -0
  18. package/cjs/utils/dateUtils.js +62 -8
  19. package/dist/rsuite-rtl.css +20 -6
  20. package/dist/rsuite-rtl.min.css +1 -1
  21. package/dist/rsuite-rtl.min.css.map +1 -1
  22. package/dist/rsuite.css +20 -6
  23. package/dist/rsuite.js +35 -24
  24. package/dist/rsuite.js.map +1 -1
  25. package/dist/rsuite.min.css +1 -1
  26. package/dist/rsuite.min.css.map +1 -1
  27. package/dist/rsuite.min.js +1 -1
  28. package/dist/rsuite.min.js.map +1 -1
  29. package/esm/Calendar/Calendar.js +1 -1
  30. package/esm/Calendar/CalendarContainer.d.ts +2 -2
  31. package/esm/Calendar/CalendarContainer.js +11 -11
  32. package/esm/Calendar/MonthDropdownItem.js +1 -1
  33. package/esm/Calendar/TimeDropdown.js +1 -1
  34. package/esm/Calendar/types.d.ts +2 -2
  35. package/esm/DatePicker/DatePicker.js +26 -7
  36. package/esm/DatePicker/types.d.ts +1 -0
  37. package/esm/DateRangePicker/Calendar.d.ts +2 -2
  38. package/esm/DateRangePicker/Calendar.js +18 -13
  39. package/esm/DateRangePicker/DateRangePicker.js +102 -55
  40. package/esm/DateRangePicker/utils.d.ts +1 -1
  41. package/esm/DateRangePicker/utils.js +11 -6
  42. package/esm/utils/dateUtils.d.ts +16 -0
  43. package/esm/utils/dateUtils.js +47 -1
  44. package/package.json +3 -3
  45. package/styles/variables.less +1 -0
@@ -34,6 +34,17 @@
34
34
  }
35
35
  }
36
36
 
37
+ // Predefined Ranges
38
+ .rs-picker-date-predefined {
39
+ height: 325px;
40
+ border-right: 1px solid var(--rs-border-primary);
41
+ padding: 4px 0;
42
+
43
+ .rs-btn {
44
+ display: block;
45
+ }
46
+ }
47
+
37
48
  // Calendar in DatePicker popup
38
49
  .rs-picker-menu {
39
50
  @calendar-width: (
@@ -60,13 +60,6 @@
60
60
  box-shadow: none;
61
61
  }
62
62
 
63
- // Added transition for hover
64
- &-row,
65
- &-cell-group,
66
- &-cell {
67
- transition: background-color 0.3s linear;
68
- }
69
-
70
63
  &-hover &-row:not(&-row-header):hover,
71
64
  &-hover &-row:hover &-cell-group,
72
65
  &-hover &-row:hover &-cell {
@@ -215,6 +208,18 @@
215
208
  }
216
209
  }
217
210
 
211
+ &-cell-full-text {
212
+ &:hover {
213
+ z-index: 1 !important;
214
+ width: auto !important;
215
+ box-shadow: inset @table-cell-hover-color 0px 0px 2px;
216
+
217
+ .rs-table-cell-content {
218
+ width: auto !important;
219
+ }
220
+ }
221
+ }
222
+
218
223
  &-cell-header-sortable &-cell-content {
219
224
  cursor: pointer;
220
225
  }
@@ -100,7 +100,7 @@ var CalendarPanel = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
100
100
  renderCell: customRenderCell,
101
101
  onMoveForward: handleChange,
102
102
  onMoveBackward: handleChange,
103
- onChangePageDate: handleChange,
103
+ onChangeMonth: handleChange,
104
104
  onSelect: handleSelect
105
105
  }));
106
106
  });
@@ -39,9 +39,9 @@ export interface CalendarProps extends WithAsProps, Omit<HTMLAttributes<HTMLDivE
39
39
  /** Custom locale */
40
40
  locale: CalendarLocale;
41
41
  /** Callback after the date has changed */
42
- onChangePageDate?: (nextPageDate: Date, event: React.MouseEvent) => void;
42
+ onChangeMonth?: (nextPageDate: Date, event: React.MouseEvent) => void;
43
43
  /** Callback after the time has changed */
44
- onChangePageTime?: (nextPageTime: Date, event: React.MouseEvent) => void;
44
+ onChangeTime?: (nextPageTime: Date, event: React.MouseEvent) => void;
45
45
  /** Callback after mouse enter other date cell */
46
46
  onMouseMove?: (date: Date) => void;
47
47
  /** Switch to the callback triggered after the previous month. */
@@ -53,8 +53,8 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
53
53
  isoWeek = _props$isoWeek === void 0 ? false : _props$isoWeek,
54
54
  limitEndYear = props.limitEndYear,
55
55
  locale = props.locale,
56
- onChangePageDate = props.onChangePageDate,
57
- onChangePageTime = props.onChangePageTime,
56
+ onChangeMonth = props.onChangeMonth,
57
+ onChangeTime = props.onChangeTime,
58
58
  onMouseMove = props.onMouseMove,
59
59
  onMoveBackward = props.onMoveBackward,
60
60
  onMoveForward = props.onMoveForward,
@@ -69,7 +69,7 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
69
69
  showMeridian = props.showMeridian,
70
70
  showWeekNumbers = props.showWeekNumbers,
71
71
  inline = props.inline,
72
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "inSameMonth", "isoWeek", "limitEndYear", "locale", "onChangePageDate", "onChangePageTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
72
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "inSameMonth", "isoWeek", "limitEndYear", "locale", "onChangeMonth", "onChangeTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
73
73
 
74
74
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
75
75
  withClassPrefix = _useClassNames.withClassPrefix,
@@ -141,10 +141,10 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
141
141
  'show-week-numbers': showWeekNumbers
142
142
  }));
143
143
  var timeDropdownProps = (0, _pick.default)(rest, _dateUtils.calendarOnlyProps);
144
- var handleChangePageDate = (0, _react.useCallback)(function (date, event) {
144
+ var handleChangeMonth = (0, _react.useCallback)(function (date, event) {
145
145
  reset();
146
- onChangePageDate === null || onChangePageDate === void 0 ? void 0 : onChangePageDate(date, event);
147
- }, [onChangePageDate, reset]);
146
+ onChangeMonth === null || onChangeMonth === void 0 ? void 0 : onChangeMonth(date, event);
147
+ }, [onChangeMonth, reset]);
148
148
  var contextValue = (0, _react.useMemo)(function () {
149
149
  return {
150
150
  date: calendarDate,
@@ -155,15 +155,15 @@ var CalendarContainer = /*#__PURE__*/_react.default.forwardRef(function (props,
155
155
  inSameMonth: inSameMonth !== null && inSameMonth !== void 0 ? inSameMonth : inSameThisMonthDate,
156
156
  isoWeek: isoWeek,
157
157
  locale: locale,
158
- onChangePageDate: handleChangePageDate,
159
- onChangePageTime: onChangePageTime,
158
+ onChangeMonth: handleChangeMonth,
159
+ onChangeTime: onChangeTime,
160
160
  onMouseMove: onMouseMove,
161
161
  onSelect: onSelect,
162
162
  renderCell: renderCell,
163
163
  showWeekNumbers: showWeekNumbers,
164
164
  inline: inline
165
165
  };
166
- }, [calendarDate, dateRange, format, handleChangePageDate, hoverRangeValue, inSameMonth, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangePageTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
166
+ }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameMonth, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
167
167
  return /*#__PURE__*/_react.default.createElement(_CalendarContext.CalendarProvider, {
168
168
  value: contextValue
169
169
  }, /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, (0, _dateUtils.omitHideDisabledProps)(rest), {
@@ -214,8 +214,8 @@ CalendarContainer.propTypes = {
214
214
  isoWeek: _propTypes.default.bool,
215
215
  limitEndYear: _propTypes.default.number,
216
216
  locale: _propTypes.default.object,
217
- onChangePageDate: _propTypes.default.func,
218
- onChangePageTime: _propTypes.default.func,
217
+ onChangeMonth: _propTypes.default.func,
218
+ onChangeTime: _propTypes.default.func,
219
219
  onMoveBackward: _propTypes.default.func,
220
220
  onMoveForward: _propTypes.default.func,
221
221
  onSelect: _propTypes.default.func,
@@ -36,7 +36,7 @@ var MonthDropdownItem = /*#__PURE__*/_react.default.forwardRef(function (props,
36
36
 
37
37
  var _useCalendarContext = (0, _CalendarContext.useCalendarContext)(),
38
38
  date = _useCalendarContext.date,
39
- onSelect = _useCalendarContext.onChangePageDate;
39
+ onSelect = _useCalendarContext.onChangeMonth;
40
40
 
41
41
  var handleClick = (0, _react.useCallback)(function (event) {
42
42
  if (disabled) {
@@ -125,7 +125,7 @@ var TimeDropdown = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
125
125
  locale = _useCalendarContext.locale,
126
126
  format = _useCalendarContext.format,
127
127
  date = _useCalendarContext.date,
128
- onSelect = _useCalendarContext.onChangePageTime;
128
+ onSelect = _useCalendarContext.onChangeTime;
129
129
 
130
130
  var rowRef = (0, _react.useRef)(null);
131
131
  (0, _react.useEffect)(function () {
@@ -8,8 +8,8 @@ export interface CalendarInnerContextValue {
8
8
  hoverRangeValue?: [Date, Date];
9
9
  inSameMonth?: (date: Date) => boolean;
10
10
  isoWeek: boolean;
11
- onChangePageDate?: (nextPageDate: Date, event: React.MouseEvent) => void;
12
- onChangePageTime?: (nextPageTime: Date, event: React.MouseEvent) => void;
11
+ onChangeMonth?: (nextPageDate: Date, event: React.MouseEvent) => void;
12
+ onChangeTime?: (nextPageTime: Date, event: React.MouseEvent) => void;
13
13
  onMouseMove?: (date: Date) => void;
14
14
  onSelect?: (date: Date, event: React.MouseEvent) => void;
15
15
  renderCell?: (date: Date) => React.ReactNode;
@@ -31,6 +31,10 @@ var _useCalendarDate2 = _interopRequireDefault(require("../Calendar/useCalendarD
31
31
 
32
32
  var _Toolbar = _interopRequireDefault(require("./Toolbar"));
33
33
 
34
+ var _Stack = _interopRequireDefault(require("../Stack"));
35
+
36
+ var _PredefinedRanges = _interopRequireDefault(require("./PredefinedRanges"));
37
+
34
38
  var _utils = require("../utils");
35
39
 
36
40
  var _Picker = require("../Picker");
@@ -154,7 +158,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
154
158
  * A callback triggered when the time on the calendar changes.
155
159
  */
156
160
 
157
- var handleChangePageTime = (0, _react.useCallback)(function (nextPageTime) {
161
+ var handleChangeTime = (0, _react.useCallback)(function (nextPageTime) {
158
162
  setCalendarDate(nextPageTime);
159
163
  handleDateChange(nextPageTime);
160
164
  }, [handleDateChange, setCalendarDate]);
@@ -255,7 +259,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
255
259
  * A callback triggered when the date on the calendar changes.
256
260
  */
257
261
 
258
- var handleChangePageDate = (0, _react.useCallback)(function (nextPageDate, event) {
262
+ var handleChangeMonth = (0, _react.useCallback)(function (nextPageDate, event) {
259
263
  setCalendarDate(nextPageDate);
260
264
  handleDateChange(nextPageDate); // Show only the calendar month panel. formatStr = 'yyyy-MM'
261
265
 
@@ -360,11 +364,18 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
360
364
  onSelect: handleSelect,
361
365
  onToggleMonthDropdown: onToggleMonthDropdown,
362
366
  onToggleTimeDropdown: onToggleTimeDropdown,
363
- onChangePageDate: handleChangePageDate,
364
- onChangePageTime: handleChangePageTime,
367
+ onChangeMonth: handleChangeMonth,
368
+ onChangeTime: handleChangeTime,
365
369
  onToggleMeridian: handleToggleMeridian
366
370
  }));
367
371
 
372
+ var sideRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
373
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'left';
374
+ })) || [];
375
+ var bottomRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
376
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
377
+ })) || [];
378
+
368
379
  var renderDropdownMenu = function renderDropdownMenu(positionProps, speakerRef) {
369
380
  var left = positionProps.left,
370
381
  top = positionProps.top,
@@ -380,16 +391,27 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
380
391
  ref: (0, _utils.mergeRefs)(overlayRef, speakerRef),
381
392
  style: styles,
382
393
  target: triggerRef
383
- }, calendar, /*#__PURE__*/_react.default.createElement(_Toolbar.default, {
394
+ }, /*#__PURE__*/_react.default.createElement(_Stack.default, {
395
+ alignItems: "flex-start"
396
+ }, sideRanges.length > 0 && /*#__PURE__*/_react.default.createElement(_PredefinedRanges.default, {
397
+ direction: "column",
398
+ spacing: 0,
399
+ className: prefix('date-predefined'),
400
+ ranges: sideRanges,
401
+ calendarDate: calendarDate,
402
+ locale: locale,
403
+ disabledShortcut: disabledToolbarHandle,
404
+ onClickShortcut: handleShortcutPageDate
405
+ }), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, calendar, /*#__PURE__*/_react.default.createElement(_Toolbar.default, {
384
406
  locale: locale,
385
- ranges: ranges,
407
+ ranges: bottomRanges,
386
408
  calendarDate: calendarDate,
387
409
  disabledOkBtn: disabledToolbarHandle,
388
410
  disabledShortcut: disabledToolbarHandle,
389
411
  onClickShortcut: handleShortcutPageDate,
390
412
  onOk: handleOK,
391
413
  hideOkBtn: oneTap
392
- }));
414
+ }))));
393
415
  };
394
416
 
395
417
  var hasValue = !!value;
@@ -4,6 +4,7 @@ export interface RangeType<T> {
4
4
  label: ReactNode;
5
5
  closeOverlay?: boolean;
6
6
  value: T | ((value: T) => T);
7
+ placement?: 'bottom' | 'left';
7
8
  }
8
9
  export interface InnerRange<T> extends Omit<RangeType<T>, 'value'> {
9
10
  value: T;
@@ -14,11 +14,11 @@ export interface CalendarProps extends WithAsProps, Omit<CalendarCoreProps, Omit
14
14
  isoWeek?: boolean;
15
15
  limitEndYear?: number;
16
16
  locale?: DatePickerLocale;
17
- onChangeCalendarDate?: (index: number, date: Date) => void;
17
+ onChangeCalendarMonth?: (index: number, date: Date) => void;
18
18
  onChangeCalendarTime?: (index: number, date: Date) => void;
19
19
  onToggleMeridian: (index: number, event: React.MouseEvent) => void;
20
+ onSelect?: (index: number, date: Date, event: React.SyntheticEvent) => void;
20
21
  onMouseMove?: (date: Date) => void;
21
- onSelect?: (date: Date, event: React.SyntheticEvent) => void;
22
22
  showWeekNumbers?: boolean;
23
23
  value?: [] | [Date] | [Date, Date];
24
24
  }
@@ -32,22 +32,26 @@ var Calendar = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
32
32
  _props$index = props.index,
33
33
  index = _props$index === void 0 ? 0 : _props$index,
34
34
  limitEndYear = props.limitEndYear,
35
- onChangeCalendarDate = props.onChangeCalendarDate,
35
+ onChangeCalendarMonth = props.onChangeCalendarMonth,
36
36
  onChangeCalendarTime = props.onChangeCalendarTime,
37
37
  onToggleMeridian = props.onToggleMeridian,
38
+ onSelect = props.onSelect,
38
39
  _props$value = props.value,
39
40
  value = _props$value === void 0 ? [] : _props$value,
40
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "calendarDate", "format", "disabledDate", "index", "limitEndYear", "onChangeCalendarDate", "onChangeCalendarTime", "onToggleMeridian", "value"]);
41
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "calendarDate", "format", "disabledDate", "index", "limitEndYear", "onChangeCalendarMonth", "onChangeCalendarTime", "onToggleMeridian", "onSelect", "value"]);
41
42
  var onMoveForward = (0, _react.useCallback)(function (nextPageDate) {
42
- onChangeCalendarDate === null || onChangeCalendarDate === void 0 ? void 0 : onChangeCalendarDate(index, nextPageDate);
43
- }, [index, onChangeCalendarDate]);
43
+ onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
44
+ }, [index, onChangeCalendarMonth]);
44
45
  var onMoveBackward = (0, _react.useCallback)(function (nextPageDate) {
45
- onChangeCalendarDate === null || onChangeCalendarDate === void 0 ? void 0 : onChangeCalendarDate(index, nextPageDate);
46
- }, [index, onChangeCalendarDate]);
47
- var handleChangePageDate = (0, _react.useCallback)(function (nextPageDate) {
48
- onChangeCalendarDate === null || onChangeCalendarDate === void 0 ? void 0 : onChangeCalendarDate(index, nextPageDate);
49
- }, [index, onChangeCalendarDate]);
50
- var handleChangePageTime = (0, _react.useCallback)(function (nextPageDate) {
46
+ onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
47
+ }, [index, onChangeCalendarMonth]);
48
+ var handleSelect = (0, _react.useCallback)(function (date, event) {
49
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(index, date, event);
50
+ }, [index, onSelect]);
51
+ var handleChangeMonth = (0, _react.useCallback)(function (nextPageDate) {
52
+ onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
53
+ }, [index, onChangeCalendarMonth]);
54
+ var handleChangeTime = (0, _react.useCallback)(function (nextPageDate) {
51
55
  onChangeCalendarTime === null || onChangeCalendarTime === void 0 ? void 0 : onChangeCalendarTime(index, nextPageDate);
52
56
  }, [index, onChangeCalendarTime]);
53
57
  var handleToggleMeridian = (0, _react.useCallback)(function (event) {
@@ -75,11 +79,12 @@ var Calendar = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
75
79
  inSameMonth: inSameMonth,
76
80
  index: index,
77
81
  limitEndYear: limitEndYear,
78
- onChangePageDate: handleChangePageDate,
79
- onChangePageTime: handleChangePageTime,
82
+ onChangeMonth: handleChangeMonth,
83
+ onChangeTime: handleChangeTime,
80
84
  onMoveBackward: handleMoveBackward,
81
85
  onMoveForward: handleMoveForward,
82
86
  onToggleMeridian: handleToggleMeridian,
87
+ onSelect: handleSelect,
83
88
  calendarDate: getCalendarDate(),
84
89
  ref: ref
85
90
  }));
@@ -98,7 +103,7 @@ Calendar.propTypes = {
98
103
  disabledDate: _propTypes.default.func,
99
104
  onSelect: _propTypes.default.func,
100
105
  onMouseMove: _propTypes.default.func,
101
- onChangeCalendarDate: _propTypes.default.func
106
+ onChangeCalendarMonth: _propTypes.default.func
102
107
  };
103
108
  var _default = Calendar;
104
109
  exports.default = _default;
@@ -144,8 +144,8 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
144
144
  setHoverDateRange = _useState2[1]; // The displayed calendar panel is rendered based on this value.
145
145
 
146
146
 
147
- var _useState3 = (0, _react.useState)((0, _utils2.getCalendarDate)({
148
- value: (_ref2 = valueProp !== null && valueProp !== void 0 ? valueProp : defaultCalendarValue) !== null && _ref2 !== void 0 ? _ref2 : null
147
+ var _useState3 = (0, _react.useState)((0, _utils2.getSafeCalendarDate)({
148
+ value: (_ref2 = value !== null && value !== void 0 ? value : defaultCalendarValue) !== null && _ref2 !== void 0 ? _ref2 : null
149
149
  })),
150
150
  calendarDate = _useState3[0],
151
151
  setCalendarDate = _useState3[1];
@@ -161,37 +161,47 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
161
161
 
162
162
 
163
163
  var selectRangeValueRef = (0, _react.useRef)(null);
164
+ /**
165
+ * Get the time on the calendar.
166
+ */
167
+
168
+ var getCalendarDatetime = (0, _react.useCallback)(function (calendarKey) {
169
+ var index = calendarKey === 'start' ? 0 : 1;
170
+ return (calendarDate === null || calendarDate === void 0 ? void 0 : calendarDate[index]) || (defaultCalendarValue === null || defaultCalendarValue === void 0 ? void 0 : defaultCalendarValue[index]);
171
+ }, [calendarDate, defaultCalendarValue]);
164
172
  /**
165
173
  * Call this function to update the calendar panel rendering benchmark value.
166
174
  * If params `value` is not passed, it defaults to [new Date(), addMonth(new Date(), 1)].
167
175
  */
168
176
 
169
- var updateCalendarDateRange = (0, _react.useCallback)(function (selectedDate, calendarKey) {
170
- var nextValue = selectedDate;
171
- var shouldRenderTime = _utils.DateUtils.shouldRenderTime,
172
- getHours = _utils.DateUtils.getHours,
173
- getMinutes = _utils.DateUtils.getMinutes,
174
- getSeconds = _utils.DateUtils.getSeconds,
175
- set = _utils.DateUtils.set;
176
-
177
- if (shouldRenderTime(formatStr) && calendarKey === undefined && (selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.length) === 1) {
178
- var calendarEndDate = (calendarDate === null || calendarDate === void 0 ? void 0 : calendarDate[1]) || (defaultCalendarValue === null || defaultCalendarValue === void 0 ? void 0 : defaultCalendarValue[1]);
179
- var _startDate = selectedDate[0]; // When updating the start date, the time of the end date should keep the time set by the user by default.
180
-
181
- var _endDate = set((0, _dateUtils.addMonths)(_startDate, 1), {
182
- hours: getHours(calendarEndDate),
183
- minutes: getMinutes(calendarEndDate),
184
- seconds: getSeconds(calendarEndDate)
177
+ var updateCalendarDateRange = (0, _react.useCallback)(function (_ref3) {
178
+ var dateRange = _ref3.dateRange,
179
+ calendarKey = _ref3.calendarKey,
180
+ eventName = _ref3.eventName;
181
+ var nextValue = dateRange; // The time should remain the same when the dates in the date range are changed.
182
+
183
+ if ((0, _dateUtils.shouldRenderTime)(formatStr) && dateRange !== null && dateRange !== void 0 && dateRange.length && eventName !== 'changeTime') {
184
+ var _startDate = (0, _dateUtils.copyTime)({
185
+ from: getCalendarDatetime('start'),
186
+ to: dateRange[0]
187
+ });
188
+
189
+ var _endDate = (0, _dateUtils.copyTime)({
190
+ from: getCalendarDatetime('end'),
191
+ to: dateRange.length === 1 ? (0, _dateUtils.addMonths)(_startDate, 1) : dateRange[1]
185
192
  });
186
193
 
187
194
  nextValue = [_startDate, _endDate];
195
+ } else if (dateRange === null && typeof defaultCalendarValue !== 'undefined') {
196
+ // Make the calendar render the value of defaultCalendarValue after clearing the value.
197
+ nextValue = defaultCalendarValue;
188
198
  }
189
199
 
190
- setCalendarDate((0, _utils2.getCalendarDate)({
200
+ setCalendarDate((0, _utils2.getSafeCalendarDate)({
191
201
  value: nextValue,
192
202
  calendarKey: calendarKey
193
203
  }));
194
- }, [calendarDate, defaultCalendarValue, formatStr]); // if valueProp changed then update selectValue/hoverValue
204
+ }, [formatStr, defaultCalendarValue, getCalendarDatetime]); // if valueProp changed then update selectValue/hoverValue
195
205
 
196
206
  (0, _react.useEffect)(function () {
197
207
  setSelectedDates(valueProp !== null && valueProp !== void 0 ? valueProp : []);
@@ -269,8 +279,8 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
269
279
  return null;
270
280
  }
271
281
 
272
- if (_utils.DateUtils.isAfter(hoverValues[0], hoverValues[1])) {
273
- hoverValues.reverse();
282
+ if ((0, _dateUtils.isAfter)(hoverValues[0], hoverValues[1])) {
283
+ hoverValues = (0, _dateUtils.reverseDateRangeOmitTime)(hoverValues);
274
284
  }
275
285
 
276
286
  return hoverValues;
@@ -327,7 +337,8 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
327
337
  * Callback for selecting a date cell in the calendar grid
328
338
  */
329
339
 
330
- var handleSelectDate = (0, _react.useCallback)(function (date, event) {
340
+ var handleSelectDate = (0, _react.useCallback)(function (index, date, event) {
341
+ var calendarKey = index === 0 ? 'start' : 'end';
331
342
  var nextSelectDates = hoverDateRange !== null && hoverDateRange !== void 0 ? hoverDateRange : [];
332
343
  var hoverRangeValue = getHoverRangeValue(date);
333
344
  var noHoverRangeValid = (0, _isNil.default)(hoverRangeValue); // in `oneTap` mode
@@ -355,19 +366,38 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
355
366
  nextSelectDates = hoverRangeValue;
356
367
  selectRangeValueRef.current = hoverRangeValue;
357
368
  }
358
- } // If user have completed the selection, then sort
369
+ }
359
370
 
371
+ if (nextSelectDates.length === 2) {
372
+ // If user have completed the selection, then sort the selected dates.
373
+ if ((0, _dateUtils.isAfter)(nextSelectDates[0], nextSelectDates[1])) {
374
+ nextSelectDates = (0, _dateUtils.reverseDateRangeOmitTime)(nextSelectDates);
375
+ }
376
+
377
+ if ((0, _dateUtils.shouldRenderTime)(formatStr)) {
378
+ nextSelectDates = [(0, _dateUtils.copyTime)({
379
+ from: getCalendarDatetime('start'),
380
+ to: nextSelectDates[0]
381
+ }), (0, _dateUtils.copyTime)({
382
+ from: getCalendarDatetime('end'),
383
+ to: nextSelectDates[1]
384
+ })];
385
+ }
360
386
 
361
- if (nextSelectDates.length === 2 && _utils.DateUtils.isAfter(nextSelectDates[0], nextSelectDates[1])) {
362
- nextSelectDates.reverse();
387
+ setHoverDateRange(nextSelectDates);
388
+ } else {
389
+ setHoverDateRange([nextSelectDates[0], nextSelectDates[0]]);
363
390
  }
364
391
 
365
- setHoverDateRange(nextSelectDates.length === 2 ? nextSelectDates : [nextSelectDates[0], nextSelectDates[0]]);
366
392
  setSelectedDates(nextSelectDates);
367
- updateCalendarDateRange(nextSelectDates);
393
+ updateCalendarDateRange({
394
+ dateRange: nextSelectDates,
395
+ calendarKey: calendarKey,
396
+ eventName: 'changeDate'
397
+ });
368
398
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(date, event);
369
399
  hasDoneSelect.current = !hasDoneSelect.current;
370
- }, [getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
400
+ }, [formatStr, getCalendarDatetime, getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
371
401
  /**
372
402
  * If `selectValue` changed, there will be the following effects.
373
403
  * 1. Check if the selection is completed.
@@ -379,41 +409,48 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
379
409
  var doneSelected = selectValueLength === 0 || selectValueLength === 2;
380
410
  doneSelected && setHoverDateRange(null);
381
411
  }, [selectedDates]);
382
- var updateSingleCalendarDate = (0, _react.useCallback)(function (index, date) {
412
+ var updateSingleCalendarMonth = (0, _react.useCallback)(function (index, date) {
413
+ var calendarKey = index === 0 ? 'start' : 'end';
383
414
  var nextCalendarDate = Array.from(calendarDate);
384
415
  nextCalendarDate[index] = date;
385
- updateCalendarDateRange(nextCalendarDate, index === 0 ? 'start' : 'end');
416
+ updateCalendarDateRange({
417
+ dateRange: nextCalendarDate,
418
+ calendarKey: calendarKey,
419
+ eventName: 'changeMonth'
420
+ });
386
421
  }, [calendarDate, updateCalendarDateRange]);
387
422
  var updateSingleCalendarTime = (0, _react.useCallback)(function (index, date) {
423
+ var calendarKey = index === 0 ? 'start' : 'end';
424
+ var nextCalendarDate = Array.from(calendarDate);
425
+ nextCalendarDate[index] = date;
426
+ updateCalendarDateRange({
427
+ dateRange: nextCalendarDate,
428
+ calendarKey: calendarKey,
429
+ eventName: 'changeTime'
430
+ });
388
431
  setSelectedDates(function (prev) {
389
- var next = [].concat(prev);
390
- var clonedDate = new Date(date.valueOf()); // if next[index] is not empty, only update the time after aligning the year, month and day
432
+ var next = [].concat(prev); // if next[index] is not empty, only update the time after aligning the year, month and day
391
433
 
392
- if (next[index]) {
393
- clonedDate.setFullYear(next[index].getFullYear(), next[index].getMonth(), next[index].getDate());
394
- }
395
-
396
- next[index] = clonedDate;
434
+ next[index] = next[index] ? (0, _dateUtils.copyTime)({
435
+ from: date,
436
+ to: next[index]
437
+ }) : new Date(date.valueOf());
397
438
  return next;
398
439
  });
399
- updateSingleCalendarDate(index, date);
400
- }, [updateSingleCalendarDate]);
440
+ }, [calendarDate, updateCalendarDateRange]);
401
441
  /**
402
442
  * The callback triggered when PM/AM is switched.
403
443
  */
404
444
 
405
445
  var handleToggleMeridian = (0, _react.useCallback)(function (index) {
406
- var next = Array.from(calendarDate);
407
- var clonedDate = new Date(next[index].valueOf());
408
-
409
- var hours = _utils.DateUtils.getHours(clonedDate);
410
-
411
- var nextHours = hours >= 12 ? hours - 12 : hours + 12;
412
- next[index] = _utils.DateUtils.setHours(clonedDate, nextHours);
413
- setCalendarDate(next); // If the value already exists, update the value again.
446
+ var nextCalendarDate = Array.from(calendarDate);
447
+ nextCalendarDate[index] = (0, _dateUtils.getReversedTimeMeridian)(nextCalendarDate[index]);
448
+ setCalendarDate(nextCalendarDate); // If the value already exists, update the value again.
414
449
 
415
450
  if (selectedDates.length === 2) {
416
- setSelectedDates(next);
451
+ var nextSelectedDates = Array.from(selectedDates);
452
+ nextSelectedDates[index] = (0, _dateUtils.getReversedTimeMeridian)(nextSelectedDates[index]);
453
+ setSelectedDates(nextSelectedDates);
417
454
  }
418
455
  }, [calendarDate, selectedDates]);
419
456
  /**
@@ -425,7 +462,9 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
425
462
  closeOverlay = false;
426
463
  }
427
464
 
428
- updateCalendarDateRange(value);
465
+ updateCalendarDateRange({
466
+ dateRange: value
467
+ });
429
468
 
430
469
  if (closeOverlay) {
431
470
  handleValueUpdate(event, value, closeOverlay);
@@ -441,7 +480,9 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
441
480
  onOk === null || onOk === void 0 ? void 0 : onOk(selectedDates, event);
442
481
  }, [handleValueUpdate, onOk, selectedDates]);
443
482
  var handleClean = (0, _react.useCallback)(function (event) {
444
- updateCalendarDateRange(null);
483
+ updateCalendarDateRange({
484
+ dateRange: null
485
+ });
445
486
  handleValueUpdate(event, null);
446
487
  }, [handleValueUpdate, updateCalendarDateRange]);
447
488
  /**
@@ -478,7 +519,9 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
478
519
 
479
520
  setHoverDateRange(selectValue);
480
521
  setSelectedDates(selectValue);
481
- updateCalendarDateRange(selectValue);
522
+ updateCalendarDateRange({
523
+ dateRange: selectValue
524
+ });
482
525
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
483
526
  [character, rangeFormatStr, updateCalendarDateRange]);
484
527
  /**
@@ -501,13 +544,15 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
501
544
  nextCalendarDate = [_startDate2, (0, _dateUtils.isSameMonth)(_startDate2, endData) ? (0, _dateUtils.addMonths)(endData, 1) : endData];
502
545
  } else {
503
546
  // Reset the date on the calendar to the default date
504
- nextCalendarDate = (0, _utils2.getCalendarDate)({
547
+ nextCalendarDate = (0, _utils2.getSafeCalendarDate)({
505
548
  value: defaultCalendarValue !== null && defaultCalendarValue !== void 0 ? defaultCalendarValue : null
506
549
  });
507
550
  }
508
551
 
509
552
  setSelectedDates(value !== null && value !== void 0 ? value : []);
510
- updateCalendarDateRange(nextCalendarDate);
553
+ updateCalendarDateRange({
554
+ dateRange: nextCalendarDate
555
+ });
511
556
  }, [defaultCalendarValue, updateCalendarDateRange, setSelectedDates, value]);
512
557
  var handleEntered = (0, _react.useCallback)(function () {
513
558
  onOpen === null || onOpen === void 0 ? void 0 : onOpen();
@@ -594,7 +639,7 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
594
639
  showWeekNumbers: showWeekNumbers,
595
640
  value: selectedDates,
596
641
  showMeridian: showMeridian,
597
- onChangeCalendarDate: updateSingleCalendarDate,
642
+ onChangeCalendarMonth: updateSingleCalendarMonth,
598
643
  onChangeCalendarTime: updateSingleCalendarTime,
599
644
  onMouseMove: handleMouseMove,
600
645
  onSelect: handleSelectDate,
@@ -1,5 +1,5 @@
1
1
  import { DateRange } from './types';
2
- export declare function getCalendarDate({ value, calendarKey }: {
2
+ export declare function getSafeCalendarDate({ value, calendarKey }: {
3
3
  value: [] | [Date] | [Date, Date] | null;
4
4
  calendarKey?: 'start' | 'end';
5
5
  }): DateRange;