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.
- package/CHANGELOG.md +30 -0
- package/Picker/styles/index.less +4 -0
- package/cjs/Animation/Transition.d.ts +2 -2
- package/cjs/Cascader/Cascader.js +10 -5
- package/cjs/Cascader/utils.d.ts +1 -0
- package/cjs/Cascader/utils.js +11 -1
- package/cjs/CheckTreePicker/CheckTreePicker.js +32 -36
- package/cjs/CheckTreePicker/utils.d.ts +2 -2
- package/cjs/CheckTreePicker/utils.js +9 -10
- package/cjs/DOMHelper/index.d.ts +3 -2
- package/cjs/DatePicker/DatePicker.js +9 -0
- package/cjs/DatePicker/PredefinedRanges.js +5 -0
- package/cjs/DateRangePicker/DateRangePicker.js +9 -7
- package/cjs/Form/Form.js +44 -38
- package/cjs/MultiCascader/MultiCascader.js +10 -5
- package/cjs/MultiCascader/utils.d.ts +1 -0
- package/cjs/MultiCascader/utils.js +10 -0
- package/cjs/Overlay/OverlayTrigger.d.ts +10 -1
- package/cjs/Overlay/OverlayTrigger.js +26 -4
- package/cjs/Picker/PickerToggle.d.ts +1 -0
- package/cjs/Picker/PickerToggle.js +24 -8
- package/cjs/Picker/PickerToggleTrigger.d.ts +1 -1
- package/cjs/Picker/PickerToggleTrigger.js +4 -2
- package/cjs/SelectPicker/SelectPicker.d.ts +2 -0
- package/cjs/TreePicker/TreePicker.d.ts +0 -1
- package/cjs/TreePicker/TreePicker.js +13 -14
- package/cjs/locales/fr_FR.d.ts +105 -0
- package/cjs/locales/fr_FR.js +84 -0
- package/cjs/locales/index.d.ts +1 -0
- package/cjs/locales/index.js +6 -2
- package/cjs/utils/treeUtils.d.ts +7 -1
- package/cjs/utils/treeUtils.js +24 -5
- package/dist/rsuite-rtl.css +3 -0
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +3 -0
- package/dist/rsuite.js +64 -64
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/Animation/Transition.d.ts +2 -2
- package/esm/Cascader/Cascader.js +10 -5
- package/esm/Cascader/utils.d.ts +1 -0
- package/esm/Cascader/utils.js +11 -1
- package/esm/CheckTreePicker/CheckTreePicker.js +34 -37
- package/esm/CheckTreePicker/utils.d.ts +2 -2
- package/esm/CheckTreePicker/utils.js +11 -12
- package/esm/DOMHelper/index.d.ts +3 -2
- package/esm/DatePicker/DatePicker.js +8 -0
- package/esm/DatePicker/PredefinedRanges.js +5 -0
- package/esm/DateRangePicker/DateRangePicker.js +9 -7
- package/esm/Form/Form.js +44 -38
- package/esm/MultiCascader/MultiCascader.js +10 -5
- package/esm/MultiCascader/utils.d.ts +1 -0
- package/esm/MultiCascader/utils.js +10 -0
- package/esm/Overlay/OverlayTrigger.d.ts +10 -1
- package/esm/Overlay/OverlayTrigger.js +23 -3
- package/esm/Picker/PickerToggle.d.ts +1 -0
- package/esm/Picker/PickerToggle.js +22 -8
- package/esm/Picker/PickerToggleTrigger.d.ts +1 -1
- package/esm/Picker/PickerToggleTrigger.js +4 -2
- package/esm/SelectPicker/SelectPicker.d.ts +2 -0
- package/esm/TreePicker/TreePicker.d.ts +0 -1
- package/esm/TreePicker/TreePicker.js +13 -13
- package/esm/locales/fr_FR.d.ts +105 -0
- package/esm/locales/fr_FR.js +74 -0
- package/esm/locales/index.d.ts +1 -0
- package/esm/locales/index.js +2 -1
- package/esm/utils/treeUtils.d.ts +7 -1
- package/esm/utils/treeUtils.js +22 -5
- package/locales/fr_FR/package.json +7 -0
- 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 |
|
|
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 |
|
|
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>;
|
package/esm/Cascader/Cascader.js
CHANGED
|
@@ -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);
|
|
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,
|
|
276
|
+
addColumn(data, columnIndex);
|
|
275
277
|
}
|
|
276
278
|
});
|
|
277
279
|
} else {
|
|
278
280
|
node.loading = false;
|
|
279
281
|
node[childrenKey] = children;
|
|
280
|
-
addColumn(children,
|
|
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],
|
|
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) {
|
package/esm/Cascader/utils.d.ts
CHANGED
|
@@ -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
|
};
|
package/esm/Cascader/utils.js
CHANGED
|
@@ -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
|
|
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:
|
|
225
|
+
focus: focusItemValue === node[valueKey],
|
|
225
226
|
expand: node.expand,
|
|
226
227
|
visible: node.visible,
|
|
227
228
|
loading: loadingNodeValues.some(function (item) {
|
|
228
|
-
return
|
|
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
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
|
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 :
|
|
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:
|
|
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,
|
|
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 {
|
|
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
|
|
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 &&
|
|
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,
|
|
158
|
-
var
|
|
159
|
-
|
|
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 (
|
|
163
|
-
|
|
164
|
-
})) {
|
|
165
|
-
checkItems.push(node);
|
|
163
|
+
if (!_isNil(node)) {
|
|
164
|
+
checkedItems.push(node);
|
|
166
165
|
}
|
|
167
166
|
});
|
|
168
|
-
return
|
|
167
|
+
return checkedItems;
|
|
169
168
|
}
|
|
170
169
|
export function getNodeCheckState(_ref) {
|
|
171
170
|
var nodes = _ref.nodes,
|
package/esm/DOMHelper/index.d.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
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,
|
|
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
|
|
59
|
-
|
|
60
|
-
setFormValue =
|
|
58
|
+
var _useControlled = useControlled(formValue, formDefaultValue),
|
|
59
|
+
realFormValue = _useControlled[0],
|
|
60
|
+
setFormValue = _useControlled[1];
|
|
61
61
|
|
|
62
|
-
var
|
|
63
|
-
|
|
64
|
-
setFormError =
|
|
62
|
+
var _useControlled2 = useControlled(formError, {}),
|
|
63
|
+
realFormError = _useControlled2[0],
|
|
64
|
+
setFormError = _useControlled2[1];
|
|
65
65
|
|
|
66
|
-
var
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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 =
|
|
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
|
-
}, [
|
|
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 =
|
|
109
|
+
var formValue = realFormValue || {};
|
|
112
110
|
var model = getCombinedModel();
|
|
113
111
|
var checkResult = model.checkForField(fieldName, formValue);
|
|
114
112
|
|
|
115
|
-
var formError = _extends({},
|
|
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
|
-
}, [
|
|
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 =
|
|
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
|
-
}, [
|
|
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 =
|
|
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({},
|
|
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
|
-
}, [
|
|
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(
|
|
192
|
-
}, [
|
|
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
|
-
|
|
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
|
-
}, [
|
|
218
|
+
}, [onCheck, setFormError]);
|
|
217
219
|
var removeFieldValue = useCallback(function (name) {
|
|
218
|
-
|
|
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
|
-
}, [
|
|
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({},
|
|
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
|
|
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 =
|
|
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
|
-
}, [
|
|
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:
|
|
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,
|
|
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,
|