rsuite 5.48.1 → 5.50.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 (203) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/Cascader/styles/index.less +5 -4
  3. package/DatePicker/styles/index.less +18 -11
  4. package/DateRangeInput/package.json +7 -0
  5. package/DateRangePicker/styles/index.less +20 -0
  6. package/Dropdown/styles/index.less +5 -4
  7. package/Dropdown/styles/mixin.less +0 -11
  8. package/InputGroup/styles/index.less +1 -0
  9. package/Picker/styles/index.less +51 -24
  10. package/Picker/styles/mixin.less +17 -13
  11. package/README.md +34 -24
  12. package/Sidenav/styles/index.less +2 -0
  13. package/TagInput/styles/index.less +1 -1
  14. package/cjs/AutoComplete/AutoComplete.js +25 -26
  15. package/cjs/Calendar/Calendar.d.ts +5 -1
  16. package/cjs/Calendar/CalendarContainer.d.ts +7 -1
  17. package/cjs/Calendar/CalendarContainer.js +11 -4
  18. package/cjs/Calendar/CalendarHeader.js +2 -0
  19. package/cjs/Calendar/MonthDropdown.js +7 -2
  20. package/cjs/Calendar/MonthDropdownItem.js +2 -2
  21. package/cjs/Calendar/Table.js +6 -1
  22. package/cjs/Calendar/TimeDropdown.js +17 -10
  23. package/cjs/Calendar/types.d.ts +1 -0
  24. package/cjs/Cascader/Cascader.js +46 -48
  25. package/cjs/CheckPicker/CheckPicker.d.ts +2 -2
  26. package/cjs/CheckPicker/CheckPicker.js +33 -36
  27. package/cjs/CheckTreePicker/CheckTreePicker.js +61 -64
  28. package/cjs/CustomProvider/CustomProvider.d.ts +13 -0
  29. package/cjs/CustomProvider/CustomProvider.js +2 -2
  30. package/cjs/DateInput/DateField.d.ts +9 -31
  31. package/cjs/DateInput/DateField.js +61 -12
  32. package/cjs/DateInput/DateInput.d.ts +7 -2
  33. package/cjs/DateInput/DateInput.js +74 -92
  34. package/cjs/DateInput/index.d.ts +4 -0
  35. package/cjs/DateInput/index.js +19 -1
  36. package/cjs/DateInput/useDateInputState.d.ts +7 -31
  37. package/cjs/DateInput/useDateInputState.js +39 -15
  38. package/cjs/DateInput/useIsFocused.d.ts +7 -0
  39. package/cjs/DateInput/useIsFocused.js +28 -0
  40. package/cjs/DateInput/useKeyboardInputEvent.d.ts +10 -0
  41. package/cjs/DateInput/useKeyboardInputEvent.js +44 -0
  42. package/cjs/DateInput/utils.d.ts +23 -1
  43. package/cjs/DateInput/utils.js +155 -51
  44. package/cjs/DatePicker/DatePicker.d.ts +25 -8
  45. package/cjs/DatePicker/DatePicker.js +208 -241
  46. package/cjs/DatePicker/Toolbar.js +5 -22
  47. package/cjs/DatePicker/utils.d.ts +5 -1
  48. package/cjs/DatePicker/utils.js +17 -1
  49. package/cjs/DateRangeInput/DateRangeInput.d.ts +29 -0
  50. package/cjs/DateRangeInput/DateRangeInput.js +244 -0
  51. package/cjs/DateRangeInput/index.d.ts +3 -0
  52. package/cjs/DateRangeInput/index.js +9 -0
  53. package/cjs/DateRangeInput/utils.d.ts +61 -0
  54. package/cjs/DateRangeInput/utils.js +146 -0
  55. package/cjs/DateRangePicker/Calendar.js +24 -23
  56. package/cjs/DateRangePicker/DateRangePicker.d.ts +18 -4
  57. package/cjs/DateRangePicker/DateRangePicker.js +251 -203
  58. package/cjs/DateRangePicker/types.d.ts +11 -3
  59. package/cjs/DateRangePicker/utils.d.ts +2 -1
  60. package/cjs/DateRangePicker/utils.js +7 -5
  61. package/cjs/FormControl/FormControl.d.ts +11 -1
  62. package/cjs/FormControl/FormControl.js +6 -5
  63. package/cjs/Input/Input.d.ts +11 -0
  64. package/cjs/Input/Input.js +11 -8
  65. package/cjs/InputPicker/InputPicker.js +62 -63
  66. package/cjs/MultiCascader/MultiCascader.js +40 -42
  67. package/cjs/Overlay/OverlayTrigger.d.ts +3 -0
  68. package/cjs/Overlay/OverlayTrigger.js +5 -0
  69. package/cjs/Picker/PickerIndicator.d.ts +10 -0
  70. package/cjs/Picker/PickerIndicator.js +49 -0
  71. package/cjs/Picker/PickerLabel.d.ts +9 -0
  72. package/cjs/Picker/PickerLabel.js +23 -0
  73. package/cjs/Picker/PickerToggle.d.ts +17 -22
  74. package/cjs/Picker/PickerToggle.js +52 -177
  75. package/cjs/Picker/index.d.ts +3 -0
  76. package/cjs/Picker/index.js +10 -1
  77. package/cjs/Picker/usePickerRef.d.ts +19 -0
  78. package/cjs/Picker/usePickerRef.js +88 -0
  79. package/cjs/Picker/utils.d.ts +5 -9
  80. package/cjs/Picker/utils.js +22 -89
  81. package/cjs/SelectPicker/SelectPicker.d.ts +2 -2
  82. package/cjs/SelectPicker/SelectPicker.js +39 -42
  83. package/cjs/TreePicker/TreePicker.js +72 -75
  84. package/cjs/index.d.ts +2 -0
  85. package/cjs/index.js +3 -1
  86. package/cjs/locales/index.d.ts +2 -2
  87. package/cjs/utils/constants.d.ts +2 -1
  88. package/cjs/utils/constants.js +1 -0
  89. package/cjs/utils/dateUtils.d.ts +0 -1
  90. package/cjs/utils/dateUtils.js +0 -6
  91. package/cjs/utils/getStringLength.d.ts +2 -0
  92. package/cjs/utils/getStringLength.js +18 -0
  93. package/cjs/utils/index.d.ts +3 -0
  94. package/cjs/utils/index.js +11 -2
  95. package/cjs/utils/useCustom.js +1 -1
  96. package/cjs/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  97. package/cjs/utils/useIsomorphicLayoutEffect.js +9 -0
  98. package/dist/rsuite-no-reset-rtl.css +140 -207
  99. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  100. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  101. package/dist/rsuite-no-reset.css +140 -207
  102. package/dist/rsuite-no-reset.min.css +1 -1
  103. package/dist/rsuite-no-reset.min.css.map +1 -1
  104. package/dist/rsuite-rtl.css +140 -75
  105. package/dist/rsuite-rtl.min.css +1 -1
  106. package/dist/rsuite-rtl.min.css.map +1 -1
  107. package/dist/rsuite.css +140 -75
  108. package/dist/rsuite.js +4833 -258
  109. package/dist/rsuite.js.map +1 -1
  110. package/dist/rsuite.min.css +1 -1
  111. package/dist/rsuite.min.css.map +1 -1
  112. package/dist/rsuite.min.js +1 -1
  113. package/dist/rsuite.min.js.map +1 -1
  114. package/esm/AutoComplete/AutoComplete.js +28 -29
  115. package/esm/Calendar/Calendar.d.ts +5 -1
  116. package/esm/Calendar/CalendarContainer.d.ts +7 -1
  117. package/esm/Calendar/CalendarContainer.js +12 -5
  118. package/esm/Calendar/CalendarHeader.js +2 -0
  119. package/esm/Calendar/MonthDropdown.js +7 -2
  120. package/esm/Calendar/MonthDropdownItem.js +2 -2
  121. package/esm/Calendar/Table.js +6 -1
  122. package/esm/Calendar/TimeDropdown.js +17 -10
  123. package/esm/Calendar/types.d.ts +1 -0
  124. package/esm/Cascader/Cascader.js +49 -51
  125. package/esm/CheckPicker/CheckPicker.d.ts +2 -2
  126. package/esm/CheckPicker/CheckPicker.js +36 -39
  127. package/esm/CheckTreePicker/CheckTreePicker.js +64 -67
  128. package/esm/CustomProvider/CustomProvider.d.ts +13 -0
  129. package/esm/CustomProvider/CustomProvider.js +3 -3
  130. package/esm/DateInput/DateField.d.ts +9 -31
  131. package/esm/DateInput/DateField.js +61 -12
  132. package/esm/DateInput/DateInput.d.ts +7 -2
  133. package/esm/DateInput/DateInput.js +77 -95
  134. package/esm/DateInput/index.d.ts +4 -0
  135. package/esm/DateInput/index.js +4 -0
  136. package/esm/DateInput/useDateInputState.d.ts +7 -31
  137. package/esm/DateInput/useDateInputState.js +41 -18
  138. package/esm/DateInput/useIsFocused.d.ts +7 -0
  139. package/esm/DateInput/useIsFocused.js +22 -0
  140. package/esm/DateInput/useKeyboardInputEvent.d.ts +10 -0
  141. package/esm/DateInput/useKeyboardInputEvent.js +38 -0
  142. package/esm/DateInput/utils.d.ts +23 -1
  143. package/esm/DateInput/utils.js +150 -51
  144. package/esm/DatePicker/DatePicker.d.ts +25 -8
  145. package/esm/DatePicker/DatePicker.js +211 -244
  146. package/esm/DatePicker/Toolbar.js +5 -22
  147. package/esm/DatePicker/utils.d.ts +5 -1
  148. package/esm/DatePicker/utils.js +16 -1
  149. package/esm/DateRangeInput/DateRangeInput.d.ts +29 -0
  150. package/esm/DateRangeInput/DateRangeInput.js +237 -0
  151. package/esm/DateRangeInput/index.d.ts +3 -0
  152. package/esm/DateRangeInput/index.js +3 -0
  153. package/esm/DateRangeInput/utils.d.ts +61 -0
  154. package/esm/DateRangeInput/utils.js +137 -0
  155. package/esm/DateRangePicker/Calendar.js +25 -23
  156. package/esm/DateRangePicker/DateRangePicker.d.ts +18 -4
  157. package/esm/DateRangePicker/DateRangePicker.js +253 -205
  158. package/esm/DateRangePicker/types.d.ts +11 -3
  159. package/esm/DateRangePicker/utils.d.ts +2 -1
  160. package/esm/DateRangePicker/utils.js +7 -5
  161. package/esm/FormControl/FormControl.d.ts +11 -1
  162. package/esm/FormControl/FormControl.js +4 -3
  163. package/esm/Input/Input.d.ts +11 -0
  164. package/esm/Input/Input.js +12 -9
  165. package/esm/InputPicker/InputPicker.js +64 -65
  166. package/esm/MultiCascader/MultiCascader.js +43 -45
  167. package/esm/Overlay/OverlayTrigger.d.ts +3 -0
  168. package/esm/Overlay/OverlayTrigger.js +5 -0
  169. package/esm/Picker/PickerIndicator.d.ts +10 -0
  170. package/esm/Picker/PickerIndicator.js +43 -0
  171. package/esm/Picker/PickerLabel.d.ts +9 -0
  172. package/esm/Picker/PickerLabel.js +17 -0
  173. package/esm/Picker/PickerToggle.d.ts +17 -22
  174. package/esm/Picker/PickerToggle.js +54 -179
  175. package/esm/Picker/index.d.ts +3 -0
  176. package/esm/Picker/index.js +3 -0
  177. package/esm/Picker/usePickerRef.d.ts +19 -0
  178. package/esm/Picker/usePickerRef.js +82 -0
  179. package/esm/Picker/utils.d.ts +5 -9
  180. package/esm/Picker/utils.js +24 -90
  181. package/esm/SelectPicker/SelectPicker.d.ts +2 -2
  182. package/esm/SelectPicker/SelectPicker.js +42 -45
  183. package/esm/TreePicker/TreePicker.js +75 -78
  184. package/esm/index.d.ts +2 -0
  185. package/esm/index.js +1 -0
  186. package/esm/locales/index.d.ts +2 -2
  187. package/esm/utils/constants.d.ts +2 -1
  188. package/esm/utils/constants.js +1 -0
  189. package/esm/utils/dateUtils.d.ts +0 -1
  190. package/esm/utils/dateUtils.js +0 -5
  191. package/esm/utils/getStringLength.d.ts +2 -0
  192. package/esm/utils/getStringLength.js +13 -0
  193. package/esm/utils/index.d.ts +3 -0
  194. package/esm/utils/index.js +4 -1
  195. package/esm/utils/useCustom.js +2 -2
  196. package/esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  197. package/esm/utils/useIsomorphicLayoutEffect.js +4 -0
  198. package/package.json +1 -1
  199. package/styles/color-modes/dark.less +1 -0
  200. package/styles/color-modes/high-contrast.less +1 -0
  201. package/styles/color-modes/light.less +1 -0
  202. package/styles/mixins/combobox.less +10 -0
  203. package/styles/normalize.less +230 -231
