rsuite 5.16.3 → 5.16.4

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [5.16.4](https://github.com/rsuite/rsuite/compare/v5.16.3...v5.16.4) (2022-08-04)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **DatePicker:** fix issues with focus event ([#2636](https://github.com/rsuite/rsuite/issues/2636)) ([76b68aa](https://github.com/rsuite/rsuite/commit/76b68aa79dd129a210238517c279fe41b0da89ac))
6
+
1
7
  ## [5.16.3](https://github.com/rsuite/rsuite/compare/v5.16.2...v5.16.3) (2022-07-29)
2
8
 
3
9
  ### Bug Fixes
@@ -104,6 +104,7 @@
104
104
  padding-right: 32px;
105
105
  color: var(--rs-text-primary);
106
106
  background-color: var(--rs-input-bg);
107
+ outline: none;
107
108
  }
108
109
 
109
110
  &.rs-btn-lg &-textbox {
@@ -120,7 +121,6 @@
120
121
 
121
122
  &-read-only {
122
123
  opacity: 0;
123
- pointer-events: none;
124
124
  }
125
125
  }
126
126
 
@@ -467,7 +467,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
467
467
  as: toggleAs,
468
468
  ref: targetRef,
469
469
  appearance: appearance,
470
- input: true,
470
+ editable: true,
471
471
  inputValue: value ? formatDate(value, formatStr) : '',
472
472
  inputPlaceholder: typeof placeholder === 'string' && placeholder ? placeholder : formatStr,
473
473
  inputMask: _utils.DateUtils.getDateMask(formatStr),
@@ -624,7 +624,7 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
624
624
  as: toggleAs,
625
625
  ref: targetRef,
626
626
  appearance: appearance,
627
- input: true,
627
+ editable: true,
628
628
  inputMask: _utils.DateUtils.getDateMask(rangeFormatStr),
629
629
  inputValue: value ? getDisplayString(value, true) : '',
630
630
  inputPlaceholder: typeof placeholder === 'string' && placeholder ? placeholder : rangeFormatStr,
