@patternfly/react-core 4.244.2 → 4.246.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/esm/components/Alert/Alert.d.ts +4 -0
  3. package/dist/esm/components/Alert/Alert.d.ts.map +1 -1
  4. package/dist/esm/components/Alert/Alert.js.map +1 -1
  5. package/dist/esm/components/Breadcrumb/Breadcrumb.d.ts +4 -0
  6. package/dist/esm/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  7. package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +1 -1
  8. package/dist/esm/components/Button/Button.d.ts +4 -0
  9. package/dist/esm/components/Button/Button.d.ts.map +1 -1
  10. package/dist/esm/components/Button/Button.js.map +1 -1
  11. package/dist/esm/components/Card/Card.d.ts +4 -0
  12. package/dist/esm/components/Card/Card.d.ts.map +1 -1
  13. package/dist/esm/components/Card/Card.js.map +1 -1
  14. package/dist/esm/components/Checkbox/Checkbox.d.ts +4 -0
  15. package/dist/esm/components/Checkbox/Checkbox.d.ts.map +1 -1
  16. package/dist/esm/components/Checkbox/Checkbox.js.map +1 -1
  17. package/dist/esm/components/Chip/Chip.d.ts +2 -0
  18. package/dist/esm/components/Chip/Chip.d.ts.map +1 -1
  19. package/dist/esm/components/Chip/Chip.js.map +1 -1
  20. package/dist/esm/components/ChipGroup/ChipGroup.d.ts +2 -0
  21. package/dist/esm/components/ChipGroup/ChipGroup.d.ts.map +1 -1
  22. package/dist/esm/components/ChipGroup/ChipGroup.js.map +1 -1
  23. package/dist/esm/components/ContextSelector/ContextSelector.d.ts +4 -0
  24. package/dist/esm/components/ContextSelector/ContextSelector.d.ts.map +1 -1
  25. package/dist/esm/components/ContextSelector/ContextSelector.js.map +1 -1
  26. package/dist/esm/components/Dropdown/Dropdown.d.ts +4 -0
  27. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  28. package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
  29. package/dist/esm/components/Dropdown/DropdownItem.d.ts +4 -0
  30. package/dist/esm/components/Dropdown/DropdownItem.d.ts.map +1 -1
  31. package/dist/esm/components/Dropdown/DropdownItem.js.map +1 -1
  32. package/dist/esm/components/Dropdown/DropdownSeparator.d.ts +4 -0
  33. package/dist/esm/components/Dropdown/DropdownSeparator.d.ts.map +1 -1
  34. package/dist/esm/components/Dropdown/DropdownSeparator.js.map +1 -1
  35. package/dist/esm/components/Dropdown/DropdownToggle.d.ts +4 -0
  36. package/dist/esm/components/Dropdown/DropdownToggle.d.ts.map +1 -1
  37. package/dist/esm/components/Dropdown/DropdownToggle.js.map +1 -1
  38. package/dist/esm/components/Dropdown/DropdownToggleCheckbox.d.ts +4 -0
  39. package/dist/esm/components/Dropdown/DropdownToggleCheckbox.d.ts.map +1 -1
  40. package/dist/esm/components/Dropdown/DropdownToggleCheckbox.js.map +1 -1
  41. package/dist/esm/components/Form/Form.d.ts +4 -2
  42. package/dist/esm/components/Form/Form.d.ts.map +1 -1
  43. package/dist/esm/components/Form/Form.js +4 -3
  44. package/dist/esm/components/Form/Form.js.map +1 -1
  45. package/dist/esm/components/FormSelect/FormSelect.d.ts +4 -0
  46. package/dist/esm/components/FormSelect/FormSelect.d.ts.map +1 -1
  47. package/dist/esm/components/FormSelect/FormSelect.js.map +1 -1
  48. package/dist/esm/components/LoginPage/LoginForm.d.ts +1 -1
  49. package/dist/esm/components/LoginPage/LoginForm.d.ts.map +1 -1
  50. package/dist/esm/components/Menu/Menu.d.ts +4 -0
  51. package/dist/esm/components/Menu/Menu.d.ts.map +1 -1
  52. package/dist/esm/components/Menu/Menu.js.map +1 -1
  53. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.d.ts +4 -0
  54. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.d.ts.map +1 -1
  55. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.js.map +1 -1
  56. package/dist/esm/components/Modal/Modal.d.ts +4 -0
  57. package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
  58. package/dist/esm/components/Modal/Modal.js.map +1 -1
  59. package/dist/esm/components/Modal/ModalBoxCloseButton.d.ts +2 -0
  60. package/dist/esm/components/Modal/ModalBoxCloseButton.d.ts.map +1 -1
  61. package/dist/esm/components/Modal/ModalBoxCloseButton.js.map +1 -1
  62. package/dist/esm/components/Modal/ModalContent.d.ts +4 -0
  63. package/dist/esm/components/Modal/ModalContent.d.ts.map +1 -1
  64. package/dist/esm/components/Modal/ModalContent.js.map +1 -1
  65. package/dist/esm/components/Nav/Nav.d.ts +4 -0
  66. package/dist/esm/components/Nav/Nav.d.ts.map +1 -1
  67. package/dist/esm/components/Nav/Nav.js.map +1 -1
  68. package/dist/esm/components/Nav/NavExpandable.d.ts +2 -0
  69. package/dist/esm/components/Nav/NavExpandable.d.ts.map +1 -1
  70. package/dist/esm/components/Nav/NavExpandable.js.map +1 -1
  71. package/dist/esm/components/Nav/NavItem.d.ts +4 -0
  72. package/dist/esm/components/Nav/NavItem.d.ts.map +1 -1
  73. package/dist/esm/components/Nav/NavItem.js.map +1 -1
  74. package/dist/esm/components/OptionsMenu/OptionsMenu.d.ts +4 -0
  75. package/dist/esm/components/OptionsMenu/OptionsMenu.d.ts.map +1 -1
  76. package/dist/esm/components/OptionsMenu/OptionsMenu.js.map +1 -1
  77. package/dist/esm/components/OverflowMenu/OverflowMenu.d.ts +7 -1
  78. package/dist/esm/components/OverflowMenu/OverflowMenu.d.ts.map +1 -1
  79. package/dist/esm/components/OverflowMenu/OverflowMenu.js +36 -23
  80. package/dist/esm/components/OverflowMenu/OverflowMenu.js.map +1 -1
  81. package/dist/esm/components/Pagination/Pagination.d.ts +4 -0
  82. package/dist/esm/components/Pagination/Pagination.d.ts.map +1 -1
  83. package/dist/esm/components/Pagination/Pagination.js.map +1 -1
  84. package/dist/esm/components/Radio/Radio.d.ts +4 -0
  85. package/dist/esm/components/Radio/Radio.d.ts.map +1 -1
  86. package/dist/esm/components/Radio/Radio.js.map +1 -1
  87. package/dist/esm/components/Select/Select.d.ts +4 -0
  88. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  89. package/dist/esm/components/Select/Select.js.map +1 -1
  90. package/dist/esm/components/Switch/Switch.d.ts +4 -0
  91. package/dist/esm/components/Switch/Switch.d.ts.map +1 -1
  92. package/dist/esm/components/Switch/Switch.js.map +1 -1
  93. package/dist/esm/components/Tabs/Tab.d.ts +2 -0
  94. package/dist/esm/components/Tabs/Tab.d.ts.map +1 -1
  95. package/dist/esm/components/Tabs/Tab.js.map +1 -1
  96. package/dist/esm/components/Tabs/TabContent.d.ts +4 -0
  97. package/dist/esm/components/Tabs/TabContent.d.ts.map +1 -1
  98. package/dist/esm/components/Tabs/TabContent.js.map +1 -1
  99. package/dist/esm/components/Tabs/Tabs.d.ts +4 -0
  100. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  101. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  102. package/dist/esm/components/Text/Text.d.ts +4 -0
  103. package/dist/esm/components/Text/Text.d.ts.map +1 -1
  104. package/dist/esm/components/Text/Text.js.map +1 -1
  105. package/dist/esm/components/TextInput/TextInput.d.ts +4 -0
  106. package/dist/esm/components/TextInput/TextInput.d.ts.map +1 -1
  107. package/dist/esm/components/TextInput/TextInput.js.map +1 -1
  108. package/dist/esm/components/Title/Title.d.ts +4 -0
  109. package/dist/esm/components/Title/Title.d.ts.map +1 -1
  110. package/dist/esm/components/Title/Title.js.map +1 -1
  111. package/dist/esm/components/Toolbar/Toolbar.d.ts +4 -0
  112. package/dist/esm/components/Toolbar/Toolbar.d.ts.map +1 -1
  113. package/dist/esm/components/Toolbar/Toolbar.js.map +1 -1
  114. package/dist/esm/components/TreeView/TreeView.d.ts.map +1 -1
  115. package/dist/esm/components/TreeView/TreeView.js +1 -1
  116. package/dist/esm/components/TreeView/TreeView.js.map +1 -1
  117. package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  118. package/dist/esm/components/TreeView/TreeViewListItem.js +2 -2
  119. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  120. package/dist/esm/components/TreeView/TreeViewRoot.d.ts +5 -3
  121. package/dist/esm/components/TreeView/TreeViewRoot.d.ts.map +1 -1
  122. package/dist/esm/components/TreeView/TreeViewRoot.js +26 -17
  123. package/dist/esm/components/TreeView/TreeViewRoot.js.map +1 -1
  124. package/dist/js/components/Alert/Alert.d.ts +4 -0
  125. package/dist/js/components/Alert/Alert.d.ts.map +1 -1
  126. package/dist/js/components/Alert/Alert.js.map +1 -1
  127. package/dist/js/components/Breadcrumb/Breadcrumb.d.ts +4 -0
  128. package/dist/js/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  129. package/dist/js/components/Breadcrumb/Breadcrumb.js.map +1 -1
  130. package/dist/js/components/Button/Button.d.ts +4 -0
  131. package/dist/js/components/Button/Button.d.ts.map +1 -1
  132. package/dist/js/components/Button/Button.js.map +1 -1
  133. package/dist/js/components/Card/Card.d.ts +4 -0
  134. package/dist/js/components/Card/Card.d.ts.map +1 -1
  135. package/dist/js/components/Card/Card.js.map +1 -1
  136. package/dist/js/components/Checkbox/Checkbox.d.ts +4 -0
  137. package/dist/js/components/Checkbox/Checkbox.d.ts.map +1 -1
  138. package/dist/js/components/Checkbox/Checkbox.js.map +1 -1
  139. package/dist/js/components/Chip/Chip.d.ts +2 -0
  140. package/dist/js/components/Chip/Chip.d.ts.map +1 -1
  141. package/dist/js/components/Chip/Chip.js.map +1 -1
  142. package/dist/js/components/ChipGroup/ChipGroup.d.ts +2 -0
  143. package/dist/js/components/ChipGroup/ChipGroup.d.ts.map +1 -1
  144. package/dist/js/components/ChipGroup/ChipGroup.js.map +1 -1
  145. package/dist/js/components/ContextSelector/ContextSelector.d.ts +4 -0
  146. package/dist/js/components/ContextSelector/ContextSelector.d.ts.map +1 -1
  147. package/dist/js/components/ContextSelector/ContextSelector.js.map +1 -1
  148. package/dist/js/components/Dropdown/Dropdown.d.ts +4 -0
  149. package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
  150. package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
  151. package/dist/js/components/Dropdown/DropdownItem.d.ts +4 -0
  152. package/dist/js/components/Dropdown/DropdownItem.d.ts.map +1 -1
  153. package/dist/js/components/Dropdown/DropdownItem.js.map +1 -1
  154. package/dist/js/components/Dropdown/DropdownSeparator.d.ts +4 -0
  155. package/dist/js/components/Dropdown/DropdownSeparator.d.ts.map +1 -1
  156. package/dist/js/components/Dropdown/DropdownSeparator.js.map +1 -1
  157. package/dist/js/components/Dropdown/DropdownToggle.d.ts +4 -0
  158. package/dist/js/components/Dropdown/DropdownToggle.d.ts.map +1 -1
  159. package/dist/js/components/Dropdown/DropdownToggle.js.map +1 -1
  160. package/dist/js/components/Dropdown/DropdownToggleCheckbox.d.ts +4 -0
  161. package/dist/js/components/Dropdown/DropdownToggleCheckbox.d.ts.map +1 -1
  162. package/dist/js/components/Dropdown/DropdownToggleCheckbox.js.map +1 -1
  163. package/dist/js/components/Form/Form.d.ts +4 -2
  164. package/dist/js/components/Form/Form.d.ts.map +1 -1
  165. package/dist/js/components/Form/Form.js +4 -4
  166. package/dist/js/components/Form/Form.js.map +1 -1
  167. package/dist/js/components/FormSelect/FormSelect.d.ts +4 -0
  168. package/dist/js/components/FormSelect/FormSelect.d.ts.map +1 -1
  169. package/dist/js/components/FormSelect/FormSelect.js.map +1 -1
  170. package/dist/js/components/LoginPage/LoginForm.d.ts +1 -1
  171. package/dist/js/components/LoginPage/LoginForm.d.ts.map +1 -1
  172. package/dist/js/components/Menu/Menu.d.ts +4 -0
  173. package/dist/js/components/Menu/Menu.d.ts.map +1 -1
  174. package/dist/js/components/Menu/Menu.js.map +1 -1
  175. package/dist/js/components/MenuToggle/MenuToggleCheckbox.d.ts +4 -0
  176. package/dist/js/components/MenuToggle/MenuToggleCheckbox.d.ts.map +1 -1
  177. package/dist/js/components/MenuToggle/MenuToggleCheckbox.js.map +1 -1
  178. package/dist/js/components/Modal/Modal.d.ts +4 -0
  179. package/dist/js/components/Modal/Modal.d.ts.map +1 -1
  180. package/dist/js/components/Modal/Modal.js.map +1 -1
  181. package/dist/js/components/Modal/ModalBoxCloseButton.d.ts +2 -0
  182. package/dist/js/components/Modal/ModalBoxCloseButton.d.ts.map +1 -1
  183. package/dist/js/components/Modal/ModalBoxCloseButton.js.map +1 -1
  184. package/dist/js/components/Modal/ModalContent.d.ts +4 -0
  185. package/dist/js/components/Modal/ModalContent.d.ts.map +1 -1
  186. package/dist/js/components/Modal/ModalContent.js.map +1 -1
  187. package/dist/js/components/Nav/Nav.d.ts +4 -0
  188. package/dist/js/components/Nav/Nav.d.ts.map +1 -1
  189. package/dist/js/components/Nav/Nav.js.map +1 -1
  190. package/dist/js/components/Nav/NavExpandable.d.ts +2 -0
  191. package/dist/js/components/Nav/NavExpandable.d.ts.map +1 -1
  192. package/dist/js/components/Nav/NavExpandable.js.map +1 -1
  193. package/dist/js/components/Nav/NavItem.d.ts +4 -0
  194. package/dist/js/components/Nav/NavItem.d.ts.map +1 -1
  195. package/dist/js/components/Nav/NavItem.js.map +1 -1
  196. package/dist/js/components/OptionsMenu/OptionsMenu.d.ts +4 -0
  197. package/dist/js/components/OptionsMenu/OptionsMenu.d.ts.map +1 -1
  198. package/dist/js/components/OptionsMenu/OptionsMenu.js.map +1 -1
  199. package/dist/js/components/OverflowMenu/OverflowMenu.d.ts +7 -1
  200. package/dist/js/components/OverflowMenu/OverflowMenu.d.ts.map +1 -1
  201. package/dist/js/components/OverflowMenu/OverflowMenu.js +35 -22
  202. package/dist/js/components/OverflowMenu/OverflowMenu.js.map +1 -1
  203. package/dist/js/components/Pagination/Pagination.d.ts +4 -0
  204. package/dist/js/components/Pagination/Pagination.d.ts.map +1 -1
  205. package/dist/js/components/Pagination/Pagination.js.map +1 -1
  206. package/dist/js/components/Radio/Radio.d.ts +4 -0
  207. package/dist/js/components/Radio/Radio.d.ts.map +1 -1
  208. package/dist/js/components/Radio/Radio.js.map +1 -1
  209. package/dist/js/components/Select/Select.d.ts +4 -0
  210. package/dist/js/components/Select/Select.d.ts.map +1 -1
  211. package/dist/js/components/Select/Select.js.map +1 -1
  212. package/dist/js/components/Switch/Switch.d.ts +4 -0
  213. package/dist/js/components/Switch/Switch.d.ts.map +1 -1
  214. package/dist/js/components/Switch/Switch.js.map +1 -1
  215. package/dist/js/components/Tabs/Tab.d.ts +2 -0
  216. package/dist/js/components/Tabs/Tab.d.ts.map +1 -1
  217. package/dist/js/components/Tabs/Tab.js.map +1 -1
  218. package/dist/js/components/Tabs/TabContent.d.ts +4 -0
  219. package/dist/js/components/Tabs/TabContent.d.ts.map +1 -1
  220. package/dist/js/components/Tabs/TabContent.js.map +1 -1
  221. package/dist/js/components/Tabs/Tabs.d.ts +4 -0
  222. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  223. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  224. package/dist/js/components/Text/Text.d.ts +4 -0
  225. package/dist/js/components/Text/Text.d.ts.map +1 -1
  226. package/dist/js/components/Text/Text.js.map +1 -1
  227. package/dist/js/components/TextInput/TextInput.d.ts +4 -0
  228. package/dist/js/components/TextInput/TextInput.d.ts.map +1 -1
  229. package/dist/js/components/TextInput/TextInput.js.map +1 -1
  230. package/dist/js/components/Title/Title.d.ts +4 -0
  231. package/dist/js/components/Title/Title.d.ts.map +1 -1
  232. package/dist/js/components/Title/Title.js.map +1 -1
  233. package/dist/js/components/Toolbar/Toolbar.d.ts +4 -0
  234. package/dist/js/components/Toolbar/Toolbar.d.ts.map +1 -1
  235. package/dist/js/components/Toolbar/Toolbar.js.map +1 -1
  236. package/dist/js/components/TreeView/TreeView.d.ts.map +1 -1
  237. package/dist/js/components/TreeView/TreeView.js +1 -1
  238. package/dist/js/components/TreeView/TreeView.js.map +1 -1
  239. package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  240. package/dist/js/components/TreeView/TreeViewListItem.js +2 -2
  241. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  242. package/dist/js/components/TreeView/TreeViewRoot.d.ts +5 -3
  243. package/dist/js/components/TreeView/TreeViewRoot.d.ts.map +1 -1
  244. package/dist/js/components/TreeView/TreeViewRoot.js +26 -17
  245. package/dist/js/components/TreeView/TreeViewRoot.js.map +1 -1
  246. package/dist/umd/react-core.min.css +69 -69
  247. package/dist/umd/react-core.min.js +1 -1
  248. package/package.json +2 -2
  249. package/src/components/Alert/Alert.tsx +4 -0
  250. package/src/components/Breadcrumb/Breadcrumb.tsx +4 -0
  251. package/src/components/Button/Button.tsx +4 -0
  252. package/src/components/Card/Card.tsx +4 -0
  253. package/src/components/Checkbox/Checkbox.tsx +4 -0
  254. package/src/components/Chip/Chip.tsx +2 -0
  255. package/src/components/ChipGroup/ChipGroup.tsx +2 -0
  256. package/src/components/ContextSelector/ContextSelector.tsx +4 -0
  257. package/src/components/Dropdown/Dropdown.tsx +4 -0
  258. package/src/components/Dropdown/DropdownItem.tsx +4 -0
  259. package/src/components/Dropdown/DropdownSeparator.tsx +4 -0
  260. package/src/components/Dropdown/DropdownToggle.tsx +4 -0
  261. package/src/components/Dropdown/DropdownToggleCheckbox.tsx +4 -0
  262. package/src/components/Dropdown/examples/Dropdown.md +1 -1
  263. package/src/components/Form/Form.tsx +9 -2
  264. package/src/components/FormSelect/FormSelect.tsx +4 -0
  265. package/src/components/LoginPage/LoginForm.tsx +1 -1
  266. package/src/components/Menu/Menu.tsx +4 -0
  267. package/src/components/MenuToggle/MenuToggleCheckbox.tsx +4 -0
  268. package/src/components/Modal/Modal.tsx +4 -0
  269. package/src/components/Modal/ModalBoxCloseButton.tsx +2 -0
  270. package/src/components/Modal/ModalContent.tsx +4 -0
  271. package/src/components/Nav/Nav.tsx +4 -0
  272. package/src/components/Nav/NavExpandable.tsx +2 -0
  273. package/src/components/Nav/NavItem.tsx +4 -0
  274. package/src/components/OptionsMenu/OptionsMenu.tsx +4 -0
  275. package/src/components/OverflowMenu/OverflowMenu.tsx +46 -25
  276. package/src/components/OverflowMenu/__tests__/OverflowMenu.test.tsx +38 -0
  277. package/src/components/OverflowMenu/examples/OverflowMenu.md +127 -35
  278. package/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainer.tsx +100 -0
  279. package/src/components/Pagination/Pagination.tsx +4 -0
  280. package/src/components/Radio/Radio.tsx +4 -0
  281. package/src/components/Select/Select.tsx +4 -0
  282. package/src/components/Switch/Switch.tsx +4 -0
  283. package/src/components/Tabs/Tab.tsx +2 -0
  284. package/src/components/Tabs/TabContent.tsx +4 -0
  285. package/src/components/Tabs/Tabs.tsx +4 -0
  286. package/src/components/Text/Text.tsx +4 -0
  287. package/src/components/TextInput/TextInput.tsx +4 -0
  288. package/src/components/Title/Title.tsx +4 -0
  289. package/src/components/Toolbar/Toolbar.tsx +4 -0
  290. package/src/components/TreeView/TreeView.tsx +8 -1
  291. package/src/components/TreeView/TreeViewListItem.tsx +4 -3
  292. package/src/components/TreeView/TreeViewRoot.tsx +38 -18
  293. package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +0 -51
  294. package/src/demos/examples/DashboardHeader.js +35 -6
  295. package/src/helpers/OUIA/OUIA.md +1 -1