@@ -1,19 +1,20 @@
1
1
  'use client';
2
- import { useCallback } from 'react';
2
+ import { useEffect } from 'react';
3
3
  import startCase from 'lodash/startCase';
4
- import { addDays, addMonths, addYears, addHours, addMinutes, addSeconds, format, isLastDayOfMonth, lastDayOfMonth } from '../utils/dateUtils';
4
+ import { addDays, addMonths, addYears, addHours, addMinutes, addSeconds, format, isLastDayOfMonth, lastDayOfMonth, isValid } from '../utils/dateUtils';
5
5
  import { useDateField, patternMap } from './DateField';
6
- function useDateInputState(_ref) {
6
+ export function useDateInputState(_ref) {
7
7
  var formatStr = _ref.formatStr,
8
- localize = _ref.localize,
8
+ locale = _ref.locale,
9
9
  date = _ref.date,
10
10
  isControlledDate = _ref.isControlledDate;
11
- var _useDateField = useDateField(formatStr, localize, date),
11
+ var _useDateField = useDateField(formatStr, locale.localize, date),
12
12
  dateField = _useDateField.dateField,
13
13
  dispatch = _useDateField.dispatch,
14
14
  toDateString = _useDateField.toDateString,
15
- toDate = _useDateField.toDate;
16
- var setDateOffset = useCallback(function (pattern, offset, callback) {
15
+ toDate = _useDateField.toDate,
16
+ isEmptyValue = _useDateField.isEmptyValue;
17
+ var setDateOffset = function setDateOffset(pattern, offset, callback) {
17
18
  var currentDate = new Date();
18
19
  var year = dateField.year || currentDate.getFullYear();
19
20
  var month = dateField.month ? dateField.month - 1 : currentDate.getMonth();
@@ -56,8 +57,8 @@ function useDateInputState(_ref) {
56
57
  value = addSeconds(new Date(year, month, day, hour, minute, second), offset).getSeconds();
57
58
  break;
58
59
  case 'a':
59
- actionName = 'setMeridian';
60
- value = dateField.meridian === 'AM' ? 'PM' : 'AM';
60
+ actionName = 'setHour';
61
+ value = hour >= 12 ? hour - 12 : hour + 12;
61
62
  break;
62
63
  }
63
64
  if (actionName && value) {
@@ -68,8 +69,8 @@ function useDateInputState(_ref) {
68
69
  var field = patternMap[pattern];
69
70
  callback === null || callback === void 0 ? void 0 : callback(toDate(field, value));
70
71
  }
71
- }, [dateField, toDate, dispatch]);
72
- var setDateField = useCallback(function (pattern, value, callback) {
72
+ };
73
+ var setDateField = function setDateField(pattern, value, callback) {
73
74
  var field = patternMap[pattern];
74
75
  var actionName = "set" + startCase(field);
75
76
  dispatch({
@@ -77,23 +78,45 @@ function useDateInputState(_ref) {
77
78
  value: value
78
79
  });
79
80
  callback === null || callback === void 0 ? void 0 : callback(toDate(field, value));
80
- }, [toDate, dispatch]);
81
- var getDateField = useCallback(function (pattern) {
81
+ };
82
+ var getDateField = function getDateField(pattern) {
82
83
  var fieldName = patternMap[pattern];
83
84
  return {
84
85
  name: fieldName,
85
86
  value: dateField[fieldName]
86
87
  };
87
- }, [dateField]);
88
- var toControlledDateString = useCallback(function () {
89
- return format(date || new Date(), formatStr);
90
- }, [date, formatStr]);
88
+ };
89
+ var toControlledDateString = function toControlledDateString() {
90
+ if (date && isValid(date)) {
91
+ return format(date, formatStr, {
92
+ locale: locale
93
+ });
94
+ }
95
+ // if date is not valid, return uncontrolled date string
96
+ return toDateString();
97
+ };
98
+ useEffect(function () {
99
+ if (isControlledDate) {
100
+ if (date && isValid(date)) {
101
+ dispatch({
102
+ type: 'setNewDate',
103
+ value: date
104
+ });
105
+ } else if (date === null) {
106
+ dispatch({
107
+ type: 'setNewDate',
108
+ value: null
109
+ });
110
+ }
111
+ }
112
+ }, [date, dispatch, isControlledDate]);
91
113
  return {
92
114
  dateField: dateField,
93
115
  setDateOffset: setDateOffset,
94
116
  setDateField: setDateField,
95
117
  getDateField: getDateField,
96
- toDateString: isControlledDate ? toControlledDateString : toDateString
118
+ toDateString: isControlledDate ? toControlledDateString : toDateString,
119
+ isEmptyValue: isEmptyValue
97
120
  };
98
121
  }
99
122
  export default useDateInputState;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface FocusEventOptions {
3
+ onFocus?: React.FocusEventHandler<HTMLInputElement>;
4
+ onBlur?: React.FocusEventHandler<HTMLInputElement>;
5
+ }
6
+ export declare function useIsFocused({ onFocus: onFocusProp, onBlur: onBlurProp }: FocusEventOptions): [boolean, FocusEventOptions];
7
+ export default useIsFocused;
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { useState, useCallback } from 'react';
3
+ export function useIsFocused(_ref) {
4
+ var onFocusProp = _ref.onFocus,
5
+ onBlurProp = _ref.onBlur;
6
+ var _useState = useState(false),
7
+ isFocused = _useState[0],
8
+ setIsFocused = _useState[1];
9
+ var onFocus = useCallback(function (event) {
10
+ setIsFocused(true);
11
+ onFocusProp === null || onFocusProp === void 0 ? void 0 : onFocusProp(event);
12
+ }, [onFocusProp]);
13
+ var onBlur = useCallback(function (event) {
14
+ setIsFocused(false);
15
+ onBlurProp === null || onBlurProp === void 0 ? void 0 : onBlurProp(event);
16
+ }, [onBlurProp]);
17
+ return [isFocused, {
18
+ onFocus: onFocus,
19
+ onBlur: onBlur
20
+ }];
21
+ }
22
+ export default useIsFocused;
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ interface KeyboardEventOptions {
3
+ onSegmentChange?: (kevent: React.KeyboardEvent<HTMLInputElement>) => void;
4
+ onSegmentValueChange?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
5
+ onSegmentValueChangeWithNumericKeys?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
6
+ onSegmentValueRemove?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
7
+ onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
8
+ }
9
+ export declare function useKeyboardInputEvent({ onSegmentChange, onSegmentValueChange, onSegmentValueChangeWithNumericKeys, onSegmentValueRemove, onKeyDown }: KeyboardEventOptions): (event: React.KeyboardEvent<HTMLInputElement>) => void;
10
+ export default useKeyboardInputEvent;
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ export function useKeyboardInputEvent(_ref) {
3
+ var onSegmentChange = _ref.onSegmentChange,
4
+ onSegmentValueChange = _ref.onSegmentValueChange,
5
+ onSegmentValueChangeWithNumericKeys = _ref.onSegmentValueChangeWithNumericKeys,
6
+ onSegmentValueRemove = _ref.onSegmentValueRemove,
7
+ onKeyDown = _ref.onKeyDown;
8
+ return function (event) {
9
+ var _key$match, _key$match2;
10
+ var key = event.key;
11
+ switch (key) {
12
+ case 'ArrowRight':
13
+ case 'ArrowLeft':
14
+ onSegmentChange === null || onSegmentChange === void 0 ? void 0 : onSegmentChange(event);
15
+ event.preventDefault();
16
+ break;
17
+ case 'ArrowUp':
18
+ case 'ArrowDown':
19
+ onSegmentValueChange === null || onSegmentValueChange === void 0 ? void 0 : onSegmentValueChange(event);
20
+ event.preventDefault();
21
+ break;
22
+ case 'Backspace':
23
+ onSegmentValueRemove === null || onSegmentValueRemove === void 0 ? void 0 : onSegmentValueRemove(event);
24
+ event.preventDefault();
25
+ break;
26
+ case (_key$match = key.match(/\d/)) === null || _key$match === void 0 ? void 0 : _key$match.input:
27
+ // Allow numeric keys to be entered
28
+ onSegmentValueChangeWithNumericKeys === null || onSegmentValueChangeWithNumericKeys === void 0 ? void 0 : onSegmentValueChangeWithNumericKeys(event);
29
+ event.preventDefault();
30
+ case (_key$match2 = key.match(/[a-z]/)) === null || _key$match2 === void 0 ? void 0 : _key$match2[0]:
31
+ // Prevent letters from being entered
32
+ event.preventDefault();
33
+ break;
34
+ }
35
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
36
+ };
37
+ }
38
+ export default useKeyboardInputEvent;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { type Locale } from 'date-fns';
2
3
  interface SelectedStateOptions {
3
4
  /**
@@ -24,13 +25,32 @@ interface SelectedStateOptions {
24
25
  * The offset of the value, which is used to calculate the month.
25
26
  * This value will be changed when pressing the up and down arrow keys.
26
27
  */
27
- valueOffset?: number;
28
+ valueOffset?: number | null;
28
29
  /**
29
30
  * The date is rendered in string format according to format
30
31
  */
31
32
  dateString: string;
32
33
  }
33
34
  export declare function getPatternGroups(format: string, pattern: string): string;
35
+ interface SelectIndexGapOptions {
36
+ pattern: string;
37
+ formatStr: string;
38
+ valueOffset: number | null;
39
+ selectedMonth: number | null;
40
+ localize: Locale['localize'];
41
+ }
42
+ export declare function getSelectIndexGap(options: SelectIndexGapOptions): number;
43
+ interface DatePatternOptions {
44
+ selectionIndex: number;
45
+ positionOffset?: number;
46
+ formatStr: string;
47
+ dateString: string;
48
+ valueOffset: number | null;
49
+ selectedMonth: number | null;
50
+ localize: Locale['localize'];
51
+ }
52
+ export declare function getDatePattern(options: DatePatternOptions): string;
53
+ export declare function isCursorAfterMonth(cursorIndex: number, formatStr: string): boolean;
34
54
  export declare function getInputSelectedState(options: SelectedStateOptions): {
35
55
  selectionStart: number;
36
56
  selectionEnd: number;
@@ -38,4 +58,6 @@ export declare function getInputSelectedState(options: SelectedStateOptions): {
38
58
  };
39
59
  export declare function validateDateTime(type: string, value: number): boolean;
40
60
  export declare function modifyDate(date: Date, type: string, value: number): Date;
61
+ export declare function isFieldFullValue(formatStr: string, value: number, pattern: string): boolean;
62
+ export declare function useInputSelection(input: React.RefObject<any>): (selectionStart: number, selectionEnd: number) => void;
41
63
  export {};
@@ -1,10 +1,89 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import { setYear, setMonth, setDate, setHours, setMinutes, setSeconds } from '../utils/dateUtils';
4
+ import { safeSetSelection } from '../utils';
4
5
  export function getPatternGroups(format, pattern) {
5
6
  var _format$match;
6
7
  return ((_format$match = format.match(new RegExp("(" + pattern + ")+"))) === null || _format$match === void 0 ? void 0 : _format$match[0]) || '';
7
8
  }
9
+ export function getSelectIndexGap(options) {
10
+ var pattern = options.pattern,
11
+ formatStr = options.formatStr,
12
+ valueOffset = options.valueOffset,
13
+ selectedMonth = options.selectedMonth,
14
+ localize = options.localize;
15
+ var gap = 0;
16
+ var monthIsAbbreviated = formatStr.includes('MMM');
17
+ var monthIsFull = formatStr.includes('MMMM');
18
+
19
+ // If the month is abbreviated or full, the gap needs to be adjusted.
20
+ if (monthIsAbbreviated || monthIsFull) {
21
+ var isSelectedMonth = pattern === 'M';
22
+
23
+ // If the selected is the month, and the valueOffset is null,
24
+ // it means that the delete key is pressed, and the default pattern is displayed, and the gap is 0 at this time.
25
+ if (isSelectedMonth && valueOffset === null) {
26
+ return 0;
27
+ }
28
+
29
+ // If the month is null and the valueOffset is 0, the month will not be updated, and the gap is 0 at this time.
30
+ if (selectedMonth === null && valueOffset === 0) {
31
+ return 0;
32
+ }
33
+ var month = selectedMonth ? selectedMonth + (isSelectedMonth ? valueOffset || 0 : 0) : 1;
34
+ if (month > 12) {
35
+ month = 1;
36
+ } else if (month === 0) {
37
+ month = 12;
38
+ }
39
+ var monthStr = localize === null || localize === void 0 ? void 0 : localize.month(month - 1, {
40
+ width: monthIsFull ? 'wide' : 'abbreviated'
41
+ });
42
+ gap = monthStr.length - (monthIsFull ? 4 : 3);
43
+ }
44
+ return gap;
45
+ }
46
+ export function getDatePattern(options) {
47
+ var selectionIndex = options.selectionIndex,
48
+ _options$positionOffs = options.positionOffset,
49
+ positionOffset = _options$positionOffs === void 0 ? -1 : _options$positionOffs,
50
+ formatStr = options.formatStr,
51
+ dateString = options.dateString,
52
+ valueOffset = options.valueOffset,
53
+ selectedMonth = options.selectedMonth,
54
+ localize = options.localize;
55
+ var pattern = formatStr.charAt(selectionIndex || 0);
56
+ if (selectionIndex < 0 || selectionIndex > dateString.length - 1) {
57
+ pattern = formatStr.trim().charAt(0);
58
+ return pattern;
59
+ }
60
+ var gap = 0;
61
+ if (isCursorAfterMonth(selectionIndex, formatStr)) {
62
+ gap = getSelectIndexGap({
63
+ pattern: pattern,
64
+ formatStr: formatStr,
65
+ valueOffset: valueOffset,
66
+ selectedMonth: selectedMonth,
67
+ localize: localize
68
+ });
69
+ }
70
+ pattern = formatStr.charAt(selectionIndex - gap);
71
+
72
+ // If the pattern is not a letter, then get the pattern from the previous or next letter.
73
+ if (!pattern.match(/[y|d|M|H|h|m|s|a]/)) {
74
+ var nextIndex = selectionIndex + positionOffset;
75
+ pattern = getDatePattern(_extends({}, options, {
76
+ selectionIndex: nextIndex
77
+ }));
78
+ }
79
+ return pattern;
80
+ }
81
+
82
+ // Determine whether the cursor is after the month.
83
+ // If the currently operated field is after the month, the selected field needs to be moved backward.
84
+ export function isCursorAfterMonth(cursorIndex, formatStr) {
85
+ return cursorIndex > formatStr.indexOf('M');
86
+ }
8
87
  export function getInputSelectedState(options) {
9
88
  var input = options.input,
10
89
  direction = options.direction,
@@ -14,74 +93,61 @@ export function getInputSelectedState(options) {
14
93
  dateString = options.dateString,
15
94
  _options$valueOffset = options.valueOffset,
16
95
  valueOffset = _options$valueOffset === void 0 ? 0 : _options$valueOffset;
17
- var getSelectIndexGap = function getSelectIndexGap(pattern) {
18
- var gap = 0;
19
- var monthIsAbbreviated = formatStr.includes('MMM');
20
- var monthIsFull = formatStr.includes('MMMM');
21
-
22
- // If the month is abbreviated or full, the gap needs to be adjusted.
23
- if (monthIsAbbreviated || monthIsFull) {
24
- var isSelected = pattern === 'M';
25
- if (selectedMonth === null && valueOffset === 0) {
26
- return gap;
27
- }
28
- var month = selectedMonth ? selectedMonth + (isSelected ? valueOffset : 0) : 1;
29
- if (month > 12) {
30
- month = 1;
31
- } else if (month === 0) {
32
- month = 12;
33
- }
34
- var monthStr = localize === null || localize === void 0 ? void 0 : localize.month(month - 1, {
35
- width: monthIsFull ? 'wide' : 'abbreviated'
36
- });
37
- gap = monthStr.length - (monthIsFull ? 4 : 3);
38
- }
39
- return gap;
40
- };
41
- var getDatePattern = function getDatePattern(selectionIndex, positionOffset) {
42
- if (positionOffset === void 0) {
43
- positionOffset = -1;
44
- }
45
- var pattern = formatStr.charAt((input === null || input === void 0 ? void 0 : input.selectionStart) || 0);
46
- if (selectionIndex < 0 || selectionIndex > dateString.length - 1) {
47
- pattern = formatStr.trim().charAt(0);
48
- return pattern;
49
- }
50
- var gap = getSelectIndexGap(pattern);
51
- pattern = formatStr.charAt(selectionIndex - gap);
52
-
53
- // If the pattern is not a letter, then get the pattern from the previous or next letter.
54
- if (!pattern.match(/[y|d|M|H|h|m|s|a]/)) {
55
- var nextIndex = selectionIndex + positionOffset;
56
- pattern = getDatePattern(nextIndex, positionOffset);
57
- }
58
- return pattern;
59
- };
60
96
  var getPatternSelectedIndexes = function getPatternSelectedIndexes(pattern) {
61
97
  var selectionStart = formatStr.indexOf(pattern);
62
98
  var selectionEnd = formatStr.lastIndexOf(pattern) + 1;
63
- var gap = getSelectIndexGap(pattern);
64
- if (pattern === 'M') {
99
+ var gap = getSelectIndexGap({
100
+ pattern: pattern,
101
+ formatStr: formatStr,
102
+ valueOffset: valueOffset,
103
+ selectedMonth: selectedMonth,
104
+ localize: localize
105
+ });
106
+ var isSelectedMonth = pattern === 'M';
107
+ var isNullMonth = selectedMonth === null && !(isSelectedMonth && valueOffset !== 0);
108
+
109
+ // If the month is null and the valueOffset is 0, the month will not be updated, and the gap is 0 at this time.
110
+ if (isNullMonth) {
111
+ return {
112
+ selectionStart: selectionStart,
113
+ selectionEnd: selectionEnd
114
+ };
115
+ }
116
+ if (isSelectedMonth) {
65
117
  return {
66
118
  selectionStart: selectionStart,
67
119
  selectionEnd: selectionEnd + gap
68
120
  };
69
121
  }
122
+ if (isCursorAfterMonth(selectionStart, formatStr)) {
123
+ return {
124
+ selectionStart: selectionStart + gap,
125
+ selectionEnd: selectionEnd + gap
126
+ };
127
+ }
70
128
  return {
71
- selectionStart: selectionStart + gap,
72
- selectionEnd: selectionEnd + gap
129
+ selectionStart: selectionStart,
130
+ selectionEnd: selectionEnd
73
131
  };
74
132
  };
75
133
  if (typeof input.selectionEnd === 'number' && typeof input.selectionStart === 'number') {
76
- var index = input.selectionStart;
134
+ var selectionIndex = input.selectionStart;
77
135
  var positionOffset = -1;
78
136
  if (direction === 'left') {
79
- index = input.selectionStart - 1;
137
+ selectionIndex = input.selectionStart - 1;
80
138
  } else if (direction === 'right') {
81
- index = input.selectionEnd + 1;
139
+ selectionIndex = input.selectionEnd + 1;
82
140
  positionOffset = 1;
83
141
  }
84
- var datePattern = getDatePattern(index, positionOffset);
142
+ var datePattern = getDatePattern({
143
+ selectionIndex: selectionIndex,
144
+ positionOffset: positionOffset,
145
+ formatStr: formatStr,
146
+ dateString: dateString,
147
+ valueOffset: valueOffset,
148
+ selectedMonth: selectedMonth,
149
+ localize: localize
150
+ });
85
151
  var indexes = getPatternSelectedIndexes(datePattern);
86
152
  return _extends({
87
153
  selectedPattern: datePattern
@@ -148,4 +214,37 @@ export function modifyDate(date, type, value) {
148
214
  return setSeconds(date, value);
149
215
  }
150
216
  return date;
217
+ }
218
+ export function isFieldFullValue(formatStr, value, pattern) {
219
+ var patternGroup = getPatternGroups(formatStr, pattern);
220
+ if (value.toString().length === patternGroup.length) {
221
+ return true;
222
+ }
223
+ switch (pattern) {
224
+ case 'M':
225
+ return parseInt(value + "0") > 12;
226
+ case 'd':
227
+ return parseInt(value + "0") > 31;
228
+ case 'H':
229
+ return parseInt(value + "0") > 23;
230
+ case 'h':
231
+ return parseInt(value + "0") > 12;
232
+ case 'm':
233
+ case 's':
234
+ return parseInt(value + "0") > 59;
235
+ default:
236
+ return false;
237
+ }
238
+ }
239
+ var isTestEnvironment = undefined === 'test';
240
+ export function useInputSelection(input) {
241
+ return function setSelectionRange(selectionStart, selectionEnd) {
242
+ if (isTestEnvironment) {
243
+ safeSetSelection(input.current, selectionStart, selectionEnd);
244
+ return;
245
+ }
246
+ requestAnimationFrame(function () {
247
+ safeSetSelection(input.current, selectionStart, selectionEnd);
248
+ });
249
+ };
151
250
  }
@@ -1,14 +1,15 @@
1
1
  import React from 'react';
2
2
  import { RangeType } from './Toolbar';
3
3
  import { DatePickerLocale } from '../locales';
4
- import { PickerToggleProps } from '../Picker';
5
4
  import { FormControlBaseProps, PickerBaseProps, RsRefForwardingComponent } from '../@types/common';
6
5
  export type { RangeType } from './Toolbar';
7
- export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, FormControlBaseProps<Date | null>, Pick<PickerToggleProps, 'caretAs' | 'readOnly' | 'plaintext' | 'loading'> {
8
- /** Predefined date Ranges */
9
- ranges?: RangeType<Date>[];
6
+ export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, FormControlBaseProps<Date | null> {
7
+ /** Custom caret component */
8
+ caretAs?: React.ElementType | null;
10
9
  /** Calendar panel default presentation date and time */
11
10
  calendarDefaultDate?: Date;
11
+ /** Whether disabled the component */
12
+ disabled?: boolean;
12
13
  /** Rendered as an input, the date can be entered via the keyboard */
13
14
  editable?: boolean;
14
15
  /** Format date */
@@ -19,18 +20,32 @@ export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, Form
19
20
  * @deprecated use <Calendar> instead
20
21
  **/
21
22
  inline?: boolean;
22
- /** ISO 8601 standard, each calendar week begins on Monday and Sunday on the seventh day */
23
+ /**
24
+ * ISO 8601 standard, each calendar week begins on Monday and Sunday on the seventh day
25
+ *
26
+ * @see https://en.wikipedia.org/wiki/ISO_week_date
27
+ */
23
28
  isoWeek?: boolean;
29
+ /** A label displayed at the beginning of toggle button */
30
+ label?: React.ReactNode;
24
31
  /** Set the upper limit of the available year relative to the current selection date */
25
32
  limitEndYear?: number;
26
33
  /** Set the lower limit of the available year relative to the current selection date */
27
34
  limitStartYear?: number;
35
+ /** Whether to display a loading state indicator */
36
+ loading?: boolean;
37
+ /** one tap to select */
38
+ oneTap?: boolean;
39
+ /** Whether plaintext the component */
40
+ plaintext?: boolean;
41
+ /** Whether read only the component */
42
+ readOnly?: boolean;
43
+ /** Predefined date Ranges */
44
+ ranges?: RangeType<Date>[];
28
45
  /** Whether to show week numbers */
29
46
  showWeekNumbers?: boolean;
30
47
  /** Meridian format */
31
48
  showMeridian?: boolean;
32
- /** one tap to select */
33
- oneTap?: boolean;
34
49
  /**
35
50
  * Whether to disable a date on the calendar view
36
51
  *
@@ -98,7 +113,9 @@ export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, Form
98
113
  onShortcutClick?: (range: RangeType<Date>, event: React.MouseEvent) => void;
99
114
  /** Called when clean */
100
115
  onClean?: (event: React.MouseEvent) => void;
101
- /** Custom render value */
116
+ /**
117
+ * @deprecated
118
+ */
102
119
  renderValue?: (value: Date, format: string) => string;
103
120
  }
104
121
  /**