@patternfly/react-core 5.2.0-prerelease.30 → 5.2.0-prerelease.31
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.
- package/CHANGELOG.md +4 -0
- package/components/package.json +1 -1
- package/deprecated/package.json +1 -1
- package/dist/dynamic/components/AboutModal/package.json +1 -1
- package/dist/dynamic/components/Accordion/package.json +1 -1
- package/dist/dynamic/components/ActionList/package.json +1 -1
- package/dist/dynamic/components/Alert/package.json +1 -1
- package/dist/dynamic/components/Avatar/package.json +1 -1
- package/dist/dynamic/components/BackToTop/package.json +1 -1
- package/dist/dynamic/components/Backdrop/package.json +1 -1
- package/dist/dynamic/components/BackgroundImage/package.json +1 -1
- package/dist/dynamic/components/Badge/package.json +1 -1
- package/dist/dynamic/components/Banner/package.json +1 -1
- package/dist/dynamic/components/Brand/package.json +1 -1
- package/dist/dynamic/components/Breadcrumb/package.json +1 -1
- package/dist/dynamic/components/Button/package.json +1 -1
- package/dist/dynamic/components/CalendarMonth/package.json +1 -1
- package/dist/dynamic/components/Card/package.json +1 -1
- package/dist/dynamic/components/Checkbox/package.json +1 -1
- package/dist/dynamic/components/Chip/package.json +1 -1
- package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/DataList/package.json +1 -1
- package/dist/dynamic/components/DatePicker/package.json +1 -1
- package/dist/dynamic/components/DescriptionList/package.json +1 -1
- package/dist/dynamic/components/Divider/package.json +1 -1
- package/dist/dynamic/components/DragDrop/package.json +1 -1
- package/dist/dynamic/components/Drawer/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -1
- package/dist/dynamic/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/components/EmptyState/package.json +1 -1
- package/dist/dynamic/components/ExpandableSection/package.json +1 -1
- package/dist/dynamic/components/FileUpload/package.json +1 -1
- package/dist/dynamic/components/Form/package.json +1 -1
- package/dist/dynamic/components/FormSelect/package.json +1 -1
- package/dist/dynamic/components/HelperText/package.json +1 -1
- package/dist/dynamic/components/Hint/package.json +1 -1
- package/dist/dynamic/components/Icon/package.json +1 -1
- package/dist/dynamic/components/InputGroup/package.json +1 -1
- package/dist/dynamic/components/JumpLinks/package.json +1 -1
- package/dist/dynamic/components/Label/package.json +1 -1
- package/dist/dynamic/components/List/package.json +1 -1
- package/dist/dynamic/components/LoginPage/package.json +1 -1
- package/dist/dynamic/components/Masthead/package.json +1 -1
- package/dist/dynamic/components/Menu/package.json +1 -1
- package/dist/dynamic/components/MenuToggle/package.json +1 -1
- package/dist/dynamic/components/Modal/package.json +1 -1
- package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
- package/dist/dynamic/components/Nav/package.json +1 -1
- package/dist/dynamic/components/NotificationBadge/package.json +1 -1
- package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
- package/dist/dynamic/components/NumberInput/package.json +1 -1
- package/dist/dynamic/components/OverflowMenu/package.json +1 -1
- package/dist/dynamic/components/Page/package.json +1 -1
- package/dist/dynamic/components/Pagination/package.json +1 -1
- package/dist/dynamic/components/Panel/package.json +1 -1
- package/dist/dynamic/components/Popover/package.json +1 -1
- package/dist/dynamic/components/Progress/package.json +1 -1
- package/dist/dynamic/components/ProgressStepper/package.json +1 -1
- package/dist/dynamic/components/Radio/package.json +1 -1
- package/dist/dynamic/components/SearchInput/package.json +1 -1
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic/components/Sidebar/package.json +1 -1
- package/dist/dynamic/components/SimpleList/package.json +1 -1
- package/dist/dynamic/components/Skeleton/package.json +1 -1
- package/dist/dynamic/components/SkipToContent/package.json +1 -1
- package/dist/dynamic/components/Slider/package.json +1 -1
- package/dist/dynamic/components/Spinner/package.json +1 -1
- package/dist/dynamic/components/Switch/package.json +1 -1
- package/dist/dynamic/components/Tabs/package.json +1 -1
- package/dist/dynamic/components/Text/package.json +1 -1
- package/dist/dynamic/components/TextArea/package.json +1 -1
- package/dist/dynamic/components/TextInput/package.json +1 -1
- package/dist/dynamic/components/TextInputGroup/package.json +1 -1
- package/dist/dynamic/components/Tile/package.json +1 -1
- package/dist/dynamic/components/TimePicker/package.json +1 -1
- package/dist/dynamic/components/Timestamp/package.json +1 -1
- package/dist/dynamic/components/Title/package.json +1 -1
- package/dist/dynamic/components/ToggleGroup/package.json +1 -1
- package/dist/dynamic/components/Toolbar/package.json +1 -1
- package/dist/dynamic/components/Tooltip/package.json +1 -1
- package/dist/dynamic/components/TreeView/package.json +1 -1
- package/dist/dynamic/components/Truncate/package.json +1 -1
- package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
- package/dist/dynamic/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
- package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
- package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
- package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
- package/dist/dynamic/deprecated/components/Select/package.json +1 -1
- package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
- package/dist/dynamic/deprecated/components/package.json +1 -1
- package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
- package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
- package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
- package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
- package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
- package/dist/dynamic/helpers/constants/package.json +1 -1
- package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
- package/dist/dynamic/helpers/favorites/package.json +1 -1
- package/dist/dynamic/helpers/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/package.json +1 -1
- package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
- package/dist/dynamic/helpers/typeUtils/package.json +1 -1
- package/dist/dynamic/helpers/useInterval/package.json +1 -1
- package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
- package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
- package/dist/dynamic/helpers/util/package.json +1 -1
- package/dist/dynamic/layouts/Bullseye/package.json +1 -1
- package/dist/dynamic/layouts/Flex/package.json +1 -1
- package/dist/dynamic/layouts/Gallery/package.json +1 -1
- package/dist/dynamic/layouts/Grid/package.json +1 -1
- package/dist/dynamic/layouts/Level/package.json +1 -1
- package/dist/dynamic/layouts/Split/package.json +1 -1
- package/dist/dynamic/layouts/Stack/package.json +1 -1
- package/dist/dynamic/next/components/package.json +1 -1
- package/dist/esm/components/Toolbar/ToolbarToggleGroup.js +1 -1
- package/dist/esm/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
- package/dist/esm/components/TreeView/TreeViewListItem.js +1 -1
- package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
- package/dist/js/components/Toolbar/ToolbarToggleGroup.js +1 -1
- package/dist/js/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
- package/dist/js/components/TreeView/TreeViewListItem.js +1 -1
- package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
- package/dist/umd/react-core.min.js +1 -1
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +2 -2
- package/src/components/Toolbar/ToolbarToggleGroup.tsx +1 -1
- package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +0 -1
- package/src/components/TreeView/TreeViewListItem.tsx +1 -1
- package/src/components/TreeView/__tests__/TreeView.test.tsx +295 -221
- package/src/components/TreeView/__tests__/TreeViewList.test.tsx +52 -0
- package/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +708 -0
- package/src/components/TreeView/__tests__/TreeViewRoot.test.tsx +87 -0
- package/src/components/TreeView/__tests__/TreeViewSearch.test.tsx +93 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +103 -3407
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewList.test.tsx.snap +29 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewListItem.test.tsx.snap +83 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewRoot.test.tsx.snap +16 -0
- package/src/components/TreeView/__tests__/__snapshots__/TreeViewSearch.test.tsx.snap +38 -0
package/helpers/package.json
CHANGED
|
@@ -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.2.0-prerelease.
|
|
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.2.0-prerelease.30","private":true}
|
package/layouts/package.json
CHANGED
|
@@ -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.2.0-prerelease.
|
|
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.2.0-prerelease.30","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.2.0-prerelease.
|
|
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.2.0-prerelease.30","private":true}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/react-core",
|
|
3
|
-
"version": "5.2.0-prerelease.
|
|
3
|
+
"version": "5.2.0-prerelease.31",
|
|
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": "
|
|
74
|
+
"gitHead": "3fa692ce5af87f73509c3131c53dd9669d504794"
|
|
75
75
|
}
|
|
@@ -149,7 +149,7 @@ class ToolbarToggleGroup extends React.Component<ToolbarToggleGroupProps> {
|
|
|
149
149
|
aria-label="Show Filters"
|
|
150
150
|
{...(_isExpanded && { 'aria-expanded': true })}
|
|
151
151
|
aria-haspopup={_isExpanded && this.isContentPopup()}
|
|
152
|
-
aria-controls={expandableContentId}
|
|
152
|
+
aria-controls={_isExpanded ? expandableContentId : undefined}
|
|
153
153
|
ref={this.toggleRef}
|
|
154
154
|
>
|
|
155
155
|
{toggleIcon}
|
|
@@ -198,7 +198,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
|
|
|
198
198
|
<li
|
|
199
199
|
id={id}
|
|
200
200
|
className={css(styles.treeViewListItem, internalIsExpanded && styles.modifiers.expanded)}
|
|
201
|
-
|
|
201
|
+
aria-expanded={internalIsExpanded}
|
|
202
202
|
role="treeitem"
|
|
203
203
|
tabIndex={-1}
|
|
204
204
|
>
|
|
@@ -1,242 +1,316 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { render, screen
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
3
4
|
import { TreeView } from '../TreeView';
|
|
4
|
-
import { Button } from '@patternfly/react-core';
|
|
5
|
-
import FolderIcon from '@patternfly/react-icons/dist/esm/icons/folder-icon';
|
|
6
|
-
import FolderOpenIcon from '@patternfly/react-icons/dist/esm/icons/folder-open-icon';
|
|
7
|
-
import { TreeViewSearch } from '../TreeViewSearch';
|
|
8
|
-
|
|
9
|
-
const options = [
|
|
10
|
-
{
|
|
11
|
-
name: 'ApplicationLauncher',
|
|
12
|
-
id: 'AppLaunch',
|
|
13
|
-
children: [
|
|
14
|
-
{
|
|
15
|
-
name: 'Application 1',
|
|
16
|
-
id: 'App1',
|
|
17
|
-
children: [
|
|
18
|
-
{ name: 'Settings', id: 'App1Settings' },
|
|
19
|
-
{ name: 'Current', id: 'App1Current' }
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: 'Application 2',
|
|
24
|
-
id: 'App2',
|
|
25
|
-
children: [
|
|
26
|
-
{ name: 'Settings', id: 'App2Settings' },
|
|
27
|
-
{
|
|
28
|
-
name: 'Loader',
|
|
29
|
-
id: 'App2Loader',
|
|
30
|
-
children: [
|
|
31
|
-
{ name: 'Loading App 1', id: 'LoadApp1' },
|
|
32
|
-
{ name: 'Loading App 2', id: 'LoadApp2' },
|
|
33
|
-
{ name: 'Loading App 3', id: 'LoadApp3' }
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
defaultExpanded: true
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: 'Cost Management',
|
|
43
|
-
id: 'Cost',
|
|
44
|
-
children: [
|
|
45
|
-
{
|
|
46
|
-
name: 'Application 3',
|
|
47
|
-
id: 'App3',
|
|
48
|
-
children: [
|
|
49
|
-
{ name: 'Settings', id: 'App3Settings' },
|
|
50
|
-
{ name: 'Current', id: 'App3Current' }
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'Sources',
|
|
57
|
-
id: 'Sources',
|
|
58
|
-
children: [{ name: 'Application 4', id: 'App4', children: [{ name: 'Settings', id: 'App4Settings' }] }]
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'Really really really long folder name that overflows the container it is in',
|
|
62
|
-
id: 'Long',
|
|
63
|
-
children: [{ name: 'Application 5', id: 'App5' }]
|
|
64
|
-
}
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
const flagOptions = [
|
|
68
|
-
{
|
|
69
|
-
name: 'ApplicationLauncher',
|
|
70
|
-
id: 'AppLaunch',
|
|
71
|
-
hasCheckbox: true,
|
|
72
|
-
icon: <FolderIcon />,
|
|
73
|
-
expandedIcon: <FolderOpenIcon />,
|
|
74
|
-
children: [
|
|
75
|
-
{
|
|
76
|
-
name: 'Application 1',
|
|
77
|
-
id: 'App1',
|
|
78
|
-
children: [
|
|
79
|
-
{ name: 'Settings', id: 'App1Settings' },
|
|
80
|
-
{ name: 'Current', id: 'App1Current' }
|
|
81
|
-
]
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
name: 'Application 2',
|
|
85
|
-
id: 'App2',
|
|
86
|
-
hasBadge: true,
|
|
87
|
-
children: [
|
|
88
|
-
{ name: 'Settings', id: 'App2Settings', hasCheckbox: true },
|
|
89
|
-
{
|
|
90
|
-
name: 'Loader',
|
|
91
|
-
id: 'App2Loader',
|
|
92
|
-
children: [
|
|
93
|
-
{ name: 'Loading App 1', id: 'LoadApp1' },
|
|
94
|
-
{ name: 'Loading App 2', id: 'LoadApp2' },
|
|
95
|
-
{ name: 'Loading App 3', id: 'LoadApp3' }
|
|
96
|
-
]
|
|
97
|
-
}
|
|
98
|
-
]
|
|
99
|
-
}
|
|
100
|
-
],
|
|
101
|
-
defaultExpanded: true
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
name: 'Cost Management',
|
|
105
|
-
id: 'Cost',
|
|
106
|
-
hasBadge: true,
|
|
107
|
-
action: (
|
|
108
|
-
<Button variant="plain" aria-label="Folder action">
|
|
109
|
-
<FolderIcon />
|
|
110
|
-
</Button>
|
|
111
|
-
),
|
|
112
|
-
children: [
|
|
113
|
-
{
|
|
114
|
-
name: 'Application 3',
|
|
115
|
-
id: 'App3',
|
|
116
|
-
children: [
|
|
117
|
-
{ name: 'Settings', id: 'App3Settings' },
|
|
118
|
-
{ name: 'Current', id: 'App3Current' }
|
|
119
|
-
]
|
|
120
|
-
}
|
|
121
|
-
]
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
name: 'Sources',
|
|
125
|
-
id: 'Sources',
|
|
126
|
-
children: [{ name: 'Application 4', id: 'App4', children: [{ name: 'Settings', id: 'App4Settings' }] }]
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
name: 'Really really really long folder name that overflows the container it is in',
|
|
130
|
-
id: 'Long',
|
|
131
|
-
children: [{ name: 'Application 5', id: 'App5' }]
|
|
132
|
-
}
|
|
133
|
-
];
|
|
134
|
-
|
|
135
|
-
const active = [
|
|
136
|
-
{
|
|
137
|
-
name: 'Application 1',
|
|
138
|
-
id: 'App1',
|
|
139
|
-
children: [
|
|
140
|
-
{ name: 'Settings', id: 'App1Settings' },
|
|
141
|
-
{ name: 'Current', id: 'App1Current' }
|
|
142
|
-
]
|
|
143
|
-
}
|
|
144
|
-
];
|
|
145
|
-
|
|
146
|
-
describe('tree view', () => {
|
|
147
|
-
test('renders basic successfully', () => {
|
|
148
|
-
const { asFragment } = render(<TreeView data={options} onSelect={jest.fn()} />);
|
|
149
|
-
expect(asFragment()).toMatchSnapshot();
|
|
150
|
-
});
|
|
151
5
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
6
|
+
jest.mock('../TreeViewList', () => ({
|
|
7
|
+
TreeViewList: ({ children, isNested, toolbar }) => (
|
|
8
|
+
<div data-testid="TreeViewList-mock">
|
|
9
|
+
<p>{`TreeViewList isNested: ${isNested}`}</p>
|
|
10
|
+
<p>{`TreeViewList toolbar: ${toolbar}`}</p>
|
|
11
|
+
<div data-testid="TreeViewList-children">{children}</div>
|
|
12
|
+
</div>
|
|
13
|
+
)
|
|
14
|
+
}));
|
|
15
|
+
jest.mock('../TreeViewListItem', () => ({
|
|
16
|
+
TreeViewListItem: ({
|
|
17
|
+
action,
|
|
18
|
+
activeItems,
|
|
19
|
+
badgeProps,
|
|
20
|
+
checkProps,
|
|
21
|
+
children,
|
|
22
|
+
compareItems,
|
|
23
|
+
customBadgeContent,
|
|
24
|
+
defaultExpanded,
|
|
25
|
+
expandedIcon,
|
|
26
|
+
hasBadge,
|
|
27
|
+
hasCheckbox,
|
|
28
|
+
icon,
|
|
29
|
+
id,
|
|
30
|
+
isCompact,
|
|
31
|
+
isExpanded,
|
|
32
|
+
isSelectable,
|
|
33
|
+
itemData,
|
|
34
|
+
name,
|
|
35
|
+
onCheck,
|
|
36
|
+
onSelect,
|
|
37
|
+
onExpand,
|
|
38
|
+
onCollapse,
|
|
39
|
+
parentItem,
|
|
40
|
+
title,
|
|
41
|
+
useMemo
|
|
42
|
+
}) => (
|
|
43
|
+
<div data-testid="TreeViewListItem-mock">
|
|
44
|
+
<p>{`TreeViewListItem action: ${action}`}</p>
|
|
45
|
+
<div data-testid="TreeViewListItem-activeItems">{activeItems && activeItems[0].name}</div>
|
|
46
|
+
<p>{`TreeViewListItem badgeProps: ${badgeProps?.id}`}</p>
|
|
47
|
+
<p>{`TreeViewListItem checkProps: ${checkProps?.checked}`}</p>
|
|
48
|
+
<p>{`TreeViewListItem customBadgeContent: ${customBadgeContent}`}</p>
|
|
49
|
+
<p>{`TreeViewListItem defaultExpanded: ${defaultExpanded}`}</p>
|
|
50
|
+
<p>{`TreeViewListItem expandedIcon: ${expandedIcon}`}</p>
|
|
51
|
+
<p>{`TreeViewListItem hasBadge: ${hasBadge}`}</p>
|
|
52
|
+
<p>{`TreeViewListItem hasCheckbox: ${hasCheckbox}`}</p>
|
|
53
|
+
<p>{`TreeViewListItem icon: ${icon}`}</p>
|
|
54
|
+
<p>{`TreeViewListItem id: ${id}`}</p>
|
|
55
|
+
<p>{`TreeViewListItem isCompact: ${isCompact}`}</p>
|
|
56
|
+
<p>{`TreeViewListItem isExpanded: ${isExpanded}`}</p>
|
|
57
|
+
<p>{`TreeViewListItem isSelectable: ${isSelectable}`}</p>
|
|
58
|
+
<p>{`TreeViewListItem itemData: ${itemData.name}`}</p>
|
|
59
|
+
<p>{`TreeViewListItem name: ${name}`}</p>
|
|
60
|
+
<p>{`TreeViewListItem parentItem: ${parentItem?.name}`}</p>
|
|
61
|
+
<p>{`TreeViewListItem title: ${title}`}</p>
|
|
62
|
+
<p>{`TreeViewListItem useMemo: ${useMemo}`}</p>
|
|
63
|
+
<button onClick={compareItems}>compareItems clicker</button>
|
|
64
|
+
<button onClick={onCheck}>onCheck clicker</button>
|
|
65
|
+
<button onClick={onSelect}>onSelect clicker</button>
|
|
66
|
+
<button onClick={onExpand}>onExpand clicker</button>
|
|
67
|
+
<button onClick={onCollapse}>onCollapse clicker</button>
|
|
68
|
+
<div data-testid="TreeViewListItem-children">{children}</div>
|
|
69
|
+
</div>
|
|
70
|
+
)
|
|
71
|
+
}));
|
|
72
|
+
jest.mock('../TreeViewRoot', () => ({
|
|
73
|
+
TreeViewRoot: ({ children, hasCheckboxes, hasGuides, hasSelectableNodes, variant, className }) => (
|
|
74
|
+
<div data-testid="TreeViewRoot-mock">
|
|
75
|
+
<p>{`TreeViewRoot hasCheckboxes: ${hasCheckboxes}`}</p>
|
|
76
|
+
<p>{`TreeViewRoot hasGuides: ${hasGuides}`}</p>
|
|
77
|
+
<p>{`TreeViewRoot hasSelectableNodes: ${hasSelectableNodes}`}</p>
|
|
78
|
+
<p>{`TreeViewRoot variant: ${variant}`}</p>
|
|
79
|
+
<p>{`TreeViewRoot className: ${className}`}</p>
|
|
80
|
+
<div data-testid="TreeViewRoot-children">{children}</div>
|
|
81
|
+
</div>
|
|
82
|
+
)
|
|
83
|
+
}));
|
|
180
84
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
});
|
|
85
|
+
const basicData = {
|
|
86
|
+
name: 'Basic data name'
|
|
87
|
+
};
|
|
185
88
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
89
|
+
test('Passes hasSelectableNodes to TreeViewRoot', () => {
|
|
90
|
+
render(<TreeView hasSelectableNodes data={[basicData]} />);
|
|
91
|
+
|
|
92
|
+
expect(screen.getByText('TreeViewRoot hasSelectableNodes: true')).toBeVisible();
|
|
93
|
+
});
|
|
94
|
+
test('Passes hasCheckboxes to TreeViewRoot', () => {
|
|
95
|
+
render(<TreeView hasCheckboxes data={[basicData]} />);
|
|
96
|
+
|
|
97
|
+
expect(screen.getByText('TreeViewRoot hasCheckboxes: true')).toBeVisible();
|
|
98
|
+
});
|
|
99
|
+
test('Passes hasGuides to TreeViewRoot', () => {
|
|
100
|
+
render(<TreeView hasGuides data={[basicData]} />);
|
|
101
|
+
|
|
102
|
+
expect(screen.getByText('TreeViewRoot hasGuides: true')).toBeVisible();
|
|
103
|
+
});
|
|
104
|
+
test('Passes variant to TreeViewRoot', () => {
|
|
105
|
+
render(<TreeView variant="compact" data={[basicData]} />);
|
|
106
|
+
|
|
107
|
+
expect(screen.getByText('TreeViewRoot variant: compact')).toBeVisible();
|
|
108
|
+
});
|
|
109
|
+
test('Passes className to TreeViewRoot', () => {
|
|
110
|
+
render(<TreeView className="test-class" data={[basicData]} />);
|
|
111
|
+
|
|
112
|
+
expect(screen.getByText('TreeViewRoot className: test-class')).toBeVisible();
|
|
113
|
+
});
|
|
114
|
+
test('Passes data as children TreeViewRoot', () => {
|
|
115
|
+
render(<TreeView data={[basicData]} />);
|
|
116
|
+
|
|
117
|
+
expect(screen.getByTestId('TreeViewRoot-children')).toContainHTML('TreeViewListItem name: Basic data name');
|
|
118
|
+
});
|
|
119
|
+
test('Does not render TreeViewRoot when parentItem is passed', () => {
|
|
120
|
+
render(<TreeView data={[basicData]} parentItem={{ name: 'Parent name' }} />);
|
|
121
|
+
|
|
122
|
+
expect(screen.queryByTestId('TreeViewRoot-mock')).not.toBeInTheDocument();
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('Passes isNested to TreeViewList', () => {
|
|
126
|
+
render(<TreeView isNested data={[basicData]} />);
|
|
127
|
+
|
|
128
|
+
expect(screen.getByText('TreeViewList isNested: true')).toBeVisible();
|
|
129
|
+
});
|
|
130
|
+
test('Passes toolbar to TreeViewList', () => {
|
|
131
|
+
render(<TreeView toolbar="Toolbar content" data={[basicData]} />);
|
|
132
|
+
|
|
133
|
+
expect(screen.getByText('TreeViewList toolbar: Toolbar content')).toBeVisible();
|
|
134
|
+
});
|
|
135
|
+
test('Passes data as children TreeViewList', () => {
|
|
136
|
+
render(<TreeView data={[basicData]} />);
|
|
192
137
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
138
|
+
expect(screen.getByTestId('TreeViewList-children')).toContainHTML('TreeViewListItem name: Basic data name');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('Passes data action to TreeViewListItem', () => {
|
|
142
|
+
render(<TreeView data={[{ ...basicData, action: 'Item action' }]} />);
|
|
143
|
+
|
|
144
|
+
expect(screen.getByText('TreeViewListItem action: Item action')).toBeVisible();
|
|
145
|
+
});
|
|
146
|
+
test('Passes activeItems to TreeViewListItem', () => {
|
|
147
|
+
render(<TreeView data={[basicData]} activeItems={[{ name: 'Active item name' }]} />);
|
|
148
|
+
|
|
149
|
+
expect(screen.getByTestId('TreeViewListItem-activeItems')).toHaveTextContent('Active item name');
|
|
150
|
+
});
|
|
151
|
+
test('Passes data badgeProps to TreeViewListItem', () => {
|
|
152
|
+
render(<TreeView data={[{ ...basicData, badgeProps: { id: 'test-id' } }]} />);
|
|
153
|
+
|
|
154
|
+
expect(screen.getByText('TreeViewListItem badgeProps: test-id')).toBeVisible();
|
|
155
|
+
});
|
|
156
|
+
test('Passes data checkProps to TreeViewListItem', () => {
|
|
157
|
+
render(<TreeView data={[{ ...basicData, checkProps: { checked: true } }]} />);
|
|
158
|
+
|
|
159
|
+
expect(screen.getByText('TreeViewListItem checkProps: true')).toBeVisible();
|
|
160
|
+
});
|
|
161
|
+
test('Passes data customBadgeContent to TreeViewListItem', () => {
|
|
162
|
+
render(<TreeView data={[{ ...basicData, customBadgeContent: 'Custom badge' }]} />);
|
|
163
|
+
|
|
164
|
+
expect(screen.getByText('TreeViewListItem customBadgeContent: Custom badge')).toBeVisible();
|
|
165
|
+
});
|
|
166
|
+
test('Passes data defaultExpanded to TreeViewListItem', () => {
|
|
167
|
+
render(<TreeView data={[{ ...basicData, defaultExpanded: true }]} />);
|
|
168
|
+
|
|
169
|
+
expect(screen.getByText('TreeViewListItem defaultExpanded: true')).toBeVisible();
|
|
170
|
+
});
|
|
171
|
+
test('Passes defaultAllExpanded to TreeViewListItem', () => {
|
|
172
|
+
render(<TreeView data={[basicData]} defaultAllExpanded />);
|
|
173
|
+
|
|
174
|
+
expect(screen.getByText('TreeViewListItem defaultExpanded: true')).toBeVisible();
|
|
175
|
+
});
|
|
176
|
+
test('Passes data expandedIcon to TreeViewListItem', () => {
|
|
177
|
+
render(<TreeView data={[{ ...basicData, expandedIcon: 'Expanded icon' }]} />);
|
|
178
|
+
|
|
179
|
+
expect(screen.getByText('TreeViewListItem expandedIcon: Expanded icon')).toBeVisible();
|
|
180
|
+
});
|
|
181
|
+
test('Passes expandedIcon to TreeViewListItem', () => {
|
|
182
|
+
render(<TreeView data={[basicData]} expandedIcon="Expanded icon" />);
|
|
183
|
+
|
|
184
|
+
expect(screen.getByText('TreeViewListItem expandedIcon: Expanded icon')).toBeVisible();
|
|
185
|
+
});
|
|
186
|
+
test('Passes data hasBadge to TreeViewListItem', () => {
|
|
187
|
+
render(<TreeView data={[{ ...basicData, hasBadge: true }]} />);
|
|
188
|
+
|
|
189
|
+
expect(screen.getByText('TreeViewListItem hasBadge: true')).toBeVisible();
|
|
190
|
+
});
|
|
191
|
+
test('Passes hasBadges to TreeViewListItem', () => {
|
|
192
|
+
render(<TreeView data={[basicData]} hasBadges={true} />);
|
|
193
|
+
|
|
194
|
+
expect(screen.getByText('TreeViewListItem hasBadge: true')).toBeVisible();
|
|
195
|
+
});
|
|
196
|
+
test('Passes data hasCheckbox to TreeViewListItem', () => {
|
|
197
|
+
render(<TreeView data={[{ ...basicData, hasCheckbox: true }]} />);
|
|
198
|
+
|
|
199
|
+
expect(screen.getByText('TreeViewListItem hasCheckbox: true')).toBeVisible();
|
|
200
|
+
});
|
|
201
|
+
test('Passes hasCheckboxes to TreeViewListItem', () => {
|
|
202
|
+
render(<TreeView data={[basicData]} hasCheckboxes={true} />);
|
|
203
|
+
|
|
204
|
+
expect(screen.getByText('TreeViewListItem hasCheckbox: true')).toBeVisible();
|
|
205
|
+
});
|
|
206
|
+
test('Passes data icon to TreeViewListItem', () => {
|
|
207
|
+
render(<TreeView data={[{ ...basicData, icon: 'Icon content' }]} />);
|
|
208
|
+
|
|
209
|
+
expect(screen.getByText('TreeViewListItem icon: Icon content')).toBeVisible();
|
|
210
|
+
});
|
|
211
|
+
test('Passes icon to TreeViewListItem', () => {
|
|
212
|
+
render(<TreeView data={[basicData]} icon="Icon content" />);
|
|
213
|
+
|
|
214
|
+
expect(screen.getByText('TreeViewListItem icon: Icon content')).toBeVisible();
|
|
215
|
+
});
|
|
216
|
+
test('Passes data id to TreeViewListItem', () => {
|
|
217
|
+
render(<TreeView data={[{ ...basicData, id: 'test-id' }]} />);
|
|
218
|
+
|
|
219
|
+
expect(screen.getByText('TreeViewListItem id: test-id')).toBeVisible();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
['default', 'compact', 'compactNoBackground'].forEach((variant) => {
|
|
223
|
+
test(`Passes isCompact to TreeViewListItem when variant=${variant}`, () => {
|
|
224
|
+
render(<TreeView data={[basicData]} variant={variant as 'default' | 'compact' | 'compactNoBackground'} />);
|
|
225
|
+
|
|
226
|
+
expect(screen.getByText(`TreeViewListItem isCompact: ${variant === 'default' ? 'false' : 'true'}`)).toBeVisible();
|
|
198
227
|
});
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test('Passes allExpanded to TreeViewListItem isExpanded prop', () => {
|
|
231
|
+
render(<TreeView data={[basicData]} allExpanded />);
|
|
232
|
+
|
|
233
|
+
expect(screen.getByText('TreeViewListItem isExpanded: true')).toBeVisible();
|
|
234
|
+
});
|
|
235
|
+
test('Passes hasSelectableNodes to TreeViewListItem isSelectable prop', () => {
|
|
236
|
+
render(<TreeView data={[basicData]} hasSelectableNodes />);
|
|
237
|
+
|
|
238
|
+
expect(screen.getByText('TreeViewListItem isSelectable: true')).toBeVisible();
|
|
239
|
+
});
|
|
240
|
+
test('Passes data to TreeViewListItem itemData prop', () => {
|
|
241
|
+
render(<TreeView data={[{ name: 'itemData name' }]} />);
|
|
242
|
+
|
|
243
|
+
expect(screen.getByText('TreeViewListItem itemData: itemData name')).toBeVisible();
|
|
244
|
+
});
|
|
245
|
+
test('Passes data.name to TreeViewListItem name prop', () => {
|
|
246
|
+
render(<TreeView data={[basicData]} />);
|
|
199
247
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
248
|
+
expect(screen.getByText('TreeViewListItem name: Basic data name')).toBeVisible();
|
|
249
|
+
});
|
|
250
|
+
test('Passes parentItem to TreeViewListItem', () => {
|
|
251
|
+
render(<TreeView data={[basicData]} parentItem={{ name: 'Parent name' }} />);
|
|
252
|
+
|
|
253
|
+
expect(screen.getByText('TreeViewListItem parentItem: Parent name')).toBeVisible();
|
|
254
|
+
});
|
|
255
|
+
test('Passes data.title to TreeViewListItem', () => {
|
|
256
|
+
render(<TreeView data={[{ ...basicData, title: 'Basic data title' }]} />);
|
|
257
|
+
|
|
258
|
+
expect(screen.getByText('TreeViewListItem title: Basic data title')).toBeVisible();
|
|
259
|
+
});
|
|
260
|
+
test('Passes useMemo to TreeViewListItem', () => {
|
|
261
|
+
render(<TreeView data={[basicData]} useMemo={true} />);
|
|
262
|
+
|
|
263
|
+
expect(screen.getByText('TreeViewListItem useMemo: true')).toBeVisible();
|
|
264
|
+
});
|
|
265
|
+
test('Passes data.children to TreeViewListItem', () => {
|
|
266
|
+
render(<TreeView data={[{ ...basicData, children: [{ name: 'Child 1' }] }]} />);
|
|
267
|
+
|
|
268
|
+
expect(screen.getByText('TreeViewListItem name: Child 1')).toBeVisible();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
describe('Passes callback props to TreeViewListItem', () => {
|
|
272
|
+
const user = userEvent.setup();
|
|
273
|
+
const callbackMock = jest.fn();
|
|
274
|
+
|
|
275
|
+
test('Passes compareItems', async () => {
|
|
276
|
+
render(<TreeView data={[basicData]} compareItems={callbackMock} />);
|
|
277
|
+
|
|
278
|
+
await user.click(screen.getByRole('button', { name: 'compareItems clicker' }));
|
|
279
|
+
|
|
280
|
+
expect(callbackMock).toHaveBeenCalledTimes(1);
|
|
203
281
|
});
|
|
282
|
+
test('Passes onCheck', async () => {
|
|
283
|
+
render(<TreeView data={[basicData]} onCheck={callbackMock} />);
|
|
284
|
+
|
|
285
|
+
await user.click(screen.getByRole('button', { name: 'onCheck clicker' }));
|
|
204
286
|
|
|
205
|
-
|
|
206
|
-
const { asFragment } = render(
|
|
207
|
-
<TreeView
|
|
208
|
-
data={options}
|
|
209
|
-
activeItems={active}
|
|
210
|
-
onSelect={jest.fn()}
|
|
211
|
-
icon={<FolderIcon />}
|
|
212
|
-
expandedIcon={<FolderOpenIcon />}
|
|
213
|
-
/>
|
|
214
|
-
);
|
|
215
|
-
expect(asFragment()).toMatchSnapshot();
|
|
287
|
+
expect(callbackMock).toHaveBeenCalledTimes(1);
|
|
216
288
|
});
|
|
289
|
+
test('Passes onSelect', async () => {
|
|
290
|
+
render(<TreeView data={[basicData]} onSelect={callbackMock} />);
|
|
217
291
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
expect(
|
|
292
|
+
await user.click(screen.getByRole('button', { name: 'onSelect clicker' }));
|
|
293
|
+
|
|
294
|
+
expect(callbackMock).toHaveBeenCalledTimes(1);
|
|
221
295
|
});
|
|
296
|
+
test('Passes onExpand', async () => {
|
|
297
|
+
render(<TreeView data={[basicData]} onExpand={callbackMock} />);
|
|
298
|
+
|
|
299
|
+
await user.click(screen.getByRole('button', { name: 'onExpand clicker' }));
|
|
222
300
|
|
|
223
|
-
|
|
224
|
-
const { asFragment } = render(<TreeView data={flagOptions} activeItems={active} onSelect={jest.fn()} />);
|
|
225
|
-
expect(asFragment()).toMatchSnapshot();
|
|
301
|
+
expect(callbackMock).toHaveBeenCalledTimes(1);
|
|
226
302
|
});
|
|
227
|
-
|
|
303
|
+
test('Passes onCollapse', async () => {
|
|
304
|
+
render(<TreeView data={[basicData]} onCollapse={callbackMock} />);
|
|
228
305
|
|
|
229
|
-
|
|
230
|
-
const { asFragment } = render(<TreeView data={options} onSelect={jest.fn()} hasGuides={true} />);
|
|
231
|
-
expect(asFragment()).toMatchSnapshot();
|
|
232
|
-
});
|
|
306
|
+
await user.click(screen.getByRole('button', { name: 'onCollapse clicker' }));
|
|
233
307
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
expect(asFragment()).toMatchSnapshot();
|
|
308
|
+
expect(callbackMock).toHaveBeenCalledTimes(1);
|
|
309
|
+
});
|
|
237
310
|
});
|
|
238
311
|
|
|
239
|
-
test('
|
|
240
|
-
const { asFragment } = render(<TreeView data={
|
|
312
|
+
test('Matches snapshot', () => {
|
|
313
|
+
const { asFragment } = render(<TreeView data={[basicData]} />);
|
|
314
|
+
|
|
241
315
|
expect(asFragment()).toMatchSnapshot();
|
|
242
316
|
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import { TreeViewList } from '../TreeViewList';
|
|
4
|
+
import styles from '@patternfly/react-styles/css/components/TreeView/tree-view';
|
|
5
|
+
|
|
6
|
+
test(`Renders with class ${styles.treeView}__list by default`, () => {
|
|
7
|
+
render(<TreeViewList>Content</TreeViewList>);
|
|
8
|
+
|
|
9
|
+
expect(screen.getByRole('tree')).toHaveClass(`${styles.treeView}__list`, { exact: true });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test(`Renders with role="tree" by default`, () => {
|
|
13
|
+
render(<TreeViewList>Content</TreeViewList>);
|
|
14
|
+
|
|
15
|
+
expect(screen.getByRole('tree')).toHaveTextContent('Content');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test(`Renders with role="group" when isNested is true`, () => {
|
|
19
|
+
render(<TreeViewList isNested>Content</TreeViewList>);
|
|
20
|
+
|
|
21
|
+
expect(screen.getByRole('group')).toHaveTextContent('Content');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test(`Spreads additional props`, () => {
|
|
25
|
+
render(<TreeViewList id="test-id">Content</TreeViewList>);
|
|
26
|
+
|
|
27
|
+
expect(screen.getByRole('tree')).toHaveAttribute('id', 'test-id');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test(`Renders toolbar content when toolbar prop is passed`, () => {
|
|
31
|
+
render(<TreeViewList toolbar="Toolbar content">Content</TreeViewList>);
|
|
32
|
+
|
|
33
|
+
expect(screen.getByText('Toolbar content')).toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test(`Does not render toolbar content when toolbar prop is not passed`, () => {
|
|
37
|
+
render(<TreeViewList>Content</TreeViewList>);
|
|
38
|
+
|
|
39
|
+
expect(screen.queryByRole('separator')).not.toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('Matches snapshot by default', () => {
|
|
43
|
+
const { asFragment } = render(<TreeViewList>Content</TreeViewList>);
|
|
44
|
+
|
|
45
|
+
expect(asFragment()).toMatchSnapshot();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('Matches snapshot when toolbar is passed', () => {
|
|
49
|
+
const { asFragment } = render(<TreeViewList toolbar={<div>Toolbar content</div>}>Content</TreeViewList>);
|
|
50
|
+
|
|
51
|
+
expect(asFragment()).toMatchSnapshot();
|
|
52
|
+
});
|