rsuite 5.48.1 → 5.49.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 (138) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/Cascader/styles/index.less +1 -0
  3. package/DatePicker/styles/index.less +18 -11
  4. package/DateRangeInput/package.json +7 -0
  5. package/DateRangePicker/styles/index.less +10 -0
  6. package/InputGroup/styles/index.less +1 -0
  7. package/Picker/styles/index.less +20 -0
  8. package/README.md +32 -22
  9. package/Sidenav/styles/index.less +2 -0
  10. package/cjs/Calendar/CalendarContainer.d.ts +2 -0
  11. package/cjs/Calendar/CalendarContainer.js +11 -4
  12. package/cjs/Calendar/CalendarHeader.js +2 -0
  13. package/cjs/Calendar/MonthDropdown.js +7 -2
  14. package/cjs/Calendar/MonthDropdownItem.js +2 -2
  15. package/cjs/Calendar/Table.js +6 -1
  16. package/cjs/Calendar/TimeDropdown.js +17 -10
  17. package/cjs/Calendar/types.d.ts +1 -0
  18. package/cjs/CustomProvider/CustomProvider.d.ts +13 -0
  19. package/cjs/CustomProvider/CustomProvider.js +2 -2
  20. package/cjs/DateInput/DateField.d.ts +9 -31
  21. package/cjs/DateInput/DateField.js +61 -12
  22. package/cjs/DateInput/DateInput.d.ts +7 -2
  23. package/cjs/DateInput/DateInput.js +74 -92
  24. package/cjs/DateInput/index.d.ts +4 -0
  25. package/cjs/DateInput/index.js +19 -1
  26. package/cjs/DateInput/useDateInputState.d.ts +7 -31
  27. package/cjs/DateInput/useDateInputState.js +39 -15
  28. package/cjs/DateInput/useIsFocused.d.ts +7 -0
  29. package/cjs/DateInput/useIsFocused.js +28 -0
  30. package/cjs/DateInput/useKeyboardInputEvent.d.ts +10 -0
  31. package/cjs/DateInput/useKeyboardInputEvent.js +44 -0
  32. package/cjs/DateInput/utils.d.ts +23 -1
  33. package/cjs/DateInput/utils.js +155 -51
  34. package/cjs/DatePicker/DatePicker.d.ts +20 -7
  35. package/cjs/DatePicker/DatePicker.js +210 -241
  36. package/cjs/DatePicker/PickerIndicator.d.ts +10 -0
  37. package/cjs/DatePicker/PickerIndicator.js +48 -0
  38. package/cjs/DatePicker/PickerLabel.d.ts +9 -0
  39. package/cjs/DatePicker/PickerLabel.js +23 -0
  40. package/cjs/DatePicker/Toolbar.js +3 -21
  41. package/cjs/DatePicker/utils.d.ts +5 -1
  42. package/cjs/DatePicker/utils.js +17 -1
  43. package/cjs/DateRangeInput/DateRangeInput.d.ts +29 -0
  44. package/cjs/DateRangeInput/DateRangeInput.js +244 -0
  45. package/cjs/DateRangeInput/index.d.ts +3 -0
  46. package/cjs/DateRangeInput/index.js +9 -0
  47. package/cjs/DateRangeInput/utils.d.ts +61 -0
  48. package/cjs/DateRangeInput/utils.js +146 -0
  49. package/cjs/DateRangePicker/DateRangePicker.js +12 -2
  50. package/cjs/Input/Input.d.ts +11 -0
  51. package/cjs/Input/Input.js +11 -8
  52. package/cjs/Overlay/OverlayTrigger.d.ts +3 -0
  53. package/cjs/Overlay/OverlayTrigger.js +5 -0
  54. package/cjs/Picker/usePickerRef.d.ts +17 -0
  55. package/cjs/Picker/usePickerRef.js +82 -0
  56. package/cjs/index.d.ts +2 -0
  57. package/cjs/index.js +3 -1
  58. package/cjs/locales/index.d.ts +2 -2
  59. package/cjs/utils/index.d.ts +2 -0
  60. package/cjs/utils/index.js +8 -2
  61. package/cjs/utils/useCustom.js +1 -1
  62. package/cjs/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  63. package/cjs/utils/useIsomorphicLayoutEffect.js +9 -0
  64. package/dist/rsuite-no-reset-rtl.css +51 -141
  65. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  66. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  67. package/dist/rsuite-no-reset.css +51 -141
  68. package/dist/rsuite-no-reset.min.css +1 -1
  69. package/dist/rsuite-no-reset.min.css.map +1 -1
  70. package/dist/rsuite-rtl.css +51 -9
  71. package/dist/rsuite-rtl.min.css +1 -1
  72. package/dist/rsuite-rtl.min.css.map +1 -1
  73. package/dist/rsuite.css +51 -9
  74. package/dist/rsuite.js +4800 -246
  75. package/dist/rsuite.js.map +1 -1
  76. package/dist/rsuite.min.css +1 -1
  77. package/dist/rsuite.min.css.map +1 -1
  78. package/dist/rsuite.min.js +1 -1
  79. package/dist/rsuite.min.js.map +1 -1
  80. package/esm/Calendar/CalendarContainer.d.ts +2 -0
  81. package/esm/Calendar/CalendarContainer.js +12 -5
  82. package/esm/Calendar/CalendarHeader.js +2 -0
  83. package/esm/Calendar/MonthDropdown.js +7 -2
  84. package/esm/Calendar/MonthDropdownItem.js +2 -2
  85. package/esm/Calendar/Table.js +6 -1
  86. package/esm/Calendar/TimeDropdown.js +17 -10
  87. package/esm/Calendar/types.d.ts +1 -0
  88. package/esm/CustomProvider/CustomProvider.d.ts +13 -0
  89. package/esm/CustomProvider/CustomProvider.js +3 -3
  90. package/esm/DateInput/DateField.d.ts +9 -31
  91. package/esm/DateInput/DateField.js +61 -12
  92. package/esm/DateInput/DateInput.d.ts +7 -2
  93. package/esm/DateInput/DateInput.js +77 -95
  94. package/esm/DateInput/index.d.ts +4 -0
  95. package/esm/DateInput/index.js +4 -0
  96. package/esm/DateInput/useDateInputState.d.ts +7 -31
  97. package/esm/DateInput/useDateInputState.js +41 -18
  98. package/esm/DateInput/useIsFocused.d.ts +7 -0
  99. package/esm/DateInput/useIsFocused.js +22 -0
  100. package/esm/DateInput/useKeyboardInputEvent.d.ts +10 -0
  101. package/esm/DateInput/useKeyboardInputEvent.js +38 -0
  102. package/esm/DateInput/utils.d.ts +23 -1
  103. package/esm/DateInput/utils.js +150 -51
  104. package/esm/DatePicker/DatePicker.d.ts +20 -7
  105. package/esm/DatePicker/DatePicker.js +213 -244
  106. package/esm/DatePicker/PickerIndicator.d.ts +10 -0
  107. package/esm/DatePicker/PickerIndicator.js +42 -0
  108. package/esm/DatePicker/PickerLabel.d.ts +9 -0
  109. package/esm/DatePicker/PickerLabel.js +17 -0
  110. package/esm/DatePicker/Toolbar.js +3 -21
  111. package/esm/DatePicker/utils.d.ts +5 -1
  112. package/esm/DatePicker/utils.js +16 -1
  113. package/esm/DateRangeInput/DateRangeInput.d.ts +29 -0
  114. package/esm/DateRangeInput/DateRangeInput.js +237 -0
  115. package/esm/DateRangeInput/index.d.ts +3 -0
  116. package/esm/DateRangeInput/index.js +3 -0
  117. package/esm/DateRangeInput/utils.d.ts +61 -0
  118. package/esm/DateRangeInput/utils.js +137 -0
  119. package/esm/DateRangePicker/DateRangePicker.js +12 -2
  120. package/esm/Input/Input.d.ts +11 -0
  121. package/esm/Input/Input.js +12 -9
  122. package/esm/Overlay/OverlayTrigger.d.ts +3 -0
  123. package/esm/Overlay/OverlayTrigger.js +5 -0
  124. package/esm/Picker/usePickerRef.d.ts +17 -0
  125. package/esm/Picker/usePickerRef.js +77 -0
  126. package/esm/index.d.ts +2 -0
  127. package/esm/index.js +1 -0
  128. package/esm/locales/index.d.ts +2 -2
  129. package/esm/utils/index.d.ts +2 -0
  130. package/esm/utils/index.js +3 -1
  131. package/esm/utils/useCustom.js +2 -2
  132. package/esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  133. package/esm/utils/useIsomorphicLayoutEffect.js +4 -0
  134. package/package.json +1 -1
  135. package/styles/color-modes/dark.less +1 -0
  136. package/styles/color-modes/high-contrast.less +1 -0
  137. package/styles/color-modes/light.less +1 -0
  138. package/styles/normalize.less +230 -231
