@carbon/react 1.68.0 → 1.69.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 +786 -786
- package/README.md +3 -3
- package/es/components/Accordion/AccordionItem.js +0 -1
- package/es/components/Button/Button.js +6 -0
- package/es/components/CheckboxGroup/CheckboxGroup.js +1 -2
- package/es/components/CheckboxGroup/index.d.ts +10 -0
- package/es/components/ComboBox/ComboBox.js +13 -18
- package/es/components/ComboButton/index.js +10 -3
- package/es/components/DataTable/TableCell.d.ts +1 -4
- package/es/components/DataTable/TableCell.js +3 -2
- package/es/components/Disclosure/index.d.ts +18 -0
- package/es/components/Dropdown/Dropdown.js +11 -9
- package/es/components/FileUploader/FileUploader.d.ts +8 -92
- package/es/components/FileUploader/FileUploader.js +116 -137
- package/es/components/IdPrefix/index.d.ts +26 -0
- package/es/components/Menu/MenuItem.js +1 -4
- package/es/components/MenuButton/index.d.ts +4 -0
- package/es/components/MenuButton/index.js +19 -5
- package/es/components/MultiSelect/MultiSelect.js +11 -9
- package/es/components/OverflowMenu/next/index.d.ts +4 -0
- package/es/components/OverflowMenu/next/index.js +19 -9
- package/es/components/PaginationNav/PaginationNav.js +1 -1
- package/es/components/Popover/index.js +18 -14
- package/es/components/Portal/index.d.ts +25 -0
- package/es/components/Slider/Slider.js +2 -2
- package/es/components/Tag/DismissibleTag.js +2 -2
- package/es/components/Tag/OperationalTag.d.ts +2 -10
- package/es/components/Tag/OperationalTag.js +2 -14
- package/es/components/Tag/SelectableTag.d.ts +2 -10
- package/es/components/Tag/SelectableTag.js +2 -16
- package/es/components/Toggle/Toggle.js +2 -0
- package/es/components/ToggleSmall/ToggleSmall.Skeleton.d.ts +49 -0
- package/es/components/ToggleSmall/index.d.ts +7 -0
- package/es/components/TreeView/TreeNode.js +4 -2
- package/es/components/TreeView/TreeView.js +4 -4
- package/es/components/UIShell/SideNavMenuItem.d.ts +4 -3
- package/es/components/UIShell/SideNavMenuItem.js +1 -4
- package/es/index.js +1 -1
- package/es/internal/useIdPrefix.d.ts +9 -0
- package/lib/components/Accordion/AccordionItem.js +0 -1
- package/lib/components/Button/Button.js +6 -0
- package/lib/components/CheckboxGroup/CheckboxGroup.js +1 -2
- package/lib/components/CheckboxGroup/index.d.ts +10 -0
- package/lib/components/ComboBox/ComboBox.js +18 -23
- package/lib/components/ComboButton/index.js +12 -5
- package/lib/components/DataTable/TableCell.d.ts +1 -4
- package/lib/components/DataTable/TableCell.js +3 -2
- package/lib/components/Disclosure/index.d.ts +18 -0
- package/lib/components/Dropdown/Dropdown.js +18 -16
- package/lib/components/FileUploader/FileUploader.d.ts +8 -92
- package/lib/components/FileUploader/FileUploader.js +113 -134
- package/lib/components/IdPrefix/index.d.ts +26 -0
- package/lib/components/Menu/MenuItem.js +1 -4
- package/lib/components/MenuButton/index.d.ts +4 -0
- package/lib/components/MenuButton/index.js +19 -5
- package/lib/components/MultiSelect/MultiSelect.js +18 -16
- package/lib/components/OverflowMenu/next/index.d.ts +4 -0
- package/lib/components/OverflowMenu/next/index.js +21 -11
- package/lib/components/PaginationNav/PaginationNav.js +1 -1
- package/lib/components/Popover/index.js +18 -14
- package/lib/components/Portal/index.d.ts +25 -0
- package/lib/components/Slider/Slider.js +2 -2
- package/lib/components/Tag/DismissibleTag.js +2 -2
- package/lib/components/Tag/OperationalTag.d.ts +2 -10
- package/lib/components/Tag/OperationalTag.js +2 -14
- package/lib/components/Tag/SelectableTag.d.ts +2 -10
- package/lib/components/Tag/SelectableTag.js +2 -16
- package/lib/components/Toggle/Toggle.js +2 -0
- package/lib/components/ToggleSmall/ToggleSmall.Skeleton.d.ts +49 -0
- package/lib/components/ToggleSmall/index.d.ts +7 -0
- package/lib/components/TreeView/TreeNode.js +4 -2
- package/lib/components/TreeView/TreeView.js +4 -4
- package/lib/components/UIShell/SideNavMenuItem.d.ts +4 -3
- package/lib/components/UIShell/SideNavMenuItem.js +1 -4
- package/lib/index.js +2 -2
- package/lib/internal/useIdPrefix.d.ts +9 -0
- package/package.json +7 -7
- package/telemetry.yml +809 -809
|
@@ -18,6 +18,7 @@ var FileUploaderButton = require('./FileUploaderButton.js');
|
|
|
18
18
|
var types = require('../../prop-types/types.js');
|
|
19
19
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
20
20
|
require('../Text/index.js');
|
|
21
|
+
var useId = require('../../internal/useId.js');
|
|
21
22
|
var Text = require('../Text/Text.js');
|
|
22
23
|
var match = require('../../internal/keyboard/match.js');
|
|
23
24
|
var keys = require('../../internal/keyboard/keys.js');
|
|
@@ -28,144 +29,123 @@ var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
|
|
|
28
29
|
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
|
|
29
30
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
const FileUploader = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref) => {
|
|
33
|
+
let {
|
|
34
|
+
accept,
|
|
35
|
+
buttonKind,
|
|
36
|
+
buttonLabel,
|
|
37
|
+
className,
|
|
38
|
+
disabled,
|
|
39
|
+
filenameStatus,
|
|
40
|
+
iconDescription,
|
|
41
|
+
labelDescription,
|
|
42
|
+
labelTitle,
|
|
43
|
+
multiple,
|
|
44
|
+
name,
|
|
45
|
+
onChange,
|
|
46
|
+
onClick,
|
|
47
|
+
onDelete,
|
|
48
|
+
size,
|
|
49
|
+
...other
|
|
50
|
+
} = _ref;
|
|
51
|
+
const fileUploaderInstanceId = useId.useId('file-uploader');
|
|
52
|
+
const [state, updateState] = React.useState({
|
|
53
|
+
fileNames: []
|
|
54
|
+
});
|
|
55
|
+
const nodes = [];
|
|
56
|
+
const prefix = usePrefix.usePrefix();
|
|
57
|
+
const handleChange = evt => {
|
|
58
|
+
evt.stopPropagation();
|
|
59
|
+
const filenames = Array.prototype.map.call(evt.target.files, file => file.name);
|
|
60
|
+
updateState(prevState => ({
|
|
61
|
+
fileNames: multiple ? [...new Set([...prevState.fileNames, ...filenames])] : filenames
|
|
62
|
+
}));
|
|
63
|
+
if (onChange) {
|
|
64
|
+
onChange(evt);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const handleClick = (evt, _ref2) => {
|
|
68
|
+
let {
|
|
69
|
+
index,
|
|
70
|
+
filenameStatus
|
|
71
|
+
} = _ref2;
|
|
72
|
+
if (filenameStatus === 'edit') {
|
|
40
73
|
evt.stopPropagation();
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
74
|
+
const filteredArray = state.fileNames.filter(filename => filename !== nodes[index]?.innerText?.trim());
|
|
75
|
+
updateState({
|
|
76
|
+
fileNames: filteredArray
|
|
44
77
|
});
|
|
45
|
-
if (
|
|
46
|
-
|
|
78
|
+
if (onDelete) {
|
|
79
|
+
onDelete(evt);
|
|
80
|
+
uploaderButton.current?.focus?.();
|
|
47
81
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
82
|
+
onClick?.(evt);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const uploaderButton = /*#__PURE__*/React__default["default"].createRef();
|
|
86
|
+
const classes = cx__default["default"]({
|
|
87
|
+
[`${prefix}--form-item`]: true,
|
|
88
|
+
[className]: className
|
|
89
|
+
});
|
|
90
|
+
const getHelperLabelClasses = baseClass => cx__default["default"](baseClass, {
|
|
91
|
+
[`${prefix}--label-description--disabled`]: disabled
|
|
92
|
+
});
|
|
93
|
+
const selectedFileClasses = cx__default["default"](`${prefix}--file__selected-file`, {
|
|
94
|
+
[`${prefix}--file__selected-file--md`]: size === 'field' || size === 'md',
|
|
95
|
+
[`${prefix}--file__selected-file--sm`]: size === 'small' || size === 'sm'
|
|
96
|
+
});
|
|
97
|
+
return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
|
|
98
|
+
className: classes
|
|
99
|
+
}, other), !labelTitle ? null : /*#__PURE__*/React__default["default"].createElement(Text.Text, {
|
|
100
|
+
as: "h3",
|
|
101
|
+
className: getHelperLabelClasses(`${prefix}--file--label`)
|
|
102
|
+
}, labelTitle), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
|
|
103
|
+
as: "p",
|
|
104
|
+
className: getHelperLabelClasses(`${prefix}--label-description`),
|
|
105
|
+
id: fileUploaderInstanceId
|
|
106
|
+
}, labelDescription), /*#__PURE__*/React__default["default"].createElement(FileUploaderButton["default"], {
|
|
107
|
+
innerRef: uploaderButton,
|
|
108
|
+
disabled: disabled,
|
|
109
|
+
labelText: buttonLabel,
|
|
110
|
+
multiple: multiple,
|
|
111
|
+
buttonKind: buttonKind,
|
|
112
|
+
onChange: handleChange,
|
|
113
|
+
disableLabelChanges: true,
|
|
114
|
+
accept: accept,
|
|
115
|
+
name: name,
|
|
116
|
+
size: size,
|
|
117
|
+
"aria-describedby": fileUploaderInstanceId
|
|
118
|
+
}), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
119
|
+
className: `${prefix}--file-container`
|
|
120
|
+
}, state.fileNames.length === 0 ? null : state.fileNames.map((name, index) => /*#__PURE__*/React__default["default"].createElement("span", _rollupPluginBabelHelpers["extends"]({
|
|
121
|
+
key: index,
|
|
122
|
+
className: selectedFileClasses,
|
|
123
|
+
ref: node => nodes[index] = node // eslint-disable-line
|
|
124
|
+
}, other), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
|
|
125
|
+
as: "p",
|
|
126
|
+
className: `${prefix}--file-filename`,
|
|
127
|
+
id: name
|
|
128
|
+
}, name), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
129
|
+
className: `${prefix}--file__state-container`
|
|
130
|
+
}, /*#__PURE__*/React__default["default"].createElement(Filename["default"], {
|
|
131
|
+
name: name,
|
|
132
|
+
iconDescription: iconDescription,
|
|
133
|
+
status: filenameStatus,
|
|
134
|
+
onKeyDown: evt => {
|
|
135
|
+
if (match.matches(evt, [keys.Enter, keys.Space])) {
|
|
136
|
+
handleClick(evt, {
|
|
137
|
+
index,
|
|
138
|
+
filenameStatus
|
|
59
139
|
});
|
|
60
|
-
if (this.props.onDelete) {
|
|
61
|
-
this.props.onDelete(evt);
|
|
62
|
-
this.uploaderButton.current?.focus?.();
|
|
63
|
-
}
|
|
64
|
-
this.props.onClick?.(evt);
|
|
65
140
|
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
this.setState({
|
|
70
|
-
filenames: []
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
static getDerivedStateFromProps(_ref2, state) {
|
|
75
|
-
let {
|
|
141
|
+
},
|
|
142
|
+
onClick: evt => handleClick(evt, {
|
|
143
|
+
index,
|
|
76
144
|
filenameStatus
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return prevFilenameStatus === filenameStatus ? null : {
|
|
82
|
-
filenameStatus,
|
|
83
|
-
prevFilenameStatus: filenameStatus
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
render() {
|
|
87
|
-
const {
|
|
88
|
-
iconDescription,
|
|
89
|
-
buttonLabel = '',
|
|
90
|
-
buttonKind = 'primary',
|
|
91
|
-
disabled = false,
|
|
92
|
-
filenameStatus = 'uploading',
|
|
93
|
-
labelDescription,
|
|
94
|
-
labelTitle,
|
|
95
|
-
className,
|
|
96
|
-
multiple = false,
|
|
97
|
-
accept = [],
|
|
98
|
-
name,
|
|
99
|
-
size = 'md',
|
|
100
|
-
onDelete,
|
|
101
|
-
// eslint-disable-line
|
|
102
|
-
...other
|
|
103
|
-
} = this.props;
|
|
104
|
-
const prefix = this.context;
|
|
105
|
-
const classes = cx__default["default"]({
|
|
106
|
-
[`${prefix}--form-item`]: true,
|
|
107
|
-
[className]: className
|
|
108
|
-
});
|
|
109
|
-
const getHelperLabelClasses = baseClass => cx__default["default"](baseClass, {
|
|
110
|
-
[`${prefix}--label-description--disabled`]: disabled
|
|
111
|
-
});
|
|
112
|
-
const selectedFileClasses = cx__default["default"](`${prefix}--file__selected-file`, {
|
|
113
|
-
[`${prefix}--file__selected-file--md`]: size === 'field' || size === 'md',
|
|
114
|
-
[`${prefix}--file__selected-file--sm`]: size === 'small' || size === 'sm'
|
|
115
|
-
});
|
|
116
|
-
return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
|
|
117
|
-
className: classes
|
|
118
|
-
}, other), !labelTitle ? null : /*#__PURE__*/React__default["default"].createElement(Text.Text, {
|
|
119
|
-
as: "h3",
|
|
120
|
-
className: getHelperLabelClasses(`${prefix}--file--label`)
|
|
121
|
-
}, labelTitle), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
|
|
122
|
-
as: "p",
|
|
123
|
-
className: getHelperLabelClasses(`${prefix}--label-description`),
|
|
124
|
-
id: "description"
|
|
125
|
-
}, labelDescription), /*#__PURE__*/React__default["default"].createElement(FileUploaderButton["default"], {
|
|
126
|
-
innerRef: this.uploaderButton,
|
|
127
|
-
disabled: disabled,
|
|
128
|
-
labelText: buttonLabel,
|
|
129
|
-
multiple: multiple,
|
|
130
|
-
buttonKind: buttonKind,
|
|
131
|
-
onChange: this.handleChange,
|
|
132
|
-
disableLabelChanges: true,
|
|
133
|
-
accept: accept,
|
|
134
|
-
name: name,
|
|
135
|
-
size: size,
|
|
136
|
-
"aria-describedby": "description"
|
|
137
|
-
}), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
138
|
-
className: `${prefix}--file-container`
|
|
139
|
-
}, this.state.filenames.length === 0 ? null : this.state.filenames.map((name, index) => /*#__PURE__*/React__default["default"].createElement("span", _rollupPluginBabelHelpers["extends"]({
|
|
140
|
-
key: index,
|
|
141
|
-
className: selectedFileClasses,
|
|
142
|
-
ref: node => this.nodes[index] = node // eslint-disable-line
|
|
143
|
-
}, other), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
|
|
144
|
-
as: "p",
|
|
145
|
-
className: `${prefix}--file-filename`,
|
|
146
|
-
id: name
|
|
147
|
-
}, name), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
148
|
-
className: `${prefix}--file__state-container`
|
|
149
|
-
}, /*#__PURE__*/React__default["default"].createElement(Filename["default"], {
|
|
150
|
-
name: name,
|
|
151
|
-
iconDescription: iconDescription,
|
|
152
|
-
status: filenameStatus,
|
|
153
|
-
onKeyDown: evt => {
|
|
154
|
-
if (match.matches(evt, [keys.Enter, keys.Space])) {
|
|
155
|
-
this.handleClick(evt, {
|
|
156
|
-
index,
|
|
157
|
-
filenameStatus
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
},
|
|
161
|
-
onClick: evt => this.handleClick(evt, {
|
|
162
|
-
index,
|
|
163
|
-
filenameStatus
|
|
164
|
-
})
|
|
165
|
-
}))))));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
_rollupPluginBabelHelpers.defineProperty(FileUploader, "propTypes", {
|
|
145
|
+
})
|
|
146
|
+
}))))));
|
|
147
|
+
});
|
|
148
|
+
FileUploader.propTypes = {
|
|
169
149
|
/**
|
|
170
150
|
* Specify the types of files that this input should be able to receive
|
|
171
151
|
*/
|
|
@@ -231,7 +211,6 @@ _rollupPluginBabelHelpers.defineProperty(FileUploader, "propTypes", {
|
|
|
231
211
|
* sizes.
|
|
232
212
|
*/
|
|
233
213
|
size: PropTypes__default["default"].oneOf(['sm', 'md', 'lg'])
|
|
234
|
-
}
|
|
235
|
-
_rollupPluginBabelHelpers.defineProperty(FileUploader, "contextType", usePrefix.PrefixContext);
|
|
214
|
+
};
|
|
236
215
|
|
|
237
216
|
exports["default"] = FileUploader;
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
import PropTypes from 'prop-types';
|
|
8
|
+
import { PropsWithChildren, ReactNode } from 'react';
|
|
9
|
+
type IdPrefixProps = {
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* The value used to prefix the auto-generated id placed on some DOM elements
|
|
13
|
+
*/
|
|
14
|
+
prefix?: string;
|
|
15
|
+
};
|
|
16
|
+
declare function IdPrefix({ children, prefix }: PropsWithChildren<IdPrefixProps>): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
declare namespace IdPrefix {
|
|
18
|
+
var propTypes: {
|
|
19
|
+
children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
|
|
20
|
+
/**
|
|
21
|
+
* The value used to prefix the auto-generated id placed on some DOM elements
|
|
22
|
+
*/
|
|
23
|
+
prefix: PropTypes.Requireable<string>;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export { IdPrefix };
|
|
@@ -357,9 +357,6 @@ const MenuItemRadioGroup = /*#__PURE__*/React.forwardRef(function MenuItemRadioG
|
|
|
357
357
|
});
|
|
358
358
|
function handleClick(item, e) {
|
|
359
359
|
setSelection(item);
|
|
360
|
-
if (onChange) {
|
|
361
|
-
onChange(e);
|
|
362
|
-
}
|
|
363
360
|
}
|
|
364
361
|
React.useEffect(() => {
|
|
365
362
|
if (!context.state.hasIcons) {
|
|
@@ -384,7 +381,7 @@ const MenuItemRadioGroup = /*#__PURE__*/React.forwardRef(function MenuItemRadioG
|
|
|
384
381
|
"aria-checked": item === selection,
|
|
385
382
|
renderIcon: item === selection ? iconsReact.Checkmark : undefined,
|
|
386
383
|
onClick: e => {
|
|
387
|
-
handleClick(item
|
|
384
|
+
handleClick(item);
|
|
388
385
|
}
|
|
389
386
|
}))));
|
|
390
387
|
});
|
|
@@ -39,6 +39,10 @@ export interface MenuButtonProps extends ComponentProps<'div'> {
|
|
|
39
39
|
* Specify the tabIndex of the button.
|
|
40
40
|
*/
|
|
41
41
|
tabIndex?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Specify a DOM node where the Menu should be rendered in. Defaults to document.body.
|
|
44
|
+
*/
|
|
45
|
+
menuTarget?: Element;
|
|
42
46
|
}
|
|
43
47
|
declare const MenuButton: React.ForwardRefExoticComponent<Omit<MenuButtonProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
44
48
|
export { MenuButton };
|
|
@@ -22,6 +22,7 @@ var useAttachedMenu = require('../../internal/useAttachedMenu.js');
|
|
|
22
22
|
var useId = require('../../internal/useId.js');
|
|
23
23
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
24
24
|
var react = require('@floating-ui/react');
|
|
25
|
+
var index = require('../FeatureFlags/index.js');
|
|
25
26
|
var mergeRefs = require('../../tools/mergeRefs.js');
|
|
26
27
|
|
|
27
28
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
@@ -42,14 +43,21 @@ const MenuButton = /*#__PURE__*/React.forwardRef(function MenuButton(_ref, forwa
|
|
|
42
43
|
size = 'lg',
|
|
43
44
|
menuAlignment = 'bottom',
|
|
44
45
|
tabIndex = 0,
|
|
46
|
+
menuTarget,
|
|
45
47
|
...rest
|
|
46
48
|
} = _ref;
|
|
49
|
+
// feature flag utilized to separate out only the dynamic styles from @floating-ui
|
|
50
|
+
// flag is turned on when collision detection (ie. flip, hide) logic is not desired
|
|
51
|
+
const enableOnlyFloatingStyles = index.useFeatureFlag('enable-v12-dynamic-floating-styles');
|
|
47
52
|
const id = useId.useId('MenuButton');
|
|
48
53
|
const prefix = usePrefix.usePrefix();
|
|
49
54
|
const triggerRef = React.useRef(null);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
let middlewares = [];
|
|
56
|
+
if (!enableOnlyFloatingStyles) {
|
|
57
|
+
middlewares = [react.flip({
|
|
58
|
+
crossAxis: false
|
|
59
|
+
})];
|
|
60
|
+
}
|
|
53
61
|
if (menuAlignment === 'bottom' || menuAlignment === 'top') {
|
|
54
62
|
middlewares.push(react.size({
|
|
55
63
|
apply(_ref2) {
|
|
@@ -131,7 +139,8 @@ const MenuButton = /*#__PURE__*/React.forwardRef(function MenuButton(_ref, forwa
|
|
|
131
139
|
mode: "basic",
|
|
132
140
|
size: size,
|
|
133
141
|
open: open,
|
|
134
|
-
onClose: handleClose
|
|
142
|
+
onClose: handleClose,
|
|
143
|
+
target: menuTarget
|
|
135
144
|
}, children));
|
|
136
145
|
});
|
|
137
146
|
MenuButton.propTypes = {
|
|
@@ -170,7 +179,12 @@ MenuButton.propTypes = {
|
|
|
170
179
|
* Specify the tabIndex of the button.
|
|
171
180
|
*/
|
|
172
181
|
// @ts-ignore-next-line -- avoid spurious (?) TS2322 error
|
|
173
|
-
tabIndex: PropTypes__default["default"].number
|
|
182
|
+
tabIndex: PropTypes__default["default"].number,
|
|
183
|
+
/**
|
|
184
|
+
* Specify a DOM node where the Menu should be rendered in. Defaults to document.body.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
menuTarget: PropTypes__default["default"].instanceOf(typeof Element !== 'undefined' ? Element : Object)
|
|
174
188
|
};
|
|
175
189
|
|
|
176
190
|
exports.MenuButton = MenuButton;
|
|
@@ -16,7 +16,7 @@ var Downshift = require('downshift');
|
|
|
16
16
|
var isEqual = require('react-fast-compare');
|
|
17
17
|
var PropTypes = require('prop-types');
|
|
18
18
|
var React = require('react');
|
|
19
|
-
var index = require('../ListBox/index.js');
|
|
19
|
+
var index$1 = require('../ListBox/index.js');
|
|
20
20
|
var MultiSelectPropTypes = require('./MultiSelectPropTypes.js');
|
|
21
21
|
var sorting = require('./tools/sorting.js');
|
|
22
22
|
var Selection = require('../../internal/Selection.js');
|
|
@@ -31,6 +31,7 @@ require('../Checkbox/Checkbox.Skeleton.js');
|
|
|
31
31
|
var noopFn = require('../../internal/noopFn.js');
|
|
32
32
|
var react = require('@floating-ui/react');
|
|
33
33
|
var floatingUi_dom = require('../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs.js');
|
|
34
|
+
var index = require('../FeatureFlags/index.js');
|
|
34
35
|
var match = require('../../internal/keyboard/match.js');
|
|
35
36
|
var ListBoxPropTypes = require('../ListBox/ListBoxPropTypes.js');
|
|
36
37
|
var keys = require('../../internal/keyboard/keys.js');
|
|
@@ -136,11 +137,12 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
136
137
|
const [prevOpenProp, setPrevOpenProp] = React.useState(open);
|
|
137
138
|
const [topItems, setTopItems] = React.useState([]);
|
|
138
139
|
const [itemsCleared, setItemsCleared] = React.useState(false);
|
|
140
|
+
const enableFloatingStyles = index.useFeatureFlag('enable-v12-dynamic-floating-styles') || autoAlign;
|
|
139
141
|
const {
|
|
140
142
|
refs,
|
|
141
143
|
floatingStyles,
|
|
142
144
|
middlewareData
|
|
143
|
-
} = react.useFloating(
|
|
145
|
+
} = react.useFloating(enableFloatingStyles ? {
|
|
144
146
|
placement: direction,
|
|
145
147
|
// The floating element is positioned relative to its nearest
|
|
146
148
|
// containing block (usually the viewport). It will in many cases also
|
|
@@ -148,7 +150,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
148
150
|
// https://floating-ui.com/docs/misc#clipping
|
|
149
151
|
strategy: 'fixed',
|
|
150
152
|
// Middleware order matters, arrow should be last
|
|
151
|
-
middleware: [react.flip({
|
|
153
|
+
middleware: [autoAlign && react.flip({
|
|
152
154
|
crossAxis: false
|
|
153
155
|
}), react.size({
|
|
154
156
|
apply(_ref2) {
|
|
@@ -160,11 +162,11 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
160
162
|
width: `${rects.reference.width}px`
|
|
161
163
|
});
|
|
162
164
|
}
|
|
163
|
-
}), floatingUi_dom.hide()],
|
|
165
|
+
}), autoAlign && floatingUi_dom.hide()],
|
|
164
166
|
whileElementsMounted: react.autoUpdate
|
|
165
167
|
} : {});
|
|
166
168
|
React.useLayoutEffect(() => {
|
|
167
|
-
if (
|
|
169
|
+
if (enableFloatingStyles) {
|
|
168
170
|
const updatedFloatingStyles = {
|
|
169
171
|
...floatingStyles,
|
|
170
172
|
visibility: middlewareData.hide?.referenceHidden ? 'hidden' : 'visible'
|
|
@@ -175,7 +177,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
175
177
|
}
|
|
176
178
|
});
|
|
177
179
|
}
|
|
178
|
-
}, [
|
|
180
|
+
}, [enableFloatingStyles, floatingStyles, refs.floating, middlewareData, open]);
|
|
179
181
|
const {
|
|
180
182
|
selectedItems: controlledSelectedItems,
|
|
181
183
|
onItemChange,
|
|
@@ -290,7 +292,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
290
292
|
[`${prefix}--multi-select--selected`]: selectedItems && selectedItems.length > 0,
|
|
291
293
|
[`${prefix}--list-box--up`]: direction === 'top',
|
|
292
294
|
[`${prefix}--multi-select--readonly`]: readOnly,
|
|
293
|
-
[`${prefix}--autoalign`]:
|
|
295
|
+
[`${prefix}--autoalign`]: enableFloatingStyles,
|
|
294
296
|
[`${prefix}--multi-select--selectall`]: selectAll
|
|
295
297
|
});
|
|
296
298
|
|
|
@@ -421,15 +423,15 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
421
423
|
|
|
422
424
|
// Memoize the value of getMenuProps to avoid an infinite loop
|
|
423
425
|
const menuProps = React.useMemo(() => getMenuProps({
|
|
424
|
-
ref:
|
|
425
|
-
}), [
|
|
426
|
+
ref: enableFloatingStyles ? refs.setFloating : null
|
|
427
|
+
}), [enableFloatingStyles, getMenuProps, refs.setFloating]);
|
|
426
428
|
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
427
429
|
className: wrapperClasses
|
|
428
430
|
}, /*#__PURE__*/React__default["default"].createElement("label", _rollupPluginBabelHelpers["extends"]({
|
|
429
431
|
className: titleClasses
|
|
430
432
|
}, getLabelProps()), titleText && titleText, selectedItems.length > 0 && /*#__PURE__*/React__default["default"].createElement("span", {
|
|
431
433
|
className: `${prefix}--visually-hidden`
|
|
432
|
-
}, clearSelectionDescription, " ", selectedItems.length, ' ', itemsSelectedText, ",", clearSelectionText)), /*#__PURE__*/React__default["default"].createElement(index["default"], {
|
|
434
|
+
}, clearSelectionDescription, " ", selectedItems.length, ' ', itemsSelectedText, ",", clearSelectionText)), /*#__PURE__*/React__default["default"].createElement(index$1["default"], {
|
|
433
435
|
onFocus: isFluid ? handleFocus : undefined,
|
|
434
436
|
onBlur: isFluid ? handleFocus : undefined,
|
|
435
437
|
type: type,
|
|
@@ -449,8 +451,8 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
449
451
|
className: `${prefix}--list-box__invalid-icon ${prefix}--list-box__invalid-icon--warning`
|
|
450
452
|
}), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
451
453
|
className: multiSelectFieldWrapperClasses,
|
|
452
|
-
ref:
|
|
453
|
-
}, selectedItems.length > 0 && /*#__PURE__*/React__default["default"].createElement(index["default"].Selection, {
|
|
454
|
+
ref: enableFloatingStyles ? refs.setReference : null
|
|
455
|
+
}, selectedItems.length > 0 && /*#__PURE__*/React__default["default"].createElement(index$1["default"].Selection, {
|
|
454
456
|
readOnly: readOnly,
|
|
455
457
|
clearSelection: !disabled && !readOnly ? clearSelection : noopFn.noopFn,
|
|
456
458
|
selectionCount: selectedItemsLength
|
|
@@ -469,10 +471,10 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
469
471
|
}, readOnlyEventHandlers), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
470
472
|
id: fieldLabelId,
|
|
471
473
|
className: `${prefix}--list-box__label`
|
|
472
|
-
}, label), /*#__PURE__*/React__default["default"].createElement(index["default"].MenuIcon, {
|
|
474
|
+
}, label), /*#__PURE__*/React__default["default"].createElement(index$1["default"].MenuIcon, {
|
|
473
475
|
isOpen: isOpen,
|
|
474
476
|
translateWithId: translateWithId
|
|
475
|
-
})), normalizedSlug), /*#__PURE__*/React__default["default"].createElement(index["default"].Menu, menuProps, isOpen && sortItems(filteredItems, sortOptions).map((item, index
|
|
477
|
+
})), normalizedSlug), /*#__PURE__*/React__default["default"].createElement(index$1["default"].Menu, menuProps, isOpen && sortItems(filteredItems, sortOptions).map((item, index) => {
|
|
476
478
|
const isChecked = selectedItems.filter(selected => isEqual__default["default"](selected, item)).length > 0;
|
|
477
479
|
const isIndeterminate = selectedItems.length !== 0 && item['isSelectAll'] && !isChecked;
|
|
478
480
|
const itemProps = getItemProps({
|
|
@@ -482,11 +484,11 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
|
|
|
482
484
|
['aria-selected']: isChecked
|
|
483
485
|
});
|
|
484
486
|
const itemText = itemToString(item);
|
|
485
|
-
return /*#__PURE__*/React__default["default"].createElement(index["default"].MenuItem, _rollupPluginBabelHelpers["extends"]({
|
|
487
|
+
return /*#__PURE__*/React__default["default"].createElement(index$1["default"].MenuItem, _rollupPluginBabelHelpers["extends"]({
|
|
486
488
|
key: itemProps.id,
|
|
487
489
|
isActive: isChecked && !item['isSelectAll'],
|
|
488
490
|
"aria-label": itemText,
|
|
489
|
-
isHighlighted: highlightedIndex === index
|
|
491
|
+
isHighlighted: highlightedIndex === index,
|
|
490
492
|
title: itemText,
|
|
491
493
|
disabled: itemProps['aria-disabled']
|
|
492
494
|
}, itemProps), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
@@ -38,6 +38,10 @@ interface OverflowMenuProps {
|
|
|
38
38
|
* Specify how the trigger tooltip should be aligned.
|
|
39
39
|
*/
|
|
40
40
|
tooltipAlignment?: 'top' | 'top-left' | 'top-right' | 'bottom' | 'bottom-left' | 'bottom-right' | 'left' | 'right';
|
|
41
|
+
/**
|
|
42
|
+
* Specify a DOM node where the Menu should be rendered in. Defaults to document.body.
|
|
43
|
+
*/
|
|
44
|
+
menuTarget?: Element;
|
|
41
45
|
}
|
|
42
46
|
declare const OverflowMenu: React.ForwardRefExoticComponent<OverflowMenuProps & React.RefAttributes<HTMLDivElement>>;
|
|
43
47
|
export { OverflowMenu };
|
|
@@ -15,7 +15,8 @@ var PropTypes = require('prop-types');
|
|
|
15
15
|
var cx = require('classnames');
|
|
16
16
|
var iconsReact = require('@carbon/icons-react');
|
|
17
17
|
var react = require('@floating-ui/react');
|
|
18
|
-
var index = require('../../
|
|
18
|
+
var index = require('../../FeatureFlags/index.js');
|
|
19
|
+
var index$1 = require('../../IconButton/index.js');
|
|
19
20
|
var Menu = require('../../Menu/Menu.js');
|
|
20
21
|
require('../../Menu/MenuItem.js');
|
|
21
22
|
var mergeRefs = require('../../../tools/mergeRefs.js');
|
|
@@ -40,14 +41,16 @@ const OverflowMenu = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
40
41
|
size = defaultSize,
|
|
41
42
|
menuAlignment = 'bottom-start',
|
|
42
43
|
tooltipAlignment,
|
|
44
|
+
menuTarget,
|
|
43
45
|
...rest
|
|
44
46
|
} = _ref;
|
|
47
|
+
const enableFloatingStyles = index.useFeatureFlag('enable-v12-dynamic-floating-styles') || autoAlign;
|
|
45
48
|
const {
|
|
46
49
|
refs,
|
|
47
50
|
floatingStyles,
|
|
48
51
|
placement,
|
|
49
52
|
middlewareData
|
|
50
|
-
} = react.useFloating(
|
|
53
|
+
} = react.useFloating(enableFloatingStyles ? {
|
|
51
54
|
// Computing the position starts with initial positioning
|
|
52
55
|
// via `placement`.
|
|
53
56
|
placement: menuAlignment,
|
|
@@ -59,14 +62,16 @@ const OverflowMenu = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
59
62
|
// Middleware are executed as an in-between “middle” step of the
|
|
60
63
|
// initial `placement` computation and eventual return of data for
|
|
61
64
|
// rendering. Each middleware is executed in order.
|
|
62
|
-
middleware: [react.flip({
|
|
65
|
+
middleware: [autoAlign && react.flip({
|
|
63
66
|
// An explicit array of placements to try if the initial
|
|
64
67
|
// `placement` doesn’t fit on the axes in which overflow
|
|
65
68
|
// is checked.
|
|
66
69
|
fallbackPlacements: menuAlignment.includes('bottom') ? ['bottom-start', 'bottom-end', 'top-start', 'top-end'] : ['top-start', 'top-end', 'bottom-start', 'bottom-end']
|
|
67
70
|
})],
|
|
68
71
|
whileElementsMounted: react.autoUpdate
|
|
69
|
-
} : {}
|
|
72
|
+
} : {}
|
|
73
|
+
// When autoAlign is turned off & the `enable-v12-dynamic-floating-styles` feature flag is not
|
|
74
|
+
// enabled, floating-ui will not be used
|
|
70
75
|
);
|
|
71
76
|
const id = useId.useId('overflowmenu');
|
|
72
77
|
const prefix = usePrefix.usePrefix();
|
|
@@ -80,21 +85,21 @@ const OverflowMenu = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
80
85
|
handleClose
|
|
81
86
|
} = useAttachedMenu.useAttachedMenu(triggerRef);
|
|
82
87
|
React.useEffect(() => {
|
|
83
|
-
if (
|
|
88
|
+
if (enableFloatingStyles) {
|
|
84
89
|
Object.keys(floatingStyles).forEach(style => {
|
|
85
90
|
if (refs.floating.current) {
|
|
86
91
|
refs.floating.current.style[style] = floatingStyles[style];
|
|
87
92
|
}
|
|
88
93
|
});
|
|
89
94
|
}
|
|
90
|
-
}, [floatingStyles,
|
|
95
|
+
}, [floatingStyles, enableFloatingStyles, refs.floating, open, placement, middlewareData]);
|
|
91
96
|
function handleTriggerClick() {
|
|
92
97
|
if (triggerRef.current) {
|
|
93
98
|
hookOnClick();
|
|
94
99
|
}
|
|
95
100
|
}
|
|
96
101
|
const containerClasses = cx__default["default"](className, `${prefix}--overflow-menu__container`, {
|
|
97
|
-
[`${prefix}--autoalign`]:
|
|
102
|
+
[`${prefix}--autoalign`]: enableFloatingStyles
|
|
98
103
|
});
|
|
99
104
|
const menuClasses = cx__default["default"](`${prefix}--overflow-menu__${menuAlignment}`);
|
|
100
105
|
const triggerClasses = cx__default["default"](`${prefix}--overflow-menu`, {
|
|
@@ -105,7 +110,7 @@ const OverflowMenu = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
105
110
|
className: containerClasses,
|
|
106
111
|
"aria-owns": open ? id : undefined,
|
|
107
112
|
ref: forwardRef
|
|
108
|
-
}), /*#__PURE__*/React__default["default"].createElement(index.IconButton, {
|
|
113
|
+
}), /*#__PURE__*/React__default["default"].createElement(index$1.IconButton, {
|
|
109
114
|
"aria-controls": open ? id : undefined,
|
|
110
115
|
"aria-haspopup": true,
|
|
111
116
|
"aria-expanded": open,
|
|
@@ -125,12 +130,13 @@ const OverflowMenu = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
125
130
|
className: menuClasses,
|
|
126
131
|
id: id,
|
|
127
132
|
size: size,
|
|
128
|
-
legacyAutoalign: !
|
|
133
|
+
legacyAutoalign: !enableFloatingStyles,
|
|
129
134
|
open: open,
|
|
130
135
|
onClose: handleClose,
|
|
131
136
|
x: x,
|
|
132
137
|
y: y,
|
|
133
|
-
label: label
|
|
138
|
+
label: label,
|
|
139
|
+
target: menuTarget
|
|
134
140
|
}, children));
|
|
135
141
|
});
|
|
136
142
|
OverflowMenu.propTypes = {
|
|
@@ -166,7 +172,11 @@ OverflowMenu.propTypes = {
|
|
|
166
172
|
/**
|
|
167
173
|
* Specify how the trigger tooltip should be aligned.
|
|
168
174
|
*/
|
|
169
|
-
tooltipAlignment: PropTypes__default["default"].oneOf(['top', 'top-left', 'top-right', 'bottom', 'bottom-left', 'bottom-right', 'left', 'right'])
|
|
175
|
+
tooltipAlignment: PropTypes__default["default"].oneOf(['top', 'top-left', 'top-right', 'bottom', 'bottom-left', 'bottom-right', 'left', 'right']),
|
|
176
|
+
/**
|
|
177
|
+
* Specify a DOM node where the Menu should be rendered in. Defaults to document.body.
|
|
178
|
+
*/
|
|
179
|
+
menuTarget: PropTypes__default["default"].instanceOf(typeof Element !== 'undefined' ? Element : Object)
|
|
170
180
|
};
|
|
171
181
|
|
|
172
182
|
exports.OverflowMenu = OverflowMenu;
|
|
@@ -223,7 +223,7 @@ const PaginationNav = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
223
223
|
}
|
|
224
224
|
function pageWouldBeHidden(page) {
|
|
225
225
|
const startOffset = itemsDisplayedOnPage <= 4 && page > 1 ? 0 : 1;
|
|
226
|
-
const wouldBeHiddenInFront = page >= startOffset && page <= cuts.front;
|
|
226
|
+
const wouldBeHiddenInFront = page >= startOffset && page <= cuts.front || page === 0;
|
|
227
227
|
const wouldBeHiddenInBack = page >= totalItems - cuts.back - 1 && page <= totalItems - 2;
|
|
228
228
|
return wouldBeHiddenInFront || wouldBeHiddenInBack;
|
|
229
229
|
}
|