rsuite 5.28.3 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/cjs/Affix/Affix.d.ts +5 -3
  3. package/cjs/Affix/Affix.js +33 -11
  4. package/cjs/Calendar/CalendarHeader.js +12 -3
  5. package/cjs/Cascader/Cascader.js +1 -1
  6. package/cjs/DatePicker/DatePicker.d.ts +34 -3
  7. package/cjs/DatePicker/DatePicker.js +38 -16
  8. package/cjs/DateRangePicker/DateRangePicker.d.ts +9 -1
  9. package/cjs/DateRangePicker/DateRangePicker.js +58 -39
  10. package/cjs/DateRangePicker/DateRangePickerContext.d.ts +7 -0
  11. package/cjs/DateRangePicker/DateRangePickerContext.js +19 -0
  12. package/cjs/Overlay/Modal.js +5 -5
  13. package/cjs/Overlay/OverlayTrigger.js +3 -2
  14. package/cjs/utils/dateUtils.d.ts +1 -0
  15. package/cjs/utils/dateUtils.js +10 -3
  16. package/cjs/utils/deprecatePropType.d.ts +5 -0
  17. package/cjs/utils/deprecatePropType.js +5 -0
  18. package/cjs/utils/usePortal.js +9 -12
  19. package/dist/rsuite-no-reset-rtl.css +16690 -0
  20. package/dist/rsuite-no-reset-rtl.min.css +2 -0
  21. package/dist/rsuite-no-reset-rtl.min.css.map +1 -0
  22. package/dist/rsuite-no-reset.css +16714 -0
  23. package/dist/rsuite-no-reset.min.css +2 -0
  24. package/dist/rsuite-no-reset.min.css.map +1 -0
  25. package/dist/rsuite.js +21 -10
  26. package/dist/rsuite.js.map +1 -1
  27. package/dist/rsuite.min.js +1 -1
  28. package/dist/rsuite.min.js.map +1 -1
  29. package/esm/Affix/Affix.d.ts +5 -3
  30. package/esm/Affix/Affix.js +32 -11
  31. package/esm/Calendar/CalendarHeader.js +11 -3
  32. package/esm/Cascader/Cascader.js +1 -1
  33. package/esm/DatePicker/DatePicker.d.ts +34 -3
  34. package/esm/DatePicker/DatePicker.js +37 -16
  35. package/esm/DateRangePicker/DateRangePicker.d.ts +9 -1
  36. package/esm/DateRangePicker/DateRangePicker.js +56 -39
  37. package/esm/DateRangePicker/DateRangePickerContext.d.ts +7 -0
  38. package/esm/DateRangePicker/DateRangePickerContext.js +6 -0
  39. package/esm/Overlay/Modal.js +5 -4
  40. package/esm/Overlay/OverlayTrigger.js +3 -2
  41. package/esm/utils/dateUtils.d.ts +1 -0
  42. package/esm/utils/dateUtils.js +10 -3
  43. package/esm/utils/deprecatePropType.d.ts +5 -0
  44. package/esm/utils/deprecatePropType.js +5 -0
  45. package/esm/utils/usePortal.js +10 -13
  46. package/package.json +1 -1
@@ -1,11 +1,13 @@
1
- import { RsRefForwardingComponent, WithAsProps } from '../@types/common';
1
+ import { Offset, RsRefForwardingComponent, WithAsProps } from '../@types/common';
2
2
  export interface AffixProps extends WithAsProps {
3
+ /** Specify the container. */
4
+ container?: HTMLElement | (() => HTMLElement);
3
5
  /** Distance from top */
4
6
  top?: number;
5
7
  /** Callback after the state changes. */
6
8
  onChange?: (fixed?: boolean) => void;
7
- /** Specify the container. */
8
- container?: HTMLElement | (() => HTMLElement);
9
+ /** Callback after the offset changes. */
10
+ onOffsetChange?: (offset?: Offset) => void;
9
11
  }
10
12
  declare const Affix: RsRefForwardingComponent<'div', AffixProps>;
11
13
  export default Affix;
@@ -2,20 +2,33 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
3
  import React, { useCallback, useEffect, useRef, useState } from 'react';
4
4
  import PropTypes from 'prop-types';
5
+ import debounce from 'lodash/debounce';
5
6
  import getOffset from 'dom-lib/getOffset';
6
7
  import { mergeRefs, useClassNames, useElementResize, useEventListener, useMount } from '../utils';
7
8
 
8
9
  /**
9
10
  * Get the layout size and offset of the mount element
10
11
  */
