@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,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
- };