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
@@ -36,7 +36,7 @@ interface TransitionState {
36
36
  }
37
37
  export declare const transitionPropTypes: {
38
38
  animation: PropTypes.Requireable<boolean>;
39
- children: PropTypes.Requireable<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
39
+ children: PropTypes.Requireable<string | number | boolean | ((...args: any[]) => any) | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
40
40
  className: PropTypes.Requireable<string>;
41
41
  in: PropTypes.Requireable<boolean>;
42
42
  unmountOnExit: PropTypes.Requireable<boolean>;
@@ -59,7 +59,7 @@ declare type EventToken = {
59
59
  declare class Transition extends React.Component<TransitionProps, TransitionState> {
60
60
  static propTypes: {
61
61
  animation: PropTypes.Requireable<boolean>;
62
- children: PropTypes.Requireable<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
62
+ children: PropTypes.Requireable<string | number | boolean | ((...args: any[]) => any) | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
63
63
  className: PropTypes.Requireable<string>;
64
64
  in: PropTypes.Requireable<boolean>;
65
65
  unmountOnExit: PropTypes.Requireable<boolean>;
@@ -94,6 +94,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
94
94
  valueToPaths = _usePaths.valueToPaths,
95
95
  columnData = _usePaths.columnData,
96
96
  addColumn = _usePaths.addColumn,
97
+ romoveColumnByIndex = _usePaths.romoveColumnByIndex,
97
98
  setValueToPaths = _usePaths.setValueToPaths,
98
99
  setColumnData = _usePaths.setColumnData,
99
100
  setSelectedPaths = _usePaths.setSelectedPaths,
@@ -257,9 +258,10 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
257
258
  var handleSelect = function handleSelect(node, cascadePaths, isLeafNode, event) {
258
259
  var _node$childrenKey, _node$childrenKey2, _triggerRef$current2;
259
260
 
260
- var nextValue = node[valueKey];
261
261
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
262
- setSelectedPaths(cascadePaths); // Lazy load node's children
262
+ setSelectedPaths(cascadePaths);
263
+ var nextValue = node[valueKey];
264
+ var columnIndex = cascadePaths.length; // Lazy load node's children
263
265
 
264
266
  if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0) {
265
267
  node.loading = true;
@@ -271,16 +273,19 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
271
273
  node[childrenKey] = data;
272
274
 
273
275
  if (targetRef.current) {
274
- addColumn(data, cascadePaths.length);
276
+ addColumn(data, columnIndex);
275
277
  }
276
278
  });
277
279
  } else {
278
280
  node.loading = false;
279
281
  node[childrenKey] = children;
280
- addColumn(children, cascadePaths.length);
282
+ addColumn(children, columnIndex);
281
283
  }
282
284
  } else if ((_node$childrenKey2 = node[childrenKey]) !== null && _node$childrenKey2 !== void 0 && _node$childrenKey2.length) {
283
- addColumn(node[childrenKey], cascadePaths.length);
285
+ addColumn(node[childrenKey], columnIndex);
286
+ } else {
287
+ // Removes subsequent columns of the current column when the clicked node is a leaf node.
288
+ romoveColumnByIndex(columnIndex);
284
289
  }
285
290
 
286
291
  if (isLeafNode) {
@@ -14,4 +14,5 @@ export declare function usePaths(props: CascaderProps): {
14
14
  setColumnData: import("react").Dispatch<import("react").SetStateAction<ItemDataType<string | number>[][]>>;
15
15
  setSelectedPaths: import("react").Dispatch<import("react").SetStateAction<ItemDataType<string | number>[]>>;
16
16
  addColumn: (column: ItemDataType[], index: number) => void;
17
+ romoveColumnByIndex: (index: number) => void;
17
18
  };
@@ -111,6 +111,15 @@ export function usePaths(props) {
111
111
  function addColumn(column, index) {
112
112
  setColumnData([].concat(slice(columnData, 0, index), [column]));
113
113
  }
114
+ /**
115
+ * Remove subsequent columns of the specified column
116
+ * @param index
117
+ */
118
+
119
+
120
+ function romoveColumnByIndex(index) {
121
+ setColumnData([].concat(slice(columnData, 0, index)));
122
+ }
114
123
  /**
115
124
  * Enforce update of columns and paths.
116
125
  * @param nextValue Selected value
@@ -146,6 +155,7 @@ export function usePaths(props) {
146
155
  setValueToPaths: setValueToPaths,
147
156
  setColumnData: setColumnData,
148
157
  setSelectedPaths: setSelectedPaths,
149
- addColumn: addColumn
158
+ addColumn: addColumn,
159
+ romoveColumnByIndex: romoveColumnByIndex
150
160
  };
151
161
  }
@@ -6,18 +6,17 @@ import _omit from "lodash/omit";
6
6
  import _isFunction from "lodash/isFunction";
7
7
  import _pick from "lodash/pick";
8
8
  import _isNil from "lodash/isNil";
9
- import React, { useState, useRef, useEffect, useCallback, useContext } from 'react';
9
+ import React, { useState, useRef, useEffect, useCallback, useContext, useMemo } from 'react';
10
10
  import PropTypes from 'prop-types';
11
11
  import classNames from 'classnames';
12
12
  import { List, AutoSizer } from '../Picker/VirtualizedList';
13
13
  import CheckTreeNode from './CheckTreeNode';
14
14
  import TreeContext from '../Tree/TreeContext';
15
15
  import { getTreeNodeIndent } from '../utils/treeUtils';
16
- import { createChainedFunction, useCustom, useClassNames, useControlled, KEY_VALUES, mergeRefs, shallowEqual } from '../utils';
16
+ import { createChainedFunction, useCustom, useClassNames, useControlled, KEY_VALUES, mergeRefs } from '../utils';
17
17
  import { PickerToggle, onMenuKeyDown as _onMenuKeyDown, PickerOverlay, SearchBar, SelectedElement, PickerToggleTrigger, createConcatChildrenFunction, usePickerClassName, usePublicMethods, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes, useToggleKeyDownEvent } from '../Picker';
18
18
  import { isEveryChildChecked, isSomeNodeHasChildren, isAllSiblingNodeUncheckable, isEveryFirstLevelNodeUncheckable, getFormattedTree, getDisabledState, getCheckTreePickerDefaultValue, getSelectedItems, isNodeUncheckable } from './utils';
19
19
  import { hasVisibleChildren, getExpandWhenSearching, useTreeSearch, useTreeNodeRefs, getDefaultExpandItemValues, useFlattenTreeData, focusNextItem, getFocusableItems, focusPreviousItem, toggleExpand, getActiveItem, useGetTreeNodeChildren, focusToActiveTreeNode, focusTreeNode, leftArrowHandler, rightArrowHandler, isSearching } from '../utils/treeUtils';
20
- import { maxTreeHeight } from '../TreePicker/TreePicker';
21
20
  var emptyArray = [];
22
21
  var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
23
22
  var _props$as = props.as,
@@ -60,6 +59,8 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
60
59
  defaultExpandItemValues = _props$defaultExpandI === void 0 ? emptyArray : _props$defaultExpandI,
61
60
  _props$height = props.height,
62
61
  height = _props$height === void 0 ? 360 : _props$height,
62
+ _props$menuMaxHeight = props.menuMaxHeight,
63
+ menuMaxHeight = _props$menuMaxHeight === void 0 ? 320 : _props$menuMaxHeight,
63
64
  menuStyle = props.menuStyle,
64
65
  _props$searchable = props.searchable,
65
66
  searchable = _props$searchable === void 0 ? true : _props$searchable,
@@ -91,7 +92,7 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
91
92
  renderValue = props.renderValue,
92
93
  renderTreeIcon = props.renderTreeIcon,
93
94
  renderTreeNode = props.renderTreeNode,
94
- rest = _objectWithoutPropertiesLoose(props, ["as", "data", "style", "appearance", "cleanable", "countable", "searchBy", "toggleAs", "searchKeyword", "showIndentLine", "locale", "cascade", "disabled", "valueKey", "labelKey", "placement", "childrenKey", "placeholder", "value", "defaultValue", "defaultExpandAll", "disabledItemValues", "expandItemValues", "defaultExpandItemValues", "height", "menuStyle", "searchable", "virtualized", "className", "classPrefix", "menuClassName", "menuAutoWidth", "uncheckableItemValues", "id", "listProps", "renderMenu", "getChildren", "renderExtraFooter", "onEntered", "onChange", "onClean", "onClose", "onExited", "onSearch", "onSelect", "onOpen", "onScroll", "onExpand", "renderValue", "renderTreeIcon", "renderTreeNode"]);
95
+ rest = _objectWithoutPropertiesLoose(props, ["as", "data", "style", "appearance", "cleanable", "countable", "searchBy", "toggleAs", "searchKeyword", "showIndentLine", "locale", "cascade", "disabled", "valueKey", "labelKey", "placement", "childrenKey", "placeholder", "value", "defaultValue", "defaultExpandAll", "disabledItemValues", "expandItemValues", "defaultExpandItemValues", "height", "menuMaxHeight", "menuStyle", "searchable", "virtualized", "className", "classPrefix", "menuClassName", "menuAutoWidth", "uncheckableItemValues", "id", "listProps", "renderMenu", "getChildren", "renderExtraFooter", "onEntered", "onChange", "onClean", "onClose", "onExited", "onSearch", "onSelect", "onOpen", "onScroll", "onExpand", "renderValue", "renderTreeIcon", "renderTreeNode"]);
95
96
 
96
97
  var _useContext = useContext(TreeContext),
97
98
  inline = _useContext.inline;
@@ -221,11 +222,11 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
221
222
  value: node[valueKey],
222
223
  label: node[labelKey],
223
224
  layer: layer,
224
- focus: shallowEqual(focusItemValue, node[valueKey]),
225
+ focus: focusItemValue === node[valueKey],
225
226
  expand: node.expand,
226
227
  visible: node.visible,
227
228
  loading: loadingNodeValues.some(function (item) {
228
- return shallowEqual(item, node[valueKey]);
229
+ return item === node[valueKey];
229
230
  }),
230
231
  disabled: getDisabledState(flattenNodes, node, {
231
232
  disabledItemValues: disabledItemValues,
@@ -363,18 +364,6 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
363
364
  onChange === null || onChange === void 0 ? void 0 : onChange(selectedValues, event);
364
365
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, selectedValues, event);
365
366
  }, [cascade, valueKey, flattenNodes, isControlled, uncheckableItemValues, setValue, onChange, onSelect, toggleChecked, unSerializeList]);
366
-
367
- var hasValue = function hasValue() {
368
- var selectedValues = Object.keys(flattenNodes).map(function (refKey) {
369
- return flattenNodes[refKey][valueKey];
370
- }).filter(function (item) {
371
- return value.some(function (v) {
372
- return shallowEqual(v, item);
373
- });
374
- });
375
- return !!selectedValues.length;
376
- };
377
-
378
367
  var handleOpen = useCallback(function () {
379
368
  var _triggerRef$current, _triggerRef$current$o;
380
369
 
@@ -426,22 +415,26 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
426
415
  var handleClean = useCallback(function (event) {
427
416
  var target = event.target; // exclude searchBar
428
417
 
429
- if (target.matches('div[role="searchbox"] > input')) {
418
+ if (target.matches('div[role="searchbox"] > input') || disabled || !cleanable) {
430
419
  return;
431
420
  }
432
421
 
433
422
  setActiveNode(null);
434
- setValue([]);
435
423
  setFocusItemValue(null);
436
- unSerializeList({
437
- nodes: flattenNodes,
438
- key: 'check',
439
- value: [],
440
- cascade: cascade,
441
- uncheckableItemValues: uncheckableItemValues
442
- });
424
+
425
+ if (!isControlled) {
426
+ setValue([]);
427
+ unSerializeList({
428
+ nodes: flattenNodes,
429
+ key: 'check',
430
+ value: [],
431
+ cascade: cascade,
432
+ uncheckableItemValues: uncheckableItemValues
433
+ });
434
+ }
435
+
443
436
  onChange === null || onChange === void 0 ? void 0 : onChange([], event);
444
- }, [cascade, flattenNodes, onChange, setValue, unSerializeList, uncheckableItemValues]);
437
+ }, [cascade, cleanable, disabled, flattenNodes, onChange, setValue, unSerializeList, uncheckableItemValues, isControlled]);
445
438
  var handleFocusItem = useCallback(function (key) {
446
439
  var focusableItems = getFocusableItems(filteredData, {
447
440
  disabledItemValues: disabledItemValues,
@@ -567,7 +560,7 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
567
560
 
568
561
  var nodeProps = _extends({}, getTreeNodeProps(_extends({}, node, {
569
562
  /**
570
- * spread operator dont copy unenumerable properties
563
+ * spread operator don't copy unenumerable properties
571
564
  * so we need to copy them manually
572
565
  */
573
566
  parent: node.parent,
@@ -620,6 +613,11 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
620
613
  var expand = getExpandWhenSearching(searchKeywordState, expandItemValues.includes(node[valueKey]));
621
614
 
622
615
  var nodeProps = _extends({}, getTreeNodeProps(_extends({}, node, {
616
+ /**
617
+ * spread operator don't copy unenumerable properties
618
+ * so we need to copy them manually
619
+ */
620
+ parent: node.parent,
623
621
  expand: expand
624
622
  }), layer), {
625
623
  hasChildren: node.hasChildren
@@ -665,7 +663,7 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
665
663
  }, /*#__PURE__*/React.createElement("div", {
666
664
  className: treeNodesClass
667
665
  }, virtualized ? /*#__PURE__*/React.createElement(AutoSizer, {
668
- defaultHeight: inline ? height : maxTreeHeight,
666
+ defaultHeight: inline ? height : menuMaxHeight,
669
667
  style: {
670
668
  width: 'auto',
671
669
  height: 'auto'
@@ -696,13 +694,10 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
696
694
  top: top
697
695
  });
698
696
 
699
- var styles = virtualized ? _extends({
700
- height: height
701
- }, mergedMenuStyle) : _extends({}, mergedMenuStyle);
702
697
  return /*#__PURE__*/React.createElement(PickerOverlay, {
703
698
  autoWidth: menuAutoWidth,
704
699
  className: classes,
705
- style: styles,
700
+ style: mergedMenuStyle,
706
701
  ref: mergeRefs(overlayRef, speakerRef),
707
702
  onKeyDown: onPickerKeydown,
708
703
  target: triggerRef
@@ -713,16 +708,18 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
713
708
  inputRef: searchInputRef
714
709
  }) : null, renderMenu ? renderMenu(renderCheckTree()) : renderCheckTree(), renderExtraFooter === null || renderExtraFooter === void 0 ? void 0 : renderExtraFooter());
715
710
  };
711
+
712
+ var selectedItems = useMemo(function () {
713
+ return getSelectedItems(flattenNodes, value);
714
+ }, [flattenNodes, value]);
716
715
  /**
717
716
  * 1.Have a value and the value is valid.
718
717
  * 2.Regardless of whether the value is valid, as long as renderValue is set, it is judged to have a value.
719
718
  */
720
719
 
721
-
722
- var hasValidValue = hasValue() || value.length > 0 && _isFunction(renderValue);
720
+ var hasValidValue = selectedItems.length > 0 || value.length > 0 && _isFunction(renderValue);
723
721
 
724
722
  var selectedElement = placeholder;
725
- var selectedItems = getSelectedItems(flattenNodes, value, valueKey);
726
723
 
727
724
  if (hasValidValue) {
728
725
  selectedElement = /*#__PURE__*/React.createElement(SelectedElement, {
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { CheckTreePickerProps } from './CheckTreePicker';
2
+ import { CheckTreePickerProps, ValueType } from './CheckTreePicker';
3
3
  import { CheckStateType } from '../utils';
4
4
  export interface TreeNodeType {
5
5
  uncheckable?: boolean;
@@ -40,5 +40,5 @@ export declare function isNodeUncheckable(node: any, props: Required<Pick<CheckT
40
40
  export declare function getFormattedTree(data: any[], nodes: TreeNodesType, props: Required<Pick<CheckTreePickerProps, 'childrenKey' | 'cascade'>>): any[];
41
41
  export declare function getDisabledState(nodes: TreeNodesType, node: TreeNodeType, props: Required<Pick<CheckTreePickerProps, 'disabledItemValues' | 'valueKey'>>): boolean;
42
42
  export declare function getCheckTreePickerDefaultValue(value: any[], uncheckableItemValues: any[]): any[];
43
- export declare function getSelectedItems(nodes: TreeNodesType, value: (string | number)[], valueKey: string): TreeNodeType[];
43
+ export declare function getSelectedItems(nodes: TreeNodesType, values: ValueType): TreeNodeType[];
44
44
  export declare function getNodeCheckState({ nodes, node, cascade, childrenKey }: any): CheckStateType;
@@ -1,8 +1,8 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _isUndefined from "lodash/isUndefined";
3
3
  import _isNil from "lodash/isNil";
4
- import { shallowEqual, CHECK_STATE } from '../utils';
5
- import { getChildrenByFlattenNodes } from '../utils/treeUtils';
4
+ import { CHECK_STATE } from '../utils';
5
+ import { getChildrenByFlattenNodes, getNodeFormattedRefKey } from '../utils/treeUtils';
6
6
  import { attachParent } from '../utils/attachParent';
7
7
  export function isEveryChildChecked(nodes, parent) {
8
8
  if (_isNil(parent.refKey) || _isNil(nodes[parent.refKey])) {
@@ -98,7 +98,7 @@ export function isNodeUncheckable(node, props) {
98
98
  uncheckableItemValues = _props$uncheckableIte === void 0 ? [] : _props$uncheckableIte,
99
99
  valueKey = props.valueKey;
100
100
  return uncheckableItemValues.some(function (value) {
101
- return shallowEqual(node[valueKey], value);
101
+ return node[valueKey] === value;
102
102
  });
103
103
  }
104
104
  export function getFormattedTree(data, nodes, props) {
@@ -142,7 +142,7 @@ export function getDisabledState(nodes, node, props) {
142
142
  }
143
143
 
144
144
  return disabledItemValues.some(function (value) {
145
- return node.refKey && shallowEqual(nodes[node.refKey][valueKey], value);
145
+ return node.refKey && nodes[node.refKey][valueKey] === value;
146
146
  });
147
147
  }
148
148
  export function getCheckTreePickerDefaultValue(value, uncheckableItemValues) {
@@ -154,18 +154,17 @@ export function getCheckTreePickerDefaultValue(value, uncheckableItemValues) {
154
154
 
155
155
  return [];
156
156
  }
157
- export function getSelectedItems(nodes, value, valueKey) {
158
- var checkItems = [];
159
- Object.keys(nodes).map(function (refKey) {
157
+ export function getSelectedItems(nodes, values) {
158
+ var checkedItems = [];
159
+ values.forEach(function (value) {
160
+ var refKey = getNodeFormattedRefKey(value);
160
161
  var node = nodes[refKey];
161
162
 
162
- if (value.some(function (value) {
163
- return shallowEqual(node[valueKey], value);
164
- })) {
165
- checkItems.push(node);
163
+ if (!_isNil(node)) {
164
+ checkedItems.push(node);
166
165
  }
167
166
  });
168
- return checkItems;
167
+ return checkedItems;
169
168
  }
170
169
  export function getNodeCheckState(_ref) {
171
170
  var nodes = _ref.nodes,
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import * as helpers from 'dom-lib';
2
3
  export * from 'dom-lib';
3
4
  declare const DOMHelper: {
@@ -10,8 +11,8 @@ declare const DOMHelper: {
10
11
  removeClass: (target: Element, className: string) => Element;
11
12
  hasClass: (target: Element, className: string) => boolean;
12
13
  toggleClass: (target: Element, className: string) => Element;
13
- cancelAnimationFramePolyfill: typeof clearTimeout;
14
- requestAnimationFramePolyfill: typeof requestAnimationFrame;
14
+ cancelAnimationFramePolyfill: typeof cancelAnimationFrame | typeof clearTimeout;
15
+ requestAnimationFramePolyfill: typeof requestAnimationFrame | ((callback: (t: number) => void) => NodeJS.Timeout);
15
16
  getAnimationEnd: typeof helpers.getAnimationEnd;
16
17
  ownerDocument: (node: Element | null) => Document;
17
18
  ownerWindow: (componentOrElement: Element) => Window;
@@ -12,6 +12,7 @@ import useCalendarDate from '../Calendar/useCalendarDate';
12
12
  import Toolbar from './Toolbar';
13
13
  import { composeFunctions, createChainedFunction, DateUtils, mergeRefs, useClassNames, useControlled, useCustom } from '../utils';
14
14
  import { PickerOverlay, pickerPropTypes, PickerToggle, PickerToggleTrigger, pickTriggerPropKeys, omitTriggerPropKeys, usePickerClassName, usePublicMethods, useToggleKeyDownEvent } from '../Picker';
15
+ import { OverlayCloseCause } from '../Overlay/OverlayTrigger';
15
16
  var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
16
17
  var _props$as = props.as,
17
18
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -390,6 +391,13 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
390
391
  pickerProps: pick(props, pickTriggerPropKeys),
391
392
  ref: triggerRef,
392
393
  placement: placement,
394
+ onClose: function onClose(cause) {
395
+ // Unless overlay is closing on user clicking "OK" button,
396
+ // reset the selected date on calendar panel
397
+ if (cause !== OverlayCloseCause.ImperativeHandle) {
398
+ resetCalendarDate();
399
+ }
400
+ },
393
401
  onEntered: createChainedFunction(handleEntered, onEntered),
394
402
  onExited: createChainedFunction(handleExited, onExited),
395
403
  speaker: renderDropdownMenu
@@ -29,6 +29,11 @@ var PredefinedRanges = /*#__PURE__*/React.forwardRef(function (props, ref) {
29
29
  return item.label === key;
30
30
  });
31
31
  }, [calendarDate]);
32
+
33
+ if (ranges.length === 0) {
34
+ return null;
35
+ }
36
+
32
37
  return /*#__PURE__*/React.createElement(Stack, _extends({
33
38
  className: className,
34
39
  ref: ref,
@@ -573,6 +573,12 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
573
573
  onToggleMeridian: handleToggleMeridian,
574
574
  renderTitle: renderTitle
575
575
  };
576
+ var sideRanges = (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
577
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'left';
578
+ })) || [];
579
+ var bottomRanges = ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
580
+ return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
581
+ });
576
582
  return /*#__PURE__*/React.createElement(PickerOverlay, {
577
583
  role: "dialog",
578
584
  className: classes,
@@ -583,13 +589,11 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
583
589
  className: panelClasses
584
590
  }, /*#__PURE__*/React.createElement(Stack, {
585
591
  alignItems: "flex-start"
586
- }, /*#__PURE__*/React.createElement(PredefinedRanges, {
592
+ }, sideRanges.length > 0 && /*#__PURE__*/React.createElement(PredefinedRanges, {
587
593
  direction: "column",
588
594
  spacing: 0,
589
595
  className: prefix('daterange-predefined'),
590
- ranges: (ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
591
- return (range === null || range === void 0 ? void 0 : range.placement) === 'left';
592
- })) || [],
596
+ ranges: sideRanges,
593
597
  calendarDate: calendarDate,
594
598
  locale: locale,
595
599
  disabledShortcut: disabledShortcutButton,
@@ -612,9 +616,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
612
616
  hideOkBtn: oneTap,
613
617
  onOk: handleOK,
614
618
  onClickShortcut: handleShortcutPageDate,
615
- ranges: ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
616
- return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
617
- })
619
+ ranges: bottomRanges
618
620
  })))));
619
621
  };
620
622
 
package/esm/Form/Form.js CHANGED
@@ -1,8 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useMemo, useCallback, useState, useImperativeHandle, useRef } from 'react';
3
+ import React, { useMemo, useCallback, useImperativeHandle, useRef } from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import isUndefined from 'lodash/isUndefined';
6
5
  import omit from 'lodash/omit';
7
6
  import { SchemaModel } from 'schema-typed';
8
7
  import FormContext, { FormValueContext } from './FormContext';
@@ -13,6 +12,7 @@ import FormGroup from '../FormGroup';
13
12
  import FormHelpText from '../FormHelpText';
14
13
  import { useFormClassNames } from './useFormClassNames';
15
14
  import useSchemaModel from './useSchemaModel';
15
+ import { useControlled } from '../utils';
16
16
  var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
17
17
  var _props$checkTrigger = props.checkTrigger,
18
18
  checkTrigger = _props$checkTrigger === void 0 ? 'change' : _props$checkTrigger,
@@ -55,20 +55,18 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
55
55
  disabled: disabled
56
56
  });
57
57
 
58
- var _useState = useState(formDefaultValue),
59
- _formValue = _useState[0],
60
- setFormValue = _useState[1];
58
+ var _useControlled = useControlled(formValue, formDefaultValue),
59
+ realFormValue = _useControlled[0],
60
+ setFormValue = _useControlled[1];
61
61
 
62
- var _useState2 = useState(formError || {}),
63
- _formError = _useState2[0],
64
- setFormError = _useState2[1];
62
+ var _useControlled2 = useControlled(formError, {}),
63
+ realFormError = _useControlled2[0],
64
+ setFormError = _useControlled2[1];
65
65
 
66
- var getFormValue = useCallback(function () {
67
- return isUndefined(formValue) ? _formValue : formValue;
68
- }, [_formValue, formValue]);
69
- var getFormError = useCallback(function () {
70
- return isUndefined(formError) ? _formError : formError;
71
- }, [formError, _formError]);
66
+ var realFormValueRef = useRef(realFormValue);
67
+ realFormValueRef.current = realFormValue;
68
+ var realFormErrorRef = useRef(realFormError);
69
+ realFormErrorRef.current = realFormError;
72
70
  /**
73
71
  * Validate the form data and return a boolean.
74
72
  * The error message after verification is returned in the callback.
@@ -76,7 +74,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
76
74
  */
77
75
 
78
76
  var check = useCallback(function (callback) {
79
- var formValue = getFormValue() || {};
77
+ var formValue = realFormValue || {};
80
78
  var formError = {};
81
79
  var errorCount = 0;
82
80
  var model = getCombinedModel();
@@ -98,7 +96,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
98
96
  }
99
97
 
100
98
  return true;
101
- }, [getFormValue, getCombinedModel, onCheck, onError]);
99
+ }, [realFormValue, getCombinedModel, setFormError, onCheck, onError]);
102
100
  /**
103
101
  * Check the data field
104
102
  * @param fieldName
@@ -108,11 +106,11 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
108
106
  var checkForField = useCallback(function (fieldName, callback) {
109
107
  var _extends2;
110
108
 
111
- var formValue = getFormValue() || {};
109
+ var formValue = realFormValue || {};
112
110
  var model = getCombinedModel();
113
111
  var checkResult = model.checkForField(fieldName, formValue);
114
112
 
115
- var formError = _extends({}, getFormError(), (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
113
+ var formError = _extends({}, realFormError, (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
116
114
 
117
115
  setFormError(formError);
118
116
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
@@ -123,13 +121,13 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
123
121
  }
124
122
 
125
123
  return !checkResult.hasError;
126
- }, [getFormValue, getCombinedModel, getFormError, onCheck, onError]);
124
+ }, [realFormValue, getCombinedModel, realFormError, setFormError, onCheck, onError]);
127
125
  /**
128
126
  * Check form data asynchronously and return a Promise
129
127
  */
130
128
 
131
129
  var checkAsync = useCallback(function () {
132
- var formValue = getFormValue() || {};
130
+ var formValue = realFormValue || {};
133
131
  var promises = [];
134
132
  var keys = [];
135
133
  var model = getCombinedModel();
@@ -160,19 +158,19 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
160
158
  formError: formError
161
159
  };
162
160
  });
163
- }, [getFormValue, getCombinedModel, onCheck, onError]);
161
+ }, [realFormValue, getCombinedModel, onCheck, setFormError, onError]);
164
162
  /**
165
163
  * Asynchronously check form fields and return Promise
166
164
  * @param fieldName
167
165
  */
