@patternfly/react-core 5.3.0-prerelease.2 → 5.3.0-prerelease.20

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 (479) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/DualListSelector/package.json +1 -0
  119. package/dist/dynamic/next/components/Modal/package.json +1 -1
  120. package/dist/dynamic/next/components/package.json +1 -1
  121. package/dist/dynamic/styles/package.json +1 -1
  122. package/dist/esm/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  123. package/dist/esm/components/CalendarMonth/CalendarMonth.js +30 -12
  124. package/dist/esm/components/CalendarMonth/CalendarMonth.js.map +1 -1
  125. package/dist/esm/components/Card/Card.d.ts +13 -5
  126. package/dist/esm/components/Card/Card.d.ts.map +1 -1
  127. package/dist/esm/components/Card/Card.js +7 -3
  128. package/dist/esm/components/Card/Card.js.map +1 -1
  129. package/dist/esm/components/Card/CardHeader.d.ts +3 -1
  130. package/dist/esm/components/Card/CardHeader.d.ts.map +1 -1
  131. package/dist/esm/components/Card/CardHeader.js +10 -10
  132. package/dist/esm/components/Card/CardHeader.js.map +1 -1
  133. package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts +6 -6
  134. package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
  135. package/dist/esm/components/ClipboardCopy/ClipboardCopy.js +10 -2
  136. package/dist/esm/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
  137. package/dist/esm/components/ClipboardCopy/ClipboardCopyExpanded.d.ts +1 -0
  138. package/dist/esm/components/ClipboardCopy/ClipboardCopyExpanded.d.ts.map +1 -1
  139. package/dist/esm/components/ClipboardCopy/ClipboardCopyExpanded.js.map +1 -1
  140. package/dist/esm/components/Dropdown/Dropdown.d.ts +4 -0
  141. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  142. package/dist/esm/components/Dropdown/Dropdown.js +6 -5
  143. package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
  144. package/dist/esm/components/Menu/Menu.d.ts.map +1 -1
  145. package/dist/esm/components/Menu/Menu.js +5 -1
  146. package/dist/esm/components/Menu/Menu.js.map +1 -1
  147. package/dist/esm/components/Menu/MenuContainer.js +2 -2
  148. package/dist/esm/components/Menu/MenuContainer.js.map +1 -1
  149. package/dist/esm/components/MenuToggle/MenuToggle.d.ts +9 -0
  150. package/dist/esm/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  151. package/dist/esm/components/MenuToggle/MenuToggle.js +26 -2
  152. package/dist/esm/components/MenuToggle/MenuToggle.js.map +1 -1
  153. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.js +2 -2
  154. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.js.map +1 -1
  155. package/dist/esm/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  156. package/dist/esm/components/Pagination/PaginationOptionsMenu.js +2 -4
  157. package/dist/esm/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  158. package/dist/esm/components/SearchInput/SearchInput.d.ts +2 -0
  159. package/dist/esm/components/SearchInput/SearchInput.d.ts.map +1 -1
  160. package/dist/esm/components/SearchInput/SearchInput.js +2 -2
  161. package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
  162. package/dist/esm/components/Select/Select.d.ts +6 -0
  163. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  164. package/dist/esm/components/Select/Select.js +5 -5
  165. package/dist/esm/components/Select/Select.js.map +1 -1
  166. package/dist/esm/components/TextArea/TextArea.d.ts +0 -4
  167. package/dist/esm/components/TextArea/TextArea.d.ts.map +1 -1
  168. package/dist/esm/components/TextArea/TextArea.js.map +1 -1
  169. package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts +2 -0
  170. package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
  171. package/dist/esm/components/TextInputGroup/TextInputGroupMain.js +3 -3
  172. package/dist/esm/components/TextInputGroup/TextInputGroupMain.js.map +1 -1
  173. package/dist/esm/helpers/GenerateId/GenerateId.d.ts +5 -1
  174. package/dist/esm/helpers/GenerateId/GenerateId.d.ts.map +1 -1
  175. package/dist/esm/helpers/GenerateId/GenerateId.js +14 -2
  176. package/dist/esm/helpers/GenerateId/GenerateId.js.map +1 -1
  177. package/dist/esm/helpers/Popper/Popper.js +2 -2
  178. package/dist/esm/helpers/Popper/Popper.js.map +1 -1
  179. package/dist/esm/index.d.ts.map +1 -1
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/esm/next/components/DualListSelector/DualListSelector.d.ts +23 -0
  182. package/dist/esm/next/components/DualListSelector/DualListSelector.d.ts.map +1 -0
  183. package/dist/esm/next/components/DualListSelector/DualListSelector.js +23 -0
  184. package/dist/esm/next/components/DualListSelector/DualListSelector.js.map +1 -0
  185. package/dist/esm/next/components/DualListSelector/DualListSelectorContext.d.ts +19 -0
  186. package/dist/esm/next/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -0
  187. package/dist/esm/next/components/DualListSelector/DualListSelectorContext.js +5 -0
  188. package/dist/esm/next/components/DualListSelector/DualListSelectorContext.js.map +1 -0
  189. package/dist/esm/next/components/DualListSelector/DualListSelectorControl.d.ts +25 -0
  190. package/dist/esm/next/components/DualListSelector/DualListSelectorControl.d.ts.map +1 -0
  191. package/dist/esm/next/components/DualListSelector/DualListSelectorControl.js +18 -0
  192. package/dist/esm/next/components/DualListSelector/DualListSelectorControl.js.map +1 -0
  193. package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +15 -0
  194. package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts.map +1 -0
  195. package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.js +35 -0
  196. package/dist/esm/next/components/DualListSelector/DualListSelectorControlsWrapper.js.map +1 -0
  197. package/dist/esm/next/components/DualListSelector/DualListSelectorList.d.ts +8 -0
  198. package/dist/esm/next/components/DualListSelector/DualListSelectorList.d.ts.map +1 -0
  199. package/dist/esm/next/components/DualListSelector/DualListSelectorList.js +26 -0
  200. package/dist/esm/next/components/DualListSelector/DualListSelectorList.js.map +1 -0
  201. package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.d.ts +29 -0
  202. package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.d.ts.map +1 -0
  203. package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.js +38 -0
  204. package/dist/esm/next/components/DualListSelector/DualListSelectorListItem.js.map +1 -0
  205. package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.d.ts +24 -0
  206. package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -0
  207. package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.js +59 -0
  208. package/dist/esm/next/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -0
  209. package/dist/esm/next/components/DualListSelector/DualListSelectorPane.d.ts +31 -0
  210. package/dist/esm/next/components/DualListSelector/DualListSelectorPane.d.ts.map +1 -0
  211. package/dist/esm/next/components/DualListSelector/DualListSelectorPane.js +27 -0
  212. package/dist/esm/next/components/DualListSelector/DualListSelectorPane.js.map +1 -0
  213. package/dist/esm/next/components/DualListSelector/DualListSelectorTree.d.ts +48 -0
  214. package/dist/esm/next/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -0
  215. package/dist/esm/next/components/DualListSelector/DualListSelectorTree.js +15 -0
  216. package/dist/esm/next/components/DualListSelector/DualListSelectorTree.js.map +1 -0
  217. package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.d.ts +32 -0
  218. package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -0
  219. package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.js +75 -0
  220. package/dist/esm/next/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -0
  221. package/dist/esm/next/components/DualListSelector/index.d.ts +8 -0
  222. package/dist/esm/next/components/DualListSelector/index.d.ts.map +1 -0
  223. package/dist/esm/next/components/DualListSelector/index.js +8 -0
  224. package/dist/esm/next/components/DualListSelector/index.js.map +1 -0
  225. package/dist/esm/next/components/DualListSelector/treeUtils.d.ts +8 -0
  226. package/dist/esm/next/components/DualListSelector/treeUtils.d.ts.map +1 -0
  227. package/dist/esm/next/components/DualListSelector/treeUtils.js +68 -0
  228. package/dist/esm/next/components/DualListSelector/treeUtils.js.map +1 -0
  229. package/dist/esm/next/components/index.d.ts +1 -0
  230. package/dist/esm/next/components/index.d.ts.map +1 -1
  231. package/dist/esm/next/components/index.js +1 -0
  232. package/dist/esm/next/components/index.js.map +1 -1
  233. package/dist/js/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  234. package/dist/js/components/CalendarMonth/CalendarMonth.js +30 -12
  235. package/dist/js/components/CalendarMonth/CalendarMonth.js.map +1 -1
  236. package/dist/js/components/Card/Card.d.ts +13 -5
  237. package/dist/js/components/Card/Card.d.ts.map +1 -1
  238. package/dist/js/components/Card/Card.js +7 -3
  239. package/dist/js/components/Card/Card.js.map +1 -1
  240. package/dist/js/components/Card/CardHeader.d.ts +3 -1
  241. package/dist/js/components/Card/CardHeader.d.ts.map +1 -1
  242. package/dist/js/components/Card/CardHeader.js +10 -10
  243. package/dist/js/components/Card/CardHeader.js.map +1 -1
  244. package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts +6 -6
  245. package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
  246. package/dist/js/components/ClipboardCopy/ClipboardCopy.js +10 -2
  247. package/dist/js/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
  248. package/dist/js/components/ClipboardCopy/ClipboardCopyExpanded.d.ts +1 -0
  249. package/dist/js/components/ClipboardCopy/ClipboardCopyExpanded.d.ts.map +1 -1
  250. package/dist/js/components/ClipboardCopy/ClipboardCopyExpanded.js.map +1 -1
  251. package/dist/js/components/Dropdown/Dropdown.d.ts +4 -0
  252. package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
  253. package/dist/js/components/Dropdown/Dropdown.js +6 -5
  254. package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
  255. package/dist/js/components/Menu/Menu.d.ts.map +1 -1
  256. package/dist/js/components/Menu/Menu.js +5 -1
  257. package/dist/js/components/Menu/Menu.js.map +1 -1
  258. package/dist/js/components/Menu/MenuContainer.js +2 -2
  259. package/dist/js/components/Menu/MenuContainer.js.map +1 -1
  260. package/dist/js/components/MenuToggle/MenuToggle.d.ts +9 -0
  261. package/dist/js/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  262. package/dist/js/components/MenuToggle/MenuToggle.js +27 -3
  263. package/dist/js/components/MenuToggle/MenuToggle.js.map +1 -1
  264. package/dist/js/components/MenuToggle/MenuToggleCheckbox.js +2 -2
  265. package/dist/js/components/MenuToggle/MenuToggleCheckbox.js.map +1 -1
  266. package/dist/js/components/Pagination/PaginationOptionsMenu.d.ts.map +1 -1
  267. package/dist/js/components/Pagination/PaginationOptionsMenu.js +2 -4
  268. package/dist/js/components/Pagination/PaginationOptionsMenu.js.map +1 -1
  269. package/dist/js/components/SearchInput/SearchInput.d.ts +2 -0
  270. package/dist/js/components/SearchInput/SearchInput.d.ts.map +1 -1
  271. package/dist/js/components/SearchInput/SearchInput.js +2 -2
  272. package/dist/js/components/SearchInput/SearchInput.js.map +1 -1
  273. package/dist/js/components/Select/Select.d.ts +6 -0
  274. package/dist/js/components/Select/Select.d.ts.map +1 -1
  275. package/dist/js/components/Select/Select.js +5 -5
  276. package/dist/js/components/Select/Select.js.map +1 -1
  277. package/dist/js/components/TextArea/TextArea.d.ts +0 -4
  278. package/dist/js/components/TextArea/TextArea.d.ts.map +1 -1
  279. package/dist/js/components/TextArea/TextArea.js.map +1 -1
  280. package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts +2 -0
  281. package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
  282. package/dist/js/components/TextInputGroup/TextInputGroupMain.js +3 -3
  283. package/dist/js/components/TextInputGroup/TextInputGroupMain.js.map +1 -1
  284. package/dist/js/helpers/GenerateId/GenerateId.d.ts +5 -1
  285. package/dist/js/helpers/GenerateId/GenerateId.d.ts.map +1 -1
  286. package/dist/js/helpers/GenerateId/GenerateId.js +14 -2
  287. package/dist/js/helpers/GenerateId/GenerateId.js.map +1 -1
  288. package/dist/js/helpers/Popper/Popper.js +2 -2
  289. package/dist/js/helpers/Popper/Popper.js.map +1 -1
  290. package/dist/js/index.d.ts.map +1 -1
  291. package/dist/js/index.js.map +1 -1
  292. package/dist/js/next/components/DualListSelector/DualListSelector.d.ts +23 -0
  293. package/dist/js/next/components/DualListSelector/DualListSelector.d.ts.map +1 -0
  294. package/dist/js/next/components/DualListSelector/DualListSelector.js +26 -0
  295. package/dist/js/next/components/DualListSelector/DualListSelector.js.map +1 -0
  296. package/dist/js/next/components/DualListSelector/DualListSelectorContext.d.ts +19 -0
  297. package/dist/js/next/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -0
  298. package/dist/js/next/components/DualListSelector/DualListSelectorContext.js +9 -0
  299. package/dist/js/next/components/DualListSelector/DualListSelectorContext.js.map +1 -0
  300. package/dist/js/next/components/DualListSelector/DualListSelectorControl.d.ts +25 -0
  301. package/dist/js/next/components/DualListSelector/DualListSelectorControl.d.ts.map +1 -0
  302. package/dist/js/next/components/DualListSelector/DualListSelectorControl.js +22 -0
  303. package/dist/js/next/components/DualListSelector/DualListSelectorControl.js.map +1 -0
  304. package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +15 -0
  305. package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.d.ts.map +1 -0
  306. package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.js +39 -0
  307. package/dist/js/next/components/DualListSelector/DualListSelectorControlsWrapper.js.map +1 -0
  308. package/dist/js/next/components/DualListSelector/DualListSelectorList.d.ts +8 -0
  309. package/dist/js/next/components/DualListSelector/DualListSelectorList.d.ts.map +1 -0
  310. package/dist/js/next/components/DualListSelector/DualListSelectorList.js +30 -0
  311. package/dist/js/next/components/DualListSelector/DualListSelectorList.js.map +1 -0
  312. package/dist/js/next/components/DualListSelector/DualListSelectorListItem.d.ts +29 -0
  313. package/dist/js/next/components/DualListSelector/DualListSelectorListItem.d.ts.map +1 -0
  314. package/dist/js/next/components/DualListSelector/DualListSelectorListItem.js +42 -0
  315. package/dist/js/next/components/DualListSelector/DualListSelectorListItem.js.map +1 -0
  316. package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.d.ts +24 -0
  317. package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -0
  318. package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.js +63 -0
  319. package/dist/js/next/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -0
  320. package/dist/js/next/components/DualListSelector/DualListSelectorPane.d.ts +31 -0
  321. package/dist/js/next/components/DualListSelector/DualListSelectorPane.d.ts.map +1 -0
  322. package/dist/js/next/components/DualListSelector/DualListSelectorPane.js +31 -0
  323. package/dist/js/next/components/DualListSelector/DualListSelectorPane.js.map +1 -0
  324. package/dist/js/next/components/DualListSelector/DualListSelectorTree.d.ts +48 -0
  325. package/dist/js/next/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -0
  326. package/dist/js/next/components/DualListSelector/DualListSelectorTree.js +19 -0
  327. package/dist/js/next/components/DualListSelector/DualListSelectorTree.js.map +1 -0
  328. package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.d.ts +32 -0
  329. package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -0
  330. package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.js +78 -0
  331. package/dist/js/next/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -0
  332. package/dist/js/next/components/DualListSelector/index.d.ts +8 -0
  333. package/dist/js/next/components/DualListSelector/index.d.ts.map +1 -0
  334. package/dist/js/next/components/DualListSelector/index.js +11 -0
  335. package/dist/js/next/components/DualListSelector/index.js.map +1 -0
  336. package/dist/js/next/components/DualListSelector/treeUtils.d.ts +8 -0
  337. package/dist/js/next/components/DualListSelector/treeUtils.d.ts.map +1 -0
  338. package/dist/js/next/components/DualListSelector/treeUtils.js +77 -0
  339. package/dist/js/next/components/DualListSelector/treeUtils.js.map +1 -0
  340. package/dist/js/next/components/index.d.ts +1 -0
  341. package/dist/js/next/components/index.d.ts.map +1 -1
  342. package/dist/js/next/components/index.js +1 -0
  343. package/dist/js/next/components/index.js.map +1 -1
  344. package/dist/umd/react-core.min.js +3 -3
  345. package/helpers/package.json +1 -1
  346. package/layouts/package.json +1 -1
  347. package/next/package.json +1 -1
  348. package/package.json +6 -6
  349. package/src/components/CalendarMonth/CalendarMonth.tsx +38 -13
  350. package/src/components/Card/Card.tsx +24 -7
  351. package/src/components/Card/CardHeader.tsx +11 -10
  352. package/src/components/Card/examples/Card.md +11 -9
  353. package/src/components/Card/examples/CardClickableSelectable.tsx +11 -8
  354. package/src/components/Card/examples/CardSelectable.tsx +3 -6
  355. package/src/components/Card/examples/CardSingleSelectable.tsx +14 -6
  356. package/src/components/Chip/__tests__/ChipGroup.test.tsx +3 -1
  357. package/src/components/ClipboardCopy/ClipboardCopy.tsx +21 -7
  358. package/src/components/ClipboardCopy/ClipboardCopyExpanded.tsx +1 -0
  359. package/src/components/ClipboardCopy/__tests__/ClipboardCopy.test.tsx +2 -0
  360. package/src/components/ClipboardCopy/__tests__/__snapshots__/ClipboardCopy.test.tsx.snap +1 -1
  361. package/src/components/DragDrop/examples/DragDrop.md +1 -0
  362. package/src/components/Drawer/__tests__/Drawer.test.tsx +2 -0
  363. package/src/components/Drawer/__tests__/DrawerPanelContent.test.tsx +2 -0
  364. package/src/components/Drawer/__tests__/Generated/DrawerPanelContent.test.tsx +2 -0
  365. package/src/components/Drawer/__tests__/Generated/__snapshots__/DrawerPanelContent.test.tsx.snap +1 -1
  366. package/src/components/Drawer/__tests__/__snapshots__/Drawer.test.tsx.snap +8 -8
  367. package/src/components/Dropdown/Dropdown.tsx +14 -4
  368. package/src/components/Form/__tests__/FormFieldGroup.test.tsx +2 -0
  369. package/src/components/Form/__tests__/FormSection.test.tsx +2 -0
  370. package/src/components/Form/__tests__/__snapshots__/FormFieldGroup.test.tsx.snap +2 -2
  371. package/src/components/Form/__tests__/__snapshots__/FormSection.test.tsx.snap +2 -2
  372. package/src/components/Label/__tests__/LabelGroup.test.tsx +2 -0
  373. package/src/components/Label/__tests__/__snapshots__/LabelGroup.test.tsx.snap +8 -8
  374. package/src/components/Menu/Menu.tsx +5 -3
  375. package/src/components/Menu/MenuContainer.tsx +2 -2
  376. package/src/components/MenuToggle/MenuToggle.tsx +33 -0
  377. package/src/components/MenuToggle/MenuToggleCheckbox.tsx +2 -2
  378. package/src/components/MenuToggle/__tests__/MenuToggle.test.tsx +15 -0
  379. package/src/components/MenuToggle/examples/MenuToggle.md +28 -13
  380. package/src/components/MenuToggle/examples/MenuToggleStatus.tsx +20 -0
  381. package/src/components/MultipleFileUpload/__tests__/MultipleFileUpload.test.tsx +2 -0
  382. package/src/components/MultipleFileUpload/__tests__/MultipleFileUploadStatus.test.tsx +2 -0
  383. package/src/components/MultipleFileUpload/__tests__/__snapshots__/MultipleFileUploadStatus.test.tsx.snap +16 -16
  384. package/src/components/Pagination/PaginationOptionsMenu.tsx +2 -4
  385. package/src/components/SearchInput/SearchInput.tsx +4 -0
  386. package/src/components/SearchInput/__tests__/SearchInput.test.tsx +1 -0
  387. package/src/components/SearchInput/__tests__/__snapshots__/SearchInput.test.tsx.snap +2 -2
  388. package/src/components/Select/Select.tsx +15 -3
  389. package/src/components/Select/examples/Select.md +30 -11
  390. package/src/components/Select/examples/SelectMultiTypeaheadCheckbox.tsx +6 -1
  391. package/src/components/Select/examples/SelectValidated.tsx +74 -0
  392. package/src/components/Tabs/__tests__/Tabs.test.tsx +2 -0
  393. package/src/components/Tabs/__tests__/__snapshots__/Tabs.test.tsx.snap +3 -3
  394. package/src/components/TextArea/TextArea.tsx +0 -4
  395. package/src/components/TextInputGroup/TextInputGroupMain.tsx +5 -0
  396. package/src/components/TextInputGroup/__tests__/TextInputGroupMain.test.tsx +8 -0
  397. package/src/components/Toolbar/__tests__/Toolbar.test.tsx +2 -0
  398. package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +11 -11
  399. package/src/demos/AlertGroup.md +1 -0
  400. package/src/demos/BackToTop.md +1 -0
  401. package/src/demos/Banner.md +5 -4
  402. package/src/demos/CardView/CardView.md +2 -0
  403. package/src/demos/CardView/examples/CardView.tsx +1 -1
  404. package/src/demos/DataList/examples/DataListBasic.tsx +1 -1
  405. package/src/demos/DataList/examples/DataListExpandableControlInToolbar.tsx +1 -1
  406. package/src/demos/DataListDemo.md +1 -0
  407. package/src/demos/Filters/examples/FilterAttributeSearch.tsx +1 -1
  408. package/src/demos/Filters/examples/FilterCheckboxSelect.tsx +1 -1
  409. package/src/demos/Filters/examples/FilterFaceted.tsx +1 -1
  410. package/src/demos/Filters/examples/FilterMixedSelectGroup.tsx +1 -1
  411. package/src/demos/Filters/examples/FilterSameSelectGroup.tsx +1 -1
  412. package/src/demos/Filters/examples/FilterSearchInput.tsx +1 -1
  413. package/src/demos/Filters/examples/FilterSingleSelect.tsx +1 -1
  414. package/src/demos/JumpLinks.md +2 -1
  415. package/src/demos/PrimaryDetail.md +1 -0
  416. package/src/demos/Tabs.md +5 -2
  417. package/src/demos/Toolbar.md +1 -0
  418. package/src/demos/Wizard/WizardDemo.md +1 -0
  419. package/src/demos/examples/AlertGroup/AlertGroupToastWithNotificationDrawer.tsx +1 -1
  420. package/src/demos/examples/BackToTop/BackToTopNameDemo.tsx +1 -1
  421. package/src/demos/examples/Card/CardStatus.tsx +1 -1
  422. package/src/demos/examples/JumpLinks/JumpLinksWithDrawer.js +1 -1
  423. package/src/demos/examples/Nav/NavDefault.tsx +1 -1
  424. package/src/demos/examples/Nav/NavExpandable.tsx +1 -1
  425. package/src/demos/examples/Nav/NavHorizontal.tsx +1 -1
  426. package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +1 -1
  427. package/src/demos/examples/Nav/NavWithSubnav.tsx +1 -1
  428. package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +1 -1
  429. package/src/demos/examples/PrimaryDetail/PrimaryDetailCardView.tsx +1 -1
  430. package/src/demos/examples/PrimaryDetail/PrimaryDetailContentPadding.tsx +1 -1
  431. package/src/demos/examples/PrimaryDetail/PrimaryDetailDataListInCard.tsx +1 -1
  432. package/src/demos/examples/PrimaryDetail/PrimaryDetailFullPage.tsx +1 -1
  433. package/src/demos/examples/PrimaryDetail/PrimaryDetailInlineModifier.tsx +1 -1
  434. package/src/demos/examples/PrimaryDetail/PrimaryDetailSimpleListInCard.tsx +1 -1
  435. package/src/demos/examples/Tabs/ModalTabs.tsx +1 -1
  436. package/src/demos/examples/Tabs/NestedTabs.tsx +1 -1
  437. package/src/demos/examples/Tabs/NestedUnindentedTabs.tsx +1 -1
  438. package/src/demos/examples/Tabs/TabsAndTable.tsx +2 -2
  439. package/src/demos/examples/Toolbar/ConsoleLogViewerToolbar.tsx +1 -1
  440. package/src/demos/examples/Wizard/InModal.tsx +1 -1
  441. package/src/demos/examples/Wizard/InPage.tsx +1 -1
  442. package/src/deprecated/components/Select/__tests__/Select.test.tsx +2 -0
  443. package/src/deprecated/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +25 -25
  444. package/src/helpers/GenerateId/GenerateId.ts +17 -3
  445. package/src/helpers/GenerateId/__mocks__/GenerateId.ts +11 -0
  446. package/src/helpers/GenerateId/__tests__/GenerateId.test.tsx +3 -1
  447. package/src/helpers/Popper/Popper.tsx +1 -1
  448. package/src/index.ts +0 -1
  449. package/src/next/components/DualListSelector/DualListSelector.tsx +50 -0
  450. package/src/next/components/DualListSelector/DualListSelectorContext.ts +21 -0
  451. package/src/next/components/DualListSelector/DualListSelectorControl.tsx +66 -0
  452. package/src/next/components/DualListSelector/DualListSelectorControlsWrapper.tsx +87 -0
  453. package/src/next/components/DualListSelector/DualListSelectorList.tsx +57 -0
  454. package/src/next/components/DualListSelector/DualListSelectorListItem.tsx +105 -0
  455. package/src/next/components/DualListSelector/DualListSelectorListWrapper.tsx +124 -0
  456. package/src/next/components/DualListSelector/DualListSelectorPane.tsx +94 -0
  457. package/src/next/components/DualListSelector/DualListSelectorTree.tsx +110 -0
  458. package/src/next/components/DualListSelector/DualListSelectorTreeItem.tsx +184 -0
  459. package/src/next/components/DualListSelector/__tests__/DualListSelector.test.tsx +26 -0
  460. package/src/next/components/DualListSelector/__tests__/__snapshots__/DualListSelector.test.tsx.snap +122 -0
  461. package/src/next/components/DualListSelector/examples/DualListSelector.md +99 -0
  462. package/src/next/components/DualListSelector/examples/DualListSelectorBasic.tsx +157 -0
  463. package/src/next/components/DualListSelector/examples/DualListSelectorBasicSearch.tsx +214 -0
  464. package/src/next/components/DualListSelector/examples/DualListSelectorBasicTooltips.tsx +165 -0
  465. package/src/next/components/DualListSelector/examples/DualListSelectorComplexOptionsActions.tsx +347 -0
  466. package/src/next/components/DualListSelector/examples/DualListSelectorDragDrop.tsx +184 -0
  467. package/src/next/components/DualListSelector/examples/DualListSelectorTree.tsx +380 -0
  468. package/src/next/components/DualListSelector/index.ts +7 -0
  469. package/src/next/components/DualListSelector/treeUtils.ts +81 -0
  470. package/src/next/components/index.ts +1 -0
  471. package/dist/esm/demos/index.d.ts +0 -3
  472. package/dist/esm/demos/index.d.ts.map +0 -1
  473. package/dist/esm/demos/index.js +0 -3
  474. package/dist/esm/demos/index.js.map +0 -1
  475. package/dist/js/demos/index.d.ts +0 -3
  476. package/dist/js/demos/index.d.ts.map +0 -1
  477. package/dist/js/demos/index.js +0 -6
  478. package/dist/js/demos/index.js.map +0 -1
  479. package/src/demos/index.ts +0 -2
