@patternfly/react-core 4.247.0 → 4.247.1
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 +8 -0
- package/dist/umd/react-core.min.css +2199 -2199
- package/package.json +2 -2
- package/src/demos/Page.md +47 -0
- package/src/demos/examples/DashboardWrapper.js +3 -1
- package/src/demos/examples/Page/PageStickySectionBreadcrumb.tsx +305 -0
- package/src/demos/examples/Page/PageStickySectionGroup.tsx +306 -0
- package/src/demos/examples/Page/PageStickySectionGroupAlternate.tsx +301 -0
- package/src/demos/examples/Page/PageStickySectionGroupUsingPageHeader.tsx +293 -0
- package/src/demos/Page/Page.md +0 -1184
- package/src/demos/Page/imgAvatar.svg +0 -33
- package/src/demos/Page/imgBrand.svg +0 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ApplicationLauncher,
|
|
4
|
+
ApplicationLauncherItem,
|
|
5
|
+
Avatar,
|
|
6
|
+
Brand,
|
|
7
|
+
Breadcrumb,
|
|
8
|
+
BreadcrumbItem,
|
|
9
|
+
Button,
|
|
10
|
+
ButtonVariant,
|
|
11
|
+
Card,
|
|
12
|
+
CardBody,
|
|
13
|
+
Divider,
|
|
14
|
+
Dropdown,
|
|
15
|
+
DropdownGroup,
|
|
16
|
+
DropdownItem,
|
|
17
|
+
DropdownToggle,
|
|
18
|
+
Gallery,
|
|
19
|
+
GalleryItem,
|
|
20
|
+
KebabToggle,
|
|
21
|
+
Masthead,
|
|
22
|
+
MastheadBrand,
|
|
23
|
+
MastheadContent,
|
|
24
|
+
MastheadMain,
|
|
25
|
+
MastheadToggle,
|
|
26
|
+
Nav,
|
|
27
|
+
NavItem,
|
|
28
|
+
NavList,
|
|
29
|
+
Page,
|
|
30
|
+
PageBreadcrumb,
|
|
31
|
+
PageGroup,
|
|
32
|
+
PageSection,
|
|
33
|
+
PageSectionVariants,
|
|
34
|
+
PageSidebar,
|
|
35
|
+
PageToggleButton,
|
|
36
|
+
SkipToContent,
|
|
37
|
+
Text,
|
|
38
|
+
TextContent,
|
|
39
|
+
Toolbar,
|
|
40
|
+
ToolbarContent,
|
|
41
|
+
ToolbarGroup,
|
|
42
|
+
ToolbarItem
|
|
43
|
+
} from '@patternfly/react-core';
|
|
44
|
+
import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
|
|
45
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
46
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
47
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
48
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
49
|
+
import imgAvatar from '@patternfly/react-core/src/components/Avatar/examples/avatarImg.svg';
|
|
50
|
+
|
|
51
|
+
interface NavOnSelectProps {
|
|
52
|
+
groupId: number | string;
|
|
53
|
+
itemId: number | string;
|
|
54
|
+
to: string;
|
|
55
|
+
event: React.FormEvent<HTMLInputElement>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const PageStickySectionGroupAlternate: React.FunctionComponent = () => {
|
|
59
|
+
const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
|
|
60
|
+
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
|
|
61
|
+
const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
|
|
62
|
+
const [isAppLauncherOpen, setIsAppLauncherOpen] = React.useState(false);
|
|
63
|
+
const [activeItem, setActiveItem] = React.useState(1);
|
|
64
|
+
|
|
65
|
+
const onNavSelect = (selectedItem: NavOnSelectProps) => {
|
|
66
|
+
typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const onDropdownToggle = (isOpen: boolean) => {
|
|
70
|
+
setIsDropdownOpen(isOpen);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const onDropdownSelect = () => {
|
|
74
|
+
setIsDropdownOpen(!isDropdownOpen);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const onKebabDropdownToggle = (isOpen: boolean) => {
|
|
78
|
+
setIsKebabDropdownOpen(isOpen);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const onKebabDropdownSelect = () => {
|
|
82
|
+
setIsKebabDropdownOpen(!isKebabDropdownOpen);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const onFullKebabDropdownToggle = (isOpen: boolean) => {
|
|
86
|
+
setIsFullKebabDropdownOpen(isOpen);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const onFullKebabDropdownSelect = () => {
|
|
90
|
+
setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const onAppLauncherToggle = (isOpen: boolean) => {
|
|
94
|
+
setIsAppLauncherOpen(isOpen);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const onAppLauncherSelect = () => {
|
|
98
|
+
setIsAppLauncherOpen(!isAppLauncherOpen);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const kebabDropdownItems = [
|
|
102
|
+
<DropdownItem key="settings">
|
|
103
|
+
<CogIcon /> Settings
|
|
104
|
+
</DropdownItem>,
|
|
105
|
+
<DropdownItem key="help">
|
|
106
|
+
<HelpIcon /> Help
|
|
107
|
+
</DropdownItem>
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
const userDropdownItems = [
|
|
111
|
+
<DropdownGroup key="group 2">
|
|
112
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
113
|
+
<DropdownItem key="group 2 user" component="button">
|
|
114
|
+
User management
|
|
115
|
+
</DropdownItem>
|
|
116
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
117
|
+
</DropdownGroup>
|
|
118
|
+
];
|
|
119
|
+
|
|
120
|
+
const fullKebabDropdownItems = [
|
|
121
|
+
<DropdownGroup key="group 2">
|
|
122
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
123
|
+
<DropdownItem key="group 2 user" component="button">
|
|
124
|
+
User management
|
|
125
|
+
</DropdownItem>
|
|
126
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
127
|
+
</DropdownGroup>,
|
|
128
|
+
<Divider key="divider" />,
|
|
129
|
+
<DropdownItem key="settings">
|
|
130
|
+
<CogIcon /> Settings
|
|
131
|
+
</DropdownItem>,
|
|
132
|
+
<DropdownItem key="help">
|
|
133
|
+
<HelpIcon /> Help
|
|
134
|
+
</DropdownItem>
|
|
135
|
+
];
|
|
136
|
+
|
|
137
|
+
const appLauncherItems = [
|
|
138
|
+
<ApplicationLauncherItem key="application_1a" href="#">
|
|
139
|
+
Application 1 (anchor link)
|
|
140
|
+
</ApplicationLauncherItem>,
|
|
141
|
+
<ApplicationLauncherItem key="application_2a" component="button" onClick={() => alert('Clicked item 2')}>
|
|
142
|
+
Application 2 (button with onClick)
|
|
143
|
+
</ApplicationLauncherItem>
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
const headerToolbar = (
|
|
147
|
+
<Toolbar id="toolbar" isFullHeight isStatic>
|
|
148
|
+
<ToolbarContent>
|
|
149
|
+
<ToolbarGroup
|
|
150
|
+
variant="icon-button-group"
|
|
151
|
+
alignment={{ default: 'alignRight' }}
|
|
152
|
+
spacer={{ default: 'spacerNone', md: 'spacerMd' }}
|
|
153
|
+
>
|
|
154
|
+
<ToolbarItem>
|
|
155
|
+
<Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} />
|
|
156
|
+
</ToolbarItem>
|
|
157
|
+
<ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
|
|
158
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'hidden', lg: 'visible' }}>
|
|
159
|
+
<ApplicationLauncher
|
|
160
|
+
onSelect={onAppLauncherSelect}
|
|
161
|
+
onToggle={onAppLauncherToggle}
|
|
162
|
+
isOpen={isAppLauncherOpen}
|
|
163
|
+
items={appLauncherItems}
|
|
164
|
+
/>
|
|
165
|
+
</ToolbarItem>
|
|
166
|
+
<ToolbarItem>
|
|
167
|
+
<Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
|
|
168
|
+
</ToolbarItem>
|
|
169
|
+
<ToolbarItem>
|
|
170
|
+
<Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
|
|
171
|
+
</ToolbarItem>
|
|
172
|
+
</ToolbarGroup>
|
|
173
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
|
|
174
|
+
<Dropdown
|
|
175
|
+
isPlain
|
|
176
|
+
position="right"
|
|
177
|
+
onSelect={onKebabDropdownSelect}
|
|
178
|
+
toggle={<KebabToggle onToggle={onKebabDropdownToggle} />}
|
|
179
|
+
isOpen={isKebabDropdownOpen}
|
|
180
|
+
dropdownItems={kebabDropdownItems}
|
|
181
|
+
/>
|
|
182
|
+
</ToolbarItem>
|
|
183
|
+
<ToolbarItem visibility={{ md: 'hidden' }}>
|
|
184
|
+
<Dropdown
|
|
185
|
+
isPlain
|
|
186
|
+
position="right"
|
|
187
|
+
onSelect={onFullKebabDropdownSelect}
|
|
188
|
+
toggle={<KebabToggle onToggle={onFullKebabDropdownToggle} />}
|
|
189
|
+
isOpen={isFullKebabDropdownOpen}
|
|
190
|
+
dropdownItems={fullKebabDropdownItems}
|
|
191
|
+
/>
|
|
192
|
+
</ToolbarItem>
|
|
193
|
+
</ToolbarGroup>
|
|
194
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
|
|
195
|
+
<Dropdown
|
|
196
|
+
isFullHeight
|
|
197
|
+
onSelect={onDropdownSelect}
|
|
198
|
+
isOpen={isDropdownOpen}
|
|
199
|
+
toggle={
|
|
200
|
+
<DropdownToggle icon={<Avatar src={imgAvatar} alt="Avatar" />} onToggle={onDropdownToggle}>
|
|
201
|
+
Ned Username
|
|
202
|
+
</DropdownToggle>
|
|
203
|
+
}
|
|
204
|
+
dropdownItems={userDropdownItems}
|
|
205
|
+
/>
|
|
206
|
+
</ToolbarItem>
|
|
207
|
+
</ToolbarContent>
|
|
208
|
+
</Toolbar>
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
const masthead = (
|
|
212
|
+
<Masthead>
|
|
213
|
+
<MastheadToggle>
|
|
214
|
+
<PageToggleButton variant="plain" aria-label="Global navigation">
|
|
215
|
+
<BarsIcon />
|
|
216
|
+
</PageToggleButton>
|
|
217
|
+
</MastheadToggle>
|
|
218
|
+
<MastheadMain>
|
|
219
|
+
<MastheadBrand>
|
|
220
|
+
<Brand
|
|
221
|
+
widths={{ default: '180px', md: '180px', '2xl': '220px' }}
|
|
222
|
+
src="/assets/images/logo__pf--reverse--base.png"
|
|
223
|
+
alt="Fallback patternFly default logo"
|
|
224
|
+
>
|
|
225
|
+
<source media="(min-width: 768px)" srcSet="/assets/images/logo__pf--reverse-on-md.svg" />
|
|
226
|
+
<source srcSet="/assets/images/logo__pf--reverse--base.svg" />
|
|
227
|
+
</Brand>
|
|
228
|
+
</MastheadBrand>
|
|
229
|
+
</MastheadMain>
|
|
230
|
+
<MastheadContent>{headerToolbar}</MastheadContent>
|
|
231
|
+
</Masthead>
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
const pageNav = (
|
|
235
|
+
<Nav onSelect={onNavSelect}>
|
|
236
|
+
<NavList>
|
|
237
|
+
<NavItem itemId={0} isActive={activeItem === 0} to="#system-panel">
|
|
238
|
+
System panel
|
|
239
|
+
</NavItem>
|
|
240
|
+
<NavItem itemId={1} isActive={activeItem === 1} to="#policy">
|
|
241
|
+
Policy
|
|
242
|
+
</NavItem>
|
|
243
|
+
<NavItem itemId={2} isActive={activeItem === 2} to="#auth">
|
|
244
|
+
Authentication
|
|
245
|
+
</NavItem>
|
|
246
|
+
<NavItem itemId={3} isActive={activeItem === 3} to="#network">
|
|
247
|
+
Network services
|
|
248
|
+
</NavItem>
|
|
249
|
+
<NavItem itemId={4} isActive={activeItem === 4} to="#server">
|
|
250
|
+
Server
|
|
251
|
+
</NavItem>
|
|
252
|
+
</NavList>
|
|
253
|
+
</Nav>
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
const sidebar = <PageSidebar nav={pageNav} />;
|
|
257
|
+
|
|
258
|
+
const mainContainerId = 'main-content';
|
|
259
|
+
|
|
260
|
+
const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
|
|
261
|
+
|
|
262
|
+
return (
|
|
263
|
+
<Page
|
|
264
|
+
header={masthead}
|
|
265
|
+
sidebar={sidebar}
|
|
266
|
+
isManagedSidebar
|
|
267
|
+
skipToContent={pageSkipToContent}
|
|
268
|
+
mainContainerId={mainContainerId}
|
|
269
|
+
>
|
|
270
|
+
<PageGroup stickyOnBreakpoint={{ default: 'top' }}>
|
|
271
|
+
<PageBreadcrumb>
|
|
272
|
+
<Breadcrumb>
|
|
273
|
+
<BreadcrumbItem>Section home</BreadcrumbItem>
|
|
274
|
+
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
|
|
275
|
+
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
|
|
276
|
+
<BreadcrumbItem to="#" isActive>
|
|
277
|
+
Section landing
|
|
278
|
+
</BreadcrumbItem>
|
|
279
|
+
</Breadcrumb>
|
|
280
|
+
</PageBreadcrumb>
|
|
281
|
+
<PageSection variant={PageSectionVariants.light} isWidthLimited>
|
|
282
|
+
<TextContent>
|
|
283
|
+
<Text component="h1">Main title</Text>
|
|
284
|
+
<Text component="p">This is a full page demo.</Text>
|
|
285
|
+
</TextContent>
|
|
286
|
+
</PageSection>{' '}
|
|
287
|
+
</PageGroup>
|
|
288
|
+
<PageSection>
|
|
289
|
+
<Gallery hasGutter>
|
|
290
|
+
{Array.apply(0, Array(50)).map((x, i) => (
|
|
291
|
+
<GalleryItem key={i}>
|
|
292
|
+
<Card>
|
|
293
|
+
<CardBody>This is a card</CardBody>
|
|
294
|
+
</Card>
|
|
295
|
+
</GalleryItem>
|
|
296
|
+
))}
|
|
297
|
+
</Gallery>
|
|
298
|
+
</PageSection>
|
|
299
|
+
</Page>
|
|
300
|
+
);
|
|
301
|
+
};
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ApplicationLauncher,
|
|
4
|
+
ApplicationLauncherItem,
|
|
5
|
+
Avatar,
|
|
6
|
+
Brand,
|
|
7
|
+
Breadcrumb,
|
|
8
|
+
BreadcrumbItem,
|
|
9
|
+
Button,
|
|
10
|
+
ButtonVariant,
|
|
11
|
+
Card,
|
|
12
|
+
CardBody,
|
|
13
|
+
Divider,
|
|
14
|
+
Dropdown,
|
|
15
|
+
DropdownGroup,
|
|
16
|
+
DropdownItem,
|
|
17
|
+
DropdownToggle,
|
|
18
|
+
Gallery,
|
|
19
|
+
GalleryItem,
|
|
20
|
+
KebabToggle,
|
|
21
|
+
Nav,
|
|
22
|
+
NavItem,
|
|
23
|
+
NavList,
|
|
24
|
+
Page,
|
|
25
|
+
PageHeader,
|
|
26
|
+
PageHeaderTools,
|
|
27
|
+
PageHeaderToolsGroup,
|
|
28
|
+
PageHeaderToolsItem,
|
|
29
|
+
PageSection,
|
|
30
|
+
PageSectionVariants,
|
|
31
|
+
PageSidebar,
|
|
32
|
+
SkipToContent,
|
|
33
|
+
Text,
|
|
34
|
+
TextContent
|
|
35
|
+
} from '@patternfly/react-core';
|
|
36
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
37
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
38
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
39
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
40
|
+
import imgAvatar from '@patternfly/react-core/src/components/Avatar/examples/avatarImg.svg';
|
|
41
|
+
|
|
42
|
+
interface NavOnSelectProps {
|
|
43
|
+
groupId: number | string;
|
|
44
|
+
itemId: number | string;
|
|
45
|
+
to: string;
|
|
46
|
+
event: React.FormEvent<HTMLInputElement>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const PageStickySectionGroupUsingPageHeader: React.FunctionComponent = () => {
|
|
50
|
+
const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
|
|
51
|
+
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
|
|
52
|
+
const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
|
|
53
|
+
const [isAppLauncherOpen, setIsAppLauncherOpen] = React.useState(false);
|
|
54
|
+
const [activeItem, setActiveItem] = React.useState(1);
|
|
55
|
+
|
|
56
|
+
const onNavSelect = (selectedItem: NavOnSelectProps) => {
|
|
57
|
+
typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const onDropdownToggle = (isOpen: boolean) => {
|
|
61
|
+
setIsDropdownOpen(isOpen);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const onDropdownSelect = () => {
|
|
65
|
+
setIsDropdownOpen(!isDropdownOpen);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const onKebabDropdownToggle = (isOpen: boolean) => {
|
|
69
|
+
setIsKebabDropdownOpen(isOpen);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const onKebabDropdownSelect = () => {
|
|
73
|
+
setIsKebabDropdownOpen(!isKebabDropdownOpen);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const onFullKebabDropdownToggle = (isOpen: boolean) => {
|
|
77
|
+
setIsFullKebabDropdownOpen(isOpen);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const onFullKebabDropdownSelect = () => {
|
|
81
|
+
setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const onAppLauncherToggle = (isOpen: boolean) => {
|
|
85
|
+
setIsAppLauncherOpen(isOpen);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const onAppLauncherSelect = () => {
|
|
89
|
+
setIsAppLauncherOpen(!isAppLauncherOpen);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const dashboardBreadcrumb = (
|
|
93
|
+
<Breadcrumb>
|
|
94
|
+
<BreadcrumbItem>Section home</BreadcrumbItem>
|
|
95
|
+
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
|
|
96
|
+
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
|
|
97
|
+
<BreadcrumbItem to="#" isActive>
|
|
98
|
+
Section landing
|
|
99
|
+
</BreadcrumbItem>
|
|
100
|
+
</Breadcrumb>
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const kebabDropdownItems = [
|
|
104
|
+
<DropdownItem key="settings">
|
|
105
|
+
<CogIcon /> Settings
|
|
106
|
+
</DropdownItem>,
|
|
107
|
+
<DropdownItem key="help">
|
|
108
|
+
<HelpIcon /> Help
|
|
109
|
+
</DropdownItem>
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
const fullKebabDropdownItems = [
|
|
113
|
+
<DropdownGroup key="group 2">
|
|
114
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
115
|
+
<DropdownItem key="group 2 user" component="button">
|
|
116
|
+
User management
|
|
117
|
+
</DropdownItem>
|
|
118
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
119
|
+
</DropdownGroup>,
|
|
120
|
+
<Divider key="divider" />,
|
|
121
|
+
<DropdownItem key="settings">
|
|
122
|
+
<CogIcon /> Settings
|
|
123
|
+
</DropdownItem>,
|
|
124
|
+
<DropdownItem key="help">
|
|
125
|
+
<HelpIcon /> Help
|
|
126
|
+
</DropdownItem>
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
const userDropdownItems = [
|
|
130
|
+
<DropdownGroup key="group 2">
|
|
131
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
132
|
+
<DropdownItem key="group 2 user" component="button">
|
|
133
|
+
User management
|
|
134
|
+
</DropdownItem>
|
|
135
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
136
|
+
</DropdownGroup>
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
const appLauncherItems = [
|
|
140
|
+
<ApplicationLauncherItem key="application_1a" href="#">
|
|
141
|
+
Application 1 (anchor link)
|
|
142
|
+
</ApplicationLauncherItem>,
|
|
143
|
+
<ApplicationLauncherItem key="application_2a" component="button" onClick={() => alert('Clicked item 2')}>
|
|
144
|
+
Application 2 (button with onClick)
|
|
145
|
+
</ApplicationLauncherItem>
|
|
146
|
+
];
|
|
147
|
+
|
|
148
|
+
const pageNav = (
|
|
149
|
+
<Nav onSelect={onNavSelect}>
|
|
150
|
+
<NavList>
|
|
151
|
+
<NavItem itemId={0} isActive={activeItem === 0} to="#system-panel">
|
|
152
|
+
System panel
|
|
153
|
+
</NavItem>
|
|
154
|
+
<NavItem itemId={1} isActive={activeItem === 1} to="#policy">
|
|
155
|
+
Policy
|
|
156
|
+
</NavItem>
|
|
157
|
+
<NavItem itemId={2} isActive={activeItem === 2} to="#auth">
|
|
158
|
+
Authentication
|
|
159
|
+
</NavItem>
|
|
160
|
+
<NavItem itemId={3} isActive={activeItem === 3} to="#network">
|
|
161
|
+
Network services
|
|
162
|
+
</NavItem>
|
|
163
|
+
<NavItem itemId={4} isActive={activeItem === 4} to="#server">
|
|
164
|
+
Server
|
|
165
|
+
</NavItem>
|
|
166
|
+
</NavList>
|
|
167
|
+
</Nav>
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
const sidebar = <PageSidebar nav={pageNav} />;
|
|
171
|
+
|
|
172
|
+
const mainContainerId = 'main-content';
|
|
173
|
+
|
|
174
|
+
const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
|
|
175
|
+
|
|
176
|
+
const headerTools = (
|
|
177
|
+
<PageHeaderTools>
|
|
178
|
+
<PageHeaderToolsGroup>
|
|
179
|
+
<PageHeaderToolsItem>
|
|
180
|
+
<Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} />
|
|
181
|
+
</PageHeaderToolsItem>
|
|
182
|
+
<PageHeaderToolsGroup visibility={{ default: 'hidden', lg: 'visible' }}>
|
|
183
|
+
<PageHeaderToolsItem visibility={{ default: 'hidden', md: 'hidden', lg: 'visible' }}>
|
|
184
|
+
<ApplicationLauncher
|
|
185
|
+
onSelect={onAppLauncherSelect}
|
|
186
|
+
onToggle={onAppLauncherToggle}
|
|
187
|
+
isOpen={isAppLauncherOpen}
|
|
188
|
+
items={appLauncherItems}
|
|
189
|
+
/>
|
|
190
|
+
</PageHeaderToolsItem>
|
|
191
|
+
<PageHeaderToolsItem>
|
|
192
|
+
<Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
|
|
193
|
+
</PageHeaderToolsItem>
|
|
194
|
+
<PageHeaderToolsItem>
|
|
195
|
+
<Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
|
|
196
|
+
</PageHeaderToolsItem>
|
|
197
|
+
</PageHeaderToolsGroup>
|
|
198
|
+
<PageHeaderToolsItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
|
|
199
|
+
<Dropdown
|
|
200
|
+
isPlain
|
|
201
|
+
position="right"
|
|
202
|
+
onSelect={onKebabDropdownSelect}
|
|
203
|
+
toggle={<KebabToggle onToggle={onKebabDropdownToggle} />}
|
|
204
|
+
isOpen={isKebabDropdownOpen}
|
|
205
|
+
dropdownItems={kebabDropdownItems}
|
|
206
|
+
/>
|
|
207
|
+
</PageHeaderToolsItem>
|
|
208
|
+
<PageHeaderToolsItem visibility={{ md: 'hidden' }}>
|
|
209
|
+
<Dropdown
|
|
210
|
+
isPlain
|
|
211
|
+
position="right"
|
|
212
|
+
onSelect={onFullKebabDropdownSelect}
|
|
213
|
+
toggle={<KebabToggle onToggle={onFullKebabDropdownToggle} />}
|
|
214
|
+
isOpen={isFullKebabDropdownOpen}
|
|
215
|
+
dropdownItems={fullKebabDropdownItems}
|
|
216
|
+
/>
|
|
217
|
+
</PageHeaderToolsItem>
|
|
218
|
+
</PageHeaderToolsGroup>
|
|
219
|
+
<PageHeaderToolsItem
|
|
220
|
+
visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
|
|
221
|
+
>
|
|
222
|
+
<Avatar src={imgAvatar} alt="Avatar" />
|
|
223
|
+
</PageHeaderToolsItem>
|
|
224
|
+
<PageHeaderToolsItem
|
|
225
|
+
visibility={{ default: 'hidden', md: 'visible' }} /** this user dropdown is hidden on mobile sizes */
|
|
226
|
+
>
|
|
227
|
+
<Dropdown
|
|
228
|
+
isPlain
|
|
229
|
+
position="right"
|
|
230
|
+
onSelect={onDropdownSelect}
|
|
231
|
+
isOpen={isDropdownOpen}
|
|
232
|
+
toggle={<DropdownToggle onToggle={onDropdownToggle}>Ned Username</DropdownToggle>}
|
|
233
|
+
dropdownItems={userDropdownItems}
|
|
234
|
+
/>
|
|
235
|
+
</PageHeaderToolsItem>
|
|
236
|
+
</PageHeaderTools>
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
const pageHeader = (
|
|
240
|
+
<PageHeader
|
|
241
|
+
logo={
|
|
242
|
+
<Brand
|
|
243
|
+
widths={{ default: '180px', md: '180px', '2xl': '220px' }}
|
|
244
|
+
src="/assets/images/logo__pf--reverse--base.png"
|
|
245
|
+
alt="Fallback patternFly default logo"
|
|
246
|
+
>
|
|
247
|
+
<source media="(min-width: 768px)" srcSet="/assets/images/logo__pf--reverse-on-md.svg" />
|
|
248
|
+
<source srcSet="/assets/images/logo__pf--reverse--base.svg" />
|
|
249
|
+
</Brand>
|
|
250
|
+
}
|
|
251
|
+
headerTools={headerTools}
|
|
252
|
+
showNavToggle
|
|
253
|
+
/>
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
return (
|
|
257
|
+
<Page
|
|
258
|
+
header={pageHeader}
|
|
259
|
+
sidebar={sidebar}
|
|
260
|
+
isManagedSidebar
|
|
261
|
+
skipToContent={pageSkipToContent}
|
|
262
|
+
breadcrumb={dashboardBreadcrumb}
|
|
263
|
+
mainContainerId={mainContainerId}
|
|
264
|
+
isBreadcrumbWidthLimited
|
|
265
|
+
isBreadcrumbGrouped
|
|
266
|
+
additionalGroupedContent={
|
|
267
|
+
<PageSection variant={PageSectionVariants.light} isWidthLimited>
|
|
268
|
+
<TextContent>
|
|
269
|
+
<Text component="h1">Main title</Text>
|
|
270
|
+
<Text component="p">This is a full page demo.</Text>
|
|
271
|
+
</TextContent>
|
|
272
|
+
</PageSection>
|
|
273
|
+
}
|
|
274
|
+
groupProps={{
|
|
275
|
+
stickyOnBreakpoint: {
|
|
276
|
+
default: 'top'
|
|
277
|
+
}
|
|
278
|
+
}}
|
|
279
|
+
>
|
|
280
|
+
<PageSection>
|
|
281
|
+
<Gallery hasGutter>
|
|
282
|
+
{Array.apply(0, Array(50)).map((x, i) => (
|
|
283
|
+
<GalleryItem key={i}>
|
|
284
|
+
<Card>
|
|
285
|
+
<CardBody>This is a card</CardBody>
|
|
286
|
+
</Card>
|
|
287
|
+
</GalleryItem>
|
|
288
|
+
))}
|
|
289
|
+
</Gallery>
|
|
290
|
+
</PageSection>
|
|
291
|
+
</Page>
|
|
292
|
+
);
|
|
293
|
+
};
|