11
- function useOffset(mountRef) {
12
+ function useOffset(mountRef, onOffsetChange) {
12
13
  var _useState = useState(null),
13
14
  offset = _useState[0],
14
15
  setOffset = _useState[1];
15
16
 
16
17
  var updateOffset = useCallback(function () {
17
- setOffset(getOffset(mountRef.current));
18
- }, [mountRef]); // Update after the element size changes
18
+ if (!mountRef.current) {
19
+ return;
20
+ }
21
+
22
+ var newOffset = getOffset(mountRef.current);
23
+
24
+ if ((newOffset === null || newOffset === void 0 ? void 0 : newOffset.height) !== (offset === null || offset === void 0 ? void 0 : offset.height) || (newOffset === null || newOffset === void 0 ? void 0 : newOffset.width) !== (offset === null || offset === void 0 ? void 0 : offset.width) || (newOffset === null || newOffset === void 0 ? void 0 : newOffset.top) !== (offset === null || offset === void 0 ? void 0 : offset.top) || (newOffset === null || newOffset === void 0 ? void 0 : newOffset.left) !== (offset === null || offset === void 0 ? void 0 : offset.left)) {
25
+ setOffset(newOffset);
26
+
27
+ if (offset !== null && newOffset !== null) {
28
+ onOffsetChange === null || onOffsetChange === void 0 ? void 0 : onOffsetChange(newOffset);
29
+ }
30
+ }
31
+ }, [mountRef, offset, onOffsetChange]); // Update after the element size changes
19
32
 
20
33
  useElementResize(function () {
21
34
  return mountRef.current;
@@ -23,7 +36,9 @@ function useOffset(mountRef) {
23
36
 
24
37
  useMount(updateOffset); // Update after window size changes
25
38
 
26
- useEventListener(window, 'resize', updateOffset, false);
39
+ useEventListener(window, 'resize', updateOffset, false); // Update after window scroll
40
+
41
+ useEventListener(window, 'scroll', debounce(updateOffset, 100), false);
27
42
  return offset;
28
43
  }
29
44
  /**
@@ -66,7 +81,7 @@ function useFixed(offset, containerOffset, props) {
66
81
 
67
82
  var scrollY = window.scrollY || window.pageYOffset; // When the scroll distance exceeds the element's top value, it is fixed.
68
83
 
69
- var nextFixed = scrollY - (Number(offset.top) - Number(top)) >= 0; // If the current element is specified in the container,
84
+ var nextFixed = scrollY - (Number(offset === null || offset === void 0 ? void 0 : offset.top) - Number(top)) >= 0; // If the current element is specified in the container,
70
85
  // add to determine whether the current container is in the window range.
71
86
 
72
87
  if (containerOffset) {
@@ -77,7 +92,7 @@ function useFixed(offset, containerOffset, props) {
77
92
  setFixed(nextFixed);
78
93
  onChange === null || onChange === void 0 ? void 0 : onChange(nextFixed);
79
94
  }
80
- }, [fixed, offset, containerOffset, onChange, top]); // Add scroll event to window
95
+ }, [offset, top, containerOffset, fixed, onChange]); // Add scroll event to window
81
96
 
82
97
  useEventListener(window, 'scroll', handleScroll, false);
83
98
  return fixed;
@@ -96,10 +111,11 @@ var Affix = /*#__PURE__*/React.forwardRef(function (props, ref) {
96
111
  _props$top = props.top,
97
112
  top = _props$top === void 0 ? 0 : _props$top,
98
113
  onChange = props.onChange,
99
- rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "children", "container", "top", "onChange"]);
114
+ onOffsetChange = props.onOffsetChange,
115
+ rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "children", "container", "top", "onChange", "onOffsetChange"]);
100
116
 
101
117
  var mountRef = useRef(null);
102
- var offset = useOffset(mountRef);
118
+ var offset = useOffset(mountRef, onOffsetChange);
103
119
  var containerOffset = useContainerOffset(container);
