rsuite 5.22.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.
@@ -82,7 +82,7 @@ var CalendarPanel = /*#__PURE__*/React.forwardRef(function (props, ref) {
82
82
  renderCell: customRenderCell,
83
83
  onMoveForward: handleChange,
84
84
  onMoveBackward: handleChange,
85
- onChangePageDate: handleChange,
85
+ onChangeMonth: handleChange,
86
86
  onSelect: handleSelect
87
87
  }));
88
88
  });
@@ -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. */
@@ -30,8 +30,8 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
30
30
  isoWeek = _props$isoWeek === void 0 ? false : _props$isoWeek,
31
31
  limitEndYear = props.limitEndYear,
32
32
  locale = props.locale,
33
- onChangePageDate = props.onChangePageDate,
34
- onChangePageTime = props.onChangePageTime,
33
+ onChangeMonth = props.onChangeMonth,
34
+ onChangeTime = props.onChangeTime,
35
35
  onMouseMove = props.onMouseMove,
36
36
  onMoveBackward = props.onMoveBackward,
37
37
  onMoveForward = props.onMoveForward,
@@ -46,7 +46,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
46
46
  showMeridian = props.showMeridian,
47
47
  showWeekNumbers = props.showWeekNumbers,
48
48
  inline = props.inline,
49
- rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "inSameMonth", "isoWeek", "limitEndYear", "locale", "onChangePageDate", "onChangePageTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
49
+ rest = _objectWithoutPropertiesLoose(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"]);
50
50
 
51
51
  var _useClassNames = useClassNames(classPrefix),
52
52
  withClassPrefix = _useClassNames.withClassPrefix,
@@ -118,10 +118,10 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
118
118
  'show-week-numbers': showWeekNumbers
119
119
  }));
120
120
  var timeDropdownProps = pick(rest, calendarOnlyProps);