@@ -278,56 +278,65 @@ var OverlayTrigger = /*#__PURE__*/_react.default.forwardRef(function (props, ref
278
278
  var preventDefault = (0, _react.useCallback)(function (event) {
279
279
  event.preventDefault();
280
280
  }, []);
281
- var triggerEvents = {
282
- onClick: onClick,
283
- onContextMenu: onContextMenu,
284
- onMouseOver: onMouseOver,
285
- onMouseOut: onMouseOut,
286
- onFocus: onFocus,
287
- onBlur: onBlur,
288
- onMouseMove: onMouseMove
289
- };
281
+ var triggerEvents = (0, _react.useMemo)(function () {
282
+ // Pass events by props
283
+ var events = {
284
+ onClick: onClick,
285
+ onContextMenu: onContextMenu,
286
+ onMouseOver: onMouseOver,
287
+ onMouseOut: onMouseOut,
288
+ onFocus: onFocus,
289
+ onBlur: onBlur,
290
+ onMouseMove: onMouseMove
291
+ }; // When trigger is disabled, no predefined event listeners are added.
292
+
293
+ if (disabled || readOnly || plaintext || trigger === 'none') {
294
+ return events;
295
+ } // Get the cursor position through onMouseMove.
296
+ // https://rsuitejs.com/components/tooltip/#follow-cursor
297
+
298
+
299
+ if (followCursor) {
300
+ events.onMouseMove = (0, _utils.createChainedFunction)(handledMoveOverlay, onMouseMove);
301
+ } // The `click` event is usually used in `toggle` scenarios.
302
+ // The first click will open and the second click will close.
303
+
290
304
 
291
- if (!disabled && !readOnly && !plaintext) {
292
305
  if ((0, _isOneOf.default)('click', trigger)) {
293
- triggerEvents.onClick = (0, _utils.createChainedFunction)(handleOpenState, triggerEvents.onClick);
294
- }
306
+ events.onClick = (0, _utils.createChainedFunction)(handleOpenState, events.onClick);
307
+ return events;
308
+ } // The difference between it and the click event is that it does not trigger the close.
295
309
 
296
- if ((0, _isOneOf.default)('contextMenu', trigger)) {
297
- triggerEvents.onContextMenu = (0, _utils.createChainedFunction)(preventDefault, handleOpenState, triggerEvents.onContextMenu);
298
- }
299
310
 
300
311
  if ((0, _isOneOf.default)('active', trigger)) {
301
- triggerEvents.onClick = (0, _utils.createChainedFunction)(handleDelayedOpen, triggerEvents.onClick);
312
+ events.onClick = (0, _utils.createChainedFunction)(handleDelayedOpen, events.onClick);
313
+ return events;
302
314
  }
303
315
 
304
316
  if ((0, _isOneOf.default)('hover', trigger)) {
305
- var onMouseOverListener = null;
306
- var onMouseOutListener = null;
307
-
308
- if (trigger !== 'none') {
309
- onMouseOverListener = function onMouseOverListener(e) {
310
- return onMouseEventHandler(handleDelayedOpen, e);
311
- };
317
+ var onMouseOverListener = function onMouseOverListener(e) {
318
+ return onMouseEventHandler(handleDelayedOpen, e);
319
+ };
312
320
 
313
- onMouseOutListener = function onMouseOutListener(e) {
314
- return onMouseEventHandler(handleDelayedClose, e);
315
- };
316
- }
321
+ var onMouseOutListener = function onMouseOutListener(e) {
322
+ return onMouseEventHandler(handleDelayedClose, e);
323
+ };
317
324
 
318
- triggerEvents.onMouseOver = (0, _utils.createChainedFunction)(onMouseOverListener, onMouseOver);
319
- triggerEvents.onMouseOut = (0, _utils.createChainedFunction)(onMouseOutListener, onMouseOut);
325
+ events.onMouseOver = (0, _utils.createChainedFunction)(onMouseOverListener, events.onMouseOver);
326
+ events.onMouseOut = (0, _utils.createChainedFunction)(onMouseOutListener, events.onMouseOut);
320
327
  }
321
328
 
322
329
  if ((0, _isOneOf.default)('focus', trigger)) {
323
- triggerEvents.onFocus = (0, _utils.createChainedFunction)(handleDelayedOpen, onFocus);
324
- triggerEvents.onBlur = (0, _utils.createChainedFunction)(handleDelayedClose, onBlur);
330
+ events.onFocus = (0, _utils.createChainedFunction)(handleDelayedOpen, events.onFocus);
331
+ events.onBlur = (0, _utils.createChainedFunction)(handleDelayedClose, events.onBlur);
325
332
  }
326
333
 
327
- if (trigger !== 'none' && followCursor) {
328
- triggerEvents.onMouseMove = (0, _utils.createChainedFunction)(handledMoveOverlay, onMouseMove);
334
+ if ((0, _isOneOf.default)('contextMenu', trigger)) {
335
+ events.onContextMenu = (0, _utils.createChainedFunction)(preventDefault, handleOpenState, events.onContextMenu);
329
336
  }
330
- }
337
+
338
+ return events;
339
+ }, [disabled, followCursor, handleDelayedClose, handleDelayedOpen, handleOpenState, handledMoveOverlay, onBlur, onClick, onContextMenu, onFocus, onMouseMove, onMouseOut, onMouseOver, plaintext, preventDefault, readOnly, trigger]);
331
340
 
332
341
  var renderOverlay = function renderOverlay() {
333
342
  var overlayProps = (0, _extends2.default)({}, rest, {
@@ -15,7 +15,7 @@ export interface PickerToggleProps extends ToggleButtonProps {
15
15
  readOnly?: boolean;
16
16
  plaintext?: boolean;
17
17
  tabIndex?: number;
18
- input?: boolean;
18
+ editable?: boolean;
19
19
  inputPlaceholder?: string;
20
20
  inputMask?: (string | RegExp)[];
21
21
  onInputChange?: (value: string, event: React.ChangeEvent) => void;
@@ -51,12 +51,12 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
51
51
  readOnly = props.readOnly,
52
52
  plaintext = props.plaintext,
53
53
  hasValue = props.hasValue,
54
+ editable = props.editable,
54
55
  cleanableProp = props.cleanable,
55
56
  _props$tabIndex = props.tabIndex,
56
- tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
57
+ tabIndexProp = _props$tabIndex === void 0 ? editable ? -1 : 0 : _props$tabIndex,
57
58
  id = props.id,
58
59
  value = props.value,
59
- input = props.input,
60
60
  inputPlaceholder = props.inputPlaceholder,
61
61
  inputValueProp = props.inputValue,
62
62
  _props$inputMask = props.inputMask,
@@ -74,8 +74,9 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
74
74
  _props$caretAs = props.caretAs,
75
75
  caretAs = _props$caretAs === void 0 ? caretComponent : _props$caretAs,
76
76
  label = props.label,
77
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "cleanable", "tabIndex", "id", "value", "input", "inputPlaceholder", "inputValue", "inputMask", "onInputChange", "onInputPressEnter", "onInputBlur", "onInputFocus", "onClean", "onFocus", "onBlur", "placement", "caretComponent", "caretAs", "label"]);
77
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "editable", "cleanable", "tabIndex", "id", "value", "inputPlaceholder", "inputValue", "inputMask", "onInputChange", "onInputPressEnter", "onInputBlur", "onInputFocus", "onClean", "onFocus", "onBlur", "placement", "caretComponent", "caretAs", "label"]);
78
78
  var inputRef = (0, _react.useRef)(null);
79
+ var comboboxRef = (0, _react.useRef)(null);
79
80
 
80
81
  var _useState = (0, _react.useState)(false),
81
82
  activeState = _useState[0],
@@ -95,30 +96,46 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
95
96
  setInputValue = _useState2[1];
96
97
 
97
98
  (0, _react.useEffect)(function () {
98
- var value = getInputValue();
99
- setInputValue(value);
99
+ if (comboboxRef.current) {
100
+ var _value = getInputValue();
101
+
102
+ setInputValue(_value);
103
+ }
100
104
  }, [getInputValue]);
101
105
  var classes = merge(className, withClassPrefix({
102
106
  active: activeProp || activeState
103
107
  }));
104
108
  var handleFocus = (0, _react.useCallback)(function (event) {
105
109
  setActive(true);
106
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
107
110
 
108
- if (input) {
109
- var _inputRef$current;
111
+ if (editable) {
112
+ // Avoid firing the onFocus event twice when DatePicker and DateRangePicker allow keyboard input.
113
+ if (event.target === inputRef.current) {
114
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
115
+ } // Force the input to be focused and editable.
110
116
 
111
- (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
117
+
118
+ if (document.activeElement === comboboxRef.current) {
119
+ var _inputRef$current;
120
+
121
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
122
+ }
123
+ } else {
124
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
112
125
  }
113
- }, [input, onFocus]);
126
+ }, [editable, onFocus]);
114
127
  var handleBlur = (0, _react.useCallback)(function (event) {
115
- if (inputRef.current && document.activeElement !== inputRef.current) {
128
+ if (inputRef.current && !editable) {
129
+ setActive(false);
130
+ } // When activeElement is an input, it remains active.
131
+
132
+
133
+ if (editable && inputRef.current && document.activeElement !== inputRef.current) {
116
134
  setActive(false);
117
- inputRef.current.blur();
118
135
  }
119
136
 
120
137
  onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
121
- }, [onBlur]);
138
+ }, [editable, onBlur]);
122
139
 
123
140
  var handleInputBlur = function handleInputBlur(event) {
124
141
  setInputValue(getInputValue());
@@ -126,10 +143,13 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
126
143
  };
127
144
 
128
145
  var handleClean = (0, _react.useCallback)(function (event) {
146
+ var _inputRef$current2, _comboboxRef$current;
147
+
129
148
  event.stopPropagation();
130
- onClean === null || onClean === void 0 ? void 0 : onClean(event);
131
- setActive(false);
132
- }, [onClean]);
149
+ onClean === null || onClean === void 0 ? void 0 : onClean(event); // When the value is cleared, the current component is still in focus.
150
+
151
+ editable ? (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.focus() : (_comboboxRef$current = comboboxRef.current) === null || _comboboxRef$current === void 0 ? void 0 : _comboboxRef$current.focus();
152
+ }, [editable, onClean]);
133
153
  var handleInputChange = (0, _react.useCallback)(function (event) {
134
154
  var _event$target;
135
155
 
@@ -138,10 +158,18 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
138
158
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(value, event);
139
159
  }, [onInputChange]);