@@ -2,7 +2,15 @@
2
2
  id: Overflow menu
3
3
  section: components
4
4
  cssPrefix: pf-c-overflow-menu
5
- propComponents: ['OverflowMenu', 'OverflowMenuContent', 'OverflowMenuControl', 'OverflowMenuDropdownItem', 'OverflowMenuGroup', 'OverflowMenuItem']
5
+ propComponents:
6
+ [
7
+ 'OverflowMenu',
8
+ 'OverflowMenuContent',
9
+ 'OverflowMenuControl',
10
+ 'OverflowMenuDropdownItem',
11
+ 'OverflowMenuGroup',
12
+ 'OverflowMenuItem',
13
+ ]
6
14
  ---
7
15
 
8
16
  import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon';
@@ -10,10 +18,19 @@ import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center
10
18
  import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon';
11
19
 
12
20
  ## Examples
21
+
13
22
  ### Simple (responsive)
23
+
14
24
  ```js
15
25
  import React from 'react';
16
- import { OverflowMenu, OverflowMenuControl, OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem } from '@patternfly/react-core';
26
+ import {
27
+ OverflowMenu,
28
+ OverflowMenuControl,
29
+ OverflowMenuContent,
30
+ OverflowMenuGroup,
31
+ OverflowMenuItem,
32
+ OverflowMenuDropdownItem
33
+ } from '@patternfly/react-core';
17
34
  import { Dropdown, KebabToggle } from '@patternfly/react-core';
18
35
 
19
36
  class SimpleOverflowMenu extends React.Component {
@@ -37,12 +54,22 @@ class SimpleOverflowMenu extends React.Component {
37
54
  render() {
38
55
  const { isOpen } = this.state;
39
56
  const dropdownItems = [
40
- <OverflowMenuDropdownItem key="item1" isShared>Item 1</OverflowMenuDropdownItem>,
41
- <OverflowMenuDropdownItem key="item2" isShared>Item 2</OverflowMenuDropdownItem>,
42
- <OverflowMenuDropdownItem key="item3" isShared>Item 3</OverflowMenuDropdownItem>,
43
- <OverflowMenuDropdownItem key="item4" isShared>Item 4</OverflowMenuDropdownItem>,
44
- <OverflowMenuDropdownItem key="item5" isShared>Item 5</OverflowMenuDropdownItem>
45
- ]
57
+ <OverflowMenuDropdownItem key="item1" isShared>
58
+ Item 1
59
+ </OverflowMenuDropdownItem>,
60
+ <OverflowMenuDropdownItem key="item2" isShared>
61
+ Item 2
62
+ </OverflowMenuDropdownItem>,
63
+ <OverflowMenuDropdownItem key="item3" isShared>
64
+ Item 3
65
+ </OverflowMenuDropdownItem>,
66
+ <OverflowMenuDropdownItem key="item4" isShared>
67
+ Item 4
68
+ </OverflowMenuDropdownItem>,
69
+ <OverflowMenuDropdownItem key="item5" isShared>
70
+ Item 5
71
+ </OverflowMenuDropdownItem>
72
+ ];
46
73
  return (
47
74
  <OverflowMenu breakpoint="lg">
48
75
  <OverflowMenuContent>
@@ -66,15 +93,23 @@ class SimpleOverflowMenu extends React.Component {
66
93
  />
67
94
  </OverflowMenuControl>
68
95
  </OverflowMenu>
69
- )
96
+ );
70
97
  }
71
98
  }
72
99
  ```
