rsuite 5.60.1 → 5.60.2

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 (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/DatePicker/styles/index.css +1 -0
  3. package/DatePicker/styles/index.less +1 -0
  4. package/DateRangePicker/styles/index.css +2 -0
  5. package/DateRangePicker/styles/index.less +1 -0
  6. package/LICENSE +1 -1
  7. package/README.md +70 -89
  8. package/RangeSlider/styles/index.css +1 -1
  9. package/Slider/styles/index.css +1 -1
  10. package/Slider/styles/index.less +1 -1
  11. package/Toggle/styles/index.css +6 -1
  12. package/Toggle/styles/index.less +2 -1
  13. package/cjs/DateInput/DateField.js +3 -1
  14. package/cjs/DateInput/DateInput.js +17 -16
  15. package/cjs/DateInput/{useDateInputState.d.ts → hooks/useDateInputState.d.ts} +1 -1
  16. package/cjs/DateInput/{useDateInputState.js → hooks/useDateInputState.js} +2 -2
  17. package/cjs/DateInput/hooks/useFieldCursor.d.ts +6 -0
  18. package/cjs/DateInput/hooks/useFieldCursor.js +56 -0
  19. package/cjs/DateInput/hooks/useSelectedState.d.ts +14 -0
  20. package/cjs/DateInput/hooks/useSelectedState.js +23 -0
  21. package/cjs/DateInput/index.d.ts +5 -3
  22. package/cjs/DateInput/index.js +11 -5
  23. package/cjs/DateInput/utils.d.ts +0 -1
  24. package/cjs/DateInput/utils.js +2 -24
  25. package/cjs/DateRangeInput/DateRangeInput.js +16 -17
  26. package/dist/rsuite-no-reset-rtl.css +9 -2
  27. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  28. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  29. package/dist/rsuite-no-reset.css +9 -2
  30. package/dist/rsuite-no-reset.min.css +1 -1
  31. package/dist/rsuite-no-reset.min.css.map +1 -1
  32. package/dist/rsuite-rtl.css +9 -2
  33. package/dist/rsuite-rtl.min.css +1 -1
  34. package/dist/rsuite-rtl.min.css.map +1 -1
  35. package/dist/rsuite.css +9 -2
  36. package/dist/rsuite.js +46 -24
  37. package/dist/rsuite.js.map +1 -1
  38. package/dist/rsuite.min.css +1 -1
  39. package/dist/rsuite.min.css.map +1 -1
  40. package/dist/rsuite.min.js +1 -1
  41. package/dist/rsuite.min.js.map +1 -1
  42. package/esm/DateInput/DateField.js +3 -1
  43. package/esm/DateInput/DateInput.js +19 -18
  44. package/esm/DateInput/{useDateInputState.d.ts → hooks/useDateInputState.d.ts} +1 -1
  45. package/esm/DateInput/{useDateInputState.js → hooks/useDateInputState.js} +2 -2
  46. package/esm/DateInput/hooks/useFieldCursor.d.ts +6 -0
  47. package/esm/DateInput/hooks/useFieldCursor.js +49 -0
  48. package/esm/DateInput/hooks/useSelectedState.d.ts +14 -0
  49. package/esm/DateInput/hooks/useSelectedState.js +17 -0
  50. package/esm/DateInput/index.d.ts +5 -3
  51. package/esm/DateInput/index.js +5 -3
  52. package/esm/DateInput/utils.d.ts +0 -1
  53. package/esm/DateInput/utils.js +2 -23
  54. package/esm/DateRangeInput/DateRangeInput.js +17 -18
  55. package/package.json +2 -2
  56. /package/cjs/DateInput/{useIsFocused.d.ts → hooks/useIsFocused.d.ts} +0 -0
  57. /package/cjs/DateInput/{useIsFocused.js → hooks/useIsFocused.js} +0 -0
  58. /package/cjs/DateInput/{useKeyboardInputEvent.d.ts → hooks/useKeyboardInputEvent.d.ts} +0 -0
  59. /package/cjs/DateInput/{useKeyboardInputEvent.js → hooks/useKeyboardInputEvent.js} +0 -0
  60. /package/esm/DateInput/{useIsFocused.d.ts → hooks/useIsFocused.d.ts} +0 -0
  61. /package/esm/DateInput/{useIsFocused.js → hooks/useIsFocused.js} +0 -0
  62. /package/esm/DateInput/{useKeyboardInputEvent.d.ts → hooks/useKeyboardInputEvent.d.ts} +0 -0
  63. /package/esm/DateInput/{useKeyboardInputEvent.js → hooks/useKeyboardInputEvent.js} +0 -0
@@ -126,7 +126,9 @@ export var useDateField = function useDateField(format, localize, date) {
126
126
  if (typeof value === 'number') {
127
127
  value = padNumber(value, pattern.length);
128
128
  }
129
- str = str.replace(pattern, value);
129
+ if (typeof value !== 'undefined') {
130
+ str = str.replace(pattern, value);
131
+ }
130
132
  }
131
133
  });
