@patternfly/react-core 5.4.0-prerelease.1 → 5.4.0-prerelease.10

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 (305) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/CONTRIBUTING.md +0 -2
  3. package/components/package.json +1 -1
  4. package/deprecated/package.json +1 -1
  5. package/dist/dynamic/components/AboutModal/package.json +1 -1
  6. package/dist/dynamic/components/Accordion/package.json +1 -1
  7. package/dist/dynamic/components/ActionList/package.json +1 -1
  8. package/dist/dynamic/components/Alert/package.json +1 -1
  9. package/dist/dynamic/components/Avatar/package.json +1 -1
  10. package/dist/dynamic/components/BackToTop/package.json +1 -1
  11. package/dist/dynamic/components/Backdrop/package.json +1 -1
  12. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  13. package/dist/dynamic/components/Badge/package.json +1 -1
  14. package/dist/dynamic/components/Banner/package.json +1 -1
  15. package/dist/dynamic/components/Brand/package.json +1 -1
  16. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  17. package/dist/dynamic/components/Button/package.json +1 -1
  18. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  19. package/dist/dynamic/components/Card/package.json +1 -1
  20. package/dist/dynamic/components/Checkbox/package.json +1 -1
  21. package/dist/dynamic/components/Chip/package.json +1 -1
  22. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  23. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  24. package/dist/dynamic/components/DataList/package.json +1 -1
  25. package/dist/dynamic/components/DatePicker/package.json +1 -1
  26. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  27. package/dist/dynamic/components/Divider/package.json +1 -1
  28. package/dist/dynamic/components/DragDrop/package.json +1 -1
  29. package/dist/dynamic/components/Drawer/package.json +1 -1
  30. package/dist/dynamic/components/Dropdown/package.json +1 -1
  31. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  32. package/dist/dynamic/components/EmptyState/package.json +1 -1
  33. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  34. package/dist/dynamic/components/FileUpload/package.json +1 -1
  35. package/dist/dynamic/components/Form/package.json +1 -1
  36. package/dist/dynamic/components/FormSelect/package.json +1 -1
  37. package/dist/dynamic/components/HelperText/package.json +1 -1
  38. package/dist/dynamic/components/Hint/package.json +1 -1
  39. package/dist/dynamic/components/Icon/package.json +1 -1
  40. package/dist/dynamic/components/InputGroup/package.json +1 -1
  41. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  42. package/dist/dynamic/components/Label/package.json +1 -1
  43. package/dist/dynamic/components/List/package.json +1 -1
  44. package/dist/dynamic/components/LoginPage/package.json +1 -1
  45. package/dist/dynamic/components/Masthead/package.json +1 -1
  46. package/dist/dynamic/components/Menu/package.json +1 -1
  47. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  48. package/dist/dynamic/components/Modal/package.json +1 -1
  49. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  50. package/dist/dynamic/components/Nav/package.json +1 -1
  51. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  52. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  53. package/dist/dynamic/components/NumberInput/package.json +1 -1
  54. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  55. package/dist/dynamic/components/Page/package.json +1 -1
  56. package/dist/dynamic/components/Pagination/package.json +1 -1
  57. package/dist/dynamic/components/Panel/package.json +1 -1
  58. package/dist/dynamic/components/Popover/package.json +1 -1
  59. package/dist/dynamic/components/Progress/package.json +1 -1
  60. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  61. package/dist/dynamic/components/Radio/package.json +1 -1
  62. package/dist/dynamic/components/SearchInput/package.json +1 -1
  63. package/dist/dynamic/components/Select/package.json +1 -1
  64. package/dist/dynamic/components/Sidebar/package.json +1 -1
  65. package/dist/dynamic/components/SimpleList/package.json +1 -1
  66. package/dist/dynamic/components/Skeleton/package.json +1 -1
  67. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  68. package/dist/dynamic/components/Slider/package.json +1 -1
  69. package/dist/dynamic/components/Spinner/package.json +1 -1
  70. package/dist/dynamic/components/Switch/package.json +1 -1
  71. package/dist/dynamic/components/Tabs/package.json +1 -1
  72. package/dist/dynamic/components/Text/package.json +1 -1
  73. package/dist/dynamic/components/TextArea/package.json +1 -1
  74. package/dist/dynamic/components/TextInput/package.json +1 -1
  75. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  76. package/dist/dynamic/components/Tile/package.json +1 -1
  77. package/dist/dynamic/components/TimePicker/package.json +1 -1
  78. package/dist/dynamic/components/Timestamp/package.json +1 -1
  79. package/dist/dynamic/components/Title/package.json +1 -1
  80. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  81. package/dist/dynamic/components/Toolbar/package.json +1 -1
  82. package/dist/dynamic/components/Tooltip/package.json +1 -1
  83. package/dist/dynamic/components/TreeView/package.json +1 -1
  84. package/dist/dynamic/components/Truncate/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  86. package/dist/dynamic/components/Wizard/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  94. package/dist/dynamic/deprecated/components/package.json +1 -1
  95. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  96. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  97. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  98. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  99. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  100. package/dist/dynamic/helpers/constants/package.json +1 -1
  101. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/favorites/package.json +1 -1
  103. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  104. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  105. package/dist/dynamic/helpers/package.json +1 -1
  106. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  107. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  108. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  109. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  110. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  111. package/dist/dynamic/helpers/util/package.json +1 -1
  112. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  113. package/dist/dynamic/layouts/Flex/package.json +1 -1
  114. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  115. package/dist/dynamic/layouts/Grid/package.json +1 -1
  116. package/dist/dynamic/layouts/Level/package.json +1 -1
  117. package/dist/dynamic/layouts/Split/package.json +1 -1
  118. package/dist/dynamic/layouts/Stack/package.json +1 -1
  119. package/dist/dynamic/next/components/DualListSelector/package.json +1 -1
  120. package/dist/dynamic/next/components/Modal/package.json +1 -1
  121. package/dist/dynamic/next/components/package.json +1 -1
  122. package/dist/dynamic/styles/package.json +1 -1
  123. package/dist/dynamic-modules.json +772 -0
  124. package/dist/esm/components/DatePicker/DatePicker.d.ts.map +1 -1
  125. package/dist/esm/components/DatePicker/DatePicker.js +10 -5
  126. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  127. package/dist/esm/components/Drawer/DrawerPanelContent.d.ts +4 -4
  128. package/dist/esm/components/Drawer/DrawerPanelContent.d.ts.map +1 -1
  129. package/dist/esm/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  130. package/dist/esm/components/MenuToggle/MenuToggle.js +1 -1
  131. package/dist/esm/components/MenuToggle/MenuToggle.js.map +1 -1
  132. package/dist/esm/components/NumberInput/NumberInput.d.ts.map +1 -1
  133. package/dist/esm/components/NumberInput/NumberInput.js +4 -3
  134. package/dist/esm/components/NumberInput/NumberInput.js.map +1 -1
  135. package/dist/esm/components/Page/Page.d.ts +6 -0
  136. package/dist/esm/components/Page/Page.d.ts.map +1 -1
  137. package/dist/esm/components/Page/Page.js +3 -3
  138. package/dist/esm/components/Page/Page.js.map +1 -1
  139. package/dist/esm/components/Pagination/Navigation.d.ts +3 -3
  140. package/dist/esm/components/Pagination/Navigation.d.ts.map +1 -1
  141. package/dist/esm/components/Pagination/Navigation.js.map +1 -1
  142. package/dist/esm/components/Pagination/Pagination.d.ts +1 -1
  143. package/dist/esm/components/Pagination/Pagination.d.ts.map +1 -1
  144. package/dist/esm/components/Pagination/Pagination.js +2 -1
  145. package/dist/esm/components/Pagination/Pagination.js.map +1 -1
  146. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts +1 -0
  147. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  148. package/dist/esm/components/Pagination/PaginationOptionsMenu.js +2 -4
  149. package/dist/esm/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  150. package/dist/esm/components/Select/Select.d.ts +2 -0
  151. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  152. package/dist/esm/components/Select/Select.js +3 -3
  153. package/dist/esm/components/Select/Select.js.map +1 -1
  154. package/dist/esm/components/Tabs/Tabs.d.ts +4 -0
  155. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  156. package/dist/esm/components/Tabs/Tabs.js +17 -0
  157. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  158. package/dist/esm/components/TreeView/TreeView.d.ts +13 -0
  159. package/dist/esm/components/TreeView/TreeView.d.ts.map +1 -1
  160. package/dist/esm/components/TreeView/TreeView.js +2 -2
  161. package/dist/esm/components/TreeView/TreeView.js.map +1 -1
  162. package/dist/esm/components/TreeView/TreeViewList.d.ts +13 -0
  163. package/dist/esm/components/TreeView/TreeViewList.d.ts.map +1 -1
  164. package/dist/esm/components/TreeView/TreeViewList.js +2 -2
  165. package/dist/esm/components/TreeView/TreeViewList.js.map +1 -1
  166. package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  167. package/dist/esm/components/TreeView/TreeViewListItem.js +8 -8
  168. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  169. package/dist/esm/components/Truncate/Truncate.d.ts.map +1 -1
  170. package/dist/esm/components/Truncate/Truncate.js +54 -12
  171. package/dist/esm/components/Truncate/Truncate.js.map +1 -1
  172. package/dist/esm/components/Wizard/Wizard.d.ts +5 -1
  173. package/dist/esm/components/Wizard/Wizard.d.ts.map +1 -1
  174. package/dist/esm/components/Wizard/Wizard.js +9 -2
  175. package/dist/esm/components/Wizard/Wizard.js.map +1 -1
  176. package/dist/esm/components/Wizard/WizardBody.js +8 -9
  177. package/dist/esm/components/Wizard/WizardBody.js.map +1 -1
  178. package/dist/esm/components/Wizard/WizardContext.d.ts +8 -0
  179. package/dist/esm/components/Wizard/WizardContext.d.ts.map +1 -1
  180. package/dist/esm/components/Wizard/WizardContext.js +4 -2
  181. package/dist/esm/components/Wizard/WizardContext.js.map +1 -1
  182. package/dist/esm/components/Wizard/WizardNavItem.d.ts.map +1 -1
  183. package/dist/esm/components/Wizard/WizardNavItem.js +10 -17
  184. package/dist/esm/components/Wizard/WizardNavItem.js.map +1 -1
  185. package/dist/js/components/DatePicker/DatePicker.d.ts.map +1 -1
  186. package/dist/js/components/DatePicker/DatePicker.js +10 -5
  187. package/dist/js/components/DatePicker/DatePicker.js.map +1 -1
  188. package/dist/js/components/Drawer/DrawerPanelContent.d.ts +4 -4
  189. package/dist/js/components/Drawer/DrawerPanelContent.d.ts.map +1 -1
  190. package/dist/js/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  191. package/dist/js/components/MenuToggle/MenuToggle.js +1 -1
  192. package/dist/js/components/MenuToggle/MenuToggle.js.map +1 -1
  193. package/dist/js/components/NumberInput/NumberInput.d.ts.map +1 -1
  194. package/dist/js/components/NumberInput/NumberInput.js +4 -3
  195. package/dist/js/components/NumberInput/NumberInput.js.map +1 -1
  196. package/dist/js/components/Page/Page.d.ts +6 -0
  197. package/dist/js/components/Page/Page.d.ts.map +1 -1
  198. package/dist/js/components/Page/Page.js +3 -3
  199. package/dist/js/components/Page/Page.js.map +1 -1
  200. package/dist/js/components/Pagination/Navigation.d.ts +3 -3
  201. package/dist/js/components/Pagination/Navigation.d.ts.map +1 -1
  202. package/dist/js/components/Pagination/Navigation.js.map +1 -1
  203. package/dist/js/components/Pagination/Pagination.d.ts +1 -1
  204. package/dist/js/components/Pagination/Pagination.d.ts.map +1 -1
  205. package/dist/js/components/Pagination/Pagination.js +2 -1
  206. package/dist/js/components/Pagination/Pagination.js.map +1 -1
  207. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts +1 -0
  208. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  209. package/dist/js/components/Pagination/PaginationOptionsMenu.js +2 -4
  210. package/dist/js/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  211. package/dist/js/components/Select/Select.d.ts +2 -0
  212. package/dist/js/components/Select/Select.d.ts.map +1 -1
  213. package/dist/js/components/Select/Select.js +3 -3
  214. package/dist/js/components/Select/Select.js.map +1 -1
  215. package/dist/js/components/Tabs/Tabs.d.ts +4 -0
  216. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  217. package/dist/js/components/Tabs/Tabs.js +17 -0
  218. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  219. package/dist/js/components/TreeView/TreeView.d.ts +13 -0
  220. package/dist/js/components/TreeView/TreeView.d.ts.map +1 -1
  221. package/dist/js/components/TreeView/TreeView.js +2 -2
  222. package/dist/js/components/TreeView/TreeView.js.map +1 -1
  223. package/dist/js/components/TreeView/TreeViewList.d.ts +13 -0
  224. package/dist/js/components/TreeView/TreeViewList.d.ts.map +1 -1
  225. package/dist/js/components/TreeView/TreeViewList.js +2 -2
  226. package/dist/js/components/TreeView/TreeViewList.js.map +1 -1
  227. package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  228. package/dist/js/components/TreeView/TreeViewListItem.js +8 -8
  229. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  230. package/dist/js/components/Truncate/Truncate.d.ts.map +1 -1
  231. package/dist/js/components/Truncate/Truncate.js +54 -12
  232. package/dist/js/components/Truncate/Truncate.js.map +1 -1
  233. package/dist/js/components/Wizard/Wizard.d.ts +5 -1
  234. package/dist/js/components/Wizard/Wizard.d.ts.map +1 -1
  235. package/dist/js/components/Wizard/Wizard.js +9 -2
  236. package/dist/js/components/Wizard/Wizard.js.map +1 -1
  237. package/dist/js/components/Wizard/WizardBody.js +8 -9
  238. package/dist/js/components/Wizard/WizardBody.js.map +1 -1
  239. package/dist/js/components/Wizard/WizardContext.d.ts +8 -0
  240. package/dist/js/components/Wizard/WizardContext.d.ts.map +1 -1
  241. package/dist/js/components/Wizard/WizardContext.js +4 -2
  242. package/dist/js/components/Wizard/WizardContext.js.map +1 -1
  243. package/dist/js/components/Wizard/WizardNavItem.d.ts.map +1 -1
  244. package/dist/js/components/Wizard/WizardNavItem.js +10 -17
  245. package/dist/js/components/Wizard/WizardNavItem.js.map +1 -1
  246. package/dist/umd/react-core.min.js +9 -9
  247. package/helpers/package.json +1 -1
  248. package/layouts/package.json +1 -1
  249. package/next/package.json +1 -1
  250. package/package.json +7 -8
  251. package/src/components/Checkbox/examples/Checkbox.md +14 -0
  252. package/src/components/Checkbox/examples/CheckboxLabelWraps.tsx +11 -0
  253. package/src/components/Checkbox/examples/CheckboxReversed.tsx +6 -0
  254. package/src/components/CodeBlock/examples/CodeBlock.md +6 -0
  255. package/src/components/CodeBlock/examples/CodeBlockBasic.tsx +1 -1
  256. package/src/components/CodeBlock/examples/CodeBlockExpandable.tsx +3 -3
  257. package/src/components/DatePicker/DatePicker.tsx +11 -5
  258. package/src/components/Drawer/DrawerPanelContent.tsx +4 -4
  259. package/src/components/MenuToggle/MenuToggle.tsx +1 -0
  260. package/src/components/NumberInput/NumberInput.tsx +5 -3
  261. package/src/components/Page/Page.tsx +14 -1
  262. package/src/components/Pagination/Navigation.tsx +12 -12
  263. package/src/components/Pagination/Pagination.tsx +3 -1
  264. package/src/components/Pagination/PaginationOptionsMenu.tsx +13 -14
  265. package/src/components/Pagination/__tests__/Generated/__snapshots__/PaginationOptionsMenu.test.tsx.snap +36 -38
  266. package/src/components/Pagination/__tests__/__snapshots__/Pagination.test.tsx.snap +714 -754
  267. package/src/components/Radio/examples/Radio.md +11 -0
  268. package/src/components/Select/Select.tsx +5 -2
  269. package/src/components/Select/examples/SelectMultiTypeahead.tsx +111 -66
  270. package/src/components/Select/examples/SelectMultiTypeaheadCheckbox.tsx +103 -60
  271. package/src/components/Select/examples/SelectMultiTypeaheadCreatable.tsx +125 -79
  272. package/src/components/Select/examples/SelectTypeahead.tsx +113 -69
  273. package/src/components/Select/examples/SelectTypeaheadCreatable.tsx +115 -75
  274. package/src/components/Tabs/Tabs.tsx +21 -0
  275. package/src/components/ToggleGroup/examples/ToggleGroup.md +33 -8
  276. package/src/components/TreeView/TreeView.tsx +23 -1
  277. package/src/components/TreeView/TreeViewList.tsx +24 -1
  278. package/src/components/TreeView/TreeViewListItem.tsx +13 -7
  279. package/src/components/TreeView/__tests__/__snapshots__/TreeViewList.test.tsx.snap +2 -0
  280. package/src/components/TreeView/__tests__/__snapshots__/TreeViewListItem.test.tsx.snap +2 -0
  281. package/src/components/TreeView/examples/TreeView.md +12 -2
  282. package/src/components/TreeView/examples/TreeViewCompact.tsx +1 -1
  283. package/src/components/TreeView/examples/TreeViewCompactNoBackground.tsx +1 -1
  284. package/src/components/TreeView/examples/TreeViewGuides.tsx +1 -1
  285. package/src/components/TreeView/examples/TreeViewMultiselectable.tsx +86 -0
  286. package/src/components/TreeView/examples/TreeViewSelectionExpansion.tsx +9 -1
  287. package/src/components/TreeView/examples/{TreeViewDefault.tsx → TreeViewSingleSelectable.tsx} +8 -2
  288. package/src/components/TreeView/examples/TreeViewWithActionItems.tsx +8 -1
  289. package/src/components/TreeView/examples/TreeViewWithBadges.tsx +9 -1
  290. package/src/components/TreeView/examples/TreeViewWithCheckboxes.tsx +1 -1
  291. package/src/components/TreeView/examples/TreeViewWithCustomBadges.tsx +9 -1
  292. package/src/components/TreeView/examples/TreeViewWithIcons.tsx +1 -0
  293. package/src/components/TreeView/examples/TreeViewWithMemoization.tsx +8 -1
  294. package/src/components/TreeView/examples/TreeViewWithSearch.tsx +1 -0
  295. package/src/components/Truncate/Truncate.tsx +73 -7
  296. package/src/components/Truncate/__tests__/Truncate.test.tsx +6 -0
  297. package/src/components/Wizard/Wizard.tsx +15 -0
  298. package/src/components/Wizard/WizardBody.tsx +9 -9
  299. package/src/components/Wizard/WizardContext.tsx +14 -2
  300. package/src/components/Wizard/WizardNavItem.tsx +7 -21
  301. package/src/components/Wizard/__tests__/Wizard.test.tsx +4 -4
  302. package/src/components/Wizard/examples/Wizard.md +29 -1
  303. package/src/components/Wizard/examples/WizardFocusOnNextBack.tsx +16 -0
  304. package/src/components/Wizard/examples/WizardWithCustomFooter.tsx +3 -3
  305. package/src/deprecated/components/ApplicationLauncher/examples/ApplicationLauncher.md +1 -0