121
- var handleChangePageDate = useCallback(function (date, event) {
121
+ var handleChangeMonth = useCallback(function (date, event) {
122
122
  reset();
123
- onChangePageDate === null || onChangePageDate === void 0 ? void 0 : onChangePageDate(date, event);
124
- }, [onChangePageDate, reset]);
123
+ onChangeMonth === null || onChangeMonth === void 0 ? void 0 : onChangeMonth(date, event);
124
+ }, [onChangeMonth, reset]);
125
125
  var contextValue = useMemo(function () {
126
126
  return {
127
127
  date: calendarDate,
@@ -132,15 +132,15 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
132
132
  inSameMonth: inSameMonth !== null && inSameMonth !== void 0 ? inSameMonth : inSameThisMonthDate,
133
133
  isoWeek: isoWeek,
134
134
  locale: locale,
135
- onChangePageDate: handleChangePageDate,
136
- onChangePageTime: onChangePageTime,
135
+ onChangeMonth: handleChangeMonth,
136
+ onChangeTime: onChangeTime,
137
137
  onMouseMove: onMouseMove,
138
138
  onSelect: onSelect,
139
139
  renderCell: renderCell,
140
140
  showWeekNumbers: showWeekNumbers,
141
141
  inline: inline
142
142
  };
143
- }, [calendarDate, dateRange, format, handleChangePageDate, hoverRangeValue, inSameMonth, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangePageTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
143
+ }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameMonth, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, renderCell, showWeekNumbers]);
144
144
  return /*#__PURE__*/React.createElement(CalendarProvider, {
145
145
  value: contextValue
146
146
  }, /*#__PURE__*/React.createElement(Component, _extends({}, omitHideDisabledProps(rest), {
@@ -190,8 +190,8 @@ CalendarContainer.propTypes = {
190
190
  isoWeek: PropTypes.bool,
191
191
  limitEndYear: PropTypes.number,
192
192
  locale: PropTypes.object,
193
- onChangePageDate: PropTypes.func,
194
- onChangePageTime: PropTypes.func,
193
+ onChangeMonth: PropTypes.func,
194
+ onChangeTime: PropTypes.func,
195
195
  onMoveBackward: PropTypes.func,
196
196
  onMoveForward: PropTypes.func,
197
197
  onSelect: PropTypes.func,
@@ -20,7 +20,7 @@ var MonthDropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
20
20
 
21
21
  var _useCalendarContext = useCalendarContext(),
22
22
  date = _useCalendarContext.date,
23
- onSelect = _useCalendarContext.onChangePageDate;
23
+ onSelect = _useCalendarContext.onChangeMonth;
24
24
 
25
25
  var handleClick = useCallback(function (event) {
26
26
  if (disabled) {
@@ -102,7 +102,7 @@ var TimeDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
102
102
  locale = _useCalendarContext.locale,
103
103
  format = _useCalendarContext.format,
104
104
  date = _useCalendarContext.date,
105
- onSelect = _useCalendarContext.onChangePageTime;
105
+ onSelect = _useCalendarContext.onChangeTime;
106
106
 
107
107
  var rowRef = useRef(null);
108
108
  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;
@@ -132,7 +132,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
132
132
  * A callback triggered when the time on the calendar changes.
133
133
  */
134
134
 
135
- var handleChangePageTime = useCallback(function (nextPageTime) {
135
+ var handleChangeTime = useCallback(function (nextPageTime) {
136
136
  setCalendarDate(nextPageTime);
137
137
  handleDateChange(nextPageTime);
138
138
  }, [handleDateChange, setCalendarDate]);
@@ -230,7 +230,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
230
230
  * A callback triggered when the date on the calendar changes.
231
231
  */
232
232
 
233
- var handleChangePageDate = useCallback(function (nextPageDate, event) {
233
+ var handleChangeMonth = useCallback(function (nextPageDate, event) {
234
234
  setCalendarDate(nextPageDate);
235
235
  handleDateChange(nextPageDate); // Show only the calendar month panel. formatStr = 'yyyy-MM'
236
236
 
@@ -332,8 +332,8 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
332
332
  onSelect: handleSelect,
333
333
  onToggleMonthDropdown: onToggleMonthDropdown,
334
334
  onToggleTimeDropdown: onToggleTimeDropdown,
335
- onChangePageDate: handleChangePageDate,
336
- onChangePageTime: handleChangePageTime,
335
+ onChangeMonth: handleChangeMonth,
336
+ onChangeTime: handleChangeTime,
337
337
  onToggleMeridian: handleToggleMeridian
338
338
  }));
339
339
  var sideRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
@@ -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
  }
@@ -16,23 +16,27 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
16
16
  _props$index = props.index,
17
17
  index = _props$index === void 0 ? 0 : _props$index,
18
18
  limitEndYear = props.limitEndYear,
19
- onChangeCalendarDate = props.onChangeCalendarDate,
19
+ onChangeCalendarMonth = props.onChangeCalendarMonth,
20
20
  onChangeCalendarTime = props.onChangeCalendarTime,
21
21
  onToggleMeridian = props.onToggleMeridian,
22
+ onSelect = props.onSelect,
22
23
  _props$value = props.value,
23
24
  value = _props$value === void 0 ? [] : _props$value,
24
- rest = _objectWithoutPropertiesLoose(props, ["as", "calendarDate", "format", "disabledDate", "index", "limitEndYear", "onChangeCalendarDate", "onChangeCalendarTime", "onToggleMeridian", "value"]);
25
+ rest = _objectWithoutPropertiesLoose(props, ["as", "calendarDate", "format", "disabledDate", "index", "limitEndYear", "onChangeCalendarMonth", "onChangeCalendarTime", "onToggleMeridian", "onSelect", "value"]);
25
26
 
26
27
  var onMoveForward = useCallback(function (nextPageDate) {
27
- onChangeCalendarDate === null || onChangeCalendarDate === void 0 ? void 0 : onChangeCalendarDate(index, nextPageDate);
28
- }, [index, onChangeCalendarDate]);
28
+ onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
29
+ }, [index, onChangeCalendarMonth]);
29
30
  var onMoveBackward = useCallback(function (nextPageDate) {
30
- onChangeCalendarDate === null || onChangeCalendarDate === void 0 ? void 0 : onChangeCalendarDate(index, nextPageDate);
31
- }, [index, onChangeCalendarDate]);
32
- var handleChangePageDate = useCallback(function (nextPageDate) {
33
- onChangeCalendarDate === null || onChangeCalendarDate === void 0 ? void 0 : onChangeCalendarDate(index, nextPageDate);
34
- }, [index, onChangeCalendarDate]);
35
- var handleChangePageTime = useCallback(function (nextPageDate) {
31
+ onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
32
+ }, [index, onChangeCalendarMonth]);
33
+ var handleSelect = useCallback(function (date, event) {
34
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(index, date, event);
35
+ }, [index, onSelect]);
36
+ var handleChangeMonth = useCallback(function (nextPageDate) {
37
+ onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
38
+ }, [index, onChangeCalendarMonth]);
39
+ var handleChangeTime = useCallback(function (nextPageDate) {
36
40
  onChangeCalendarTime === null || onChangeCalendarTime === void 0 ? void 0 : onChangeCalendarTime(index, nextPageDate);
37
41
  }, [index, onChangeCalendarTime]);
38
42
  var handleToggleMeridian = useCallback(function (event) {
@@ -60,11 +64,12 @@ var Calendar = /*#__PURE__*/React.forwardRef(function (props, ref) {
60
64
  inSameMonth: inSameMonth,
61
65
  index: index,
62
66
  limitEndYear: limitEndYear,
63
- onChangePageDate: handleChangePageDate,
64
- onChangePageTime: handleChangePageTime,
67
+ onChangeMonth: handleChangeMonth,
68
+ onChangeTime: handleChangeTime,
65
69
  onMoveBackward: handleMoveBackward,
66
70
  onMoveForward: handleMoveForward,
67
71
  onToggleMeridian: handleToggleMeridian,
72
+ onSelect: handleSelect,
68
73
  calendarDate: getCalendarDate(),
69
74
  ref: ref
70
75
  }));
@@ -82,6 +87,6 @@ Calendar.propTypes = {
82
87
  disabledDate: PropTypes.func,
83
88
  onSelect: PropTypes.func,
84
89
  onMouseMove: PropTypes.func,
85
- onChangeCalendarDate: PropTypes.func
90
+ onChangeCalendarMonth: PropTypes.func
86
91
  };
87
92
  export default Calendar;
@@ -13,10 +13,10 @@ import PredefinedRanges from '../DatePicker/PredefinedRanges';
13
13
  import Stack from '../Stack';
14
14
  import { omitTriggerPropKeys, PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
15
15
  import { createChainedFunction, DATERANGE_DISABLED_TARGET, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
16
- import { addMonths, compareAsc, isSameMonth, startOfDay, endOfDay } from '../utils/dateUtils';
16
+ import { addMonths, compareAsc, isSameMonth, startOfDay, endOfDay, shouldRenderTime, isAfter, copyTime, reverseDateRangeOmitTime, getReversedTimeMeridian } from '../utils/dateUtils';
17
17
  import Calendar from './Calendar';
18
18
  import * as disabledDateUtils from './disabledDateUtils';
19
- import { getCalendarDate, getMonthHoverRange, getWeekHoverRange, isSameRange } from './utils';
19
+ import { getSafeCalendarDate, getMonthHoverRange, getWeekHoverRange, isSameRange } from './utils';
20
20
  var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
21
21
  var _ref, _ref2, _merge;
22
22
 
@@ -116,8 +116,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
116
116
  setHoverDateRange = _useState2[1]; // The displayed calendar panel is rendered based on this value.
117
117
 
118
118
 
119
- var _useState3 = useState(getCalendarDate({
120
- value: (_ref2 = valueProp !== null && valueProp !== void 0 ? valueProp : defaultCalendarValue) !== null && _ref2 !== void 0 ? _ref2 : null
119
+ var _useState3 = useState(getSafeCalendarDate({
120
+ value: (_ref2 = value !== null && value !== void 0 ? value : defaultCalendarValue) !== null && _ref2 !== void 0 ? _ref2 : null
121
121
  })),
122
122
  calendarDate = _useState3[0],
123
123
  setCalendarDate = _useState3[1];
@@ -134,43 +134,46 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
134
134
 
135
135
  var selectRangeValueRef = useRef(null);
136
136
  /**
137
- * Get the time on the second calendar as the end of the date range.
137
+ * Get the time on the calendar.
138
138
  */
139
139
 
140
- var getCalendarEndDatetime = useCallback(function (date) {
141
- var getHours = DateUtils.getHours,
142
- getMinutes = DateUtils.getMinutes,
143
- getSeconds = DateUtils.getSeconds,
144
- set = DateUtils.set;
145
- var calendarEndDate = (calendarDate === null || calendarDate === void 0 ? void 0 : calendarDate[1]) || (defaultCalendarValue === null || defaultCalendarValue === void 0 ? void 0 : defaultCalendarValue[1]);
146
- return set(date, {
147
- hours: getHours(calendarEndDate),
148
- minutes: getMinutes(calendarEndDate),
149
- seconds: getSeconds(calendarEndDate)
150
- });
140
+ var getCalendarDatetime = useCallback(function (calendarKey) {
141
+ var index = calendarKey === 'start' ? 0 : 1;
142
+ return (calendarDate === null || calendarDate === void 0 ? void 0 : calendarDate[index]) || (defaultCalendarValue === null || defaultCalendarValue === void 0 ? void 0 : defaultCalendarValue[index]);
151
143
  }, [calendarDate, defaultCalendarValue]);
152
144
  /**
153
145
  * Call this function to update the calendar panel rendering benchmark value.
154
146
  * If params `value` is not passed, it defaults to [new Date(), addMonth(new Date(), 1)].
155
147
  */
156
148
 
157
- var updateCalendarDateRange = useCallback(function (selectedDate, calendarKey) {
158
- var nextValue = selectedDate;
159
- var shouldRenderTime = DateUtils.shouldRenderTime;
149
+ var updateCalendarDateRange = useCallback(function (_ref3) {
150
+ var dateRange = _ref3.dateRange,
151
+ calendarKey = _ref3.calendarKey,
152
+ eventName = _ref3.eventName;
153
+ var nextValue = dateRange; // The time should remain the same when the dates in the date range are changed.
160
154
 
161
- if (shouldRenderTime(formatStr) && calendarKey === undefined && selectedDate !== null && selectedDate !== void 0 && selectedDate.length) {
162
- var _startDate = selectedDate[0];
155
+ if (shouldRenderTime(formatStr) && dateRange !== null && dateRange !== void 0 && dateRange.length && eventName !== 'changeTime') {
156
+ var _startDate = copyTime({
157
+ from: getCalendarDatetime('start'),
158
+ to: dateRange[0]
159
+ });
163
160
 
164
- var _endDate = getCalendarEndDatetime(addMonths(_startDate, 1));
161
+ var _endDate = copyTime({
162
+ from: getCalendarDatetime('end'),
163
+ to: dateRange.length === 1 ? addMonths(_startDate, 1) : dateRange[1]
164
+ });
165
165
 
166
166
  nextValue = [_startDate, _endDate];
167
+ } else if (dateRange === null && typeof defaultCalendarValue !== 'undefined') {
168
+ // Make the calendar render the value of defaultCalendarValue after clearing the value.
169
+ nextValue = defaultCalendarValue;
167
170
  }
168
171
 
169
- setCalendarDate(getCalendarDate({
172
+ setCalendarDate(getSafeCalendarDate({
170
173
  value: nextValue,
171
174
  calendarKey: calendarKey
172
175
  }));
173
- }, [getCalendarEndDatetime, formatStr]); // if valueProp changed then update selectValue/hoverValue
176
+ }, [formatStr, defaultCalendarValue, getCalendarDatetime]); // if valueProp changed then update selectValue/hoverValue
174
177
 
175
178
  useEffect(function () {
176
179
  setSelectedDates(valueProp !== null && valueProp !== void 0 ? valueProp : []);
@@ -248,8 +251,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
248
251
  return null;
249
252
  }
250
253
 
251
- if (DateUtils.isAfter(hoverValues[0], hoverValues[1])) {
252
- hoverValues.reverse();
254
+ if (isAfter(hoverValues[0], hoverValues[1])) {
255
+ hoverValues = reverseDateRangeOmitTime(hoverValues);
253
256
  }
254
257
 
255
258
  return hoverValues;
@@ -306,7 +309,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
306
309
  * Callback for selecting a date cell in the calendar grid
307
310
  */
308
311
 
309
- var handleSelectDate = useCallback(function (date, event) {
312
+ var handleSelectDate = useCallback(function (index, date, event) {
313
+ var calendarKey = index === 0 ? 'start' : 'end';
310
314
  var nextSelectDates = hoverDateRange !== null && hoverDateRange !== void 0 ? hoverDateRange : [];
311
315
  var hoverRangeValue = getHoverRangeValue(date);
312
316
  var noHoverRangeValid = isNil(hoverRangeValue); // in `oneTap` mode
@@ -336,17 +340,20 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
336
340
  }
337
341
  }
338
342
 
339
- var shouldRenderTime = DateUtils.shouldRenderTime,
340
- isAfter = DateUtils.isAfter;
341
-
342
343
  if (nextSelectDates.length === 2) {
343
344
  // If user have completed the selection, then sort the selected dates.
344
345
  if (isAfter(nextSelectDates[0], nextSelectDates[1])) {
345
- nextSelectDates.reverse();
346
+ nextSelectDates = reverseDateRangeOmitTime(nextSelectDates);
346
347
  }
347
348
 
348
349
  if (shouldRenderTime(formatStr)) {
349
- nextSelectDates[1] = getCalendarEndDatetime(nextSelectDates[1]);
350
+ nextSelectDates = [copyTime({
351
+ from: getCalendarDatetime('start'),
352
+ to: nextSelectDates[0]
353
+ }), copyTime({
354
+ from: getCalendarDatetime('end'),
355
+ to: nextSelectDates[1]
356
+ })];
350
357
  }
351
358
 
352
359
  setHoverDateRange(nextSelectDates);
@@ -355,10 +362,14 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
355
362
  }
356
363
 
357
364
  setSelectedDates(nextSelectDates);
358
- updateCalendarDateRange(nextSelectDates);
365
+ updateCalendarDateRange({
366
+ dateRange: nextSelectDates,
367
+ calendarKey: calendarKey,
368
+ eventName: 'changeDate'
369
+ });
359
370
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(date, event);
360
371
  hasDoneSelect.current = !hasDoneSelect.current;
361
- }, [formatStr, getCalendarEndDatetime, getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
372
+ }, [formatStr, getCalendarDatetime, getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
362
373
  /**
363
374
  * If `selectValue` changed, there will be the following effects.
364
375
  * 1. Check if the selection is completed.
@@ -370,39 +381,48 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
370
381
  var doneSelected = selectValueLength === 0 || selectValueLength === 2;
371
382
  doneSelected && setHoverDateRange(null);
372
383
  }, [selectedDates]);
373
- var updateSingleCalendarDate = useCallback(function (index, date) {
384
+ var updateSingleCalendarMonth = useCallback(function (index, date) {
385
+ var calendarKey = index === 0 ? 'start' : 'end';
374
386
  var nextCalendarDate = Array.from(calendarDate);
375
387
  nextCalendarDate[index] = date;
376
- updateCalendarDateRange(nextCalendarDate, index === 0 ? 'start' : 'end');
388
+ updateCalendarDateRange({
389
+ dateRange: nextCalendarDate,
390
+ calendarKey: calendarKey,
391
+ eventName: 'changeMonth'
392
+ });
377
393
  }, [calendarDate, updateCalendarDateRange]);
378
394
  var updateSingleCalendarTime = useCallback(function (index, date) {
395
+ var calendarKey = index === 0 ? 'start' : 'end';
396
+ var nextCalendarDate = Array.from(calendarDate);
397
+ nextCalendarDate[index] = date;
398
+ updateCalendarDateRange({
399
+ dateRange: nextCalendarDate,
400
+ calendarKey: calendarKey,
401
+ eventName: 'changeTime'
402
+ });
379
403
  setSelectedDates(function (prev) {
380
- var next = [].concat(prev);
381
- var clonedDate = new Date(date.valueOf()); // if next[index] is not empty, only update the time after aligning the year, month and day
404
+ var next = [].concat(prev); // if next[index] is not empty, only update the time after aligning the year, month and day
382
405
 
383
- if (next[index]) {
384
- clonedDate.setFullYear(next[index].getFullYear(), next[index].getMonth(), next[index].getDate());
385
- }
386
-
387
- next[index] = clonedDate;
406
+ next[index] = next[index] ? copyTime({
407
+ from: date,
408
+ to: next[index]
409
+ }) : new Date(date.valueOf());
388
410
  return next;
389
411
  });
390
- updateSingleCalendarDate(index, date);
391
- }, [updateSingleCalendarDate]);
412
+ }, [calendarDate, updateCalendarDateRange]);
392
413
  /**
393
414
  * The callback triggered when PM/AM is switched.
394
415
  */
395
416
 
396
417
  var handleToggleMeridian = useCallback(function (index) {
397
- var next = Array.from(calendarDate);
398
- var clonedDate = new Date(next[index].valueOf());
399
- var hours = DateUtils.getHours(clonedDate);
400
- var nextHours = hours >= 12 ? hours - 12 : hours + 12;
401
- next[index] = DateUtils.setHours(clonedDate, nextHours);
402
- setCalendarDate(next); // If the value already exists, update the value again.
418
+ var nextCalendarDate = Array.from(calendarDate);
419
+ nextCalendarDate[index] = getReversedTimeMeridian(nextCalendarDate[index]);
420
+ setCalendarDate(nextCalendarDate); // If the value already exists, update the value again.
403
421
 
404
422
  if (selectedDates.length === 2) {
405
- setSelectedDates(next);
423
+ var nextSelectedDates = Array.from(selectedDates);
424
+ nextSelectedDates[index] = getReversedTimeMeridian(nextSelectedDates[index]);
425
+ setSelectedDates(nextSelectedDates);
406
426
  }
407
427
  }, [calendarDate, selectedDates]);
408
428
  /**
@@ -414,7 +434,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
414
434
  closeOverlay = false;
415
435
  }
416
436
 
417
- updateCalendarDateRange(value);
437
+ updateCalendarDateRange({
438
+ dateRange: value
439
+ });
418
440
 
419
441
  if (closeOverlay) {
420
442
  handleValueUpdate(event, value, closeOverlay);
@@ -430,7 +452,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
430
452
  onOk === null || onOk === void 0 ? void 0 : onOk(selectedDates, event);
431
453
  }, [handleValueUpdate, onOk, selectedDates]);
432
454
  var handleClean = useCallback(function (event) {
433
- updateCalendarDateRange(null);
455
+ updateCalendarDateRange({
456
+ dateRange: null
457
+ });
434
458
  handleValueUpdate(event, null);
435
459
  }, [handleValueUpdate, updateCalendarDateRange]);
436
460
  /**
@@ -467,7 +491,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
467
491
 
468
492
  setHoverDateRange(selectValue);
469
493
  setSelectedDates(selectValue);
470
- updateCalendarDateRange(selectValue);
494
+ updateCalendarDateRange({
495
+ dateRange: selectValue
496
+ });
471
497
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
472
498
  [character, rangeFormatStr, updateCalendarDateRange]);
473
499
  /**
@@ -490,13 +516,15 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
490
516
  nextCalendarDate = [_startDate2, isSameMonth(_startDate2, endData) ? addMonths(endData, 1) : endData];
491
517
  } else {
492
518
  // Reset the date on the calendar to the default date
493
- nextCalendarDate = getCalendarDate({
519
+ nextCalendarDate = getSafeCalendarDate({
494
520
  value: defaultCalendarValue !== null && defaultCalendarValue !== void 0 ? defaultCalendarValue : null
495
521
  });
496
522
  }
497
523
 
498
524
  setSelectedDates(value !== null && value !== void 0 ? value : []);
499
- updateCalendarDateRange(nextCalendarDate);
525
+ updateCalendarDateRange({
526
+ dateRange: nextCalendarDate
527
+ });
500
528
  }, [defaultCalendarValue, updateCalendarDateRange, setSelectedDates, value]);
501
529
  var handleEntered = useCallback(function () {
502
530
  onOpen === null || onOpen === void 0 ? void 0 : onOpen();
@@ -585,7 +613,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
585
613
  showWeekNumbers: showWeekNumbers,
586
614
  value: selectedDates,
587
615
  showMeridian: showMeridian,
588
- onChangeCalendarDate: updateSingleCalendarDate,
616
+ onChangeCalendarMonth: updateSingleCalendarMonth,
589
617
  onChangeCalendarTime: updateSingleCalendarTime,
590
618
  onMouseMove: handleMouseMove,
591
619
  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;
@@ -1,5 +1,5 @@
1
- import { addMonths, getMonth, isSameDay, shouldRenderTime, isSameSecond, startOfMonth, endOfMonth, startOfISOWeek, endOfISOWeek, startOfWeek, endOfWeek } from '../utils/dateUtils';
2
- export function getCalendarDate(_ref) {
1
+ import { addMonths, isSameDay, shouldRenderTime, isSameSecond, startOfMonth, endOfMonth, startOfISOWeek, endOfISOWeek, startOfWeek, endOfWeek, differenceInCalendarMonths, copyTime } from '../utils/dateUtils';
2
+ export function getSafeCalendarDate(_ref) {
3
3
  var _value;
4
4
 
5
5
  var value = _ref.value,
@@ -9,13 +9,18 @@ export function getCalendarDate(_ref) {
9
9
  value = (_value = value) !== null && _value !== void 0 ? _value : [];
10
10
 
11
11
  if (value[0] && value[1]) {
12
- var startMonth = getMonth(value[0]);
13
- var endMonth = getMonth(value[1]);
12
+ var diffMonth = differenceInCalendarMonths(value[1], value[0]);
14
13
 
15
14
  if (calendarKey === 'start') {
16
- return [value[0], startMonth >= endMonth ? addMonths(value[0], 1) : value[1]];
15
+ return [value[0], diffMonth <= 0 ? copyTime({
16
+ from: value[1],
17
+ to: addMonths(value[0], 1)
18
+ }) : value[1]];
17
19
  } else if (calendarKey === 'end') {
18
- return [startMonth >= endMonth ? addMonths(value[1], -1) : value[0], value[1]];
20
+ return [diffMonth <= 0 ? copyTime({
21
+ from: value[0],
22
+ to: addMonths(value[1], -1)
23
+ }) : value[0], value[1]];
19
24
  } // If only the start date
20
25
 
21
26
  } else if (value[0]) {
@@ -36,6 +36,7 @@ export { default as subDays } from 'date-fns/subDays';
36
36
  export { default as isMatch } from 'date-fns/isMatch';
37
37
  export { default as isValid } from 'date-fns/isValid';
38
38
  export { default as set } from 'date-fns/set';
39
+ export { default as differenceInCalendarMonths } from 'date-fns/differenceInCalendarMonths';
39
40
  export declare type CalendarOnlyPropsType = 'disabledHours' | 'disabledMinutes' | 'disabledSeconds' | 'hideHours' | 'hideMinutes' | 'hideSeconds';
40
41
  export declare const calendarOnlyProps: CalendarOnlyPropsType[];
41
42
  /**
@@ -56,3 +57,18 @@ export declare const shouldOnlyRenderTime: (format: string) => boolean;
56
57
  */
57
58
  export declare function getMonthView(monthDate: Date, isoWeek: boolean): Date[];
58
59
  export declare function getDateMask(formatStr: string): (string | RegExp)[];
60
+ /**
61
+ * Copy the time of one date to another
62
+ */
63
+ export declare function copyTime({ from, to }: {
64
+ from: Date;
65
+ to: Date;
66
+ }): Date;
67
+ /**
68
+ * Swap two dates without swapping the time.
69
+ */
70
+ export declare function reverseDateRangeOmitTime(dateRange: [Date, Date]): [Date, Date];
71
+ /**
72
+ * Get the time with AM and PM reversed.
73
+ */
74
+ export declare const getReversedTimeMeridian: (date: Date) => Date;
@@ -1,10 +1,12 @@
1
1
  import pick from 'lodash/pick';
2
2
  import omitBy from 'lodash/omitBy';
3
3
  import getHours from 'date-fns/getHours';
4
+ import setHours from 'date-fns/setHours';
4
5
  import getDay from 'date-fns/getDay';
5
6
  import getMinutes from 'date-fns/getMinutes';
6
7
  import getSeconds from 'date-fns/getSeconds';
7
8
  import addDays from 'date-fns/addDays';
9
+ import set from 'date-fns/set';
8
10
  export { default as addDays } from 'date-fns/addDays';
9
11
  export { default as addMonths } from 'date-fns/addMonths';
10
12
  export { default as compareAsc } from 'date-fns/compareAsc';
@@ -43,6 +45,7 @@ export { default as subDays } from 'date-fns/subDays';
43
45
  export { default as isMatch } from 'date-fns/isMatch';
44
46
  export { default as isValid } from 'date-fns/isValid';
45
47
  export { default as set } from 'date-fns/set';
48
+ export { default as differenceInCalendarMonths } from 'date-fns/differenceInCalendarMonths';
46
49
  var disabledTimeProps = ['disabledHours', 'disabledMinutes', 'disabledSeconds'];
47
50
  var hideTimeProps = ['hideHours', 'hideMinutes', 'hideSeconds'];
48
51
  export var calendarOnlyProps = disabledTimeProps.concat(hideTimeProps);
@@ -132,4 +135,47 @@ export function getDateMask(formatStr) {
132
135
  return Array.from(formatStr).map(function (i) {
133
136
  return i.match(/[A-Za-z]/) ? /[\d|A-Za-z]/ : i;
134
137
  });
135
- }
138
+ }
139
+ /**
140
+ * Copy the time of one date to another
141
+ */
142
+
143
+ export function copyTime(_ref) {
144
+ var from = _ref.from,
145
+ to = _ref.to;
146
+ return set(to, {
147
+ hours: getHours(from),
148
+ minutes: getMinutes(from),
149
+ seconds: getSeconds(from)
150
+ });
151
+ }
152
+ /**
153
+ * Swap two dates without swapping the time.
154
+ */
155
+
156
+ export function reverseDateRangeOmitTime(dateRange) {
157
+ var start = dateRange[0],
158
+ end = dateRange[1];
159
+
160
+ if (start && end) {
161
+ return [copyTime({
162
+ from: start,
163
+ to: end
164
+ }), copyTime({
165
+ from: end,
166
+ to: start
167
+ })];
168
+ }
169
+
170
+ return dateRange;
171
+ }
172
+ /**
173
+ * Get the time with AM and PM reversed.
174
+ */
175
+
176
+ export var getReversedTimeMeridian = function getReversedTimeMeridian(date) {
177
+ var clonedDate = new Date(date.valueOf());
178
+ var hours = getHours(clonedDate);
179
+ var nextHours = hours >= 12 ? hours - 12 : hours + 12;
180
+ return setHours(clonedDate, nextHours);
181
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rsuite",
3
- "version": "5.22.0",
3
+ "version": "5.22.1",
4
4
  "description": "A suite of react components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",