73
100
 
74
101
  ### Group types
102
+
75
103
  ```js
76
104
  import React from 'react';
77
- import { OverflowMenu, OverflowMenuControl, OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem } from '@patternfly/react-core';
105
+ import {
106
+ OverflowMenu,
107
+ OverflowMenuControl,
108
+ OverflowMenuContent,
109
+ OverflowMenuGroup,
110
+ OverflowMenuItem,
111
+ OverflowMenuDropdownItem
112
+ } from '@patternfly/react-core';
78
113
  import { Dropdown, KebabToggle, Button, ButtonVariant } from '@patternfly/react-core';
79
114
  import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon';
80
115
  import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center-icon';
@@ -101,15 +136,33 @@ class OverflowMenuGroupTypes extends React.Component {
101
136
  render() {
102
137
  const { isOpen } = this.state;
103
138
  const dropdownItems = [
104
- <OverflowMenuDropdownItem key="item1" isShared>Item 1</OverflowMenuDropdownItem>,
105
- <OverflowMenuDropdownItem key="item2" isShared>Item 2</OverflowMenuDropdownItem>,
106
- <OverflowMenuDropdownItem key="item3" isShared>Item 3</OverflowMenuDropdownItem>,
107
- <OverflowMenuDropdownItem key="primary" isShared>Primary</OverflowMenuDropdownItem>,
108
- <OverflowMenuDropdownItem key="secondary" isShared>Secondary</OverflowMenuDropdownItem>,
109
- <OverflowMenuDropdownItem key="tertiary" isShared>Tertiary</OverflowMenuDropdownItem>,
110
- <OverflowMenuDropdownItem key="action1" isShared>Action 1</OverflowMenuDropdownItem>,
111
- <OverflowMenuDropdownItem key="action2" isShared>Action 2</OverflowMenuDropdownItem>,
112
- <OverflowMenuDropdownItem key="action3" isShared>Action 3</OverflowMenuDropdownItem>,
139
+ <OverflowMenuDropdownItem key="item1" isShared>
140
+ Item 1
141
+ </OverflowMenuDropdownItem>,
142
+ <OverflowMenuDropdownItem key="item2" isShared>
143
+ Item 2
144
+ </OverflowMenuDropdownItem>,
145
+ <OverflowMenuDropdownItem key="item3" isShared>
146
+ Item 3
147
+ </OverflowMenuDropdownItem>,
148
+ <OverflowMenuDropdownItem key="primary" isShared>
149
+ Primary
150
+ </OverflowMenuDropdownItem>,
151
+ <OverflowMenuDropdownItem key="secondary" isShared>
152
+ Secondary
153
+ </OverflowMenuDropdownItem>,
154
+ <OverflowMenuDropdownItem key="tertiary" isShared>
155
+ Tertiary
156
+ </OverflowMenuDropdownItem>,
157
+ <OverflowMenuDropdownItem key="action1" isShared>
158
+ Action 1
159
+ </OverflowMenuDropdownItem>,
160
+ <OverflowMenuDropdownItem key="action2" isShared>
161
+ Action 2
162
+ </OverflowMenuDropdownItem>,
163
+ <OverflowMenuDropdownItem key="action3" isShared>
164
+ Action 3
165
+ </OverflowMenuDropdownItem>
113
166
  ];
114
167
  return (
115
168
  <OverflowMenu breakpoint="lg">
@@ -160,16 +213,23 @@ class OverflowMenuGroupTypes extends React.Component {
160
213
  />
161
214
  </OverflowMenuControl>
162
215
  </OverflowMenu>
163
- )
216
+ );
164
217
  }
165
218
  }
166
219
  ```
