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
@@ -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;
@@ -10,6 +10,8 @@ import IconClockO from '@rsuite/icons/legacy/ClockO';
10
10
  import CalendarContainer from '../Calendar/CalendarContainer';
11
11
  import useCalendarDate from '../Calendar/useCalendarDate';
12
12
  import Toolbar from './Toolbar';
13
+ import Stack from '../Stack';
14
+ import PredefinedRanges from './PredefinedRanges';
13
15
  import { composeFunctions, createChainedFunction, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
14
16
  import { PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, omitTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
15
17
  import { OverlayCloseCause } from '../Overlay/OverlayTrigger';
@@ -130,7 +132,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
130
132
  * A callback triggered when the time on the calendar changes.
131
133
  */
132
134
 
133
- var handleChangePageTime = useCallback(function (nextPageTime) {
135
+ var handleChangeTime = useCallback(function (nextPageTime) {
134
136
  setCalendarDate(nextPageTime);
135
137
  handleDateChange(nextPageTime);
136
138
  }, [handleDateChange, setCalendarDate]);
@@ -228,7 +230,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
228
230
  * A callback triggered when the date on the calendar changes.
229
231
  */
230
232
 
231
- var handleChangePageDate = useCallback(function (nextPageDate, event) {
233
+ var handleChangeMonth = useCallback(function (nextPageDate, event) {
232
234
  setCalendarDate(nextPageDate);
233
235
  handleDateChange(nextPageDate); // Show only the calendar month panel. formatStr = 'yyyy-MM'
234
236
 
@@ -330,10 +332,16 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
330
332
  onSelect: handleSelect,
331
333
  onToggleMonthDropdown: onToggleMonthDropdown,
332
334
  onToggleTimeDropdown: onToggleTimeDropdown,
333
- onChangePageDate: handleChangePageDate,
334
- onChangePageTime: handleChangePageTime,
335
+ onChangeMonth: handleChangeMonth,
336
+ onChangeTime: handleChangeTime,
335
337
  onToggleMeridian: handleToggleMeridian
336
338
  }));
339
+ var sideRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
340
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'left';
341
+ })) || [];
342
+ var bottomRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
343
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
344
+ })) || [];
337
345
 
338
346
  var renderDropdownMenu = function renderDropdownMenu(positionProps, speakerRef) {
339
347
  var left = positionProps.left,
@@ -350,16 +358,27 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
350
358
  ref: mergeRefs(overlayRef, speakerRef),
351
359
  style: styles,
352
360
  target: triggerRef
353
- }, calendar, /*#__PURE__*/React.createElement(Toolbar, {
361
+ }, /*#__PURE__*/React.createElement(Stack, {
362
+ alignItems: "flex-start"
363
+ }, sideRanges.length > 0 && /*#__PURE__*/React.createElement(PredefinedRanges, {
364
+ direction: "column",
365
+ spacing: 0,
366
+ className: prefix('date-predefined'),
367
+ ranges: sideRanges,
368
+ calendarDate: calendarDate,
369
+ locale: locale,
370
+ disabledShortcut: disabledToolbarHandle,
371
+ onClickShortcut: handleShortcutPageDate
372
+ }), /*#__PURE__*/React.createElement(React.Fragment, null, calendar, /*#__PURE__*/React.createElement(Toolbar, {
354
373
  locale: locale,
355
- ranges: ranges,
374
+ ranges: bottomRanges,
356
375
  calendarDate: calendarDate,
357
376
  disabledOkBtn: disabledToolbarHandle,
358
377
  disabledShortcut: disabledToolbarHandle,
359
378
  onClickShortcut: handleShortcutPageDate,
360
379
  onOk: handleOK,
361
380
  hideOkBtn: oneTap
362
- }));
381
+ }))));
363
382
  };
364
383
 
365
384
  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
  }
@@ -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];
@@ -133,37 +133,47 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
133
133
 
134
134
 
135
135
  var selectRangeValueRef = useRef(null);
136
+ /**
137
+ * Get the time on the calendar.
138
+ */
139
+
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]);
143
+ }, [calendarDate, defaultCalendarValue]);
136
144
  /**
137
145
  * Call this function to update the calendar panel rendering benchmark value.
138
146
  * If params `value` is not passed, it defaults to [new Date(), addMonth(new Date(), 1)].
139
147
  */
140
148
 