104
120
  var fixed = useFixed(offset, containerOffset, {
105
121
  top: top,
@@ -111,14 +127,19 @@ var Affix = /*#__PURE__*/React.forwardRef(function (props, ref) {
111
127
  merge = _useClassNames.merge;
112
128
 
113
129
  var classes = merge(className, (_merge = {}, _merge[withClassPrefix()] = fixed, _merge));
130
+
131
+ var _ref = offset || {},
132
+ width = _ref.width,
133
+ height = _ref.height;
134
+
114
135
  var placeholderStyles = fixed ? {
115
- width: offset === null || offset === void 0 ? void 0 : offset.width,
116
- height: offset === null || offset === void 0 ? void 0 : offset.height
136
+ width: width,
137
+ height: height
117
138
  } : undefined;
118
139
  var fixedStyles = {
119
140
  position: 'fixed',
120
141
  top: top,
121
- width: offset === null || offset === void 0 ? void 0 : offset.width,
142
+ width: width,
122
143
  zIndex: 10
123
144
  };
124
145
  var affixStyles = fixed ? fixedStyles : undefined;
@@ -9,6 +9,7 @@ import Button from '../Button';
9
9
  import { useClassNames } from '../utils';
10
10
  import { FormattedDate } from '../CustomProvider';
11
11
  import { useCalendarContext } from './CalendarContext';
12
+ import { useDateRangePickerContext } from '../DateRangePicker/DateRangePickerContext';
12
13
  var CalendarHeader = /*#__PURE__*/React.forwardRef(function (props, ref) {
13
14
  var _props$as = props.as,
14
15
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -39,6 +40,9 @@ var CalendarHeader = /*#__PURE__*/React.forwardRef(function (props, ref) {
39
40
  inline = _useCalendarContext.inline,
40
41
  disabledDate = _useCalendarContext.disabledDate;
41
42
 
43
+ var _useDateRangePickerCo = useDateRangePickerContext(),
44
+ isSelectedIdle = _useDateRangePickerCo.isSelectedIdle;
45
+
42
46
  var _useClassNames = useClassNames(classPrefix),
43
47
  prefix = _useClassNames.prefix,
44
48
  withClassPrefix = _useClassNames.withClassPrefix,
@@ -114,7 +118,9 @@ var CalendarHeader = /*#__PURE__*/React.forwardRef(function (props, ref) {
114
118
  var classes = merge(className, withClassPrefix({
115
119
  'has-month': hasMonth,
116
120
  'has-time': showTime
117
- }));
121
+ })); // If the date is not selected, the time cannot be selected (it only works in DateRangePicker).
122
+
123
+ var disableSelectTime = typeof isSelectedIdle === 'undefined' ? false : !isSelectedIdle;
118
124
  return /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
119
125
  ref: ref,
120
126
  className: classes
@@ -122,13 +128,15 @@ var CalendarHeader = /*#__PURE__*/React.forwardRef(function (props, ref) {
122
128
  className: prefix('time-toolbar')
123
129
  }, /*#__PURE__*/React.createElement(Button, _extends({}, btnProps, {
124
130
  className: timeTitleClasses,
125
- onClick: onToggleTimeDropdown
131
+ onClick: onToggleTimeDropdown,
132
+ disabled: disableSelectTime
126
133
  }), date && /*#__PURE__*/React.createElement(FormattedDate, {
127
134
  date: date,
128
135
  formatStr: getTimeFormat()
129
136
  })), showMeridian && /*#__PURE__*/React.createElement(Button, _extends({}, btnProps, {
130
137
  className: prefix('meridian'),
131
- onClick: onToggleMeridian
138
+ onClick: onToggleMeridian,
139
+ disabled: disableSelectTime
132
140
  }), date && /*#__PURE__*/React.createElement(FormattedDate, {
133
141
  date: date,
134
142
  formatStr: "a"
@@ -272,7 +272,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
272
272
  node.loading = false;
273
273
  node[childrenKey] = data;
274
274
 
275
- if (targetRef.current) {
275
+ if (targetRef.current || inline) {
276
276
  addColumn(data, columnIndex);
277
277
  }
278
278
  });
@@ -33,14 +33,45 @@ export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, Form
33
33
  * Whether to disable a date on the calendar view
34
34
  *
35
35
  * @returns date should be disabled (not selectable)
36
+ * @deprecated Use {@link shouldDisableDate} instead
36
37
  */
37
38
  disabledDate?: (date?: Date) => boolean;
38
- /** Disabled hours */
39
+ /**
40
+ * Disabled hours
41
+ *
42
+ * @deprecated Use {@link shouldDisableHour} instead
43
+ */
39
44
  disabledHours?: (hour: number, date: Date) => boolean;
40
- /** Disabled minutes */
45
+ /**
46
+ * Disabled minutes
47
+ *
48
+ * @deprecated Use {@link shouldDisableMinute} instead
49
+ */
41
50
  disabledMinutes?: (minute: number, date: Date) => boolean;
42
- /** Disabled seconds */
51
+ /**
52
+ * Disabled seconds
53
+ *
54
+ * @deprecated Use {@link shouldDisableSecond} instead
55
+ */
43
56
  disabledSeconds?: (second: number, date: Date) => boolean;
57
+ /**
58
+ * Whether a date on the calendar view should be disabled
59
+ *
60
+ * @returns date should be disabled (not selectable)
61
+ */
62
+ shouldDisableDate?: (date: Date) => boolean;
63
+ /**
64
+ * Disabled hours
65
+ */
66
+ shouldDisableHour?: (hour: number, date: Date) => boolean;
67
+ /**
68
+ * Disabled minutes
69
+ */
70
+ shouldDisableMinute?: (minute: number, date: Date) => boolean;
71
+ /**
72
+ * Disabled seconds
73
+ */
74
+ shouldDisableSecond?: (second: number, date: Date) => boolean;
44
75
  /** Hidden hours */
45
76
  hideHours?: (hour: number, date: Date) => boolean;
46
77
  /** Hidden minutes */
@@ -16,6 +16,7 @@ import PredefinedRanges from './PredefinedRanges';
16
16
  import { composeFunctions, createChainedFunction, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
17
17
  import { PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, omitTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
18
18
  import { OverlayCloseCause } from '../Overlay/OverlayTrigger';
19
+ import { deprecatePropTypeNew } from '../utils/deprecatePropType';
19
20
  var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
20
21
  var _props$as = props.as,
21
22
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -50,7 +51,14 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
50
51
  style = props.style,
51
52
  toggleAs = props.toggleAs,
52
53
  caretAsProp = props.caretAs,
53
- disabledDateProp = props.disabledDate,
54
+ DEPRECATED_disabledDate = props.disabledDate,
55
+ DEPRECATED_disabledHours = props.disabledHours,
56
+ DEPRECATED_disabledMinutes = props.disabledMinutes,
57
+ DEPRECATED_disabledSeconds = props.disabledSeconds,
58
+ shouldDisableDate = props.shouldDisableDate,
59
+ shouldDisableHour = props.shouldDisableHour,
60
+ shouldDisableMinute = props.shouldDisableMinute,
61
+ shouldDisableSecond = props.shouldDisableSecond,
54
62
  renderValue = props.renderValue,
55
63
  onChange = props.onChange,
56
64
  onChangeCalendarDate = props.onChangeCalendarDate,
@@ -65,7 +73,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
65
73
  onSelect = props.onSelect,
66
74
  onToggleMonthDropdown = props.onToggleMonthDropdown,
67
75
  onToggleTimeDropdown = props.onToggleTimeDropdown,
68
- rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "calendarDefaultDate", "cleanable", "editable", "defaultValue", "disabled", "format", "isoWeek", "limitEndYear", "locale", "menuClassName", "appearance", "placement", "oneTap", "placeholder", "ranges", "value", "showMeridian", "showWeekNumbers", "style", "toggleAs", "caretAs", "disabledDate", "renderValue", "onChange", "onChangeCalendarDate", "onClean", "onClose", "onEntered", "onExited", "onNextMonth", "onOk", "onOpen", "onPrevMonth", "onSelect", "onToggleMonthDropdown", "onToggleTimeDropdown"]);
76
+ rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "calendarDefaultDate", "cleanable", "editable", "defaultValue", "disabled", "format", "isoWeek", "limitEndYear", "locale", "menuClassName", "appearance", "placement", "oneTap", "placeholder", "ranges", "value", "showMeridian", "showWeekNumbers", "style", "toggleAs", "caretAs", "disabledDate", "disabledHours", "disabledMinutes", "disabledSeconds", "shouldDisableDate", "shouldDisableHour", "shouldDisableMinute", "shouldDisableSecond", "renderValue", "onChange", "onChangeCalendarDate", "onClean", "onClose", "onEntered", "onExited", "onNextMonth", "onOk", "onOpen", "onPrevMonth", "onSelect", "onToggleMonthDropdown", "onToggleTimeDropdown"]);
69
77
 
70
78
  var _useCustom = useCustom('DatePicker', overrideLocale),
71
79
  locale = _useCustom.locale,
@@ -241,11 +249,17 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
241
249
  updateValue(event, nextPageDate);
242
250
  }
243
251
  }, [formatStr, handleDateChange, oneTap, setCalendarDate, updateValue]);
244
- var disabledDate = useCallback(function (date) {
245
- var _disabledDateProp;
252
+ var isDateDisabled = useCallback(function (date) {
253
+ if (typeof shouldDisableDate === 'function') {
254
+ return shouldDisableDate(date);
255
+ }
256
+
257
+ if (typeof DEPRECATED_disabledDate === 'function') {
258
+ return DEPRECATED_disabledDate(date);
259
+ }
246
260
 
247
- return (_disabledDateProp = disabledDateProp === null || disabledDateProp === void 0 ? void 0 : disabledDateProp(date)) !== null && _disabledDateProp !== void 0 ? _disabledDateProp : false;
248
- }, [disabledDateProp]);
261
+ return false;
262
+ }, [DEPRECATED_disabledDate, shouldDisableDate]);
249
263
  /**
250
264
  * Callback after the input box value is changed.
251
265
  */
@@ -272,13 +286,13 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
272
286
  return;
273
287
  }
274
288
 
275
- if (disabledDate(date)) {
289
+ if (isDateDisabled(date)) {
276
290
  setInputState('Error');
277
291
  return;
278
292
  }
279
293
 
280
294
  handleSelect(date, event, false);
281
- }, [formatStr, locale, parseDate, disabledDate, handleSelect]);
295
+ }, [formatStr, locale, parseDate, isDateDisabled, handleSelect]);
282
296
  /**
283
297
  * The callback after the enter key is triggered on the input
284
298
  */
@@ -300,12 +314,12 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
300
314
  }, [onClose]); // Check whether the time is within the time range of the shortcut option in the toolbar.
