@patternfly/react-core 5.4.0-prerelease.2 → 5.4.0-prerelease.3

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 (168) hide show
  1. package/CHANGELOG.md +6 -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 -1
  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/dynamic-modules.json +772 -0
  123. package/dist/esm/components/TreeView/TreeView.d.ts +13 -0
  124. package/dist/esm/components/TreeView/TreeView.d.ts.map +1 -1
  125. package/dist/esm/components/TreeView/TreeView.js +2 -2
  126. package/dist/esm/components/TreeView/TreeView.js.map +1 -1
  127. package/dist/esm/components/TreeView/TreeViewList.d.ts +13 -0
  128. package/dist/esm/components/TreeView/TreeViewList.d.ts.map +1 -1
  129. package/dist/esm/components/TreeView/TreeViewList.js +2 -2
  130. package/dist/esm/components/TreeView/TreeViewList.js.map +1 -1
  131. package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  132. package/dist/esm/components/TreeView/TreeViewListItem.js +8 -8
  133. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  134. package/dist/js/components/TreeView/TreeView.d.ts +13 -0
  135. package/dist/js/components/TreeView/TreeView.d.ts.map +1 -1
  136. package/dist/js/components/TreeView/TreeView.js +2 -2
  137. package/dist/js/components/TreeView/TreeView.js.map +1 -1
  138. package/dist/js/components/TreeView/TreeViewList.d.ts +13 -0
  139. package/dist/js/components/TreeView/TreeViewList.d.ts.map +1 -1
  140. package/dist/js/components/TreeView/TreeViewList.js +2 -2
  141. package/dist/js/components/TreeView/TreeViewList.js.map +1 -1
  142. package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  143. package/dist/js/components/TreeView/TreeViewListItem.js +8 -8
  144. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  145. package/dist/umd/react-core.min.js +1 -1
  146. package/helpers/package.json +1 -1
  147. package/layouts/package.json +1 -1
  148. package/next/package.json +1 -1
  149. package/package.json +2 -2
  150. package/src/components/TreeView/TreeView.tsx +23 -1
  151. package/src/components/TreeView/TreeViewList.tsx +24 -1
  152. package/src/components/TreeView/TreeViewListItem.tsx +13 -7
  153. package/src/components/TreeView/__tests__/__snapshots__/TreeViewList.test.tsx.snap +2 -0
  154. package/src/components/TreeView/__tests__/__snapshots__/TreeViewListItem.test.tsx.snap +2 -0
  155. package/src/components/TreeView/examples/TreeView.md +12 -2
  156. package/src/components/TreeView/examples/TreeViewCompact.tsx +1 -1
  157. package/src/components/TreeView/examples/TreeViewCompactNoBackground.tsx +1 -1
  158. package/src/components/TreeView/examples/TreeViewGuides.tsx +1 -1
  159. package/src/components/TreeView/examples/TreeViewMultiselectable.tsx +86 -0
  160. package/src/components/TreeView/examples/TreeViewSelectionExpansion.tsx +9 -1
  161. package/src/components/TreeView/examples/{TreeViewDefault.tsx → TreeViewSingleSelectable.tsx} +8 -2
  162. package/src/components/TreeView/examples/TreeViewWithActionItems.tsx +8 -1
  163. package/src/components/TreeView/examples/TreeViewWithBadges.tsx +9 -1
  164. package/src/components/TreeView/examples/TreeViewWithCheckboxes.tsx +1 -1
  165. package/src/components/TreeView/examples/TreeViewWithCustomBadges.tsx +9 -1
  166. package/src/components/TreeView/examples/TreeViewWithIcons.tsx +1 -0
  167. package/src/components/TreeView/examples/TreeViewWithMemoization.tsx +8 -1
  168. package/src/components/TreeView/examples/TreeViewWithSearch.tsx +1 -0
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.4.0-prerelease.1","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"5.4.0-prerelease.2","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.4.0-prerelease.1","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"5.4.0-prerelease.2","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.4.0-prerelease.1","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"5.4.0-prerelease.2","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.4.0-prerelease.2",
3
+ "version": "5.4.0-prerelease.3",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -71,5 +71,5 @@
71
71
  "react": "^17 || ^18",
72
72
  "react-dom": "^17 || ^18"
73
73
  },
74
- "gitHead": "340cea48ffda0cf75fee98ff10fff75d8e03f19d"
74
+ "gitHead": "75849b05bb14b3d8f50535a92a65136b4a2cb13b"
75
75
  }
