@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,50 +1,29 @@
1
1
  import React from 'react';
2
2
  import {
3
3
  MenuToggle,
4
- Menu,
5
- MenuContent,
6
- MenuList,
7
- MenuItem,
8
- MenuGroup,
9
4
  MenuSearch,
10
5
  MenuSearchInput,
11
- Popper,
12
6
  Tooltip,
13
7
  Divider,
14
- SearchInput
8
+ SearchInput,
9
+ Dropdown,
10
+ DropdownGroup,
11
+ DropdownList,
12
+ DropdownItem
15
13
  } from '@patternfly/react-core';
16
- import { Link } from '@reach/router';
17
14
  import ThIcon from '@patternfly/react-icons/dist/js/icons/th-icon';
18
15
  import pfIcon from 'pf-logo-small.svg';
19
16
 
20
- export const ComposableApplicationLauncher: React.FunctionComponent = () => {
17
+ const MockLink: React.FunctionComponent = ({ to, ...props }: any) => <a href={to} {...props}></a>;
18
+
19
+ export const ApplicationLauncherDemo: React.FunctionComponent = () => {
21
20
  const [isOpen, setIsOpen] = React.useState<boolean>(false);
22
21
  const [refFullOptions, setRefFullOptions] = React.useState<Element[]>();
23
22
  const [favorites, setFavorites] = React.useState<string[]>([]);
24
23
  const [filteredIds, setFilteredIds] = React.useState<string[]>(['*']);
25
24
  const menuRef = React.useRef<HTMLDivElement>(null);
26
- const toggleRef = React.useRef<HTMLButtonElement>(null);
27
25
 
28
- const handleMenuKeys = (event: KeyboardEvent) => {
29
- if (!isOpen) {
30
- return;
31
- }
32
- if (menuRef.current?.contains(event.target as Node) || toggleRef.current?.contains(event.target as Node)) {
33
- if (event.key === 'Escape') {
34
- setIsOpen(!isOpen);
35
- toggleRef.current?.focus();
36
- }
37
- }
38
- };
39
-
40
- const handleClickOutside = (event: MouseEvent) => {
41
- if (isOpen && !menuRef.current?.contains(event.target as Node)) {
42
- setIsOpen(false);
43
- }
44
- };
45
-
46
- const onToggleClick = (ev: React.MouseEvent) => {
47
- ev.stopPropagation(); // Stop handleClickOutside from handling
26
+ const onToggleClick = () => {
48
27
  setTimeout(() => {
49
28
  if (menuRef.current) {
50
29
  const firstElement = menuRef.current.querySelector(
@@ -57,36 +36,13 @@ export const ComposableApplicationLauncher: React.FunctionComponent = () => {
57
36
  setIsOpen(!isOpen);
58
37
  };
59
38
 
60
- React.useEffect(() => {
61
- window.addEventListener('keydown', handleMenuKeys);
62
- window.addEventListener('click', handleClickOutside);
63
-
64
- return () => {
65
- window.removeEventListener('keydown', handleMenuKeys);
66
- window.removeEventListener('click', handleClickOutside);
67
- };
68
- }, [isOpen, menuRef]);
69
-
70
- const toggle = (
71
- <MenuToggle
72
- aria-label="Toggle"
73
- ref={toggleRef}
74
- variant="plain"
75
- onClick={onToggleClick}
76
- isExpanded={isOpen}
77
- style={{ width: 'auto' }}
78
- >
79
- <ThIcon />
80
- </MenuToggle>
81
- );
82
-
83
39
  const menuItems = [
84
- <MenuGroup key="group1" label="Group 1">
85
- <MenuList>
86
- <MenuItem itemId="0" id="0" isFavorited={favorites.includes('0')}>
40
+ <DropdownGroup key="group1" label="Group 1">
41
+ <DropdownList>
42
+ <DropdownItem itemId="0" id="0" isFavorited={favorites.includes('0')}>
87
43
  Application 1
88
- </MenuItem>
89
- <MenuItem
44
+ </DropdownItem>
45
+ <DropdownItem
90
46
  itemId="1"
91
47
  id="1"
92
48
  isFavorited={favorites.includes('1')}
@@ -94,56 +50,56 @@ export const ComposableApplicationLauncher: React.FunctionComponent = () => {
94
50
  onClick={(ev) => ev.preventDefault()}
95
51
  >
96
52
  Application 2
97
- </MenuItem>
98
- </MenuList>
99
- </MenuGroup>,
53
+ </DropdownItem>
54
+ </DropdownList>
55
+ </DropdownGroup>,
100
56
  <Divider key="group1-divider" />,
101
- <MenuGroup key="group2" label="Group 2">
102
- <MenuList>
103
- <MenuItem
57
+ <DropdownGroup key="group2" label="Group 2">
58
+ <DropdownList>
59
+ <DropdownItem
104
60
  itemId="2"
105
61
  id="2"
106
62
  isFavorited={favorites.includes('2')}
107
- component={(props) => <Link {...props} to="#router-link" />}
63
+ component={(props) => <MockLink {...props} to="#router-link" />}
108
64
  >
109
- @reach/router Link
110
- </MenuItem>
111
- <MenuItem
65
+ Custom component (such as @reach/router Link)
66
+ </DropdownItem>
67
+ <DropdownItem
112
68
  itemId="3"
113
69
  id="3"
114
70
  isFavorited={favorites.includes('3')}
115
71
  isExternalLink
116
72
  icon={<img src={pfIcon} />}
117
- component={(props) => <Link {...props} to="#router-link2" />}
73
+ component={(props) => <MockLink {...props} to="#router-link2" />}
118
74
  >
119
- @reach/router Link with icon
120
- </MenuItem>
121
- </MenuList>
122
- </MenuGroup>,
75
+ Custom component with icon
76
+ </DropdownItem>
77
+ </DropdownList>
78
+ </DropdownGroup>,
123
79
  <Divider key="group2-divider" />,
124
- <MenuList key="other-items">
125
- <MenuItem key="tooltip-app" isFavorited={favorites.includes('4')} itemId="4" id="4">
80
+ <DropdownList key="other-items">
81
+ <DropdownItem key="tooltip-app" isFavorited={favorites.includes('4')} itemId="4" id="4">
126
82
  <Tooltip content={<div>Launch Application 3</div>} position="right">
127
83
  <span>Application 3 with tooltip</span>
128
84
  </Tooltip>
129
- </MenuItem>
130
- <MenuItem key="disabled-app" itemId="5" id="5" isDisabled>
85
+ </DropdownItem>
86
+ <DropdownItem key="disabled-app" itemId="5" id="5" isDisabled>
131
87
  Unavailable Application
132
- </MenuItem>
133
- </MenuList>
88
+ </DropdownItem>
89
+ </DropdownList>
134
90
  ];
135
91
 
136
92
  const createFavorites = (favIds: string[]) => {
137
93
  const favorites: unknown[] = [];
138
94
 
139
95
  menuItems.forEach((item) => {
140
- if (item.type === MenuList) {
96
+ if (item.type === DropdownList) {
141
97
  item.props.children.filter((child) => {
142
98
  if (favIds.includes(child.props.itemId)) {
143
99
  favorites.push(child);
144
100
  }
145
101
  });
146
- } else if (item.type === MenuGroup) {
102
+ } else if (item.type === DropdownGroup) {
147
103
  item.props.children.props.children.filter((child) => {
148
104
  if (favIds.includes(child.props.itemId)) {
149
105
  favorites.push(child);
@@ -166,7 +122,7 @@ export const ComposableApplicationLauncher: React.FunctionComponent = () => {
166
122
  let keepDivider = false;
167
123
  const filteredCopy = items
168
124
  .map((group) => {
169
- if (group.type === MenuGroup) {
125
+ if (group.type === DropdownGroup) {
170
126
  const filteredGroup = React.cloneElement(group, {
171
127
  children: React.cloneElement(group.props.children, {
172
128
  children: group.props.children.props.children.filter((child) => {
@@ -183,7 +139,7 @@ export const ComposableApplicationLauncher: React.FunctionComponent = () => {
183
139
  } else {
184
140
  keepDivider = false;
185
141
  }
186
- } else if (group.type === MenuList) {
142
+ } else if (group.type === DropdownList) {
187
143
  const filteredGroup = React.cloneElement(group, {
188
144
  children: group.props.children.filter((child) => {
189
145
  if (filteredIds.includes(child.props.itemId)) {
@@ -243,30 +199,47 @@ export const ComposableApplicationLauncher: React.FunctionComponent = () => {
243
199
  const filteredFavorites = filterItems(createFavorites(favorites), filteredIds);
244
200
  const filteredItems = filterItems(menuItems, filteredIds);
245
201
  if (filteredItems.length === 0) {
246
- filteredItems.push(<MenuItem key="no-items">No results found</MenuItem>);
202
+ filteredItems.push(<DropdownItem key="no-items">No results found</DropdownItem>);
247
203
  }
248
204
 
249
- const menu = (
205
+ return (
250
206
  // eslint-disable-next-line no-console
251
- <Menu ref={menuRef} onActionClick={onFavorite} onSelect={(_ev, itemId) => console.log('selected', itemId)}>
207
+ <Dropdown
208
+ isOpen={isOpen}
209
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
210
+ onOpenChangeKeys={['Escape']}
211
+ toggle={(toggleRef) => (
212
+ <MenuToggle
213
+ aria-label="Toggle"
214
+ ref={toggleRef}
215
+ variant="plain"
216
+ onClick={onToggleClick}
217
+ isExpanded={isOpen}
218
+ style={{ width: 'auto' }}
219
+ >
220
+ <ThIcon />
221
+ </MenuToggle>
222
+ )}
223
+ ref={menuRef}
224
+ onActionClick={onFavorite}
225
+ // eslint-disable-next-line no-console
226
+ onSelect={(_ev, itemId) => console.log('selected', itemId)}
227
+ >
252
228
  <MenuSearch>
253
229
  <MenuSearchInput>
254
230
  <SearchInput aria-label="Filter menu items" onChange={(_event, value) => onTextChange(value)} />
255
231
  </MenuSearchInput>
256
232
  </MenuSearch>
257
233
  <Divider />
258
- <MenuContent>
259
- {filteredFavorites.length > 0 && (
260
- <React.Fragment>
261
- <MenuGroup key="favorites-group" label="Favorites">
262
- <MenuList>{filteredFavorites}</MenuList>
263
- </MenuGroup>
264
- <Divider key="favorites-divider" />
265
- </React.Fragment>
266
- )}
267
- {filteredItems}
268
- </MenuContent>
269
- </Menu>
234
+ {filteredFavorites.length > 0 && (
235
+ <React.Fragment>
236
+ <DropdownGroup key="favorites-group" label="Favorites">
237
+ <DropdownList>{filteredFavorites}</DropdownList>
238
+ </DropdownGroup>
239
+ <Divider key="favorites-divider" />
240
+ </React.Fragment>
241
+ )}
242
+ {filteredItems}
243
+ </Dropdown>
270
244
  );
271
- return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
272
245
  };
@@ -1,32 +1,30 @@
1
1
  import React from 'react';
2
2
  import {
3
3
  MenuToggle,
4
- Menu,
5
- MenuContent,
6
4
  MenuFooter,
7
- MenuList,
8
- MenuItem,
9
5
  MenuSearch,
10
6
  MenuSearchInput,
11
- Popper,
12
7
  Divider,
13
8
  InputGroup,
14
9
  InputGroupItem,
15
10
  Button,
16
11
  ButtonVariant,
17
- SearchInput
12
+ SearchInput,
13
+ Dropdown,
14
+ DropdownList,
15
+ DropdownItem
18
16
  } from '@patternfly/react-core';
19
17
  import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
20
18
 
21
19
  interface ItemData {
22
20
  text: string;
23
21
  href?: string;
24
- isDisabled?: boolean;
22
+ isDisabled?: boolean | undefined;
25
23
  }
26
24
 
27
25
  type ItemArrayType = (ItemData | string)[];
28
26
 
29
- export const ComposableContextSelector: React.FunctionComponent = () => {
27
+ export const ContextSelectorDemo: React.FunctionComponent = () => {
30
28
  const items: ItemArrayType = [
31
29
  {
32
30
  text: 'Action'
@@ -60,66 +58,16 @@ export const ComposableContextSelector: React.FunctionComponent = () => {
60
58
  const [filteredItems, setFilteredItems] = React.useState<ItemArrayType>(items);
61
59
  const [searchInputValue, setSearchInputValue] = React.useState<string>('');
62
60
  const menuRef = React.useRef<HTMLDivElement>(null);
63
- const toggleRef = React.useRef<HTMLButtonElement>(null);
64
61
  const menuFooterBtnRef = React.useRef<HTMLButtonElement>(null);
65
62
 
66
- const handleMenuKeys = (event: KeyboardEvent) => {
67
- if (!isOpen) {
68
- return;
69
- }
70
- if (menuFooterBtnRef.current?.contains(event.target as Node)) {
71
- if (event.key === 'Tab') {
72
- if (event.shiftKey) {
73
- return;
74
- }
75
- setIsOpen(!isOpen);
76
- toggleRef.current?.focus();
77
- }
78
- }
79
- if (menuRef.current?.contains(event.target as Node)) {
80
- if (event.key === 'Escape') {
81
- setIsOpen(!isOpen);
82
- toggleRef.current?.focus();
83
- }
84
- }
85
- };
86
-
87
- const handleClickOutside = (event: MouseEvent) => {
88
- if (isOpen && !menuRef.current?.contains(event.target as Node)) {
89
- setIsOpen(false);
90
- }
91
- };
92
-
93
- React.useEffect(() => {
94
- window.addEventListener('keydown', handleMenuKeys);
95
- window.addEventListener('click', handleClickOutside);
96
-
97
- return () => {
98
- window.removeEventListener('keydown', handleMenuKeys);
99
- window.removeEventListener('click', handleClickOutside);
100
- };
101
- }, [isOpen, menuRef]);
102
-
103
- const onToggleClick = (ev: React.MouseEvent) => {
104
- ev.stopPropagation(); // Stop handleClickOutside from handling
105
- setTimeout(() => {
106
- if (menuRef.current) {
107
- const firstElement = menuRef.current.querySelector(
108
- 'li > button:not(:disabled), li > a:not(:disabled), input:not(:disabled)'
109
- );
110
- firstElement && (firstElement as HTMLElement).focus();
111
- }
112
- }, 0);
63
+ const onToggleClick = () => {
113
64
  setIsOpen(!isOpen);
114
65
  };
115
66
 
116
- const toggle = (
117
- <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
118
- {selected}
119
- </MenuToggle>
120
- );
121
-
122
- const onSelect = (ev: React.MouseEvent<Element, MouseEvent>, itemId: string | number) => {
67
+ const onSelect = (ev: React.MouseEvent<Element, MouseEvent> | undefined, itemId: string | number | undefined) => {
68
+ if (typeof itemId === 'number' || typeof itemId === 'undefined') {
69
+ return;
70
+ }
123
71
  setSelected(itemId.toString());
124
72
  setIsOpen(!isOpen);
125
73
  };
@@ -147,8 +95,21 @@ export const ComposableContextSelector: React.FunctionComponent = () => {
147
95
  }
148
96
  };
149
97
 
150
- const menu = (
151
- <Menu ref={menuRef} id="context-selector" onSelect={onSelect} isScrollable>
98
+ return (
99
+ <Dropdown
100
+ isOpen={isOpen}
101
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
102
+ onOpenChangeKeys={['Escape']}
103
+ toggle={(toggleRef) => (
104
+ <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
105
+ {selected}
106
+ </MenuToggle>
107
+ )}
108
+ ref={menuRef}
109
+ id="context-selector"
110
+ onSelect={onSelect}
111
+ isScrollable
112
+ >
152
113
  <MenuSearch>
153
114
  <MenuSearchInput>
154
115
  <InputGroup>
@@ -175,25 +136,27 @@ export const ComposableContextSelector: React.FunctionComponent = () => {
175
136
  </MenuSearchInput>
176
137
  </MenuSearch>
177
138
  <Divider />
178
- <MenuContent maxMenuHeight="200px">
179
- <MenuList>
180
- {filteredItems.map((item, index) => {
181
- const [itemText, isDisabled, href] =
182
- typeof item === 'string' ? [item, null, null] : [item.text, item.isDisabled || null, item.href || null];
183
- return (
184
- <MenuItem itemId={itemText} key={index} isDisabled={isDisabled} to={href}>
185
- {itemText}
186
- </MenuItem>
187
- );
188
- })}
189
- </MenuList>
190
- </MenuContent>
139
+ <DropdownList>
140
+ {filteredItems.map((item, index) => {
141
+ const [itemText, isDisabled, href] =
142
+ typeof item === 'string' ? [item, null, null] : [item.text, item.isDisabled || null, item.href || null];
143
+ return (
144
+ <DropdownItem
145
+ itemId={itemText}
146
+ key={index}
147
+ isDisabled={isDisabled as boolean | undefined}
148
+ to={href as string | undefined}
149
+ >
150
+ {itemText}
151
+ </DropdownItem>
152
+ );
153
+ })}
154
+ </DropdownList>
191
155
  <MenuFooter>
192
156
  <Button ref={menuFooterBtnRef} variant="link" isInline>
193
157
  Action
194
158
  </Button>
195
159
  </MenuFooter>
196
- </Menu>
160
+ </Dropdown>
197
161
  );
198
- return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
199
162
  };
@@ -0,0 +1,84 @@
1
+ import React from 'react';
2
+ import { MenuToggle, Select, SelectList, SelectOption } from '@patternfly/react-core';
3
+
4
+ export const DateSelectDemo: React.FunctionComponent = () => {
5
+ const [isOpen, setIsOpen] = React.useState(false);
6
+ const [selected, setSelected] = React.useState<number>(0);
7
+ const menuRef = React.useRef<HTMLDivElement>();
8
+
9
+ const onToggleClick = () => {
10
+ setIsOpen(!isOpen);
11
+ };
12
+
13
+ const monthStrings = [
14
+ 'January',
15
+ 'February',
16
+ 'March',
17
+ 'April',
18
+ 'May',
19
+ 'June',
20
+ 'July',
21
+ 'August',
22
+ 'September',
23
+ 'October',
24
+ 'November',
25
+ 'December'
26
+ ];
27
+
28
+ const dateString = (date: Date) => `${monthStrings[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;
29
+
30
+ const date = new Date();
31
+
32
+ const toggleText = {
33
+ 0: 'Today ',
34
+ 1: 'Yesterday ',
35
+ 2: 'Last 7 days ',
36
+ 3: 'Last 14 days '
37
+ };
38
+
39
+ const dateText = {
40
+ 0: <small className="pf-v5-u-color-200">({dateString(date)})</small>,
41
+ 1: (
42
+ <small className="pf-v5-u-color-200">
43
+ ({dateString(new Date(new Date().setDate(date.getDate() - 1)))} - {dateString(date)})
44
+ </small>
45
+ ),
46
+ 2: (
47
+ <small className="pf-v5-u-color-200">
48
+ ({dateString(new Date(new Date().setDate(date.getDate() - 7)))} - {dateString(date)})
49
+ </small>
50
+ ),
51
+ 3: (
52
+ <small className="pf-v5-u-color-200">
53
+ ({dateString(new Date(new Date().setDate(date.getDate() - 14)))} - {dateString(date)})
54
+ </small>
55
+ )
56
+ };
57
+
58
+ return (
59
+ // eslint-disable-next-line no-console
60
+ <Select
61
+ isOpen={isOpen}
62
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
63
+ toggle={(toggleRef) => (
64
+ <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen} style={{ minWidth: '250px' }}>
65
+ <span style={{ verticalAlign: 'middle', marginRight: '8px' }}>{toggleText[selected]}</span>
66
+ {dateText[selected]}
67
+ </MenuToggle>
68
+ )}
69
+ ref={menuRef}
70
+ onSelect={(_ev, itemId) => {
71
+ setSelected(itemId as number);
72
+ setIsOpen(false);
73
+ }}
74
+ selected={selected}
75
+ >
76
+ <SelectList>
77
+ <SelectOption itemId={0}>Today</SelectOption>
78
+ <SelectOption itemId={1}>Yesterday</SelectOption>
79
+ <SelectOption itemId={2}>Last 7 days</SelectOption>
80
+ <SelectOption itemId={3}>Last 14 days</SelectOption>
81
+ </SelectList>
82
+ </Select>
83
+ );
84
+ };
@@ -7,7 +7,7 @@ import {
7
7
  MenuItem,
8
8
  DrilldownMenu,
9
9
  Divider,
10
- Popper
10
+ MenuContainer
11
11
  } from '@patternfly/react-core';
12
12
  import StorageDomainIcon from '@patternfly/react-icons/dist/esm/icons/storage-domain-icon';
13
13
  import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon';
@@ -18,7 +18,7 @@ interface MenuHeightsType {
18
18
  [id: string]: number;
19
19
  }
20
20
 
21
- export const ComposableDrilldownMenu: React.FunctionComponent = () => {
21
+ export const DrilldownMenuDemo: React.FunctionComponent = () => {
22
22
  const [isOpen, setIsOpen] = React.useState<boolean>(false);
23
23
  const [activeMenu, setActiveMenu] = React.useState<string>('rootMenu');
24
24
  const [menuDrilledIn, setMenuDrilledIn] = React.useState<string[]>([]);
@@ -27,38 +27,7 @@ export const ComposableDrilldownMenu: React.FunctionComponent = () => {
27
27
  const toggleRef = React.useRef<HTMLButtonElement>(null);
28
28
  const menuRef = React.useRef<HTMLDivElement>(null);
29
29
 
30
- const handleMenuKeys = (event: KeyboardEvent) => {
31
- if (isOpen && menuRef.current?.contains(event.target as Node)) {
32
- if (event.key === 'Escape' || event.key === 'Tab') {
33
- setIsOpen(!isOpen);
34
- toggleRef.current?.focus();
35
- }
36
- }
37
- };
38
-
39
- const handleClickOutside = (event: MouseEvent) => {
40
- if (isOpen && !menuRef.current?.contains(event.target as Node)) {
41
- setIsOpen(false);
42
- }
43
- };
44
-
45
- React.useEffect(() => {
46
- window.addEventListener('keydown', handleMenuKeys);
47
- window.addEventListener('click', handleClickOutside);
48
- return () => {
49
- window.removeEventListener('keydown', handleMenuKeys);
50
- window.removeEventListener('click', handleClickOutside);
51
- };
52
- }, [isOpen, menuRef]);
53
-
54
- const onToggleClick = (ev: React.MouseEvent) => {
55
- ev.stopPropagation(); // Stop handleClickOutside from handling
56
- setTimeout(() => {
57
- if (menuRef.current) {
58
- const firstElement = menuRef.current.querySelector('li > button:not(:disabled), li > a:not(:disabled)');
59
- firstElement && (firstElement as HTMLElement).focus();
60
- }
61
- }, 0);
30
+ const onToggleClick = () => {
62
31
  setIsOpen(!isOpen);
63
32
  setMenuDrilledIn([]);
64
33
  setDrilldownPath([]);
@@ -83,7 +52,7 @@ export const ComposableDrilldownMenu: React.FunctionComponent = () => {
83
52
  };
84
53
 
85
54
  const setHeight = (menuId: string, height: number) => {
86
- if (!menuHeights[menuId]) {
55
+ if (!menuHeights[menuId] || (menuId !== 'rootMenu' && menuHeights[menuId] !== height)) {
87
56
  setMenuHeights({
88
57
  ...menuHeights,
89
58
  [menuId]: height
@@ -242,5 +211,14 @@ export const ComposableDrilldownMenu: React.FunctionComponent = () => {
242
211
  </MenuContent>
243
212
  </Menu>
244
213
  );
245
- return <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />;
214
+ return (
215
+ <MenuContainer
216
+ isOpen={isOpen}
217
+ onOpenChange={(isOpen) => setIsOpen(isOpen)}
218
+ menu={menu}
219
+ menuRef={menuRef}
220
+ toggle={toggle}
221
+ toggleRef={toggleRef}
222
+ />
223
+ );
246
224
  };