168
166
 
169
167
  var checkForFieldAsync = useCallback(function (fieldName) {
170
- var formValue = getFormValue() || {};
168
+ var formValue = realFormValue || {};
171
169
  var model = getCombinedModel();
172
170
  return model.checkForFieldAsync(fieldName, formValue).then(function (checkResult) {
173
171
  var _extends3;
174
172
 
175
- var formError = _extends({}, getFormError(), (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
173
+ var formError = _extends({}, realFormError, (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
176
174
 
177
175
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
178
176
  setFormError(formError);
@@ -183,20 +181,20 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
183
181
 
184
182
  return checkResult;
185
183
  });
186
- }, [getFormValue, getCombinedModel, getFormError, onCheck, onError]);
184
+ }, [realFormValue, getCombinedModel, realFormError, onCheck, setFormError, onError]);
187
185
  var cleanErrors = useCallback(function () {
188
186
  setFormError({});
189
- }, []);
187
+ }, [setFormError]);
190
188
  var cleanErrorForField = useCallback(function (fieldName) {
191
- setFormError(omit(_formError, [fieldName]));
192
- }, [_formError]);
189
+ setFormError(omit(realFormError, [fieldName]));
190
+ }, [realFormError, setFormError]);
193
191
  var resetErrors = useCallback(function (formError) {
194
192
  if (formError === void 0) {
195
193
  formError = {};
196
194
  }
197
195
 
198
196
  setFormError(formError);
199
- }, []);
197
+ }, [setFormError]);
200
198
  useImperativeHandle(ref, function () {
201
199
  return {
202
200
  root: rootRef.current,
@@ -210,15 +208,23 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
210
208
  };
211
209
  });