@@ -46,6 +46,14 @@ export interface TreeViewProps {
46
46
  * internal state.
47
47
  */
48
48
  allExpanded?: boolean;
49
+ /** A text string that sets the accessible name of the tree view list. Either this or the aria-labelledby property must
50
+ * be passed in.
51
+ */
52
+ 'aria-label'?: string;
53
+ /** A space separated list of element id's that sets the accessible name of the tree view list. Either
54
+ * this or the aria-label property must be passed in.
55
+ */
56
+ 'aria-labelledby'?: string;
49
57
  /** Class to add if not passed a parentItem property. */
50
58
  className?: string;
51
59
  /** Comparison function for determining active items. */
@@ -72,6 +80,11 @@ export interface TreeViewProps {
72
80
  icon?: React.ReactNode;
73
81
  /** ID of the tree view. */
74
82
  id?: string;
83
+ /** Flag indicating whether multiple nodes can be selected in the tree view. This will also set the
84
+ * aria-multiselectable attribute on the tree view list which is required to be true when multiple selection is intended.
85
+ * Can only be applied to the root tree view list.
86
+ */
87
+ isMultiSelectable?: boolean;
75
88
  /** Callback for item checkbox selection. */
76
89
  onCheck?: (event: React.ChangeEvent<HTMLInputElement>, item: TreeViewDataItem, parentItem: TreeViewDataItem) => void;
77
90
  /** Callback for item selection. */
@@ -104,6 +117,7 @@ export const TreeView: React.FunctionComponent<TreeViewProps> = ({
104
117
  defaultAllExpanded = false,
105
118
  allExpanded,
106
119
  icon,
120
+ isMultiSelectable = false,
107
121
  expandedIcon,
108
122
  parentItem,
109
123
  onSelect,
@@ -115,10 +129,18 @@ export const TreeView: React.FunctionComponent<TreeViewProps> = ({
115
129
  compareItems = (item, itemToCheck) => item.id === itemToCheck.id,
116
130
  className,
117
131
  useMemo,
132
+ 'aria-label': ariaLabel,
133
+ 'aria-labelledby': ariaLabelledby,
118
134
  ...props
119
135
  }: TreeViewProps) => {
120
136
  const treeViewList = (
121
- <TreeViewList isNested={isNested} toolbar={toolbar}>
137
+ <TreeViewList
138
+ isNested={isNested}
139
+ toolbar={toolbar}
140
+ isMultiSelectable={isMultiSelectable}
141
+ aria-label={ariaLabel}
142
+ aria-labelledby={ariaLabelledby}
143
+ >
122
144
  {data.map((item) => (
123
145
  <TreeViewListItem
124
146
  key={item.id?.toString() || item.name?.toString()}
@@ -10,12 +10,28 @@ export interface TreeViewListProps extends React.HTMLProps<HTMLUListElement> {
10
10
  isNested?: boolean;
11
11
  /** Toolbar to display above the tree view. */
12
12
  toolbar?: React.ReactNode;
13
+ /** Flag indicating whether multiple nodes can be selected in the tree view. This will also set the
14
+ * aria-multiselectable attribute on the tree view list which is required to be true when multiple selection is intended.
15
+ * Can only be applied to the root tree view list.
16
+ */
17
+ isMultiSelectable?: boolean;
18
+ /** A text string that sets the accessible name of the tree view list. Either this or the aria-labelledby property must
19
+ * be passed in.
20
+ */
21
+ 'aria-label'?: string;
22
+ /** A space separated list of element id's that sets the accessible name of the tree view list. Either
23
+ * this or the aria-label property must be passed in.
24
+ */
25
+ 'aria-labelledby'?: string;
13
26
  }
14
27
 
15
28
  export const TreeViewList: React.FunctionComponent<TreeViewListProps> = ({
16
29
  isNested = false,
30
+ isMultiSelectable = false,
17
31
  toolbar,
18
32
  children,
33
+ 'aria-label': ariaLabel,
34
+ 'aria-labelledby': ariaLabelledby,
19
35
  ...props
20
36
  }: TreeViewListProps) => (
21
37
  <>
@@ -25,7 +41,14 @@ export const TreeViewList: React.FunctionComponent<TreeViewListProps> = ({
25
41
  <Divider />
26
42
  </React.Fragment>
27
43
  )}
28
- <ul className={css(`${styles.treeView}__list`)} role={isNested ? 'group' : 'tree'} {...props}>
44
+ <ul
45
+ className={css(`${styles.treeView}__list`)}
46
+ role={isNested ? 'group' : 'tree'}
47
+ aria-multiselectable={isNested ? undefined : isMultiSelectable}
48
+ aria-label={ariaLabel}
49
+ aria-labelledby={ariaLabelledby}
50
+ {...props}
51
+ >
29
52
  {children}
30
53
  </ul>
31
54
  </>
@@ -143,6 +143,8 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
143
143
  </span>
144
144
  </ToggleComponent>
145
145
  );
146
+
147
+ const isCheckboxChecked = checkProps.checked === null ? false : checkProps.checked;
146
148
  const renderCheck = (randomId: string) => (
147
149
  <span className={css(styles.treeViewNodeCheck)}>
148
150
  <input
@@ -151,7 +153,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
151
153
  onClick={(evt) => evt.stopPropagation()}
152
154
  ref={(elem) => elem && (elem.indeterminate = checkProps.checked === null)}
153
155
  {...checkProps}
154
- checked={checkProps.checked === null ? false : checkProps.checked}
156
+ checked={isCheckboxChecked}
155
157
  id={randomId}
156
158
  tabIndex={-1}
157
159
  />
@@ -194,6 +196,13 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
194
196
  )}
195
197
  </>
196
198
  );
199
+
200
+ const isSelected =
201
+ (!children || isSelectable) &&
202
+ activeItems &&
203
+ activeItems.length > 0 &&
204
+ activeItems.some((item) => compareItems && item && compareItems(item, itemData));
205
+
197
206
  return (
198
207
  <li
199
208
  id={id}
@@ -201,6 +210,8 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
201
210
  aria-expanded={internalIsExpanded}
202
211
  role="treeitem"
203
212
  tabIndex={-1}
213
+ {...(hasCheckbox && { 'aria-checked': isCheckboxChecked })}
214
+ {...(!hasCheckbox && { 'aria-selected': isSelected })}
204
215
  >
205
216
  <div className={css(styles.treeViewContent)}>
206
217
  <GenerateId prefix={isSelectable ? 'selectable-id' : 'checkbox-id'}>
@@ -209,12 +220,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
209
220
  className={css(
210
221
  styles.treeViewNode,
211
222
  children && (isSelectable || hasCheckbox) && styles.modifiers.selectable,
212
- (!children || isSelectable) &&
213
- activeItems &&
214
- activeItems.length > 0 &&
215
- activeItems.some((item) => compareItems && item && compareItems(item, itemData))
216
- ? styles.modifiers.current
217
- : ''
223
+ isSelected && styles.modifiers.current
218
224
  )}
219
225
  onClick={(evt: React.MouseEvent) => {
220
226
  if (!hasCheckbox) {
@@ -3,6 +3,7 @@
3
3
  exports[`Matches snapshot by default 1`] = `
4
4
  <DocumentFragment>
5
5
  <ul
6
+ aria-multiselectable="false"
6
7
  class="pf-v5-c-tree-view__list"
7
8
  role="tree"
8
9
  >
@@ -20,6 +21,7 @@ exports[`Matches snapshot when toolbar is passed 1`] = `
20
21
  class="pf-v5-c-divider"
21
22
  />
22
23
  <ul
24
+ aria-multiselectable="false"
23
25
  class="pf-v5-c-tree-view__list"
24
26
  role="tree"
25
27
  >
@@ -4,6 +4,7 @@ exports[`Matches snapshot with children 1`] = `
4
4
  <DocumentFragment>
5
5
  <li
6
6
  aria-expanded="false"
7
+ aria-selected="false"
7
8
  class="pf-v5-c-tree-view__list-item"
8
9
  role="treeitem"
9
10
  tabindex="-1"
@@ -56,6 +57,7 @@ exports[`Matches snapshot without children 1`] = `
56
57
  <DocumentFragment>
57
58
  <li
58
59
  aria-expanded="false"
60
+ aria-selected="false"
59
61
  class="pf-v5-c-tree-view__list-item"
60
62
  role="treeitem"
61
63
  tabindex="-1"
@@ -9,9 +9,17 @@ import { FolderIcon, FolderOpenIcon, EllipsisVIcon, ClipboardIcon, HamburgerIcon
9
9
 
10
10
  ## Examples
11
11
 
12
- ### Default
12
+ ### Single selectable
13
13
 
14
- ```ts file='./TreeViewDefault.tsx'
14
+ ```ts file='./TreeViewSingleSelectable.tsx'
15
+
16
+ ```
17
+
18
+ ### Multiselectable
19
+
20
+ A tree view can be setup to allow multiple nodes to be selected. When a tree view is intended to allow multiple selection, the `isMultiSelectable` property must be passed.
21
+
22
+ ```ts file='./TreeViewMultiselectable.tsx'
15
23
 
16
24
  ```
17
25
 
@@ -25,6 +33,8 @@ The `hasSelectableNodes` modifier will separate the expansion and selection beha
25
33
 
26
34
  ### With search
27
35
 
36
+ A search input can be used to filter tree view items. It is recommended that a tree view with more than 7 nodes includes a search input.
37
+
28
38
  ```ts file='./TreeViewWithSearch.tsx'
29
39
 
30
40
  ```
@@ -55,5 +55,5 @@ export const TreeViewCompact: React.FunctionComponent = () => {
55
55
  ]
56
56
  }
57
57
  ];
58
- return <TreeView data={options} variant="compact" />;
58
+ return <TreeView aria-label="Tree View compact example" data={options} variant="compact" />;
59
59
  };
@@ -55,5 +55,5 @@ export const TreeViewCompactNoBackground: React.FunctionComponent = () => {
55
55
  ]
56
56
  }
57
57
  ];
58
- return <TreeView data={options} variant="compactNoBackground" />;
58
+ return <TreeView aria-label="Tree View compact no background example" data={options} variant="compactNoBackground" />;
59
59
  };
@@ -61,5 +61,5 @@ export const GuidesTreeView: React.FunctionComponent = () => {
61
61
  children: [{ name: 'Application 5', id: 'example8-App5' }]
62
62
  }
63
63
  ];
64
- return <TreeView data={options} hasGuides={true} />;
64
+ return <TreeView aria-label="Tree View guides example" data={options} hasGuides={true} />;
65
65
  };
@@ -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}