140
160
  var handleInputKeyDown = (0, _react.useCallback)(function (event) {
141
- if (input && event.key === _utils.KEY_VALUES.ENTER) {
161
+ if (editable && event.key === _utils.KEY_VALUES.ENTER) {
142
162
  onInputPressEnter === null || onInputPressEnter === void 0 ? void 0 : onInputPressEnter(event);
143
163
  }
144
- }, [onInputPressEnter, input]);
164
+ }, [onInputPressEnter, editable]);
165
+ var renderInput = (0, _react.useCallback)(function (ref, props) {
166
+ return /*#__PURE__*/_react.default.createElement("input", (0, _extends2.default)({
167
+ ref: (0, _utils.mergeRefs)(inputRef, ref),
168
+ style: {
169
+ pointerEvents: editable ? undefined : 'none'
170
+ }
171
+ }, props));
172
+ }, [editable]);
145
173
  var ToggleCaret = (0, _useToggleCaret.default)(placement);
146
174
  var Caret = caretAs !== null && caretAs !== void 0 ? caretAs : ToggleCaret;
147
175
 
@@ -154,7 +182,8 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
154
182
 
155
183
  var showCleanButton = cleanableProp && hasValue && !readOnly; // When the component is read-only or disabled, the input is not interactive.
156
184
 