@@ -0,0 +1,86 @@
1
+ import React from 'react';
2
+ import { TreeView, TreeViewDataItem } from '@patternfly/react-core';
3
+
4
+ export const TreeViewMultiselectable: React.FunctionComponent = () => {
5
+ const [activeItems, setActiveItems] = React.useState<TreeViewDataItem[]>([]);
6
+
7
+ const onSelect = (_event: React.MouseEvent, treeViewItem: TreeViewDataItem) => {
8
+ // Ignore folders for selection
9
+ if (treeViewItem && !treeViewItem.children) {
10
+ setActiveItems((prevActiveItems) => [...prevActiveItems, treeViewItem]);
11
+ }
12
+ };
13
+
14
+ const options = [
15
+ {
16
+ name: 'Application launcher',
17
+ id: 'multiselectExample-AppLaunch',
18
+ children: [
19
+ {
20
+ name: 'Application 1',
21
+ id: 'multiselectExample-App1',
22
+ children: [
23
+ { name: 'Settings', id: 'multiselectExample-App1Settings' },
24
+ { name: 'Current', id: 'multiselectExample-App1Current' }
25
+ ]
26
+ },
27
+ {
28
+ name: 'Application 2',
29
+ id: 'multiselectExample-App2',
30
+ children: [
31
+ { name: 'Settings', id: 'multiselectExample-App2Settings' },
32
+ {
33
+ name: 'Loader',
34
+ id: 'multiselectExample-App2Loader',
35
+ children: [
36
+ { name: 'Loading App 1', id: 'multiselectExample-LoadApp1' },
37
+ { name: 'Loading App 2', id: 'multiselectExample-LoadApp2' },
38
+ { name: 'Loading App 3', id: 'multiselectExample-LoadApp3' }
39
+ ]
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ defaultExpanded: true
45
+ },
46
+ {
47
+ name: 'Cost management',
48
+ id: 'multiselectExample-Cost',
49
+ children: [
50
+ {
51
+ name: 'Application 3',
52
+ id: 'multiselectExample-App3',
53
+ children: [
54
+ { name: 'Settings', id: 'multiselectExample-App3Settings' },
55
+ { name: 'Current', id: 'multiselectExample-App3Current' }
56
+ ]
57
+ }
58
+ ]
59
+ },
60
+ {
61
+ name: 'Sources',
62
+ id: 'multiselectExample-Sources',
63
+ children: [
64
+ {
65
+ name: 'Application 4',
66
+ id: 'multiselectExample-App4',
67
+ children: [{ name: 'Settings', id: 'multiselectExample-App4Settings' }]
68
+ }
69
+ ]
70
+ },
71
+ {
72
+ name: 'Really really really long folder name that overflows the container it is in',
73
+ id: 'multiselectExample-Long',
74
+ children: [{ name: 'Application 5', id: 'multiselectExample-App5' }]
75
+ }
76
+ ];
77
+ return (
78
+ <TreeView
79
+ aria-label="Tree View multiselectable example"
80
+ isMultiSelectable
81
+ data={options}
82
+ activeItems={activeItems}
83
+ onSelect={onSelect}
84
+ />
85
+ );
86
+ };
@@ -71,5 +71,13 @@ export const TreeViewSelectableNodes: React.FunctionComponent = () => {
71
71
  children: [{ name: 'Application 5', id: 'SelNodesTreeView-App5' }]
72
72
  }
73
73
  ];
74
- return <TreeView hasSelectableNodes data={options} activeItems={activeItems} onSelect={onSelect} />;
74
+ return (
75
+ <TreeView
76
+ aria-label="Tree View separate selection and expansion example"
77
+ hasSelectableNodes
78
+ data={options}
79
+ activeItems={activeItems}
80
+ onSelect={onSelect}
81
+ />
82
+ );
75
83
  };
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { TreeView, Button, TreeViewDataItem } from '@patternfly/react-core';
3
3
 
4
- export const TreeViewDefault: React.FunctionComponent = () => {
4
+ export const TreeViewSingleSelectable: React.FunctionComponent = () => {
5
5
  const [activeItems, setActiveItems] = React.useState<TreeViewDataItem[]>();
6
6
  const [allExpanded, setAllExpanded] = React.useState<boolean>();
7
7
 
@@ -81,7 +81,13 @@ export const TreeViewDefault: React.FunctionComponent = () => {
81
81
  {allExpanded && 'Collapse all'}
82
82
  {!allExpanded && 'Expand all'}
83
83
  </Button>
84
- <TreeView data={options} activeItems={activeItems} onSelect={onSelect} allExpanded={allExpanded} />
84
+ <TreeView
85
+ aria-label="Tree View single selectable example"
86
+ data={options}
87
+ activeItems={activeItems}
88
+ onSelect={onSelect}
89
+ allExpanded={allExpanded}
90
+ />
85
91
  </React.Fragment>
86
92
  );
87
93
  };
@@ -136,5 +136,12 @@ export const TreeViewWithActionItems: React.FunctionComponent = () => {
136
136
  children: [{ name: 'Application 5', id: 'example7-App5' }]
137
137
  }
138
138
  ];
139
- return <TreeView data={options} activeItems={activeItems} onSelect={onSelect} />;
139
+ return (
140
+ <TreeView
141
+ aria-label="Tree View with actions example"
142
+ data={options}
143
+ activeItems={activeItems}
144
+ onSelect={onSelect}
145
+ />
146
+ );
140
147
  };
@@ -75,5 +75,13 @@ export const TreeViewBadges: React.FunctionComponent = () => {
75
75
  }
76
76
  ];
