rsuite 5.49.0 → 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 (115) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/Cascader/styles/index.less +4 -4
  3. package/DateRangePicker/styles/index.less +15 -5
  4. package/Dropdown/styles/index.less +5 -4
  5. package/Dropdown/styles/mixin.less +0 -11
  6. package/Picker/styles/index.less +31 -24
  7. package/Picker/styles/mixin.less +17 -13
  8. package/README.md +4 -4
  9. package/TagInput/styles/index.less +1 -1
  10. package/cjs/AutoComplete/AutoComplete.js +25 -26
  11. package/cjs/Calendar/Calendar.d.ts +5 -1
  12. package/cjs/Calendar/CalendarContainer.d.ts +5 -1
  13. package/cjs/Cascader/Cascader.js +46 -48
  14. package/cjs/CheckPicker/CheckPicker.d.ts +2 -2
  15. package/cjs/CheckPicker/CheckPicker.js +33 -36
  16. package/cjs/CheckTreePicker/CheckTreePicker.js +61 -64
  17. package/cjs/DatePicker/DatePicker.d.ts +5 -1
  18. package/cjs/DatePicker/DatePicker.js +2 -4
  19. package/cjs/DatePicker/Toolbar.js +2 -1
  20. package/cjs/DateRangeInput/DateRangeInput.js +2 -2
  21. package/cjs/DateRangePicker/Calendar.js +24 -23
  22. package/cjs/DateRangePicker/DateRangePicker.d.ts +18 -4
  23. package/cjs/DateRangePicker/DateRangePicker.js +239 -201
  24. package/cjs/DateRangePicker/types.d.ts +11 -3
  25. package/cjs/DateRangePicker/utils.d.ts +2 -1
  26. package/cjs/DateRangePicker/utils.js +7 -5
  27. package/cjs/FormControl/FormControl.d.ts +11 -1
  28. package/cjs/FormControl/FormControl.js +6 -5
  29. package/cjs/InputPicker/InputPicker.js +62 -63
  30. package/cjs/MultiCascader/MultiCascader.js +40 -42
  31. package/cjs/{DatePicker → Picker}/PickerIndicator.d.ts +1 -1
  32. package/cjs/{DatePicker → Picker}/PickerIndicator.js +2 -1
  33. package/cjs/{DatePicker → Picker}/PickerLabel.d.ts +1 -1
  34. package/cjs/Picker/PickerToggle.d.ts +17 -22
  35. package/cjs/Picker/PickerToggle.js +52 -177
  36. package/cjs/Picker/index.d.ts +3 -0
  37. package/cjs/Picker/index.js +10 -1
  38. package/cjs/Picker/usePickerRef.d.ts +3 -1
  39. package/cjs/Picker/usePickerRef.js +13 -7
  40. package/cjs/Picker/utils.d.ts +5 -9
  41. package/cjs/Picker/utils.js +22 -89
  42. package/cjs/SelectPicker/SelectPicker.d.ts +2 -2
  43. package/cjs/SelectPicker/SelectPicker.js +39 -42
  44. package/cjs/TreePicker/TreePicker.js +72 -75
  45. package/cjs/utils/constants.d.ts +2 -1
  46. package/cjs/utils/constants.js +1 -0
  47. package/cjs/utils/dateUtils.d.ts +0 -1
  48. package/cjs/utils/dateUtils.js +0 -6
  49. package/cjs/utils/getStringLength.d.ts +2 -0
  50. package/cjs/utils/getStringLength.js +18 -0
  51. package/cjs/utils/index.d.ts +1 -0
  52. package/cjs/utils/index.js +4 -1
  53. package/dist/rsuite-no-reset-rtl.css +92 -69
  54. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  55. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  56. package/dist/rsuite-no-reset.css +92 -69
  57. package/dist/rsuite-no-reset.min.css +1 -1
  58. package/dist/rsuite-no-reset.min.css.map +1 -1
  59. package/dist/rsuite-rtl.css +92 -69
  60. package/dist/rsuite-rtl.min.css +1 -1
  61. package/dist/rsuite-rtl.min.css.map +1 -1
  62. package/dist/rsuite.css +92 -69
  63. package/dist/rsuite.js +67 -46
  64. package/dist/rsuite.js.map +1 -1
  65. package/dist/rsuite.min.css +1 -1
  66. package/dist/rsuite.min.css.map +1 -1
  67. package/dist/rsuite.min.js +1 -1
  68. package/dist/rsuite.min.js.map +1 -1
  69. package/esm/AutoComplete/AutoComplete.js +28 -29
  70. package/esm/Calendar/Calendar.d.ts +5 -1
  71. package/esm/Calendar/CalendarContainer.d.ts +5 -1
  72. package/esm/Cascader/Cascader.js +49 -51
  73. package/esm/CheckPicker/CheckPicker.d.ts +2 -2
  74. package/esm/CheckPicker/CheckPicker.js +36 -39
  75. package/esm/CheckTreePicker/CheckTreePicker.js +64 -67
  76. package/esm/DatePicker/DatePicker.d.ts +5 -1
  77. package/esm/DatePicker/DatePicker.js +1 -3
  78. package/esm/DatePicker/Toolbar.js +2 -1
  79. package/esm/DateRangeInput/DateRangeInput.js +2 -2
  80. package/esm/DateRangePicker/Calendar.js +25 -23
  81. package/esm/DateRangePicker/DateRangePicker.d.ts +18 -4
  82. package/esm/DateRangePicker/DateRangePicker.js +241 -203
  83. package/esm/DateRangePicker/types.d.ts +11 -3
  84. package/esm/DateRangePicker/utils.d.ts +2 -1
  85. package/esm/DateRangePicker/utils.js +7 -5
  86. package/esm/FormControl/FormControl.d.ts +11 -1
  87. package/esm/FormControl/FormControl.js +4 -3
  88. package/esm/InputPicker/InputPicker.js +64 -65
  89. package/esm/MultiCascader/MultiCascader.js +43 -45
  90. package/esm/{DatePicker → Picker}/PickerIndicator.d.ts +1 -1
  91. package/esm/{DatePicker → Picker}/PickerIndicator.js +2 -1
  92. package/esm/{DatePicker → Picker}/PickerLabel.d.ts +1 -1
  93. package/esm/Picker/PickerToggle.d.ts +17 -22
  94. package/esm/Picker/PickerToggle.js +54 -179
  95. package/esm/Picker/index.d.ts +3 -0
  96. package/esm/Picker/index.js +3 -0
  97. package/esm/Picker/usePickerRef.d.ts +3 -1
  98. package/esm/Picker/usePickerRef.js +13 -8
  99. package/esm/Picker/utils.d.ts +5 -9
  100. package/esm/Picker/utils.js +24 -90
  101. package/esm/SelectPicker/SelectPicker.d.ts +2 -2
  102. package/esm/SelectPicker/SelectPicker.js +42 -45
  103. package/esm/TreePicker/TreePicker.js +75 -78
  104. package/esm/utils/constants.d.ts +2 -1
  105. package/esm/utils/constants.js +1 -0
  106. package/esm/utils/dateUtils.d.ts +0 -1
  107. package/esm/utils/dateUtils.js +0 -5
  108. package/esm/utils/getStringLength.d.ts +2 -0
  109. package/esm/utils/getStringLength.js +13 -0
  110. package/esm/utils/index.d.ts +1 -0
  111. package/esm/utils/index.js +1 -0
  112. package/package.json +1 -1
  113. package/styles/mixins/combobox.less +10 -0
  114. /package/cjs/{DatePicker → Picker}/PickerLabel.js +0 -0
  115. /package/esm/{DatePicker → Picker}/PickerLabel.js +0 -0