167
220
 
168
-
169
221
  ### Multiple groups
222
+
170
223
  ```js
171
224
  import React from 'react';
172
- import { OverflowMenu, OverflowMenuControl, OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem } from '@patternfly/react-core';
225
+ import {
226
+ OverflowMenu,
227
+ OverflowMenuControl,
228
+ OverflowMenuContent,
229
+ OverflowMenuGroup,
230
+ OverflowMenuItem,
231
+ OverflowMenuDropdownItem
232
+ } from '@patternfly/react-core';
173
233
  import { Dropdown, KebabToggle, Button, ButtonVariant } from '@patternfly/react-core';
174
234
  import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon';
175
235
  import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center-icon';
@@ -196,13 +256,25 @@ class OverflowMenuAdditionalOptions extends React.Component {
196
256
  render() {
197
257
  const { isOpen } = this.state;
198
258
  const dropdownItems = [
199
- <OverflowMenuDropdownItem key="1" isShared>Primary</OverflowMenuDropdownItem>,
200
- <OverflowMenuDropdownItem key="2" isShared>Secondary</OverflowMenuDropdownItem>,
201
- <OverflowMenuDropdownItem key="3" isShared>Tertiary</OverflowMenuDropdownItem>,
202
- <OverflowMenuDropdownItem key="4" isShared>Action 4</OverflowMenuDropdownItem>,
203
- <OverflowMenuDropdownItem key="5" isShared>Action 5</OverflowMenuDropdownItem>,
204
- <OverflowMenuDropdownItem key="6" isShared>Action 6</OverflowMenuDropdownItem>,
205
- <OverflowMenuDropdownItem key="7">Action 7</OverflowMenuDropdownItem>,
259
+ <OverflowMenuDropdownItem key="1" isShared>
260
+ Primary
261
+ </OverflowMenuDropdownItem>,
262
+ <OverflowMenuDropdownItem key="2" isShared>
263
+ Secondary
264
+ </OverflowMenuDropdownItem>,
265
+ <OverflowMenuDropdownItem key="3" isShared>
266
+ Tertiary
267
+ </OverflowMenuDropdownItem>,
268
+ <OverflowMenuDropdownItem key="4" isShared>
269
+ Action 4
270
+ </OverflowMenuDropdownItem>,
271
+ <OverflowMenuDropdownItem key="5" isShared>
272
+ Action 5
273
+ </OverflowMenuDropdownItem>,
274
+ <OverflowMenuDropdownItem key="6" isShared>
275
+ Action 6
276
+ </OverflowMenuDropdownItem>,
277
+ <OverflowMenuDropdownItem key="7">Action 7</OverflowMenuDropdownItem>
206
278
  ];
207
279
  return (
208
280
  <OverflowMenu breakpoint="lg">
@@ -248,16 +320,23 @@ class OverflowMenuAdditionalOptions extends React.Component {
248
320
  />
249
321
  </OverflowMenuControl>
250
322
  </OverflowMenu>
251
- )
323
+ );
252
324
  }
253
325
  }
254
326
  ```