141
- var updateCalendarDateRange = useCallback(function (selectedDate, calendarKey) {
142
- var nextValue = selectedDate;
143
- var shouldRenderTime = DateUtils.shouldRenderTime,
144
- getHours = DateUtils.getHours,
145
- getMinutes = DateUtils.getMinutes,
146
- getSeconds = DateUtils.getSeconds,
147
- set = DateUtils.set;
148
-
149
- if (shouldRenderTime(formatStr) && calendarKey === undefined && (selectedDate === null || selectedDate === void 0 ? void 0 : selectedDate.length) === 1) {
150
- var calendarEndDate = (calendarDate === null || calendarDate === void 0 ? void 0 : calendarDate[1]) || (defaultCalendarValue === null || defaultCalendarValue === void 0 ? void 0 : defaultCalendarValue[1]);
151
- 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.
152
-
153
- var _endDate = set(addMonths(_startDate, 1), {
154
- hours: getHours(calendarEndDate),
155
- minutes: getMinutes(calendarEndDate),
156
- seconds: getSeconds(calendarEndDate)
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.
154
+
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
+ });
160
+
161
+ var _endDate = copyTime({
162
+ from: getCalendarDatetime('end'),
163
+ to: dateRange.length === 1 ? addMonths(_startDate, 1) : dateRange[1]
157
164
  });
158
165
 
159
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;
160
170
  }
161
171
 
162
- setCalendarDate(getCalendarDate({
172
+ setCalendarDate(getSafeCalendarDate({
163
173
  value: nextValue,
164
174
  calendarKey: calendarKey
165
175
  }));
166
- }, [calendarDate, defaultCalendarValue, formatStr]); // if valueProp changed then update selectValue/hoverValue
176
+ }, [formatStr, defaultCalendarValue, getCalendarDatetime]); // if valueProp changed then update selectValue/hoverValue
167
177
 
168
178
  useEffect(function () {
169
179
  setSelectedDates(valueProp !== null && valueProp !== void 0 ? valueProp : []);
@@ -241,8 +251,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
241
251
  return null;
242
252
  }
243
253
 
244
- if (DateUtils.isAfter(hoverValues[0], hoverValues[1])) {
245
- hoverValues.reverse();
254
+ if (isAfter(hoverValues[0], hoverValues[1])) {
255
+ hoverValues = reverseDateRangeOmitTime(hoverValues);
246
256
  }
247
257
 
248
258
  return hoverValues;
@@ -299,7 +309,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
299
309
  * Callback for selecting a date cell in the calendar grid
300
310
  */
301
311
 
302
- var handleSelectDate = useCallback(function (date, event) {
312
+ var handleSelectDate = useCallback(function (index, date, event) {
313
+ var calendarKey = index === 0 ? 'start' : 'end';
303
314
  var nextSelectDates = hoverDateRange !== null && hoverDateRange !== void 0 ? hoverDateRange : [];
304
315
  var hoverRangeValue = getHoverRangeValue(date);
305
316
  var noHoverRangeValid = isNil(hoverRangeValue); // in `oneTap` mode
@@ -327,19 +338,38 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
327
338
  nextSelectDates = hoverRangeValue;
328
339
  selectRangeValueRef.current = hoverRangeValue;
329
340
  }
330
- } // If user have completed the selection, then sort
341
+ }
342
+
343
+ if (nextSelectDates.length === 2) {
344
+ // If user have completed the selection, then sort the selected dates.
345
+ if (isAfter(nextSelectDates[0], nextSelectDates[1])) {
346
+ nextSelectDates = reverseDateRangeOmitTime(nextSelectDates);
347
+ }
331
348
 
349
+ if (shouldRenderTime(formatStr)) {
350
+ nextSelectDates = [copyTime({
351
+ from: getCalendarDatetime('start'),
352
+ to: nextSelectDates[0]
353
+ }), copyTime({
354
+ from: getCalendarDatetime('end'),
355
+ to: nextSelectDates[1]
356
+ })];
357
+ }
332
358
 
333
- if (nextSelectDates.length === 2 && DateUtils.isAfter(nextSelectDates[0], nextSelectDates[1])) {
334
- nextSelectDates.reverse();
359
+ setHoverDateRange(nextSelectDates);
360
+ } else {
361
+ setHoverDateRange([nextSelectDates[0], nextSelectDates[0]]);
335
362
  }
336
363
 
337
- setHoverDateRange(nextSelectDates.length === 2 ? nextSelectDates : [nextSelectDates[0], nextSelectDates[0]]);
338
364
  setSelectedDates(nextSelectDates);
339
- updateCalendarDateRange(nextSelectDates);
365
+ updateCalendarDateRange({
366
+ dateRange: nextSelectDates,
367
+ calendarKey: calendarKey,
368
+ eventName: 'changeDate'
369
+ });
340
370
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(date, event);
341
371
  hasDoneSelect.current = !hasDoneSelect.current;
342
- }, [getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
372
+ }, [formatStr, getCalendarDatetime, getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
343
373
  /**
344
374
  * If `selectValue` changed, there will be the following effects.
345
375
  * 1. Check if the selection is completed.
@@ -351,39 +381,48 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
351
381
  var doneSelected = selectValueLength === 0 || selectValueLength === 2;
352
382
  doneSelected && setHoverDateRange(null);
353
383
  }, [selectedDates]);
354
- var updateSingleCalendarDate = useCallback(function (index, date) {
384
+ var updateSingleCalendarMonth = useCallback(function (index, date) {
385
+ var calendarKey = index === 0 ? 'start' : 'end';
355
386
  var nextCalendarDate = Array.from(calendarDate);
356
387
  nextCalendarDate[index] = date;
357
- updateCalendarDateRange(nextCalendarDate, index === 0 ? 'start' : 'end');
388
+ updateCalendarDateRange({
389
+ dateRange: nextCalendarDate,
390
+ calendarKey: calendarKey,
391
+ eventName: 'changeMonth'
392
+ });
358
393
  }, [calendarDate, updateCalendarDateRange]);
359
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
+ });
360
403
  setSelectedDates(function (prev) {
361
- var next = [].concat(prev);
362
- var clonedDate = new Date(date.valueOf()); // if next[index] is not empty, only update the time after aligning the year, month and day
363
-
364
- if (next[index]) {
365
- clonedDate.setFullYear(next[index].getFullYear(), next[index].getMonth(), next[index].getDate());
366
- }
404
+ var next = [].concat(prev); // if next[index] is not empty, only update the time after aligning the year, month and day
367
405
 
368
- next[index] = clonedDate;
406
+ next[index] = next[index] ? copyTime({
407
+ from: date,
408
+ to: next[index]
409
+ }) : new Date(date.valueOf());
369
410
  return next;
370
411
  });
371
- updateSingleCalendarDate(index, date);
372
- }, [updateSingleCalendarDate]);
412
+ }, [calendarDate, updateCalendarDateRange]);
373
413
  /**
374
414
  * The callback triggered when PM/AM is switched.
375
415
  */
376
416
 
377
417
  var handleToggleMeridian = useCallback(function (index) {
378
- var next = Array.from(calendarDate);
379
- var clonedDate = new Date(next[index].valueOf());
380
- var hours = DateUtils.getHours(clonedDate);
381
- var nextHours = hours >= 12 ? hours - 12 : hours + 12;
382
- next[index] = DateUtils.setHours(clonedDate, nextHours);
383
- 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.
384
421
 
385
422
  if (selectedDates.length === 2) {
386
- setSelectedDates(next);
423
+ var nextSelectedDates = Array.from(selectedDates);
424
+ nextSelectedDates[index] = getReversedTimeMeridian(nextSelectedDates[index]);
425
+ setSelectedDates(nextSelectedDates);
387
426
  }
388
427
  }, [calendarDate, selectedDates]);
389
428
  /**
@@ -395,7 +434,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
395
434
  closeOverlay = false;
396
435
  }
397
436
 
398
- updateCalendarDateRange(value);
437
+ updateCalendarDateRange({
438
+ dateRange: value
439
+ });
399
440
 
400
441
  if (closeOverlay) {
401
442
  handleValueUpdate(event, value, closeOverlay);
@@ -411,7 +452,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
411
452
  onOk === null || onOk === void 0 ? void 0 : onOk(selectedDates, event);
412
453
  }, [handleValueUpdate, onOk, selectedDates]);
413
454
  var handleClean = useCallback(function (event) {
414
- updateCalendarDateRange(null);
455
+ updateCalendarDateRange({
456
+ dateRange: null
457
+ });
415
458
  handleValueUpdate(event, null);
416
459
  }, [handleValueUpdate, updateCalendarDateRange]);
417
460
  /**
@@ -448,7 +491,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
448
491
 
449
492
  setHoverDateRange(selectValue);
450
493
  setSelectedDates(selectValue);
451
- updateCalendarDateRange(selectValue);
494
+ updateCalendarDateRange({
495
+ dateRange: selectValue
496
+ });
452
497
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
453
498
  [character, rangeFormatStr, updateCalendarDateRange]);
454
499
  /**
@@ -471,13 +516,15 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
471
516
  nextCalendarDate = [_startDate2, isSameMonth(_startDate2, endData) ? addMonths(endData, 1) : endData];
472
517
  } else {
473
518
  // Reset the date on the calendar to the default date
474
- nextCalendarDate = getCalendarDate({
519
+ nextCalendarDate = getSafeCalendarDate({
475
520
  value: defaultCalendarValue !== null && defaultCalendarValue !== void 0 ? defaultCalendarValue : null
476
521
  });
477
522
  }
478
523
 
479
524
  setSelectedDates(value !== null && value !== void 0 ? value : []);
480
- updateCalendarDateRange(nextCalendarDate);
525
+ updateCalendarDateRange({
526
+ dateRange: nextCalendarDate
527
+ });
481
528
  }, [defaultCalendarValue, updateCalendarDateRange, setSelectedDates, value]);
482
529
  var handleEntered = useCallback(function () {
483
530
  onOpen === null || onOpen === void 0 ? void 0 : onOpen();
@@ -566,7 +613,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
566
613
  showWeekNumbers: showWeekNumbers,
567
614
  value: selectedDates,
568
615
  showMeridian: showMeridian,
569
- onChangeCalendarDate: updateSingleCalendarDate,
616
+ onChangeCalendarMonth: updateSingleCalendarMonth,
570
617
  onChangeCalendarTime: updateSingleCalendarTime,
571
618
  onMouseMove: handleMouseMove,
572
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;