157
- var inputFocused = readOnly || disabled ? false : input && activeState;
185
+ var inputFocused = readOnly || disabled ? false : editable && activeState;
186
+ var tabIndex = disabled ? undefined : tabIndexProp;
158
187
  return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({
159
188
  role: "combobox",
160
189
  "aria-haspopup": "listbox",
@@ -162,9 +191,9 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
162
191
  "aria-disabled": disabled,
163
192
  "aria-owns": id ? id + "-listbox" : undefined
164
193
  }, rest, {
165
- ref: ref,
194
+ ref: (0, _utils.mergeRefs)(comboboxRef, ref),
166
195
  disabled: disabled,
167
- tabIndex: disabled ? undefined : tabIndex,
196
+ tabIndex: tabIndex,
168
197
  className: classes,
169
198
  onFocus: !disabled ? handleFocus : null // The debounce is set to 200 to solve the flicker caused by the switch between input and div.
170
199
  ,
@@ -181,16 +210,12 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
181
210
  readOnly: !inputFocused,
182
211
  disabled: disabled,
183
212
  "aria-controls": id ? id + "-listbox" : undefined,
184
- tabIndex: -1,
213
+ tabIndex: editable ? 0 : -1,
185
214
  className: prefix('textbox', {
186
215
  'read-only': !inputFocused
187
216
  }),
188
217
  placeholder: inputPlaceholder,
189
- render: function render(ref, props) {
190
- return /*#__PURE__*/_react.default.createElement("input", (0, _extends2.default)({
191
- ref: (0, _utils.mergeRefs)(inputRef, ref)
192
- }, props));
193
- }
218
+ render: renderInput
194
219
  }), children ? /*#__PURE__*/_react.default.createElement("span", {
195
220
  className: prefix(hasValue ? 'value' : 'placeholder'),
196
221
  "aria-placeholder": typeof children === 'string' ? children : undefined
@@ -10939,6 +10939,7 @@ textarea.rs-picker-search-input {
10939
10939
  color: var(--rs-text-primary);
10940
10940
  background-color: #fff;
10941
10941
  background-color: var(--rs-input-bg);
10942
+ outline: none;
10942
10943
  }
10943
10944
  .rs-picker-toggle.rs-btn-lg .rs-picker-toggle-textbox {
10944
10945
  padding-right: 14px;
@@ -10951,7 +10952,6 @@ textarea.rs-picker-search-input {
10951
10952
  }
10952
10953
  .rs-picker-toggle-read-only {
10953
10954
  opacity: 0;
10954
- pointer-events: none;
10955
10955
  }
10956
10956
  .rs-picker-default .rs-btn,
10957
10957
  .rs-picker-default .rs-picker-toggle {