255
327
 
256
-
257
328
  ### Persistent
329
+
258
330
  ```js
259
331
  import React from 'react';
260
- import { OverflowMenu, OverflowMenuControl, OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem } from '@patternfly/react-core';
332
+ import {
333
+ OverflowMenu,
334
+ OverflowMenuControl,
335
+ OverflowMenuContent,
336
+ OverflowMenuGroup,
337
+ OverflowMenuItem,
338
+ OverflowMenuDropdownItem
339
+ } from '@patternfly/react-core';
261
340
  import { Dropdown, KebabToggle, Button, ButtonVariant } from '@patternfly/react-core';
262
341
 
263
342
  class OverflowMenuPersist extends React.Component {
@@ -281,8 +360,12 @@ class OverflowMenuPersist extends React.Component {
281
360
  render() {
282
361
  const { isOpen } = this.state;
283
362
  const dropdownItems = [
284
- <OverflowMenuDropdownItem key="secondary" isShared>Secondary</OverflowMenuDropdownItem>,
285
- <OverflowMenuDropdownItem key="tertiary" isShared>Tertiary</OverflowMenuDropdownItem>,
363
+ <OverflowMenuDropdownItem key="secondary" isShared>
364
+ Secondary
365
+ </OverflowMenuDropdownItem>,
366
+ <OverflowMenuDropdownItem key="tertiary" isShared>
367
+ Tertiary
368
+ </OverflowMenuDropdownItem>,
286
369
  <OverflowMenuDropdownItem key="action">Action 4</OverflowMenuDropdownItem>
287
370
  ];
288
371
  return (
@@ -312,7 +395,16 @@ class OverflowMenuPersist extends React.Component {
312
395
  />
313
396
  </OverflowMenuControl>
314
397
  </OverflowMenu>
315
- )
398
+ );
316
399
  }
317
400
  }
318
401
  ```
