rsuite 5.19.0 → 5.20.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 (73) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/Picker/styles/index.less +4 -0
  3. package/cjs/Animation/Transition.d.ts +2 -2
  4. package/cjs/Cascader/Cascader.js +10 -5
  5. package/cjs/Cascader/utils.d.ts +1 -0
  6. package/cjs/Cascader/utils.js +11 -1
  7. package/cjs/CheckTreePicker/CheckTreePicker.js +32 -36
  8. package/cjs/CheckTreePicker/utils.d.ts +2 -2
  9. package/cjs/CheckTreePicker/utils.js +9 -10
  10. package/cjs/DOMHelper/index.d.ts +3 -2
  11. package/cjs/DatePicker/DatePicker.js +9 -0
  12. package/cjs/DatePicker/PredefinedRanges.js +5 -0
  13. package/cjs/DateRangePicker/DateRangePicker.js +9 -7
  14. package/cjs/Form/Form.js +44 -38
  15. package/cjs/MultiCascader/MultiCascader.js +10 -5
  16. package/cjs/MultiCascader/utils.d.ts +1 -0
  17. package/cjs/MultiCascader/utils.js +10 -0
  18. package/cjs/Overlay/OverlayTrigger.d.ts +10 -1
  19. package/cjs/Overlay/OverlayTrigger.js +26 -4
  20. package/cjs/Picker/PickerToggle.d.ts +1 -0
  21. package/cjs/Picker/PickerToggle.js +24 -8
  22. package/cjs/Picker/PickerToggleTrigger.d.ts +1 -1
  23. package/cjs/Picker/PickerToggleTrigger.js +4 -2
  24. package/cjs/SelectPicker/SelectPicker.d.ts +2 -0
  25. package/cjs/TreePicker/TreePicker.d.ts +0 -1
  26. package/cjs/TreePicker/TreePicker.js +13 -14
  27. package/cjs/locales/fr_FR.d.ts +105 -0
  28. package/cjs/locales/fr_FR.js +84 -0
  29. package/cjs/locales/index.d.ts +1 -0
  30. package/cjs/locales/index.js +6 -2
  31. package/cjs/utils/treeUtils.d.ts +7 -1
  32. package/cjs/utils/treeUtils.js +24 -5
  33. package/dist/rsuite-rtl.css +3 -0
  34. package/dist/rsuite-rtl.min.css +1 -1
  35. package/dist/rsuite-rtl.min.css.map +1 -1
  36. package/dist/rsuite.css +3 -0
  37. package/dist/rsuite.js +64 -64
  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/Animation/Transition.d.ts +2 -2
  43. package/esm/Cascader/Cascader.js +10 -5
  44. package/esm/Cascader/utils.d.ts +1 -0
  45. package/esm/Cascader/utils.js +11 -1
  46. package/esm/CheckTreePicker/CheckTreePicker.js +34 -37
  47. package/esm/CheckTreePicker/utils.d.ts +2 -2
  48. package/esm/CheckTreePicker/utils.js +11 -12
  49. package/esm/DOMHelper/index.d.ts +3 -2
  50. package/esm/DatePicker/DatePicker.js +8 -0
  51. package/esm/DatePicker/PredefinedRanges.js +5 -0
  52. package/esm/DateRangePicker/DateRangePicker.js +9 -7
  53. package/esm/Form/Form.js +44 -38
  54. package/esm/MultiCascader/MultiCascader.js +10 -5
  55. package/esm/MultiCascader/utils.d.ts +1 -0
  56. package/esm/MultiCascader/utils.js +10 -0
  57. package/esm/Overlay/OverlayTrigger.d.ts +10 -1
  58. package/esm/Overlay/OverlayTrigger.js +23 -3
  59. package/esm/Picker/PickerToggle.d.ts +1 -0
  60. package/esm/Picker/PickerToggle.js +22 -8
  61. package/esm/Picker/PickerToggleTrigger.d.ts +1 -1
  62. package/esm/Picker/PickerToggleTrigger.js +4 -2
  63. package/esm/SelectPicker/SelectPicker.d.ts +2 -0
  64. package/esm/TreePicker/TreePicker.d.ts +0 -1
  65. package/esm/TreePicker/TreePicker.js +13 -13
  66. package/esm/locales/fr_FR.d.ts +105 -0
  67. package/esm/locales/fr_FR.js +74 -0
  68. package/esm/locales/index.d.ts +1 -0
  69. package/esm/locales/index.js +2 -1
  70. package/esm/utils/treeUtils.d.ts +7 -1
  71. package/esm/utils/treeUtils.js +22 -5
  72. package/locales/fr_FR/package.json +7 -0
  73. package/package.json +7 -7
package/cjs/Form/Form.js CHANGED
@@ -15,8 +15,6 @@ var _react = _interopRequireWildcard(require("react"));
15
15
 
16
16
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
17
 
18
- var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
19
-
20
18
  var _omit = _interopRequireDefault(require("lodash/omit"));