77
77
 
78
- return <TreeView data={options} activeItems={activeItems} onSelect={onSelect} hasBadges />;
78
+ return (
79
+ <TreeView
80
+ aria-label="Tree View with badges example"
81
+ data={options}
82
+ activeItems={activeItems}
83
+ onSelect={onSelect}
84
+ hasBadges
85
+ />
86
+ );
79
87
  };
@@ -194,5 +194,5 @@ export const TreeViewWithCheckboxes: React.FunctionComponent = () => {
194
194
  }
195
195
  };
196
196
  const mapped = options.map((item) => mapTree(item));
197
- return <TreeView data={mapped} onCheck={onCheck} hasCheckboxes />;
197
+ return <TreeView aria-label="Tree View with checkboxes example" data={mapped} onCheck={onCheck} hasCheckboxes />;
198
198
  };
@@ -82,5 +82,13 @@ export const TreeViewCustomBadges: React.FunctionComponent = () => {
82
82
  children: [{ name: 'Application 5', id: 'example6-App5' }]
83
83
  }
84
84
  ];
85
- return <TreeView data={options} activeItems={activeItems} onSelect={onSelect} hasBadges />;
85
+ return (
86
+ <TreeView
87
+ aria-label="Tree View with custom badges example"
88
+ data={options}
89
+ activeItems={activeItems}
90
+ onSelect={onSelect}
91
+ hasBadges
92
+ />
93
+ );
86
94
  };