@@ -8,6 +8,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
8
8
  var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
9
9
  var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
10
10
  var _react = require("react");
11
+ var _isValid = _interopRequireDefault(require("date-fns/isValid"));
11
12
  var _utils = require("./utils");
12
13
  var patternMap = {
13
14
  y: 'year',
@@ -33,7 +34,6 @@ var DateField = /*#__PURE__*/function (_Object) {
33
34
  _this.hour = null;
34
35
  _this.minute = null;
35
36
  _this.second = null;
36
- _this.meridian = null;
37
37
  _this.format = format;
38
38
  var formatArray = format.match(new RegExp('([y|d|M|H|h|m|s|a])+', 'ig')) || [];
39
39
  _this.patternArray = formatArray.map(function (pattern) {
@@ -42,14 +42,13 @@ var DateField = /*#__PURE__*/function (_Object) {
42
42
  key: patternMap[pattern[0]]
43
43
  };
44
44
  });
45
- if (value) {
45
+ if (value && (0, _isValid.default)(value)) {
46
46
  _this.year = value.getFullYear();
47
47
  _this.month = value.getMonth() + 1;
48
48
  _this.day = value.getDate();
49
49
  _this.hour = value.getHours();
50
50
  _this.minute = value.getMinutes();
51
51
  _this.second = value.getSeconds();
52
- _this.meridian = value.getHours() > 12 ? 'PM' : 'AM';
53
52
  }
54
53
  return _this;
55
54
  }
@@ -97,10 +96,8 @@ var useDateField = function useDateField(format, localize, date) {
97
96
  return (0, _extends2.default)({}, state, {
98
97
  second: action.value
99
98
  });
100
- case 'setMeridian':
101
- return (0, _extends2.default)({}, state, {
102
- meridian: action.value
103
- });
99
+ case 'setNewDate':
100
+ return new DateField(format, action.value);
104
101
  default:
105
102
  return state;
106
103
  }
@@ -112,6 +109,7 @@ var useDateField = function useDateField(format, localize, date) {
112
109
  dateField.patternArray.forEach(function (item) {
113
110
  var key = item.key,
114
111
  pattern = item.pattern;
112
+ var hour = dateField.hour;
115
113
  var value = dateField[key];
116
114
  if (value !== null) {
117
115
  if (pattern === 'MMM' && typeof value === 'number') {
@@ -122,8 +120,12 @@ var useDateField = function useDateField(format, localize, date) {
122
120
  value = localize === null || localize === void 0 ? void 0 : localize.month(value - 1, {
123
121
  width: 'wide'
124
122
  });
125
- } else if (pattern === 'aa' && typeof value === 'number') {
126
- value = value === 0 ? 'AM' : 'PM';
123
+ } else if (pattern === 'aa') {
124
+ if (typeof hour === 'number') {
125
+ value = hour > 12 ? 'PM' : 'AM';
126
+ } else {
127
+ value = 'aa';
128
+ }
127
129
  } else if (pattern === 'hh' && typeof value === 'number') {
128
130
  value = value === 0 ? 12 : value > 12 ? value - 12 : value;
129
131
  }
@@ -135,17 +137,64 @@ var useDateField = function useDateField(format, localize, date) {
135
137
  });
136
138
  return str;
137
139
  };
140
+
141
+ // Check if the field value is valid.
142
+ var validFieldValue = function validFieldValue(type, value) {
143
+ var _format$match;
144
+ var isValid = true;
145
+ (_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) {
146
+ var key = patternMap[pattern[0]];
147
+ var fieldValue = type === key ? value : dateField[key];
148
+ if (fieldValue === null) {
149
+ isValid = false;
150
+ return;
151
+ }
152
+ });
153
+ return isValid;
154
+ };
155
+ var isEmptyValue = function isEmptyValue(type, value) {
156
+ var _format$match2;
157
+ 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) {
158
+ var key = patternMap[pattern[0]];
159
+ var fieldValue = type === key ? value : dateField[key];
160
+ return fieldValue !== null;
161
+ });
162
+ return checkValueArray === null || checkValueArray === void 0 ? void 0 : checkValueArray.every(function (item) {
163
+ return item === false;
164
+ });
165
+ };
138
166
  var toDate = function toDate(type, value) {
139
- if (value === null) {
167
+ var year = dateField.year,
168
+ month = dateField.month,
169
+ day = dateField.day,
170
+ hour = dateField.hour,
171
+ minute = dateField.minute,
172
+ second = dateField.second;
173
+ var date = new Date(year || 0, typeof month === 'number' ? month - 1 : 0,
174
+ // The default day is 1 when the value is null, otherwise it becomes the last day of the month.
175
+ day || 1, hour || 0, minute || 0, second || 0);
176
+ if (typeof type === 'undefined' || typeof value === 'undefined') {
177
+ return date;
178
+ }
179
+ if (value === null || !validFieldValue(type, value)) {
180
+ if (isEmptyValue(type, value)) {
181
+ return null;
182
+ }
140
183
  return new Date('');
141
184
  }
142
- return (0, _utils.modifyDate)(new Date(dateField.year, dateField.month ? dateField.month - 1 : 0, dateField.day, dateField.hour, dateField.minute, dateField.second), type, value);
185
+ if (type === 'meridian' && typeof hour === 'number') {
186
+ var newHour = hour > 12 ? hour - 12 : hour + 12;
187
+ type = 'hour';
188
+ value = newHour;
189
+ }
190
+ return (0, _utils.modifyDate)(date, type, value);
143
191
  };
144
192
  return {
145
193
  dateField: dateField,
146
194
  dispatch: dispatch,
147
195
  toDate: toDate,
148
- toDateString: toDateString
196
+ toDateString: toDateString,
197
+ isEmptyValue: isEmptyValue
149
198
  };
150
199
  };
151
200
  exports.useDateField = useDateField;
@@ -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.
@@ -8,11 +8,13 @@ exports.default = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
12
  var _Input = _interopRequireDefault(require("../Input"));
12
13
  var _utils = require("../utils");
13
14
  var _utils2 = require("./utils");
14
15
  var _useDateInputState2 = _interopRequireDefault(require("./useDateInputState"));
15
- var isTestEnvironment = undefined === 'test';
16
+ var _useKeyboardInputEvent = _interopRequireDefault(require("./useKeyboardInputEvent"));
17
+ var _useIsFocused2 = _interopRequireDefault(require("./useIsFocused"));
16
18
  /**
17
19
  * The DateInput component lets users select a date with the keyboard.
18
20
  * @version 5.58.0
@@ -23,9 +25,12 @@ var DateInput = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
23
25
  formatStr = _props$format === void 0 ? 'yyyy-MM-dd' : _props$format,
24
26
  valueProp = props.value,
25
27
  defaultValue = props.defaultValue,
28
+ placeholder = props.placeholder,
26
29
  onChange = props.onChange,
27
30
  onKeyDown = props.onKeyDown,
28
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["format", "value", "defaultValue", "onChange", "onKeyDown"]);
31
+ onBlur = props.onBlur,
32
+ onFocus = props.onFocus,
33
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["format", "value", "defaultValue", "placeholder", "onChange", "onKeyDown", "onBlur", "onFocus"]);
29
34
  var inputRef = (0, _react.useRef)();
30
35
  var _useState = (0, _react.useState)({
31
36
  selectedPattern: 'y',
@@ -36,14 +41,14 @@ var DateInput = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
36
41
  setSelectedState = _useState[1];
37
42
  var _useCustom = (0, _utils.useCustom)('Calendar'),
38
43
  locale = _useCustom.locale;
39
- var localize = locale.dateLocale.localize;
44
+ var dateLocale = locale.dateLocale;
40
45
  var _useControlled = (0, _utils.useControlled)(valueProp, defaultValue),
41
46
  value = _useControlled[0],
42
47
  setValue = _useControlled[1],
43
48
  isControlled = _useControlled[2];
44
49
  var _useDateInputState = (0, _useDateInputState2.default)({
45
50
  formatStr: formatStr,
46
- localize: localize,
51
+ locale: dateLocale,
47
52
  date: value,
48
53
  isControlledDate: isControlled
49
54
  }),
@@ -51,49 +56,36 @@ var DateInput = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
51
56
  setDateOffset = _useDateInputState.setDateOffset,
52
57
  setDateField = _useDateInputState.setDateField,
53
58
  getDateField = _useDateInputState.getDateField,
54
- toDateString = _useDateInputState.toDateString;
59
+ toDateString = _useDateInputState.toDateString,
60
+ isEmptyValue = _useDateInputState.isEmptyValue;
55
61
  var dateString = toDateString();
56
62
  var keyPressOptions = (0, _react.useMemo)(function () {
57
63
  return {
58
64
  formatStr: formatStr,
59
- localize: localize,
65
+ localize: dateLocale.localize,
60
66
  selectedMonth: dateField.month,
61
67
  dateString: dateString
62
68
  };
63
- }, [dateField, dateString, formatStr, localize]);
64
- var setSelectionRange = (0, _react.useCallback)(function (selectionStart, selectionEnd) {
65
- if (selectionStart === void 0) {
66
- selectionStart = selectedState.selectionStart;
67
- }
68
- if (selectionEnd === void 0) {
69
- selectionEnd = selectedState.selectionEnd;
70
- }
71
- var input = inputRef === null || inputRef === void 0 ? void 0 : inputRef.current;
72
- if (isTestEnvironment) {
73
- (0, _utils.safeSetSelection)(input, selectionStart, selectionEnd);
74
- return;
75
- }
76
- requestAnimationFrame(function () {
77
- (0, _utils.safeSetSelection)(input, selectionStart, selectionEnd);
78
- });
79
- }, [selectedState]);
80
- var handleChange = (0, _react.useCallback)(function (value, event) {
81
- setValue(value);
69
+ }, [dateField, dateString, formatStr, dateLocale]);
70
+ var handleChange = (0, _utils.useEventCallback)(function (value, event) {
82
71
  onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
83
- }, [onChange, setValue]);
84
- var handleChangeField = (0, _react.useCallback)(function (event, nextDirection) {
72
+ setValue(value);
73
+ });
74
+ var setSelectionRange = (0, _utils2.useInputSelection)(inputRef);
75
+ var onSegmentChange = (0, _utils.useEventCallback)(function (event, nextDirection) {
85
76
  var input = event.target;
86
- var direction = nextDirection || (event.key === 'ArrowRight' ? 'right' : 'left');
77
+ var key = event.key;
78
+ var direction = nextDirection || (key === 'ArrowRight' ? 'right' : 'left');
87
79
  var state = (0, _utils2.getInputSelectedState)((0, _extends2.default)({}, keyPressOptions, {
88
80
  input: input,
89
81
  direction: direction
90
82
  }));
91
83
  setSelectionRange(state.selectionStart, state.selectionEnd);
92
84
  setSelectedState(state);
93
- }, [keyPressOptions, setSelectionRange]);
94
- var handleChangeFieldValue = (0, _react.useCallback)(function (event) {
95
- var key = event.key;
85
+ });
86
+ var onSegmentValueChange = (0, _utils.useEventCallback)(function (event) {
96
87
  var input = event.target;
88
+ var key = event.key;
97
89
  var offset = key === 'ArrowUp' ? 1 : -1;
98
90
  var state = (0, _utils2.getInputSelectedState)((0, _extends2.default)({}, keyPressOptions, {
99
91
  input: input,
@@ -104,31 +96,10 @@ var DateInput = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
104
96
  return handleChange(date, event);
105
97
  });
106
98
  setSelectionRange(state.selectionStart, state.selectionEnd);
107
- }, [handleChange, keyPressOptions, setDateOffset, setSelectionRange]);
108
- var isFieldFullValue = (0, _react.useCallback)(function (value, pattern) {
109
- var patternGroup = (0, _utils2.getPatternGroups)(formatStr, pattern);
110
- if (value.toString().length === patternGroup.length) {
111
- return true;
112
- }
113
- switch (pattern) {
114
- case 'M':
115
- return parseInt(value + "0") > 12;
116
- case 'd':
117
- return parseInt(value + "0") > 31;
118
- case 'H':
119
- return parseInt(value + "0") > 23;
120
- case 'h':
121
- return parseInt(value + "0") > 12;
122
- case 'm':
123
- case 's':
124
- return parseInt(value + "0") > 59;
125
- default:
126
- return false;
127
- }
128
- }, [formatStr]);
129
- var handleChangeFieldValueWithNumericKeys = (0, _react.useCallback)(function (event) {
130
- var key = event.key;
99
+ });
100
+ var onSegmentValueChangeWithNumericKeys = (0, _utils.useEventCallback)(function (event) {
131
101
  var input = event.target;
102
+ var key = event.key;
132
103
  var pattern = selectedState.selectedPattern;
133
104
  if (!pattern) {
134
105
  return;
@@ -161,62 +132,73 @@ var DateInput = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
161
132
  setSelectionRange(nextState.selectionStart, nextState.selectionEnd);
162
133
 
163
134
  // If the field is full value, move the cursor to the next field
164
- if (isFieldFullValue(newValue, pattern) && input.selectionEnd !== input.value.length) {
165
- handleChangeField(event, 'right');
135
+ if ((0, _utils2.isFieldFullValue)(formatStr, newValue, pattern) && input.selectionEnd !== input.value.length) {
136
+ onSegmentChange(event, 'right');
166
137
  }
167
- }, [dateField, getDateField, handleChange, handleChangeField, isFieldFullValue, keyPressOptions, selectedState.selectedPattern, setDateField, setSelectionRange]);
168
- var handleRemoveFieldValue = (0, _react.useCallback)(function (event) {
138
+ });
139
+ var onSegmentValueRemove = (0, _utils.useEventCallback)(function (event) {
140
+ var input = event.target;
169
141
  if (selectedState.selectedPattern) {
142
+ var nextState = (0, _utils2.getInputSelectedState)((0, _extends2.default)({}, keyPressOptions, {
143
+ input: input,
144
+ valueOffset: null
145
+ }));
146
+ setSelectedState(nextState);
147
+ setSelectionRange(nextState.selectionStart, nextState.selectionEnd);
170
148
  setDateField(selectedState.selectedPattern, null, function (date) {
171
149
  return handleChange(date, event);
172
150
  });
173
- setSelectionRange();
174
151
  }
175
- }, [handleChange, selectedState, setDateField, setSelectionRange]);
176
- var handleKeyDown = function handleKeyDown(event) {
177
- var _key$match;
178
- var key = event.key;
179
- switch (key) {
180
- case 'ArrowRight':
181
- case 'ArrowLeft':
182
- handleChangeField(event);
183
- event.preventDefault();
184
- break;
185
- case 'ArrowUp':
186
- case 'ArrowDown':
187
- handleChangeFieldValue(event);
188
- event.preventDefault();
189
- break;
190
- case 'Backspace':
191
- handleRemoveFieldValue(event);
192
- event.preventDefault();
193
- break;
194
- case (_key$match = key.match(/\d/)) === null || _key$match === void 0 ? void 0 : _key$match.input:
195
- handleChangeFieldValueWithNumericKeys(event);
196
- event.preventDefault();
197
- break;
198
- }
199
- onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
200
- };
201
- var handleClick = (0, _react.useCallback)(function (event) {
152
+ });
153
+ var handleClick = (0, _utils.useEventCallback)(function (event) {
202
154
  var input = event.target;
203
155
  var state = (0, _utils2.getInputSelectedState)((0, _extends2.default)({}, keyPressOptions, {
204
156
  input: input
205
157
  }));
206
158
  setSelectedState(state);
207
159
  setSelectionRange(state.selectionStart, state.selectionEnd);
208
- }, [keyPressOptions, setSelectionRange]);
160
+ });
161
+ var onKeyboardInput = (0, _useKeyboardInputEvent.default)({
162
+ onSegmentChange: onSegmentChange,
163
+ onSegmentValueChange: onSegmentValueChange,
164
+ onSegmentValueChangeWithNumericKeys: onSegmentValueChangeWithNumericKeys,
165
+ onSegmentValueRemove: onSegmentValueRemove,
166
+ onKeyDown: onKeyDown
167
+ });
168
+ var _useIsFocused = (0, _useIsFocused2.default)({
169
+ onBlur: onBlur,
170
+ onFocus: onFocus
171
+ }),
172
+ focused = _useIsFocused[0],
173
+ focusEventProps = _useIsFocused[1];
174
+ var renderedValue = (0, _react.useMemo)(function () {
175
+ if (!isEmptyValue()) {
176
+ return dateString;
177
+ }
178
+ return !focused ? '' : dateString;
179
+ }, [dateString, focused, isEmptyValue]);
209
180
  return /*#__PURE__*/_react.default.createElement(_Input.default, (0, _extends2.default)({
210
- inputMode: "text",
181
+ inputMode: focused ? 'numeric' : 'text',
211
182
  autoComplete: "off",
212
183
  autoCorrect: "off",
213
184
  spellCheck: false,
214
185
  ref: (0, _utils.mergeRefs)(inputRef, ref),
215
- onKeyDown: handleKeyDown,
186
+ onKeyDown: onKeyboardInput,
216
187
  onClick: handleClick,
217
- value: dateString
218
- }, rest));
188
+ value: renderedValue,
189
+ placeholder: placeholder || formatStr
190
+ }, focusEventProps, rest));
219
191
  });