402
+
403
+ ### Breakpoint on container
404
+
405
+ By passing in the `breakpointReference` property, the overflow menu's breakpoint will be relative to the width of the reference container rather than the viewport width.
406
+
407
+ You can change the container width in this example by adjusting the slider. As the container width changes, the overflow menu will change between a horizontal menu and a vertical dropdown despite the viewport width not changing.
408
+
409
+ ```ts file="./OverflowMenuBreakpointOnContainer.tsx"
410
+ ```
@@ -0,0 +1,100 @@
1
+ import React from 'react';
2
+ import {
3
+ OverflowMenu,
4
+ OverflowMenuControl,
5
+ OverflowMenuContent,
6
+ OverflowMenuGroup,
7
+ OverflowMenuItem,
8
+ OverflowMenuDropdownItem,
9
+ Dropdown,
10
+ KebabToggle,
11
+ Slider
12
+ } from '@patternfly/react-core';
13
+
14
+ export const OverflowMenuBreakpointOnContainer: React.FunctionComponent = () => {
15
+ const [isOpen, setIsOpen] = React.useState(false);
16
+ const [containerWidth, setContainerWidth] = React.useState(100);
17
+ const containerRef = React.useRef<HTMLDivElement>(null);
18
+
19
+ const onToggle = (isOpen: boolean) => {
20
+ setIsOpen(isOpen);
21
+ };
22
+
23
+ const onSelect = () => {
24
+ setIsOpen(!isOpen);
25
+ };
26
+
27
+ const onChange = (value: number) => {
28
+ setContainerWidth(value);
29
+ };
30
+
31
+ const containerStyles = {
32
+ width: `${containerWidth}%`,
33
+ padding: '1rem',
34
+ borderWidth: '2px',
35
+ borderStyle: 'dashed'
36
+ };
37
+
38
+ const dropdownItems = [
39
+ <OverflowMenuDropdownItem key="item1" isShared>
40
+ Item 1
41
+ </OverflowMenuDropdownItem>,
42
+ <OverflowMenuDropdownItem key="item2" isShared>
43
+ Item 2
44
+ </OverflowMenuDropdownItem>,
45
+ <OverflowMenuDropdownItem key="item3" isShared>
46
+ Item 3
47
+ </OverflowMenuDropdownItem>,
48
+ <OverflowMenuDropdownItem key="item4" isShared>
49
+ Item 4
50
+ </OverflowMenuDropdownItem>,
51
+ <OverflowMenuDropdownItem key="item5" isShared>
52
+ Item 5
53
+ </OverflowMenuDropdownItem>
54
+ ];
55
+
56
+ return (
57
+ <>
58
+ <div style={{ width: '100%', maxWidth: '400px' }}>
59
+ <div>
60
+ <span id="overflowMenu-hasBreakpointOnContainer-slider-label">Current container width</span>: {containerWidth}
61
+ %
62
+ </div>
63
+ <Slider
64
+ value={containerWidth}
65
+ onChange={onChange}
66
+ max={100}
67
+ min={20}
68
+ step={20}
69
+ showTicks
70
+ showBoundaries={false}
71
+ aria-labelledby="overflowMenu-hasBreakpointOnContainer-slider-label"
72
+ />
73
+ </div>
74
+ <div ref={containerRef} id="breakpoint-reference-container" style={containerStyles}>
75
+ <OverflowMenu breakpointReference={containerRef} breakpoint="sm">
76
+ <OverflowMenuContent>
77
+ <OverflowMenuItem>Item 1</OverflowMenuItem>
78
+ <OverflowMenuItem>Item 2</OverflowMenuItem>
79
+ <OverflowMenuGroup>
80
+ <OverflowMenuItem>Item 3</OverflowMenuItem>
81
+ <OverflowMenuItem>Item 4</OverflowMenuItem>
82
+ <OverflowMenuItem>Item 5</OverflowMenuItem>
83
+ </OverflowMenuGroup>
84
+ </OverflowMenuContent>
85
+ <OverflowMenuControl>
86
+ <Dropdown
87
+ onSelect={onSelect}
88
+ toggle={<KebabToggle onToggle={onToggle} />}
89
+ isOpen={isOpen}
90
+ isPlain
91
+ dropdownItems={dropdownItems}
92
+ isFlipEnabled
93
+ menuAppendTo="parent"
94
+ />
95
+ </OverflowMenuControl>
96
+ </OverflowMenu>
97
+ </div>
98
+ </>
99
+ );
100
+ };
@@ -159,6 +159,10 @@ export interface PaginationProps extends React.HTMLProps<HTMLDivElement>, OUIAPr
159
159
  variant?: 'top' | 'bottom' | PaginationVariant;
