@patternfly/react-core 5.2.0-prerelease.12 → 5.2.0-prerelease.13
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 +6 -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/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/esm/components/InputGroup/InputGroup.js +1 -51
- package/dist/esm/components/InputGroup/InputGroup.js.map +1 -1
- package/dist/js/components/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/js/components/InputGroup/InputGroup.js +1 -51
- package/dist/js/components/InputGroup/InputGroup.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/InputGroup/InputGroup.tsx +1 -53
- package/src/components/InputGroup/__tests__/InputGroup.test.tsx +7 -44
- package/src/components/NumberInput/__tests__/NumberInput.test.tsx +0 -1
- package/src/demos/Nav.md +10 -1673
- package/src/demos/examples/Nav/NavDefault.tsx +98 -0
- package/src/demos/examples/Nav/NavDrilldown.tsx +2 -0
- package/src/demos/examples/Nav/NavExpandable.tsx +124 -0
- package/src/demos/examples/Nav/NavFlyout.tsx +278 -0
- package/src/demos/examples/Nav/NavGrouped.tsx +99 -0
- package/src/demos/examples/Nav/NavHorizontal.tsx +237 -0
- package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +297 -0
- package/src/demos/examples/Nav/NavManual.tsx +273 -0
- package/src/demos/examples/Nav/NavWithSubnav.tsx +142 -0
- package/src/demos/examples/Nav/deprecated/NavLight.tsx +96 -0
- package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +92 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Avatar,
|
|
4
|
+
Brand,
|
|
5
|
+
Button,
|
|
6
|
+
ButtonVariant,
|
|
7
|
+
Card,
|
|
8
|
+
CardBody,
|
|
9
|
+
Divider,
|
|
10
|
+
Dropdown,
|
|
11
|
+
DropdownGroup,
|
|
12
|
+
DropdownItem,
|
|
13
|
+
DropdownList,
|
|
14
|
+
Gallery,
|
|
15
|
+
GalleryItem,
|
|
16
|
+
Masthead,
|
|
17
|
+
MastheadMain,
|
|
18
|
+
MastheadBrand,
|
|
19
|
+
MastheadContent,
|
|
20
|
+
MenuToggle,
|
|
21
|
+
Nav,
|
|
22
|
+
NavItem,
|
|
23
|
+
NavList,
|
|
24
|
+
Page,
|
|
25
|
+
PageSection,
|
|
26
|
+
PageSectionVariants,
|
|
27
|
+
SkipToContent,
|
|
28
|
+
TextContent,
|
|
29
|
+
Text,
|
|
30
|
+
Toolbar,
|
|
31
|
+
ToolbarContent,
|
|
32
|
+
ToolbarGroup,
|
|
33
|
+
ToolbarItem
|
|
34
|
+
} from '@patternfly/react-core';
|
|
35
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
36
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
37
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
38
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
39
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
40
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
41
|
+
import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
|
|
42
|
+
import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
43
|
+
|
|
44
|
+
export const NavHorizontal: React.FunctionComponent = () => {
|
|
45
|
+
const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
|
|
46
|
+
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
|
|
47
|
+
const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
|
|
48
|
+
const [activeItem, setActiveItem] = React.useState<string | number>(0);
|
|
49
|
+
|
|
50
|
+
const onNavSelect = (
|
|
51
|
+
_event: React.FormEvent<HTMLInputElement>,
|
|
52
|
+
selectedItem: {
|
|
53
|
+
groupId: number | string;
|
|
54
|
+
itemId: number | string;
|
|
55
|
+
to: string;
|
|
56
|
+
}
|
|
57
|
+
) => setActiveItem(selectedItem.itemId);
|
|
58
|
+
|
|
59
|
+
const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
|
|
60
|
+
const onDropdownSelect = () => setIsDropdownOpen(false);
|
|
61
|
+
const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
|
|
62
|
+
const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
|
|
63
|
+
const onFullKebabToggle = () => setIsFullKebabDropdownOpen((prevState) => !prevState);
|
|
64
|
+
const onFullKebabSelect = () => setIsFullKebabDropdownOpen(false);
|
|
65
|
+
|
|
66
|
+
const PageNav = (
|
|
67
|
+
<Nav onSelect={onNavSelect} aria-label="Nav" variant="horizontal">
|
|
68
|
+
<NavList>
|
|
69
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
70
|
+
<NavItem preventDefault itemId={0} isActive={activeItem === 0} to="#">
|
|
71
|
+
System Panel
|
|
72
|
+
</NavItem>
|
|
73
|
+
<NavItem preventDefault itemId={1} isActive={activeItem === 1} to="#">
|
|
74
|
+
Policy
|
|
75
|
+
</NavItem>
|
|
76
|
+
<NavItem preventDefault itemId={2} isActive={activeItem === 2} to="#">
|
|
77
|
+
Authentication
|
|
78
|
+
</NavItem>
|
|
79
|
+
<NavItem preventDefault itemId={3} isActive={activeItem === 3} to="#">
|
|
80
|
+
Network Services
|
|
81
|
+
</NavItem>
|
|
82
|
+
<NavItem preventDefault itemId={4} isActive={activeItem === 4} to="#">
|
|
83
|
+
Server
|
|
84
|
+
</NavItem>
|
|
85
|
+
</NavList>
|
|
86
|
+
</Nav>
|
|
87
|
+
);
|
|
88
|
+
const kebabDropdownItems = (
|
|
89
|
+
<>
|
|
90
|
+
<DropdownItem>
|
|
91
|
+
<CogIcon /> Settings
|
|
92
|
+
</DropdownItem>
|
|
93
|
+
<DropdownItem>
|
|
94
|
+
<HelpIcon /> Help
|
|
95
|
+
</DropdownItem>
|
|
96
|
+
</>
|
|
97
|
+
);
|
|
98
|
+
const userDropdownItems = (
|
|
99
|
+
<>
|
|
100
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
101
|
+
<DropdownItem key="group 2 user">User management</DropdownItem>
|
|
102
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
103
|
+
</>
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const headerToolbar = (
|
|
107
|
+
<Toolbar id="toolbar" isFullHeight isStatic>
|
|
108
|
+
<ToolbarContent>
|
|
109
|
+
<ToolbarItem isOverflowContainer>{PageNav}</ToolbarItem>
|
|
110
|
+
<ToolbarGroup
|
|
111
|
+
variant="icon-button-group"
|
|
112
|
+
align={{ default: 'alignRight' }}
|
|
113
|
+
spacer={{ default: 'spacerNone', md: 'spacerMd' }}
|
|
114
|
+
>
|
|
115
|
+
<ToolbarItem>
|
|
116
|
+
<Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} onClick={() => {}} />
|
|
117
|
+
</ToolbarItem>
|
|
118
|
+
<ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
|
|
119
|
+
<ToolbarItem>
|
|
120
|
+
<Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
|
|
121
|
+
</ToolbarItem>
|
|
122
|
+
<ToolbarItem>
|
|
123
|
+
<Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
|
|
124
|
+
</ToolbarItem>
|
|
125
|
+
</ToolbarGroup>
|
|
126
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
|
|
127
|
+
<Dropdown
|
|
128
|
+
isOpen={isKebabDropdownOpen}
|
|
129
|
+
onSelect={onKebabDropdownSelect}
|
|
130
|
+
onOpenChange={setIsKebabDropdownOpen}
|
|
131
|
+
popperProps={{ position: 'right' }}
|
|
132
|
+
toggle={(toggleRef) => (
|
|
133
|
+
<MenuToggle
|
|
134
|
+
ref={toggleRef}
|
|
135
|
+
isExpanded={isKebabDropdownOpen}
|
|
136
|
+
onClick={onKebabDropdownToggle}
|
|
137
|
+
variant="plain"
|
|
138
|
+
aria-label="Settings and help"
|
|
139
|
+
>
|
|
140
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
141
|
+
</MenuToggle>
|
|
142
|
+
)}
|
|
143
|
+
>
|
|
144
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
145
|
+
</Dropdown>
|
|
146
|
+
</ToolbarItem>
|
|
147
|
+
<ToolbarItem visibility={{ md: 'hidden' }}>
|
|
148
|
+
<Dropdown
|
|
149
|
+
isOpen={isFullKebabDropdownOpen}
|
|
150
|
+
onSelect={onFullKebabSelect}
|
|
151
|
+
onOpenChange={setIsFullKebabDropdownOpen}
|
|
152
|
+
popperProps={{ position: 'right' }}
|
|
153
|
+
toggle={(toggleRef) => (
|
|
154
|
+
<MenuToggle
|
|
155
|
+
ref={toggleRef}
|
|
156
|
+
isExpanded={isFullKebabDropdownOpen}
|
|
157
|
+
onClick={onFullKebabToggle}
|
|
158
|
+
variant="plain"
|
|
159
|
+
aria-label="Toolbar menu"
|
|
160
|
+
>
|
|
161
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
162
|
+
</MenuToggle>
|
|
163
|
+
)}
|
|
164
|
+
>
|
|
165
|
+
<DropdownGroup key="group 2" aria-label="User actions">
|
|
166
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
167
|
+
</DropdownGroup>
|
|
168
|
+
<Divider />
|
|
169
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
170
|
+
</Dropdown>
|
|
171
|
+
</ToolbarItem>
|
|
172
|
+
</ToolbarGroup>
|
|
173
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
|
|
174
|
+
<Dropdown
|
|
175
|
+
isOpen={isDropdownOpen}
|
|
176
|
+
onSelect={onDropdownSelect}
|
|
177
|
+
onOpenChange={setIsDropdownOpen}
|
|
178
|
+
popperProps={{ position: 'right' }}
|
|
179
|
+
toggle={(toggleRef) => (
|
|
180
|
+
<MenuToggle
|
|
181
|
+
ref={toggleRef}
|
|
182
|
+
isExpanded={isDropdownOpen}
|
|
183
|
+
onClick={onDropdownToggle}
|
|
184
|
+
icon={<Avatar src={imgAvatar} alt="" />}
|
|
185
|
+
isFullHeight
|
|
186
|
+
>
|
|
187
|
+
Ned Username
|
|
188
|
+
</MenuToggle>
|
|
189
|
+
)}
|
|
190
|
+
>
|
|
191
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
192
|
+
</Dropdown>
|
|
193
|
+
</ToolbarItem>
|
|
194
|
+
</ToolbarContent>
|
|
195
|
+
</Toolbar>
|
|
196
|
+
);
|
|
197
|
+
const Header = (
|
|
198
|
+
<Masthead>
|
|
199
|
+
<MastheadMain>
|
|
200
|
+
<MastheadBrand>
|
|
201
|
+
<Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
|
|
202
|
+
</MastheadBrand>
|
|
203
|
+
</MastheadMain>
|
|
204
|
+
<MastheadContent>{headerToolbar}</MastheadContent>
|
|
205
|
+
</Masthead>
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
const pageId = 'main-content-page-layout-horizontal-nav';
|
|
209
|
+
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
<React.Fragment>
|
|
213
|
+
<Page header={Header} skipToContent={PageSkipToContent} breadcrumb={DashboardBreadcrumb} mainContainerId={pageId}>
|
|
214
|
+
<PageSection variant={PageSectionVariants.light}>
|
|
215
|
+
<TextContent>
|
|
216
|
+
<Text component="h1">Main title</Text>
|
|
217
|
+
<Text component="p">
|
|
218
|
+
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
219
|
+
of its relative line height of 1.5.
|
|
220
|
+
</Text>
|
|
221
|
+
</TextContent>
|
|
222
|
+
</PageSection>
|
|
223
|
+
<PageSection>
|
|
224
|
+
<Gallery hasGutter>
|
|
225
|
+
{Array.from({ length: 10 }, (_value: any, index: React.Key) => (
|
|
226
|
+
<GalleryItem key={index}>
|
|
227
|
+
<Card>
|
|
228
|
+
<CardBody>This is a card</CardBody>
|
|
229
|
+
</Card>
|
|
230
|
+
</GalleryItem>
|
|
231
|
+
))}
|
|
232
|
+
</Gallery>
|
|
233
|
+
</PageSection>
|
|
234
|
+
</Page>
|
|
235
|
+
</React.Fragment>
|
|
236
|
+
);
|
|
237
|
+
};
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Avatar,
|
|
4
|
+
Brand,
|
|
5
|
+
Button,
|
|
6
|
+
ButtonVariant,
|
|
7
|
+
Card,
|
|
8
|
+
CardBody,
|
|
9
|
+
Divider,
|
|
10
|
+
Dropdown,
|
|
11
|
+
DropdownGroup,
|
|
12
|
+
DropdownItem,
|
|
13
|
+
DropdownList,
|
|
14
|
+
Gallery,
|
|
15
|
+
GalleryItem,
|
|
16
|
+
MenuToggle,
|
|
17
|
+
Masthead,
|
|
18
|
+
MastheadBrand,
|
|
19
|
+
MastheadContent,
|
|
20
|
+
MastheadMain,
|
|
21
|
+
MastheadToggle,
|
|
22
|
+
Nav,
|
|
23
|
+
NavItem,
|
|
24
|
+
NavList,
|
|
25
|
+
Page,
|
|
26
|
+
PageSection,
|
|
27
|
+
PageSectionVariants,
|
|
28
|
+
PageSectionTypes,
|
|
29
|
+
PageToggleButton,
|
|
30
|
+
SkipToContent,
|
|
31
|
+
TextContent,
|
|
32
|
+
Text,
|
|
33
|
+
Toolbar,
|
|
34
|
+
ToolbarContent,
|
|
35
|
+
ToolbarGroup,
|
|
36
|
+
ToolbarItem
|
|
37
|
+
} from '@patternfly/react-core';
|
|
38
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
39
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
40
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
41
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
42
|
+
import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
|
|
43
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
44
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
45
|
+
import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
|
|
46
|
+
import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
47
|
+
|
|
48
|
+
export const NavHorizontalWithSubnav: React.FunctionComponent = () => {
|
|
49
|
+
const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
|
|
50
|
+
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
|
|
51
|
+
const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
|
|
52
|
+
const [activeItem, setActiveItem] = React.useState<string | number>(0);
|
|
53
|
+
const [activeSubNavItem, setActiveSubNavItem] = React.useState<string | number>(7);
|
|
54
|
+
|
|
55
|
+
const onNavSelect = (
|
|
56
|
+
_event: React.FormEvent<HTMLInputElement>,
|
|
57
|
+
selectedItem: {
|
|
58
|
+
groupId: number | string;
|
|
59
|
+
itemId: number | string;
|
|
60
|
+
to: string;
|
|
61
|
+
}
|
|
62
|
+
) => setActiveItem(selectedItem.itemId);
|
|
63
|
+
|
|
64
|
+
const onSubNavSelect = (
|
|
65
|
+
_event: React.FormEvent<HTMLInputElement>,
|
|
66
|
+
selectedItem: {
|
|
67
|
+
groupId: number | string;
|
|
68
|
+
itemId: number | string;
|
|
69
|
+
to: string;
|
|
70
|
+
}
|
|
71
|
+
) => setActiveSubNavItem(selectedItem.itemId);
|
|
72
|
+
|
|
73
|
+
const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
|
|
74
|
+
const onDropdownSelect = () => setIsDropdownOpen(false);
|
|
75
|
+
const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
|
|
76
|
+
const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
|
|
77
|
+
const onFullKebabToggle = () => setIsFullKebabDropdownOpen((prevState) => !prevState);
|
|
78
|
+
const onFullKebabSelect = () => setIsFullKebabDropdownOpen(false);
|
|
79
|
+
|
|
80
|
+
const PageNav = (
|
|
81
|
+
<Nav onSelect={onNavSelect} aria-label="Nav" variant="horizontal">
|
|
82
|
+
<NavList>
|
|
83
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
84
|
+
<NavItem preventDefault itemId={0} isActive={activeItem === 0} to="#">
|
|
85
|
+
System Panel
|
|
86
|
+
</NavItem>
|
|
87
|
+
<NavItem preventDefault itemId={1} isActive={activeItem === 1} to="#">
|
|
88
|
+
Policy
|
|
89
|
+
</NavItem>
|
|
90
|
+
<NavItem preventDefault itemId={2} isActive={activeItem === 2} to="#">
|
|
91
|
+
Authentication
|
|
92
|
+
</NavItem>
|
|
93
|
+
<NavItem preventDefault itemId={3} isActive={activeItem === 3} to="#">
|
|
94
|
+
Network Services
|
|
95
|
+
</NavItem>
|
|
96
|
+
<NavItem preventDefault itemId={4} isActive={activeItem === 4} to="#">
|
|
97
|
+
Server
|
|
98
|
+
</NavItem>
|
|
99
|
+
<NavItem preventDefault itemId={5} isActive={activeItem === 5} to="#">
|
|
100
|
+
Other horizontal nav item 1
|
|
101
|
+
</NavItem>
|
|
102
|
+
<NavItem preventDefault itemId={6} isActive={activeItem === 6} to="#">
|
|
103
|
+
Other horizontal nav item 2
|
|
104
|
+
</NavItem>
|
|
105
|
+
</NavList>
|
|
106
|
+
</Nav>
|
|
107
|
+
);
|
|
108
|
+
const kebabDropdownItems = (
|
|
109
|
+
<>
|
|
110
|
+
<DropdownItem>
|
|
111
|
+
<CogIcon /> Settings
|
|
112
|
+
</DropdownItem>
|
|
113
|
+
<DropdownItem>
|
|
114
|
+
<HelpIcon /> Help
|
|
115
|
+
</DropdownItem>
|
|
116
|
+
</>
|
|
117
|
+
);
|
|
118
|
+
const userDropdownItems = (
|
|
119
|
+
<>
|
|
120
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
121
|
+
<DropdownItem key="group 2 user">User management</DropdownItem>
|
|
122
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
123
|
+
</>
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const SubNav = (
|
|
127
|
+
<Nav onSelect={onSubNavSelect} aria-label="Subnav" variant="horizontal-subnav">
|
|
128
|
+
<NavList>
|
|
129
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
130
|
+
<NavItem preventDefault itemId={7} isActive={activeSubNavItem === 7} to="#">
|
|
131
|
+
Horizontal subnav item 1
|
|
132
|
+
</NavItem>
|
|
133
|
+
<NavItem preventDefault itemId={8} isActive={activeSubNavItem === 8} to="#">
|
|
134
|
+
Horizontal subnav item 2
|
|
135
|
+
</NavItem>
|
|
136
|
+
<NavItem preventDefault itemId={9} isActive={activeSubNavItem === 9} to="#">
|
|
137
|
+
Horizontal subnav item 3
|
|
138
|
+
</NavItem>
|
|
139
|
+
<NavItem preventDefault itemId={10} isActive={activeSubNavItem === 10} to="#">
|
|
140
|
+
Horizontal subnav item 4
|
|
141
|
+
</NavItem>
|
|
142
|
+
<NavItem preventDefault itemId={11} isActive={activeSubNavItem === 11} to="#">
|
|
143
|
+
Horizontal subnav item 5
|
|
144
|
+
</NavItem>
|
|
145
|
+
<NavItem preventDefault itemId={12} isActive={activeSubNavItem === 12} to="#">
|
|
146
|
+
Horizontal subnav item 6
|
|
147
|
+
</NavItem>
|
|
148
|
+
<NavItem preventDefault itemId={13} isActive={activeSubNavItem === 13} to="#">
|
|
149
|
+
Horizontal subnav item 7
|
|
150
|
+
</NavItem>
|
|
151
|
+
</NavList>
|
|
152
|
+
</Nav>
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const headerToolbar = (
|
|
156
|
+
<Toolbar id="toolbar" isFullHeight isStatic>
|
|
157
|
+
<ToolbarContent>
|
|
158
|
+
<ToolbarItem isOverflowContainer>{PageNav}</ToolbarItem>
|
|
159
|
+
<ToolbarGroup
|
|
160
|
+
variant="icon-button-group"
|
|
161
|
+
align={{ default: 'alignRight' }}
|
|
162
|
+
spacer={{ default: 'spacerNone', md: 'spacerMd' }}
|
|
163
|
+
>
|
|
164
|
+
<ToolbarItem>
|
|
165
|
+
<Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} onClick={() => {}} />
|
|
166
|
+
</ToolbarItem>
|
|
167
|
+
<ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
|
|
168
|
+
<ToolbarItem>
|
|
169
|
+
<Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
|
|
170
|
+
</ToolbarItem>
|
|
171
|
+
<ToolbarItem>
|
|
172
|
+
<Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
|
|
173
|
+
</ToolbarItem>
|
|
174
|
+
</ToolbarGroup>
|
|
175
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
|
|
176
|
+
<Dropdown
|
|
177
|
+
isOpen={isKebabDropdownOpen}
|
|
178
|
+
onSelect={onKebabDropdownSelect}
|
|
179
|
+
onOpenChange={setIsKebabDropdownOpen}
|
|
180
|
+
popperProps={{ position: 'right' }}
|
|
181
|
+
toggle={(toggleRef) => (
|
|
182
|
+
<MenuToggle
|
|
183
|
+
ref={toggleRef}
|
|
184
|
+
isExpanded={isKebabDropdownOpen}
|
|
185
|
+
onClick={onKebabDropdownToggle}
|
|
186
|
+
variant="plain"
|
|
187
|
+
aria-label="Settings and help"
|
|
188
|
+
>
|
|
189
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
190
|
+
</MenuToggle>
|
|
191
|
+
)}
|
|
192
|
+
>
|
|
193
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
194
|
+
</Dropdown>
|
|
195
|
+
</ToolbarItem>
|
|
196
|
+
<ToolbarItem visibility={{ md: 'hidden' }}>
|
|
197
|
+
<Dropdown
|
|
198
|
+
isOpen={isFullKebabDropdownOpen}
|
|
199
|
+
onSelect={onFullKebabSelect}
|
|
200
|
+
onOpenChange={setIsFullKebabDropdownOpen}
|
|
201
|
+
popperProps={{ position: 'right' }}
|
|
202
|
+
toggle={(toggleRef) => (
|
|
203
|
+
<MenuToggle
|
|
204
|
+
ref={toggleRef}
|
|
205
|
+
isExpanded={isFullKebabDropdownOpen}
|
|
206
|
+
onClick={onFullKebabToggle}
|
|
207
|
+
variant="plain"
|
|
208
|
+
aria-label="Toolbar menu"
|
|
209
|
+
>
|
|
210
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
211
|
+
</MenuToggle>
|
|
212
|
+
)}
|
|
213
|
+
>
|
|
214
|
+
<DropdownGroup key="group 2" aria-label="User actions">
|
|
215
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
216
|
+
</DropdownGroup>
|
|
217
|
+
<Divider />
|
|
218
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
219
|
+
</Dropdown>
|
|
220
|
+
</ToolbarItem>
|
|
221
|
+
</ToolbarGroup>
|
|
222
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
|
|
223
|
+
<Dropdown
|
|
224
|
+
isOpen={isDropdownOpen}
|
|
225
|
+
onSelect={onDropdownSelect}
|
|
226
|
+
onOpenChange={setIsDropdownOpen}
|
|
227
|
+
popperProps={{ position: 'right' }}
|
|
228
|
+
toggle={(toggleRef) => (
|
|
229
|
+
<MenuToggle
|
|
230
|
+
ref={toggleRef}
|
|
231
|
+
isExpanded={isDropdownOpen}
|
|
232
|
+
onClick={onDropdownToggle}
|
|
233
|
+
icon={<Avatar src={imgAvatar} alt="" />}
|
|
234
|
+
isFullHeight
|
|
235
|
+
>
|
|
236
|
+
Ned Username
|
|
237
|
+
</MenuToggle>
|
|
238
|
+
)}
|
|
239
|
+
>
|
|
240
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
241
|
+
</Dropdown>
|
|
242
|
+
</ToolbarItem>
|
|
243
|
+
</ToolbarContent>
|
|
244
|
+
</Toolbar>
|
|
245
|
+
);
|
|
246
|
+
const Header = (
|
|
247
|
+
<Masthead>
|
|
248
|
+
<MastheadToggle>
|
|
249
|
+
<PageToggleButton variant="plain" aria-label="Global navigation">
|
|
250
|
+
<BarsIcon />
|
|
251
|
+
</PageToggleButton>
|
|
252
|
+
</MastheadToggle>
|
|
253
|
+
<MastheadMain>
|
|
254
|
+
<MastheadBrand>
|
|
255
|
+
<Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
|
|
256
|
+
</MastheadBrand>
|
|
257
|
+
</MastheadMain>
|
|
258
|
+
<MastheadContent>{headerToolbar}</MastheadContent>
|
|
259
|
+
</Masthead>
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
const pageId = 'main-content-page-layout-horizontal-nav';
|
|
263
|
+
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
|
|
264
|
+
|
|
265
|
+
return (
|
|
266
|
+
<React.Fragment>
|
|
267
|
+
<Page header={Header} skipToContent={PageSkipToContent} mainContainerId={pageId}>
|
|
268
|
+
<PageSection type={PageSectionTypes.subNav} isWidthLimited>
|
|
269
|
+
{SubNav}
|
|
270
|
+
</PageSection>
|
|
271
|
+
<PageSection type={PageSectionTypes.breadcrumb} isWidthLimited>
|
|
272
|
+
{DashboardBreadcrumb}
|
|
273
|
+
</PageSection>
|
|
274
|
+
<PageSection variant={PageSectionVariants.light}>
|
|
275
|
+
<TextContent>
|
|
276
|
+
<Text component="h1">Main title</Text>
|
|
277
|
+
<Text component="p">
|
|
278
|
+
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
279
|
+
of it’s relative line height of 1.5.
|
|
280
|
+
</Text>
|
|
281
|
+
</TextContent>
|
|
282
|
+
</PageSection>
|
|
283
|
+
<PageSection>
|
|
284
|
+
<Gallery hasGutter>
|
|
285
|
+
{Array.from({ length: 10 }, (_value: any, index: React.Key) => (
|
|
286
|
+
<GalleryItem key={index}>
|
|
287
|
+
<Card>
|
|
288
|
+
<CardBody>This is a card</CardBody>
|
|
289
|
+
</Card>
|
|
290
|
+
</GalleryItem>
|
|
291
|
+
))}
|
|
292
|
+
</Gallery>
|
|
293
|
+
</PageSection>
|
|
294
|
+
</Page>
|
|
295
|
+
</React.Fragment>
|
|
296
|
+
);
|
|
297
|
+
};
|