301
315
 
302
316
  var disabledToolbarHandle = useCallback(function (date) {
303
- var _disabledDateProp2;
317
+ var _DEPRECATED_disabledD;
304
318
 
305
- var allowDate = (_disabledDateProp2 = disabledDateProp === null || disabledDateProp === void 0 ? void 0 : disabledDateProp(date)) !== null && _disabledDateProp2 !== void 0 ? _disabledDateProp2 : false;
319
+ var allowDate = (_DEPRECATED_disabledD = DEPRECATED_disabledDate === null || DEPRECATED_disabledDate === void 0 ? void 0 : DEPRECATED_disabledDate(date)) !== null && _DEPRECATED_disabledD !== void 0 ? _DEPRECATED_disabledD : false;
306
320
  var allowTime = DateUtils.disabledTime(props, date);
307
321
  return allowDate || allowTime;
308
- }, [disabledDateProp, props]);
322
+ }, [DEPRECATED_disabledDate, props]);
309
323
  /**
310
324
  * Whether "OK" button is disabled
311
325
  *
@@ -336,7 +350,10 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
336
350
  locale: locale,
337
351
  showWeekNumbers: showWeekNumbers,
338
352
  showMeridian: showMeridian,
339
- disabledDate: disabledDate,
353
+ disabledDate: isDateDisabled,
354
+ disabledHours: shouldDisableHour !== null && shouldDisableHour !== void 0 ? shouldDisableHour : DEPRECATED_disabledHours,
355
+ disabledMinutes: shouldDisableMinute !== null && shouldDisableMinute !== void 0 ? shouldDisableMinute : DEPRECATED_disabledMinutes,
356
+ disabledSeconds: shouldDisableSecond !== null && shouldDisableSecond !== void 0 ? shouldDisableSecond : DEPRECATED_disabledSeconds,
340
357
  limitEndYear: limitEndYear,
341
358
  format: formatStr,
342
359
  isoWeek: isoWeek,
@@ -468,10 +485,14 @@ DatePicker.displayName = 'DatePicker';
468
485
  DatePicker.propTypes = _extends({}, pickerPropTypes, {
469
486
  calendarDefaultDate: PropTypes.instanceOf(Date),
470
487
  defaultValue: PropTypes.instanceOf(Date),
471
- disabledDate: PropTypes.func,
472
- disabledHours: PropTypes.func,
473
- disabledMinutes: PropTypes.func,
474
- disabledSeconds: PropTypes.func,
488
+ disabledDate: deprecatePropTypeNew(PropTypes.func, 'Use "shouldDisableDate" property instead.'),
489
+ disabledHours: deprecatePropTypeNew(PropTypes.func, 'Use "shouldDisableHour" property instead.'),
490
+ disabledMinutes: deprecatePropTypeNew(PropTypes.func, 'Use "shouldDisableMinute" property instead.'),
491
+ disabledSeconds: deprecatePropTypeNew(PropTypes.func, 'Use "shouldDisableSecond" property instead.'),
492
+ shouldDisableDate: PropTypes.func,
493
+ shouldDisableHour: PropTypes.func,
494
+ shouldDisableMinute: PropTypes.func,
495
+ shouldDisableSecond: PropTypes.func,
475
496
  format: PropTypes.string,
476
497
  hideHours: PropTypes.func,
477
498
  hideMinutes: PropTypes.func,
@@ -27,8 +27,16 @@ export interface DateRangePickerProps extends PickerBaseProps, FormControlBasePr
27
27
  defaultCalendarValue?: DateRange;
28
28
  /** The character that separates two dates */
