@carbon/react 1.101.0 → 1.102.0-rc.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/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +998 -963
- package/es/components/Accordion/AccordionItem.js +8 -6
- package/es/components/ComboBox/ComboBox.js +3 -3
- package/es/components/ComposedModal/ComposedModal.js +0 -1
- package/es/components/ContainedList/ContainedList.d.ts +1 -1
- package/es/components/ContainedList/ContainedList.js +9 -34
- package/es/components/ContentSwitcher/ContentSwitcher.d.ts +3 -3
- package/es/components/ContentSwitcher/ContentSwitcher.js +1 -2
- package/es/components/DataTable/DataTable.d.ts +6 -2
- package/es/components/DataTable/DataTable.js +3 -1
- package/es/components/DataTable/Table.js +1 -1
- package/es/components/DataTable/TableToolbarSearch.d.ts +11 -2
- package/es/components/DataTable/TableToolbarSearch.js +10 -3
- package/es/components/DataTable/stories/examples/TableToolbarFilter.d.ts +3 -0
- package/es/components/DataTableSkeleton/DataTableSkeleton.d.ts +2 -12
- package/es/components/DataTableSkeleton/DataTableSkeleton.js +1 -8
- package/es/components/DatePicker/DatePicker.js +4 -1
- package/es/components/DatePickerInput/DatePickerInput.d.ts +2 -5
- package/es/components/DatePickerInput/DatePickerInput.js +2 -13
- package/es/components/Dropdown/Dropdown.js +1 -0
- package/es/components/ExpandableSearch/ExpandableSearch.js +2 -1
- package/es/components/ExpandableSearch/index.js +12 -0
- package/es/components/FluidSelect/FluidSelect.d.ts +3 -3
- package/es/components/FluidTextArea/FluidTextArea.d.ts +2 -4
- package/es/components/FluidTextArea/FluidTextArea.js +1 -2
- package/es/components/FluidTimePickerSelect/FluidTimePickerSelect.d.ts +3 -3
- package/es/components/Grid/Column.d.ts +1 -1
- package/es/components/Grid/Column.js +2 -2
- package/es/components/Loading/Loading.d.ts +1 -1
- package/es/components/Loading/Loading.js +3 -1
- package/es/components/Menu/Menu.d.ts +1 -1
- package/es/components/Menu/Menu.js +6 -2
- package/es/components/Menu/MenuItem.js +2 -2
- package/es/components/Modal/Modal.js +0 -1
- package/es/components/MultiSelect/FilterableMultiSelect.js +4 -3
- package/es/components/MultiSelect/MultiSelect.js +5 -8
- package/es/components/MultiSelect/MultiSelectPropTypes.d.ts +6 -8
- package/es/components/MultiSelect/tools/sorting.d.ts +16 -9
- package/es/components/MultiSelect/tools/sorting.js +10 -14
- package/es/components/OverflowMenu/OverflowMenu.js +1 -0
- package/es/components/OverflowMenuItem/OverflowMenuItem.d.ts +5 -1
- package/es/components/OverflowMenuItem/OverflowMenuItem.js +12 -2
- package/es/components/Popover/index.js +3 -3
- package/es/components/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
- package/es/components/RadioButtonGroup/RadioButtonGroup.js +8 -11
- package/es/components/Search/Search.js +3 -2
- package/es/components/Search/utils.d.ts +7 -0
- package/es/components/Search/utils.js +10 -0
- package/es/components/Select/Select.d.ts +2 -2
- package/es/components/Select/Select.js +1 -1
- package/es/components/SelectItem/SelectItem.d.ts +3 -3
- package/es/components/StructuredList/StructuredList.js +2 -2
- package/es/components/Tabs/Tabs.js +9 -4
- package/es/components/Tag/DismissibleTag.d.ts +1 -1
- package/es/components/Tag/DismissibleTag.js +2 -2
- package/es/components/Tag/OperationalTag.d.ts +1 -1
- package/es/components/Tag/OperationalTag.js +2 -2
- package/es/components/Tag/SelectableTag.d.ts +1 -1
- package/es/components/Tag/SelectableTag.js +2 -2
- package/es/components/Tag/Tag.d.ts +1 -1
- package/es/components/Tag/Tag.js +2 -2
- package/es/components/TextArea/TextArea.d.ts +1 -2
- package/es/components/TextArea/TextArea.js +4 -5
- package/es/components/TextInput/ControlledPasswordInput.js +1 -1
- package/es/components/TimePickerSelect/TimePickerSelect.d.ts +4 -4
- package/es/components/Toggletip/index.js +1 -2
- package/es/components/TreeView/TreeNode.js +2 -2
- package/es/components/TreeView/TreeView.d.ts +1 -1
- package/es/components/UIShell/HeaderPanel.d.ts +1 -1
- package/es/components/UIShell/HeaderPanel.js +4 -2
- package/es/components/UIShell/SideNav.js +3 -3
- package/es/components/UIShell/Switcher.d.ts +1 -1
- package/es/components/UIShell/Switcher.js +1 -1
- package/es/feature-flags.js +2 -2
- package/es/internal/FloatingMenu.js +3 -3
- package/lib/components/Accordion/AccordionItem.js +7 -5
- package/lib/components/ComboBox/ComboBox.js +3 -3
- package/lib/components/ComposedModal/ComposedModal.js +0 -1
- package/lib/components/ContainedList/ContainedList.d.ts +1 -1
- package/lib/components/ContainedList/ContainedList.js +9 -34
- package/lib/components/ContentSwitcher/ContentSwitcher.d.ts +3 -3
- package/lib/components/ContentSwitcher/ContentSwitcher.js +1 -2
- package/lib/components/DataTable/DataTable.d.ts +6 -2
- package/lib/components/DataTable/DataTable.js +3 -1
- package/lib/components/DataTable/Table.js +1 -1
- package/lib/components/DataTable/TableToolbarSearch.d.ts +11 -2
- package/lib/components/DataTable/TableToolbarSearch.js +10 -3
- package/lib/components/DataTable/stories/examples/TableToolbarFilter.d.ts +3 -0
- package/lib/components/DataTableSkeleton/DataTableSkeleton.d.ts +2 -12
- package/lib/components/DataTableSkeleton/DataTableSkeleton.js +1 -8
- package/lib/components/DatePicker/DatePicker.js +4 -1
- package/lib/components/DatePickerInput/DatePickerInput.d.ts +2 -5
- package/lib/components/DatePickerInput/DatePickerInput.js +2 -13
- package/lib/components/Dropdown/Dropdown.js +1 -0
- package/lib/components/ExpandableSearch/ExpandableSearch.js +2 -1
- package/lib/components/ExpandableSearch/index.js +17 -0
- package/lib/components/FeatureFlags/index.js +5 -5
- package/lib/components/FluidSelect/FluidSelect.d.ts +3 -3
- package/lib/components/FluidTextArea/FluidTextArea.d.ts +2 -4
- package/lib/components/FluidTextArea/FluidTextArea.js +1 -2
- package/lib/components/FluidTimePickerSelect/FluidTimePickerSelect.d.ts +3 -3
- package/lib/components/Grid/Column.d.ts +1 -1
- package/lib/components/Grid/Column.js +2 -21
- package/lib/components/Loading/Loading.d.ts +1 -1
- package/lib/components/Loading/Loading.js +3 -1
- package/lib/components/Menu/Menu.d.ts +1 -1
- package/lib/components/Menu/Menu.js +6 -2
- package/lib/components/Menu/MenuItem.js +2 -2
- package/lib/components/Modal/Modal.js +0 -1
- package/lib/components/MultiSelect/FilterableMultiSelect.js +4 -3
- package/lib/components/MultiSelect/MultiSelect.js +5 -8
- package/lib/components/MultiSelect/MultiSelectPropTypes.d.ts +6 -8
- package/lib/components/MultiSelect/tools/sorting.d.ts +16 -9
- package/lib/components/MultiSelect/tools/sorting.js +10 -14
- package/lib/components/OverflowMenu/OverflowMenu.js +1 -0
- package/lib/components/OverflowMenuItem/OverflowMenuItem.d.ts +5 -1
- package/lib/components/OverflowMenuItem/OverflowMenuItem.js +12 -2
- package/lib/components/Popover/index.js +3 -3
- package/lib/components/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
- package/lib/components/RadioButtonGroup/RadioButtonGroup.js +7 -10
- package/lib/components/Search/Search.js +3 -2
- package/lib/components/Search/utils.d.ts +7 -0
- package/lib/components/Search/utils.js +12 -0
- package/lib/components/Select/Select.d.ts +2 -2
- package/lib/components/Select/Select.js +1 -1
- package/lib/components/SelectItem/SelectItem.d.ts +3 -3
- package/lib/components/StructuredList/StructuredList.js +2 -2
- package/lib/components/Tabs/Tabs.js +9 -4
- package/lib/components/Tag/DismissibleTag.d.ts +1 -1
- package/lib/components/Tag/DismissibleTag.js +2 -2
- package/lib/components/Tag/OperationalTag.d.ts +1 -1
- package/lib/components/Tag/OperationalTag.js +2 -2
- package/lib/components/Tag/SelectableTag.d.ts +1 -1
- package/lib/components/Tag/SelectableTag.js +2 -2
- package/lib/components/Tag/Tag.d.ts +1 -1
- package/lib/components/Tag/Tag.js +2 -2
- package/lib/components/TextArea/TextArea.d.ts +1 -2
- package/lib/components/TextArea/TextArea.js +4 -5
- package/lib/components/TextInput/ControlledPasswordInput.js +1 -1
- package/lib/components/TimePickerSelect/TimePickerSelect.d.ts +4 -4
- package/lib/components/Toggletip/index.js +1 -2
- package/lib/components/TreeView/TreeNode.js +2 -2
- package/lib/components/TreeView/TreeView.d.ts +1 -1
- package/lib/components/UIShell/HeaderPanel.d.ts +1 -1
- package/lib/components/UIShell/HeaderPanel.js +4 -2
- package/lib/components/UIShell/SideNav.js +3 -3
- package/lib/components/UIShell/Switcher.d.ts +1 -1
- package/lib/components/UIShell/Switcher.js +1 -1
- package/lib/feature-flags.js +2 -21
- package/lib/internal/FloatingMenu.js +3 -22
- package/package.json +7 -7
- package/telemetry.yml +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
11
|
+
|
|
12
|
+
var ExpandableSearch = require('./ExpandableSearch.js');
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
exports.ExpandableSearch = ExpandableSearch.default;
|
|
17
|
+
exports.default = ExpandableSearch.default;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
'use strict';
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var featureFlags = require('@carbon/feature-flags');
|
|
11
11
|
var PropTypes = require('prop-types');
|
|
12
12
|
var React = require('react');
|
|
13
13
|
var deprecate = require('../../prop-types/deprecate.js');
|
|
@@ -17,7 +17,7 @@ var deprecate = require('../../prop-types/deprecate.js');
|
|
|
17
17
|
* Our FeatureFlagContext is used alongside the FeatureFlags component to enable
|
|
18
18
|
* or disable feature flags in a given React tree
|
|
19
19
|
*/
|
|
20
|
-
const FeatureFlagContext = /*#__PURE__*/React.createContext(
|
|
20
|
+
const FeatureFlagContext = /*#__PURE__*/React.createContext(featureFlags.FeatureFlags);
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Supports an object of feature flag values with the `flags` prop, merging them
|
|
@@ -54,12 +54,12 @@ function FeatureFlags({
|
|
|
54
54
|
...flags
|
|
55
55
|
};
|
|
56
56
|
const [scope, updateScope] = React.useState(() => {
|
|
57
|
-
const scope =
|
|
57
|
+
const scope = featureFlags.createScope(combinedFlags);
|
|
58
58
|
scope.mergeWithScope(parentScope);
|
|
59
59
|
return scope;
|
|
60
60
|
});
|
|
61
61
|
if (parentScope !== prevParentScope) {
|
|
62
|
-
const scope =
|
|
62
|
+
const scope = featureFlags.createScope(combinedFlags);
|
|
63
63
|
scope.mergeWithScope(parentScope);
|
|
64
64
|
updateScope(scope);
|
|
65
65
|
setPrevParentScope(parentScope);
|
|
@@ -69,7 +69,7 @@ function FeatureFlags({
|
|
|
69
69
|
// for flags that are passed in. If they have changed, then we re-create the
|
|
70
70
|
// FeatureFlagScope using the new flags
|
|
71
71
|
useChangedValue(combinedFlags, isEqual, changedFlags => {
|
|
72
|
-
const scope =
|
|
72
|
+
const scope = featureFlags.createScope(changedFlags);
|
|
73
73
|
scope.mergeWithScope(parentScope);
|
|
74
74
|
updateScope(scope);
|
|
75
75
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2022
|
|
2
|
+
* Copyright IBM Corp. 2022, 2026
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
-
import React from 'react';
|
|
7
|
+
import React, { type SelectHTMLAttributes } from 'react';
|
|
8
8
|
export interface FluidSelectProps {
|
|
9
9
|
/**
|
|
10
10
|
* Provide the contents of your Select
|
|
@@ -17,7 +17,7 @@ export interface FluidSelectProps {
|
|
|
17
17
|
/**
|
|
18
18
|
* Optionally provide the default value of the `<select>`
|
|
19
19
|
*/
|
|
20
|
-
defaultValue?:
|
|
20
|
+
defaultValue?: SelectHTMLAttributes<HTMLSelectElement>['defaultValue'];
|
|
21
21
|
/**
|
|
22
22
|
* Specify whether the control is disabled
|
|
23
23
|
*/
|
|
@@ -8,8 +8,7 @@ import PropTypes from 'prop-types';
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
export interface FluidTextAreaProps {
|
|
10
10
|
/**
|
|
11
|
-
* Provide a custom className that is applied
|
|
12
|
-
* `<textarea>` node
|
|
11
|
+
* Provide a custom className that is applied to the wrapper node
|
|
13
12
|
*/
|
|
14
13
|
className?: string;
|
|
15
14
|
/**
|
|
@@ -101,8 +100,7 @@ declare const FluidTextArea: {
|
|
|
101
100
|
({ className, ...other }: FluidTextAreaProps): import("react/jsx-runtime").JSX.Element;
|
|
102
101
|
propTypes: {
|
|
103
102
|
/**
|
|
104
|
-
* Provide a custom className that is applied
|
|
105
|
-
* `<textarea>` node
|
|
103
|
+
* Provide a custom className that is applied to the wrapper node
|
|
106
104
|
*/
|
|
107
105
|
className: PropTypes.Requireable<string>;
|
|
108
106
|
/**
|
|
@@ -35,8 +35,7 @@ const FluidTextArea = ({
|
|
|
35
35
|
};
|
|
36
36
|
FluidTextArea.propTypes = {
|
|
37
37
|
/**
|
|
38
|
-
* Provide a custom className that is applied
|
|
39
|
-
* `<textarea>` node
|
|
38
|
+
* Provide a custom className that is applied to the wrapper node
|
|
40
39
|
*/
|
|
41
40
|
className: PropTypes.string,
|
|
42
41
|
/**
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2022
|
|
2
|
+
* Copyright IBM Corp. 2022, 2026
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
-
import React from 'react';
|
|
7
|
+
import React, { type SelectHTMLAttributes } from 'react';
|
|
8
8
|
export interface FluidTimePickerSelectProps {
|
|
9
9
|
/**
|
|
10
10
|
* Provide the contents of your Select
|
|
@@ -17,7 +17,7 @@ export interface FluidTimePickerSelectProps {
|
|
|
17
17
|
/**
|
|
18
18
|
* Optionally provide the default value of the `<select>`
|
|
19
19
|
*/
|
|
20
|
-
defaultValue?:
|
|
20
|
+
defaultValue?: SelectHTMLAttributes<HTMLSelectElement>['defaultValue'];
|
|
21
21
|
/**
|
|
22
22
|
* Specify whether the control is disabled
|
|
23
23
|
*/
|
|
@@ -10,32 +10,13 @@
|
|
|
10
10
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
11
11
|
|
|
12
12
|
var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
|
|
13
|
-
var
|
|
13
|
+
var featureFlags = require('@carbon/feature-flags');
|
|
14
14
|
var cx = require('classnames');
|
|
15
15
|
var PropTypes = require('prop-types');
|
|
16
16
|
var React = require('react');
|
|
17
17
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
18
18
|
var GridContext = require('./GridContext.js');
|
|
19
19
|
|
|
20
|
-
function _interopNamespaceDefault(e) {
|
|
21
|
-
var n = Object.create(null);
|
|
22
|
-
if (e) {
|
|
23
|
-
Object.keys(e).forEach(function (k) {
|
|
24
|
-
if (k !== 'default') {
|
|
25
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
26
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
27
|
-
enumerable: true,
|
|
28
|
-
get: function () { return e[k]; }
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
n.default = e;
|
|
34
|
-
return Object.freeze(n);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
var FeatureFlags__namespace = /*#__PURE__*/_interopNamespaceDefault(FeatureFlags);
|
|
38
|
-
|
|
39
20
|
// eslint-disable-next-line react/display-name -- https://github.com/carbon-design-system/carbon/issues/20452
|
|
40
21
|
const Column = /*#__PURE__*/React.forwardRef(({
|
|
41
22
|
as,
|
|
@@ -75,7 +56,7 @@ const Column = /*#__PURE__*/React.forwardRef(({
|
|
|
75
56
|
}, rest), children);
|
|
76
57
|
});
|
|
77
58
|
const percentSpanType = PropTypes.oneOf(['25%', '50%', '75%', '100%']);
|
|
78
|
-
const spanPropType =
|
|
59
|
+
const spanPropType = featureFlags.enabled('enable-css-grid') ? PropTypes.oneOfType([PropTypes.bool, PropTypes.number, PropTypes.shape({
|
|
79
60
|
span: PropTypes.oneOfType([PropTypes.number, percentSpanType]),
|
|
80
61
|
offset: PropTypes.number,
|
|
81
62
|
start: PropTypes.number,
|
|
@@ -40,7 +40,9 @@ function Loading({
|
|
|
40
40
|
className: loadingClassName
|
|
41
41
|
}), /*#__PURE__*/React.createElement("svg", {
|
|
42
42
|
className: `${prefix}--loading__svg`,
|
|
43
|
-
viewBox: "0 0 100 100"
|
|
43
|
+
viewBox: "0 0 100 100",
|
|
44
|
+
role: "img",
|
|
45
|
+
"aria-label": description
|
|
44
46
|
}, /*#__PURE__*/React.createElement("title", null, description), small ? /*#__PURE__*/React.createElement("circle", {
|
|
45
47
|
className: `${prefix}--loading__background`,
|
|
46
48
|
cx: "50%",
|
|
@@ -86,10 +86,14 @@ const Menu = /*#__PURE__*/React.forwardRef(function Menu({
|
|
|
86
86
|
}
|
|
87
87
|
function handleOpen() {
|
|
88
88
|
if (menu.current) {
|
|
89
|
-
|
|
89
|
+
const {
|
|
90
|
+
activeElement,
|
|
91
|
+
dir
|
|
92
|
+
} = document;
|
|
93
|
+
focusReturn.current = activeElement instanceof HTMLElement ? activeElement : null;
|
|
90
94
|
if (legacyAutoalign) {
|
|
91
95
|
const pos = calculatePosition();
|
|
92
|
-
if ((
|
|
96
|
+
if ((dir === 'rtl' || direction === 'rtl') && !rest?.id?.includes('MenuButton')) {
|
|
93
97
|
menu.current.style.insetInlineStart = `initial`;
|
|
94
98
|
menu.current.style.insetInlineEnd = `${pos[0]}px`;
|
|
95
99
|
} else {
|
|
@@ -71,7 +71,7 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem({
|
|
|
71
71
|
const context = React.useContext(MenuContext.MenuContext);
|
|
72
72
|
const menuItem = React.useRef(null);
|
|
73
73
|
const ref = useMergedRefs.useMergedRefs([forwardRef, menuItem, refs.setReference]);
|
|
74
|
-
const hasChildren =
|
|
74
|
+
const hasChildren = React.Children.toArray(children).length > 0;
|
|
75
75
|
const isDisabled = disabled && !hasChildren;
|
|
76
76
|
const isDanger = kind === 'danger' && !hasChildren;
|
|
77
77
|
function registerItem() {
|
|
@@ -79,7 +79,7 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem({
|
|
|
79
79
|
type: 'registerItem',
|
|
80
80
|
payload: {
|
|
81
81
|
ref: menuItem,
|
|
82
|
-
disabled:
|
|
82
|
+
disabled: disabled ?? false
|
|
83
83
|
}
|
|
84
84
|
});
|
|
85
85
|
}
|
|
@@ -162,7 +162,6 @@ const ModalDialog = /*#__PURE__*/React.forwardRef(function ModalDialog({
|
|
|
162
162
|
const {
|
|
163
163
|
target
|
|
164
164
|
} = evt;
|
|
165
|
-
evt.stopPropagation();
|
|
166
165
|
const shouldCloseOnOutsideClick =
|
|
167
166
|
// Passive modals can close on clicks outside the modal when
|
|
168
167
|
// preventCloseOnClickOutside is undefined or explicitly set to false.
|
|
@@ -222,7 +222,6 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
|
|
|
222
222
|
item => !item.disabled);
|
|
223
223
|
|
|
224
224
|
// Sort only non-select-all items, select-all item must stay at the top
|
|
225
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452
|
|
226
225
|
const sortedReal = sortItems(nonSelectAllItems, {
|
|
227
226
|
selectedItems: {
|
|
228
227
|
top: controlledSelectedItems,
|
|
@@ -315,6 +314,7 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
|
|
|
315
314
|
React.useEffect(() => {
|
|
316
315
|
const handleClickOutside = event => {
|
|
317
316
|
const target = event.target;
|
|
317
|
+
if (!(target instanceof Node)) return;
|
|
318
318
|
const wrapper = document.getElementById(id)?.closest(`.${prefix}--multi-select__wrapper`);
|
|
319
319
|
|
|
320
320
|
// If click is outside our component and menu is open or input is focused
|
|
@@ -616,10 +616,11 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
|
|
|
616
616
|
|
|
617
617
|
// Memoize the value of getMenuProps to avoid an infinite loop
|
|
618
618
|
const menuProps = React.useMemo(() => getMenuProps({
|
|
619
|
-
ref: autoAlign ? refs.setFloating : null
|
|
619
|
+
ref: autoAlign ? refs.setFloating : null,
|
|
620
|
+
hidden: !isOpen
|
|
620
621
|
}, {
|
|
621
622
|
suppressRefError: true
|
|
622
|
-
}), [autoAlign, getMenuProps, refs.setFloating]);
|
|
623
|
+
}), [autoAlign, getMenuProps, isOpen, refs.setFloating]);
|
|
623
624
|
const handleFocus = evt => {
|
|
624
625
|
if (evt?.target.classList.contains(`${prefix}--tag__close-icon`) || evt?.target.classList.contains(`${prefix}--list-box__selection`)) {
|
|
625
626
|
setIsFocused(false);
|
|
@@ -426,8 +426,9 @@ const MultiSelect = /*#__PURE__*/React.forwardRef(({
|
|
|
426
426
|
|
|
427
427
|
// Memoize the value of getMenuProps to avoid an infinite loop
|
|
428
428
|
const menuProps = React.useMemo(() => getMenuProps({
|
|
429
|
-
ref: enableFloatingStyles ? refs.setFloating : null
|
|
430
|
-
|
|
429
|
+
ref: enableFloatingStyles ? refs.setFloating : null,
|
|
430
|
+
hidden: !isOpen
|
|
431
|
+
}), [enableFloatingStyles, getMenuProps, isOpen, refs.setFloating]);
|
|
431
432
|
const allLabelProps = getLabelProps();
|
|
432
433
|
const labelProps = /*#__PURE__*/React.isValidElement(titleText) ? {
|
|
433
434
|
id: allLabelProps.id
|
|
@@ -474,9 +475,7 @@ const MultiSelect = /*#__PURE__*/React.forwardRef(({
|
|
|
474
475
|
}, selectedItems.length > 0 && /*#__PURE__*/React.createElement(index$2.default.Selection, {
|
|
475
476
|
readOnly: readOnly,
|
|
476
477
|
clearSelection: !disabled && !readOnly ? clearSelection : noopFn.noopFn,
|
|
477
|
-
selectionCount: selectedItemsLength
|
|
478
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
479
|
-
,
|
|
478
|
+
selectionCount: selectedItemsLength,
|
|
480
479
|
translateWithId: translateWithId,
|
|
481
480
|
disabled: disabled
|
|
482
481
|
}), /*#__PURE__*/React.createElement("button", _rollupPluginBabelHelpers.extends({
|
|
@@ -495,9 +494,7 @@ const MultiSelect = /*#__PURE__*/React.forwardRef(({
|
|
|
495
494
|
translateWithId: translateWithId
|
|
496
495
|
})), slug ? normalizedDecorator : decorator ? /*#__PURE__*/React.createElement("div", {
|
|
497
496
|
className: `${prefix}--list-box__inner-wrapper--decorator`
|
|
498
|
-
}, normalizedDecorator) : ''), /*#__PURE__*/React.createElement(index$2.default.Menu, menuProps, isOpen &&
|
|
499
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- https://github.com/carbon-design-system/carbon/issues/20452
|
|
500
|
-
sortItems(filteredItems, sortOptions).map((item, index) => {
|
|
497
|
+
}, normalizedDecorator) : ''), /*#__PURE__*/React.createElement(index$2.default.Menu, menuProps, isOpen && sortItems(filteredItems, sortOptions).map((item, index) => {
|
|
501
498
|
const {
|
|
502
499
|
hasIndividualSelections,
|
|
503
500
|
nonSelectAllSelectedCount,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2016,
|
|
2
|
+
* Copyright IBM Corp. 2016, 2026
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -34,17 +34,15 @@ export declare const sortingPropTypes: {
|
|
|
34
34
|
*/
|
|
35
35
|
sortItems: PropTypes.Requireable<(...args: any[]) => any>;
|
|
36
36
|
};
|
|
37
|
-
interface DownshiftTypedProps<ItemType> {
|
|
38
|
-
itemToString?(item: ItemType): string;
|
|
39
|
-
}
|
|
40
37
|
interface SharedOptions {
|
|
41
38
|
locale: string;
|
|
42
39
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
export interface SortItemsOptions<ItemType> extends SharedOptions
|
|
40
|
+
export type CompareItems = (itemA: string, itemB: string, options: {
|
|
41
|
+
locale: string;
|
|
42
|
+
}) => number;
|
|
43
|
+
export interface SortItemsOptions<ItemType> extends SharedOptions {
|
|
47
44
|
compareItems: CompareItems;
|
|
45
|
+
itemToString: (item: ItemType) => string;
|
|
48
46
|
selectedItems: ItemType[];
|
|
49
47
|
}
|
|
50
48
|
export interface MultiSelectSortingProps<ItemType> {
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2026
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
import type { CompareItems, SortItemsOptions } from '../MultiSelectPropTypes';
|
|
8
|
+
/**
|
|
9
|
+
* Use `localeCompare` with the `numeric` option enabled to sort two
|
|
10
|
+
* alphanumeric strings.
|
|
11
|
+
*/
|
|
12
|
+
export declare const defaultCompareItems: CompareItems;
|
|
13
|
+
/**
|
|
14
|
+
* Default sorting function for options in a selection control.
|
|
15
|
+
*/
|
|
16
|
+
export declare const defaultSortItems: <T>(items: T[], { selectedItems, itemToString, compareItems, locale }: SortItemsOptions<T>) => T[];
|
|
@@ -7,16 +7,11 @@
|
|
|
7
7
|
|
|
8
8
|
'use strict';
|
|
9
9
|
|
|
10
|
+
const isSelectAllItem = item => typeof item === 'object' && item !== null && 'isSelectAll' in item;
|
|
11
|
+
|
|
10
12
|
/**
|
|
11
|
-
* Use
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* @param {string} itemA - The first string to compare.
|
|
15
|
-
* @param {string} itemB - The second string to compare.
|
|
16
|
-
* @param {object} options - Options for comparing.
|
|
17
|
-
* @param {string} options.locale - The locale to use for comparison.
|
|
18
|
-
* @returns {number} A negative number if itemA comes before itemB, a positive
|
|
19
|
-
* number if itemA comes after itemB, or 0 if they are equal.
|
|
13
|
+
* Use `localeCompare` with the `numeric` option enabled to sort two
|
|
14
|
+
* alphanumeric strings.
|
|
20
15
|
*/
|
|
21
16
|
const defaultCompareItems = (itemA, itemB, {
|
|
22
17
|
locale
|
|
@@ -25,18 +20,19 @@ const defaultCompareItems = (itemA, itemB, {
|
|
|
25
20
|
});
|
|
26
21
|
|
|
27
22
|
/**
|
|
28
|
-
* Default sorting
|
|
23
|
+
* Default sorting function for options in a selection control.
|
|
29
24
|
*/
|
|
30
25
|
const defaultSortItems = (items, {
|
|
31
|
-
selectedItems
|
|
26
|
+
selectedItems,
|
|
32
27
|
itemToString,
|
|
33
28
|
compareItems,
|
|
34
|
-
locale
|
|
29
|
+
locale
|
|
35
30
|
}) => {
|
|
31
|
+
// TODO: Should this util mutate items or should that be avoided?
|
|
36
32
|
return items.sort((itemA, itemB) => {
|
|
37
33
|
// Always place "select all" option at the beginning
|
|
38
|
-
if (itemA.isSelectAll) return -1;
|
|
39
|
-
if (itemB.isSelectAll) return 1;
|
|
34
|
+
if (isSelectAllItem(itemA) && itemA.isSelectAll) return -1;
|
|
35
|
+
if (isSelectAllItem(itemB) && itemB.isSelectAll) return 1;
|
|
40
36
|
const hasItemA = selectedItems.includes(itemA);
|
|
41
37
|
const hasItemB = selectedItems.includes(itemB);
|
|
42
38
|
if (hasItemA && !hasItemB) return -1;
|
|
@@ -259,6 +259,7 @@ const OverflowMenu = /*#__PURE__*/React.forwardRef(({
|
|
|
259
259
|
const focusinEventName = hasFocusin ? 'focusin' : 'focus';
|
|
260
260
|
hFocusIn.current = on(menuBody.ownerDocument, focusinEventName, event => {
|
|
261
261
|
const target = event.target;
|
|
262
|
+
if (!(target instanceof Element)) return;
|
|
262
263
|
const triggerEl = triggerRef.current;
|
|
263
264
|
if (typeof target.matches === 'function') {
|
|
264
265
|
if (!menuBody.contains(target) && triggerEl && !target.matches(`.${prefix}--overflow-menu:first-child, .${prefix}--overflow-menu-options:first-child`)) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright IBM Corp. 2016,
|
|
2
|
+
* Copyright IBM Corp. 2016, 2026
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -14,6 +14,10 @@ export interface OverflowMenuItemProps extends React.HTMLAttributes<HTMLElement>
|
|
|
14
14
|
* A callback to tell the parent menu component that the menu should be closed.
|
|
15
15
|
*/
|
|
16
16
|
closeMenu?: () => void;
|
|
17
|
+
/**
|
|
18
|
+
* Specify the message read by screen readers for the danger overflow menu item variant
|
|
19
|
+
*/
|
|
20
|
+
dangerDescription?: string;
|
|
17
21
|
/**
|
|
18
22
|
* `true` to make this menu item disabled.
|
|
19
23
|
*/
|
|
@@ -19,12 +19,14 @@ var usePrefix = require('../../internal/usePrefix.js');
|
|
|
19
19
|
var warning = require('../../internal/warning.js');
|
|
20
20
|
var Text = require('../Text/Text.js');
|
|
21
21
|
require('../Text/TextDirection.js');
|
|
22
|
+
var useId = require('../../internal/useId.js');
|
|
22
23
|
|
|
23
24
|
const frFn = React.forwardRef;
|
|
24
25
|
const OverflowMenuItem = frFn((props, ref) => {
|
|
25
26
|
const {
|
|
26
27
|
className,
|
|
27
28
|
closeMenu,
|
|
29
|
+
dangerDescription = 'danger',
|
|
28
30
|
disabled = false,
|
|
29
31
|
handleOverflowMenuItemFocus,
|
|
30
32
|
hasDivider = false,
|
|
@@ -68,13 +70,17 @@ const OverflowMenuItem = frFn((props, ref) => {
|
|
|
68
70
|
[`${prefix}--overflow-menu-options__option--disabled`]: disabled
|
|
69
71
|
}, wrapperClassName);
|
|
70
72
|
const TagToUse = href ? 'a' : 'button';
|
|
73
|
+
const assistiveId = useId.useId('danger-description');
|
|
71
74
|
const OverflowMenuItemContent = (() => {
|
|
72
75
|
if (typeof itemText !== 'string') {
|
|
73
76
|
return itemText;
|
|
74
77
|
}
|
|
75
|
-
return /*#__PURE__*/React.createElement("div", {
|
|
78
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
76
79
|
className: `${prefix}--overflow-menu-options__option-content`
|
|
77
|
-
}, itemText)
|
|
80
|
+
}, itemText), isDelete && /*#__PURE__*/React.createElement("span", {
|
|
81
|
+
id: assistiveId,
|
|
82
|
+
className: `${prefix}--visually-hidden`
|
|
83
|
+
}, dangerDescription));
|
|
78
84
|
})();
|
|
79
85
|
return /*#__PURE__*/React.createElement(Text.Text, {
|
|
80
86
|
as: "li",
|
|
@@ -114,6 +120,10 @@ OverflowMenuItem.propTypes = {
|
|
|
114
120
|
* A callback to tell the parent menu component that the menu should be closed.
|
|
115
121
|
*/
|
|
116
122
|
closeMenu: PropTypes.func,
|
|
123
|
+
/**
|
|
124
|
+
* Specify the message read by screen readers for the danger overflow menu item variant
|
|
125
|
+
*/
|
|
126
|
+
dangerDescription: PropTypes.string,
|
|
117
127
|
/**
|
|
118
128
|
* `true` to make this menu item disabled.
|
|
119
129
|
*/
|
|
@@ -162,7 +162,8 @@ forwardRef) {
|
|
|
162
162
|
// Middleware order matters, arrow should be last
|
|
163
163
|
middleware: [react.offset(!isTabTip ? {
|
|
164
164
|
alignmentAxis: alignmentAxisOffset,
|
|
165
|
-
|
|
165
|
+
// Use 4px spacing when no caret, otherwise use the caret offset
|
|
166
|
+
mainAxis: caret ? popoverDimensions?.current?.offset : 4
|
|
166
167
|
} : 0), autoAlign && react.flip({
|
|
167
168
|
fallbackPlacements: isTabTip ? align.includes('bottom') ? ['bottom-start', 'bottom-end', 'top-start', 'top-end'] : ['top-start', 'top-end', 'bottom-start', 'bottom-end'] : align.includes('bottom') ? ['bottom', 'bottom-start', 'bottom-end', 'right', 'right-start', 'right-end', 'left', 'left-start', 'left-end', 'top', 'top-start', 'top-end'] : ['top', 'top-start', 'top-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end', 'bottom', 'bottom-start', 'bottom-end'],
|
|
168
169
|
fallbackStrategy: 'initialPlacement',
|
|
@@ -299,10 +300,9 @@ forwardRef) {
|
|
|
299
300
|
return item;
|
|
300
301
|
}
|
|
301
302
|
});
|
|
302
|
-
const BaseComponentAsAny = BaseComponent;
|
|
303
303
|
return /*#__PURE__*/React.createElement(PopoverContext.Provider, {
|
|
304
304
|
value: value
|
|
305
|
-
}, /*#__PURE__*/React.createElement(
|
|
305
|
+
}, /*#__PURE__*/React.createElement(BaseComponent, _rollupPluginBabelHelpers.extends({}, rest, {
|
|
306
306
|
className: className,
|
|
307
307
|
ref: ref
|
|
308
308
|
}), enableFloatingStyles || isTabTip ? mappedChildren : children));
|
|
@@ -47,17 +47,14 @@ const RadioButtonGroup = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
47
47
|
} = props;
|
|
48
48
|
const prefix = usePrefix.usePrefix();
|
|
49
49
|
const [selected, setSelected] = React.useState(valueSelected ?? defaultSelected);
|
|
50
|
-
const
|
|
50
|
+
const prevValueSelected = React.useRef(valueSelected);
|
|
51
51
|
const radioButtonGroupInstanceId = useId.useId();
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
setSelected(valueSelected);
|
|
59
|
-
setPrevValueSelected(valueSelected);
|
|
60
|
-
}
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
if (valueSelected !== prevValueSelected.current) {
|
|
54
|
+
setSelected(valueSelected);
|
|
55
|
+
prevValueSelected.current = valueSelected;
|
|
56
|
+
}
|
|
57
|
+
}, [valueSelected]);
|
|
61
58
|
function getRadioButtons() {
|
|
62
59
|
const mappedChildren = React.Children.map(children, radioButton => {
|
|
63
60
|
if (!radioButton) {
|
|
@@ -26,6 +26,7 @@ var FormContext = require('../FluidForm/FormContext.js');
|
|
|
26
26
|
var noopFn = require('../../internal/noopFn.js');
|
|
27
27
|
require('../Tooltip/DefinitionTooltip.js');
|
|
28
28
|
var Tooltip = require('../Tooltip/Tooltip.js');
|
|
29
|
+
var utils = require('./utils.js');
|
|
29
30
|
|
|
30
31
|
var _Close;
|
|
31
32
|
const Search = /*#__PURE__*/React.forwardRef(({
|
|
@@ -51,7 +52,7 @@ const Search = /*#__PURE__*/React.forwardRef(({
|
|
|
51
52
|
value,
|
|
52
53
|
...rest
|
|
53
54
|
}, forwardRef) => {
|
|
54
|
-
const hasPropValue =
|
|
55
|
+
const hasPropValue = utils.isSearchValuePresent(value) || utils.isSearchValuePresent(defaultValue);
|
|
55
56
|
const prefix = usePrefix.usePrefix();
|
|
56
57
|
const {
|
|
57
58
|
isFluid
|
|
@@ -78,7 +79,7 @@ const Search = /*#__PURE__*/React.forwardRef(({
|
|
|
78
79
|
[`${prefix}--search-close--hidden`]: !hasContent || !isExpanded
|
|
79
80
|
});
|
|
80
81
|
if (value !== prevValue) {
|
|
81
|
-
setHasContent(
|
|
82
|
+
setHasContent(utils.isSearchValuePresent(value));
|
|
82
83
|
setPrevValue(value);
|
|
83
84
|
}
|
|
84
85
|
function clearInput() {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2026
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
export declare const isSearchValuePresent: (value: string | number | undefined) => boolean;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const isSearchValuePresent = value => value !== '' && typeof value !== 'undefined';
|
|
11
|
+
|
|
12
|
+
exports.isSearchValuePresent = isSearchValuePresent;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
-
import React, { type ChangeEventHandler, type ComponentPropsWithRef, type ReactNode } from 'react';
|
|
7
|
+
import React, { type ChangeEventHandler, type ComponentPropsWithRef, type ReactNode, type SelectHTMLAttributes } from 'react';
|
|
8
8
|
type ExcludedAttributes = 'size';
|
|
9
9
|
export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, ExcludedAttributes> {
|
|
10
10
|
/**
|
|
@@ -22,7 +22,7 @@ export interface SelectProps extends Omit<ComponentPropsWithRef<'select'>, Exclu
|
|
|
22
22
|
/**
|
|
23
23
|
* Optionally provide the default value of the `<select>`
|
|
24
24
|
*/
|
|
25
|
-
defaultValue?:
|
|
25
|
+
defaultValue?: SelectHTMLAttributes<HTMLSelectElement>['defaultValue'];
|
|
26
26
|
/**
|
|
27
27
|
* Specify whether the control is disabled
|
|
28
28
|
*/
|