rsuite 6.0.1 → 6.1.1
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/Accordion/styles/index.scss +3 -0
- package/Animation/styles/_animation.scss +95 -0
- package/Animation/styles/_bounce.scss +36 -0
- package/Animation/styles/_collapse.scss +23 -0
- package/Animation/styles/_fade.scss +10 -0
- package/Animation/styles/_mixin.scss +15 -0
- package/Animation/styles/_slide.scss +34 -0
- package/Animation/styles/_variables.scss +4 -0
- package/Animation/styles/index.scss +8 -0
- package/AutoComplete/styles/index.scss +43 -0
- package/Avatar/styles/index.scss +48 -0
- package/AvatarGroup/styles/index.scss +27 -0
- package/Badge/styles/_variables.scss +48 -0
- package/Badge/styles/index.scss +111 -0
- package/Box/styles/index.scss +1 -0
- package/Breadcrumb/styles/index.scss +50 -0
- package/Button/styles/_mixin.scss +83 -0
- package/Button/styles/_variables.scss +38 -0
- package/Button/styles/index.scss +374 -0
- package/ButtonGroup/styles/index.scss +96 -0
- package/ButtonToolbar/styles/index.scss +9 -0
- package/CHANGELOG.md +31 -0
- package/Calendar/styles/_variables.scss +16 -0
- package/Calendar/styles/index.scss +673 -0
- package/Card/styles/index.scss +63 -0
- package/CardGroup/styles/index.scss +10 -0
- package/Carousel/styles/index.scss +204 -0
- package/CascadeTree/styles/_search.scss +39 -0
- package/CascadeTree/styles/index.scss +83 -0
- package/Cascader/styles/index.scss +5 -0
- package/Center/styles/index.scss +11 -0
- package/CheckPicker/styles/index.scss +23 -0
- package/CheckTree/styles/_variables.scss +5 -0
- package/CheckTree/styles/index.scss +121 -0
- package/CheckTreePicker/styles/index.scss +20 -0
- package/Checkbox/styles/_mixin.scss +5 -0
- package/Checkbox/styles/_variables.scss +4 -0
- package/Checkbox/styles/index.scss +158 -0
- package/CheckboxGroup/styles/index.scss +14 -0
- package/Col/styles/index.scss +2 -0
- package/Container/stories/styles.scss +23 -0
- package/Container/styles/index.scss +16 -0
- package/Content/styles/index.scss +6 -0
- package/DateInput/styles/index.scss +1 -0
- package/DatePicker/styles/_mixin.scss +10 -0
- package/DatePicker/styles/index.scss +171 -0
- package/DateRangeInput/styles/index.scss +1 -0
- package/DateRangePicker/styles/index.scss +151 -0
- package/Divider/styles/index.scss +85 -0
- package/Drawer/styles/_mixin.scss +23 -0
- package/Drawer/styles/_variables.scss +18 -0
- package/Drawer/styles/index.scss +244 -0
- package/Dropdown/styles/_mixin.scss +4 -0
- package/Dropdown/styles/_variables.scss +12 -0
- package/Dropdown/styles/index.scss +334 -0
- package/FlexboxGrid/styles/index.scss +82 -0
- package/Footer/styles/index.scss +5 -0
- package/Form/styles/index.scss +3 -0
- package/FormControl/styles/_variables.scss +4 -0
- package/FormControl/styles/index.scss +82 -0
- package/FormControlLabel/styles/index.scss +7 -0
- package/FormErrorMessage/styles/_animation.scss +43 -0
- package/FormErrorMessage/styles/_variables.scss +7 -0
- package/FormErrorMessage/styles/index.scss +146 -0
- package/FormGroup/styles/index.scss +75 -0
- package/FormHelpText/styles/index.scss +21 -0
- package/FormStack/styles/index.scss +15 -0
- package/Grid/styles/_columns.scss +23 -0
- package/Grid/styles/_mixin.scss +110 -0
- package/Grid/styles/_row.scss +44 -0
- package/Grid/styles/_variables.scss +6 -0
- package/Grid/styles/index.scss +115 -0
- package/Header/styles/index.scss +5 -0
- package/Heading/styles/_variables.scss +19 -0
- package/Heading/styles/index.scss +42 -0
- package/HeadingGroup/styles/index.scss +5 -0
- package/Highlight/styles/index.scss +9 -0
- package/IconButton/styles/index.scss +90 -0
- package/Image/styles/index.scss +36 -0
- package/InlineEdit/styles/index.scss +51 -0
- package/Input/styles/_mixin.scss +39 -0
- package/Input/styles/_variables.scss +27 -0
- package/Input/styles/index.scss +23 -0
- package/InputGroup/styles/index.scss +264 -0
- package/InputNumber/styles/index.scss +1 -0
- package/InputPicker/styles/_mixin.scss +7 -0
- package/InputPicker/styles/index.scss +64 -0
- package/Kbd/styles/_mixin.scss +24 -0
- package/Kbd/styles/_variables.scss +13 -0
- package/Kbd/styles/index.scss +21 -0
- package/Link/styles/index.scss +41 -0
- package/List/styles/index.scss +111 -0
- package/Loader/styles/_mixin.scss +37 -0
- package/Loader/styles/_variables.scss +19 -0
- package/Loader/styles/index.scss +120 -0
- package/Menu/styles/index.scss +109 -0
- package/Message/styles/index.scss +189 -0
- package/Modal/styles/_animation.scss +15 -0
- package/Modal/styles/_variables.scss +16 -0
- package/Modal/styles/index.scss +186 -0
- package/MultiCascadeTree/styles/index.scss +35 -0
- package/MultiCascader/styles/index.scss +3 -0
- package/Nav/styles/index.scss +383 -0
- package/Navbar/styles/index.scss +253 -0
- package/Notification/styles/index.scss +116 -0
- package/NumberInput/styles/_mixin.scss +11 -0
- package/NumberInput/styles/index.scss +78 -0
- package/Pagination/styles/_pagination-group.scss +52 -0
- package/Pagination/styles/index.scss +77 -0
- package/Panel/styles/index.scss +122 -0
- package/PanelGroup/styles/index.scss +34 -0
- package/PasswordInput/styles/index.scss +3 -0
- package/PasswordStrengthMeter/styles/index.scss +41 -0
- package/PinInput/styles/index.scss +93 -0
- package/Placeholder/styles/_mixin.scss +9 -0
- package/Placeholder/styles/index.scss +155 -0
- package/Popover/styles/index.scss +224 -0
- package/Popover/styles/mixins.scss +54 -0
- package/Progress/styles/_animation.scss +69 -0
- package/Progress/styles/_mixins.scss +6 -0
- package/Progress/styles/_progress-line.scss +343 -0
- package/Progress/styles/index.scss +3 -0
- package/ProgressCircle/styles/index.scss +2 -0
- package/ProgressCircle/styles/progress-circle.scss +49 -0
- package/Radio/styles/_mixin.scss +5 -0
- package/Radio/styles/_variables.scss +5 -0
- package/Radio/styles/index.scss +147 -0
- package/RadioGroup/styles/_variables.scss +10 -0
- package/RadioGroup/styles/index.scss +83 -0
- package/RadioTile/styles/index.scss +80 -0
- package/RadioTileGroup/styles/index.scss +1 -0
- package/RangeSlider/styles/index.scss +4 -0
- package/Rate/styles/index.scss +141 -0
- package/Row/styles/index.scss +2 -0
- package/SegmentedControl/styles/_mixin.scss +7 -0
- package/SegmentedControl/styles/_variables.scss +43 -0
- package/SegmentedControl/styles/index.scss +147 -0
- package/SelectPicker/styles/index.scss +44 -0
- package/Sidebar/styles/index.scss +17 -0
- package/Sidenav/styles/index.scss +635 -0
- package/Sidenav/styles/mixin.scss +23 -0
- package/Slider/styles/index.scss +298 -0
- package/Stack/styles/_variables.scss +11 -0
- package/Stack/styles/index.scss +79 -0
- package/Stat/styles/index.scss +126 -0
- package/StatGroup/styles/index.scss +10 -0
- package/Steps/styles/index.scss +222 -0
- package/Table/styles/index.scss +473 -0
- package/Table/styles/mixin.scss +8 -0
- package/Tabs/styles/index.scss +24 -0
- package/Tag/styles/_variables.scss +13 -0
- package/Tag/styles/index.scss +62 -0
- package/TagGroup/styles/index.scss +14 -0
- package/TagInput/styles/index.scss +5 -0
- package/TagPicker/styles/index.scss +141 -0
- package/Text/styles/index.scss +142 -0
- package/Text/styles/variables.scss +9 -0
- package/Textarea/styles/index.scss +9 -0
- package/TimePicker/styles/index.scss +1 -0
- package/TimeRangePicker/styles/index.scss +1 -0
- package/Timeline/stories/styles.scss +29 -0
- package/Timeline/styles/_mixin.scss +13 -0
- package/Timeline/styles/index.scss +187 -0
- package/Toggle/styles/index.scss +284 -0
- package/Tooltip/styles/index.scss +160 -0
- package/Tooltip/styles/mixins.scss +56 -0
- package/Tree/styles/_indent-line.scss +8 -0
- package/Tree/styles/_toggle.scss +32 -0
- package/Tree/styles/_variables.scss +8 -0
- package/Tree/styles/index.scss +184 -0
- package/TreePicker/styles/index.scss +16 -0
- package/Uploader/styles/_mixin.scss +11 -0
- package/Uploader/styles/index.scss +491 -0
- package/VisuallyHidden/styles/index.scss +11 -0
- package/cjs/Breadcrumb/BreadcrumbItem.js +12 -7
- package/cjs/CheckTree/CheckTree.js +3 -0
- package/cjs/CheckTree/CheckTreeView.js +7 -3
- package/cjs/CheckTree/hooks/useTreeCheckState.d.ts +1 -0
- package/cjs/CheckTree/hooks/useTreeCheckState.js +54 -3
- package/cjs/CheckTree/utils.d.ts +9 -2
- package/cjs/CheckTree/utils.js +70 -11
- package/cjs/CheckTreePicker/CheckTreePicker.js +1 -0
- package/cjs/Checkbox/Checkbox.js +2 -1
- package/cjs/Checkbox/hooks/useIndeterminateCheckbox.d.ts +19 -0
- package/cjs/Checkbox/hooks/useIndeterminateCheckbox.js +32 -0
- package/cjs/DateInput/DateInput.js +24 -0
- package/cjs/DateInput/hooks/useKeyboardInputEvent.d.ts +2 -1
- package/cjs/DateInput/hooks/useKeyboardInputEvent.js +14 -0
- package/cjs/DateRangeInput/DateRangeInput.js +24 -0
- package/cjs/DateRangePicker/DateRangePicker.js +6 -0
- package/cjs/Form/Form.js +5 -1
- package/cjs/Rate/Rate.d.ts +8 -0
- package/cjs/Rate/Rate.js +3 -1
- package/cjs/Tree/hooks/useFlattenTree.d.ts +4 -0
- package/cjs/Tree/hooks/useFlattenTree.js +22 -1
- package/cjs/Tree/hooks/useFocusTree.js +19 -1
- package/cjs/Tree/hooks/useVirtualizedTreeData.d.ts +1 -0
- package/cjs/Tree/hooks/useVirtualizedTreeData.js +5 -2
- package/cjs/Tree/utils/focusableTree.d.ts +8 -0
- package/cjs/Tree/utils/focusableTree.js +40 -2
- package/cjs/Tree/utils/index.d.ts +1 -1
- package/cjs/Tree/utils/index.js +3 -1
- package/cjs/internals/Picker/utils.d.ts +2 -0
- package/cjs/internals/Picker/utils.js +13 -1
- package/cjs/internals/StyledBox/StyledBox.d.ts +1 -1
- package/cjs/internals/StyledBox/StyledBox.js +2 -2
- package/dist/rsuite.js +52 -74
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.LICENSE.txt +0 -20
- package/dist/rsuite.min.js.map +1 -1
- package/esm/Breadcrumb/BreadcrumbItem.js +10 -5
- package/esm/CheckTree/CheckTree.js +3 -0
- package/esm/CheckTree/CheckTreeView.js +7 -3
- package/esm/CheckTree/hooks/useTreeCheckState.d.ts +1 -0
- package/esm/CheckTree/hooks/useTreeCheckState.js +55 -4
- package/esm/CheckTree/utils.d.ts +9 -2
- package/esm/CheckTree/utils.js +71 -12
- package/esm/CheckTreePicker/CheckTreePicker.js +1 -0
- package/esm/Checkbox/Checkbox.js +3 -2
- package/esm/Checkbox/hooks/useIndeterminateCheckbox.d.ts +19 -0
- package/esm/Checkbox/hooks/useIndeterminateCheckbox.js +29 -0
- package/esm/DateInput/DateInput.js +24 -0
- package/esm/DateInput/hooks/useKeyboardInputEvent.d.ts +2 -1
- package/esm/DateInput/hooks/useKeyboardInputEvent.js +14 -0
- package/esm/DateRangeInput/DateRangeInput.js +24 -0
- package/esm/DateRangePicker/DateRangePicker.js +6 -0
- package/esm/Form/Form.js +5 -1
- package/esm/Rate/Rate.d.ts +8 -0
- package/esm/Rate/Rate.js +3 -1
- package/esm/Tree/hooks/useFlattenTree.d.ts +4 -0
- package/esm/Tree/hooks/useFlattenTree.js +22 -1
- package/esm/Tree/hooks/useFocusTree.js +20 -2
- package/esm/Tree/hooks/useVirtualizedTreeData.d.ts +1 -0
- package/esm/Tree/hooks/useVirtualizedTreeData.js +5 -2
- package/esm/Tree/utils/focusableTree.d.ts +8 -0
- package/esm/Tree/utils/focusableTree.js +36 -0
- package/esm/Tree/utils/index.d.ts +1 -1
- package/esm/Tree/utils/index.js +1 -1
- package/esm/internals/Picker/utils.d.ts +2 -0
- package/esm/internals/Picker/utils.js +13 -1
- package/esm/internals/StyledBox/StyledBox.d.ts +1 -1
- package/esm/internals/StyledBox/StyledBox.js +2 -2
- package/internals/Box/styles/index.scss +31 -0
- package/internals/Burger/styles/index.scss +72 -0
- package/internals/CloseButton/styles/index.scss +14 -0
- package/internals/Picker/styles/_mixin.scss +219 -0
- package/internals/Picker/styles/_variables.scss +9 -0
- package/internals/Picker/styles/index.scss +476 -0
- package/internals/Ripple/styles/_mixins.scss +10 -0
- package/internals/Ripple/styles/index.scss +40 -0
- package/internals/ScrollView/styles/index.scss +77 -0
- package/internals/SearchBox/styles/index.scss +7 -0
- package/package.json +4 -4
- package/styles/_base.scss +37 -0
- package/styles/_css-reset.scss +345 -0
- package/styles/_themes.scss +132 -0
- package/styles/_variables.scss +48 -0
- package/styles/color-modes/_dark.scss +458 -0
- package/styles/color-modes/_high-contrast.scss +469 -0
- package/styles/color-modes/_light.scss +475 -0
- package/styles/colors/_colors-base.scss +39 -0
- package/styles/colors/_dark.scss +114 -0
- package/styles/colors/_high-contrast.scss +114 -0
- package/styles/colors/_light.scss +115 -0
- package/styles/colors/_palette.scss +413 -0
- package/styles/components.scss +114 -0
- package/styles/index.scss +2 -0
- package/styles/mixins/_color-modes.scss +20 -0
- package/styles/mixins/_combobox.scss +6 -0
- package/styles/mixins/_hacks.scss +33 -0
- package/styles/mixins/_input.scss +30 -0
- package/styles/mixins/_listbox.scss +70 -0
- package/styles/mixins/_menu.scss +12 -0
- package/styles/mixins/_utilities.scss +130 -0
- package/toaster/styles/animation.scss +54 -0
- package/toaster/styles/index.scss +109 -0
- package/useToaster/styles/index.scss +1 -0
|
@@ -8,15 +8,16 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
|
9
9
|
var _SafeAnchor = _interopRequireDefault(require("../internals/SafeAnchor"));
|
|
10
10
|
var _Box = _interopRequireDefault(require("../internals/Box"));
|
|
11
|
-
var _utils = require("../internals/utils");
|
|
11
|
+
var _utils = require("../internals/Box/utils");
|
|
12
|
+
var _utils2 = require("../internals/utils");
|
|
12
13
|
var _hooks = require("../internals/hooks");
|
|
13
14
|
/**
|
|
14
15
|
* The `<Breadcrumb.Item>` component is used to specify each section of the Breadcrumb.
|
|
15
16
|
* @see https://rsuitejs.com/components/breadcrumb
|
|
16
17
|
*/
|
|
17
|
-
const BreadcrumbItem = (0,
|
|
18
|
+
const BreadcrumbItem = (0, _utils2.forwardRef)((props, ref) => {
|
|
18
19
|
const {
|
|
19
|
-
wrapperAs = 'li',
|
|
20
|
+
wrapperAs: Wrapper = 'li',
|
|
20
21
|
href,
|
|
21
22
|
as: Component = href ? _SafeAnchor.default : 'span',
|
|
22
23
|
classPrefix = 'breadcrumb-item',
|
|
@@ -35,17 +36,21 @@ const BreadcrumbItem = (0, _utils.forwardRef)((props, ref) => {
|
|
|
35
36
|
withPrefix
|
|
36
37
|
} = (0, _hooks.useStyles)(classPrefix);
|
|
37
38
|
const classes = merge(className, withPrefix());
|
|
39
|
+
|
|
40
|
+
// Separate BoxProps for wrapper and other props for inner component
|
|
41
|
+
const boxProps = (0, _utils.extractBoxProps)(rest);
|
|
42
|
+
const componentProps = (0, _utils.omitBoxProps)(rest);
|
|
38
43
|
return /*#__PURE__*/_react.default.createElement(_Box.default, (0, _extends2.default)({
|
|
39
|
-
as:
|
|
44
|
+
as: Wrapper,
|
|
40
45
|
style: style,
|
|
41
46
|
className: classes,
|
|
42
|
-
ref: ref,
|
|
43
47
|
"data-active": active
|
|
44
|
-
},
|
|
48
|
+
}, boxProps), icon, active ? /*#__PURE__*/_react.default.createElement("span", null, children) : /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({
|
|
49
|
+
ref: ref,
|
|
45
50
|
href: href,
|
|
46
51
|
title: title,
|
|
47
52
|
target: target
|
|
48
|
-
}, children), separator);
|
|
53
|
+
}, componentProps), children), separator);
|
|
49
54
|
});
|
|
50
55
|
BreadcrumbItem.displayName = 'BreadcrumbItem';
|
|
51
56
|
var _default = exports.default = BreadcrumbItem;
|
|
@@ -30,6 +30,7 @@ const CheckTree = (0, _utils.forwardRef)((props, ref) => {
|
|
|
30
30
|
defaultExpandAll = false,
|
|
31
31
|
defaultExpandItemValues = [],
|
|
32
32
|
uncheckableItemValues,
|
|
33
|
+
disabledItemValues,
|
|
33
34
|
expandItemValues: controlledExpandItemValues,
|
|
34
35
|
childrenKey = 'children',
|
|
35
36
|
labelKey = 'label',
|
|
@@ -73,6 +74,7 @@ const CheckTree = (0, _utils.forwardRef)((props, ref) => {
|
|
|
73
74
|
const flattenedNodes = (0, _useFlattenTree.default)(treeData, {
|
|
74
75
|
...itemDataKeys,
|
|
75
76
|
uncheckableItemValues,
|
|
77
|
+
disabledItemValues,
|
|
76
78
|
multiple: true,
|
|
77
79
|
cascade,
|
|
78
80
|
value
|
|
@@ -102,6 +104,7 @@ const CheckTree = (0, _utils.forwardRef)((props, ref) => {
|
|
|
102
104
|
loadingNodeValues: loadingNodeValues,
|
|
103
105
|
flattenedNodes: flattenedNodes,
|
|
104
106
|
uncheckableItemValues: uncheckableItemValues,
|
|
107
|
+
disabledItemValues: disabledItemValues,
|
|
105
108
|
expandItemValues: expandItemValues,
|
|
106
109
|
onChange: handleChange,
|
|
107
110
|
onExpand: handleExpandTreeNode
|
|
@@ -84,7 +84,8 @@ const CheckTreeView = (0, _utils.forwardRef)((props, ref) => {
|
|
|
84
84
|
} = (0, _useTreeCheckState.default)({
|
|
85
85
|
cascade,
|
|
86
86
|
flattenedNodes,
|
|
87
|
-
uncheckableItemValues
|
|
87
|
+
uncheckableItemValues,
|
|
88
|
+
disabledItemValues
|
|
88
89
|
});
|
|
89
90
|
const handleSearchCallback = (value, _data, event) => {
|
|
90
91
|
onSearch === null || onSearch === void 0 || onSearch(value, event);
|
|
@@ -117,7 +118,8 @@ const CheckTreeView = (0, _utils.forwardRef)((props, ref) => {
|
|
|
117
118
|
const transformation = (0, _useVirtualizedTreeData.default)(flattenedNodes, filteredData, {
|
|
118
119
|
cascade,
|
|
119
120
|
expandItemValues,
|
|
120
|
-
searchKeyword: keyword
|
|
121
|
+
searchKeyword: keyword,
|
|
122
|
+
disabledItemValues
|
|
121
123
|
});
|
|
122
124
|
|
|
123
125
|
/**
|
|
@@ -130,7 +132,9 @@ const CheckTreeView = (0, _utils.forwardRef)((props, ref) => {
|
|
|
130
132
|
}
|
|
131
133
|
return (0, _utils3.getFormattedTree)(flattenedNodes, filteredData, {
|
|
132
134
|
childrenKey,
|
|
133
|
-
cascade
|
|
135
|
+
cascade,
|
|
136
|
+
disabledItemValues,
|
|
137
|
+
valueKey
|
|
134
138
|
}).map(node => render === null || render === void 0 ? void 0 : render(node, 1)).filter(item => item);
|
|
135
139
|
};
|
|
136
140
|
const getTreeNodeProps = (0, _useTreeNodeProps.default)({
|
|
@@ -14,7 +14,8 @@ function useTreeCheckState(props) {
|
|
|
14
14
|
const {
|
|
15
15
|
cascade,
|
|
16
16
|
flattenedNodes,
|
|
17
|
-
uncheckableItemValues
|
|
17
|
+
uncheckableItemValues,
|
|
18
|
+
disabledItemValues = []
|
|
18
19
|
} = props;
|
|
19
20
|
const {
|
|
20
21
|
valueKey,
|
|
@@ -29,7 +30,9 @@ function useTreeCheckState(props) {
|
|
|
29
30
|
} else {
|
|
30
31
|
if ((0, _utils.isEveryChildChecked)(currentNode, {
|
|
31
32
|
nodes,
|
|
32
|
-
childrenKey
|
|
33
|
+
childrenKey,
|
|
34
|
+
disabledItemValues,
|
|
35
|
+
valueKey
|
|
33
36
|
})) {
|
|
34
37
|
currentNode.check = true;
|
|
35
38
|
currentNode.checkAll = true;
|
|
@@ -43,16 +46,57 @@ function useTreeCheckState(props) {
|
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Recursively checks if a node has any disabled descendants.
|
|
52
|
+
* This is used to determine if a parent node's checkAll state should be true.
|
|
53
|
+
* If any descendant is disabled, checkAll must be false because not all descendants can be checked.
|
|
54
|
+
* @param nodes - The flattened tree node map
|
|
55
|
+
* @param node - The node to check for disabled descendants
|
|
56
|
+
* @returns true if any descendant (at any depth) is disabled, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
const hasDisabledDescendant = (0, _hooks.useEventCallback)((nodes, node) => {
|
|
59
|
+
if (!node[childrenKey] || !node[childrenKey].length) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return node[childrenKey].some(child => {
|
|
63
|
+
const isChildDisabled = (0, _utils.getDisabledState)(nodes, child, {
|
|
64
|
+
disabledItemValues,
|
|
65
|
+
valueKey
|
|
66
|
+
});
|
|
67
|
+
if (isChildDisabled) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
// Recursively check descendants
|
|
71
|
+
return hasDisabledDescendant(nodes, child);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
46
74
|
const checkChildNode = (0, _hooks.useEventCallback)((nodes, node, isChecked) => {
|
|
47
75
|
const currentNode = node.refKey ? nodes[node.refKey] : null;
|
|
48
76
|
if (!currentNode) {
|
|
49
77
|
return;
|
|
50
78
|
}
|
|
79
|
+
|
|
80
|
+
// Check if the current node is disabled
|
|
81
|
+
const isDisabled = (0, _utils.getDisabledState)(nodes, node, {
|
|
82
|
+
disabledItemValues,
|
|
83
|
+
valueKey
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Skip checking disabled nodes
|
|
87
|
+
if (isDisabled) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
51
90
|
currentNode.check = isChecked;
|
|
52
91
|
if (!currentNode[childrenKey] || !currentNode[childrenKey].length || !cascade) {
|
|
53
92
|
currentNode.checkAll = false;
|
|
54
93
|
} else {
|
|
55
|
-
|
|
94
|
+
// Check if any descendant (not just direct children) is disabled
|
|
95
|
+
const hasDisabledDesc = hasDisabledDescendant(nodes, currentNode);
|
|
96
|
+
|
|
97
|
+
// Only set checkAll to true if all descendants will be checked
|
|
98
|
+
// If there are any disabled descendants, checkAll should be false
|
|
99
|
+
currentNode.checkAll = isChecked && !hasDisabledDesc;
|
|
56
100
|
currentNode[childrenKey].forEach(child => {
|
|
57
101
|
checkChildNode(nodes, child, isChecked);
|
|
58
102
|
});
|
|
@@ -65,6 +109,13 @@ function useTreeCheckState(props) {
|
|
|
65
109
|
if (!(0, _isNil.default)(currentNode.parent) && !(0, _isNil.default)(currentNode.parent.refKey)) {
|
|
66
110
|
const parentNode = nodes[currentNode.parent.refKey];
|
|
67
111
|
if (currentNode.check) {
|
|
112
|
+
// Optimization: When a parent node is checked with checkAll=true, it represents
|
|
113
|
+
// the entire checked subtree. If the current node also has checkAll=true and its
|
|
114
|
+
// parent is checked, skip adding this node's value to avoid redundant representation.
|
|
115
|
+
// The parent's value already implies all descendants are checked.
|
|
116
|
+
if (currentNode.checkAll && parentNode.check) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
68
119
|
if (!(parentNode !== null && parentNode !== void 0 && parentNode.checkAll)) {
|
|
69
120
|
values.push(currentNode[valueKey]);
|
|
70
121
|
} else if (parentNode !== null && parentNode !== void 0 && parentNode.uncheckable) {
|
package/cjs/CheckTree/utils.d.ts
CHANGED
|
@@ -3,15 +3,19 @@ import { CheckStateType } from '../internals/constants';
|
|
|
3
3
|
import { TreeNode, TreeNodeMap } from '../internals/Tree/types';
|
|
4
4
|
/**
|
|
5
5
|
* Checks if every child of a given parent node is checked.
|
|
6
|
+
* Disabled children are ignored in this check.
|
|
6
7
|
*/
|
|
7
8
|
export declare function isEveryChildChecked(parent: TreeNode, options: {
|
|
8
9
|
nodes: TreeNodeMap;
|
|
9
10
|
childrenKey: string;
|
|
11
|
+
disabledItemValues?: any[];
|
|
12
|
+
valueKey?: string;
|
|
10
13
|
}): boolean;
|
|
11
14
|
/**
|
|
12
15
|
* Checks if any child node is checked.
|
|
16
|
+
* Disabled children are ignored in this check.
|
|
13
17
|
*/
|
|
14
|
-
export declare function isSomeChildChecked(nodes: TreeNodeMap, parent: TreeNode, childrenKey: string): boolean;
|
|
18
|
+
export declare function isSomeChildChecked(nodes: TreeNodeMap, parent: TreeNode, childrenKey: string, disabledItemValues?: any[], valueKey?: string): boolean;
|
|
15
19
|
/**
|
|
16
20
|
* Checks if any node in the data has a grandchild.
|
|
17
21
|
*/
|
|
@@ -28,9 +32,10 @@ export declare function isEveryFirstLevelNodeUncheckable(nodes: TreeNodeMap, unc
|
|
|
28
32
|
* Checks if a node is uncheckable.
|
|
29
33
|
*/
|
|
30
34
|
export declare function isNodeUncheckable(node: any, props: Required<Pick<CheckTreeProps, 'uncheckableItemValues' | 'valueKey'>>): boolean;
|
|
31
|
-
export declare function getFormattedTree(nodes: TreeNodeMap, data: any[], props: Required<Pick<CheckTreeProps, 'childrenKey' | 'cascade'>>): any[];
|
|
35
|
+
export declare function getFormattedTree(nodes: TreeNodeMap, data: any[], props: Required<Pick<CheckTreeProps, 'childrenKey' | 'cascade' | 'disabledItemValues' | 'valueKey'>>): any[];
|
|
32
36
|
/**
|
|
33
37
|
* Determines the disabled state of a tree node.
|
|
38
|
+
* If a parent node is disabled, all its children should also be disabled.
|
|
34
39
|
*/
|
|
35
40
|
export declare function getDisabledState(nodes: TreeNodeMap, node: TreeNode, props: Required<Pick<CheckTreeProps, 'disabledItemValues' | 'valueKey'>>): boolean;
|
|
36
41
|
/**
|
|
@@ -45,6 +50,8 @@ interface NodeCheckStateOptions {
|
|
|
45
50
|
nodes: TreeNodeMap;
|
|
46
51
|
cascade: boolean;
|
|
47
52
|
childrenKey: string;
|
|
53
|
+
disabledItemValues?: any[];
|
|
54
|
+
valueKey?: string;
|
|
48
55
|
}
|
|
49
56
|
/**
|
|
50
57
|
* Calculates the check state of a node in a check tree.
|
package/cjs/CheckTree/utils.js
CHANGED
|
@@ -21,6 +21,8 @@ var _utils = require("../internals/utils");
|
|
|
21
21
|
var _utils2 = require("../Tree/utils");
|
|
22
22
|
/**
|
|
23
23
|
* Retrieves the children of a given parent node from a flattened node map.
|
|
24
|
+
* Filters out uncheckable children.
|
|
25
|
+
* Note: Does NOT filter disabled children - disabled children are still considered in check state calculations
|
|
24
26
|
*/
|
|
25
27
|
function getChildrenByFlattenNodes(nodes, parent) {
|
|
26
28
|
if (!(0, _isNil2.default)(parent.refKey) && (0, _isNil2.default)(nodes[parent.refKey])) {
|
|
@@ -34,11 +36,14 @@ function getChildrenByFlattenNodes(nodes, parent) {
|
|
|
34
36
|
|
|
35
37
|
/**
|
|
36
38
|
* Checks if every child of a given parent node is checked.
|
|
39
|
+
* Disabled children are ignored in this check.
|
|
37
40
|
*/
|
|
38
41
|
function isEveryChildChecked(parent, options) {
|
|
39
42
|
const {
|
|
40
43
|
nodes,
|
|
41
|
-
childrenKey
|
|
44
|
+
childrenKey,
|
|
45
|
+
disabledItemValues = [],
|
|
46
|
+
valueKey = 'value'
|
|
42
47
|
} = options;
|
|
43
48
|
if ((0, _isNil2.default)(parent.refKey) || (0, _isNil2.default)(nodes[parent.refKey])) {
|
|
44
49
|
return false;
|
|
@@ -48,13 +53,32 @@ function isEveryChildChecked(parent, options) {
|
|
|
48
53
|
var _nodes$parent$refKey$;
|
|
49
54
|
return (_nodes$parent$refKey$ = nodes[parent.refKey].check) !== null && _nodes$parent$refKey$ !== void 0 ? _nodes$parent$refKey$ : false;
|
|
50
55
|
}
|
|
51
|
-
|
|
56
|
+
|
|
57
|
+
// Filter out disabled children
|
|
58
|
+
const enabledChildren = children.filter(child => {
|
|
59
|
+
const isDisabled = getDisabledState(nodes, child, {
|
|
60
|
+
disabledItemValues,
|
|
61
|
+
valueKey
|
|
62
|
+
});
|
|
63
|
+
return !isDisabled;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// If all children are disabled, return the parent's own check state
|
|
67
|
+
if (enabledChildren.length === 0) {
|
|
68
|
+
var _nodes$parent$refKey$2;
|
|
69
|
+
return (_nodes$parent$refKey$2 = nodes[parent.refKey].check) !== null && _nodes$parent$refKey$2 !== void 0 ? _nodes$parent$refKey$2 : false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Check if all enabled children are checked
|
|
73
|
+
return enabledChildren.every(child => {
|
|
52
74
|
var _child$childrenKey;
|
|
53
75
|
if ((child === null || child === void 0 || (_child$childrenKey = child[childrenKey]) === null || _child$childrenKey === void 0 ? void 0 : _child$childrenKey.length) > 0) {
|
|
54
76
|
// fix: #3559
|
|
55
77
|
return isEveryChildChecked(child, {
|
|
56
78
|
nodes,
|
|
57
|
-
childrenKey
|
|
79
|
+
childrenKey,
|
|
80
|
+
disabledItemValues,
|
|
81
|
+
valueKey
|
|
58
82
|
});
|
|
59
83
|
}
|
|
60
84
|
return !(0, _isNil2.default)(child.refKey) && nodes[child.refKey].check;
|
|
@@ -63,16 +87,25 @@ function isEveryChildChecked(parent, options) {
|
|
|
63
87
|
|
|
64
88
|
/**
|
|
65
89
|
* Checks if any child node is checked.
|
|
90
|
+
* Disabled children are ignored in this check.
|
|
66
91
|
*/
|
|
67
|
-
function isSomeChildChecked(nodes, parent, childrenKey) {
|
|
92
|
+
function isSomeChildChecked(nodes, parent, childrenKey, disabledItemValues = [], valueKey = 'value') {
|
|
68
93
|
if (!(0, _isNil2.default)(parent.refKey) && (0, _isNil2.default)(nodes[parent.refKey])) {
|
|
69
94
|
return false;
|
|
70
95
|
}
|
|
71
96
|
const children = getChildrenByFlattenNodes(nodes, parent);
|
|
72
97
|
return children.some(child => {
|
|
73
98
|
var _child$childrenKey2;
|
|
99
|
+
// Skip disabled children
|
|
100
|
+
const isDisabled = getDisabledState(nodes, child, {
|
|
101
|
+
disabledItemValues,
|
|
102
|
+
valueKey
|
|
103
|
+
});
|
|
104
|
+
if (isDisabled) {
|
|
105
|
+
return false; // Disabled children don't count as "some checked"
|
|
106
|
+
}
|
|
74
107
|
if ((child === null || child === void 0 || (_child$childrenKey2 = child[childrenKey]) === null || _child$childrenKey2 === void 0 ? void 0 : _child$childrenKey2.length) > 0) {
|
|
75
|
-
return isSomeChildChecked(nodes, child, childrenKey);
|
|
108
|
+
return isSomeChildChecked(nodes, child, childrenKey, disabledItemValues, valueKey);
|
|
76
109
|
}
|
|
77
110
|
return !(0, _isNil2.default)(child.refKey) && nodes[child.refKey].check;
|
|
78
111
|
});
|
|
@@ -136,7 +169,9 @@ function isNodeUncheckable(node, props) {
|
|
|
136
169
|
function getFormattedTree(nodes, data, props) {
|
|
137
170
|
const {
|
|
138
171
|
childrenKey,
|
|
139
|
-
cascade
|
|
172
|
+
cascade,
|
|
173
|
+
disabledItemValues,
|
|
174
|
+
valueKey
|
|
140
175
|
} = props;
|
|
141
176
|
return data.map(node => {
|
|
142
177
|
const formatted = {
|
|
@@ -148,7 +183,9 @@ function getFormattedTree(nodes, data, props) {
|
|
|
148
183
|
const checkState = !(0, _isUndefined2.default)(cascade) ? getNodeCheckState(curNode, {
|
|
149
184
|
cascade,
|
|
150
185
|
nodes,
|
|
151
|
-
childrenKey
|
|
186
|
+
childrenKey,
|
|
187
|
+
disabledItemValues,
|
|
188
|
+
valueKey
|
|
152
189
|
}) : undefined;
|
|
153
190
|
formatted.check = curNode.check;
|
|
154
191
|
formatted.uncheckable = curNode.uncheckable;
|
|
@@ -164,6 +201,7 @@ function getFormattedTree(nodes, data, props) {
|
|
|
164
201
|
|
|
165
202
|
/**
|
|
166
203
|
* Determines the disabled state of a tree node.
|
|
204
|
+
* If a parent node is disabled, all its children should also be disabled.
|
|
167
205
|
*/
|
|
168
206
|
function getDisabledState(nodes, node, props) {
|
|
169
207
|
const {
|
|
@@ -173,7 +211,24 @@ function getDisabledState(nodes, node, props) {
|
|
|
173
211
|
if (!(0, _isNil2.default)(node.refKey) && (0, _isNil2.default)(nodes[node.refKey])) {
|
|
174
212
|
return false;
|
|
175
213
|
}
|
|
176
|
-
|
|
214
|
+
|
|
215
|
+
// Check if the current node is disabled
|
|
216
|
+
const isCurrentNodeDisabled = disabledItemValues.some(value => node.refKey && (0, _utils.shallowEqual)(nodes[node.refKey][valueKey], value));
|
|
217
|
+
if (isCurrentNodeDisabled) {
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Check if any parent node is disabled
|
|
222
|
+
let currentNode = node;
|
|
223
|
+
while (currentNode.parent) {
|
|
224
|
+
const parentNode = currentNode.parent;
|
|
225
|
+
const parentRefKey = parentNode.refKey;
|
|
226
|
+
if (!(0, _isNil2.default)(parentRefKey) && !(0, _isNil2.default)(nodes[parentRefKey]) && disabledItemValues.some(value => (0, _utils.shallowEqual)(nodes[parentRefKey][valueKey], value))) {
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
currentNode = parentNode;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
177
232
|
}
|
|
178
233
|
|
|
179
234
|
/**
|
|
@@ -207,7 +262,9 @@ function getNodeCheckState(node, options) {
|
|
|
207
262
|
const {
|
|
208
263
|
nodes,
|
|
209
264
|
cascade,
|
|
210
|
-
childrenKey
|
|
265
|
+
childrenKey,
|
|
266
|
+
disabledItemValues = [],
|
|
267
|
+
valueKey = 'value'
|
|
211
268
|
} = options;
|
|
212
269
|
if (node.refKey === undefined) {
|
|
213
270
|
return _constants.CHECK_STATE.UNCHECK;
|
|
@@ -221,13 +278,15 @@ function getNodeCheckState(node, options) {
|
|
|
221
278
|
}
|
|
222
279
|
if (isEveryChildChecked(node, {
|
|
223
280
|
nodes,
|
|
224
|
-
childrenKey
|
|
281
|
+
childrenKey,
|
|
282
|
+
disabledItemValues,
|
|
283
|
+
valueKey
|
|
225
284
|
})) {
|
|
226
285
|
nodes[node.refKey].checkAll = true;
|
|
227
286
|
nodes[node.refKey].check = true;
|
|
228
287
|
return _constants.CHECK_STATE.CHECK;
|
|
229
288
|
}
|
|
230
|
-
if (isSomeChildChecked(nodes, node, childrenKey)) {
|
|
289
|
+
if (isSomeChildChecked(nodes, node, childrenKey, disabledItemValues, valueKey)) {
|
|
231
290
|
nodes[node.refKey].checkAll = false;
|
|
232
291
|
return _constants.CHECK_STATE.INDETERMINATE;
|
|
233
292
|
}
|
package/cjs/Checkbox/Checkbox.js
CHANGED
|
@@ -9,6 +9,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
9
9
|
var _Box = _interopRequireDefault(require("../internals/Box"));
|
|
10
10
|
var _hooks = require("../internals/hooks");
|
|
11
11
|
var _utils = require("../internals/utils");
|
|
12
|
+
var _useIndeterminateCheckbox = require("./hooks/useIndeterminateCheckbox");
|
|
12
13
|
var _CheckboxGroup = require("../CheckboxGroup");
|
|
13
14
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
15
|
/**
|
|
@@ -81,7 +82,7 @@ const Checkbox = (0, _utils.forwardRef)((props, ref) => {
|
|
|
81
82
|
// In uncontrolled situations, use defaultChecked instead of checked
|
|
82
83
|
htmlInputProps[controlled ? 'checked' : 'defaultChecked'] = checked;
|
|
83
84
|
}
|
|
84
|
-
const checkboxRef = (0,
|
|
85
|
+
const checkboxRef = (0, _useIndeterminateCheckbox.useIndeterminateCheckbox)(indeterminate);
|
|
85
86
|
const handleChange = (0, _hooks.useEventCallback)(event => {
|
|
86
87
|
const nextChecked = event.target.checked;
|
|
87
88
|
if (disabled || readOnly) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
/**
|
|
3
|
+
* A hook that manages the indeterminate state of a checkbox input element.
|
|
4
|
+
*
|
|
5
|
+
* The indeterminate state is a visual and accessibility state that cannot be set via HTML attributes.
|
|
6
|
+
* It must be set via JavaScript on the DOM element itself. This is required for proper
|
|
7
|
+
* screen reader support, as assistive technologies rely on the native DOM property
|
|
8
|
+
* rather than ARIA attributes for native checkboxes.
|
|
9
|
+
*
|
|
10
|
+
* @param indeterminate - Whether the checkbox should be in an indeterminate state
|
|
11
|
+
* @returns A ref object to be attached to the checkbox input element
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const checkboxRef = useIndeterminateCheckbox(isIndeterminate);
|
|
16
|
+
* return <input type="checkbox" ref={checkboxRef} />;
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function useIndeterminateCheckbox(indeterminate?: boolean): React.MutableRefObject<HTMLInputElement | null>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
exports.useIndeterminateCheckbox = useIndeterminateCheckbox;
|
|
6
|
+
var _react = require("react");
|
|
7
|
+
/**
|
|
8
|
+
* A hook that manages the indeterminate state of a checkbox input element.
|
|
9
|
+
*
|
|
10
|
+
* The indeterminate state is a visual and accessibility state that cannot be set via HTML attributes.
|
|
11
|
+
* It must be set via JavaScript on the DOM element itself. This is required for proper
|
|
12
|
+
* screen reader support, as assistive technologies rely on the native DOM property
|
|
13
|
+
* rather than ARIA attributes for native checkboxes.
|
|
14
|
+
*
|
|
15
|
+
* @param indeterminate - Whether the checkbox should be in an indeterminate state
|
|
16
|
+
* @returns A ref object to be attached to the checkbox input element
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const checkboxRef = useIndeterminateCheckbox(isIndeterminate);
|
|
21
|
+
* return <input type="checkbox" ref={checkboxRef} />;
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function useIndeterminateCheckbox(indeterminate) {
|
|
25
|
+
const ref = (0, _react.useRef)(null);
|
|
26
|
+
(0, _react.useLayoutEffect)(() => {
|
|
27
|
+
if (ref.current) {
|
|
28
|
+
ref.current.indeterminate = indeterminate !== null && indeterminate !== void 0 ? indeterminate : false;
|
|
29
|
+
}
|
|
30
|
+
}, [indeterminate]);
|
|
31
|
+
return ref;
|
|
32
|
+
}
|
|
@@ -175,6 +175,29 @@ const DateInput = (0, _utils.forwardRef)((props, ref) => {
|
|
|
175
175
|
reset();
|
|
176
176
|
}
|
|
177
177
|
});
|
|
178
|
+
const onAmPmToggle = (0, _hooks.useEventCallback)(event => {
|
|
179
|
+
const input = event.target;
|
|
180
|
+
const key = event.key.toLowerCase();
|
|
181
|
+
|
|
182
|
+
// Only handle 'a' or 'p' keys when the selected pattern is 'a' (AM/PM)
|
|
183
|
+
if (selectedState.selectedPattern === 'a' && (key === 'a' || key === 'p')) {
|
|
184
|
+
const currentHour = dateField.hour || 0;
|
|
185
|
+
const isAM = currentHour < 12;
|
|
186
|
+
const isPM = currentHour >= 12;
|
|
187
|
+
|
|
188
|
+
// Toggle AM/PM based on the key pressed
|
|
189
|
+
// 'a' key -> set to AM, 'p' key -> set to PM
|
|
190
|
+
if (key === 'a' && isPM || key === 'p' && isAM) {
|
|
191
|
+
const state = (0, _utils2.getInputSelectedState)({
|
|
192
|
+
...keyPressOptions,
|
|
193
|
+
input
|
|
194
|
+
});
|
|
195
|
+
setSelectedState(state);
|
|
196
|
+
setDateOffset('a', 1, date => handleChange(date, event));
|
|
197
|
+
setSelectionRange(state.selectionStart, state.selectionEnd);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
178
201
|
const handleClick = (0, _hooks.useEventCallback)(event => {
|
|
179
202
|
const input = event.target;
|
|
180
203
|
const state = (0, _utils2.getInputSelectedState)({
|
|
@@ -203,6 +226,7 @@ const DateInput = (0, _utils.forwardRef)((props, ref) => {
|
|
|
203
226
|
onSegmentValueChange,
|
|
204
227
|
onSegmentValueChangeWithNumericKeys,
|
|
205
228
|
onSegmentValueRemove,
|
|
229
|
+
onAmPmToggle,
|
|
206
230
|
onKeyDown
|
|
207
231
|
});
|
|
208
232
|
const [focused, focusEventProps] = (0, _useIsFocused.default)({
|
|
@@ -4,7 +4,8 @@ interface KeyboardEventOptions {
|
|
|
4
4
|
onSegmentValueChange?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
5
5
|
onSegmentValueChangeWithNumericKeys?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
6
6
|
onSegmentValueRemove?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
7
|
+
onAmPmToggle?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
7
8
|
onKeyDown?: (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
8
9
|
}
|
|
9
|
-
export declare function useKeyboardInputEvent({ onSegmentChange, onSegmentValueChange, onSegmentValueChangeWithNumericKeys, onSegmentValueRemove, onKeyDown }: KeyboardEventOptions): (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
10
|
+
export declare function useKeyboardInputEvent({ onSegmentChange, onSegmentValueChange, onSegmentValueChangeWithNumericKeys, onSegmentValueRemove, onAmPmToggle, onKeyDown }: KeyboardEventOptions): (event: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
10
11
|
export default useKeyboardInputEvent;
|
|
@@ -9,6 +9,7 @@ function useKeyboardInputEvent({
|
|
|
9
9
|
onSegmentValueChange,
|
|
10
10
|
onSegmentValueChangeWithNumericKeys,
|
|
11
11
|
onSegmentValueRemove,
|
|
12
|
+
onAmPmToggle,
|
|
12
13
|
onKeyDown
|
|
13
14
|
}) {
|
|
14
15
|
return event => {
|
|
@@ -34,6 +35,19 @@ function useKeyboardInputEvent({
|
|
|
34
35
|
onSegmentValueChangeWithNumericKeys === null || onSegmentValueChangeWithNumericKeys === void 0 || onSegmentValueChangeWithNumericKeys(event);
|
|
35
36
|
event.preventDefault();
|
|
36
37
|
break;
|
|
38
|
+
case 'a':
|
|
39
|
+
case 'p':
|
|
40
|
+
case 'A':
|
|
41
|
+
case 'P':
|
|
42
|
+
// Determine whether the Ctrl or Command key is pressed, does not affect user copy and paste
|
|
43
|
+
if (event.ctrlKey || event.metaKey) {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Handle AM/PM toggle with 'a' or 'p' keys
|
|
48
|
+
onAmPmToggle === null || onAmPmToggle === void 0 || onAmPmToggle(event);
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
break;
|
|
37
51
|
case (_key$match2 = key.match(/[a-z]/)) === null || _key$match2 === void 0 ? void 0 : _key$match2[0]:
|
|
38
52
|
// Determine whether the Ctrl or Command key is pressed, does not affect user copy and paste
|
|
39
53
|
if (event.ctrlKey || event.metaKey) {
|
|
@@ -209,6 +209,29 @@ const DateRangeInput = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
209
209
|
reset();
|
|
210
210
|
}
|
|
211
211
|
});
|
|
212
|
+
const onAmPmToggle = (0, _hooks.useEventCallback)(event => {
|
|
213
|
+
const input = event.target;
|
|
214
|
+
const key = event.key.toLowerCase();
|
|
215
|
+
|
|
216
|
+
// Only handle 'a' or 'p' keys when the selected pattern is 'a' (AM/PM)
|
|
217
|
+
if (selectedState.selectedPattern === 'a' && (key === 'a' || key === 'p')) {
|
|
218
|
+
const currentHour = getActiveState().dateField.hour || 0;
|
|
219
|
+
const isAM = currentHour < 12;
|
|
220
|
+
const isPM = currentHour >= 12;
|
|
221
|
+
|
|
222
|
+
// Toggle AM/PM based on the key pressed
|
|
223
|
+
// 'a' key -> set to AM, 'p' key -> set to PM
|
|
224
|
+
if (key === 'a' && isPM || key === 'p' && isAM) {
|
|
225
|
+
const state = (0, _utils2.getInputSelectedState)({
|
|
226
|
+
...keyPressOptions,
|
|
227
|
+
input
|
|
228
|
+
});
|
|
229
|
+
setSelectedState(state);
|
|
230
|
+
getActiveState().setDateOffset('a', 1, date => handleChange(date, event));
|
|
231
|
+
setSelectionRange(state.selectionStart, state.selectionEnd);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
});
|
|
212
235
|
const handleClick = (0, _hooks.useEventCallback)(event => {
|
|
213
236
|
const input = event.target;
|
|
214
237
|
if (input.selectionStart === null) {
|
|
@@ -248,6 +271,7 @@ const DateRangeInput = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
|
248
271
|
onSegmentValueChange,
|
|
249
272
|
onSegmentValueChangeWithNumericKeys,
|
|
250
273
|
onSegmentValueRemove,
|
|
274
|
+
onAmPmToggle,
|
|
251
275
|
onKeyDown
|
|
252
276
|
});
|
|
253
277
|
return /*#__PURE__*/_react.default.createElement(_Input.default, (0, _extends2.default)({
|
|
@@ -387,6 +387,12 @@ const DateRangePicker = (0, _utils3.forwardRef)((props, ref) => {
|
|
|
387
387
|
const calendarKey = index === 0 ? 'start' : 'end';
|
|
388
388
|
const nextCalendarDate = Array.from(calendarDateRange);
|
|
389
389
|
nextCalendarDate[index] = date;
|
|
390
|
+
|
|
391
|
+
// If allowSameMonth is true, the start and end dates should be the same
|
|
392
|
+
if (allowSameMonth) {
|
|
393
|
+
nextCalendarDate[0] = date;
|
|
394
|
+
nextCalendarDate[1] = date;
|
|
395
|
+
}
|
|
390
396
|
setCalendarDateRange({
|
|
391
397
|
dateRange: nextCalendarDate,
|
|
392
398
|
calendarKey,
|
package/cjs/Form/Form.js
CHANGED
|
@@ -111,7 +111,11 @@ const Form = (0, _utils.forwardRef)((props, ref) => {
|
|
|
111
111
|
});
|
|
112
112
|
const reset = (0, _hooks.useEventCallback)(event => {
|
|
113
113
|
resetErrors();
|
|
114
|
-
|
|
114
|
+
const resetValue = resetFormValue();
|
|
115
|
+
if (resetValue) {
|
|
116
|
+
onChange === null || onChange === void 0 || onChange(resetValue);
|
|
117
|
+
}
|
|
118
|
+
onReset === null || onReset === void 0 || onReset(resetValue, event);
|
|
115
119
|
});
|
|
116
120
|
const handleSubmit = (0, _hooks.useEventCallback)(event => {
|
|
117
121
|
var _event$preventDefault, _event$stopPropagatio;
|
package/cjs/Rate/Rate.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import { StyledBoxProps } from '../internals/StyledBox';
|
|
3
3
|
import type { Color, FormControlBaseProps, Size } from '../internals/types';
|
|
4
4
|
export interface RateProps<T = number> extends Omit<StyledBoxProps, 'name'>, FormControlBaseProps<T> {
|
|
5
|
+
/** Element type to render as */
|
|
6
|
+
as?: React.ElementType;
|
|
5
7
|
/** Whether to allow semi selection */
|
|
6
8
|
allowHalf?: boolean;
|
|
7
9
|
/** Custom character of rate */
|
|
@@ -16,6 +18,12 @@ export interface RateProps<T = number> extends Omit<StyledBoxProps, 'name'>, For
|
|
|
16
18
|
color?: Color | React.CSSProperties['color'];
|
|
17
19
|
/** Maximum rate */
|
|
18
20
|
max?: number;
|
|
21
|
+
/**
|
|
22
|
+
* The name of the form control.
|
|
23
|
+
* Used for form integration and does not affect the internal component styling.
|
|
24
|
+
* @private Internal use only - extracted from props to prevent conflicts with StyledBox
|
|
25
|
+
*/
|
|
26
|
+
name?: string;
|
|
19
27
|
/** Vertical Rate half */
|
|
20
28
|
vertical?: boolean;
|
|
21
29
|
/** Render custom character */
|