220
192
  DateInput.displayName = 'DateInput';
193
+ DateInput.propTypes = {
194
+ defaultValue: _propTypes.default.instanceOf(Date),
195
+ format: _propTypes.default.string,
196
+ value: _propTypes.default.instanceOf(Date),
197
+ placeholder: _propTypes.default.string,
198
+ onChange: _propTypes.default.func,
199
+ onKeyDown: _propTypes.default.func,
200
+ onBlur: _propTypes.default.func,
201
+ onFocus: _propTypes.default.func
202
+ };
221
203
  var _default = DateInput;
222
204
  exports.default = _default;
@@ -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;
@@ -3,7 +3,25 @@
3
3
 
4
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
5
  exports.__esModule = true;
6
- exports.default = void 0;
6
+ var _exportNames = {
7
+ useDateInputState: true,
8
+ useKeyboardInputEvent: true,
9
+ useIsFocused: true
10
+ };
11
+ exports.default = exports.useIsFocused = exports.useKeyboardInputEvent = exports.useDateInputState = void 0;
7
12
  var _DateInput = _interopRequireDefault(require("./DateInput"));
13
+ var _useDateInputState = require("./useDateInputState");
14
+ exports.useDateInputState = _useDateInputState.useDateInputState;
15
+ var _useKeyboardInputEvent = require("./useKeyboardInputEvent");
16
+ exports.useKeyboardInputEvent = _useKeyboardInputEvent.useKeyboardInputEvent;
17
+ var _useIsFocused = require("./useIsFocused");
18
+ exports.useIsFocused = _useIsFocused.useIsFocused;
19
+ var _utils = require("./utils");
20
+ Object.keys(_utils).forEach(function (key) {
21
+ if (key === "default" || key === "__esModule") return;
22
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
23
+ if (key in exports && exports[key] === _utils[key]) return;
24
+ exports[key] = _utils[key];
25
+ });
8
26
  var _default = _DateInput.default;