160
160
  /** Id to ideintify widget on page. */
161
161
  widgetId?: string;
162
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
163
+ ouiaId?: number | string;
164
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
165
+ ouiaSafe?: boolean;
162
166
  }
163
167
 
164
168
  const handleInputWidth = (lastPage: number, node: HTMLDivElement) => {
@@ -35,6 +35,10 @@ export interface RadioProps
35
35
  description?: React.ReactNode;
36
36
  /** Body of the radio. */
37
37
  body?: React.ReactNode;
38
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
39
+ ouiaId?: number | string;
40
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
41
+ ouiaSafe?: boolean;
38
42
  }
39
43
 
40
44
  export class Radio extends React.Component<RadioProps, { ouiaStateId: string }> {
@@ -184,6 +184,10 @@ export interface SelectProps
184
184
  isFlipEnabled?: boolean;
185
185
  /** @beta Opt-in for updated popper that does not use findDOMNode. */
186
186
  removeFindDomNode?: boolean;
187
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
188
+ ouiaId?: number | string;
189
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
190
+ ouiaSafe?: boolean;
187
191
  }
188
192
 
189
193
  export interface SelectState {
@@ -34,6 +34,10 @@ export interface SwitchProps
34
34
  'aria-label'?: string;
35
35
  /** Flag to reverse the layout of toggle and label (toggle on right). */
36
36
  isReversed?: boolean;
37
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
38
+ ouiaId?: number | string;
39
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
40
+ ouiaSafe?: boolean;
37
41
  }
38
42
 
39
43
  export class Switch extends React.Component<SwitchProps & OUIAProps, { ouiaStateId: string }> {
@@ -39,6 +39,8 @@ export interface TabProps extends Omit<React.HTMLProps<HTMLAnchorElement | HTMLB
39
39
  closeButtonAriaLabel?: string;
40
40
  /** @beta Flag indicating the close button should be disabled */
41
41
  isCloseDisabled?: boolean;
42
+ /** Value to set the data-ouia-component-id for the tab button.*/
43
+ ouiaId?: number | string;
42
44
  }
43
45
 
