@patternfly/react-core 5.0.0-alpha.109 → 5.0.0-alpha.110
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/esm/components/AboutModal/package.json +1 -1
- package/dist/esm/components/Accordion/package.json +1 -1
- package/dist/esm/components/ActionList/package.json +1 -1
- package/dist/esm/components/Alert/package.json +1 -1
- package/dist/esm/components/Avatar/package.json +1 -1
- package/dist/esm/components/BackToTop/package.json +1 -1
- package/dist/esm/components/Backdrop/package.json +1 -1
- package/dist/esm/components/BackgroundImage/package.json +1 -1
- package/dist/esm/components/Badge/package.json +1 -1
- package/dist/esm/components/Banner/package.json +1 -1
- package/dist/esm/components/Brand/package.json +1 -1
- package/dist/esm/components/Breadcrumb/package.json +1 -1
- package/dist/esm/components/Button/package.json +1 -1
- package/dist/esm/components/CalendarMonth/package.json +1 -1
- package/dist/esm/components/Card/package.json +1 -1
- package/dist/esm/components/Checkbox/package.json +1 -1
- package/dist/esm/components/Chip/package.json +1 -1
- package/dist/esm/components/ClipboardCopy/package.json +1 -1
- package/dist/esm/components/CodeBlock/package.json +1 -1
- package/dist/esm/components/DataList/package.json +1 -1
- package/dist/esm/components/DatePicker/package.json +1 -1
- package/dist/esm/components/DescriptionList/package.json +1 -1
- package/dist/esm/components/Divider/package.json +1 -1
- package/dist/esm/components/DragDrop/package.json +1 -1
- package/dist/esm/components/Drawer/package.json +1 -1
- package/dist/esm/components/Dropdown/Dropdown.d.ts +3 -1
- package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/esm/components/Dropdown/Dropdown.js +3 -4
- package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/esm/components/Dropdown/package.json +1 -1
- package/dist/esm/components/DualListSelector/package.json +1 -1
- package/dist/esm/components/EmptyState/package.json +1 -1
- package/dist/esm/components/ExpandableSection/package.json +1 -1
- package/dist/esm/components/FileUpload/package.json +1 -1
- package/dist/esm/components/Form/package.json +1 -1
- package/dist/esm/components/FormSelect/package.json +1 -1
- package/dist/esm/components/HelperText/package.json +1 -1
- package/dist/esm/components/Hint/package.json +1 -1
- package/dist/esm/components/Icon/package.json +1 -1
- package/dist/esm/components/InputGroup/package.json +1 -1
- package/dist/esm/components/JumpLinks/package.json +1 -1
- package/dist/esm/components/Label/package.json +1 -1
- package/dist/esm/components/List/package.json +1 -1
- package/dist/esm/components/LoginPage/package.json +1 -1
- package/dist/esm/components/Masthead/package.json +1 -1
- package/dist/esm/components/Menu/Menu.js +7 -4
- package/dist/esm/components/Menu/Menu.js.map +1 -1
- package/dist/esm/components/Menu/MenuContainer.d.ts +42 -0
- package/dist/esm/components/Menu/MenuContainer.d.ts.map +1 -0
- package/dist/esm/components/Menu/MenuContainer.js +47 -0
- package/dist/esm/components/Menu/MenuContainer.js.map +1 -0
- package/dist/esm/components/Menu/index.d.ts +1 -0
- package/dist/esm/components/Menu/index.d.ts.map +1 -1
- package/dist/esm/components/Menu/index.js +1 -0
- package/dist/esm/components/Menu/index.js.map +1 -1
- package/dist/esm/components/Menu/package.json +1 -1
- package/dist/esm/components/MenuToggle/package.json +1 -1
- package/dist/esm/components/Modal/package.json +1 -1
- package/dist/esm/components/MultipleFileUpload/package.json +1 -1
- package/dist/esm/components/Nav/package.json +1 -1
- package/dist/esm/components/NotificationBadge/package.json +1 -1
- package/dist/esm/components/NotificationDrawer/package.json +1 -1
- package/dist/esm/components/NumberInput/package.json +1 -1
- package/dist/esm/components/OverflowMenu/package.json +1 -1
- package/dist/esm/components/Page/package.json +1 -1
- package/dist/esm/components/Pagination/package.json +1 -1
- package/dist/esm/components/Panel/package.json +1 -1
- package/dist/esm/components/Popover/package.json +1 -1
- package/dist/esm/components/Progress/package.json +1 -1
- package/dist/esm/components/ProgressStepper/package.json +1 -1
- package/dist/esm/components/Radio/package.json +1 -1
- package/dist/esm/components/SearchInput/package.json +1 -1
- package/dist/esm/components/Select/package.json +1 -1
- package/dist/esm/components/Sidebar/package.json +1 -1
- package/dist/esm/components/SimpleList/package.json +1 -1
- package/dist/esm/components/Skeleton/package.json +1 -1
- package/dist/esm/components/SkipToContent/package.json +1 -1
- package/dist/esm/components/Slider/package.json +1 -1
- package/dist/esm/components/Spinner/package.json +1 -1
- package/dist/esm/components/Switch/package.json +1 -1
- package/dist/esm/components/Tabs/package.json +1 -1
- package/dist/esm/components/Text/package.json +1 -1
- package/dist/esm/components/TextArea/package.json +1 -1
- package/dist/esm/components/TextInput/package.json +1 -1
- package/dist/esm/components/TextInputGroup/package.json +1 -1
- package/dist/esm/components/Tile/package.json +1 -1
- package/dist/esm/components/TimePicker/package.json +1 -1
- package/dist/esm/components/Timestamp/package.json +1 -1
- package/dist/esm/components/Title/package.json +1 -1
- package/dist/esm/components/ToggleGroup/package.json +1 -1
- package/dist/esm/components/Toolbar/package.json +1 -1
- package/dist/esm/components/Tooltip/package.json +1 -1
- package/dist/esm/components/TreeView/package.json +1 -1
- package/dist/esm/components/Truncate/package.json +1 -1
- package/dist/esm/components/Wizard/hooks/package.json +1 -1
- package/dist/esm/components/Wizard/package.json +1 -1
- package/dist/esm/components/package.json +1 -1
- package/dist/esm/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/esm/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/esm/deprecated/components/Dropdown/package.json +1 -1
- package/dist/esm/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/esm/deprecated/components/PageHeader/package.json +1 -1
- package/dist/esm/deprecated/components/Select/package.json +1 -1
- package/dist/esm/deprecated/components/Wizard/package.json +1 -1
- package/dist/esm/deprecated/components/package.json +1 -1
- package/dist/esm/deprecated/package.json +1 -1
- package/dist/esm/helpers/Popper/thirdparty/popper-core/package.json +1 -1
- package/dist/esm/helpers/package.json +1 -1
- package/dist/esm/layouts/Bullseye/package.json +1 -1
- package/dist/esm/layouts/Flex/package.json +1 -1
- package/dist/esm/layouts/Gallery/package.json +1 -1
- package/dist/esm/layouts/Grid/package.json +1 -1
- package/dist/esm/layouts/Level/package.json +1 -1
- package/dist/esm/layouts/Split/package.json +1 -1
- package/dist/esm/layouts/Stack/package.json +1 -1
- package/dist/esm/layouts/package.json +1 -1
- package/dist/esm/next/components/package.json +1 -1
- package/dist/esm/next/package.json +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/js/components/AboutModal/package.json +1 -1
- package/dist/js/components/Accordion/package.json +1 -1
- package/dist/js/components/ActionList/package.json +1 -1
- package/dist/js/components/Alert/package.json +1 -1
- package/dist/js/components/Avatar/package.json +1 -1
- package/dist/js/components/BackToTop/package.json +1 -1
- package/dist/js/components/Backdrop/package.json +1 -1
- package/dist/js/components/BackgroundImage/package.json +1 -1
- package/dist/js/components/Badge/package.json +1 -1
- package/dist/js/components/Banner/package.json +1 -1
- package/dist/js/components/Brand/package.json +1 -1
- package/dist/js/components/Breadcrumb/package.json +1 -1
- package/dist/js/components/Button/package.json +1 -1
- package/dist/js/components/CalendarMonth/package.json +1 -1
- package/dist/js/components/Card/package.json +1 -1
- package/dist/js/components/Checkbox/package.json +1 -1
- package/dist/js/components/Chip/package.json +1 -1
- package/dist/js/components/ClipboardCopy/package.json +1 -1
- package/dist/js/components/CodeBlock/package.json +1 -1
- package/dist/js/components/DataList/package.json +1 -1
- package/dist/js/components/DatePicker/package.json +1 -1
- package/dist/js/components/DescriptionList/package.json +1 -1
- package/dist/js/components/Divider/package.json +1 -1
- package/dist/js/components/DragDrop/package.json +1 -1
- package/dist/js/components/Drawer/package.json +1 -1
- package/dist/js/components/Dropdown/Dropdown.d.ts +3 -1
- package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/js/components/Dropdown/Dropdown.js +3 -4
- package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
- package/dist/js/components/Dropdown/package.json +1 -1
- package/dist/js/components/DualListSelector/package.json +1 -1
- package/dist/js/components/EmptyState/package.json +1 -1
- package/dist/js/components/ExpandableSection/package.json +1 -1
- package/dist/js/components/FileUpload/package.json +1 -1
- package/dist/js/components/Form/package.json +1 -1
- package/dist/js/components/FormSelect/package.json +1 -1
- package/dist/js/components/HelperText/package.json +1 -1
- package/dist/js/components/Hint/package.json +1 -1
- package/dist/js/components/Icon/package.json +1 -1
- package/dist/js/components/InputGroup/package.json +1 -1
- package/dist/js/components/JumpLinks/package.json +1 -1
- package/dist/js/components/Label/package.json +1 -1
- package/dist/js/components/List/package.json +1 -1
- package/dist/js/components/LoginPage/package.json +1 -1
- package/dist/js/components/Masthead/package.json +1 -1
- package/dist/js/components/Menu/Menu.js +7 -4
- package/dist/js/components/Menu/Menu.js.map +1 -1
- package/dist/js/components/Menu/MenuContainer.d.ts +42 -0
- package/dist/js/components/Menu/MenuContainer.d.ts.map +1 -0
- package/dist/js/components/Menu/MenuContainer.js +52 -0
- package/dist/js/components/Menu/MenuContainer.js.map +1 -0
- package/dist/js/components/Menu/index.d.ts +1 -0
- package/dist/js/components/Menu/index.d.ts.map +1 -1
- package/dist/js/components/Menu/index.js +1 -0
- package/dist/js/components/Menu/index.js.map +1 -1
- package/dist/js/components/Menu/package.json +1 -1
- package/dist/js/components/MenuToggle/package.json +1 -1
- package/dist/js/components/Modal/package.json +1 -1
- package/dist/js/components/MultipleFileUpload/package.json +1 -1
- package/dist/js/components/Nav/package.json +1 -1
- package/dist/js/components/NotificationBadge/package.json +1 -1
- package/dist/js/components/NotificationDrawer/package.json +1 -1
- package/dist/js/components/NumberInput/package.json +1 -1
- package/dist/js/components/OverflowMenu/package.json +1 -1
- package/dist/js/components/Page/package.json +1 -1
- package/dist/js/components/Pagination/package.json +1 -1
- package/dist/js/components/Panel/package.json +1 -1
- package/dist/js/components/Popover/package.json +1 -1
- package/dist/js/components/Progress/package.json +1 -1
- package/dist/js/components/ProgressStepper/package.json +1 -1
- package/dist/js/components/Radio/package.json +1 -1
- package/dist/js/components/SearchInput/package.json +1 -1
- package/dist/js/components/Select/package.json +1 -1
- package/dist/js/components/Sidebar/package.json +1 -1
- package/dist/js/components/SimpleList/package.json +1 -1
- package/dist/js/components/Skeleton/package.json +1 -1
- package/dist/js/components/SkipToContent/package.json +1 -1
- package/dist/js/components/Slider/package.json +1 -1
- package/dist/js/components/Spinner/package.json +1 -1
- package/dist/js/components/Switch/package.json +1 -1
- package/dist/js/components/Tabs/package.json +1 -1
- package/dist/js/components/Text/package.json +1 -1
- package/dist/js/components/TextArea/package.json +1 -1
- package/dist/js/components/TextInput/package.json +1 -1
- package/dist/js/components/TextInputGroup/package.json +1 -1
- package/dist/js/components/Tile/package.json +1 -1
- package/dist/js/components/TimePicker/package.json +1 -1
- package/dist/js/components/Timestamp/package.json +1 -1
- package/dist/js/components/Title/package.json +1 -1
- package/dist/js/components/ToggleGroup/package.json +1 -1
- package/dist/js/components/Toolbar/package.json +1 -1
- package/dist/js/components/Tooltip/package.json +1 -1
- package/dist/js/components/TreeView/package.json +1 -1
- package/dist/js/components/Truncate/package.json +1 -1
- package/dist/js/components/Wizard/hooks/package.json +1 -1
- package/dist/js/components/Wizard/package.json +1 -1
- package/dist/js/components/package.json +1 -1
- package/dist/js/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/js/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/js/deprecated/components/Dropdown/package.json +1 -1
- package/dist/js/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/js/deprecated/components/PageHeader/package.json +1 -1
- package/dist/js/deprecated/components/Select/package.json +1 -1
- package/dist/js/deprecated/components/Wizard/package.json +1 -1
- package/dist/js/deprecated/components/package.json +1 -1
- package/dist/js/deprecated/package.json +1 -1
- package/dist/js/helpers/Popper/thirdparty/popper-core/package.json +1 -1
- package/dist/js/helpers/package.json +1 -1
- package/dist/js/layouts/Bullseye/package.json +1 -1
- package/dist/js/layouts/Flex/package.json +1 -1
- package/dist/js/layouts/Gallery/package.json +1 -1
- package/dist/js/layouts/Grid/package.json +1 -1
- package/dist/js/layouts/Level/package.json +1 -1
- package/dist/js/layouts/Split/package.json +1 -1
- package/dist/js/layouts/Stack/package.json +1 -1
- package/dist/js/layouts/package.json +1 -1
- package/dist/js/next/components/package.json +1 -1
- package/dist/js/next/package.json +1 -1
- package/dist/js/package.json +1 -1
- package/dist/umd/react-core.min.js +2 -2
- package/package.json +2 -2
- package/src/components/Dropdown/Dropdown.tsx +6 -4
- package/src/components/Menu/Menu.tsx +2 -2
- package/src/components/Menu/MenuContainer.tsx +109 -0
- package/src/components/Menu/examples/Menu.md +13 -1
- package/src/components/Menu/index.ts +1 -0
- package/src/demos/CustomMenus/ApplicationLauncher.md +30 -0
- package/src/demos/CustomMenus/ContextSelector.md +30 -0
- package/src/demos/CustomMenus/CustomMenus.md +84 -0
- package/src/demos/CustomMenus/OptionsMenu.md +17 -0
- package/src/demos/{ComposableMenu/examples/ComposableActionsMenu.tsx → CustomMenus/examples/ActionsMenuDemo.tsx} +25 -57
- package/src/demos/{ComposableMenu/examples/ComposableApplicationLauncher.tsx → CustomMenus/examples/ApplicationLauncherDemo.tsx} +72 -99
- package/src/demos/{ComposableMenu/examples/ComposableContextSelector.tsx → CustomMenus/examples/ContextSelectorDemo.tsx} +43 -80
- package/src/demos/CustomMenus/examples/DateSelectDemo.tsx +84 -0
- package/src/demos/{ComposableMenu/examples/ComposableDrilldownMenu.tsx → CustomMenus/examples/DrilldownMenuDemo.tsx} +14 -36
- package/src/demos/CustomMenus/examples/FavoritesDemo.tsx +120 -0
- package/src/demos/{ComposableMenu/examples/ComposableFlyout.tsx → CustomMenus/examples/FlyoutDemo.tsx} +14 -39
- package/src/demos/CustomMenus/examples/OptionsMenuDemo.tsx +59 -0
- package/src/demos/{ComposableMenu/examples/ComposableTreeViewMenu.tsx → CustomMenus/examples/TreeViewMenuDemo.tsx} +15 -52
- package/src/demos/ComposableMenu/ComposableMenu.md +0 -118
- package/src/demos/ComposableMenu/examples/ComposableMultipleTypeaheadSelect.tsx +0 -253
- package/src/demos/ComposableMenu/examples/ComposableOptionsMenuVariants.tsx +0 -96
- package/src/demos/ComposableMenu/examples/ComposableSimpleCheckboxSelect.tsx +0 -101
- package/src/demos/ComposableMenu/examples/ComposableSimpleDropdown.tsx +0 -70
- package/src/demos/ComposableMenu/examples/ComposableSimpleSelect.tsx +0 -83
- package/src/demos/ComposableMenu/examples/ComposableTypeaheadSelect.tsx +0 -234
- /package/src/demos/{ComposableMenu → CustomMenus}/examples/ComposableDateSelect.tsx +0 -0
- /package/src/demos/{ComposableMenu → CustomMenus}/examples/ComposableDropdwnVariants.tsx +0 -0
- /package/src/demos/{ComposableMenu → CustomMenus}/examples/avatarImg.svg +0 -0
- /package/src/demos/{ComposableMenu → CustomMenus}/examples/pf-logo-small.svg +0 -0
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
Menu,
|
|
4
|
-
MenuContent,
|
|
5
|
-
MenuList,
|
|
6
|
-
MenuItem,
|
|
7
|
-
MenuItemProps,
|
|
8
|
-
MenuToggle,
|
|
9
|
-
MenuToggleElement,
|
|
10
|
-
Popper,
|
|
11
|
-
TextInputGroup,
|
|
12
|
-
TextInputGroupMain,
|
|
13
|
-
TextInputGroupUtilities,
|
|
14
|
-
ChipGroup,
|
|
15
|
-
Chip,
|
|
16
|
-
Button
|
|
17
|
-
} from '@patternfly/react-core';
|
|
18
|
-
import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
|
|
19
|
-
|
|
20
|
-
const intitalMenuItems = [
|
|
21
|
-
{ itemId: 'Option 1', children: 'Option 1' },
|
|
22
|
-
{ itemId: 'Option 2', children: 'Option 2' },
|
|
23
|
-
{ itemId: 'Option 3', children: 'Option 3' }
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
export const ComposableMultipleTypeaheadSelect: React.FunctionComponent = () => {
|
|
27
|
-
const [isMenuOpen, setIsMenuOpen] = React.useState(false);
|
|
28
|
-
const [inputValue, setInputValue] = React.useState<string>('');
|
|
29
|
-
const [menuItems, setMenuItems] = React.useState<MenuItemProps[]>(intitalMenuItems);
|
|
30
|
-
const [focusedItemIndex, setFocusedItemIndex] = React.useState<number | null>(null);
|
|
31
|
-
const [activeItem, setActiveItem] = React.useState<string | null>(null);
|
|
32
|
-
const [selected, setSelected] = React.useState<string[]>([]);
|
|
33
|
-
const menuToggleRef = React.useRef<MenuToggleElement>({} as MenuToggleElement);
|
|
34
|
-
const textInputRef = React.useRef<HTMLInputElement>();
|
|
35
|
-
const menuRef = React.useRef<HTMLDivElement>();
|
|
36
|
-
const toggleRef = React.useRef<MenuToggleElement>(null);
|
|
37
|
-
|
|
38
|
-
React.useEffect(() => {
|
|
39
|
-
let newMenuItems: MenuItemProps[] = intitalMenuItems;
|
|
40
|
-
|
|
41
|
-
// Filter menu items based on the text input value when one exists
|
|
42
|
-
if (inputValue) {
|
|
43
|
-
newMenuItems = intitalMenuItems.filter((menuItem) =>
|
|
44
|
-
String(menuItem.children).toLowerCase().includes(inputValue.toLowerCase())
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
// When no options are found after filtering, display 'No results found'.
|
|
48
|
-
if (!newMenuItems.length) {
|
|
49
|
-
newMenuItems = [{ isDisabled: false, children: `No results found for "${inputValue}"`, itemId: 'no results' }];
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Open the menu when the input value changes and the new value is not empty
|
|
53
|
-
if (!isMenuOpen) {
|
|
54
|
-
setIsMenuOpen(true);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
setMenuItems(newMenuItems);
|
|
59
|
-
setActiveItem(null);
|
|
60
|
-
setFocusedItemIndex(null);
|
|
61
|
-
}, [inputValue]);
|
|
62
|
-
|
|
63
|
-
const focusOnInput = () => textInputRef.current?.focus();
|
|
64
|
-
|
|
65
|
-
const handleMenuArrowKeys = (key: string) => {
|
|
66
|
-
let indexToFocus;
|
|
67
|
-
|
|
68
|
-
if (isMenuOpen) {
|
|
69
|
-
if (key === 'ArrowUp') {
|
|
70
|
-
// When no index is set or at the first index, focus to the last, otherwise decrement focus index
|
|
71
|
-
if (focusedItemIndex === null || focusedItemIndex === 0) {
|
|
72
|
-
indexToFocus = menuItems.length - 1;
|
|
73
|
-
} else {
|
|
74
|
-
indexToFocus = focusedItemIndex - 1;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (key === 'ArrowDown') {
|
|
79
|
-
// When no index is set or at the last index, focus to the first, otherwise increment focus index
|
|
80
|
-
if (focusedItemIndex === null || focusedItemIndex === menuItems.length - 1) {
|
|
81
|
-
indexToFocus = 0;
|
|
82
|
-
} else {
|
|
83
|
-
indexToFocus = focusedItemIndex + 1;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
setFocusedItemIndex(indexToFocus);
|
|
88
|
-
const focusedItem = menuItems.filter((item) => !item.isDisabled)[indexToFocus];
|
|
89
|
-
setActiveItem(`composable-multi-typeahead-${focusedItem.itemId.replace(' ', '-')}`);
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const onInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
|
|
94
|
-
const enabledMenuItems = menuItems.filter((menuItem) => !menuItem.isDisabled);
|
|
95
|
-
const [firstMenuItem] = enabledMenuItems;
|
|
96
|
-
const focusedItem = focusedItemIndex ? enabledMenuItems[focusedItemIndex] : firstMenuItem;
|
|
97
|
-
|
|
98
|
-
switch (event.key) {
|
|
99
|
-
// Select the first available option
|
|
100
|
-
case 'Enter':
|
|
101
|
-
if (!isMenuOpen) {
|
|
102
|
-
setIsMenuOpen((prevIsOpen) => !prevIsOpen);
|
|
103
|
-
// Only allow selection if the first item is a valid, selectable option
|
|
104
|
-
} else if (isMenuOpen && focusedItem.itemId !== 'no results') {
|
|
105
|
-
onMenuSelect(focusedItem.itemId as string);
|
|
106
|
-
}
|
|
107
|
-
break;
|
|
108
|
-
case 'Tab':
|
|
109
|
-
case 'Escape':
|
|
110
|
-
setIsMenuOpen(false);
|
|
111
|
-
setActiveItem(null);
|
|
112
|
-
break;
|
|
113
|
-
case 'ArrowUp':
|
|
114
|
-
case 'ArrowDown':
|
|
115
|
-
event.preventDefault();
|
|
116
|
-
handleMenuArrowKeys(event.key);
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// Close the menu when a click occurs outside of the menu, toggle, or input.
|
|
122
|
-
const onDocumentClick = (event: MouseEvent | undefined) => {
|
|
123
|
-
const isValidClick = [menuRef, menuToggleRef, textInputRef].some((ref) =>
|
|
124
|
-
ref?.current?.contains(event?.target as HTMLElement)
|
|
125
|
-
);
|
|
126
|
-
if (isMenuOpen && !isValidClick) {
|
|
127
|
-
setIsMenuOpen(false);
|
|
128
|
-
setActiveItem(null);
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
// Close the menu when focus is on a menu item and Escape or Tab is pressed
|
|
133
|
-
const onDocumentKeydown = (event: KeyboardEvent | undefined) => {
|
|
134
|
-
if (isMenuOpen && menuRef?.current?.contains(event?.target as HTMLElement)) {
|
|
135
|
-
if (event?.key === 'Escape') {
|
|
136
|
-
setIsMenuOpen(false);
|
|
137
|
-
focusOnInput();
|
|
138
|
-
} else if (event?.key === 'Tab') {
|
|
139
|
-
setIsMenuOpen(false);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
const toggleMenuOpen = () => {
|
|
145
|
-
setIsMenuOpen(!isMenuOpen);
|
|
146
|
-
focusOnInput();
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
const onTextInputChange = (_event: React.FormEvent<HTMLInputElement>, value: string) => {
|
|
150
|
-
setInputValue(value);
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
const onMenuSelect = (itemId: string) => {
|
|
154
|
-
// Only allow selection if the item is a valid, selectable option
|
|
155
|
-
if (itemId && itemId !== 'no results') {
|
|
156
|
-
setSelected(
|
|
157
|
-
selected.includes(itemId) ? selected.filter((selection) => selection !== itemId) : [...selected, itemId]
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
focusOnInput();
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
const toggle = (
|
|
165
|
-
<MenuToggle
|
|
166
|
-
ref={toggleRef}
|
|
167
|
-
variant="typeahead"
|
|
168
|
-
onClick={toggleMenuOpen}
|
|
169
|
-
innerRef={menuToggleRef}
|
|
170
|
-
isExpanded={isMenuOpen}
|
|
171
|
-
isFullWidth
|
|
172
|
-
>
|
|
173
|
-
<TextInputGroup isPlain>
|
|
174
|
-
<TextInputGroupMain
|
|
175
|
-
value={inputValue}
|
|
176
|
-
onClick={toggleMenuOpen}
|
|
177
|
-
onChange={onTextInputChange}
|
|
178
|
-
onKeyDown={onInputKeyDown}
|
|
179
|
-
id="multi-typeahead-select-input"
|
|
180
|
-
autoComplete="off"
|
|
181
|
-
innerRef={textInputRef}
|
|
182
|
-
{...(activeItem && { 'aria-activedescendant': activeItem })}
|
|
183
|
-
role="combobox"
|
|
184
|
-
isExpanded={isMenuOpen}
|
|
185
|
-
aria-controls="composable-multi-typeahead-listbox"
|
|
186
|
-
>
|
|
187
|
-
<ChipGroup aria-label="Current filters">
|
|
188
|
-
{selected.map((selection, index) => (
|
|
189
|
-
<Chip
|
|
190
|
-
key={index}
|
|
191
|
-
onClick={(ev) => {
|
|
192
|
-
ev.stopPropagation();
|
|
193
|
-
onMenuSelect(selection);
|
|
194
|
-
}}
|
|
195
|
-
>
|
|
196
|
-
{selection}
|
|
197
|
-
</Chip>
|
|
198
|
-
))}
|
|
199
|
-
</ChipGroup>
|
|
200
|
-
</TextInputGroupMain>
|
|
201
|
-
<TextInputGroupUtilities>
|
|
202
|
-
{selected.length > 0 && (
|
|
203
|
-
<Button
|
|
204
|
-
variant="plain"
|
|
205
|
-
onClick={() => {
|
|
206
|
-
setInputValue('');
|
|
207
|
-
setSelected([]);
|
|
208
|
-
}}
|
|
209
|
-
aria-label="Clear input value"
|
|
210
|
-
>
|
|
211
|
-
<TimesIcon aria-hidden />
|
|
212
|
-
</Button>
|
|
213
|
-
)}
|
|
214
|
-
</TextInputGroupUtilities>
|
|
215
|
-
</TextInputGroup>
|
|
216
|
-
</MenuToggle>
|
|
217
|
-
);
|
|
218
|
-
const menu = (
|
|
219
|
-
<Menu
|
|
220
|
-
ref={menuRef as React.Ref<HTMLDivElement>}
|
|
221
|
-
id="multiple-typeahead-select-menu"
|
|
222
|
-
onSelect={(_ev, itemId) => onMenuSelect(itemId?.toString() as string)}
|
|
223
|
-
selected={selected}
|
|
224
|
-
role="listbox"
|
|
225
|
-
>
|
|
226
|
-
<MenuContent>
|
|
227
|
-
<MenuList id="composable-multi-typeahead-listbox" isAriaMultiselectable>
|
|
228
|
-
{menuItems.map((itemProps, index) => (
|
|
229
|
-
<MenuItem
|
|
230
|
-
id={`composable-multi-typeahead-${itemProps.itemId.replace(' ', '-')}`}
|
|
231
|
-
key={itemProps.itemId || itemProps.children}
|
|
232
|
-
isFocused={focusedItemIndex === index}
|
|
233
|
-
className={itemProps.className}
|
|
234
|
-
{...itemProps}
|
|
235
|
-
ref={null}
|
|
236
|
-
/>
|
|
237
|
-
))}
|
|
238
|
-
</MenuList>
|
|
239
|
-
</MenuContent>
|
|
240
|
-
</Menu>
|
|
241
|
-
);
|
|
242
|
-
return (
|
|
243
|
-
<Popper
|
|
244
|
-
trigger={toggle}
|
|
245
|
-
triggerRef={toggleRef}
|
|
246
|
-
popper={menu}
|
|
247
|
-
popperRef={menuRef}
|
|
248
|
-
isVisible={isMenuOpen}
|
|
249
|
-
onDocumentClick={onDocumentClick}
|
|
250
|
-
onDocumentKeyDown={onDocumentKeydown}
|
|
251
|
-
/>
|
|
252
|
-
);
|
|
253
|
-
};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { MenuToggle, Menu, MenuContent, MenuList, MenuItem, MenuGroup, Popper, Divider } from '@patternfly/react-core';
|
|
3
|
-
|
|
4
|
-
export const ComposableOptionsMenuVariants: React.FunctionComponent = () => {
|
|
5
|
-
const [isOpen, setIsOpen] = React.useState<boolean>(false);
|
|
6
|
-
const [selected, setSelected] = React.useState<string>('');
|
|
7
|
-
const menuRef = React.useRef<HTMLDivElement>();
|
|
8
|
-
const toggleRef = React.useRef<HTMLButtonElement>();
|
|
9
|
-
|
|
10
|
-
const handleMenuKeys = (event: KeyboardEvent) => {
|
|
11
|
-
if (isOpen && menuRef?.current?.contains(event.target as Node)) {
|
|
12
|
-
if (event.key === 'Escape' || event.key === 'Tab') {
|
|
13
|
-
setIsOpen(!isOpen);
|
|
14
|
-
toggleRef?.current?.focus();
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const handleClickOutside = (event: MouseEvent) => {
|
|
20
|
-
if (isOpen && !menuRef?.current?.contains(event.target as Node)) {
|
|
21
|
-
setIsOpen(false);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
React.useEffect(() => {
|
|
26
|
-
window.addEventListener('keydown', handleMenuKeys);
|
|
27
|
-
window.addEventListener('click', handleClickOutside);
|
|
28
|
-
|
|
29
|
-
return () => {
|
|
30
|
-
window.removeEventListener('keydown', handleMenuKeys);
|
|
31
|
-
window.removeEventListener('click', handleClickOutside);
|
|
32
|
-
};
|
|
33
|
-
}, [isOpen, menuRef]);
|
|
34
|
-
|
|
35
|
-
const onToggleClick = (ev: React.MouseEvent) => {
|
|
36
|
-
ev.stopPropagation(); // Stop handleClickOutside from handling
|
|
37
|
-
setTimeout(() => {
|
|
38
|
-
if (menuRef.current) {
|
|
39
|
-
const firstElement = menuRef.current.querySelector(
|
|
40
|
-
'li > button:not(:disabled), li > a:not(:disabled), input:not(:disabled)'
|
|
41
|
-
);
|
|
42
|
-
firstElement && (firstElement as HTMLElement).focus();
|
|
43
|
-
}
|
|
44
|
-
}, 0);
|
|
45
|
-
setIsOpen(!isOpen);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const toggle = (
|
|
49
|
-
<MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
|
|
50
|
-
Options menu
|
|
51
|
-
</MenuToggle>
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
const menu = (
|
|
55
|
-
<Menu
|
|
56
|
-
ref={menuRef}
|
|
57
|
-
id="options-menu"
|
|
58
|
-
selected={selected}
|
|
59
|
-
onSelect={(_ev, itemId) => setSelected(itemId.toString())}
|
|
60
|
-
>
|
|
61
|
-
<MenuContent>
|
|
62
|
-
<MenuList>
|
|
63
|
-
<MenuItem itemId="0" isSelected={selected === '0'}>
|
|
64
|
-
Option 1
|
|
65
|
-
</MenuItem>
|
|
66
|
-
<MenuItem itemId="1" isSelected={selected === '1'} isDisabled>
|
|
67
|
-
Disabled Option
|
|
68
|
-
</MenuItem>
|
|
69
|
-
<Divider key="group1-divider" />
|
|
70
|
-
<MenuGroup label="Group 1">
|
|
71
|
-
<MenuList>
|
|
72
|
-
<MenuItem itemId="2" isSelected={selected === '2'}>
|
|
73
|
-
Option 1
|
|
74
|
-
</MenuItem>
|
|
75
|
-
<MenuItem itemId="3" isSelected={selected === '3'}>
|
|
76
|
-
Option 2
|
|
77
|
-
</MenuItem>
|
|
78
|
-
</MenuList>
|
|
79
|
-
</MenuGroup>
|
|
80
|
-
<Divider key="group2-divider" />
|
|
81
|
-
<MenuGroup label="Group 2">
|
|
82
|
-
<MenuList>
|
|
83
|
-
<MenuItem itemId="4" isSelected={selected === '4'}>
|
|
84
|
-
Option 1
|
|
85
|
-
</MenuItem>
|
|
86
|
-
<MenuItem itemId="5" isSelected={selected === '5'}>
|
|
87
|
-
Option 2
|
|
88
|
-
</MenuItem>
|
|
89
|
-
</MenuList>
|
|
90
|
-
</MenuGroup>
|
|
91
|
-
</MenuList>
|
|
92
|
-
</MenuContent>
|
|
93
|
-
</Menu>
|
|
94
|
-
);
|
|
95
|
-
return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
|
|
96
|
-
};
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { MenuToggle, Menu, MenuContent, MenuList, MenuItem, Popper, Badge } from '@patternfly/react-core';
|
|
3
|
-
|
|
4
|
-
export const ComposableSimpleCheckboxSelect: React.FunctionComponent = () => {
|
|
5
|
-
const [isOpen, setIsOpen] = React.useState<boolean>(false);
|
|
6
|
-
const [selectedItems, setSelectedItems] = React.useState<number[]>([]);
|
|
7
|
-
const toggleRef = React.useRef<HTMLButtonElement>(null);
|
|
8
|
-
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
9
|
-
|
|
10
|
-
const handleMenuKeys = React.useCallback(
|
|
11
|
-
(event) => {
|
|
12
|
-
if (menuRef.current) {
|
|
13
|
-
if (isOpen && menuRef.current.contains(event.target as Node)) {
|
|
14
|
-
if (event.key === 'Escape' || event.key === 'Tab') {
|
|
15
|
-
setIsOpen(!isOpen);
|
|
16
|
-
toggleRef?.current?.focus();
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
[isOpen]
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
const handleClickOutside = React.useCallback(
|
|
25
|
-
(event) => {
|
|
26
|
-
if (isOpen && !menuRef?.current?.contains(event.target as Node)) {
|
|
27
|
-
setIsOpen(false);
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
[isOpen]
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
React.useEffect(() => {
|
|
34
|
-
window.addEventListener('keydown', handleMenuKeys);
|
|
35
|
-
window.addEventListener('click', handleClickOutside);
|
|
36
|
-
return () => {
|
|
37
|
-
window.removeEventListener('keydown', handleMenuKeys);
|
|
38
|
-
window.removeEventListener('click', handleClickOutside);
|
|
39
|
-
};
|
|
40
|
-
}, [handleClickOutside, handleMenuKeys]);
|
|
41
|
-
|
|
42
|
-
const onToggleClick = (ev: React.MouseEvent) => {
|
|
43
|
-
ev.stopPropagation(); // Stop handleClickOutside from handling
|
|
44
|
-
setTimeout(() => {
|
|
45
|
-
if (menuRef.current) {
|
|
46
|
-
const firstElement = menuRef.current.querySelector('li > button:not(:disabled), li > a:not(:disabled)');
|
|
47
|
-
firstElement && (firstElement as HTMLElement).focus();
|
|
48
|
-
}
|
|
49
|
-
}, 0);
|
|
50
|
-
setIsOpen(!isOpen);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const onSelect = (event: React.MouseEvent | undefined, itemId: string | number | undefined) => {
|
|
54
|
-
if (typeof itemId === 'string' || typeof itemId === 'undefined') {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (selectedItems.includes(itemId)) {
|
|
59
|
-
setSelectedItems(selectedItems.filter((id) => id !== itemId));
|
|
60
|
-
} else {
|
|
61
|
-
setSelectedItems([...selectedItems, itemId]);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const toggle = (
|
|
66
|
-
<MenuToggle
|
|
67
|
-
ref={toggleRef}
|
|
68
|
-
{...(selectedItems.length > 0 && { badge: <Badge isRead>{selectedItems.length}</Badge> })}
|
|
69
|
-
onClick={onToggleClick}
|
|
70
|
-
isExpanded={isOpen}
|
|
71
|
-
style={
|
|
72
|
-
{
|
|
73
|
-
width: '220px'
|
|
74
|
-
} as React.CSSProperties
|
|
75
|
-
}
|
|
76
|
-
>
|
|
77
|
-
Filter by status
|
|
78
|
-
</MenuToggle>
|
|
79
|
-
);
|
|
80
|
-
const menu = (
|
|
81
|
-
<Menu ref={menuRef} id="select-menu" onSelect={onSelect} selected={selectedItems}>
|
|
82
|
-
<MenuContent>
|
|
83
|
-
<MenuList>
|
|
84
|
-
<MenuItem hasCheckbox itemId={0} isSelected={selectedItems.includes(0)}>
|
|
85
|
-
Debug
|
|
86
|
-
</MenuItem>
|
|
87
|
-
<MenuItem hasCheckbox itemId={1} isSelected={selectedItems.includes(1)}>
|
|
88
|
-
Info
|
|
89
|
-
</MenuItem>
|
|
90
|
-
<MenuItem hasCheckbox itemId={2} isSelected={selectedItems.includes(2)}>
|
|
91
|
-
Warn
|
|
92
|
-
</MenuItem>
|
|
93
|
-
<MenuItem hasCheckbox isDisabled itemId={4} isSelected={selectedItems.includes(4)}>
|
|
94
|
-
Error
|
|
95
|
-
</MenuItem>
|
|
96
|
-
</MenuList>
|
|
97
|
-
</MenuContent>
|
|
98
|
-
</Menu>
|
|
99
|
-
);
|
|
100
|
-
return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
|
|
101
|
-
};
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { MenuToggle, Menu, MenuContent, MenuList, MenuItem, Popper } from '@patternfly/react-core';
|
|
3
|
-
|
|
4
|
-
export const ComposableSimpleDropdown: React.FunctionComponent = () => {
|
|
5
|
-
const [isOpen, setIsOpen] = React.useState(false);
|
|
6
|
-
const toggleRef = React.useRef<HTMLButtonElement>(null);
|
|
7
|
-
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
8
|
-
|
|
9
|
-
const handleMenuKeys = (event: KeyboardEvent) => {
|
|
10
|
-
if (!isOpen) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
if (menuRef.current?.contains(event.target as Node) || toggleRef.current?.contains(event.target as Node)) {
|
|
14
|
-
if (event.key === 'Escape' || event.key === 'Tab') {
|
|
15
|
-
setIsOpen(!isOpen);
|
|
16
|
-
toggleRef.current?.focus();
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const handleClickOutside = (event: MouseEvent) => {
|
|
22
|
-
if (isOpen && !menuRef.current?.contains(event.target as Node)) {
|
|
23
|
-
setIsOpen(false);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
React.useEffect(() => {
|
|
28
|
-
window.addEventListener('keydown', handleMenuKeys);
|
|
29
|
-
window.addEventListener('click', handleClickOutside);
|
|
30
|
-
return () => {
|
|
31
|
-
window.removeEventListener('keydown', handleMenuKeys);
|
|
32
|
-
window.removeEventListener('click', handleClickOutside);
|
|
33
|
-
};
|
|
34
|
-
}, [isOpen, menuRef]);
|
|
35
|
-
|
|
36
|
-
const onToggleClick = (ev: React.MouseEvent) => {
|
|
37
|
-
ev.stopPropagation(); // Stop handleClickOutside from handling
|
|
38
|
-
setTimeout(() => {
|
|
39
|
-
if (menuRef.current) {
|
|
40
|
-
const firstElement = menuRef.current.querySelector('li > button:not(:disabled), li > a:not(:disabled)');
|
|
41
|
-
firstElement && (firstElement as HTMLElement).focus();
|
|
42
|
-
}
|
|
43
|
-
}, 0);
|
|
44
|
-
setIsOpen(!isOpen);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const toggle = (
|
|
48
|
-
<MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
|
|
49
|
-
{isOpen ? 'Expanded' : 'Collapsed'}
|
|
50
|
-
</MenuToggle>
|
|
51
|
-
);
|
|
52
|
-
const menu = (
|
|
53
|
-
// eslint-disable-next-line no-console
|
|
54
|
-
<Menu ref={menuRef} onSelect={(_ev, itemId) => console.log('selected', itemId)}>
|
|
55
|
-
<MenuContent>
|
|
56
|
-
<MenuList>
|
|
57
|
-
<MenuItem itemId={0}>Action</MenuItem>
|
|
58
|
-
<MenuItem itemId={1} to="#default-link2" onClick={(ev) => ev.preventDefault()}>
|
|
59
|
-
Link
|
|
60
|
-
</MenuItem>
|
|
61
|
-
<MenuItem isDisabled>Disabled Action</MenuItem>
|
|
62
|
-
<MenuItem isDisabled to="#default-link4">
|
|
63
|
-
Disabled Link
|
|
64
|
-
</MenuItem>
|
|
65
|
-
</MenuList>
|
|
66
|
-
</MenuContent>
|
|
67
|
-
</Menu>
|
|
68
|
-
);
|
|
69
|
-
return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
|
|
70
|
-
};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { MenuToggle, Menu, MenuContent, MenuList, MenuItem, Popper } from '@patternfly/react-core';
|
|
3
|
-
import TableIcon from '@patternfly/react-icons/dist/esm/icons/table-icon';
|
|
4
|
-
|
|
5
|
-
export const ComposableSimpleSelect: React.FunctionComponent = () => {
|
|
6
|
-
const [isOpen, setIsOpen] = React.useState<boolean>(false);
|
|
7
|
-
const [selected, setSelected] = React.useState<string>('Select a value');
|
|
8
|
-
const toggleRef = React.useRef<HTMLButtonElement>(null);
|
|
9
|
-
const menuRef = React.useRef<HTMLDivElement>(null);
|
|
10
|
-
|
|
11
|
-
const handleMenuKeys = (event: KeyboardEvent) => {
|
|
12
|
-
if (isOpen && menuRef.current?.contains(event.target as Node)) {
|
|
13
|
-
if (event.key === 'Escape' || event.key === 'Tab') {
|
|
14
|
-
setIsOpen(!isOpen);
|
|
15
|
-
toggleRef.current?.focus();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const handleClickOutside = (event: MouseEvent) => {
|
|
21
|
-
if (isOpen && !menuRef.current?.contains(event.target as Node)) {
|
|
22
|
-
setIsOpen(false);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
React.useEffect(() => {
|
|
27
|
-
window.addEventListener('keydown', handleMenuKeys);
|
|
28
|
-
window.addEventListener('click', handleClickOutside);
|
|
29
|
-
return () => {
|
|
30
|
-
window.removeEventListener('keydown', handleMenuKeys);
|
|
31
|
-
window.removeEventListener('click', handleClickOutside);
|
|
32
|
-
};
|
|
33
|
-
}, [isOpen, menuRef]);
|
|
34
|
-
|
|
35
|
-
const onToggleClick = (ev: React.MouseEvent) => {
|
|
36
|
-
ev.stopPropagation(); // Stop handleClickOutside from handling
|
|
37
|
-
setTimeout(() => {
|
|
38
|
-
if (menuRef.current) {
|
|
39
|
-
const firstElement = menuRef.current.querySelector('li > button:not(:disabled), li > a:not(:disabled)');
|
|
40
|
-
firstElement && (firstElement as HTMLElement).focus();
|
|
41
|
-
}
|
|
42
|
-
}, 0);
|
|
43
|
-
setIsOpen(!isOpen);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const toggle = (
|
|
47
|
-
<MenuToggle
|
|
48
|
-
ref={toggleRef}
|
|
49
|
-
onClick={onToggleClick}
|
|
50
|
-
isExpanded={isOpen}
|
|
51
|
-
style={
|
|
52
|
-
{
|
|
53
|
-
width: '200px'
|
|
54
|
-
} as React.CSSProperties
|
|
55
|
-
}
|
|
56
|
-
>
|
|
57
|
-
{selected}
|
|
58
|
-
</MenuToggle>
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
function onSelect(event: React.MouseEvent | undefined, itemId: string | number | undefined) {
|
|
62
|
-
if (typeof itemId === 'undefined') {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
setSelected(itemId.toString());
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const menu = (
|
|
70
|
-
<Menu ref={menuRef} id="select-menu" onSelect={onSelect} selected={selected}>
|
|
71
|
-
<MenuContent>
|
|
72
|
-
<MenuList>
|
|
73
|
-
<MenuItem itemId="Option 1">Option 1</MenuItem>
|
|
74
|
-
<MenuItem itemId="Option 2">Option 2</MenuItem>
|
|
75
|
-
<MenuItem itemId="Option 3" icon={<TableIcon aria-hidden />}>
|
|
76
|
-
Option 3
|
|
77
|
-
</MenuItem>
|
|
78
|
-
</MenuList>
|
|
79
|
-
</MenuContent>
|
|
80
|
-
</Menu>
|
|
81
|
-
);
|
|
82
|
-
return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
|
|
83
|
-
};
|