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.
- package/CHANGELOG.md +21 -973
- package/DatePicker/styles/index.less +11 -0
- package/Table/styles/index.less +12 -7
- package/cjs/Calendar/Calendar.js +1 -1
- package/cjs/Calendar/CalendarContainer.d.ts +2 -2
- package/cjs/Calendar/CalendarContainer.js +11 -11
- package/cjs/Calendar/MonthDropdownItem.js +1 -1
- package/cjs/Calendar/TimeDropdown.js +1 -1
- package/cjs/Calendar/types.d.ts +2 -2
- package/cjs/DatePicker/DatePicker.js +29 -7
- package/cjs/DatePicker/types.d.ts +1 -0
- package/cjs/DateRangePicker/Calendar.d.ts +2 -2
- package/cjs/DateRangePicker/Calendar.js +18 -13
- package/cjs/DateRangePicker/DateRangePicker.js +100 -55
- package/cjs/DateRangePicker/utils.d.ts +1 -1
- package/cjs/DateRangePicker/utils.js +11 -6
- package/cjs/utils/dateUtils.d.ts +16 -0
- package/cjs/utils/dateUtils.js +62 -8
- package/dist/rsuite-rtl.css +20 -6
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +20 -6
- package/dist/rsuite.js +35 -24
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/Calendar/Calendar.js +1 -1
- package/esm/Calendar/CalendarContainer.d.ts +2 -2
- package/esm/Calendar/CalendarContainer.js +11 -11
- package/esm/Calendar/MonthDropdownItem.js +1 -1
- package/esm/Calendar/TimeDropdown.js +1 -1
- package/esm/Calendar/types.d.ts +2 -2
- package/esm/DatePicker/DatePicker.js +26 -7
- package/esm/DatePicker/types.d.ts +1 -0
- package/esm/DateRangePicker/Calendar.d.ts +2 -2
- package/esm/DateRangePicker/Calendar.js +18 -13
- package/esm/DateRangePicker/DateRangePicker.js +102 -55
- package/esm/DateRangePicker/utils.d.ts +1 -1
- package/esm/DateRangePicker/utils.js +11 -6
- package/esm/utils/dateUtils.d.ts +16 -0
- package/esm/utils/dateUtils.js +47 -1
- package/package.json +3 -3
- package/styles/variables.less +1 -0
package/esm/Calendar/Calendar.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
42
|
+
onChangeMonth?: (nextPageDate: Date, event: React.MouseEvent) => void;
|
|
43
43
|
/** Callback after the time has changed */
|
|
44
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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", "
|
|
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
|
|
121
|
+
var handleChangeMonth = useCallback(function (date, event) {
|
|
122
122
|
reset();
|
|
123
|
-
|
|
124
|
-
}, [
|
|
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
|
-
|
|
136
|
-
|
|
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,
|
|
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
|
-
|
|
194
|
-
|
|
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.
|
|
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.
|
|
105
|
+
onSelect = _useCalendarContext.onChangeTime;
|
|
106
106
|
|
|
107
107
|
var rowRef = useRef(null);
|
|
108
108
|
useEffect(function () {
|
package/esm/Calendar/types.d.ts
CHANGED
|
@@ -8,8 +8,8 @@ export interface CalendarInnerContextValue {
|
|
|
8
8
|
hoverRangeValue?: [Date, Date];
|
|
9
9
|
inSameMonth?: (date: Date) => boolean;
|
|
10
10
|
isoWeek: boolean;
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
334
|
-
|
|
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
|
-
},
|
|
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:
|
|
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;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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", "
|
|
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
|
-
|
|
28
|
-
}, [index,
|
|
28
|
+
onChangeCalendarMonth === null || onChangeCalendarMonth === void 0 ? void 0 : onChangeCalendarMonth(index, nextPageDate);
|
|
29
|
+
}, [index, onChangeCalendarMonth]);
|
|
29
30
|
var onMoveBackward = useCallback(function (nextPageDate) {
|
|
30
|
-
|
|
31
|
-
}, [index,
|
|
32
|
-
var
|
|
33
|
-
|
|
34
|
-
}, [index,
|
|
35
|
-
var
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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 {
|
|
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(
|
|
120
|
-
value: (_ref2 =
|
|
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 (
|
|
142
|
-
var
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
var _endDate =
|
|
154
|
-
|
|
155
|
-
|
|
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(
|
|
172
|
+
setCalendarDate(getSafeCalendarDate({
|
|
163
173
|
value: nextValue,
|
|
164
174
|
calendarKey: calendarKey
|
|
165
175
|
}));
|
|
166
|
-
}, [
|
|
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 (
|
|
245
|
-
hoverValues
|
|
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
|
-
}
|
|
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
|
-
|
|
334
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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] =
|
|
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
|
-
|
|
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
|
|
379
|
-
|
|
380
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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
|
|
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,
|
|
2
|
-
export function
|
|
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
|
|
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],
|
|
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 [
|
|
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]) {
|
package/esm/utils/dateUtils.d.ts
CHANGED
|
@@ -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;
|