21
19
 
22
20
  var _schemaTyped = require("schema-typed");
@@ -37,6 +35,8 @@ var _useFormClassNames = require("./useFormClassNames");
37
35
 
38
36
  var _useSchemaModel2 = _interopRequireDefault(require("./useSchemaModel"));
39
37
 
38
+ var _utils = require("../utils");
39
+
40
40
  var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
41
41
  var _props$checkTrigger = props.checkTrigger,
42
42
  checkTrigger = _props$checkTrigger === void 0 ? 'change' : _props$checkTrigger,
@@ -79,20 +79,18 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
79
79
  disabled: disabled
80
80
  });
81
81
 
82
- var _useState = (0, _react.useState)(formDefaultValue),
83
- _formValue = _useState[0],
84
- setFormValue = _useState[1];
82
+ var _useControlled = (0, _utils.useControlled)(formValue, formDefaultValue),
83
+ realFormValue = _useControlled[0],
84
+ setFormValue = _useControlled[1];
85
85
 
86
- var _useState2 = (0, _react.useState)(formError || {}),
87
- _formError = _useState2[0],
88
- setFormError = _useState2[1];
86
+ var _useControlled2 = (0, _utils.useControlled)(formError, {}),
87
+ realFormError = _useControlled2[0],
88
+ setFormError = _useControlled2[1];
89
89
 
90
- var getFormValue = (0, _react.useCallback)(function () {
91
- return (0, _isUndefined.default)(formValue) ? _formValue : formValue;
92
- }, [_formValue, formValue]);
93
- var getFormError = (0, _react.useCallback)(function () {
94
- return (0, _isUndefined.default)(formError) ? _formError : formError;
95
- }, [formError, _formError]);
90
+ var realFormValueRef = (0, _react.useRef)(realFormValue);
91
+ realFormValueRef.current = realFormValue;
92
+ var realFormErrorRef = (0, _react.useRef)(realFormError);
93
+ realFormErrorRef.current = realFormError;
96
94
  /**
97
95
  * Validate the form data and return a boolean.
98
96
  * The error message after verification is returned in the callback.
@@ -100,7 +98,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
100
98
  */
101
99
 
102
100
  var check = (0, _react.useCallback)(function (callback) {
103
- var formValue = getFormValue() || {};
101
+ var formValue = realFormValue || {};
104
102
  var formError = {};
105
103
  var errorCount = 0;
106
104
  var model = getCombinedModel();
@@ -122,7 +120,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
122
120
  }
123
121
 
124
122
  return true;
125
- }, [getFormValue, getCombinedModel, onCheck, onError]);
123
+ }, [realFormValue, getCombinedModel, setFormError, onCheck, onError]);
126
124
  /**
127
125
  * Check the data field
128
126
  * @param fieldName
@@ -132,10 +130,10 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
132
130
  var checkForField = (0, _react.useCallback)(function (fieldName, callback) {
133
131
  var _extends2;
134
132
 
135
- var formValue = getFormValue() || {};
133
+ var formValue = realFormValue || {};
136
134
  var model = getCombinedModel();
137
135
  var checkResult = model.checkForField(fieldName, formValue);
138
- var formError = (0, _extends6.default)({}, getFormError(), (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
136
+ var formError = (0, _extends6.default)({}, realFormError, (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
139
137
  setFormError(formError);
140
138
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
141
139
  callback === null || callback === void 0 ? void 0 : callback(checkResult);
@@ -145,13 +143,13 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
145
143
  }
146
144
 
147
145
  return !checkResult.hasError;
148
- }, [getFormValue, getCombinedModel, getFormError, onCheck, onError]);
146
+ }, [realFormValue, getCombinedModel, realFormError, setFormError, onCheck, onError]);
149
147
  /**
150
148
  * Check form data asynchronously and return a Promise
151
149
  */
152
150
 
153
151
  var checkAsync = (0, _react.useCallback)(function () {
154
- var formValue = getFormValue() || {};
152
+ var formValue = realFormValue || {};
155
153
  var promises = [];
156
154
  var keys = [];
157
155
  var model = getCombinedModel();
@@ -182,19 +180,19 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
182
180
  formError: formError
183
181
  };
184
182
  });
185
- }, [getFormValue, getCombinedModel, onCheck, onError]);
183
+ }, [realFormValue, getCombinedModel, onCheck, setFormError, onError]);
186
184
  /**
187
185
  * Asynchronously check form fields and return Promise
188
186
  * @param fieldName
189
187
  */
190
188
 