29
29
  character?: string;
30
- /** Disabled date */
30
+ /**
31
+ * Disabled date
32
+ *
33
+ * @deprecated Use {@link shouldDisableDate} instead
34
+ */
31
35
  disabledDate?: DisabledDateFunction;
36
+ /**
37
+ * Whether a date cell is disabled
38
+ */
39
+ shouldDisableDate?: DisabledDateFunction;
32
40
  /** Called when the option is selected */
33
41
  onSelect?: (date: Date, event?: React.SyntheticEvent) => void;
34
42
  /** Called after clicking the OK button */
@@ -17,6 +17,8 @@ import { addMonths, compareAsc, isSameMonth, startOfDay, endOfDay, shouldRenderT
17
17
  import Calendar from './Calendar';
18
18
  import * as disabledDateUtils from './disabledDateUtils';
19
19
  import { getSafeCalendarDate, getMonthHoverRange, getWeekHoverRange, isSameRange } from './utils';
20
+ import { deprecatePropTypeNew } from '../utils/deprecatePropType';
21
+ import DateRangePickerContext from './DateRangePickerContext';
20
22
  var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
21
23
  var _ref, _ref2, _merge;
22
24
 
@@ -36,7 +38,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
36
38
  defaultCalendarValue = props.defaultCalendarValue,
37
39
  defaultValue = props.defaultValue,
38
40
  disabled = props.disabled,
39
- disabledDateProp = props.disabledDate,
41
+ DEPRECATED_disabledDateProp = props.disabledDate,
42
+ shouldDisableDate = props.shouldDisableDate,
40
43
  _props$format = props.format,
41
44
  formatStr = _props$format === void 0 ? 'yyyy-MM-dd' : _props$format,
42
45
  hoverRange = props.hoverRange,
@@ -72,7 +75,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
72
75
  onOpen = props.onOpen,
73
76
  onSelect = props.onSelect,
74
77
  renderTitle = props.renderTitle,
75
- rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "appearance", "editable", "cleanable", "character", "defaultCalendarValue", "defaultValue", "disabled", "disabledDate", "format", "hoverRange", "isoWeek", "limitEndYear", "locale", "menuClassName", "menuStyle", "oneTap", "placeholder", "placement", "ranges", "renderValue", "showOneCalendar", "showWeekNumbers", "showMeridian", "style", "toggleAs", "caretAs", "value", "onChange", "onClean", "onClose", "onEnter", "onEntered", "onExited", "onOk", "onOpen", "onSelect", "renderTitle"]);
78
+ rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "appearance", "editable", "cleanable", "character", "defaultCalendarValue", "defaultValue", "disabled", "disabledDate", "shouldDisableDate", "format", "hoverRange", "isoWeek", "limitEndYear", "locale", "menuClassName", "menuStyle", "oneTap", "placeholder", "placement", "ranges", "renderValue", "showOneCalendar", "showWeekNumbers", "showMeridian", "style", "toggleAs", "caretAs", "value", "onChange", "onClean", "onClose", "onEnter", "onEntered", "onExited", "onOk", "onOpen", "onSelect", "renderTitle"]);
76
79
 