212
210
  var removeFieldError = useCallback(function (name) {
213
- var formError = omit(getFormError(), [name]);
211
+ /**
212
+ * when this function is called when the children component is unmount, it's an old render frame
213
+ * so use Ref to get future error
214
+ */
215
+ var formError = omit(realFormErrorRef.current, [name]);
214
216
  setFormError(formError);
215
217
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
216
- }, [getFormError, onCheck]);
218
+ }, [onCheck, setFormError]);
217
219
  var removeFieldValue = useCallback(function (name) {
218
- var formValue = omit(getFormValue(), [name]);
220
+ /**
221
+ * when this function is called when the children component is unmount, it's an old render frame
222
+ * so use Ref to get future value
223
+ */
224
+ var formValue = omit(realFormValueRef.current, [name]);
219
225
  setFormValue(formValue);
220
226
  onChange === null || onChange === void 0 ? void 0 : onChange(formValue);
221
- }, [getFormValue, onChange]);
227
+ }, [onChange, setFormValue]);
222
228
  var handleSubmit = useCallback(function (event) {
223
229
  if (disabled || readOnly || plaintext) {
224
230
  return;
@@ -232,25 +238,25 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
232
238
  var handleFieldError = useCallback(function (name, errorMessage) {
233
239
  var _extends4;
234
240
 
235
- var formError = _extends({}, getFormError(), (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
241
+ var formError = _extends({}, realFormError, (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
236
242
 
237
243
  setFormError(formError);
238
244
  onError === null || onError === void 0 ? void 0 : onError(formError);
239
245
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
240
- }, [onError, onCheck, getFormError]);
246
+ }, [realFormError, setFormError, onError, onCheck]);
241
247
  var handleFieldSuccess = useCallback(function (name) {
242
248
  removeFieldError(name);
243
249
  }, [removeFieldError]);
244
250
  var handleFieldChange = useCallback(function (name, value, event) {
245
251
  var _extends5;
246
252
 
247
- var formValue = getFormValue();
253
+ var formValue = realFormValue;
248
254
 
249
255
  var nextFormValue = _extends({}, formValue, (_extends5 = {}, _extends5[name] = value, _extends5));
250
256
 
251
257
  setFormValue(nextFormValue);
252
258
  onChange === null || onChange === void 0 ? void 0 : onChange(nextFormValue, event);
253
- }, [onChange, getFormValue]);
259
+ }, [realFormValue, setFormValue, onChange]);
254
260
  var rootRef = useRef(null);
255
261
  var formContextValue = useMemo(function () {
256
262
  return {
@@ -261,7 +267,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
261
267
  readOnly: readOnly,
262
268
  plaintext: plaintext,
263
269
  disabled: disabled,
264
- formError: getFormError(),
270
+ formError: realFormError,
265
271
  removeFieldValue: removeFieldValue,
266
272
  removeFieldError: removeFieldError,
267
273
  pushFieldRule: pushFieldRule,
@@ -270,7 +276,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
270
276
  onFieldError: handleFieldError,
271
277
  onFieldSuccess: handleFieldSuccess
272
278
  };
273
- }, [getCombinedModel, checkTrigger, formDefaultValue, errorFromContext, readOnly, plaintext, disabled, getFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
279
+ }, [getCombinedModel, checkTrigger, formDefaultValue, errorFromContext, readOnly, plaintext, disabled, realFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
274
280
  return /*#__PURE__*/React.createElement("form", _extends({}, rest, {
275
281
  ref: rootRef,
276
282
  onSubmit: handleSubmit,