191
189
  var checkForFieldAsync = (0, _react.useCallback)(function (fieldName) {
192
- var formValue = getFormValue() || {};
190
+ var formValue = realFormValue || {};
193
191
  var model = getCombinedModel();
194
192
  return model.checkForFieldAsync(fieldName, formValue).then(function (checkResult) {
195
193
  var _extends3;
196
194
 
197
- var formError = (0, _extends6.default)({}, getFormError(), (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
195
+ var formError = (0, _extends6.default)({}, realFormError, (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
198
196
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
199
197
  setFormError(formError);
200
198
 
@@ -204,20 +202,20 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
204
202
 
205
203
  return checkResult;
206
204
  });
207
- }, [getFormValue, getCombinedModel, getFormError, onCheck, onError]);
205
+ }, [realFormValue, getCombinedModel, realFormError, onCheck, setFormError, onError]);
208
206
  var cleanErrors = (0, _react.useCallback)(function () {
209
207
  setFormError({});
210
- }, []);
208
+ }, [setFormError]);
211
209
  var cleanErrorForField = (0, _react.useCallback)(function (fieldName) {
212
- setFormError((0, _omit.default)(_formError, [fieldName]));
213
- }, [_formError]);
210
+ setFormError((0, _omit.default)(realFormError, [fieldName]));
211
+ }, [realFormError, setFormError]);
214
212
  var resetErrors = (0, _react.useCallback)(function (formError) {
215
213
  if (formError === void 0) {
216
214
  formError = {};
217
215
  }
218
216
 
219
217
  setFormError(formError);
220
- }, []);
218
+ }, [setFormError]);
221
219
  (0, _react.useImperativeHandle)(ref, function () {
222
220
  return {
223
221
  root: rootRef.current,
@@ -231,15 +229,23 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
231
229
  };
232
230
  });