@@ -1,7 +1,7 @@
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, useCallback } from 'react';
4
+ import React, { useState, useCallback } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import pick from 'lodash/pick';
7
7
  import omit from 'lodash/omit';
@@ -12,8 +12,8 @@ import Checkbox from '../Checkbox';
12
12
  import { useCascadeValue, useColumnData, useFlattenData, isSomeChildChecked } from './utils';
13
13
  import { getNodeParents, findNodeOfTree } from '../utils/treeUtils';
14
14
  import { getColumnsAndPaths } from '../Cascader/utils';
15
- import { createChainedFunction, mergeRefs, getSafeRegExpString, useClassNames, useCustom, useUpdateEffect, useControlled } from '../utils';
16
- import { PickerToggle, PickerOverlay, SearchBar, SelectedElement, PickerToggleTrigger, usePickerClassName, usePublicMethods, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
15
+ import { createChainedFunction, mergeRefs, getSafeRegExpString, useClassNames, useCustom, useUpdateEffect, useControlled, useEventCallback } from '../utils';
16
+ import { PickerToggle, PickerOverlay, SearchBar, SelectedElement, PickerToggleTrigger, usePickerClassName, usePickerRef, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
17
17
  var emptyArray = [];
18
18
 
19
19
  /**
@@ -114,15 +114,12 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
114
114
  var _useState2 = useState(),
115
115
  selectedPaths = _useState2[0],
116
116
  setSelectedPaths = _useState2[1];
117
- var triggerRef = useRef(null);
118
- var overlayRef = useRef(null);
119
- var targetRef = useRef(null);
120
- var searchInputRef = useRef(null);
121
- usePublicMethods(ref, {
122
- triggerRef: triggerRef,
123
- overlayRef: overlayRef,
124
- targetRef: targetRef
125
- });
117
+ var _usePickerRef = usePickerRef(ref),
118
+ trigger = _usePickerRef.trigger,
119
+ root = _usePickerRef.root,
120
+ target = _usePickerRef.target,
121
+ overlay = _usePickerRef.overlay,
122
+ searchInput = _usePickerRef.searchInput;
126
123
  var _useCustom = useCustom('Picker', overrideLocale),
127
124
  locale = _useCustom.locale,
128
125
  rtl = _useCustom.rtl;
@@ -139,7 +136,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
139
136
  valueKey: valueKey,
140
137
  defaultLayer: selectedPaths !== null && selectedPaths !== void 0 && selectedPaths.length ? selectedPaths.length - 1 : 0,
141
138
  target: function target() {
142
- return overlayRef.current;
139
+ return overlay.current;
143
140
  },
144
141
  callback: useCallback(function (value) {
145
142
  var _getColumnsAndPaths = getColumnsAndPaths(data, flattenData.find(function (item) {
@@ -173,16 +170,16 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
173
170
  var _useState3 = useState(''),
174
171
  searchKeyword = _useState3[0],
175
172
  setSearchKeyword = _useState3[1];
176
- var handleEntered = useCallback(function () {
173
+ var handleEntered = useEventCallback(function () {
177
174
  onOpen === null || onOpen === void 0 ? void 0 : onOpen();
178
175
  setActive(true);
179
- }, [onOpen]);
180
- var handleExited = useCallback(function () {
176
+ });
177
+ var handleExited = useEventCallback(function () {
181
178
  setActive(false);
182
179
  setSearchKeyword('');
183
- }, []);
184
- var handleSelect = useCallback(function (node, cascadePaths, event) {
185
- var _node$childrenKey, _node$childrenKey2, _triggerRef$current, _triggerRef$current$u;
180
+ });
181
+ var handleSelect = useEventCallback(function (node, cascadePaths, event) {
182
+ var _node$childrenKey, _node$childrenKey2, _trigger$current, _trigger$current$upda;
186
183
  setSelectedPaths(cascadePaths);
187
184
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
188
185
  var columnIndex = cascadePaths.length;
@@ -195,7 +192,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
195
192
  children.then(function (data) {
196
193
  node.loading = false;
197
194
  node[childrenKey] = data;
198
- if (targetRef.current || inline) {
195
+ if (target.current || inline) {
199
196
  addFlattenData(data, node);
200
197
  addColumn(data, columnIndex);
201
198
  }
@@ -212,9 +209,9 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
212
209
  // Removes subsequent columns of the current column when the clicked node is a leaf node.
213
210
  removeColumnByIndex(columnIndex);
214
211
  }
215
- (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : (_triggerRef$current$u = _triggerRef$current.updatePosition) === null || _triggerRef$current$u === void 0 ? void 0 : _triggerRef$current$u.call(_triggerRef$current);
216
- }, [onSelect, getChildren, childrenKey, inline, addFlattenData, addColumn, removeColumnByIndex]);
217
- var handleCheck = useCallback(function (node, event, checked) {
212
+ (_trigger$current = trigger.current) === null || _trigger$current === void 0 ? void 0 : (_trigger$current$upda = _trigger$current.updatePosition) === null || _trigger$current$upda === void 0 ? void 0 : _trigger$current$upda.call(_trigger$current);
213
+ });
214
+ var handleCheck = useEventCallback(function (node, event, checked) {
218
215
  var nodeValue = node[valueKey];
219
216
  var nextValue = [];
220
217
  if (cascade) {
@@ -232,38 +229,38 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
232
229
  setValue(nextValue);
233
230
  onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
234
231
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextValue, node, checked, event);
235
- }, [cascade, onChange, onCheck, setValue, splitValue, value, valueKey]);
236
- var handleClean = useCallback(function (event) {
237
- if (disabled || !targetRef.current) {
232
+ });
233
+ var handleClean = useEventCallback(function (event) {
234
+ if (disabled || !target.current) {
238
235
  return;
239
236
  }
240
237
  setSelectedPaths([]);
241
238
  setValue([]);
242
239
  setColumnData([data]);
243
240
  onChange === null || onChange === void 0 ? void 0 : onChange([], event);
244
- }, [data, disabled, onChange, setColumnData, setValue]);
245
- var handleMenuPressEnter = useCallback(function (event) {
246
- var _overlayRef$current;
241
+ });
242
+ var handleMenuPressEnter = useEventCallback(function (event) {
243
+ var _overlay$current;
247
244
  var focusItem = findNodeOfTree(data, function (item) {
248
245
  return item[valueKey] === focusItemValue;
249
246
  });
250
- var checkbox = (_overlayRef$current = overlayRef.current) === null || _overlayRef$current === void 0 ? void 0 : _overlayRef$current.querySelector("[data-key=\"" + focusItemValue + "\"] [type=\"checkbox\"]");
247
+ var checkbox = (_overlay$current = overlay.current) === null || _overlay$current === void 0 ? void 0 : _overlay$current.querySelector("[data-key=\"" + focusItemValue + "\"] [type=\"checkbox\"]");
251
248
  if (checkbox) {
252
249
  handleCheck(focusItem, event, (checkbox === null || checkbox === void 0 ? void 0 : checkbox.getAttribute('aria-checked')) !== 'true');
253
250
  }
254
- }, [data, focusItemValue, handleCheck, valueKey]);
251
+ });
255
252
  var onPickerKeyDown = useToggleKeyDownEvent(_extends({
256
253
  toggle: !focusItemValue || !active,
257
- triggerRef: triggerRef,
258
- targetRef: targetRef,
259
- overlayRef: overlayRef,
260
- searchInputRef: searchInputRef,
254
+ trigger: trigger,
255
+ target: target,
256
+ overlay: overlay,
257
+ searchInput: searchInput,
261
258
  active: active,
262
259
  onExit: handleClean,
263
260
  onMenuKeyDown: onFocusItem,
264
261
  onMenuPressEnter: handleMenuPressEnter
265
262
  }, rest));
266
- var handleSearch = useCallback(function (value, event) {
263
+ var handleSearch = useEventCallback(function (value, event) {
267
264
  setSearchKeyword(value);
268
265
  onSearch === null || onSearch === void 0 ? void 0 : onSearch(value, event);
269
266
  if (value) {
@@ -272,8 +269,8 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
272
269
  setLayer(selectedPaths.length - 1);
273
270
  }
274
271
  setKeys([]);
275
- }, [onSearch, selectedPaths, setKeys, setLayer]);
276
- var getSearchResult = useCallback(function () {
272
+ });
273
+ var getSearchResult = function getSearchResult() {
277
274
  var items = [];
278
275
  var result = flattenData.filter(function (item) {
279
276
  if (uncheckableItemValues.some(function (value) {
@@ -295,7 +292,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
295
292
  }
296
293
  }
297
294
  return items;
298
- }, [flattenData, labelKey, searchKeyword, uncheckableItemValues, valueKey]);
295
+ };
299
296
  var renderSearchRow = function renderSearchRow(item, key) {
300
297
  var _extends2;
301
298
  var nodes = getNodeParents(item);
@@ -380,16 +377,16 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
380
377
  inline: inline
381
378
  }));
382
379
  return /*#__PURE__*/React.createElement(PickerOverlay, {
383
- ref: mergeRefs(overlayRef, speakerRef),
380
+ ref: mergeRefs(overlay, speakerRef),
384
381
  className: classes,
385
382
  style: styles,
386
- target: triggerRef,
383
+ target: trigger,
387
384
  onKeyDown: onPickerKeyDown
388
385
  }, searchable && /*#__PURE__*/React.createElement(SearchBar, {
389
386
  placeholder: locale === null || locale === void 0 ? void 0 : locale.searchPlaceholder,
390
387
  onChange: handleSearch,
391
388
  value: searchKeyword,
392
- inputRef: searchInputRef
389
+ inputRef: searchInput
393
390
  }), renderSearchResultPanel(), searchKeyword === '' && /*#__PURE__*/React.createElement(DropdownMenu, {
394
391
  id: id ? id + "-listbox" : undefined,
395
392
  cascade: cascade,
@@ -445,7 +442,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
445
442
  }
446
443
  return /*#__PURE__*/React.createElement(PickerToggleTrigger, {
447
444
  pickerProps: pick(props, pickTriggerPropKeys),
448
- ref: triggerRef,
445
+ ref: trigger,
449
446
  placement: placement,
450
447
  onEnter: createChainedFunction(handleEntered, onEnter),
451
448
  onExited: createChainedFunction(handleExited, onExited),
@@ -453,13 +450,14 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
453
450
  speaker: renderDropdownMenu
454
451
  }, /*#__PURE__*/React.createElement(Component, {
455
452
  className: classes,
456
- style: style
453
+ style: style,
454
+ ref: root
457
455
  }, /*#__PURE__*/React.createElement(PickerToggle, _extends({}, omit(rest, [].concat(omitTriggerPropKeys, usedClassNamePropKeys)), {
458
456
  id: id,
459
457
  as: toggleAs,
460
458
  appearance: appearance,
461
459
  disabled: disabled,
462
- ref: targetRef,
460
+ ref: target,
463
461
  onClean: createChainedFunction(handleClean, onClean),
464
462
  onKeyDown: onPickerKeyDown,
465
463
  cleanable: cleanable && !disabled,
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  interface PickerIndicatorProps {
3
3
  loading?: boolean;
4
4
  caretAs?: React.ElementType | null;
5
- onClose?: () => void;
5
+ onClose?: (event: React.MouseEvent<HTMLElement>) => void;
6
6
  showCleanButton?: boolean;
7
7
  as?: React.ElementType;
8
8
  }
@@ -34,7 +34,8 @@ var PickerIndicator = function PickerIndicator(_ref) {
34
34
  });
35
35
  }
36
36
  return caretAs && /*#__PURE__*/React.createElement(Icon, {
37
- as: caretAs
37
+ as: caretAs,
38
+ className: prefix('caret-icon')
38
39
  });
39
40
  };
40
41
  return /*#__PURE__*/React.createElement(Component, null, addon());
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  interface PickerLabelProps {
3
- id: string;
3
+ id?: string;
4
4
  className?: string;
5
5
  children?: React.ReactNode;
6
6
  as?: React.ElementType;
@@ -4,38 +4,33 @@ import { RsRefForwardingComponent, TypeAttributes } from '../@types/common';
4
4
  import { IconProps } from '@rsuite/icons/lib/Icon';
5
5
  declare type ValueType = string | number;
6
6
  export interface PickerToggleProps extends ToggleButtonProps {
7
- value?: ValueType | ValueType[];
8
- inputValue?: ValueType | ValueType[];
9
- id?: string;
7
+ active?: boolean;
10
8
  hasValue?: boolean;
11
9
  cleanable?: boolean;
12
10
  caret?: boolean;
13
- active?: boolean;
14
- disabled?: boolean;
15
- readOnly?: boolean;
16
- plaintext?: boolean;
17
- tabIndex?: number;
18
- /** Whether to display an loading indicator on toggle button */
19
- loading?: boolean;
20
- editable?: boolean;
21
- name?: string;
22
- inputPlaceholder?: string;
23
- inputMask?: (string | RegExp)[];
24
- onInputChange?: (value: string, event: React.ChangeEvent) => void;
25
- onInputPressEnter?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
26
- onInputBackspace?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
27
- onInputBlur?: (event: React.FocusEvent<HTMLElement>) => void;
28
- onInputFocus?: (event: React.FocusEvent<HTMLElement>) => void;
29
- placement?: TypeAttributes.Placement;
30
11
  /**
31
12
  * Custom caret component
32
13
  * @deprecated Use `caretAs` instead
33
14
  */
34
15
  caretComponent?: React.FC<IconProps>;
35
- /** Custom caret component */
16
+ /**
17
+ * Custom caret component
18
+ */
36
19
  caretAs?: React.ElementType;
37
- onClean?: (event: React.MouseEvent) => void;
20
+ disabled?: boolean;
21
+ placement?: TypeAttributes.Placement;
22
+ readOnly?: boolean;
23
+ plaintext?: boolean;
24
+ tabIndex?: number;
25
+ /**
26
+ * Whether to display an loading indicator on toggle button
27
+ */
28
+ loading?: boolean;
38
29
  label?: React.ReactNode;
30
+ name?: string;
31
+ id?: string;
32
+ inputValue?: ValueType | ValueType[];
33
+ onClean?: (event: React.MouseEvent) => void;
39
34
  }
40
35
  declare const PickerToggle: RsRefForwardingComponent<typeof ToggleButton, PickerToggleProps>;
41
36
  export default PickerToggle;
@@ -1,23 +1,18 @@
1
1
  'use client';
2
- import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTemplateLiteralLoose";
3
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTemplateLiteralLoose";
4
4
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
5
- var _templateObject, _templateObject2;
6
- import React, { useState, useCallback, useEffect, useRef } from 'react';
7
- import PropTypes from 'prop-types';
8
- import debounce from 'lodash/debounce';
5
+ var _templateObject;
6
+ import React, { useRef, useMemo } from 'react';
9
7
  import ToggleButton from './ToggleButton';
10
- import CloseButton from '../CloseButton';
11
- import { useClassNames, useCustom, KEY_VALUES, mergeRefs } from '../utils';
8
+ import { useClassNames, mergeRefs, useEventCallback } from '../utils';
12
9
  import Plaintext from '../Plaintext';
13
10
  import useToggleCaret from '../utils/useToggleCaret';
14
- import TextMask from '../MaskedInput/TextMask';
15
- import deprecatePropType from '../utils/deprecatePropType';
16
- import Loader from '../Loader';
17
11
  import Stack from '../Stack';
18
- var defaultInputMask = [];
12
+ import PickerIndicator from './PickerIndicator';
13
+ import PickerLabel from './PickerLabel';
19
14
  var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
20
- var activeProp = props.active,
15
+ var active = props.active,
21
16
  _props$as = props.as,
22
17
  Component = _props$as === void 0 ? ToggleButton : _props$as,
23
18
  _props$classPrefix = props.classPrefix,
@@ -30,26 +25,14 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
30
25
  readOnly = props.readOnly,
31
26
  plaintext = props.plaintext,
32
27
  hasValue = props.hasValue,
33
- editable = props.editable,
34
28
  _props$loading = props.loading,
35
29
  loading = _props$loading === void 0 ? false : _props$loading,
36
- cleanableProp = props.cleanable,
30
+ cleanable = props.cleanable,
37
31
  _props$tabIndex = props.tabIndex,
38
- tabIndexProp = _props$tabIndex === void 0 ? editable ? -1 : 0 : _props$tabIndex,
32
+ tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
39
33
  id = props.id,
40
- value = props.value,
41
- inputPlaceholder = props.inputPlaceholder,
42
34
  inputValueProp = props.inputValue,
43
- _props$inputMask = props.inputMask,
44
- inputMask = _props$inputMask === void 0 ? defaultInputMask : _props$inputMask,
45
- onInputChange = props.onInputChange,
46
- onInputPressEnter = props.onInputPressEnter,
47
- onInputBackspace = props.onInputBackspace,
48
- onInputBlur = props.onInputBlur,
49
- onInputFocus = props.onInputFocus,
50
35
  onClean = props.onClean,
51
- onFocus = props.onFocus,
52
- onBlur = props.onBlur,
53
36
  _props$placement = props.placement,
54
37
  placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
55
38
  caretComponent = props.caretComponent,
@@ -57,102 +40,29 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
57
40
  caretAs = _props$caretAs === void 0 ? caretComponent : _props$caretAs,
58
41
  label = props.label,
59
42
  name = props.name,
60
- rest = _objectWithoutPropertiesLoose(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "editable", "loading", "cleanable", "tabIndex", "id", "value", "inputPlaceholder", "inputValue", "inputMask", "onInputChange", "onInputPressEnter", "onInputBackspace", "onInputBlur", "onInputFocus", "onClean", "onFocus", "onBlur", "placement", "caretComponent", "caretAs", "label", "name"]);
61
- var _useCustom = useCustom(),
62
- locale = _useCustom.locale;
63
- var inputRef = useRef(null);
64
- var comboboxRef = useRef(null);
65
- var _useState = useState(false),
66
- activeState = _useState[0],
67
- setActive = _useState[1];
43
+ rest = _objectWithoutPropertiesLoose(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "loading", "cleanable", "tabIndex", "id", "inputValue", "onClean", "placement", "caretComponent", "caretAs", "label", "name"]);
44
+ var combobox = useRef(null);
68
45
  var _useClassNames = useClassNames(classPrefix),
69
46
  withClassPrefix = _useClassNames.withClassPrefix,
70
47
  merge = _useClassNames.merge,
71
48
  prefix = _useClassNames.prefix;
72
- var getInputValue = useCallback(function () {
73
- return typeof inputValueProp === 'undefined' ? Array.isArray(value) ? value.join(',') : value : inputValueProp;
74
- }, [inputValueProp, value]);
75
- var _useState2 = useState(getInputValue),
76
- inputValue = _useState2[0],
77
- setInputValue = _useState2[1];
78
- useEffect(function () {
79
- if (comboboxRef.current) {
80
- var _value = getInputValue();
81
- setInputValue(_value);
49
+ var inputValue = useMemo(function () {
50
+ if (typeof inputValueProp === 'number' || typeof inputValueProp === 'string') {
51
+ return inputValueProp;
52
+ } else if (Array.isArray(inputValueProp)) {
53
+ return inputValueProp.join(',');
82
54
  }
83
- }, [getInputValue]);
55
+ return '';
56
+ }, [inputValueProp]);
84
57
  var classes = merge(className, withClassPrefix({
85
- active: activeProp || activeState
58
+ active: active
86
59
  }));
87
- var handleFocus = useCallback(function (event) {
88
- if (!loading) {
89
- setActive(true);
90
- }
91
- if (editable) {
92
- // Avoid firing the onFocus event twice when DatePicker and DateRangePicker allow keyboard input.
93
- if (event.target === inputRef.current) {
94
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
95
- }
96
-
97
- // Force the input to be focused and editable.
98
- if (document.activeElement === comboboxRef.current) {
99
- var _inputRef$current;
100
- (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
101
- }
102
- } else {
103
- onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
104
- }
105
- }, [editable, loading, onFocus]);
106
- var handleBlur = useCallback(function (event) {
107
- if (inputRef.current && !editable) {
108
- setActive(false);
109
- }
110
-
111
- // When activeElement is an input, it remains active.
112
- if (editable && inputRef.current && document.activeElement !== inputRef.current) {
113
- setActive(false);
114
- }
115
- onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
116
- }, [editable, onBlur]);
117
- var handleInputBlur = function handleInputBlur(event) {
118
- setInputValue(getInputValue());
119
- onInputBlur === null || onInputBlur === void 0 ? void 0 : onInputBlur(event);
120
- };
121
- var handleClean = useCallback(function (event) {
122
- var _inputRef$current2, _comboboxRef$current;
60
+ var handleClean = useEventCallback(function (event) {
61
+ var _combobox$current;
123
62
  event.stopPropagation();
124
63
  onClean === null || onClean === void 0 ? void 0 : onClean(event);
125
-
126
- // When the value is cleared, the current component is still in focus.
127
- 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();
128
- }, [editable, onClean]);
129
- var handleInputChange = useCallback(function (event) {
130
- var _event$target;
131
- var value = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.value;
132
- setInputValue(value);
133
- onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(value, event);
134
- }, [onInputChange]);
135
- var handleInputKeyDown = useCallback(function (event) {
136
- if (editable) {
137
- if (event.key === KEY_VALUES.ENTER) {
138
- onInputPressEnter === null || onInputPressEnter === void 0 ? void 0 : onInputPressEnter(event);
139
- }
140
- if (event.key === KEY_VALUES.BACKSPACE) {
141
- onInputBackspace === null || onInputBackspace === void 0 ? void 0 : onInputBackspace(event);
142
- }
143
- }
144
- }, [editable, onInputPressEnter, onInputBackspace]);
145
- var renderInput = useCallback(function (ref, props) {
146
- return /*#__PURE__*/React.createElement("input", _extends({
147
- type: "text",
148
- autoComplete: "off",
149
- ref: mergeRefs(inputRef, ref),
150
- name: name,
151
- style: {
152
- pointerEvents: editable ? undefined : 'none'
153
- }
154
- }, props));
155
- }, [editable, name]);
64
+ (_combobox$current = combobox.current) === null || _combobox$current === void 0 ? void 0 : _combobox$current.focus();
65
+ });
156
66
  var ToggleCaret = useToggleCaret(placement);
157
67
  var Caret = caretAs !== null && caretAs !== void 0 ? caretAs : ToggleCaret;
158
68
  if (plaintext) {
@@ -161,88 +71,53 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
161
71
  localeKey: "notSelected"
162
72
  }, hasValue ? children : null);
163
73
  }
164
- var showCleanButton = cleanableProp && hasValue && !readOnly;
165
-
166
- // When the component is read-only or disabled, the input is not interactive.
167
- var inputFocused = readOnly || disabled ? false : editable && activeState;
168
- var tabIndex = disabled ? undefined : tabIndexProp;
74
+ var showCleanButton = cleanable && hasValue && !readOnly;
169
75
  return /*#__PURE__*/React.createElement(Component, _extends({
170
76
  role: "combobox",
171
77
  "aria-haspopup": "listbox",
172
- "aria-expanded": activeProp,
78
+ "aria-expanded": active,
173
79
  "aria-disabled": disabled,
174
80
  "aria-owns": id ? id + "-listbox" : undefined
175
81
  }, rest, {
176
- ref: mergeRefs(comboboxRef, ref),
82
+ ref: mergeRefs(combobox, ref),
177
83
  disabled: disabled,
178
- tabIndex: tabIndex,
179
- className: classes,
180
- onFocus: !disabled ? handleFocus : null
181
- // The debounce is set to 200 to solve the flicker caused by the switch between input and div.
182
- ,
183
- onBlur: !disabled ? debounce(handleBlur, 200) : null
184
- }), /*#__PURE__*/React.createElement(Stack, null, label && /*#__PURE__*/React.createElement(Stack.Item, null, /*#__PURE__*/React.createElement("span", {
185
- className: prefix('label')
84
+ tabIndex: disabled ? undefined : tabIndex,
85
+ className: classes
86
+ }), /*#__PURE__*/React.createElement(Stack, null, label && /*#__PURE__*/React.createElement(Stack.Item, null, /*#__PURE__*/React.createElement(PickerLabel, {
87
+ as: "span",
88
+ className: prefix('label'),
89
+ id: id ? id + "-label" : undefined
186
90
  }, label)), /*#__PURE__*/React.createElement(Stack.Item, {
187
91
  grow: 1,
188
92
  style: {
189
93
  overflow: 'hidden'
190
94
  }
191
- }, loading ? /*#__PURE__*/React.createElement(Loader, {
192
- style: {
193
- display: 'block',
194
- padding: '1px 0'
195
- },
196
- "data-testid": "spinner"
197
- }) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TextMask, {
198
- keepCharPositions: true,
199
- mask: inputMask,
200
- value: Array.isArray(inputValue) ? inputValue.toString() : inputValue,
201
- onBlur: handleInputBlur,
202
- onFocus: onInputFocus,
203
- onChange: handleInputChange,
204
- onKeyDown: handleInputKeyDown,
205
- id: id,
206
- "aria-hidden": !inputFocused,
207
- readOnly: !inputFocused,
208
- disabled: disabled,
95
+ }, /*#__PURE__*/React.createElement("input", {
96
+ readOnly: true,
97
+ "aria-hidden": true,
209
98
  "aria-controls": id ? id + "-listbox" : undefined,
210
- tabIndex: editable ? 0 : -1,
211
- className: prefix('textbox', {
212
- 'read-only': !inputFocused
213
- }),
214
- placeholder: inputPlaceholder,
215
- render: renderInput,
216
- "data-testid": "picker-toggle-input"
99
+ "aria-labelledby": label ? id + "-label" : undefined,
100
+ tabIndex: -1,
101
+ "data-testid": "picker-toggle-input",
102
+ name: name,
103
+ value: inputValue,
104
+ id: id,
105
+ className: prefix('textbox', 'read-only'),
106
+ style: {
107
+ pointerEvents: 'none'
108
+ }
217
109
  }), children ? /*#__PURE__*/React.createElement("span", {
218
110
  className: prefix(hasValue ? 'value' : 'placeholder'),
219
111
  "aria-placeholder": typeof children === 'string' ? children : undefined
220
- }, children) : null)), showCleanButton && /*#__PURE__*/React.createElement(CloseButton, {
221
- className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["clean"]))),
222
- tabIndex: -1,
223
- locale: {
224
- closeLabel: locale === null || locale === void 0 ? void 0 : locale.clear
225
- },
226
- onClick: handleClean
227
- }), caret && !showCleanButton && /*#__PURE__*/React.createElement(Caret, {
228
- className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["caret"])))
229
- })));
112
+ }, children) : null), /*#__PURE__*/React.createElement(Stack.Item, {
113
+ className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["indicator"])))
114
+ }, /*#__PURE__*/React.createElement(PickerIndicator, {
115
+ as: React.Fragment,
116
+ loading: loading,
117
+ caretAs: caret ? Caret : null,
118
+ onClose: handleClean,
119
+ showCleanButton: showCleanButton
120
+ }))));
230
121
  });