44
46
  const TabBase: React.FunctionComponent<TabProps> = ({
@@ -21,6 +21,10 @@ export interface TabContentProps extends Omit<React.HTMLProps<HTMLElement>, 'ref
21
21
  id: string;
22
22
  /** title of controlling Tab if used outside Tabs component */
23
23
  'aria-label'?: string;
24
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
25
+ ouiaId?: number | string;
26
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
27
+ ouiaSafe?: boolean;
24
28
  }
25
29
 
26
30
  const variantStyle = {
@@ -106,6 +106,10 @@ export interface TabsProps extends Omit<React.HTMLProps<HTMLElement | HTMLDivEle
106
106
  onToggle?: (isExpanded: boolean) => void;
107
107
  /** @beta Flag which places overflowing tabs into a menu triggered by the last tab. Additionally an object can be passed with custom settings for the overflow tab. */
108
108
  isOverflowHorizontal?: boolean | HorizontalOverflowObject;
109
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
110
+ ouiaId?: number | string;
111
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
112
+ ouiaSafe?: boolean;
109
113
  }
110
114
 
111
115
  const variantStyle = {
@@ -26,6 +26,10 @@ export interface TextProps extends React.HTMLProps<HTMLElement>, OUIAProps {
26
26
  className?: string;
27
27
  /** Flag to indicate the link has visited styles applied if the browser determines the link has been visited */
28
28
  isVisitedLink?: boolean;
29
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
30
+ ouiaId?: number | string;
31
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
32
+ ouiaSafe?: boolean;
29
33
  }
30
34
 
31
35
  export const Text: React.FunctionComponent<TextProps> = ({
@@ -77,6 +77,10 @@ export interface TextInputProps
77
77
  customIconUrl?: string;
78
78
  /** Dimensions for the custom icon set as the text input's background-size */
79
79
  customIconDimensions?: string;
80
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
81
+ ouiaId?: number | string;
82
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
83
+ ouiaSafe?: boolean;
80
84
  }
81
85
 
82
86
  interface TextInputState {
@@ -32,6 +32,10 @@ export interface TitleProps extends Omit<React.HTMLProps<HTMLHeadingElement>, 's
32
32
  className?: string;
33
33
  /** The heading level to use */
34
34
  headingLevel: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
35
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
36
+ ouiaId?: number | string;
37
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
38
+ ouiaSafe?: boolean;
35
39
  }
36
40
 
37
41
  export const Title: React.FunctionComponent<TitleProps> = ({
@@ -46,6 +46,10 @@ export interface ToolbarProps extends React.HTMLProps<HTMLDivElement>, OUIAProps
46
46
  };
47
47
  /** Text to display in the total number of applied filters ToolbarFilter */
48
48
  numberOfFiltersText?: (numberOfFilters: number) => string;
49
+ /** Value to overwrite the randomly generated data-ouia-component-id.*/
50
+ ouiaId?: number | string;
51
+ /** Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. */
52
+ ouiaSafe?: boolean;
49
53
  }
50
54
 
51
55
  export interface ToolbarState {
@@ -168,7 +168,14 @@ export const TreeView: React.FunctionComponent<TreeViewProps> = ({
168
168
  {parentItem ? (
169
169
  treeViewList
170
170
  ) : (
171
- <TreeViewRoot hasChecks={hasChecks} hasGuides={hasGuides} variant={variant} className={className} {...props}>
171
+ <TreeViewRoot
172
+ hasSelectableNodes={hasSelectableNodes}
173
+ hasChecks={hasChecks}
174
+ hasGuides={hasGuides}
175
+ variant={variant}
176
+ className={className}
177
+ {...props}
178
+ >
172
179
  {treeViewList}
173
180
  </TreeViewRoot>
174
181
  )}
@@ -155,8 +155,10 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
155
155
  const content = (
156
156
  <>
157
157
  {isCompact && title && <span className={css(styles.treeViewNodeTitle)}>{title}</span>}
158
- {hasCheck ? (
159
- <span className={css(styles.treeViewNodeText)}>{name}</span>
158
+ {isSelectable ? (
159
+ <button tabIndex={-1} className={css(styles.treeViewNodeText)}>
160
+ {name}
161
+ </button>
160
162
  ) : (
161
163
  <span className={css(styles.treeViewNodeText)}>{name}</span>
162
164
  )}
@@ -210,7 +212,6 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
210
212
  }
211
213
  }
212
214
  }}
213
- tabIndex={isSelectable ? 0 : -1}
214
215
  {...(hasCheck && { htmlFor: randomId })}
215
216
  {...((hasCheck || (isSelectable && children)) && { id: `label-${randomId}` })}
216
217
  >
@@ -3,18 +3,21 @@ import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/TreeView/tree-view';
4
4
  import { canUseDOM } from '../../helpers/util';
5
5
  import { handleArrows } from '../../helpers';
6
+ import { KeyTypes } from '../../helpers/constants';
6
7
 
7
8
  export interface TreeViewRootProps {
8
- /** Child nodes of the tree view. */
9
+ /** Child nodes of the tree view */
9
10
  children: React.ReactNode;
10
- /** Class to add to add if not passed a parentItem property. */
11
- className?: string;
12
11
  /** Flag indicating if the tree view has checkboxes. */
13
12
  hasChecks?: boolean;
14
13
  /** Flag indicating if tree view has guide lines. */
15
14
  hasGuides?: boolean;
16
15
  /** Variant presentation styles for the tree view. */
17
16
  variant?: 'default' | 'compact' | 'compactNoBackground';
17
+ /** Class to add to add if not passed a parentItem */
18
+ className?: string;
19
+ /** Flag indicating that tree nodes should be independently selectable, even when having children */
20
+ hasSelectableNodes?: boolean;
18
21
  }
19
22
 
20
23
  export class TreeViewRoot extends React.Component<TreeViewRootProps> {
@@ -23,16 +26,29 @@ export class TreeViewRoot extends React.Component<TreeViewRootProps> {
23
26
 
24
27
  componentDidMount() {
25
28
  if (canUseDOM) {
26
- window.addEventListener('keydown', this.props.hasChecks ? this.handleKeysCheckbox : this.handleKeys);
29
+ window.addEventListener(
30
+ 'keydown',
31
+ this.props.hasChecks || this.props.hasSelectableNodes ? this.handleKeysCheckbox : this.handleKeys
32
+ );
27
33
  }
28
- if (this.props.hasChecks) {
29
- const firstToggle = this.treeRef.current?.getElementsByClassName('pf-c-tree-view__node-toggle')[0] as HTMLElement;
34
+ if (this.props.hasChecks || this.props.hasSelectableNodes) {
35
+ const firstToggle = this.treeRef.current.getElementsByClassName('pf-c-tree-view__node-toggle')[0] as HTMLElement;
30
36
  if (firstToggle) {
31
37
  firstToggle.tabIndex = 0;
32
38
  }
33
- const firstInput = this.treeRef.current?.getElementsByTagName('INPUT')[0] as HTMLElement;
34
- if (firstInput) {
35
- firstInput.tabIndex = 0;
39
+ if (this.props.hasChecks) {
40
+ const firstInput = this.treeRef.current.getElementsByTagName('INPUT')[0] as HTMLElement;
41
+ if (firstInput) {
42
+ firstInput.tabIndex = 0;
43
+ }
44
+ }
45
+ if (this.props.hasSelectableNodes) {
46
+ const firstTextButton = this.treeRef.current.getElementsByClassName(
47
+ 'pf-c-tree-view__node-text'
48
+ )[0] as HTMLElement;
49
+ if (firstTextButton) {
50
+ firstTextButton.tabIndex = 0;
51
+ }
36
52
  }
37
53
  } else {
38
54
  (this.treeRef.current?.getElementsByClassName('pf-c-tree-view__node')[0] as HTMLElement).tabIndex = 0;
@@ -41,12 +57,15 @@ export class TreeViewRoot extends React.Component<TreeViewRootProps> {
41
57
 
42
58
  componentWillUnmount() {
43
59
  if (canUseDOM) {
44
- window.removeEventListener('keydown', this.props.hasChecks ? this.handleKeysCheckbox : this.handleKeys);
60
+ window.removeEventListener(
61
+ 'keydown',
62
+ this.props.hasChecks || this.props.hasSelectableNodes ? this.handleKeysCheckbox : this.handleKeys
63
+ );
45
64
  }
46
65
  }
47
66
 
48
67
  handleKeys = (event: KeyboardEvent) => {
49
- if (this.treeRef.current !== (event.target as HTMLElement).closest('.pf-c-tree-view')) {
68
+ if (!this.treeRef.current.contains(event.target as HTMLElement)) {
50
69
  return;
51
70
  }
52
71
  const activeElement = document.activeElement;
@@ -55,8 +74,8 @@ export class TreeViewRoot extends React.Component<TreeViewRootProps> {
55
74
  el => !el.classList.contains('pf-m-disabled')
56
75
  );
57
76
 
58
- if (key === 'Space') {
59
- (document.activeElement as HTMLElement).click();
77
+ if (key === KeyTypes.Space) {
78
+ (activeElement as HTMLElement).click();
60
79
  event.preventDefault();
61
80
  }
62
81
 
@@ -109,14 +128,15 @@ export class TreeViewRoot extends React.Component<TreeViewRootProps> {
109
128
  };
110
129
 
111
130
  handleKeysCheckbox = (event: KeyboardEvent) => {
112
- if (this.treeRef.current !== (event.target as HTMLElement).closest('.pf-c-tree-view')) {
131
+ if (!this.treeRef.current.contains(event.target as HTMLElement)) {
113
132
  return;
114
133
  }
134
+
115
135
  const activeElement = document.activeElement;
116
136
  const key = event.key;
117
137
 
118
- if (key === 'Space') {
119
- (document.activeElement as HTMLElement).click();
138
+ if (key === KeyTypes.Space) {
139
+ (activeElement as HTMLElement).click();
120
140
  event.preventDefault();
121
141
  }
122
142
 
@@ -126,7 +146,7 @@ export class TreeViewRoot extends React.Component<TreeViewRootProps> {
126
146
  event,
127
147
  treeNodes as HTMLElement[],
128
148
  (element: Element) => element.contains(activeElement),
129
- (element: Element) => element.querySelector('BUTTON,INPUT'),
149
+ (element: Element) => element.querySelector('button,input'),
130
150
  [],
131
151
  undefined,
132
152
  true,
@@ -168,7 +188,7 @@ export class TreeViewRoot extends React.Component<TreeViewRootProps> {
168
188
 
169
189
  render() {
170
190
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
171
- const { children, hasChecks, hasGuides, variant, className, ...props } = this.props;
191
+ const { children, hasChecks, hasGuides, variant, className, hasSelectableNodes, ...props } = this.props;
172
192
  return (
173
193
  <div
174
194
  className={css(