77
80
  var _useClassNames = useClassNames(classPrefix),
78
81
  merge = _useClassNames.merge,
@@ -96,7 +99,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
96
99
  */
97
100
 
98
101
 
99
- var hasDoneSelect = useRef(true);
102
+ var _useState = useState(true),
103
+ isSelectedIdle = _useState[0],
104
+ setSelectedIdle = _useState[1];
100
105
  /**
101
106
  * The currently selected date range.
102
107
  *
@@ -106,25 +111,26 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
106
111
  *
107
112
  */
108
113
 
109
- var _useState = useState((_ref = valueProp !== null && valueProp !== void 0 ? valueProp : defaultValue) !== null && _ref !== void 0 ? _ref : []),
110
- selectedDates = _useState[0],
111
- setSelectedDates = _useState[1]; // The date of the current hover, used to reduce the calculation of `handleMouseMove`
112
114
 
115
+ var _useState2 = useState((_ref = valueProp !== null && valueProp !== void 0 ? valueProp : defaultValue) !== null && _ref !== void 0 ? _ref : []),
116
+ selectedDates = _useState2[0],
117
+ setSelectedDates = _useState2[1]; // The date of the current hover, used to reduce the calculation of `handleMouseMove`
113
118
 
114
- var _useState2 = useState(null),
115
- hoverDateRange = _useState2[0],
116
- setHoverDateRange = _useState2[1]; // The displayed calendar panel is rendered based on this value.
117
119
 
120
+ var _useState3 = useState(null),
121
+ hoverDateRange = _useState3[0],
122
+ setHoverDateRange = _useState3[1]; // The displayed calendar panel is rendered based on this value.
118
123
 