231
122
  PickerToggle.displayName = 'PickerToggle';
232
- PickerToggle.propTypes = {
233
- classPrefix: PropTypes.string,
234
- hasValue: PropTypes.bool,
235
- cleanable: PropTypes.bool,
236
- className: PropTypes.string,
237
- children: PropTypes.node,
238
- caret: PropTypes.bool,
239
- as: PropTypes.elementType,
240
- onClean: PropTypes.func,
241
- active: PropTypes.bool,
242
- readOnly: PropTypes.bool,
243
- disabled: PropTypes.bool,
244
- plaintext: PropTypes.bool,
245
- caretComponent: deprecatePropType(PropTypes.elementType, 'Use `caretAs` instead.'),
246
- caretAs: PropTypes.elementType
247
- };
248
123
  export default PickerToggle;
@@ -7,9 +7,12 @@ export { default as DropdownMenuGroup } from './DropdownMenuGroup';
7
7
  export { default as DropdownMenuItem } from './DropdownMenuItem';
8
8
  export { default as PickerOverlay } from './PickerOverlay';
9
9
  export { default as PickerToggle } from './PickerToggle';
10
+ export { default as PickerLabel } from './PickerLabel';
11
+ export { default as PickerIndicator } from './PickerIndicator';
10
12
  export { default as PickerToggleTrigger } from './PickerToggleTrigger';