@@ -73,6 +73,7 @@ export const TreeViewWithIcons: React.FunctionComponent = () => {
73
73
  ];
74
74
  return (
75
75
  <TreeView
76
+ aria-label="Tree View with icons example"
76
77
  data={options}
77
78
  activeItems={activeItems}
78
79
  onSelect={onSelect}
@@ -50,7 +50,14 @@ export const TreeViewWithMemoization: React.FunctionComponent = () => {
50
50
  options.push({ name: 'Option ' + i, id: i.toString(), children: childOptions });
51
51
  }
52
52
  const tree = (
53
- <TreeView data={options} activeItems={activeItems} onSelect={onSelect} allExpanded={allExpanded} useMemo />
53
+ <TreeView
54
+ aria-label="Tree View with memoization example"
55
+ data={options}
56
+ activeItems={activeItems}
57
+ onSelect={onSelect}
58
+ allExpanded={allExpanded}
59
+ useMemo
60
+ />
54
61
  );
55
62
 
56
63
  return (
@@ -118,6 +118,7 @@ export const TreeViewWithSearch: React.FunctionComponent = () => {
118
118
 
119
119
  return (
120
120
  <TreeView
121
+ aria-label="Tree View with search example"
121
122
  data={filteredItems}
122
123
  activeItems={activeItems}
123
124
  onSelect={onSelect}
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import styles from '@patternfly/react-styles/css/components/Truncate/truncate';
3
3
  import { css } from '@patternfly/react-styles';
4
4
  import { Tooltip, TooltipPosition } from '../Tooltip';
5
+ import { getResizeObserver } from '../../helpers/resizeObserver';
5
6
 
6
7
  export enum TruncatePosition {
7
8
  start = 'start',
@@ -52,11 +53,65 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
52
53
  trailingNumChars = 7,
53
54
  content,
54
55
  ...props
55
- }: TruncateProps) => (
56
- <Tooltip position={tooltipPosition} content={content}>
57
- <span className={css(styles.truncate, className)} {...props}>
56
+ }: TruncateProps) => {
57
+ const [isTruncated, setIsTruncated] = React.useState(true);
58
+ const [parentElement, setParentElement] = React.useState<HTMLElement>(null);
59
+ const [textElement, setTextElement] = React.useState<HTMLElement>(null);
60
+
61
+ const textRef = React.useRef<HTMLElement>(null);
62
+ const subParentRef = React.useRef<HTMLDivElement>(null);
63
+ const observer = React.useRef(null);
64
+
65
+ const getActualWidth = (element: Element) => {
66
+ const computedStyle = getComputedStyle(element);
67
+
68
+ return (
69
+ parseFloat(computedStyle.width) -
70
+ parseFloat(computedStyle.paddingLeft) -
71
+ parseFloat(computedStyle.paddingRight) -
72
+ parseFloat(computedStyle.borderRight) -
73
+ parseFloat(computedStyle.borderLeft)
74
+ );
75
+ };
76
+
77
+ const calculateTotalTextWidth = (element: Element, trailingNumChars: number, content: string) => {
78
+ const firstTextWidth = element.scrollWidth;
79
+ const firstTextLength = content.length;
80
+ return (firstTextWidth / firstTextLength) * trailingNumChars + firstTextWidth;
81
+ };
82
+
83
+ React.useEffect(() => {
84
+ if (textRef && textRef.current && !textElement) {
85
+ setTextElement(textRef.current);
86
+ }
87
+
88
+ if (subParentRef && subParentRef.current.parentElement.parentElement && !parentElement) {
89
+ setParentElement(subParentRef.current.parentElement.parentElement);
90
+ }
91
+ }, [textRef, subParentRef]);
92
+
93
+ React.useEffect(() => {
94
+ if (textElement && parentElement && !observer.current) {
95
+ const totalTextWidth = calculateTotalTextWidth(textElement, trailingNumChars, content);
96
+ const textWidth = position === 'middle' ? totalTextWidth : textElement.scrollWidth;
97
+
98
+ const handleResize = () => {
99
+ const parentWidth = getActualWidth(parentElement);
100
+ setIsTruncated(textWidth >= parentWidth);
101
+ };
102
+
103
+ const observer = getResizeObserver(parentElement, handleResize);
104
+
105
+ return () => {
106
+ observer();
107
+ };
108
+ }
109
+ }, [textElement, parentElement]);
110
+
111
+ const truncateBody = (
112
+ <span ref={subParentRef} className={css(styles.truncate, className)} {...props}>
58
113
  {(position === TruncatePosition.end || position === TruncatePosition.start) && (
59
- <span className={truncateStyles[position]}>
114
+ <span ref={textRef} className={truncateStyles[position]}>
60
115
  {content}
61
116
  {position === TruncatePosition.start && <React.Fragment>&lrm;</React.Fragment>}
62
117
  </span>
@@ -64,7 +119,9 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
64
119
  {position === TruncatePosition.middle &&
65
120
  content.slice(0, content.length - trailingNumChars).length > minWidthCharacters && (
66
121
  <React.Fragment>
67
- <span className={styles.truncateStart}>{sliceContent(content, trailingNumChars)[0]}</span>
122
+ <span ref={textRef} className={styles.truncateStart}>
123
+ {sliceContent(content, trailingNumChars)[0]}
124
+ </span>
68
125
  <span className={styles.truncateEnd}>{sliceContent(content, trailingNumChars)[1]}</span>
69
126
  </React.Fragment>
70
127
  )}
@@ -72,6 +129,15 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
72
129
  content.slice(0, content.length - trailingNumChars).length <= minWidthCharacters &&
73
130
  content}
74
131
  </span>
75
- </Tooltip>
76
- );
132
+ );
133
+
134
+ return isTruncated ? (
135
+ <Tooltip hidden={!isTruncated} position={tooltipPosition} content={content}>
136
+ {truncateBody}
137
+ </Tooltip>
138
+ ) : (
139
+ truncateBody
140
+ );
141
+ };
142
+
77
143
  Truncate.displayName = 'Truncate';
@@ -13,6 +13,12 @@ jest.mock('../../Tooltip', () => ({
13
13
  )
14
14
  }));
15
15
 
16
+ global.ResizeObserver = jest.fn().mockImplementation(() => ({
17
+ observe: jest.fn(),
18
+ unobserve: jest.fn(),
19
+ disconnect: jest.fn()
20
+ }));
21
+
16
22
  test(`renders with class ${styles.truncate}`, () => {
17
23
  render(<Truncate content={''} aria-label="test-id" />);
18
24
 
@@ -55,6 +55,10 @@ export interface WizardProps extends React.HTMLProps<HTMLDivElement> {
55
55
  onSave?: (event: React.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
56
56
  /** Callback function to close the wizard */
57
57
  onClose?: (event: React.MouseEvent<HTMLButtonElement>) => void;
58
+ /** @beta Flag indicating whether the wizard content should be focused after the onNext or onBack callbacks
59
+ * are called.
60
+ */
61
+ shouldFocusContent?: boolean;
58
62
  }
59
63
 
60
64
  export const Wizard = ({
@@ -72,11 +76,13 @@ export const Wizard = ({
72
76
  onStepChange,
73
77
  onSave,
74
78
  onClose,
79
+ shouldFocusContent = false,
75
80
  ...wrapperProps
76
81
  }: WizardProps) => {
77
82
  const [activeStepIndex, setActiveStepIndex] = React.useState(startIndex);
78
83
  const initialSteps = buildSteps(children);
79
84
  const firstStepRef = React.useRef(initialSteps[startIndex - 1]);
85
+ const wrapperRef = React.useRef(null);
80
86
 
81
87
  // When the startIndex maps to a parent step, focus on the first sub-step
82
88
  React.useEffect(() => {
@@ -85,6 +91,11 @@ export const Wizard = ({
85
91
  }
86
92
  }, [startIndex]);
87
93
 
94
+ const focusMainContentElement = () =>
95
+ setTimeout(() => {
96
+ wrapperRef?.current?.focus && wrapperRef.current.focus();
97
+ }, 0);
98
+
88
99
  const goToNextStep = (event: React.MouseEvent<HTMLButtonElement>, steps: WizardStepType[] = initialSteps) => {
89
100
  const newStep = steps.find((step) => step.index > activeStepIndex && isStepEnabled(steps, step));
90
101
 
@@ -94,6 +105,7 @@ export const Wizard = ({
94
105
 
95
106
  setActiveStepIndex(newStep?.index);
96
107
  onStepChange?.(event, newStep, steps[activeStepIndex - 1], WizardStepChangeScope.Next);
108
+ shouldFocusContent && focusMainContentElement();
97
109
  };
98
110
 
99
111
  const goToPrevStep = (event: React.MouseEvent<HTMLButtonElement>, steps: WizardStepType[] = initialSteps) => {
@@ -103,6 +115,7 @@ export const Wizard = ({
103
115
 
104
116
  setActiveStepIndex(newStep?.index);
105
117
  onStepChange?.(event, newStep, steps[activeStepIndex - 1], WizardStepChangeScope.Back);
118
+ shouldFocusContent && focusMainContentElement();
106
119
  };
107
120
 
108
121
  const goToStepByIndex = (
@@ -157,6 +170,8 @@ export const Wizard = ({
157
170
  goToStepById={goToStepById}
158
171
  goToStepByName={goToStepByName}
159
172
  goToStepByIndex={goToStepByIndex}
173
+ shouldFocusContent={shouldFocusContent}
174
+ mainWrapperRef={wrapperRef}
160
175
  >
161
176
  <div
162
177
  className={css(styles.wizard, className)}
@@ -36,15 +36,14 @@ export const WizardBody = ({
36
36
  }: WizardBodyProps) => {
37
37
  const [hasScrollbar, setHasScrollbar] = React.useState(false);
38
38
  const [previousWidth, setPreviousWidth] = React.useState<number | undefined>(undefined);
39
- const wrapperRef = React.useRef(null);
40
39
  const WrapperComponent = component;
41
- const { activeStep } = React.useContext(WizardContext);
40
+ const { activeStep, shouldFocusContent, mainWrapperRef } = React.useContext(WizardContext);
42
41
  const defaultAriaLabel = ariaLabel || `${activeStep?.name} content`;
43
42
 
44
43
  React.useEffect(() => {
45
44
  const resize = () => {
46
- if (wrapperRef?.current) {
47
- const { offsetWidth, offsetHeight, scrollHeight } = wrapperRef.current;
45
+ if (mainWrapperRef?.current) {
46
+ const { offsetWidth, offsetHeight, scrollHeight } = mainWrapperRef.current;
48
47
 
49
48
  if (previousWidth !== offsetWidth) {
50
49
  setPreviousWidth(offsetWidth);
@@ -56,12 +55,12 @@ export const WizardBody = ({
56
55
  const handleResizeWithDelay = debounce(resize, 250);
57
56
  let observer = () => {};
58
57
 
59
- if (wrapperRef?.current) {
60
- observer = getResizeObserver(wrapperRef.current, handleResizeWithDelay);
61
- const { offsetHeight, scrollHeight } = wrapperRef.current;
58
+ if (mainWrapperRef?.current) {
59
+ observer = getResizeObserver(mainWrapperRef.current, handleResizeWithDelay);
60
+ const { offsetHeight, scrollHeight } = mainWrapperRef.current;
62
61
 
63
62
  setHasScrollbar(offsetHeight < scrollHeight);
64
- setPreviousWidth((wrapperRef.current as HTMLElement).offsetWidth);
63
+ setPreviousWidth((mainWrapperRef.current as HTMLElement).offsetWidth);
65
64
  }
66
65
 
67
66
  return () => {
@@ -71,7 +70,8 @@ export const WizardBody = ({
71
70
 
72
71
  return (
73
72
  <WrapperComponent
74
- ref={wrapperRef}
73
+ ref={mainWrapperRef}
74
+ {...(shouldFocusContent && { tabIndex: -1 })}
75
75
  {...(component === 'div' && hasScrollbar && { role: 'region' })}
76
76
  {...(hasScrollbar && { 'aria-label': defaultAriaLabel, 'aria-labelledby': ariaLabelledBy, tabIndex: 0 })}
77
77
  className={css(styles.wizardMain)}
@@ -28,6 +28,12 @@ export interface WizardContextProps {
28
28
  getStep: (stepId: number | string) => WizardStepType;
29
29
  /** Set step by ID */
30
30
  setStep: (step: Pick<WizardStepType, 'id'> & Partial<WizardStepType>) => void;
31
+ /** Flag indicating whether the wizard content should be focused after the onNext or onBack callbacks
32
+ * are called.
33
+ */
34
+ shouldFocusContent: boolean;
35
+ /** Ref for main wizard content element. */
36
+ mainWrapperRef: React.RefObject<HTMLElement>;
31
37
  }
32
38
 
33
39
  export const WizardContext = React.createContext({} as WizardContextProps);
@@ -47,6 +53,8 @@ export interface WizardContextProviderProps {
47
53
  steps: WizardStepType[],
48
54
  index: number
49
55
  ): void;
56
+ shouldFocusContent: boolean;
57
+ mainWrapperRef: React.RefObject<HTMLElement>;
50
58
  }
51
59
 
52
60
  export const WizardContextProvider: React.FunctionComponent<WizardContextProviderProps> = ({
@@ -59,7 +67,9 @@ export const WizardContextProvider: React.FunctionComponent<WizardContextProvide
59
67
  onClose,
60
68
  goToStepById,
61
69
  goToStepByName,
62
- goToStepByIndex
70
+ goToStepByIndex,
71
+ shouldFocusContent,
72
+ mainWrapperRef
63
73
  }) => {
64
74
  const [currentSteps, setCurrentSteps] = React.useState<WizardStepType[]>(initialSteps);
65
75
  const [currentFooter, setCurrentFooter] = React.useState<WizardFooterType>();
@@ -139,7 +149,9 @@ export const WizardContextProvider: React.FunctionComponent<WizardContextProvide
139
149
  goToStepByIndex: React.useCallback(
140
150
  (index: number) => goToStepByIndex(null, steps, index),
141
151
  [goToStepByIndex, steps]
142
- )
152
+ ),
153
+ shouldFocusContent,
154
+ mainWrapperRef
143
155
  }}
144
156
  >
145
157
  {children}
@@ -44,6 +44,7 @@ export const WizardNavItem = ({
44
44
  content = '',
45
45
  isCurrent = false,
46
46
  isDisabled = false,
47
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
47
48
  isVisited = false,
48
49
  stepIndex,
49
50
  onClick,
@@ -68,23 +69,6 @@ export const WizardNavItem = ({
68
69
  console.error('WizardNavItem: When using an anchor, please provide an href');
69
70
  }
70
71
 
71
- const ariaLabel = React.useMemo(() => {
72
- if (status === WizardNavItemStatus.Error || (isVisited && !isCurrent)) {
73
- let label = content.toString();
74
-
75
- if (status === WizardNavItemStatus.Error) {
76
- label += `, ${status}`;
77
- }
78
-
79
- // No need to signify step is visited if current
80
- if (isVisited && !isCurrent) {
81
- label += ', visited';
82
- }
83
-
84
- return label;
85
- }
86
- }, [content, isCurrent, isVisited, status]);
87
-
88
72
  return (
89
73
  <li
90
74
  className={css(
@@ -110,7 +94,6 @@ export const WizardNavItem = ({
110
94
  aria-disabled={isDisabled ? true : null}
111
95
  aria-current={isCurrent && !children ? 'step' : false}
112
96
  {...(isExpandable && { 'aria-expanded': isExpanded })}
113
- {...(ariaLabel && { 'aria-label': ariaLabel })}
114
97
  {...ouiaProps}
115
98
  >
116
99
  {isExpandable ? (
@@ -127,9 +110,12 @@ export const WizardNavItem = ({
127
110
  {content}
128
111
  {/* TODO, patternfly/patternfly#5142 */}
129
112
  {status === WizardNavItemStatus.Error && (
130
- <span style={{ marginLeft: globalSpacerSm.var }}>
131
- <ExclamationCircleIcon color={globalDangerColor100.var} />
132
- </span>
113
+ <>
114
+ <span className="pf-v5-screen-reader">, {status}</span>
115
+ <span style={{ marginLeft: globalSpacerSm.var }}>
116
+ <ExclamationCircleIcon color={globalDangerColor100.var} />
117
+ </span>
118
+ </>
133
119
  )}
134
120
  </>
135
121
  )}
@@ -411,7 +411,7 @@ test('incrementally shows/hides steps based on the activeStep when isProgressive
411
411
  await user.click(nextButton);
412
412
  expect(
413
413
  screen.getByRole('button', {
414
- name: 'Test step 1, visited'
414
+ name: 'Test step 1'
415
415
  })
416
416
  ).toBeVisible();
417
417
  expect(
@@ -429,12 +429,12 @@ test('incrementally shows/hides steps based on the activeStep when isProgressive
429
429
  await user.click(nextButton);
430
430
  expect(
431
431
  screen.getByRole('button', {
432
- name: 'Test step 1, visited'
432
+ name: 'Test step 1'
433
433
  })
434
434
  ).toBeVisible();
435
435
  expect(
436
436
  screen.getByRole('button', {
437
- name: 'Test step 2, visited'
437
+ name: 'Test step 2'
438
438
  })
439
439
  ).toBeVisible();
440
440
  expect(
@@ -447,7 +447,7 @@ test('incrementally shows/hides steps based on the activeStep when isProgressive
447
447
  await user.click(backButton);
448
448
  expect(
449
449
  screen.getByRole('button', {
450
- name: 'Test step 1, visited'
450
+ name: 'Test step 1'
451
451
  })
452
452
  ).toBeVisible();
453
453
  expect(