@@ -0,0 +1,105 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
3
+ import { css } from '@patternfly/react-styles';
4
+ import { getUniqueId } from '../../../helpers';
5
+ import GripVerticalIcon from '@patternfly/react-icons/dist/esm/icons/grip-vertical-icon';
6
+ import { Button, ButtonVariant } from '../../../components/Button';
7
+ import { DualListSelectorListContext } from './DualListSelectorContext';
8
+
9
+ /** Creates an individual option that can be selected and moved between the
10
+ * dual list selector panes. This is contained within the DualListSelectorList sub-component.
11
+ */
12
+
13
+ export interface DualListSelectorListItemProps extends React.HTMLProps<HTMLLIElement> {
14
+ /** Content rendered inside the dual list selector. */
15
+ children?: React.ReactNode;
16
+ /** Additional classes applied to the dual list selector. */
17
+ className?: string;
18
+ /** Flag indicating the list item is currently selected. */
19
+ isSelected?: boolean;
20
+ /** Callback fired when an option is selected. */
21
+ onOptionSelect?: (event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent, id?: string) => void;
22
+ /** ID of the option. */
23
+ id?: string;
24
+ /** @hide Internal field used to keep track of order of unfiltered options. */
25
+ orderIndex?: number;
26
+ /** @hide Forwarded ref */
27
+ innerRef?: React.RefObject<HTMLLIElement>;
28
+ /** Flag indicating this item is draggable for reordering. */
29
+ isDraggable?: boolean;
30
+ /** Accessible label for the draggable button on draggable list items. */
31
+ draggableButtonAriaLabel?: string;
32
+ /** Flag indicating if the dual list selector is in a disabled state. */
33
+ isDisabled?: boolean;
34
+ }
35
+
36
+ export const DualListSelectorListItemBase: React.FunctionComponent<DualListSelectorListItemProps> = ({
37
+ onOptionSelect,
38
+ orderIndex,
39
+ children,
40
+ className,
41
+ id = getUniqueId('dual-list-selector-list-item'),
42
+ isSelected,
43
+ innerRef,
44
+ isDraggable = false,
45
+ isDisabled,
46
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
47
+ draggableButtonAriaLabel = 'Reorder option',
48
+ ...props
49
+ }: DualListSelectorListItemProps) => {
50
+ const privateRef = React.useRef<HTMLLIElement>(null);
51
+ const ref = innerRef || privateRef;
52
+ const { setFocusedOption } = React.useContext(DualListSelectorListContext);
53
+
54
+ return (
55
+ <li
56
+ className={css(styles.dualListSelectorListItem, className, isDisabled && styles.modifiers.disabled)}
57
+ key={orderIndex}
58
+ onClick={
59
+ isDisabled
60
+ ? undefined
61
+ : (e: React.MouseEvent) => {
62
+ setFocusedOption(id);
63
+ onOptionSelect(e, id);
64
+ }
65
+ }
66
+ onKeyDown={(e: React.KeyboardEvent) => {
67
+ if (e.key === ' ' || e.key === 'Enter') {
68
+ (document.activeElement as HTMLElement).click();
69
+ e.preventDefault();
70
+ }
71
+ }}
72
+ aria-selected={isSelected}
73
+ id={id}
74
+ ref={ref}
75
+ role="option"
76
+ tabIndex={-1}
77
+ {...props}
78
+ >
79
+ <div className={css(styles.dualListSelectorListItemRow, isSelected && styles.modifiers.selected)}>
80
+ {isDraggable && !isDisabled && (
81
+ <div className={css(styles.dualListSelectorDraggable)}>
82
+ {/** TODO once keyboard accessibility is enabled, remove `component=span`
83
+ and add `aria-label={draggableButtonAriaLabel}` */}
84
+ <Button variant={ButtonVariant.plain} component="span">
85
+ <GripVerticalIcon style={{ verticalAlign: '-0.3em' }} />
86
+ </Button>
87
+ </div>
88
+ )}
89
+ <span className={css(styles.dualListSelectorItem)}>
90
+ <span className={css(styles.dualListSelectorItemMain)}>
91
+ <span className={css(styles.dualListSelectorItemText)}>{children}</span>
92
+ </span>
93
+ </span>
94
+ </div>
95
+ </li>
96
+ );
97
+ };
98
+ DualListSelectorListItemBase.displayName = 'DualListSelectorListItemBase';
99
+
100
+ export const DualListSelectorListItem = React.forwardRef(
101
+ (props: DualListSelectorListItemProps, ref: React.Ref<HTMLLIElement>) => (
102
+ <DualListSelectorListItemBase innerRef={ref as React.MutableRefObject<any>} {...props} />
103
+ )
104
+ );
105
+ DualListSelectorListItem.displayName = 'DualListSelectorListItem';
@@ -0,0 +1,124 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
3
+ import { css } from '@patternfly/react-styles';
4
+ import { getUniqueId, handleArrows } from '../../../helpers';
5
+ import { DualListSelectorList } from './DualListSelectorList';
6
+ import { DualListSelectorContext, DualListSelectorListContext } from './DualListSelectorContext';
7
+
8
+ export interface DualListSelectorListWrapperProps extends React.HTMLProps<HTMLDivElement> {
9
+ /** Additional classes applied to the dual list selector. */
10
+ className?: string;
11
+ /** Anything that can be rendered inside of the list. */
12
+ children?: React.ReactNode;
13
+ /** ID of the dual list selector list. */
14
+ id?: string;
15
+ /** Accessibly label for the list. */
16
+ 'aria-labelledby': string;
17
+ /** @hide forwarded ref */
18
+ innerRef?: React.RefObject<HTMLDivElement>;
19
+ /** @hide Options to list in the pane. */
20
+ options?: React.ReactNode[];
21
+ /** @hide Options currently selected in the pane. */
22
+ selectedOptions?: string[] | number[];
23
+ /** @hide Function to determine if an option should be displayed depending on a custom filter value. */
24
+ displayOption?: (option: React.ReactNode) => boolean;
25
+ /** Flag indicating whether the component is disabled. */
26
+ isDisabled?: boolean;
27
+ }
28
+
29
+ export const DualListSelectorListWrapperBase: React.FunctionComponent<DualListSelectorListWrapperProps> = ({
30
+ className,
31
+ children,
32
+ 'aria-labelledby': ariaLabelledBy,
33
+ innerRef,
34
+ options = [],
35
+ selectedOptions = [],
36
+ displayOption,
37
+ id = getUniqueId('dual-list-selector-list'),
38
+ isDisabled = false,
39
+ ...props
40
+ }: DualListSelectorListWrapperProps) => {
41
+ const [focusedOption, setFocusedOption] = React.useState('');
42
+ const ref = React.useRef(null);
43
+ const menuRef = innerRef || ref;
44
+ const { isTree } = React.useContext(DualListSelectorContext);
45
+
46
+ // Sets up keyboard focus handling for the dual list selector menu child of the pane.
47
+ const handleKeys = (event: KeyboardEvent) => {
48
+ if (
49
+ !menuRef.current ||
50
+ (menuRef.current !== (event.target as HTMLElement).closest(`.${styles.dualListSelectorMenu}`) &&
51
+ !Array.from(menuRef.current.getElementsByClassName(styles.dualListSelectorMenu)).includes(
52
+ (event.target as HTMLElement).closest(`.${styles.dualListSelectorMenu}`)
53
+ ))
54
+ ) {
55
+ return;
56
+ }
57
+ event.stopImmediatePropagation();
58
+ const validOptions = isTree
59
+ ? (Array.from(
60
+ menuRef.current.querySelectorAll(
61
+ `.${styles.dualListSelectorItemToggle}, .${styles.dualListSelectorItemCheck} > input`
62
+ )
63
+ ) as Element[])
64
+ : (Array.from(menuRef.current.getElementsByTagName('LI')) as Element[]).filter(
65
+ (el) => !el.classList.contains('pf-m-disabled')
66
+ );
67
+ const activeElement = document.activeElement;
68
+ handleArrows(
69
+ event,
70
+ validOptions,
71
+ (element: Element) => activeElement.contains(element),
72
+ (element: Element) => {
73
+ if (element.classList.contains(`.${styles.dualListSelectorListItem}`)) {
74
+ setFocusedOption(element.id);
75
+ } else {
76
+ setFocusedOption(element.closest(`.${styles.dualListSelectorListItem}`).id);
77
+ }
78
+ return element;
79
+ },
80
+ [`.${styles.dualListSelectorItemToggle}`, `.${styles.dualListSelectorItemCheck} > input`],
81
+ undefined,
82
+ false,
83
+ false,
84
+ false
85
+ );
86
+ };
87
+
88
+ React.useEffect(() => {
89
+ window.addEventListener('keydown', handleKeys);
90
+ return () => {
91
+ window.removeEventListener('keydown', handleKeys);
92
+ };
93
+ // eslint-disable-next-line react-hooks/exhaustive-deps
94
+ }, [menuRef.current]);
95
+
96
+ return (
97
+ <div className={css(styles.dualListSelectorMenu, className)} ref={menuRef} tabIndex={0} {...props}>
98
+ <DualListSelectorListContext.Provider
99
+ value={{
100
+ setFocusedOption,
101
+ isTree,
102
+ focusedOption,
103
+ ariaLabelledBy,
104
+ displayOption,
105
+ selectedOptions,
106
+ id,
107
+ options,
108
+ isDisabled
109
+ }}
110
+ >
111
+ {children ? children : <DualListSelectorList />}
112
+ </DualListSelectorListContext.Provider>
113
+ </div>
114
+ );
115
+ };
116
+ DualListSelectorListWrapperBase.displayName = 'DualListSelectorListWrapperBase';
117
+
118
+ export const DualListSelectorListWrapper = React.forwardRef(
119
+ (props: DualListSelectorListWrapperProps, ref: React.Ref<HTMLDivElement>) => (
120
+ <DualListSelectorListWrapperBase innerRef={ref as React.MutableRefObject<any>} {...props} />
121
+ )
122
+ );
123
+
124
+ DualListSelectorListWrapper.displayName = 'DualListSelectorListWrapper';
@@ -0,0 +1,94 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
3
+ import { css } from '@patternfly/react-styles';
4
+ import { getUniqueId } from '../../../helpers';
5
+ import { DualListSelectorListWrapper } from './DualListSelectorListWrapper';
6
+ import { DualListSelectorPaneContext } from './DualListSelectorContext';
7
+ import { SearchInput } from '../../../components/SearchInput';
8
+ import cssMenuMinHeight from '@patternfly/react-tokens/dist/esm/c_dual_list_selector__menu_MinHeight';
9
+
10
+ /** Acts as the container for a list of options that are either available or chosen,
11
+ * depending on the pane type (available or chosen). A search input and other actions,
12
+ * such as sorting, can also be passed into this sub-component.
13
+ */
14
+
15
+ export interface DualListSelectorPaneProps extends Omit<React.HTMLProps<HTMLDivElement>, 'title'> {
16
+ /** Additional classes applied to the dual list selector pane. */
17
+ className?: string;
18
+ /** A dual list selector list or dual list selector tree to be rendered in the pane. */
19
+ children?: React.ReactNode;
20
+ /** Flag indicating if this pane is the chosen pane. */
21
+ isChosen?: boolean;
22
+ /** Status to display above the pane. */
23
+ status?: string;
24
+ /** Title of the pane. */
25
+ title?: React.ReactNode;
26
+ /** A search input placed above the list at the top of the pane, before actions. */
27
+ searchInput?: React.ReactNode;
28
+ /** Actions to place above the pane. */
29
+ actions?: React.ReactNode[];
30
+ /** ID of the pane. */
31
+ id?: string;
32
+ /** Flag indicating whether the component is disabled. */
33
+ isDisabled?: boolean;
34
+ /** Callback for search input. To be used when isSearchable is true. */
35
+ onSearch?: (event: React.ChangeEvent<HTMLInputElement>) => void;
36
+ /** Minimum height of the list of options rendered in the pane. **/
37
+ listMinHeight?: string;
38
+ }
39
+
40
+ export const DualListSelectorPane: React.FunctionComponent<DualListSelectorPaneProps> = ({
41
+ isChosen = false,
42
+ className = '',
43
+ status = '',
44
+ actions,
45
+ searchInput,
46
+ children,
47
+ title = '',
48
+ id = getUniqueId('dual-list-selector-pane'),
49
+ isDisabled = false,
50
+ listMinHeight,
51
+ ...props
52
+ }: DualListSelectorPaneProps) => (
53
+ <div
54
+ className={css(styles.dualListSelectorPane, isChosen ? styles.modifiers.chosen : 'pf-m-available', className)}
55
+ {...props}
56
+ >
57
+ {title && (
58
+ <div className={css(styles.dualListSelectorHeader)}>
59
+ <div className={`${styles.dualListSelector}__title`}>
60
+ <div className={css(styles.dualListSelectorTitleText)}>{title}</div>
61
+ </div>
62
+ </div>
63
+ )}
64
+ {(actions || searchInput) && (
65
+ <div className={css(styles.dualListSelectorTools)}>
66
+ {searchInput && (
67
+ <div className={css(styles.dualListSelectorToolsFilter)}>
68
+ {searchInput ? searchInput : <SearchInput isDisabled={isDisabled} />}
69
+ </div>
70
+ )}
71
+ {actions && <div className={css(styles.dualListSelectorToolsActions)}>{actions}</div>}
72
+ </div>
73
+ )}
74
+ {status && (
75
+ <div className={css(styles.dualListSelectorStatus)}>
76
+ <div className={css(styles.dualListSelectorStatusText)} id={`${id}-status`}>
77
+ {status}
78
+ </div>
79
+ </div>
80
+ )}
81
+ <DualListSelectorPaneContext.Provider value={{ isChosen }}>
82
+ <DualListSelectorListWrapper
83
+ aria-labelledby={`${id}-status`}
84
+ id={`${id}-list`}
85
+ {...(listMinHeight && {
86
+ style: { [cssMenuMinHeight.name]: listMinHeight } as React.CSSProperties
87
+ })}
88
+ >
89
+ {children}
90
+ </DualListSelectorListWrapper>
91
+ </DualListSelectorPaneContext.Provider>
92
+ </div>
93
+ );
94
+ DualListSelectorPane.displayName = 'DualListSelectorPane';
@@ -0,0 +1,110 @@
1
+ import * as React from 'react';
2
+ import { css } from '@patternfly/react-styles';
3
+ import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
4
+ import { DualListSelectorTreeItem } from './DualListSelectorTreeItem';
5
+
6
+ export interface DualListSelectorTreeItemData {
7
+ /** Content rendered inside the dual list selector. */
8
+ children?: DualListSelectorTreeItemData[];
9
+ /** Additional classes applied to the dual list selector. */
10
+ className?: string;
11
+ /** Flag indicating this option is expanded by default. */
12
+ defaultExpanded?: boolean;
13
+ /** Flag indicating this option has a badge. */
14
+ hasBadge?: boolean;
15
+ /** Callback fired when an option is checked. */
16
+ onOptionCheck?: (
17
+ event: React.MouseEvent | React.ChangeEvent<HTMLInputElement> | React.KeyboardEvent,
18
+ isChecked: boolean,
19
+ isChosen: boolean,
20
+ itemData: DualListSelectorTreeItemData
21
+ ) => void;
22
+ /** ID of the option. */
23
+ id: string;
24
+ /** Text of the option. */
25
+ text: string;
26
+ /** Parent ID of an option. */
27
+ parentId?: string;
28
+ /** Checked state of the option. */
29
+ isChecked: boolean;
30
+ /** Additional properties to pass to the option checkbox. */
31
+ checkProps?: any;
32
+ /** Additional properties to pass to the option badge. */
33
+ badgeProps?: any;
34
+ /** Flag indicating whether the component is disabled. */
35
+ isDisabled?: boolean;
36
+ }
37
+
38
+ /** Used in place of the DualListSelectorListItem sub-component when building a
39
+ * composable dual list selector with a tree.
40
+ */
41
+
42
+ export interface DualListSelectorTreeProps extends Omit<React.HTMLProps<HTMLUListElement>, 'data'> {
43
+ /** Data of the tree view. */
44
+ data: DualListSelectorTreeItemData[] | (() => DualListSelectorTreeItemData[]);
45
+ /** ID of the tree view. */
46
+ id?: string;
47
+ /** @hide Flag indicating if the list is nested. */
48
+ isNested?: boolean;
49
+ /** Flag indicating if all options should have badges. */
50
+ hasBadges?: boolean;
51
+ /** Sets the default expanded behavior. */
52
+ defaultAllExpanded?: boolean;
53
+ /** Flag indicating if the dual list selector tree is in the disabled state. */
54
+ isDisabled?: boolean;
55
+ /** Callback fired when an option is checked. */
56
+ onOptionCheck?: (
57
+ event: React.MouseEvent | React.ChangeEvent<HTMLInputElement> | React.KeyboardEvent,
58
+ isChecked: boolean,
59
+ itemData: DualListSelectorTreeItemData
60
+ ) => void;
61
+ }
62
+
63
+ export const DualListSelectorTree: React.FunctionComponent<DualListSelectorTreeProps> = ({
64
+ data,
65
+ hasBadges = false,
66
+ isNested = false,
67
+ defaultAllExpanded = false,
68
+ onOptionCheck,
69
+ isDisabled = false,
70
+ ...props
71
+ }: DualListSelectorTreeProps) => {
72
+ const dataToRender = typeof data === 'function' ? data() : data;
73
+ const tree = dataToRender.map((item) => (
74
+ <DualListSelectorTreeItem
75
+ key={item.id}
76
+ text={item.text}
77
+ id={item.id}
78
+ defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded}
79
+ onOptionCheck={onOptionCheck}
80
+ isChecked={item.isChecked}
81
+ checkProps={item.checkProps}
82
+ hasBadge={item.hasBadge !== undefined ? item.hasBadge : hasBadges}
83
+ badgeProps={item.badgeProps}
84
+ itemData={item}
85
+ isDisabled={isDisabled}
86
+ useMemo={true}
87
+ {...(item.children && {
88
+ children: (
89
+ <DualListSelectorTree
90
+ isNested
91
+ data={item.children}
92
+ hasBadges={hasBadges}
93
+ defaultAllExpanded={defaultAllExpanded}
94
+ onOptionCheck={onOptionCheck}
95
+ isDisabled={isDisabled}
96
+ />
97
+ )
98
+ })}
99
+ />
100
+ ));
101
+ return isNested ? (
102
+ <ul className={css(styles.dualListSelectorList)} role="group" {...props}>
103
+ {tree}
104
+ </ul>
105
+ ) : (
106
+ <>{tree}</>
107
+ );
108
+ };
109
+
110
+ DualListSelectorTree.displayName = 'DualListSelectorTree';
@@ -0,0 +1,184 @@
1
+ import * as React from 'react';
2
+ import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
3
+ import { css } from '@patternfly/react-styles';
4
+ import { DualListSelectorTreeItemData } from './DualListSelectorTree';
5
+ import { Badge } from '../../../components/Badge';
6
+ import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
7
+ import { flattenTree } from './treeUtils';
8
+ import { DualListSelectorListContext } from './DualListSelectorContext';
9
+
10
+ export interface DualListSelectorTreeItemProps extends React.HTMLProps<HTMLLIElement> {
11
+ /** Content rendered inside the dual list selector. */
12
+ children?: React.ReactNode;
13
+ /** Additional classes applied to the dual list selector. */
14
+ className?: string;
15
+ /** Flag indicating this option is expanded by default. */
16
+ defaultExpanded?: boolean;
17
+ /** Flag indicating this option has a badge. */
18
+ hasBadge?: boolean;
19
+ /** Callback fired when an option is checked. */
20
+ onOptionCheck?: (
21
+ event: React.MouseEvent | React.ChangeEvent<HTMLInputElement> | React.KeyboardEvent,
22
+ isChecked: boolean,
23
+ itemData: DualListSelectorTreeItemData
24
+ ) => void;
25
+ /** ID of the option. */
26
+ id: string;
27
+ /** Text of the option. */
28
+ text: string;
29
+ /** Flag indicating if this open is checked. */
30
+ isChecked?: boolean;
31
+ /** Additional properties to pass to the option checkbox. */
32
+ checkProps?: any;
33
+ /** Additional properties to pass to the option badge. */
34
+ badgeProps?: any;
35
+ /** Raw data of the option. */
36
+ itemData?: DualListSelectorTreeItemData;
37
+ /** Flag indicating whether the component is disabled. */
38
+ isDisabled?: boolean;
39
+ /** Flag indicating the DualListSelector tree should utilize memoization to help render large data sets. */
40
+ useMemo?: boolean;
41
+ }
42
+
43
+ const DualListSelectorTreeItemBase: React.FunctionComponent<DualListSelectorTreeItemProps> = ({
44
+ onOptionCheck,
45
+ children,
46
+ className,
47
+ id,
48
+ text,
49
+ defaultExpanded,
50
+ hasBadge,
51
+ isChecked,
52
+ checkProps,
53
+ badgeProps,
54
+ itemData,
55
+ isDisabled = false,
56
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
57
+ useMemo,
58
+ ...props
59
+ }: DualListSelectorTreeItemProps) => {
60
+ const ref = React.useRef(null);
61
+ const [isExpanded, setIsExpanded] = React.useState(defaultExpanded || false);
62
+ const { setFocusedOption } = React.useContext(DualListSelectorListContext);
63
+
64
+ React.useEffect(() => {
65
+ setIsExpanded(defaultExpanded);
66
+ }, [defaultExpanded]);
67
+
68
+ return (
69
+ <li
70
+ className={css(
71
+ styles.dualListSelectorListItem,
72
+ className,
73
+ children && styles.modifiers.expandable,
74
+ isExpanded && styles.modifiers.expanded,
75
+ isDisabled && styles.modifiers.disabled
76
+ )}
77
+ id={id}
78
+ {...props}
79
+ aria-selected={isChecked}
80
+ role="treeitem"
81
+ {...(isExpanded && { 'aria-expanded': 'true' })}
82
+ >
83
+ <div
84
+ className={css(
85
+ styles.dualListSelectorListItemRow,
86
+ isChecked && styles.modifiers.selected,
87
+ styles.modifiers.check
88
+ )}
89
+ >
90
+ <div
91
+ className={css(styles.dualListSelectorItem)}
92
+ ref={ref}
93
+ tabIndex={-1}
94
+ onClick={
95
+ isDisabled
96
+ ? undefined
97
+ : (evt) => {
98
+ onOptionCheck && onOptionCheck(evt, !isChecked, itemData);
99
+ setFocusedOption(id);
100
+ }
101
+ }
102
+ >
103
+ <span className={css(styles.dualListSelectorItemMain)}>
104
+ {children && (
105
+ <div
106
+ className={css(styles.dualListSelectorItemToggle)}
107
+ onClick={(e) => {
108
+ if (children) {
109
+ setIsExpanded(!isExpanded);
110
+ }
111
+ e.stopPropagation();
112
+ }}
113
+ onKeyDown={(e: React.KeyboardEvent) => {
114
+ if (e.key === ' ' || e.key === 'Enter') {
115
+ (document.activeElement as HTMLElement).click();
116
+ e.preventDefault();
117
+ }
118
+ }}
119
+ tabIndex={-1}
120
+ >
121
+ <span className={css(styles.dualListSelectorItemToggleIcon)}>
122
+ <AngleRightIcon aria-hidden />
123
+ </span>
124
+ </div>
125
+ )}
126
+ <span className={css(styles.dualListSelectorItemCheck)}>
127
+ <input
128
+ type="checkbox"
129
+ onChange={(evt: React.ChangeEvent<HTMLInputElement>) => {
130
+ onOptionCheck && onOptionCheck(evt, !isChecked, itemData);
131
+ setFocusedOption(id);
132
+ }}
133
+ onClick={(evt: React.MouseEvent) => evt.stopPropagation()}
134
+ onKeyDown={(e: React.KeyboardEvent) => {
135
+ if (e.key === ' ' || e.key === 'Enter') {
136
+ onOptionCheck && onOptionCheck(e, !isChecked, itemData);
137
+ setFocusedOption(id);
138
+ e.preventDefault();
139
+ }
140
+ }}
141
+ ref={(elem) => elem && (elem.indeterminate = isChecked === null)}
142
+ checked={isChecked || false}
143
+ tabIndex={-1}
144
+ {...checkProps}
145
+ />
146
+ </span>
147
+
148
+ <span className={css(styles.dualListSelectorItemText)}>{text}</span>
149
+ {hasBadge && children && (
150
+ <span className={css(styles.dualListSelectorItemCount)}>
151
+ <Badge {...badgeProps}>{flattenTree((children as React.ReactElement).props.data).length}</Badge>
152
+ </span>
153
+ )}
154
+ </span>
155
+ </div>
156
+ </div>
157
+ {isExpanded && children}
158
+ </li>
159
+ );
160
+ };
161
+
162
+ export const DualListSelectorTreeItem = React.memo(DualListSelectorTreeItemBase, (prevProps, nextProps) => {
163
+ if (!nextProps.useMemo) {
164
+ return false;
165
+ }
166
+
167
+ if (
168
+ prevProps.className !== nextProps.className ||
169
+ prevProps.text !== nextProps.text ||
170
+ prevProps.id !== nextProps.id ||
171
+ prevProps.defaultExpanded !== nextProps.defaultExpanded ||
172
+ prevProps.checkProps !== nextProps.checkProps ||
173
+ prevProps.hasBadge !== nextProps.hasBadge ||
174
+ prevProps.badgeProps !== nextProps.badgeProps ||
175
+ prevProps.isChecked !== nextProps.isChecked ||
176
+ prevProps.itemData !== nextProps.itemData
177
+ ) {
178
+ return false;
179
+ }
180
+
181
+ return true;
182
+ });
183
+
184
+ DualListSelectorTreeItem.displayName = 'DualListSelectorTreeItem';
@@ -0,0 +1,26 @@
1
+ import { render } from '@testing-library/react';
2
+ import { DualListSelectorPane } from '../../DualListSelector';
3
+ import { SearchInput } from '../../../../components/SearchInput';
4
+ import React from 'react';
5
+
6
+ describe('DualListSelector', () => {
7
+ test('basic', () => {
8
+ const { asFragment } = render(<DualListSelectorPane id="basicTest" />);
9
+ expect(asFragment()).toMatchSnapshot();
10
+ });
11
+
12
+ test('with search inputs', () => {
13
+ const { asFragment } = render(<DualListSelectorPane id="searchTest" searchInput={<SearchInput />} />);
14
+ expect(asFragment()).toMatchSnapshot();
15
+ });
16
+
17
+ test('with custom status', () => {
18
+ const { asFragment } = render(<DualListSelectorPane id="statusTest" status="Test status1" />);
19
+ expect(asFragment()).toMatchSnapshot();
20
+ });
21
+
22
+ test('basic with disabled controls', () => {
23
+ const { asFragment } = render(<DualListSelectorPane id="disabledTest" isDisabled />);
24
+ expect(asFragment()).toMatchSnapshot();
25
+ });
26
+ });