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