233
231
  var removeFieldError = (0, _react.useCallback)(function (name) {
234
- var formError = (0, _omit.default)(getFormError(), [name]);
232
+ /**
233
+ * when this function is called when the children component is unmount, it's an old render frame
234
+ * so use Ref to get future error
235
+ */
236
+ var formError = (0, _omit.default)(realFormErrorRef.current, [name]);
235
237
  setFormError(formError);
236
238
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
237
- }, [getFormError, onCheck]);
239
+ }, [onCheck, setFormError]);
238
240
  var removeFieldValue = (0, _react.useCallback)(function (name) {
239
- var formValue = (0, _omit.default)(getFormValue(), [name]);
241
+ /**
242
+ * when this function is called when the children component is unmount, it's an old render frame
243
+ * so use Ref to get future value
244
+ */
245
+ var formValue = (0, _omit.default)(realFormValueRef.current, [name]);
240
246
  setFormValue(formValue);
241
247
  onChange === null || onChange === void 0 ? void 0 : onChange(formValue);
242
- }, [getFormValue, onChange]);
248
+ }, [onChange, setFormValue]);
243
249
  var handleSubmit = (0, _react.useCallback)(function (event) {
244
250
  if (disabled || readOnly || plaintext) {
245
251
  return;
@@ -253,22 +259,22 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
253
259
  var handleFieldError = (0, _react.useCallback)(function (name, errorMessage) {
254
260
  var _extends4;
255
261
 
256
- var formError = (0, _extends6.default)({}, getFormError(), (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
262
+ var formError = (0, _extends6.default)({}, realFormError, (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
257
263
  setFormError(formError);
258
264
  onError === null || onError === void 0 ? void 0 : onError(formError);
259
265
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
260
- }, [onError, onCheck, getFormError]);
266
+ }, [realFormError, setFormError, onError, onCheck]);
261
267
  var handleFieldSuccess = (0, _react.useCallback)(function (name) {
262
268
  removeFieldError(name);
263
269
  }, [removeFieldError]);
264
270
  var handleFieldChange = (0, _react.useCallback)(function (name, value, event) {
265
271
  var _extends5;
266
272
 
267
- var formValue = getFormValue();
273
+ var formValue = realFormValue;
268
274
  var nextFormValue = (0, _extends6.default)({}, formValue, (_extends5 = {}, _extends5[name] = value, _extends5));
269
275
  setFormValue(nextFormValue);
270
276
  onChange === null || onChange === void 0 ? void 0 : onChange(nextFormValue, event);
271
- }, [onChange, getFormValue]);
277
+ }, [realFormValue, setFormValue, onChange]);
272
278
  var rootRef = (0, _react.useRef)(null);
273
279
  var formContextValue = (0, _react.useMemo)(function () {
274
280
  return {
@@ -279,7 +285,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
279
285
  readOnly: readOnly,
280
286
  plaintext: plaintext,
281
287
  disabled: disabled,
282
- formError: getFormError(),
288
+ formError: realFormError,
283
289
  removeFieldValue: removeFieldValue,
284
290
  removeFieldError: removeFieldError,
285
291
  pushFieldRule: pushFieldRule,
@@ -288,7 +294,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
288
294
  onFieldError: handleFieldError,
289
295
  onFieldSuccess: handleFieldSuccess
290
296
  };
291
- }, [getCombinedModel, checkTrigger, formDefaultValue, errorFromContext, readOnly, plaintext, disabled, getFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
297
+ }, [getCombinedModel, checkTrigger, formDefaultValue, errorFromContext, readOnly, plaintext, disabled, realFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
292
298
  return /*#__PURE__*/_react.default.createElement("form", (0, _extends6.default)({}, rest, {
293
299
  ref: rootRef,
294
300
  onSubmit: handleSubmit,
@@ -127,6 +127,7 @@ var MultiCascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
127
127
  columnData = _useColumnData.columnData,
128
128
  setColumnData = _useColumnData.setColumnData,
129
129
  addColumn = _useColumnData.addColumn,
130
+ romoveColumnByIndex = _useColumnData.romoveColumnByIndex,
130
131
  enforceUpdateColumnData = _useColumnData.enforceUpdateColumnData;
131
132
 
132
133
  (0, _utils3.useUpdateEffect)(function () {
@@ -210,7 +211,8 @@ var MultiCascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
210
211
  var _node$childrenKey, _node$childrenKey2, _triggerRef$current, _triggerRef$current$u;
211
212
 
212
213
  setSelectedPaths(cascadePaths);
213
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event); // Lazy load node's children
214
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
215
+ var columnIndex = cascadePaths.length; // Lazy load node's children
214
216
 
215
217
  if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0) {
216
218
  node.loading = true;
@@ -223,21 +225,24 @@ var MultiCascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
223
225
 
224
226
  if (targetRef.current) {
225
227
  addFlattenData(data, node);
226
- addColumn(data, cascadePaths.length);
228
+ addColumn(data, columnIndex);
227
229
  }
228
230
  });
229
231
  } else {
230
232
  node.loading = false;
231
233
  node[childrenKey] = children;
232
234
  addFlattenData(children, node);
233
- addColumn(children, cascadePaths.length);
235
+ addColumn(children, columnIndex);
234
236
  }
235
237
  } else if ((_node$childrenKey2 = node[childrenKey]) !== null && _node$childrenKey2 !== void 0 && _node$childrenKey2.length) {
236
- addColumn(node[childrenKey], cascadePaths.length);
238
+ addColumn(node[childrenKey], columnIndex);
239
+ } else {
240
+ // Removes subsequent columns of the current column when the clicked node is a leaf node.
241
+ romoveColumnByIndex(columnIndex);
237
242
  }
238
243
 
239
244
  (_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);
240
- }, [onSelect, getChildren, childrenKey, addColumn, addFlattenData]);
245
+ }, [onSelect, getChildren, childrenKey, addFlattenData, addColumn, romoveColumnByIndex]);
241
246
  var handleCheck = (0, _react.useCallback)(function (node, event, checked) {
242
247
  var nodeValue = node[valueKey];
243
248
  var nextValue = [];
@@ -48,6 +48,7 @@ export declare function useFlattenData(data: ItemDataType[], itemKeys: ItemKeys)
48
48
  export declare function useColumnData(flattenData: ItemType[]): {
49
49
  columnData: ItemDataType<string | number>[][];
50
50
  addColumn: (column: ItemDataType[], index: number) => void;
51
+ romoveColumnByIndex: (index: number) => void;
51
52
  setColumnData: import("react").Dispatch<import("react").SetStateAction<ItemDataType<string | number>[][]>>;
52
53
  enforceUpdateColumnData: (nextData: ItemDataType[]) => void;
53
54
  };
@@ -234,6 +234,15 @@ function useColumnData(flattenData) {
234
234
  function addColumn(column, index) {
235
235
  setColumnData([].concat((0, _slice.default)(columnData, 0, index), [column]));
236
236
  }
237
+ /**
238
+ * Remove subsequent columns of the specified column
239
+ * @param index
240
+ */
241
+
242
+
243
+ function romoveColumnByIndex(index) {
244
+ setColumnData([].concat((0, _slice.default)(columnData, 0, index)));
245
+ }
237
246
 
238
247
  function enforceUpdateColumnData(nextData) {
239
248
  var nextFlattenData = (0, _treeUtils.flattenTree)(nextData);
@@ -245,6 +254,7 @@ function useColumnData(flattenData) {
245
254
  return {
246
255
  columnData: columnData,
247
256
  addColumn: addColumn,
257
+ romoveColumnByIndex: romoveColumnByIndex,
248
258
  setColumnData: setColumnData,
249
259
  enforceUpdateColumnData: enforceUpdateColumnData
250
260
  };
@@ -59,10 +59,19 @@ export interface OverlayTriggerProps extends StandardProps, AnimationEventProps
59
59
  /** Callback fired when open component */
60
60
  onOpen?: () => void;
61
61
  /** Callback fired when close component */
62
- onClose?: () => void;
62
+ onClose?: (cause?: OverlayCloseCause) => void;
63
63
  /** Whether speaker to follow the cursor */
64
64
  followCursor?: boolean;
65
65
  }
66
+ /**
67
+ * The reason that triggers closing of an overlay
68
+ * - Clicking outside of the overlay
69
+ * - Direct invocation of triggerRef.current.close()
70
+ */
71
+ export declare enum OverlayCloseCause {
72
+ ClickOutside = 0,
73
+ ImperativeHandle = 1
74
+ }
66
75
  export interface OverlayTriggerInstance {
67
76
  root: HTMLElement | undefined;
68
77
  updatePosition: () => void;
@@ -5,7 +5,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
5
5
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
6
 
7
7
  exports.__esModule = true;
8
- exports.default = void 0;
8
+ exports.default = exports.OverlayCloseCause = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
@@ -49,6 +49,12 @@ function mergeEvents(events, props) {
49
49
  return nextEvents;
50
50
  }
51
51
 
52
+ /**
53
+ * The reason that triggers closing of an overlay
54
+ * - Clicking outside of the overlay
55
+ * - Direct invocation of triggerRef.current.close()
56
+ */
57
+ var OverlayCloseCause;
52
58
  /**
53
59
  * Useful for mouseover and mouseout.
54
60
  * In order to resolve the node entering the mouseover element, a mouseout event and a mouseover event will be triggered.
@@ -56,6 +62,14 @@ function mergeEvents(events, props) {
56
62
  * @param handler
57
63
  * @param event
58
64
  */
65
+
66
+ exports.OverlayCloseCause = OverlayCloseCause;
67
+
68
+ (function (OverlayCloseCause) {
69
+ OverlayCloseCause[OverlayCloseCause["ClickOutside"] = 0] = "ClickOutside";
70
+ OverlayCloseCause[OverlayCloseCause["ImperativeHandle"] = 1] = "ImperativeHandle";
71
+ })(OverlayCloseCause || (exports.OverlayCloseCause = OverlayCloseCause = {}));
72
+
59
73
  function onMouseEventHandler(handler, event, delay) {
60
74
  var target = event.currentTarget;
61
75
  var related = event.relatedTarget || (0, _get.default)(event, ['nativeEvent', 'toElement']);
@@ -153,17 +167,19 @@ var OverlayTrigger = /*#__PURE__*/_react.default.forwardRef(function (props, ref
153
167
 
154
168
  setOpen(true);
155
169
  }, [delayOpen, setOpen]);
156
- var handleClose = (0, _react.useCallback)(function (delay) {
170
+ var handleClose = (0, _react.useCallback)(function (delay, callback) {
157
171
  var ms = (0, _isUndefined2.default)(delay) ? delayClose : delay;
158
172
 
159
173
  if (ms && typeof ms === 'number') {
160
174
  return delayCloseTimer.current = setTimeout(function () {
161
175
  delayCloseTimer.current = null;
162
176
  setOpen(false);
177
+ callback === null || callback === void 0 ? void 0 : callback();
163
178
  }, ms);
164
179
  }
165
180
 
166
181
  setOpen(false);
182
+ callback === null || callback === void 0 ? void 0 : callback();
167
183
  }, [delayClose, setOpen]);
168
184
  var handleExited = (0, _react.useCallback)(function () {
169
185
  setCursorPosition(null);
@@ -181,7 +197,11 @@ var OverlayTrigger = /*#__PURE__*/_react.default.forwardRef(function (props, ref
181
197
  },
182
198
 
183
199
  open: handleOpen,
184
- close: handleClose,
200
+ close: function close(delay) {
201
+ return handleClose(delay, function () {
202
+ return onClose === null || onClose === void 0 ? void 0 : onClose(OverlayCloseCause.ImperativeHandle);
203
+ });
204
+ },
185
205
  updatePosition: function updatePosition() {
186
206
  var _overlayRef$current2, _overlayRef$current2$;
187
207
 
@@ -342,7 +362,9 @@ var OverlayTrigger = /*#__PURE__*/_react.default.forwardRef(function (props, ref
342
362
  var overlayProps = (0, _extends2.default)({}, rest, {
343
363
  rootClose: rootClose,
344
364
  triggerTarget: triggerRef,
345
- onClose: trigger !== 'none' ? (0, _utils.createChainedFunction)(handleClose, onClose) : undefined,
365
+ onClose: trigger !== 'none' ? (0, _utils.createChainedFunction)(handleClose, function () {
366
+ return onClose === null || onClose === void 0 ? void 0 : onClose(OverlayCloseCause.ClickOutside);
367
+ }) : undefined,
346
368
  onExited: (0, _utils.createChainedFunction)(followCursor ? handleExited : undefined, onExited),
347
369
  placement: placement,
348
370
  container: container,
@@ -15,6 +15,7 @@ export interface PickerToggleProps extends ToggleButtonProps {
15
15
  readOnly?: boolean;
16
16
  plaintext?: boolean;
17
17
  tabIndex?: number;
18
+ loading?: boolean;
18
19
  editable?: boolean;
19
20
  inputPlaceholder?: string;
20
21
  inputMask?: (string | RegExp)[];
@@ -33,6 +33,10 @@ var _TextMask = _interopRequireDefault(require("../MaskedInput/TextMask"));
33
33
 
34
34
  var _deprecatePropType = _interopRequireDefault(require("../utils/deprecatePropType"));
35
35
 
36
+ var _Loader = _interopRequireDefault(require("../Loader"));
37
+
38
+ var _Stack = _interopRequireDefault(require("../Stack"));
39
+
36
40
  var _templateObject, _templateObject2;
37
41
 
38
42
  var defaultInputMask = [];
@@ -52,6 +56,8 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
52
56
  plaintext = props.plaintext,
53
57
  hasValue = props.hasValue,
54
58
  editable = props.editable,
59
+ _props$loading = props.loading,
60
+ loading = _props$loading === void 0 ? false : _props$loading,
55
61
  cleanableProp = props.cleanable,
56
62
  _props$tabIndex = props.tabIndex,
57
63
  tabIndexProp = _props$tabIndex === void 0 ? editable ? -1 : 0 : _props$tabIndex,
@@ -74,7 +80,7 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
74
80
  _props$caretAs = props.caretAs,
75
81
  caretAs = _props$caretAs === void 0 ? caretComponent : _props$caretAs,
76
82
  label = props.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"]);
83
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "editable", "loading", "cleanable", "tabIndex", "id", "value", "inputPlaceholder", "inputValue", "inputMask", "onInputChange", "onInputPressEnter", "onInputBlur", "onInputFocus", "onClean", "onFocus", "onBlur", "placement", "caretComponent", "caretAs", "label"]);
78
84
  var inputRef = (0, _react.useRef)(null);
79
85
  var comboboxRef = (0, _react.useRef)(null);
80
86
 
@@ -106,7 +112,9 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
106
112
  active: activeProp || activeState
107
113
  }));
108
114
  var handleFocus = (0, _react.useCallback)(function (event) {
109
- setActive(true);
115
+ if (!loading) {
116
+ setActive(true);
117
+ }
110
118
 
111
119
  if (editable) {
112
120
  // Avoid firing the onFocus event twice when DatePicker and DateRangePicker allow keyboard input.
@@ -123,7 +131,7 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
123
131
  } else {
124
132
  onFocus === null || onFocus === void 0 ? void 0 : onFocus(event);
125
133
  }
126
- }, [editable, onFocus]);
134
+ }, [editable, loading, onFocus]);
127
135
  var handleBlur = (0, _react.useCallback)(function (event) {
128
136
  if (inputRef.current && !editable) {
129
137
  setActive(false);
@@ -198,7 +206,17 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
198
206
  onFocus: !disabled ? handleFocus : null // The debounce is set to 200 to solve the flicker caused by the switch between input and div.
199
207
  ,
200
208
  onBlur: !disabled ? (0, _debounce.default)(handleBlur, 200) : null
201
- }), /*#__PURE__*/_react.default.createElement(_TextMask.default, {
209
+ }), /*#__PURE__*/_react.default.createElement(_Stack.default, null, label && /*#__PURE__*/_react.default.createElement(_Stack.default.Item, null, /*#__PURE__*/_react.default.createElement("span", {
210
+ className: prefix('label')
211
+ }, label)), /*#__PURE__*/_react.default.createElement(_Stack.default.Item, {
212
+ grow: 1
213
+ }, loading ? /*#__PURE__*/_react.default.createElement(_Loader.default, {
214
+ style: {
215
+ display: 'block',
216
+ padding: '1px 0'
217
+ },
218
+ "data-testid": "spinner"
219
+ }) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_TextMask.default, {
202
220
  mask: inputMask,
203
221
  value: Array.isArray(inputValue) ? inputValue.toString() : inputValue,
204
222
  onBlur: handleInputBlur,
@@ -219,9 +237,7 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
219
237
  }), children ? /*#__PURE__*/_react.default.createElement("span", {
220
238
  className: prefix(hasValue ? 'value' : 'placeholder'),
221
239
  "aria-placeholder": typeof children === 'string' ? children : undefined
222
- }, label && /*#__PURE__*/_react.default.createElement("span", {
223
- className: prefix('label')
224
- }, label), children) : null, showCleanButton && /*#__PURE__*/_react.default.createElement(_CloseButton.default, {
240
+ }, children) : null)), showCleanButton && /*#__PURE__*/_react.default.createElement(_CloseButton.default, {
225
241
  className: prefix(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["clean"]))),
226
242
  tabIndex: -1,
227
243
  locale: {
@@ -230,7 +246,7 @@ var PickerToggle = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
230
246
  onClick: handleClean
231
247
  }), caret && /*#__PURE__*/_react.default.createElement(Caret, {
232
248
  className: prefix(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)(["caret"])))
233
- }));
249
+ })));
234
250
  });
235
251
 
236
252
  PickerToggle.displayName = 'PickerToggle';
@@ -3,7 +3,7 @@ import { OverlayTriggerInstance, OverlayTriggerProps, OverlayTriggerType } from
3
3
  import { PositionChildProps } from '../Overlay/Position';
4
4
  import { TypeAttributes, AnimationEventProps } from '../@types/common';
5
5
  export type { OverlayTriggerInstance, PositionChildProps };
6
- export interface PickerToggleTriggerProps extends Omit<AnimationEventProps, 'onEntering' | 'onExiting'>, Pick<OverlayTriggerProps, 'speaker'> {
6
+ export interface PickerToggleTriggerProps extends Omit<AnimationEventProps, 'onEntering' | 'onExiting'>, Pick<OverlayTriggerProps, 'speaker' | 'onClose'> {
7
7
  placement?: TypeAttributes.Placement;
8
8
  pickerProps: any;
9
9
  open?: boolean;
@@ -21,7 +21,7 @@ var _CustomProvider = require("../CustomProvider");
21
21
 
22
22
  var omitTriggerPropKeys = ['onEntered', 'onExited', 'onEnter', 'onEntering', 'onExit', 'onExiting', 'open', 'defaultOpen', 'onHide', 'container', 'containerPadding', 'preventOverflow'];
23
23
  exports.omitTriggerPropKeys = omitTriggerPropKeys;
24
- var pickTriggerPropKeys = [].concat(omitTriggerPropKeys, ['disabled', 'plaintext', 'readOnly']);
24
+ var pickTriggerPropKeys = [].concat(omitTriggerPropKeys, ['disabled', 'plaintext', 'readOnly', 'loading']);
25
25
  exports.pickTriggerPropKeys = pickTriggerPropKeys;
26
26
 
27
27
  var PickerToggleTrigger = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
@@ -31,8 +31,10 @@ var PickerToggleTrigger = /*#__PURE__*/_react.default.forwardRef(function (props
31
31
  _props$trigger = props.trigger,
32
32
  trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
33
33
  rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["pickerProps", "speaker", "placement", "trigger"]);
34
+ var pickerTriggerProps = (0, _pick.default)(pickerProps, pickTriggerPropKeys);
34
35
  return /*#__PURE__*/_react.default.createElement(_CustomProvider.CustomConsumer, null, function (context) {
35
- return /*#__PURE__*/_react.default.createElement(_OverlayTrigger.default, (0, _extends2.default)({}, rest, (0, _pick.default)(pickerProps, pickTriggerPropKeys), {
36
+ return /*#__PURE__*/_react.default.createElement(_OverlayTrigger.default, (0, _extends2.default)({}, rest, pickerTriggerProps, {
37
+ disabled: pickerTriggerProps.disabled || pickerTriggerProps.loading,
36
38
  ref: ref,
37
39
  trigger: trigger,
38
40
  placement: (0, _utils.placementPolyfill)(placement, context === null || context === void 0 ? void 0 : context.rtl),
@@ -6,6 +6,8 @@ import { FormControlPickerProps, ItemDataType } from '../@types/common';
6
6
  export interface SelectProps<T> {
7
7
  /** Set group condition key in data */
8
8
  groupBy?: string;
9
+ /** Whether to display an loading indicator on toggle button */
10
+ loading?: boolean;
9
11
  /** Whether dispaly search input box */
10
12
  searchable?: boolean;
11
13
  /** Whether using virtualized list */
@@ -3,7 +3,6 @@ import { PickerLocale } from '../locales';
3
3
  import { PickerComponent, PickerToggleProps } from '../Picker';
4
4
  import { TreeDragProps, TreeBaseProps } from '../Tree/Tree';
5
5
  import { FormControlPickerProps, ItemDataType } from '../@types/common';
6
- export declare const maxTreeHeight = 320;
7
6
  export interface TreePickerProps<T = number | string> extends TreeBaseProps<T, ItemDataType>, TreeDragProps, FormControlPickerProps<T, PickerLocale, ItemDataType>, Pick<PickerToggleProps, 'caretAs'> {
8
7
  /** The height of Dropdown */
9
8
  height?: number;
@@ -5,7 +5,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
5
5
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
6
 
7
7
  exports.__esModule = true;
8
- exports.default = exports.maxTreeHeight = void 0;
8
+ exports.default = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
@@ -37,9 +37,6 @@ var _Picker = require("../Picker");
37
37
 
38
38
  var _TreeContext = _interopRequireDefault(require("../Tree/TreeContext"));
39
39
 
40
- // default value for virtualized
41
- var maxTreeHeight = 320;
42
- exports.maxTreeHeight = maxTreeHeight;
43
40
  var emptyArray = [];
44
41
 
45
42
  var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
@@ -55,13 +52,15 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
55
52
  overrideLocale = props.locale,
56
53
  _props$height = props.height,
57
54
  height = _props$height === void 0 ? 360 : _props$height,
55
+ _props$menuMaxHeight = props.menuMaxHeight,
56
+ menuMaxHeight = _props$menuMaxHeight === void 0 ? 320 : _props$menuMaxHeight,
57
+ menuStyle = props.menuStyle,
58
58
  className = props.className,
59
59
  disabled = props.disabled,
60
60
  _props$placement = props.placement,
61
61
  placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
62
62
  _props$cleanable = props.cleanable,
63
63
  cleanable = _props$cleanable === void 0 ? true : _props$cleanable,
64
- menuStyle = props.menuStyle,
65
64
  _props$searchable = props.searchable,
66
65
  searchable = _props$searchable === void 0 ? true : _props$searchable,
67
66
  _props$virtualized = props.virtualized,
@@ -114,7 +113,7 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
114
113
  renderExtraFooter = props.renderExtraFooter,
115
114
  renderMenu = props.renderMenu,
116
115
  renderValue = props.renderValue,
117
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "data", "appearance", "style", "showIndentLine", "value", "locale", "height", "className", "disabled", "placement", "cleanable", "menuStyle", "searchable", "virtualized", "classPrefix", "defaultValue", "placeholder", "searchKeyword", "menuClassName", "menuAutoWidth", "searchBy", "toggleAs", "labelKey", "valueKey", "childrenKey", "draggable", "defaultExpandAll", "disabledItemValues", "expandItemValues", "defaultExpandItemValues", "id", "listProps", "getChildren", "renderTreeIcon", "renderTreeNode", "onExit", "onExited", "onClean", "onOpen", "onSearch", "onSelect", "onChange", "onEntered", "onClose", "onDragEnd", "onDragStart", "onDragEnter", "onDragLeave", "onDragOver", "onDrop", "onExpand", "renderExtraFooter", "renderMenu", "renderValue"]);
116
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "data", "appearance", "style", "showIndentLine", "value", "locale", "height", "menuMaxHeight", "menuStyle", "className", "disabled", "placement", "cleanable", "searchable", "virtualized", "classPrefix", "defaultValue", "placeholder", "searchKeyword", "menuClassName", "menuAutoWidth", "searchBy", "toggleAs", "labelKey", "valueKey", "childrenKey", "draggable", "defaultExpandAll", "disabledItemValues", "expandItemValues", "defaultExpandItemValues", "id", "listProps", "getChildren", "renderTreeIcon", "renderTreeNode", "onExit", "onExited", "onClean", "onOpen", "onSearch", "onSelect", "onChange", "onEntered", "onClose", "onDragEnd", "onDragStart", "onDragEnter", "onDragLeave", "onDragOver", "onDrop", "onExpand", "renderExtraFooter", "renderMenu", "renderValue"]);
118
117
  var triggerRef = (0, _react.useRef)(null);
119
118
  var targetRef = (0, _react.useRef)(null);
120
119
  var listRef = (0, _react.useRef)(null);
@@ -502,13 +501,16 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
502
501
  var nullValue = null;
503
502
  var target = event.target; // exclude searchBar
504
503
 
505
- if (target.matches('div[role="searchbox"] > input')) {
504
+ if (target.matches('div[role="searchbox"] > input') || disabled || !cleanable) {
506
505
  return;
507
506
  }
508
507
 
509
- setValue(null);
508
+ if (!isControlled) {
509
+ setValue(null);
510
+ }
511
+
510
512
  onChange === null || onChange === void 0 ? void 0 : onChange(nullValue, event);
511
- }, [onChange, setValue]);
513
+ }, [cleanable, disabled, onChange, setValue, isControlled]);
512
514
  var onPickerKeydown = (0, _Picker.useToggleKeyDownEvent)((0, _extends2.default)({
513
515
  toggle: !activeNode || !active,
514
516
  triggerRef: triggerRef,
@@ -644,7 +646,7 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
644
646
  }, /*#__PURE__*/_react.default.createElement("div", {
645
647
  className: treePrefix('nodes')
646
648
  }, virtualized ? /*#__PURE__*/_react.default.createElement(_VirtualizedList.AutoSizer, {
647
- defaultHeight: inline ? height : maxTreeHeight,
649
+ defaultHeight: inline ? height : menuMaxHeight,
648
650
  style: {
649
651
  width: 'auto',
650
652
  height: 'auto'
@@ -673,13 +675,10 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
673
675
  left: left,
674
676
  top: top
675
677
  });
676
- var styles = virtualized ? (0, _extends2.default)({
677
- height: height
678
- }, mergedMenuStyle) : (0, _extends2.default)({}, mergedMenuStyle);
679
678
  return /*#__PURE__*/_react.default.createElement(_Picker.PickerOverlay, {
680
679
  autoWidth: menuAutoWidth,
681
680
  className: classes,
682
- style: styles,
681
+ style: mergedMenuStyle,
683
682
  ref: (0, _utils.mergeRefs)(overlayRef, speakerRef),
684
683
  onKeyDown: onPickerKeydown,
685
684
  target: triggerRef