119
- var _useState3 = useState(getSafeCalendarDate({
124
+
125
+ var _useState4 = useState(getSafeCalendarDate({
120
126
  value: (_ref2 = value !== null && value !== void 0 ? value : defaultCalendarValue) !== null && _ref2 !== void 0 ? _ref2 : null
121
127
  })),
122
- calendarDate = _useState3[0],
123
- setCalendarDate = _useState3[1];
128
+ calendarDate = _useState4[0],
129
+ setCalendarDate = _useState4[1];
124
130
 
125
- var _useState4 = useState(),
126
- inputState = _useState4[0],
127
- setInputState = _useState4[1];
131
+ var _useState5 = useState(),
132
+ inputState = _useState5[0],
133
+ setInputState = _useState5[1];
128
134
  /**
129
135
  * When hoverRange is set, `selectValue` will be updated during the hover process,
130
136
  * which will cause the `selectValue` to be updated after the first click,
@@ -180,9 +186,9 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
180
186
  setHoverDateRange(valueProp !== null && valueProp !== void 0 ? valueProp : null);
181
187
  }, [valueProp]);
182
188
 
183
- var _useState5 = useState(false),
184
- isPickerToggleActive = _useState5[0],
185
- setPickerToggleActive = _useState5[1];
189
+ var _useState6 = useState(false),
190
+ isPickerToggleActive = _useState6[0],
191
+ setPickerToggleActive = _useState6[1];
186
192
 
187
193
  var rootRef = useRef(null);
188
194
  var overlayRef = useRef(null);
@@ -285,7 +291,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
285
291
  // it means there's already one selected date
286
292
  // and waiting for user to select the second date to complete the selection.
287
293
 
288
- if (!hasDoneSelect.current) {
294
+ if (!isSelectedIdle) {
289
295
  // If `hoverRange` is set, you need to change the value of hoverDateRange according to the rules
290
296
  if (!isNil(nextHoverDateRange) && !isNil(selectRangeValueRef.current)) {
291
297
  var nextSelectedDates = [selectRangeValueRef.current[0], nextHoverDateRange[1]];
@@ -304,7 +310,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
304
310
  } else if (!isNil(nextHoverDateRange)) {
305
311
  setHoverDateRange(nextHoverDateRange);
306
312
  }
307
- }, [getHoverRangeValue]);
313
+ }, [getHoverRangeValue, isSelectedIdle]);
308
314
  /**
309
315
  * Callback for selecting a date cell in the calendar grid
310
316
  */
@@ -315,23 +321,23 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
315
321
  var hoverRangeValue = getHoverRangeValue(date);
316
322
  var noHoverRangeValid = isNil(hoverRangeValue); // in `oneTap` mode
317
323
 
318
- if (hasDoneSelect.current && oneTap) {
324
+ if (isSelectedIdle && oneTap) {
319
325
  handleValueUpdate(event, noHoverRangeValid ? [startOfDay(date), endOfDay(date)] : hoverRangeValue);
320
- hasDoneSelect.current = false;
326
+ setSelectedIdle(false);
321
327
  return;
322
328
  } // no preset hover range can use
323
329
 
324
330
 
325
331
  if (noHoverRangeValid) {
326
332
  // start select
327
- if (hasDoneSelect.current) {
333
+ if (isSelectedIdle) {
328
334
  nextSelectDates = [date];
329
335
  } else {
330
336
  // finish select
331
337
  nextSelectDates[1] = date;
332
338
  }
333
339
  } else {
334
- if (!hasDoneSelect.current) {
340
+ if (!isSelectedIdle) {
335
341
  nextSelectDates = selectedDates;
336
342
  selectRangeValueRef.current = null;
337
343
  } else {
@@ -368,8 +374,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
368
374
  eventName: 'changeDate'
369
375
  });
370
376
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(date, event);
371
- hasDoneSelect.current = !hasDoneSelect.current;
372
- }, [formatStr, getCalendarDatetime, getHoverRangeValue, handleValueUpdate, hoverDateRange, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
377
+ setSelectedIdle(!isSelectedIdle);
378
+ }, [formatStr, getCalendarDatetime, getHoverRangeValue, handleValueUpdate, hoverDateRange, isSelectedIdle, onSelect, oneTap, selectedDates, updateCalendarDateRange]);
373
379
  /**
374
380
  * If `selectValue` changed, there will be the following effects.
375
381
  * 1. Check if the selection is completed.
@@ -445,7 +451,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
445
451
  } // End unfinished selections.
446
452
 
447
453
 
448
- hasDoneSelect.current = true;
454
+ setSelectedIdle(true);
449
455
  }, [handleValueUpdate, updateCalendarDateRange]);
450
456
  var handleOK = useCallback(function (event) {
451
457
  handleValueUpdate(event, selectedDates);
@@ -532,19 +538,25 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
532
538
  }, [onOpen]);
533
539
  var handleExited = useCallback(function () {
534
540
  setPickerToggleActive(false);
535
- hasDoneSelect.current = true;
541
+ setSelectedIdle(true);
536
542
  onClose === null || onClose === void 0 ? void 0 : onClose();
537
543
  }, [onClose]);
538
544
  var isDateDisabled = useCallback(function (date, selectDate, selectedDone, target) {
539
- var _disabledDateProp;
545
+ if (typeof shouldDisableDate === 'function') {
546
+ return shouldDisableDate(date, selectDate, selectedDone, target);
547
+ }
548
+
549
+ if (typeof DEPRECATED_disabledDateProp === 'function') {
550
+ return DEPRECATED_disabledDateProp(date, selectDate, selectedDone, target);
551
+ }
540
552
 
541
- return (_disabledDateProp = disabledDateProp === null || disabledDateProp === void 0 ? void 0 : disabledDateProp(date, selectDate, selectedDone, target)) !== null && _disabledDateProp !== void 0 ? _disabledDateProp : false;
542
- }, [disabledDateProp]);
553
+ return false;
554
+ }, [DEPRECATED_disabledDateProp, shouldDisableDate]);
543
555
  var disabledByBetween = useCallback(function (start, end, type) {
544
556
  // If the date is between the start and the end
545
557
  // the button is disabled
546
558
  while (DateUtils.isBefore(start, end) || DateUtils.isSameDay(start, end)) {
547
- if (isDateDisabled(start, selectedDates, hasDoneSelect.current, type)) {
559
+ if (isDateDisabled(start, selectedDates, isSelectedIdle, type)) {
548
560
  return true;
549
561
  }
550
562
 
@@ -552,17 +564,17 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
552
564
  }
553
565
 
554
566
  return false;
555
- }, [isDateDisabled, selectedDates]);
567
+ }, [isDateDisabled, isSelectedIdle, selectedDates]);
556
568
  var disabledOkButton = useCallback(function () {
557
569
  var start = selectedDates[0],
558
570
  end = selectedDates[1];
559
571
 
560
- if (!start || !end || !hasDoneSelect.current) {
572
+ if (!start || !end || !isSelectedIdle) {
561
573
  return true;
562
574
  }
563
575
 
564
576
  return disabledByBetween(start, end, DATERANGE_DISABLED_TARGET.TOOLBAR_BUTTON_OK);
565
- }, [disabledByBetween, selectedDates]);
577
+ }, [disabledByBetween, isSelectedIdle, selectedDates]);
566
578
  var disabledShortcutButton = useCallback(function (value) {
567
579
  if (value === void 0) {
568
580
  value = [];
@@ -579,8 +591,8 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
579
591
  return disabledByBetween(start, end, DATERANGE_DISABLED_TARGET.TOOLBAR_SHORTCUT);
580
592
  }, [disabledByBetween]);
581
593
  var handleDisabledDate = useCallback(function (date, values, type) {
582
- return isDateDisabled(date, values, hasDoneSelect.current, type);
583
- }, [isDateDisabled]);
594
+ return isDateDisabled(date, values, isSelectedIdle, type);
595
+ }, [isDateDisabled, isSelectedIdle]);
584
596
  var onPickerKeyDown = useToggleKeyDownEvent(_extends({
585
597
  triggerRef: triggerRef,
586
598
  targetRef: targetRef,
@@ -651,11 +663,15 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
651
663
  className: prefix('daterange-header')
652
664
  }, getDisplayString(selectedDates)), /*#__PURE__*/React.createElement("div", {
653
665
  className: prefix("daterange-calendar-" + (showOneCalendar ? 'single' : 'group'))
666
+ }, /*#__PURE__*/React.createElement(DateRangePickerContext.Provider, {
667
+ value: {
668
+ isSelectedIdle: isSelectedIdle
669
+ }
654
670
  }, /*#__PURE__*/React.createElement(Calendar, _extends({
655
671
  index: 0
656
672
  }, calendarProps)), !showOneCalendar && /*#__PURE__*/React.createElement(Calendar, _extends({
657
673
  index: 1
658
- }, calendarProps)))), /*#__PURE__*/React.createElement(Toolbar, {
674
+ }, calendarProps))))), /*#__PURE__*/React.createElement(Toolbar, {
659
675
  locale: locale,
660
676
  calendarDate: selectedDates,
661
677
  disabledOkBtn: disabledOkButton,
@@ -733,7 +749,8 @@ DateRangePicker.propTypes = _extends({}, pickerPropTypes, {
733
749
  limitEndYear: PropTypes.number,
734
750
  onChange: PropTypes.func,
735
751
  onOk: PropTypes.func,
736
- disabledDate: PropTypes.func,
752
+ disabledDate: deprecatePropTypeNew(PropTypes.func, 'Use "shouldDisableDate" property instead.'),
753
+ shouldDisableDate: PropTypes.func,
737
754
  onSelect: PropTypes.func,
738
755
  showWeekNumbers: PropTypes.bool,
739
756
  showMeridian: PropTypes.bool,
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface DateRangePickerContextValue {
3
+ isSelectedIdle?: boolean;
4
+ }
5
+ declare const DateRangePickerContext: React.Context<DateRangePickerContextValue>;
6
+ export default DateRangePickerContext;
7
+ export declare const useDateRangePickerContext: () => DateRangePickerContextValue;
@@ -0,0 +1,6 @@
1
+ import React, { useContext } from 'react';
2
+ var DateRangePickerContext = /*#__PURE__*/React.createContext({});
3
+ export default DateRangePickerContext;
4
+ export var useDateRangePickerContext = function useDateRangePickerContext() {
5
+ return useContext(DateRangePickerContext) || {};
6
+ };
@@ -4,7 +4,6 @@ import React, { useRef, useEffect, useState, useCallback, useMemo } from 'react'
4
4
  import PropTypes from 'prop-types';
5
5
  import classNames from 'classnames';
6
6
  import contains from 'dom-lib/contains';
7
- import getContainer from 'dom-lib/getContainer';
8
7
  import on from 'dom-lib/on';
9
8
  import ModalManager from './ModalManager';
10
9
  import Fade from '../Animation/Fade';
@@ -90,7 +89,8 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
90
89
  var _usePortal = usePortal({
91
90
  container: container
92
91
  }),
93
- Portal = _usePortal.Portal;
92
+ Portal = _usePortal.Portal,
93
+ containerElement = _usePortal.target;
94
94
 
95
95
  var modal = useModalManager();
96
96
 
@@ -141,8 +141,9 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
141
141
  var documentKeyDownListener = useRef();
142
142
  var documentFocusListener = useRef();
143
143
  var handleOpen = useEventCallback(function () {
144
- var containerElement = getContainer(container, document.body);
145
- modal.add(containerElement, containerClassName);
144
+ if (containerElement) {
145
+ modal.add(containerElement, containerClassName);
146
+ }
146
147
 
147
148
  if (!documentKeyDownListener.current) {
148
149
  documentKeyDownListener.current = on(document, 'keydown', handleDocumentKeyDown);