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,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { type Locale } from 'date-fns';
2
+ import type { Locale } from 'date-fns';
3
3
  export declare const patternMap: {
4
4
  y: string;
5
5
  M: string;
@@ -22,9 +22,12 @@ export declare class DateField extends Object {
22
22
  hour: number | null;
23
23
  minute: number | null;
24
24
  second: number | null;
25
- meridian: 'AM' | 'PM' | null;
26
25
  constructor(format: string, value?: Date | null);
27
26
  }
27
+ interface Action {
28
+ type: string;
29
+ value: any;
30
+ }
28
31
  export declare const useDateField: (format: string, localize: Locale['localize'], date?: Date | null) => {
29
32
  dateField: {
30
33
  year: any;
@@ -38,7 +41,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
38
41
  hour: number | null;
39
42
  minute: number | null;
40
43
  second: number | null;
41
- meridian: 'AM' | 'PM' | null;
42
44
  constructor: Function;
43
45
  toString(): string;
44
46
  toLocaleString(): string;
@@ -59,7 +61,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
59
61
  hour: number | null;
60
62
  minute: number | null;
61
63
  second: number | null;
62
- meridian: 'AM' | 'PM' | null;
63
64
  constructor: Function;
64
65
  toString(): string;
65
66
  toLocaleString(): string;
@@ -80,7 +81,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
80
81
  hour: number | null;
81
82
  minute: number | null;
82
83
  second: number | null;
83
- meridian: 'AM' | 'PM' | null;
84
84
  constructor: Function;
85
85
  toString(): string;
86
86
  toLocaleString(): string;
@@ -101,7 +101,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
101
101
  day: number | null;
102
102
  minute: number | null;
103
103
  second: number | null;
104
- meridian: 'AM' | 'PM' | null;
105
104
  constructor: Function;
106
105
  toString(): string;
107
106
  toLocaleString(): string;
@@ -122,7 +121,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
122
121
  day: number | null;
123
122
  hour: number | null;
124
123
  second: number | null;
125
- meridian: 'AM' | 'PM' | null;
126
124
  constructor: Function;
127
125
  toString(): string;
128
126
  toLocaleString(): string;
@@ -143,28 +141,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
143
141
  day: number | null;
144
142
  hour: number | null;
145
143
  minute: number | null;
146
- meridian: 'AM' | 'PM' | null;
147
- constructor: Function;
148
- toString(): string;
149
- toLocaleString(): string;
150
- valueOf(): Object;
151
- hasOwnProperty(v: PropertyKey): boolean;
152
- isPrototypeOf(v: Object): boolean;
153
- propertyIsEnumerable(v: PropertyKey): boolean;
154
- should: Chai.Assertion;
155
- } | {
156
- meridian: any;
157
- format: string;
158
- patternArray: {
159
- pattern: string;
160
- key: string;
161
- }[];
162
- year: number | null;
163
- month: number | null;
164
- day: number | null;
165
- hour: number | null;
166
- minute: number | null;
167
- second: number | null;
168
144
  constructor: Function;
169
145
  toString(): string;
170
146
  toLocaleString(): string;
@@ -174,7 +150,9 @@ export declare const useDateField: (format: string, localize: Locale['localize']
174
150
  propertyIsEnumerable(v: PropertyKey): boolean;
175
151
  should: Chai.Assertion;
176
152
  };
177
- dispatch: import("react").Dispatch<any>;
178
- toDate: (type: string, value: number | null) => Date;
153
+ dispatch: import("react").Dispatch<Action>;
154
+ toDate: (type?: string, value?: number | null) => Date | null;
179
155
  toDateString: () => string;
156
+ isEmptyValue: (type?: string, value?: number | null) => boolean | undefined;
180
157
  };
158
+ export {};
@@ -3,6 +3,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose";
4
4
  import _wrapNativeSuper from "@babel/runtime/helpers/esm/wrapNativeSuper";
5
5
  import { useReducer } from 'react';
6
+ import isValid from 'date-fns/isValid';
6
7
  import { modifyDate } from './utils';
7
8
  export var patternMap = {
8
9
  y: 'year',
@@ -27,7 +28,6 @@ export var DateField = /*#__PURE__*/function (_Object) {
27
28
  _this.hour = null;
28
29
  _this.minute = null;
29
30
  _this.second = null;
30
- _this.meridian = null;
31
31
  _this.format = format;
32
32
  var formatArray = format.match(new RegExp('([y|d|M|H|h|m|s|a])+', 'ig')) || [];
33
33
  _this.patternArray = formatArray.map(function (pattern) {
@@ -36,14 +36,13 @@ export var DateField = /*#__PURE__*/function (_Object) {
36
36
  key: patternMap[pattern[0]]
37
37
  };
38
38
  });
39
- if (value) {
39
+ if (value && isValid(value)) {
40
40
  _this.year = value.getFullYear();
41
41
  _this.month = value.getMonth() + 1;
42
42
  _this.day = value.getDate();
43
43
  _this.hour = value.getHours();
44
44
  _this.minute = value.getMinutes();
45
45
  _this.second = value.getSeconds();
46
- _this.meridian = value.getHours() > 12 ? 'PM' : 'AM';
47
46
  }
48
47
  return _this;
49
48
  }
@@ -91,10 +90,8 @@ export var useDateField = function useDateField(format, localize, date) {
91
90
  return _extends({}, state, {
92
91
  second: action.value
93
92
  });
94
- case 'setMeridian':
95
- return _extends({}, state, {
96
- meridian: action.value
97
- });
93
+ case 'setNewDate':
94
+ return new DateField(format, action.value);
98
95
  default:
99
96
  return state;
100
97
  }
@@ -106,6 +103,7 @@ export var useDateField = function useDateField(format, localize, date) {
106
103
  dateField.patternArray.forEach(function (item) {
107
104
  var key = item.key,
108
105
  pattern = item.pattern;
106
+ var hour = dateField.hour;
109
107
  var value = dateField[key];
110
108
  if (value !== null) {
111
109
  if (pattern === 'MMM' && typeof value === 'number') {
@@ -116,8 +114,12 @@ export var useDateField = function useDateField(format, localize, date) {
116
114
  value = localize === null || localize === void 0 ? void 0 : localize.month(value - 1, {
117
115
  width: 'wide'
118
116
  });
119
- } else if (pattern === 'aa' && typeof value === 'number') {
120
- value = value === 0 ? 'AM' : 'PM';
117
+ } else if (pattern === 'aa') {
118
+ if (typeof hour === 'number') {
119
+ value = hour > 12 ? 'PM' : 'AM';
120
+ } else {
121
+ value = 'aa';
122
+ }
121
123
  } else if (pattern === 'hh' && typeof value === 'number') {
122
124
  value = value === 0 ? 12 : value > 12 ? value - 12 : value;
123
125
  }
@@ -129,16 +131,63 @@ export var useDateField = function useDateField(format, localize, date) {
129
131
  });
130
132
  return str;
131
133
  };
134
+
135
+ // Check if the field value is valid.
136
+ var validFieldValue = function validFieldValue(type, value) {
137
+ var _format$match;
138
+ var isValid = true;
139
+ (_format$match = format.match(new RegExp('([y|d|M|H|h|m|s])+', 'ig'))) === null || _format$match === void 0 ? void 0 : _format$match.forEach(function (pattern) {
140
+ var key = patternMap[pattern[0]];
141
+ var fieldValue = type === key ? value : dateField[key];
142
+ if (fieldValue === null) {
143
+ isValid = false;
144
+ return;
145
+ }
146
+ });
147
+ return isValid;
148
+ };
149
+ var isEmptyValue = function isEmptyValue(type, value) {
150
+ var _format$match2;
151
+ var checkValueArray = (_format$match2 = format.match(new RegExp('([y|d|M|H|h|m|s])+', 'ig'))) === null || _format$match2 === void 0 ? void 0 : _format$match2.map(function (pattern) {
152
+ var key = patternMap[pattern[0]];
153
+ var fieldValue = type === key ? value : dateField[key];
154
+ return fieldValue !== null;
155
+ });
156
+ return checkValueArray === null || checkValueArray === void 0 ? void 0 : checkValueArray.every(function (item) {
157
+ return item === false;
158
+ });
159
+ };
132
160
  var toDate = function toDate(type, value) {
133
- if (value === null) {
161
+ var year = dateField.year,
162
+ month = dateField.month,
163
+ day = dateField.day,
164
+ hour = dateField.hour,
165
+ minute = dateField.minute,
166
+ second = dateField.second;
167
+ var date = new Date(year || 0, typeof month === 'number' ? month - 1 : 0,
168
+ // The default day is 1 when the value is null, otherwise it becomes the last day of the month.
169
+ day || 1, hour || 0, minute || 0, second || 0);
170
+ if (typeof type === 'undefined' || typeof value === 'undefined') {
171
+ return date;
172
+ }
173
+ if (value === null || !validFieldValue(type, value)) {
174
+ if (isEmptyValue(type, value)) {
175
+ return null;
176
+ }
134
177
  return new Date('');
135
178
  }
136
- return modifyDate(new Date(dateField.year, dateField.month ? dateField.month - 1 : 0, dateField.day, dateField.hour, dateField.minute, dateField.second), type, value);
179
+ if (type === 'meridian' && typeof hour === 'number') {
180
+ var newHour = hour > 12 ? hour - 12 : hour + 12;
181
+ type = 'hour';
182
+ value = newHour;
183
+ }
184
+ return modifyDate(date, type, value);
137
185
  };
138
186
  return {
139
187
  dateField: dateField,
140
188
  dispatch: dispatch,
141
189
  toDate: toDate,
142
- toDateString: toDateString
190
+ toDateString: toDateString,
191
+ isEmptyValue: isEmptyValue
143
192
  };
144
193
  };
@@ -3,11 +3,16 @@ import { InputProps } from '../Input';
3
3
  import { FormControlBaseProps } from '../@types/common';
4
4
  export interface DateInputProps extends Omit<InputProps, 'value' | 'onChange' | 'defaultValue'>, FormControlBaseProps<Date | null> {
5
5
  /**
6
- * Format of the date when rendered in the input.
7
- * Format of the string is based on Unicode Technical Standard: https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
6
+ * Format of the date when rendered in the input. Format of the string is based on Unicode Technical Standard.
7
+ *
8
+ * @see https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
8
9
  * @default 'yyyy-MM-dd'
9
10
  **/
10
11
  format?: string;
12
+ /**
13
+ * The `placeholder` prop defines the text displayed in a form control when the control has no value.
14
+ */
15
+ placeholder?: string;
11
16
  }
12
17
  /**
13
18
  * The DateInput component lets users select a date with the keyboard.
@@ -1,12 +1,14 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import React, { useState, useCallback, useRef, useMemo } from 'react';
4
+ import React, { useState, useRef, useMemo } from 'react';
5
+ import PropTypes from 'prop-types';
5
6
  import Input from '../Input';
6
- import { mergeRefs, useCustom, useControlled, safeSetSelection } from '../utils';
7
- import { getInputSelectedState, validateDateTime, getPatternGroups } from './utils';
7
+ import { mergeRefs, useCustom, useControlled, useEventCallback } from '../utils';
8
+ import { getInputSelectedState, validateDateTime, isFieldFullValue, useInputSelection } from './utils';
8
9
  import useDateInputState from './useDateInputState';
9
- var isTestEnvironment = undefined === 'test';
10
+ import useKeyboardInputEvent from './useKeyboardInputEvent';
11
+ import useIsFocused from './useIsFocused';
10
12
  /**
11
13
  * The DateInput component lets users select a date with the keyboard.
12
14
  * @version 5.58.0
@@ -17,9 +19,12 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
17
19
  formatStr = _props$format === void 0 ? 'yyyy-MM-dd' : _props$format,
18
20
  valueProp = props.value,
19
21
  defaultValue = props.defaultValue,
22
+ placeholder = props.placeholder,
20
23
  onChange = props.onChange,
21
24
  onKeyDown = props.onKeyDown,
22
- rest = _objectWithoutPropertiesLoose(props, ["format", "value", "defaultValue", "onChange", "onKeyDown"]);
25
+ onBlur = props.onBlur,
26
+ onFocus = props.onFocus,
27
+ rest = _objectWithoutPropertiesLoose(props, ["format", "value", "defaultValue", "placeholder", "onChange", "onKeyDown", "onBlur", "onFocus"]);
23
28
  var inputRef = useRef();
24
29
  var _useState = useState({
25
30
  selectedPattern: 'y',
@@ -30,14 +35,14 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
30
35
  setSelectedState = _useState[1];
31
36
  var _useCustom = useCustom('Calendar'),
32
37
  locale = _useCustom.locale;
33
- var localize = locale.dateLocale.localize;
38
+ var dateLocale = locale.dateLocale;
34
39
  var _useControlled = useControlled(valueProp, defaultValue),
35
40
  value = _useControlled[0],
36
41
  setValue = _useControlled[1],
37
42
  isControlled = _useControlled[2];
38
43
  var _useDateInputState = useDateInputState({
39
44
  formatStr: formatStr,
40
- localize: localize,
45
+ locale: dateLocale,
41
46
  date: value,
42
47
  isControlledDate: isControlled
43
48
  }),
@@ -45,49 +50,36 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
45
50
  setDateOffset = _useDateInputState.setDateOffset,
46
51
  setDateField = _useDateInputState.setDateField,
47
52
  getDateField = _useDateInputState.getDateField,
48
- toDateString = _useDateInputState.toDateString;
53
+ toDateString = _useDateInputState.toDateString,
54
+ isEmptyValue = _useDateInputState.isEmptyValue;
49
55
  var dateString = toDateString();
50
56
  var keyPressOptions = useMemo(function () {
51
57
  return {
52
58
  formatStr: formatStr,
53
- localize: localize,
59
+ localize: dateLocale.localize,
54
60
  selectedMonth: dateField.month,
55
61
  dateString: dateString
56
62
  };
57
- }, [dateField, dateString, formatStr, localize]);
58
- var setSelectionRange = useCallback(function (selectionStart, selectionEnd) {
59
- if (selectionStart === void 0) {
60
- selectionStart = selectedState.selectionStart;
61
- }
62
- if (selectionEnd === void 0) {
63
- selectionEnd = selectedState.selectionEnd;
64
- }
65
- var input = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current;
66
- if (isTestEnvironment) {
67
- safeSetSelection(input, selectionStart, selectionEnd);
68
- return;
69
- }
70
- requestAnimationFrame(function () {
71
- safeSetSelection(input, selectionStart, selectionEnd);
72
- });
73
- }, [selectedState]);
74
- var handleChange = useCallback(function (value, event) {
75
- setValue(value);
63
+ }, [dateField, dateString, formatStr, dateLocale]);
64
+ var handleChange = useEventCallback(function (value, event) {
76
65
  onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
77
- }, [onChange, setValue]);
78
- var handleChangeField = useCallback(function (event, nextDirection) {
66
+ setValue(value);
67
+ });
68
+ var setSelectionRange = useInputSelection(inputRef);
69
+ var onSegmentChange = useEventCallback(function (event, nextDirection) {
79
70
  var input = event.target;
80
- var direction = nextDirection || (event.key === 'ArrowRight' ? 'right' : 'left');
71
+ var key = event.key;
72
+ var direction = nextDirection || (key === 'ArrowRight' ? 'right' : 'left');
81
73
  var state = getInputSelectedState(_extends({}, keyPressOptions, {
82
74
  input: input,
83
75
  direction: direction
84
76
  }));
85
77
  setSelectionRange(state.selectionStart, state.selectionEnd);
86
78
  setSelectedState(state);
87
- }, [keyPressOptions, setSelectionRange]);
88
- var handleChangeFieldValue = useCallback(function (event) {
89
- var key = event.key;
79
+ });
80
+ var onSegmentValueChange = useEventCallback(function (event) {
90
81
  var input = event.target;
82
+ var key = event.key;
91
83
  var offset = key === 'ArrowUp' ? 1 : -1;
92
84
  var state = getInputSelectedState(_extends({}, keyPressOptions, {
93
85
  input: input,
@@ -98,31 +90,10 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
98
90
  return handleChange(date, event);
99
91
  });
100
92
  setSelectionRange(state.selectionStart, state.selectionEnd);
101
- }, [handleChange, keyPressOptions, setDateOffset, setSelectionRange]);
102
- var isFieldFullValue = useCallback(function (value, pattern) {
103
- var patternGroup = getPatternGroups(formatStr, pattern);
104
- if (value.toString().length === patternGroup.length) {
105
- return true;
106
- }
107
- switch (pattern) {
108
- case 'M':
109
- return parseInt(value + "0") > 12;
110
- case 'd':
111
- return parseInt(value + "0") > 31;
112
- case 'H':
113
- return parseInt(value + "0") > 23;
114
- case 'h':
115
- return parseInt(value + "0") > 12;
116
- case 'm':
117
- case 's':
118
- return parseInt(value + "0") > 59;
119
- default:
120
- return false;
121
- }
122
- }, [formatStr]);
123
- var handleChangeFieldValueWithNumericKeys = useCallback(function (event) {
124
- var key = event.key;
93
+ });
94
+ var onSegmentValueChangeWithNumericKeys = useEventCallback(function (event) {
125
95
  var input = event.target;
96
+ var key = event.key;
126
97
  var pattern = selectedState.selectedPattern;
127
98
  if (!pattern) {
128
99
  return;
@@ -155,61 +126,72 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
155
126
  setSelectionRange(nextState.selectionStart, nextState.selectionEnd);
156
127
 
157
128
  // If the field is full value, move the cursor to the next field
158
- if (isFieldFullValue(newValue, pattern) && input.selectionEnd !== input.value.length) {
159
- handleChangeField(event, 'right');
129
+ if (isFieldFullValue(formatStr, newValue, pattern) && input.selectionEnd !== input.value.length) {
130
+ onSegmentChange(event, 'right');
160
131
  }
161
- }, [dateField, getDateField, handleChange, handleChangeField, isFieldFullValue, keyPressOptions, selectedState.selectedPattern, setDateField, setSelectionRange]);
162
- var handleRemoveFieldValue = useCallback(function (event) {
132
+ });
133
+ var onSegmentValueRemove = useEventCallback(function (event) {
134
+ var input = event.target;
163
135
  if (selectedState.selectedPattern) {
136
+ var nextState = getInputSelectedState(_extends({}, keyPressOptions, {
137
+ input: input,
138
+ valueOffset: null
139
+ }));
140
+ setSelectedState(nextState);
141
+ setSelectionRange(nextState.selectionStart, nextState.selectionEnd);
164
142
  setDateField(selectedState.selectedPattern, null, function (date) {
165
143
  return handleChange(date, event);
166
144
  });
167
- setSelectionRange();
168
145
  }
169
- }, [handleChange, selectedState, setDateField, setSelectionRange]);
170
- var handleKeyDown = function handleKeyDown(event) {
171
- var _key$match;
172
- var key = event.key;
173
- switch (key) {
174
- case 'ArrowRight':
175
- case 'ArrowLeft':
176
- handleChangeField(event);
177
- event.preventDefault();
178
- break;
179
- case 'ArrowUp':
180
- case 'ArrowDown':
181
- handleChangeFieldValue(event);
182
- event.preventDefault();
183
- break;
184
- case 'Backspace':
185
- handleRemoveFieldValue(event);
186
- event.preventDefault();
187
- break;
188
- case (_key$match = key.match(/\d/)) === null || _key$match === void 0 ? void 0 : _key$match.input:
189
- handleChangeFieldValueWithNumericKeys(event);
190
- event.preventDefault();
191
- break;
192
- }
193
- onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
194
- };
195
- var handleClick = useCallback(function (event) {
146
+ });
147
+ var handleClick = useEventCallback(function (event) {
196
148
  var input = event.target;
197
149
  var state = getInputSelectedState(_extends({}, keyPressOptions, {
198
150
  input: input
199
151
  }));
200
152
  setSelectedState(state);
201
153
  setSelectionRange(state.selectionStart, state.selectionEnd);
202
- }, [keyPressOptions, setSelectionRange]);
154
+ });
155
+ var onKeyboardInput = useKeyboardInputEvent({
156
+ onSegmentChange: onSegmentChange,
157
+ onSegmentValueChange: onSegmentValueChange,
158
+ onSegmentValueChangeWithNumericKeys: onSegmentValueChangeWithNumericKeys,
159
+ onSegmentValueRemove: onSegmentValueRemove,
160
+ onKeyDown: onKeyDown
161
+ });
162
+ var _useIsFocused = useIsFocused({
163
+ onBlur: onBlur,
164
+ onFocus: onFocus
165
+ }),
166
+ focused = _useIsFocused[0],
167
+ focusEventProps = _useIsFocused[1];
168
+ var renderedValue = useMemo(function () {
169
+ if (!isEmptyValue()) {
170
+ return dateString;
171
+ }
172
+ return !focused ? '' : dateString;
173
+ }, [dateString, focused, isEmptyValue]);
203
174
  return /*#__PURE__*/React.createElement(Input, _extends({
204
- inputMode: "text",
175
+ inputMode: focused ? 'numeric' : 'text',
205
176
  autoComplete: "off",
206
177
  autoCorrect: "off",
207
178
  spellCheck: false,
208
179
  ref: mergeRefs(inputRef, ref),
209
- onKeyDown: handleKeyDown,
180
+ onKeyDown: onKeyboardInput,
210
181
  onClick: handleClick,
211
- value: dateString
212
- }, rest));
182
+ value: renderedValue,
183
+ placeholder: placeholder || formatStr
184
+ }, focusEventProps, rest));
213
185
  });
214
186
  DateInput.displayName = 'DateInput';
187
+ DateInput.propTypes = {
188
+ defaultValue: PropTypes.instanceOf(Date),
189
+ format: PropTypes.string,
190
+ value: PropTypes.instanceOf(Date),
191
+ placeholder: PropTypes.string,
192
+ onChange: PropTypes.func,
193
+ onKeyDown: PropTypes.func,
194
+ onBlur: PropTypes.func,
195
+ onFocus: PropTypes.func
196
+ };
215
197
  export default DateInput;
@@ -1,3 +1,7 @@
1
1
  import DateInput from './DateInput';
2
+ export { useDateInputState } from './useDateInputState';
3
+ export { useKeyboardInputEvent } from './useKeyboardInputEvent';
4
+ export { useIsFocused } from './useIsFocused';
5
+ export * from './utils';
2
6
  export type { DateInputProps } from './DateInput';
3
7
  export default DateInput;
@@ -1,3 +1,7 @@
1
1
  'use client';
2
2
  import DateInput from './DateInput';
3
+ export { useDateInputState } from './useDateInputState';
4
+ export { useKeyboardInputEvent } from './useKeyboardInputEvent';
5
+ export { useIsFocused } from './useIsFocused';
6
+ export * from './utils';
3
7
  export default DateInput;
@@ -1,11 +1,13 @@
1
+ import { format } from '../utils/dateUtils';
1
2
  import type { Locale } from 'date-fns';
2
3
  interface DateInputState {
3
4
  formatStr: string;
4
- localize: Locale['localize'];
5
+ formatDate?: typeof format;
6
+ locale: Locale;
5
7
  date?: Date | null;
6
8
  isControlledDate?: boolean;
7
9
  }
8
- declare function useDateInputState({ formatStr, localize, date, isControlledDate }: DateInputState): {
10
+ export declare function useDateInputState({ formatStr, locale, date, isControlledDate }: DateInputState): {
9
11
  dateField: {
10
12
  year: any;
11
13
  format: string;
@@ -18,7 +20,6 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
18
20
  hour: number | null;
19
21
  minute: number | null;
20
22
  second: number | null;
21
- meridian: "AM" | "PM" | null;
22
23
  constructor: Function;
23
24
  toString(): string;
24
25
  toLocaleString(): string;
@@ -39,7 +40,6 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
39
40
  hour: number | null;
40
41
  minute: number | null;
41
42
  second: number | null;
42
- meridian: "AM" | "PM" | null;
43
43
  constructor: Function;
44
44
  toString(): string;
45
45
  toLocaleString(): string;
@@ -60,7 +60,6 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
60
60
  hour: number | null;
61
61
  minute: number | null;
62
62
  second: number | null;
63
- meridian: "AM" | "PM" | null;
64
63
  constructor: Function;
65
64
  toString(): string;
66
65
  toLocaleString(): string;
@@ -81,7 +80,6 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
81
80
  day: number | null;
82
81
  minute: number | null;
83
82
  second: number | null;
84
- meridian: "AM" | "PM" | null;
85
83
  constructor: Function;
86
84
  toString(): string;
87
85
  toLocaleString(): string;
@@ -102,7 +100,6 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
102
100
  day: number | null;
103
101
  hour: number | null;
104
102
  second: number | null;
105
- meridian: "AM" | "PM" | null;
106
103
  constructor: Function;
107
104
  toString(): string;
108
105
  toLocaleString(): string;
@@ -123,28 +120,6 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
123
120
  day: number | null;
124
121
  hour: number | null;
125
122
  minute: number | null;
126
- meridian: "AM" | "PM" | null;
127
- constructor: Function;
128
- toString(): string;
129
- toLocaleString(): string;
130
- valueOf(): Object;
131
- hasOwnProperty(v: PropertyKey): boolean;
132
- isPrototypeOf(v: Object): boolean;
133
- propertyIsEnumerable(v: PropertyKey): boolean;
134
- should: Chai.Assertion;
135
- } | {
136
- meridian: any;
137
- format: string;
138
- patternArray: {
139
- pattern: string;
140
- key: string;
141
- }[];
142
- year: number | null;
143
- month: number | null;
144
- day: number | null;
145
- hour: number | null;
146
- minute: number | null;
147
- second: number | null;
148
123
  constructor: Function;
149
124
  toString(): string;
150
125
  toLocaleString(): string;
@@ -154,12 +129,13 @@ declare function useDateInputState({ formatStr, localize, date, isControlledDate
154
129
  propertyIsEnumerable(v: PropertyKey): boolean;
155
130
  should: Chai.Assertion;
156
131
  };
157
- setDateOffset: (pattern: string, offset: number, callback?: ((newDate: Date) => void) | undefined) => void;
158
- setDateField: (pattern: string, value: number | null, callback?: ((newDate: Date) => void) | undefined) => void;
132
+ setDateOffset: (pattern: string, offset: number, callback?: ((newDate: Date | null) => void) | undefined) => void;
133
+ setDateField: (pattern: string, value: number | null, callback?: ((newDate: Date | null) => void) | undefined) => void;
159
134
  getDateField: (pattern: string) => {
160
135
  name: any;
161
136
  value: any;
162
137
  };
163
138
  toDateString: () => string;
139
+ isEmptyValue: (type?: string | undefined, value?: number | null | undefined) => boolean | undefined;
164
140
  };
165
141
  export default useDateInputState;