@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,98 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Card,
|
|
4
|
+
CardBody,
|
|
5
|
+
Gallery,
|
|
6
|
+
GalleryItem,
|
|
7
|
+
Nav,
|
|
8
|
+
NavItem,
|
|
9
|
+
NavList,
|
|
10
|
+
Page,
|
|
11
|
+
PageSection,
|
|
12
|
+
PageSectionVariants,
|
|
13
|
+
PageSidebar,
|
|
14
|
+
PageSidebarBody,
|
|
15
|
+
SkipToContent,
|
|
16
|
+
TextContent,
|
|
17
|
+
Text
|
|
18
|
+
} from '@patternfly/react-core';
|
|
19
|
+
import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
20
|
+
import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
|
|
21
|
+
|
|
22
|
+
export const NavDefault: React.FunctionComponent = () => {
|
|
23
|
+
const [activeItem, setActiveItem] = React.useState<number | string>(0);
|
|
24
|
+
|
|
25
|
+
const onNavSelect = (
|
|
26
|
+
_event: React.FormEvent<HTMLInputElement>,
|
|
27
|
+
selectedItem: {
|
|
28
|
+
groupId: number | string;
|
|
29
|
+
itemId: number | string;
|
|
30
|
+
to: string;
|
|
31
|
+
}
|
|
32
|
+
) => setActiveItem(selectedItem.itemId);
|
|
33
|
+
|
|
34
|
+
const PageNav = (
|
|
35
|
+
<Nav onSelect={onNavSelect} aria-label="Nav">
|
|
36
|
+
<NavList>
|
|
37
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
38
|
+
<NavItem preventDefault itemId={0} isActive={activeItem === 0} to="#">
|
|
39
|
+
System Panel
|
|
40
|
+
</NavItem>
|
|
41
|
+
<NavItem preventDefault itemId={1} isActive={activeItem === 1} to="#">
|
|
42
|
+
Policy
|
|
43
|
+
</NavItem>
|
|
44
|
+
<NavItem preventDefault itemId={2} isActive={activeItem === 2} to="#">
|
|
45
|
+
Authentication
|
|
46
|
+
</NavItem>
|
|
47
|
+
<NavItem preventDefault itemId={3} isActive={activeItem === 3} to="#">
|
|
48
|
+
Network Services
|
|
49
|
+
</NavItem>
|
|
50
|
+
<NavItem preventDefault itemId={4} isActive={activeItem === 4} to="#">
|
|
51
|
+
Server
|
|
52
|
+
</NavItem>
|
|
53
|
+
</NavList>
|
|
54
|
+
</Nav>
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
const Sidebar = (
|
|
58
|
+
<PageSidebar>
|
|
59
|
+
<PageSidebarBody>{PageNav}</PageSidebarBody>
|
|
60
|
+
</PageSidebar>
|
|
61
|
+
);
|
|
62
|
+
const pageId = 'main-content-page-layout-default-nav';
|
|
63
|
+
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<>
|
|
67
|
+
<Page
|
|
68
|
+
header={<DashboardHeader />}
|
|
69
|
+
sidebar={Sidebar}
|
|
70
|
+
isManagedSidebar
|
|
71
|
+
skipToContent={PageSkipToContent}
|
|
72
|
+
breadcrumb={DashboardBreadcrumb}
|
|
73
|
+
mainContainerId={pageId}
|
|
74
|
+
>
|
|
75
|
+
<PageSection variant={PageSectionVariants.light}>
|
|
76
|
+
<TextContent>
|
|
77
|
+
<Text component="h1">Main title</Text>
|
|
78
|
+
<Text component="p">
|
|
79
|
+
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
80
|
+
of its relative line height of 1.5.
|
|
81
|
+
</Text>
|
|
82
|
+
</TextContent>
|
|
83
|
+
</PageSection>
|
|
84
|
+
<PageSection>
|
|
85
|
+
<Gallery hasGutter>
|
|
86
|
+
{Array.from({ length: 10 }, (_value: any, index: React.Key) => (
|
|
87
|
+
<GalleryItem key={index}>
|
|
88
|
+
<Card>
|
|
89
|
+
<CardBody>This is a card</CardBody>
|
|
90
|
+
</Card>
|
|
91
|
+
</GalleryItem>
|
|
92
|
+
))}
|
|
93
|
+
</Gallery>
|
|
94
|
+
</PageSection>
|
|
95
|
+
</Page>
|
|
96
|
+
</>
|
|
97
|
+
);
|
|
98
|
+
};
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
PageSection
|
|
14
14
|
} from '@patternfly/react-core';
|
|
15
15
|
import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
|
|
16
|
+
|
|
16
17
|
interface MenuHeights {
|
|
17
18
|
[menuId: string]: number;
|
|
18
19
|
}
|
|
@@ -26,6 +27,7 @@ function getNavLayer(menuId: string): number {
|
|
|
26
27
|
case 'subMenu-2':
|
|
27
28
|
return 3;
|
|
28
29
|
}
|
|
30
|
+
return 1;
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
const subMenuTwo: JSX.Element = (
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Card,
|
|
4
|
+
CardBody,
|
|
5
|
+
Gallery,
|
|
6
|
+
GalleryItem,
|
|
7
|
+
Nav,
|
|
8
|
+
NavExpandable,
|
|
9
|
+
NavItem,
|
|
10
|
+
NavList,
|
|
11
|
+
Page,
|
|
12
|
+
PageSection,
|
|
13
|
+
PageSectionVariants,
|
|
14
|
+
PageSidebar,
|
|
15
|
+
PageSidebarBody,
|
|
16
|
+
SkipToContent,
|
|
17
|
+
TextContent,
|
|
18
|
+
Text
|
|
19
|
+
} from '@patternfly/react-core';
|
|
20
|
+
import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
|
|
21
|
+
import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
|
|
22
|
+
|
|
23
|
+
export const NavExpandableDemo: React.FunctionComponent = () => {
|
|
24
|
+
const [activeGroup, setActiveGroup] = React.useState<string | number>('grp-1');
|
|
25
|
+
const [activeItem, setActiveItem] = React.useState<string | number>('grp-1_itm-1');
|
|
26
|
+
|
|
27
|
+
const onNavSelect = (
|
|
28
|
+
_event: React.FormEvent<HTMLInputElement>,
|
|
29
|
+
selectedItem: {
|
|
30
|
+
groupId: number | string;
|
|
31
|
+
itemId: number | string;
|
|
32
|
+
to: string;
|
|
33
|
+
}
|
|
34
|
+
) => {
|
|
35
|
+
setActiveItem(selectedItem.itemId);
|
|
36
|
+
setActiveGroup(selectedItem.groupId);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const PageNav = (
|
|
40
|
+
<Nav onSelect={onNavSelect} aria-label="Nav">
|
|
41
|
+
<NavList>
|
|
42
|
+
<NavExpandable title="System Panel" groupId="grp-1" isActive={activeGroup === 'grp-1'} isExpanded>
|
|
43
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
44
|
+
<NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-1" isActive={activeItem === 'grp-1_itm-1'} to="#">
|
|
45
|
+
Overview
|
|
46
|
+
</NavItem>
|
|
47
|
+
<NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-2" isActive={activeItem === 'grp-1_itm-2'} to="#">
|
|
48
|
+
Resource usage
|
|
49
|
+
</NavItem>
|
|
50
|
+
<NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-3" isActive={activeItem === 'grp-1_itm-3'} to="#">
|
|
51
|
+
Hypervisors
|
|
52
|
+
</NavItem>
|
|
53
|
+
<NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-4" isActive={activeItem === 'grp-1_itm-4'} to="#">
|
|
54
|
+
Instances
|
|
55
|
+
</NavItem>
|
|
56
|
+
<NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-5" isActive={activeItem === 'grp-1_itm-5'} to="#">
|
|
57
|
+
Volumes
|
|
58
|
+
</NavItem>
|
|
59
|
+
<NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-6" isActive={activeItem === 'grp-1_itm-6'} to="#">
|
|
60
|
+
Network
|
|
61
|
+
</NavItem>
|
|
62
|
+
</NavExpandable>
|
|
63
|
+
<NavExpandable title="Policy" groupId="grp-2" isActive={activeGroup === 'grp-2'}>
|
|
64
|
+
<NavItem preventDefault groupId="grp-2" itemId="grp-2_itm-1" isActive={activeItem === 'grp-2_itm-1'} to="#">
|
|
65
|
+
Subnav link 1
|
|
66
|
+
</NavItem>
|
|
67
|
+
<NavItem preventDefault groupId="grp-2" itemId="grp-2_itm-2" isActive={activeItem === 'grp-2_itm-2'} to="#">
|
|
68
|
+
Subnav link 2
|
|
69
|
+
</NavItem>
|
|
70
|
+
</NavExpandable>
|
|
71
|
+
<NavExpandable title="Authentication" groupId="grp-3" isActive={activeGroup === 'grp-3'}>
|
|
72
|
+
<NavItem preventDefault groupId="grp-3" itemId="grp-3_itm-1" isActive={activeItem === 'grp-3_itm-1'} to="#">
|
|
73
|
+
Subnav link 1
|
|
74
|
+
</NavItem>
|
|
75
|
+
<NavItem preventDefault groupId="grp-3" itemId="grp-3_itm-2" isActive={activeItem === 'grp-3_itm-2'} to="#">
|
|
76
|
+
Subnav link 2
|
|
77
|
+
</NavItem>
|
|
78
|
+
</NavExpandable>
|
|
79
|
+
</NavList>
|
|
80
|
+
</Nav>
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const Sidebar = (
|
|
84
|
+
<PageSidebar>
|
|
85
|
+
<PageSidebarBody>{PageNav}</PageSidebarBody>
|
|
86
|
+
</PageSidebar>
|
|
87
|
+
);
|
|
88
|
+
const pageId = 'main-content-page-layout-expandable-nav';
|
|
89
|
+
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<React.Fragment>
|
|
93
|
+
<Page
|
|
94
|
+
header={<DashboardHeader />}
|
|
95
|
+
sidebar={Sidebar}
|
|
96
|
+
isManagedSidebar
|
|
97
|
+
skipToContent={PageSkipToContent}
|
|
98
|
+
breadcrumb={DashboardBreadcrumb}
|
|
99
|
+
mainContainerId={pageId}
|
|
100
|
+
>
|
|
101
|
+
<PageSection variant={PageSectionVariants.light}>
|
|
102
|
+
<TextContent>
|
|
103
|
+
<Text component="h1">Main title</Text>
|
|
104
|
+
<Text component="p">
|
|
105
|
+
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
106
|
+
of its relative line height of 1.5.
|
|
107
|
+
</Text>
|
|
108
|
+
</TextContent>
|
|
109
|
+
</PageSection>
|
|
110
|
+
<PageSection>
|
|
111
|
+
<Gallery hasGutter>
|
|
112
|
+
{Array.from({ length: 10 }, (_value: any, index: React.Key) => (
|
|
113
|
+
<GalleryItem key={index}>
|
|
114
|
+
<Card>
|
|
115
|
+
<CardBody>This is a card</CardBody>
|
|
116
|
+
</Card>
|
|
117
|
+
</GalleryItem>
|
|
118
|
+
))}
|
|
119
|
+
</Gallery>
|
|
120
|
+
</PageSection>
|
|
121
|
+
</Page>
|
|
122
|
+
</React.Fragment>
|
|
123
|
+
);
|
|
124
|
+
};
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Avatar,
|
|
4
|
+
Brand,
|
|
5
|
+
Button,
|
|
6
|
+
ButtonVariant,
|
|
7
|
+
Divider,
|
|
8
|
+
Dropdown,
|
|
9
|
+
DropdownGroup,
|
|
10
|
+
DropdownItem,
|
|
11
|
+
DropdownList,
|
|
12
|
+
Masthead,
|
|
13
|
+
MastheadBrand,
|
|
14
|
+
MastheadContent,
|
|
15
|
+
MastheadMain,
|
|
16
|
+
MastheadToggle,
|
|
17
|
+
Menu,
|
|
18
|
+
MenuContent,
|
|
19
|
+
MenuItem,
|
|
20
|
+
MenuList,
|
|
21
|
+
MenuToggle,
|
|
22
|
+
Nav,
|
|
23
|
+
NavItem,
|
|
24
|
+
NavList,
|
|
25
|
+
Page,
|
|
26
|
+
PageSection,
|
|
27
|
+
PageSectionVariants,
|
|
28
|
+
PageSidebar,
|
|
29
|
+
PageSidebarBody,
|
|
30
|
+
PageToggleButton,
|
|
31
|
+
SkipToContent,
|
|
32
|
+
Toolbar,
|
|
33
|
+
ToolbarContent,
|
|
34
|
+
ToolbarGroup,
|
|
35
|
+
ToolbarItem
|
|
36
|
+
} from '@patternfly/react-core';
|
|
37
|
+
import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
|
|
38
|
+
import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
|
|
39
|
+
import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
|
|
40
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
41
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
42
|
+
import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
|
|
43
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
44
|
+
import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
|
|
45
|
+
|
|
46
|
+
export const NavFlyout: React.FunctionComponent = () => {
|
|
47
|
+
const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
|
|
48
|
+
const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
|
|
49
|
+
const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
|
|
50
|
+
const [isMobileView, setIsMobileView] = React.useState(false);
|
|
51
|
+
const [isSidebarOpenDesktop, setIsSidebarOpenDesktop] = React.useState(true);
|
|
52
|
+
const [isSidebarOpenMobile, setIsSidebarOpenMobile] = React.useState(false);
|
|
53
|
+
const [activeItem, setActiveItem] = React.useState<number | string>(0);
|
|
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 onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
|
|
65
|
+
const onDropdownSelect = () => setIsDropdownOpen(false);
|
|
66
|
+
const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
|
|
67
|
+
const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
|
|
68
|
+
const onFullKebabToggle = () => setIsFullKebabDropdownOpen((prevState) => !prevState);
|
|
69
|
+
const onFullKebabSelect = () => setIsFullKebabDropdownOpen(false);
|
|
70
|
+
const onSidebarToggleDesktop = () => setIsSidebarOpenDesktop((prevState) => !prevState);
|
|
71
|
+
const onSidebarToggleMobile = () => setIsSidebarOpenMobile((prevState) => !prevState);
|
|
72
|
+
|
|
73
|
+
interface PageOptions {
|
|
74
|
+
mobileView: boolean;
|
|
75
|
+
windowSize: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const onPageResize = (_event: MouseEvent | TouchEvent | React.KeyboardEvent, { mobileView }: PageOptions) =>
|
|
79
|
+
setIsMobileView(mobileView);
|
|
80
|
+
|
|
81
|
+
const onMenuSelect = (_event: React.MouseEvent | undefined, itemId: string | number | undefined) => {
|
|
82
|
+
itemId && setActiveItem(itemId);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const numFlyouts = 5;
|
|
86
|
+
const FlyoutMenu = ({ depth, children }) => (
|
|
87
|
+
<Menu key={depth} containsFlyout isNavFlyout id={`menu-${depth}`} onSelect={onMenuSelect}>
|
|
88
|
+
<MenuContent>
|
|
89
|
+
<MenuList>
|
|
90
|
+
<MenuItem flyoutMenu={children} itemId={`next-menu-${depth}`}>
|
|
91
|
+
Additional settings
|
|
92
|
+
</MenuItem>
|
|
93
|
+
{[...Array(numFlyouts - depth).keys()].map((j) => (
|
|
94
|
+
<MenuItem key={`${depth}-${j}`} itemId={`${depth}-${j}`} to={`#menu-link-${depth}-${j}`}>
|
|
95
|
+
Settings menu {depth} item {j}
|
|
96
|
+
</MenuItem>
|
|
97
|
+
))}
|
|
98
|
+
<MenuItem flyoutMenu={children} itemId={`next-menu-2-${depth}`}>
|
|
99
|
+
Additional settings
|
|
100
|
+
</MenuItem>
|
|
101
|
+
</MenuList>
|
|
102
|
+
</MenuContent>
|
|
103
|
+
</Menu>
|
|
104
|
+
);
|
|
105
|
+
let curFlyout = <FlyoutMenu depth={1}>{}</FlyoutMenu>;
|
|
106
|
+
for (let i = 2; i < numFlyouts - 1; i++) {
|
|
107
|
+
curFlyout = <FlyoutMenu depth={i}>{curFlyout}</FlyoutMenu>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const kebabDropdownItems = (
|
|
111
|
+
<>
|
|
112
|
+
<DropdownItem>
|
|
113
|
+
<CogIcon /> Settings
|
|
114
|
+
</DropdownItem>
|
|
115
|
+
<DropdownItem>
|
|
116
|
+
<HelpIcon /> Help
|
|
117
|
+
</DropdownItem>
|
|
118
|
+
</>
|
|
119
|
+
);
|
|
120
|
+
const userDropdownItems = (
|
|
121
|
+
<>
|
|
122
|
+
<DropdownItem key="group 2 profile">My profile</DropdownItem>
|
|
123
|
+
<DropdownItem key="group 2 user">User management</DropdownItem>
|
|
124
|
+
<DropdownItem key="group 2 logout">Logout</DropdownItem>
|
|
125
|
+
</>
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const headerToolbar = (
|
|
129
|
+
<Toolbar id="toolbar" isFullHeight isStatic>
|
|
130
|
+
<ToolbarContent>
|
|
131
|
+
<ToolbarGroup
|
|
132
|
+
variant="icon-button-group"
|
|
133
|
+
align={{ default: 'alignRight' }}
|
|
134
|
+
spacer={{ default: 'spacerNone', md: 'spacerMd' }}
|
|
135
|
+
>
|
|
136
|
+
<ToolbarItem>
|
|
137
|
+
<Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} onClick={() => {}} />
|
|
138
|
+
</ToolbarItem>
|
|
139
|
+
<ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
|
|
140
|
+
<ToolbarItem>
|
|
141
|
+
<Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
|
|
142
|
+
</ToolbarItem>
|
|
143
|
+
<ToolbarItem>
|
|
144
|
+
<Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
|
|
145
|
+
</ToolbarItem>
|
|
146
|
+
</ToolbarGroup>
|
|
147
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
|
|
148
|
+
<Dropdown
|
|
149
|
+
isOpen={isKebabDropdownOpen}
|
|
150
|
+
onSelect={onKebabDropdownSelect}
|
|
151
|
+
onOpenChange={setIsKebabDropdownOpen}
|
|
152
|
+
popperProps={{ position: 'right' }}
|
|
153
|
+
toggle={(toggleRef) => (
|
|
154
|
+
<MenuToggle
|
|
155
|
+
ref={toggleRef}
|
|
156
|
+
isExpanded={isKebabDropdownOpen}
|
|
157
|
+
onClick={onKebabDropdownToggle}
|
|
158
|
+
variant="plain"
|
|
159
|
+
aria-label="Settings and help"
|
|
160
|
+
>
|
|
161
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
162
|
+
</MenuToggle>
|
|
163
|
+
)}
|
|
164
|
+
>
|
|
165
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
166
|
+
</Dropdown>
|
|
167
|
+
</ToolbarItem>
|
|
168
|
+
<ToolbarItem visibility={{ md: 'hidden' }}>
|
|
169
|
+
<Dropdown
|
|
170
|
+
isOpen={isFullKebabDropdownOpen}
|
|
171
|
+
onSelect={onFullKebabSelect}
|
|
172
|
+
onOpenChange={setIsFullKebabDropdownOpen}
|
|
173
|
+
popperProps={{ position: 'right' }}
|
|
174
|
+
toggle={(toggleRef) => (
|
|
175
|
+
<MenuToggle
|
|
176
|
+
ref={toggleRef}
|
|
177
|
+
isExpanded={isFullKebabDropdownOpen}
|
|
178
|
+
onClick={onFullKebabToggle}
|
|
179
|
+
variant="plain"
|
|
180
|
+
aria-label="Toolbar menu"
|
|
181
|
+
>
|
|
182
|
+
<EllipsisVIcon aria-hidden="true" />
|
|
183
|
+
</MenuToggle>
|
|
184
|
+
)}
|
|
185
|
+
>
|
|
186
|
+
<DropdownGroup key="group 2" aria-label="User actions">
|
|
187
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
188
|
+
</DropdownGroup>
|
|
189
|
+
<Divider />
|
|
190
|
+
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
191
|
+
</Dropdown>
|
|
192
|
+
</ToolbarItem>
|
|
193
|
+
</ToolbarGroup>
|
|
194
|
+
<ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
|
|
195
|
+
<Dropdown
|
|
196
|
+
isOpen={isDropdownOpen}
|
|
197
|
+
onSelect={onDropdownSelect}
|
|
198
|
+
onOpenChange={setIsDropdownOpen}
|
|
199
|
+
popperProps={{ position: 'right' }}
|
|
200
|
+
toggle={(toggleRef) => (
|
|
201
|
+
<MenuToggle
|
|
202
|
+
ref={toggleRef}
|
|
203
|
+
isExpanded={isDropdownOpen}
|
|
204
|
+
onClick={onDropdownToggle}
|
|
205
|
+
icon={<Avatar src={imgAvatar} alt="" />}
|
|
206
|
+
isFullHeight
|
|
207
|
+
>
|
|
208
|
+
Ned Username
|
|
209
|
+
</MenuToggle>
|
|
210
|
+
)}
|
|
211
|
+
>
|
|
212
|
+
<DropdownList>{userDropdownItems}</DropdownList>
|
|
213
|
+
</Dropdown>
|
|
214
|
+
</ToolbarItem>
|
|
215
|
+
</ToolbarContent>
|
|
216
|
+
</Toolbar>
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
const Header = (
|
|
220
|
+
<Masthead>
|
|
221
|
+
<MastheadToggle>
|
|
222
|
+
<PageToggleButton
|
|
223
|
+
onSidebarToggle={isMobileView ? onSidebarToggleMobile : onSidebarToggleDesktop}
|
|
224
|
+
variant="plain"
|
|
225
|
+
aria-label="Global navigation"
|
|
226
|
+
>
|
|
227
|
+
<BarsIcon />
|
|
228
|
+
</PageToggleButton>
|
|
229
|
+
</MastheadToggle>
|
|
230
|
+
<MastheadMain>
|
|
231
|
+
<MastheadBrand>
|
|
232
|
+
<Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
|
|
233
|
+
</MastheadBrand>
|
|
234
|
+
</MastheadMain>
|
|
235
|
+
<MastheadContent>{headerToolbar}</MastheadContent>
|
|
236
|
+
</Masthead>
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
const isSidebarOpen = isMobileView ? isSidebarOpenMobile : isSidebarOpenDesktop;
|
|
240
|
+
|
|
241
|
+
const Sidebar = (
|
|
242
|
+
<PageSidebar isSidebarOpen={isSidebarOpen} style={isSidebarOpen ? { overflow: 'visible' } : {}}>
|
|
243
|
+
<PageSidebarBody>
|
|
244
|
+
<Nav onSelect={onNavSelect}>
|
|
245
|
+
<NavList>
|
|
246
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
247
|
+
<NavItem preventDefault id="flyout-link1" to="#flyout-link1" itemId={0} isActive={activeItem === 0}>
|
|
248
|
+
System Panel
|
|
249
|
+
</NavItem>
|
|
250
|
+
<NavItem preventDefault flyout={curFlyout} id="flyout-link2" itemId={1} isActive={activeItem === 1}>
|
|
251
|
+
Settings
|
|
252
|
+
</NavItem>
|
|
253
|
+
<NavItem preventDefault id="flyout-link3" to="#flyout-link3" itemId={2} isActive={activeItem === 2}>
|
|
254
|
+
Authentication
|
|
255
|
+
</NavItem>
|
|
256
|
+
</NavList>
|
|
257
|
+
</Nav>
|
|
258
|
+
</PageSidebarBody>
|
|
259
|
+
</PageSidebar>
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
const pageId = 'main-content-page-layout-flyout-nav';
|
|
263
|
+
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
|
|
264
|
+
|
|
265
|
+
return (
|
|
266
|
+
<Page
|
|
267
|
+
header={Header}
|
|
268
|
+
sidebar={Sidebar}
|
|
269
|
+
onPageResize={onPageResize}
|
|
270
|
+
skipToContent={PageSkipToContent}
|
|
271
|
+
mainContainerId={pageId}
|
|
272
|
+
>
|
|
273
|
+
<PageSection variant={PageSectionVariants.darker}>Section with darker background</PageSection>
|
|
274
|
+
<PageSection variant={PageSectionVariants.dark}>Section with dark background</PageSection>
|
|
275
|
+
<PageSection variant={PageSectionVariants.light}>Section with light background</PageSection>
|
|
276
|
+
</Page>
|
|
277
|
+
);
|
|
278
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Nav,
|
|
4
|
+
NavGroup,
|
|
5
|
+
NavItem,
|
|
6
|
+
Page,
|
|
7
|
+
PageSection,
|
|
8
|
+
PageSectionVariants,
|
|
9
|
+
PageSidebar,
|
|
10
|
+
PageSidebarBody,
|
|
11
|
+
SkipToContent,
|
|
12
|
+
TextContent,
|
|
13
|
+
Text
|
|
14
|
+
} from '@patternfly/react-core';
|
|
15
|
+
import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
|
|
16
|
+
|
|
17
|
+
export const NavGrouped: React.FunctionComponent = () => {
|
|
18
|
+
const [activeItem, setActiveItem] = React.useState<number | string>('grp-1_itm-1');
|
|
19
|
+
|
|
20
|
+
const onNavSelect = (
|
|
21
|
+
_event: React.FormEvent<HTMLInputElement>,
|
|
22
|
+
selectedItem: {
|
|
23
|
+
groupId: number | string;
|
|
24
|
+
itemId: number | string;
|
|
25
|
+
to: string;
|
|
26
|
+
}
|
|
27
|
+
) => setActiveItem(selectedItem.itemId);
|
|
28
|
+
|
|
29
|
+
const PageNav = (
|
|
30
|
+
<Nav onSelect={onNavSelect} aria-label="Nav">
|
|
31
|
+
<NavGroup title="System Panel">
|
|
32
|
+
{/* Preventing default click behavior on each NavItem for demo purposes only */}
|
|
33
|
+
<NavItem preventDefault itemId="grp-1_itm-1" isActive={activeItem === 'grp-1_itm-1'} to="#">
|
|
34
|
+
Overview
|
|
35
|
+
</NavItem>
|
|
36
|
+
<NavItem preventDefault itemId="grp-1_itm-2" isActive={activeItem === 'grp-1_itm-2'} to="#">
|
|
37
|
+
Resource Usage
|
|
38
|
+
</NavItem>
|
|
39
|
+
<NavItem preventDefault itemId="grp-1_itm-3" isActive={activeItem === 'grp-1_itm-3'} to="#">
|
|
40
|
+
Hypervisors
|
|
41
|
+
</NavItem>
|
|
42
|
+
<NavItem preventDefault itemId="grp-1_itm-4" isActive={activeItem === 'grp-1_itm-4'} to="#">
|
|
43
|
+
Instances
|
|
44
|
+
</NavItem>
|
|
45
|
+
<NavItem preventDefault itemId="grp-1_itm-5" isActive={activeItem === 'grp-1_itm-5'} to="#">
|
|
46
|
+
Volumes
|
|
47
|
+
</NavItem>
|
|
48
|
+
<NavItem preventDefault itemId="grp-1_itm-6" isActive={activeItem === 'grp-1_itm-6'} to="#">
|
|
49
|
+
Network
|
|
50
|
+
</NavItem>
|
|
51
|
+
</NavGroup>
|
|
52
|
+
<NavGroup title="Policy">
|
|
53
|
+
<NavItem preventDefault itemId="grp-2_itm-1" isActive={activeItem === 'grp-2_itm-1'} to="#">
|
|
54
|
+
Hosts
|
|
55
|
+
</NavItem>
|
|
56
|
+
<NavItem preventDefault itemId="grp-2_itm-2" isActive={activeItem === 'grp-2_itm-2'} to="#">
|
|
57
|
+
Virtual Machines
|
|
58
|
+
</NavItem>
|
|
59
|
+
<NavItem preventDefault itemId="grp-2_itm-3" isActive={activeItem === 'grp-2_itm-3'} to="#">
|
|
60
|
+
Storage
|
|
61
|
+
</NavItem>
|
|
62
|
+
</NavGroup>
|
|
63
|
+
</Nav>
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const Sidebar = (
|
|
67
|
+
<PageSidebar>
|
|
68
|
+
<PageSidebarBody>{PageNav}</PageSidebarBody>
|
|
69
|
+
</PageSidebar>
|
|
70
|
+
);
|
|
71
|
+
const pageId = 'main-content-page-layout-group-nav';
|
|
72
|
+
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<>
|
|
76
|
+
<Page
|
|
77
|
+
header={<DashboardHeader />}
|
|
78
|
+
sidebar={Sidebar}
|
|
79
|
+
isManagedSidebar
|
|
80
|
+
skipToContent={PageSkipToContent}
|
|
81
|
+
mainContainerId={pageId}
|
|
82
|
+
>
|
|
83
|
+
<PageSection variant={PageSectionVariants.light}>
|
|
84
|
+
<TextContent>
|
|
85
|
+
<Text component="h1">Main title</Text>
|
|
86
|
+
<Text component="p">
|
|
87
|
+
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
|
|
88
|
+
of its relative line height of 1.5.
|
|
89
|
+
</Text>
|
|
90
|
+
</TextContent>
|
|
91
|
+
</PageSection>
|
|
92
|
+
<PageSection variant={PageSectionVariants.light}>Light</PageSection>
|
|
93
|
+
<PageSection variant={PageSectionVariants.dark}>Dark</PageSection>
|
|
94
|
+
<PageSection variant={PageSectionVariants.darker}>Darker</PageSection>
|
|
95
|
+
<PageSection>Content</PageSection>
|
|
96
|
+
</Page>
|
|
97
|
+
</>
|
|
98
|
+
);
|
|
99
|
+
};
|