11
13
  export { default as SearchBar } from './SearchBar';
12
14
  export { default as SelectedElement } from './SelectedElement';
15
+ export { default as usePickerRef } from './usePickerRef';
13
16
  export { pickTriggerPropKeys, omitTriggerPropKeys };
14
17
  export type { OverlayTriggerHandle, PositionChildProps, PickerHandle, PickerComponent, PickerToggleProps };
15
18
  export * from './utils';
@@ -6,9 +6,12 @@ export { default as DropdownMenuGroup } from './DropdownMenuGroup';
6
6
  export { default as DropdownMenuItem } from './DropdownMenuItem';
7
7
  export { default as PickerOverlay } from './PickerOverlay';
8
8
  export { default as PickerToggle } from './PickerToggle';
9
+ export { default as PickerLabel } from './PickerLabel';
10
+ export { default as PickerIndicator } from './PickerIndicator';
9
11
  export { default as PickerToggleTrigger } from './PickerToggleTrigger';
10
12
  export { default as SearchBar } from './SearchBar';
11
13
  export { default as SelectedElement } from './SelectedElement';
14
+ export { default as usePickerRef } from './usePickerRef';
12
15
  export { pickTriggerPropKeys, omitTriggerPropKeys };
13
16
  export * from './utils';
14
17
  export * from './propTypes';
@@ -9,9 +9,11 @@ export interface PickerDependentParameters {
9
9
  */
10
10
  declare function usePickerRef(ref: any, parmas?: PickerDependentParameters): {
11
11
  trigger: import("react").RefObject<OverlayTriggerHandle>;
12
- root: import("react").RefObject<HTMLElement>;
12
+ root: import("react").MutableRefObject<any>;
13
13
  overlay: import("react").RefObject<HTMLElement>;
14
14
  target: import("react").RefObject<HTMLElement>;
15
15
  list: import("react").RefObject<ListHandle>;
16
+ searchInput: import("react").RefObject<HTMLInputElement>;
17
+ treeView: import("react").RefObject<HTMLDivElement>;
16
18
  };
17
19
  export default usePickerRef;