132
134
  return str;
@@ -1,14 +1,16 @@
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, useRef, useMemo } from 'react';
4
+ import React, { useRef, useMemo } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import Input from '../Input';
7
7
  import { mergeRefs, useCustom, useControlled, useEventCallback } from '../utils';
8
- import { getInputSelectedState, validateDateTime, isFieldFullValue, useInputSelection } from './utils';
9
- import useDateInputState from './useDateInputState';
10
- import useKeyboardInputEvent from './useKeyboardInputEvent';
11
- import useIsFocused from './useIsFocused';
8
+ import { getInputSelectedState, validateDateTime, useInputSelection } from './utils';
9
+ import useDateInputState from './hooks/useDateInputState';
10
+ import useKeyboardInputEvent from './hooks/useKeyboardInputEvent';
11
+ import useIsFocused from './hooks/useIsFocused';
12
+ import useFieldCursor from './hooks/useFieldCursor';
13
+ import useSelectedState from './hooks/useSelectedState';
12
14
  /**
13
15
  * The DateInput component lets users select a date with the keyboard.
14
16
  * @version 5.58.0
@@ -26,13 +28,9 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
26
28
  onFocus = props.onFocus,
27
29
  rest = _objectWithoutPropertiesLoose(props, ["format", "value", "defaultValue", "placeholder", "onChange", "onKeyDown", "onBlur", "onFocus"]);
28
30
  var inputRef = useRef();
29
- var _useState = useState({
30
- selectedPattern: 'y',
31
- selectionStart: 0,
32
- selectionEnd: 0
33
- }),
34
- selectedState = _useState[0],
35
- setSelectedState = _useState[1];
31
+ var _useSelectedState = useSelectedState(),
32
+ selectedState = _useSelectedState.selectedState,
33
+ setSelectedState = _useSelectedState.setSelectedState;
36
34
  var _useCustom = useCustom('Calendar'),
37
35
  locale = _useCustom.locale;
38
36
  var dateLocale = locale.dateLocale;
@@ -52,6 +50,10 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
52
50
  getDateField = _useDateInputState.getDateField,
53
51
  toDateString = _useDateInputState.toDateString,
54
52
  isEmptyValue = _useDateInputState.isEmptyValue;
53
+ var _useFieldCursor = useFieldCursor(formatStr, valueProp),
54
+ isMoveCursor = _useFieldCursor.isMoveCursor,
55
+ increment = _useFieldCursor.increment,
56
+ reset = _useFieldCursor.reset;
55
57
  var dateString = toDateString();
56
58
  var keyPressOptions = useMemo(function () {
57
59
  return {
@@ -74,8 +76,9 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
74
76
  input: input,
75
77
  direction: direction
76
78
  }));
77
- setSelectionRange(state.selectionStart, state.selectionEnd);
78
79
  setSelectedState(state);
80
+ setSelectionRange(state.selectionStart, state.selectionEnd);
81
+ reset();
79
82
  });
80
83
  var onSegmentValueChange = useEventCallback(function (event) {
81
84
  var input = event.target;
@@ -98,6 +101,7 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
98
101
  if (!pattern) {
99
102
  return;
100
103
  }
104
+ increment();
101
105
  var field = getDateField(pattern);
102
106
  var value = parseInt(key, 10);
103
107
  var padValue = parseInt("" + (field.value || '') + key, 10);
@@ -107,10 +111,6 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
107
111
  if (validateDateTime(field.name, padValue)) {
108
112
  newValue = padValue;
109
113
  }
110
- if (pattern === 'M') {
111
- // Month cannot be less than 1.
112
- newValue = Math.max(1, newValue);
113
- }
114
114
  setDateField(pattern, newValue, function (date) {
115
115
  return handleChange(date, event);
116
116
  });
@@ -126,7 +126,7 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
126
126
  setSelectionRange(nextState.selectionStart, nextState.selectionEnd);
127
127
 
128
128
  // If the field is full value, move the cursor to the next field
129
- if (isFieldFullValue(formatStr, newValue, pattern) && input.selectionEnd !== input.value.length) {
129
+ if (isMoveCursor(newValue, pattern) && input.selectionEnd !== input.value.length) {
130
130
  onSegmentChange(event, 'right');
131
131
  }
132
132
  });
@@ -142,6 +142,7 @@ var DateInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
142
142
  setDateField(selectedState.selectedPattern, null, function (date) {
143
143
  return handleChange(date, event);
144
144
  });
145
+ reset();
145
146
  }
146
147
  });
147
148
  var handleClick = useEventCallback(function (event) {
@@ -1,4 +1,4 @@
1
- import { format } from '../utils/dateUtils';
1
+ import { format } from '../../utils/dateUtils';
2
2
  import type { Locale } from 'date-fns';
3
3
  interface DateInputState {
4
4
  formatStr: string;
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { useEffect } from 'react';
3
3
  import startCase from 'lodash/startCase';
4
- import { addDays, addMonths, addYears, addHours, addMinutes, addSeconds, format, isLastDayOfMonth, lastDayOfMonth, isValid } from '../utils/dateUtils';
5
- import { useDateField, patternMap } from './DateField';
4
+ import { addDays, addMonths, addYears, addHours, addMinutes, addSeconds, format, isLastDayOfMonth, lastDayOfMonth, isValid } from '../../utils/dateUtils';
5
+ import { useDateField, patternMap } from '../DateField';
6
6
  export function useDateInputState(_ref) {
7
7
  var formatStr = _ref.formatStr,
8
8
  locale = _ref.locale,
@@ -0,0 +1,6 @@
1
+ export declare function useFieldCursor<V = Date | null>(format: string, value?: V): {
2
+ increment: () => void;
3
+ reset: () => void;
4
+ isMoveCursor: (value: number, pattern: string) => boolean;
5
+ };
6
+ export default useFieldCursor;
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+ import { useCallback, useRef } from 'react';
3
+ import { getPatternGroups } from '../utils';
4
+ import useUpdateEffect from '../../utils/useUpdateEffect';
5
+ export function useFieldCursor(format, value) {
6
+ var typeCount = useRef(0);
7
+ var increment = function increment() {
8
+ typeCount.current += 1;
9
+ };
10
+ var reset = function reset() {
11
+ typeCount.current = 0;
12
+ };
13
+ var isMoveCursor = useCallback(function (value, pattern) {
14
+ var patternGroup = getPatternGroups(format, pattern);
15
+ if (value.toString().length === patternGroup.length) {
16
+ return true;
17
+ } else if (pattern === 'y' && typeCount.current === 4) {
18
+ return true;
19
+ } else if (pattern !== 'y' && typeCount.current === 2) {
20
+ return true;
21
+ }
22
+ switch (pattern) {
23
+ case 'M':
24
+ return parseInt(value + "0") > 12;
25
+ case 'd':
26
+ return parseInt(value + "0") > 31;
27
+ case 'H':
28
+ return parseInt(value + "0") > 23;
29
+ case 'h':
30
+ return parseInt(value + "0") > 12;
31
+ case 'm':
32
+ case 's':
33
+ return parseInt(value + "0") > 59;
34
+ default:
35
+ return false;
36
+ }
37
+ }, [format]);
38
+ useUpdateEffect(function () {
39
+ if (!value) {
40
+ reset();
41
+ }
42
+ }, [value]);
43
+ return {
44
+ increment: increment,
45
+ reset: reset,
46
+ isMoveCursor: isMoveCursor
47
+ };
48
+ }
49
+ export default useFieldCursor;
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ export declare function useSelectedState(): {
3
+ selectedState: {
4
+ selectedPattern: string;
5
+ selectionStart: number;
6
+ selectionEnd: number;
7
+ };
8
+ setSelectedState: import("react").Dispatch<import("react").SetStateAction<{
9
+ selectedPattern: string;
10
+ selectionStart: number;
11
+ selectionEnd: number;
12
+ }>>;
13
+ };
14
+ export default useSelectedState;
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { useState } from 'react';
3
+ var defaultSelectedState = {
4
+ selectedPattern: 'y',
5
+ selectionStart: 0,
6
+ selectionEnd: 0
7
+ };
8
+ export function useSelectedState() {
9
+ var _useState = useState(defaultSelectedState),
10
+ selectedState = _useState[0],
11
+ setSelectedState = _useState[1];
12
+ return {
13
+ selectedState: selectedState,
14
+ setSelectedState: setSelectedState
15
+ };
16
+ }
17
+ export default useSelectedState;
@@ -1,7 +1,9 @@
1
1
  import DateInput from './DateInput';
2
- export { useDateInputState } from './useDateInputState';
3
- export { useKeyboardInputEvent } from './useKeyboardInputEvent';
4
- export { useIsFocused } from './useIsFocused';
2
+ export { useDateInputState } from './hooks/useDateInputState';
3
+ export { useKeyboardInputEvent } from './hooks/useKeyboardInputEvent';
4
+ export { useIsFocused } from './hooks/useIsFocused';
5
+ export { useSelectedState } from './hooks/useSelectedState';
6
+ export { useFieldCursor } from './hooks/useFieldCursor';
5
7
  export * from './utils';
6
8
  export type { DateInputProps } from './DateInput';
7
9
  export default DateInput;
@@ -1,7 +1,9 @@
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';
3
+ export { useDateInputState } from './hooks/useDateInputState';
4
+ export { useKeyboardInputEvent } from './hooks/useKeyboardInputEvent';
5
+ export { useIsFocused } from './hooks/useIsFocused';
6
+ export { useSelectedState } from './hooks/useSelectedState';
7
+ export { useFieldCursor } from './hooks/useFieldCursor';
6
8
  export * from './utils';
7
9
  export default DateInput;
@@ -58,6 +58,5 @@ export declare function getInputSelectedState(options: SelectedStateOptions): {
58
58
  };
59
59
  export declare function validateDateTime(type: string, value: number): boolean;
60
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
61
  export declare function useInputSelection(input: React.RefObject<any>): (selectionStart: number, selectionEnd: number) => void;
63
62
  export {};
@@ -215,31 +215,10 @@ export function modifyDate(date, type, value) {
215
215
  }
216
216
  return date;
217
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 = typeof process !== 'undefined' && undefined === 'test';
240
218
  export function useInputSelection(input) {
241
219
  return function setSelectionRange(selectionStart, selectionEnd) {
242
- if (isTestEnvironment) {
220
+ var isTest = input.current.dataset.test === 'true';
221
+ if (isTest) {
243
222
  safeSetSelection(input.current, selectionStart, selectionEnd);
244
223
  return;
245
224
  }
@@ -5,7 +5,7 @@ import React, { useState, useRef, useMemo } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import Input from '../Input';
7
7
  import { mergeRefs, useClassNames, useCustom, useControlled, useEventCallback } from '../utils';
8
- import { validateDateTime, isFieldFullValue, useDateInputState, useInputSelection, useKeyboardInputEvent, useIsFocused } from '../DateInput';
8
+ import { validateDateTime, useDateInputState, useInputSelection, useKeyboardInputEvent, useIsFocused, useSelectedState, useFieldCursor } from '../DateInput';
9
9
  import { getInputSelectedState, DateType, getDateType, isSwitchDateType } from './utils';
10
10
  /**
11
11
  * The DateRangeInput component lets users select a date with the keyboard.
@@ -34,13 +34,9 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
34
34
  merge = _useClassNames.merge;
35
35
  var classes = merge(className, withClassPrefix());
36
36
  var inputRef = useRef();
37
- var _useState = useState({
38
- selectedPattern: 'y',
39
- selectionStart: 0,
40
- selectionEnd: 0
41
- }),
42
- selectedState = _useState[0],
43
- setSelectedState = _useState[1];
37
+ var _useSelectedState = useSelectedState(),
38
+ selectedState = _useSelectedState.selectedState,
39
+ setSelectedState = _useSelectedState.setSelectedState;
44
40
  var _useCustom = useCustom('Calendar'),
45
41
  locale = _useCustom.locale;
46
42
  var rangeFormatStr = "" + formatStr + character + formatStr;
@@ -49,9 +45,9 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
49
45
  value = _useControlled[0],
50
46
  setValue = _useControlled[1],
51
47
  isControlled = _useControlled[2];
52
- var _useState2 = useState(DateType.Start),
53
- dateType = _useState2[0],
54
- setDateType = _useState2[1];
48
+ var _useState = useState(DateType.Start),
49
+ dateType = _useState[0],
50
+ setDateType = _useState[1];
55
51
  var dateInputOptions = {
56
52
  formatStr: formatStr,
57
53
  locale: dateLocale,
@@ -63,6 +59,10 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
63
59
  var endDateState = useDateInputState(_extends({}, dateInputOptions, {
64
60
  date: (value === null || value === void 0 ? void 0 : value[1]) || null
65
61
  }));
62
+ var _useFieldCursor = useFieldCursor(formatStr, valueProp),
63
+ isMoveCursor = _useFieldCursor.isMoveCursor,
64
+ increment = _useFieldCursor.increment,
65
+ reset = _useFieldCursor.reset;
66
66
  var getActiveState = function getActiveState(type) {
67
67
  if (type === void 0) {
68
68
  type = dateType;
@@ -116,8 +116,9 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
116
116
  input: input,
117
117
  direction: direction
118
118
  }));
119
- setSelectionRange(state.selectionStart, state.selectionEnd);
120
119
  setSelectedState(state);
120
+ setSelectionRange(state.selectionStart, state.selectionEnd);
121
+ reset();
121
122
  });
122
123
  var onSegmentValueChange = useEventCallback(function (event) {
123
124
  var input = event.target;
@@ -140,6 +141,7 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
140
141
  if (!pattern) {
141
142
  return;
142
143
  }
144
+ increment();
143
145
  var field = getActiveState().getDateField(pattern);
144
146
  var value = parseInt(key, 10);
145
147
  var padValue = parseInt("" + (field.value || '') + key, 10);
@@ -149,10 +151,6 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
149
151
  if (validateDateTime(field.name, padValue)) {
150
152
  newValue = padValue;
151
153
  }
152
- if (pattern === 'M') {
153
- // Month cannot be less than 1.
154
- newValue = Math.max(1, newValue);
155
- }
156
154
  getActiveState().setDateField(pattern, newValue, function (date) {
157
155
  return handleChange(date, event);
158
156
  });
@@ -168,7 +166,7 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
168
166
  setSelectionRange(nextState.selectionStart, nextState.selectionEnd);
169
167
 
170
168
  // If the field is full value, move the cursor to the next field
171
- if (isFieldFullValue(formatStr, newValue, pattern) && input.selectionEnd !== input.value.length) {
169
+ if (isMoveCursor(newValue, pattern) && input.selectionEnd !== input.value.length) {
172
170
  onSegmentChange(event, 'right');
173
171
  }
174
172
  });
@@ -184,6 +182,7 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
184
182
  getActiveState().setDateField(selectedState.selectedPattern, null, function (date) {
185
183
  return handleChange(date, event);
186
184
  });
185
+ reset();
187
186
  }
188
187
  });
189
188
  var handleClick = useEventCallback(function (event) {
@@ -192,7 +191,7 @@ var DateRangeInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
192
191
  return;
193
192
  }
194
193
  var cursorIndex = input.selectionStart === renderedValue.length ? 0 : input.selectionStart;
195
- var dateType = getDateType(renderedValue, character, cursorIndex);
194
+ var dateType = getDateType(renderedValue || rangeFormatStr, character, cursorIndex);
196
195
  var state = getInputSelectedState(_extends({}, keyPressOptions, {
197
196
  dateType: dateType,
198
197
  selectedMonth: getActiveState(dateType).dateField.month,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rsuite",
3
- "version": "5.60.1",
3
+ "version": "5.60.2",
4
4
  "description": "A suite of react components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -17,7 +17,7 @@
17
17
  "component",
18
18
  "react-component"
19
19
  ],
20
- "author": "HYPERS Team",
20
+ "author": "React Suite Team",
21
21
  "license": "MIT",
22
22
  "repository": {
23
23
  "type": "git",