9
27
  exports.default = _default;
@@ -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;
@@ -3,6 +3,7 @@
3
3
 
4
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
5
  exports.__esModule = true;
6
+ exports.useDateInputState = useDateInputState;
6
7
  exports.default = void 0;
7
8
  var _react = require("react");
8
9
  var _startCase = _interopRequireDefault(require("lodash/startCase"));
@@ -10,15 +11,16 @@ var _dateUtils = require("../utils/dateUtils");
10
11
  var _DateField = require("./DateField");
11
12
  function useDateInputState(_ref) {
12
13
  var formatStr = _ref.formatStr,
13
- localize = _ref.localize,
14
+ locale = _ref.locale,
14
15
  date = _ref.date,
15
16
  isControlledDate = _ref.isControlledDate;
16
- var _useDateField = (0, _DateField.useDateField)(formatStr, localize, date),
17
+ var _useDateField = (0, _DateField.useDateField)(formatStr, locale.localize, date),
17
18
  dateField = _useDateField.dateField,
18
19
  dispatch = _useDateField.dispatch,
19
20
  toDateString = _useDateField.toDateString,
20
- toDate = _useDateField.toDate;
21
- var setDateOffset = (0, _react.useCallback)(function (pattern, offset, callback) {
21
+ toDate = _useDateField.toDate,
22
+ isEmptyValue = _useDateField.isEmptyValue;
23
+ var setDateOffset = function setDateOffset(pattern, offset, callback) {
22
24
  var currentDate = new Date();
23
25
  var year = dateField.year || currentDate.getFullYear();
24
26
  var month = dateField.month ? dateField.month - 1 : currentDate.getMonth();
@@ -61,8 +63,8 @@ function useDateInputState(_ref) {
61
63
  value = (0, _dateUtils.addSeconds)(new Date(year, month, day, hour, minute, second), offset).getSeconds();
62
64
  break;
63
65
  case 'a':
64
- actionName = 'setMeridian';
65
- value = dateField.meridian === 'AM' ? 'PM' : 'AM';
66
+ actionName = 'setHour';
67
+ value = hour >= 12 ? hour - 12 : hour + 12;
66
68
  break;
67
69
  }
68
70
  if (actionName && value) {
@@ -73,8 +75,8 @@ function useDateInputState(_ref) {
73
75
  var field = _DateField.patternMap[pattern];
74
76
  callback === null || callback === void 0 ? void 0 : callback(toDate(field, value));
75
77
  }
76
- }, [dateField, toDate, dispatch]);
77
- var setDateField = (0, _react.useCallback)(function (pattern, value, callback) {
78
+ };
79
+ var setDateField = function setDateField(pattern, value, callback) {
78
80
  var field = _DateField.patternMap[pattern];
79
81
  var actionName = "set" + (0, _startCase.default)(field);
80
82
  dispatch({
@@ -82,23 +84,45 @@ function useDateInputState(_ref) {
82
84
  value: value
83
85
  });
84
86
  callback === null || callback === void 0 ? void 0 : callback(toDate(field, value));
85
- }, [toDate, dispatch]);
86
- var getDateField = (0, _react.useCallback)(function (pattern) {
87
+ };
88
+ var getDateField = function getDateField(pattern) {
87
89
  var fieldName = _DateField.patternMap[pattern];
88
90
  return {
89
91
  name: fieldName,
90
92
  value: dateField[fieldName]
91
93
  };
92
- }, [dateField]);
93
- var toControlledDateString = (0, _react.useCallback)(function () {
94
- return (0, _dateUtils.format)(date || new Date(), formatStr);
95
- }, [date, formatStr]);
94
+ };
95
+ var toControlledDateString = function toControlledDateString() {
96
+ if (date && (0, _dateUtils.isValid)(date)) {
97
+ return (0, _dateUtils.format)(date, formatStr, {
98
+ locale: locale
99
+ });
100
+ }
101
+ // if date is not valid, return uncontrolled date string
102
+ return toDateString();
103
+ };
104
+ (0, _react.useEffect)(function () {
105
+ if (isControlledDate) {
106
+ if (date && (0, _dateUtils.isValid)(date)) {
107
+ dispatch({
108
+ type: 'setNewDate',
109
+ value: date
110
+ });
111
+ } else if (date === null) {
112
+ dispatch({
113
+ type: 'setNewDate',
114
+ value: null
115
+ });
116
+ }
117
+ }
118
+ }, [date, dispatch, isControlledDate]);
96
119
  return {
97
120
  dateField: dateField,
98
121
  setDateOffset: setDateOffset,
99
122
  setDateField: setDateField,
100
123
  getDateField: getDateField,
101
- toDateString: isControlledDate ? toControlledDateString : toDateString
124
+ toDateString: isControlledDate ? toControlledDateString : toDateString,
125
+ isEmptyValue: isEmptyValue
102
126
  };
103
127
  }
104
128
  var _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;