@patternfly/react-core 6.6.1-prerelease.5 → 6.6.1-prerelease.7
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 +10 -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/ClipboardCopy/package.json +1 -1
- package/dist/dynamic/components/CodeBlock/package.json +1 -1
- package/dist/dynamic/components/Compass/package.json +1 -1
- package/dist/dynamic/components/Content/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/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/Hero/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/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/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/Chip/package.json +1 -1
- package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
- package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
- package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
- package/dist/dynamic/deprecated/components/Tile/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/AnimationsProvider/AnimationsProvider/package.json +1 -1
- package/dist/dynamic/helpers/AnimationsProvider/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/SSRSafeIds/SSRSafeIds/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/fileUtils/package.json +1 -1
- package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
- package/dist/dynamic/helpers/inert/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/useSSRSafeId/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/styles/package.json +1 -1
- package/dist/dynamic-modules.json +1 -0
- package/dist/esm/components/Compass/Compass.d.ts +2 -0
- package/dist/esm/components/Compass/Compass.d.ts.map +1 -1
- package/dist/esm/components/Compass/Compass.js +2 -2
- package/dist/esm/components/Compass/Compass.js.map +1 -1
- package/dist/esm/components/Nav/NavExpandable.d.ts +2 -0
- package/dist/esm/components/Nav/NavExpandable.d.ts.map +1 -1
- package/dist/esm/components/Nav/NavExpandable.js +6 -4
- package/dist/esm/components/Nav/NavExpandable.js.map +1 -1
- package/dist/esm/components/Page/Page.d.ts +2 -0
- package/dist/esm/components/Page/Page.d.ts.map +1 -1
- package/dist/esm/components/Page/Page.js +4 -3
- package/dist/esm/components/Page/Page.js.map +1 -1
- package/dist/esm/helpers/index.d.ts +1 -0
- package/dist/esm/helpers/index.d.ts.map +1 -1
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/helpers/index.js.map +1 -1
- package/dist/js/components/Compass/Compass.d.ts +2 -0
- package/dist/js/components/Compass/Compass.d.ts.map +1 -1
- package/dist/js/components/Compass/Compass.js +2 -2
- package/dist/js/components/Compass/Compass.js.map +1 -1
- package/dist/js/components/Nav/NavExpandable.d.ts +2 -0
- package/dist/js/components/Nav/NavExpandable.d.ts.map +1 -1
- package/dist/js/components/Nav/NavExpandable.js +6 -4
- package/dist/js/components/Nav/NavExpandable.js.map +1 -1
- package/dist/js/components/Page/Page.d.ts +2 -0
- package/dist/js/components/Page/Page.d.ts.map +1 -1
- package/dist/js/components/Page/Page.js +4 -3
- package/dist/js/components/Page/Page.js.map +1 -1
- package/dist/js/helpers/index.d.ts +1 -0
- package/dist/js/helpers/index.d.ts.map +1 -1
- package/dist/js/helpers/index.js +1 -0
- package/dist/js/helpers/index.js.map +1 -1
- package/dist/umd/assets/{output-J0Cx1pi_.css → output-BGwwN1RO.css} +18944 -18944
- package/dist/umd/react-core.min.js +3 -3
- package/helpers/package.json +1 -1
- package/layouts/package.json +1 -1
- package/next/package.json +1 -1
- package/package.json +3 -3
- package/src/components/Compass/Compass.tsx +4 -0
- package/src/components/Compass/__tests__/Compass.test.tsx +15 -0
- package/src/components/Nav/NavExpandable.tsx +12 -2
- package/src/components/Nav/__tests__/Generated/__snapshots__/NavExpandable.test.tsx.snap +5 -1
- package/src/components/Nav/__tests__/NavExpandable.test.tsx +21 -0
- package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +15 -3
- package/src/components/Nav/examples/Nav.md +17 -4
- package/src/components/Nav/examples/NavDocked.tsx +98 -0
- package/src/components/Nav/examples/NavIcons.tsx +8 -8
- package/src/components/Page/Page.tsx +5 -0
- package/src/components/Page/__tests__/Page.test.tsx +20 -0
- package/src/demos/Compass/Compass.md +3 -1
- package/src/demos/Compass/examples/CompassDockDemo.tsx +111 -5
- package/src/demos/Nav.md +4 -2
- package/src/demos/examples/Nav/NavDockedNav.tsx +113 -7
- package/src/helpers/index.ts +1 -0
|
@@ -26,14 +26,17 @@ import {
|
|
|
26
26
|
Button,
|
|
27
27
|
Tooltip,
|
|
28
28
|
Divider,
|
|
29
|
-
PageToggleButton
|
|
29
|
+
PageToggleButton,
|
|
30
|
+
NavExpandable
|
|
30
31
|
} from '@patternfly/react-core';
|
|
31
|
-
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
|
|
32
32
|
import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
|
|
33
33
|
import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
|
|
34
34
|
import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
|
|
35
35
|
import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
|
|
36
36
|
import RhMicronsSearchIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-search-icon';
|
|
37
|
+
import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
|
|
38
|
+
import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
|
|
39
|
+
import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
|
|
37
40
|
import pfLogo from '../../assets/PF-IconLogo-color.svg';
|
|
38
41
|
import RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';
|
|
39
42
|
import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
|
|
@@ -46,8 +49,10 @@ interface NavOnSelectProps {
|
|
|
46
49
|
|
|
47
50
|
export const CompassDockDemo: React.FunctionComponent = () => {
|
|
48
51
|
const [activeItem, setActiveItem] = useState<number>(0);
|
|
52
|
+
const [isNavGroupExpanded, setIsNavGroupExpanded] = useState(false);
|
|
49
53
|
const [isDockExpanded, setIsDockExpanded] = useState(false);
|
|
50
54
|
const [isDockTextExpanded, setIsDockTextExpanded] = useState(false);
|
|
55
|
+
const [isDockExpandableExpanded, setIsDockExpandableExpanded] = useState(false);
|
|
51
56
|
const [isMobile, setIsMobile] = useState(false);
|
|
52
57
|
|
|
53
58
|
useEffect(() => {
|
|
@@ -63,14 +68,60 @@ export const CompassDockDemo: React.FunctionComponent = () => {
|
|
|
63
68
|
return () => mediaQuery.removeEventListener('change', handleResize);
|
|
64
69
|
}, []);
|
|
65
70
|
|
|
71
|
+
const handleDockClickOutside = (event: MouseEvent) => {
|
|
72
|
+
if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const dockedMastheadElement = document.getElementById('docked-masthead');
|
|
77
|
+
const dockedMobileMastheadToggle = document.getElementById('mobile-masthead-toggle');
|
|
78
|
+
|
|
79
|
+
if (
|
|
80
|
+
dockedMastheadElement &&
|
|
81
|
+
!dockedMastheadElement.contains(event.target as Node) &&
|
|
82
|
+
!dockedMobileMastheadToggle?.contains(event.target as Node) &&
|
|
83
|
+
(isDockExpandableExpanded || isDockExpanded)
|
|
84
|
+
) {
|
|
85
|
+
setIsDockExpandableExpanded(false);
|
|
86
|
+
setIsDockExpanded(false);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const handleDockKeydown = (_event: KeyboardEvent) => {
|
|
91
|
+
if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (_event.key === 'Escape') {
|
|
96
|
+
setIsDockExpandableExpanded(false);
|
|
97
|
+
setIsDockExpanded(false);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
window.addEventListener('click', handleDockClickOutside);
|
|
103
|
+
window.addEventListener('keydown', handleDockKeydown);
|
|
104
|
+
|
|
105
|
+
return () => {
|
|
106
|
+
window.removeEventListener('click', handleDockClickOutside);
|
|
107
|
+
window.removeEventListener('keydown', handleDockKeydown);
|
|
108
|
+
};
|
|
109
|
+
}, [isDockExpandableExpanded, isDockTextExpanded, isDockExpanded, isMobile]);
|
|
110
|
+
|
|
66
111
|
const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {
|
|
67
112
|
typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
|
|
113
|
+
|
|
114
|
+
setIsDockExpandableExpanded(false);
|
|
115
|
+
setIsDockTextExpanded(false);
|
|
116
|
+
setIsDockExpanded(false);
|
|
68
117
|
};
|
|
69
118
|
|
|
70
119
|
const navItem1Ref = useRef<HTMLAnchorElement>(null);
|
|
71
120
|
const navItem2Ref = useRef<HTMLAnchorElement>(null);
|
|
72
121
|
const navItem3Ref = useRef<HTMLAnchorElement>(null);
|
|
73
122
|
const navItem4Ref = useRef<HTMLAnchorElement>(null);
|
|
123
|
+
const navItem5Ref = useRef<HTMLAnchorElement>(null);
|
|
124
|
+
const navItem6Ref = useRef<HTMLAnchorElement>(null);
|
|
74
125
|
const settingsRef = useRef<HTMLButtonElement>(null);
|
|
75
126
|
const helpRef = useRef<HTMLButtonElement>(null);
|
|
76
127
|
const appsRef = useRef<HTMLButtonElement>(null);
|
|
@@ -95,7 +146,35 @@ export const CompassDockDemo: React.FunctionComponent = () => {
|
|
|
95
146
|
}, 200);
|
|
96
147
|
}
|
|
97
148
|
} else {
|
|
98
|
-
|
|
149
|
+
const nextDockTextExpanded = !isDockTextExpanded;
|
|
150
|
+
setIsDockTextExpanded(nextDockTextExpanded);
|
|
151
|
+
|
|
152
|
+
if (!nextDockTextExpanded) {
|
|
153
|
+
setIsDockExpandableExpanded(false);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (isDockExpandableExpanded) {
|
|
157
|
+
setIsDockExpandableExpanded(false);
|
|
158
|
+
setIsDockTextExpanded(false);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const onToggleNavGroup = (_event: React.MouseEvent<HTMLButtonElement>, isExpanded: boolean) => {
|
|
164
|
+
if (!isDockExpandableExpanded && !isDockTextExpanded && !isDockExpanded) {
|
|
165
|
+
setIsNavGroupExpanded(true);
|
|
166
|
+
} else {
|
|
167
|
+
setIsNavGroupExpanded(isExpanded);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (!isMobile) {
|
|
171
|
+
if (!isDockExpandableExpanded && !isDockTextExpanded) {
|
|
172
|
+
setIsDockExpandableExpanded(true);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!isDockTextExpanded) {
|
|
176
|
+
setIsDockTextExpanded(false);
|
|
177
|
+
}
|
|
99
178
|
}
|
|
100
179
|
};
|
|
101
180
|
|
|
@@ -201,6 +280,7 @@ export const CompassDockDemo: React.FunctionComponent = () => {
|
|
|
201
280
|
isSidebarOpen={isDockExpanded}
|
|
202
281
|
onSidebarToggle={onMobileToggle}
|
|
203
282
|
isHamburgerButton
|
|
283
|
+
id="mobile-masthead-toggle"
|
|
204
284
|
/>
|
|
205
285
|
</MastheadToggle>
|
|
206
286
|
<MastheadBrand>
|
|
@@ -255,12 +335,35 @@ export const CompassDockDemo: React.FunctionComponent = () => {
|
|
|
255
335
|
to="#nav-icon-link1"
|
|
256
336
|
itemId={0}
|
|
257
337
|
isActive={activeItem === 0}
|
|
258
|
-
icon={<
|
|
338
|
+
icon={<RhUiCubesIcon />}
|
|
259
339
|
anchorRef={navItem1Ref}
|
|
260
340
|
aria-label="System panel"
|
|
261
341
|
>
|
|
262
342
|
System panel
|
|
263
343
|
</NavItem>
|
|
344
|
+
<NavExpandable
|
|
345
|
+
title="Folder"
|
|
346
|
+
groupId={4}
|
|
347
|
+
isExpanded={isNavGroupExpanded}
|
|
348
|
+
icon={<RhUiFolderIcon />}
|
|
349
|
+
hasExpandableIcon={!isMobile}
|
|
350
|
+
buttonProps={{ ref: navItem5Ref, 'aria-label': 'Folder' }}
|
|
351
|
+
onExpand={onToggleNavGroup}
|
|
352
|
+
>
|
|
353
|
+
<NavItem
|
|
354
|
+
preventDefault
|
|
355
|
+
id="expandable3rd-1"
|
|
356
|
+
to="#expandable3rd-1"
|
|
357
|
+
groupId="nav-expand3rd-group-1"
|
|
358
|
+
itemId={5}
|
|
359
|
+
isActive={activeItem === 5}
|
|
360
|
+
icon={<RhUiResourceIcon />}
|
|
361
|
+
anchorRef={navItem6Ref}
|
|
362
|
+
aria-label="Subnav link 1"
|
|
363
|
+
>
|
|
364
|
+
Subnav link 1
|
|
365
|
+
</NavItem>
|
|
366
|
+
</NavExpandable>
|
|
264
367
|
<NavItem
|
|
265
368
|
key="nav-icon-link2"
|
|
266
369
|
preventDefault
|
|
@@ -302,12 +405,14 @@ export const CompassDockDemo: React.FunctionComponent = () => {
|
|
|
302
405
|
</NavItem>
|
|
303
406
|
</NavList>
|
|
304
407
|
</Nav>
|
|
305
|
-
{!isDockTextExpanded && !isDockExpanded && (
|
|
408
|
+
{!isDockTextExpanded && !isDockExpanded && !isDockExpandableExpanded && (
|
|
306
409
|
<>
|
|
307
410
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem1Ref} content="System panel"></Tooltip>
|
|
308
411
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem2Ref} content="Policy"></Tooltip>
|
|
309
412
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem3Ref} content="Authentication"></Tooltip>
|
|
310
413
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem4Ref} content="Network services"></Tooltip>
|
|
414
|
+
<Tooltip aria="none" aria-live="off" triggerRef={navItem5Ref} content="Folder"></Tooltip>
|
|
415
|
+
<Tooltip aria="none" aria-live="off" triggerRef={navItem6Ref} content="Subnav link 1"></Tooltip>
|
|
311
416
|
</>
|
|
312
417
|
)}
|
|
313
418
|
</ToolbarItem>
|
|
@@ -405,6 +510,7 @@ export const CompassDockDemo: React.FunctionComponent = () => {
|
|
|
405
510
|
masthead={mobileMasthead}
|
|
406
511
|
dock={dockContent}
|
|
407
512
|
isDockExpanded={isDockExpanded}
|
|
513
|
+
isDockExpandableExpanded={isDockExpandableExpanded}
|
|
408
514
|
isDockTextExpanded={isDockTextExpanded}
|
|
409
515
|
main={mainContent}
|
|
410
516
|
backgroundSrcDark="/assets/images/pf-background.svg"
|
package/src/demos/Nav.md
CHANGED
|
@@ -12,7 +12,6 @@ import RhUiNotificationFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-
|
|
|
12
12
|
import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-menu-bars-icon';
|
|
13
13
|
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
14
14
|
import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
|
|
15
|
-
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
|
|
16
15
|
import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
|
|
17
16
|
import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
|
|
18
17
|
import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
|
|
@@ -21,7 +20,10 @@ import RhMicronsSearchIcon from '@patternfly/react-icons/dist/esm/icons/rh-micro
|
|
|
21
20
|
import pfIconLogo from '@patternfly/react-core/src/demos/assets/PF-IconLogo-color.svg';
|
|
22
21
|
import { DashboardBreadcrumb } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
|
|
23
22
|
import { DashboardHeader } from '@patternfly/react-core/dist/js/demos/DashboardHeader';
|
|
24
|
-
import
|
|
23
|
+
import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
|
|
24
|
+
import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
|
|
25
|
+
import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
|
|
26
|
+
import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
|
|
25
27
|
|
|
26
28
|
## Demos
|
|
27
29
|
|
|
@@ -28,17 +28,20 @@ import {
|
|
|
28
28
|
ToolbarContent,
|
|
29
29
|
ToolbarGroup,
|
|
30
30
|
ToolbarItem,
|
|
31
|
-
Tooltip
|
|
31
|
+
Tooltip,
|
|
32
|
+
NavExpandable
|
|
32
33
|
} from '@patternfly/react-core';
|
|
33
34
|
import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
|
|
34
|
-
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
|
|
35
35
|
import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
|
|
36
36
|
import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
|
|
37
37
|
import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
|
|
38
38
|
import RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';
|
|
39
39
|
import RhMicronsSearchIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-search-icon';
|
|
40
|
+
import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
|
|
41
|
+
import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
|
|
42
|
+
import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
|
|
40
43
|
import pfIconLogo from '@patternfly/react-core/src/demos/assets/PF-IconLogo-color.svg';
|
|
41
|
-
import
|
|
44
|
+
import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
|
|
42
45
|
import { IS_INERT } from '../../../helpers/inert';
|
|
43
46
|
|
|
44
47
|
interface NavOnSelectProps {
|
|
@@ -49,12 +52,14 @@ interface NavOnSelectProps {
|
|
|
49
52
|
|
|
50
53
|
export const NavDockedNav: React.FunctionComponent = () => {
|
|
51
54
|
const [activeItem, setActiveItem] = useState(1);
|
|
55
|
+
const [isNavGroupExpanded, setIsNavGroupExpanded] = useState(false);
|
|
52
56
|
const [isDockExpanded, setIsDockExpanded] = useState(false);
|
|
53
57
|
const [isDockTextExpanded, setIsDockTextExpanded] = useState(false);
|
|
58
|
+
const [isDockExpandableExpanded, setIsDockExpandableExpanded] = useState(false);
|
|
54
59
|
const [isMobile, setIsMobile] = useState(false);
|
|
55
60
|
|
|
56
61
|
useEffect(() => {
|
|
57
|
-
const mobileBreakpoint = Number.parseInt(
|
|
62
|
+
const mobileBreakpoint = Number.parseInt(globalBreakpointLg.value) * 16;
|
|
58
63
|
const mediaQuery = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`);
|
|
59
64
|
const handleResize = (e: MediaQueryListEvent | MediaQueryList) => {
|
|
60
65
|
setIsMobile(e.matches);
|
|
@@ -66,8 +71,52 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
66
71
|
return () => mediaQuery.removeEventListener('change', handleResize);
|
|
67
72
|
}, []);
|
|
68
73
|
|
|
74
|
+
const handleDockClickOutside = (event: MouseEvent) => {
|
|
75
|
+
if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const dockedMastheadElement = document.getElementById('docked-masthead');
|
|
80
|
+
const dockedMobileMastheadToggle = document.getElementById('mobile-masthead-toggle');
|
|
81
|
+
|
|
82
|
+
if (
|
|
83
|
+
dockedMastheadElement &&
|
|
84
|
+
!dockedMastheadElement.contains(event.target as Node) &&
|
|
85
|
+
!dockedMobileMastheadToggle?.contains(event.target as Node) &&
|
|
86
|
+
(isDockExpandableExpanded || isDockExpanded)
|
|
87
|
+
) {
|
|
88
|
+
setIsDockExpandableExpanded(false);
|
|
89
|
+
setIsDockExpanded(false);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const handleDockKeydown = (_event: KeyboardEvent) => {
|
|
94
|
+
if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (_event.key === 'Escape') {
|
|
99
|
+
setIsDockExpandableExpanded(false);
|
|
100
|
+
setIsDockExpanded(false);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
window.addEventListener('click', handleDockClickOutside);
|
|
106
|
+
window.addEventListener('keydown', handleDockKeydown);
|
|
107
|
+
|
|
108
|
+
return () => {
|
|
109
|
+
window.removeEventListener('click', handleDockClickOutside);
|
|
110
|
+
window.removeEventListener('keydown', handleDockKeydown);
|
|
111
|
+
};
|
|
112
|
+
}, [isDockExpandableExpanded, isDockTextExpanded, isDockExpanded, isMobile]);
|
|
113
|
+
|
|
69
114
|
const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {
|
|
70
115
|
typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
|
|
116
|
+
|
|
117
|
+
setIsDockExpandableExpanded(false);
|
|
118
|
+
setIsDockTextExpanded(false);
|
|
119
|
+
setIsDockExpanded(false);
|
|
71
120
|
};
|
|
72
121
|
|
|
73
122
|
const mobileTextLogo = (
|
|
@@ -181,6 +230,8 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
181
230
|
const navItem2Ref = useRef<HTMLAnchorElement>(null);
|
|
182
231
|
const navItem3Ref = useRef<HTMLAnchorElement>(null);
|
|
183
232
|
const navItem4Ref = useRef<HTMLAnchorElement>(null);
|
|
233
|
+
const navItem5Ref = useRef<HTMLAnchorElement>(null);
|
|
234
|
+
const navItem6Ref = useRef<HTMLAnchorElement>(null);
|
|
184
235
|
const appsRef = useRef<HTMLButtonElement>(null);
|
|
185
236
|
const settingsRef = useRef<HTMLButtonElement>(null);
|
|
186
237
|
const helpRef = useRef<HTMLButtonElement>(null);
|
|
@@ -205,7 +256,35 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
205
256
|
}, 200);
|
|
206
257
|
}
|
|
207
258
|
} else {
|
|
208
|
-
|
|
259
|
+
const nextDockTextExpanded = !isDockTextExpanded;
|
|
260
|
+
setIsDockTextExpanded(nextDockTextExpanded);
|
|
261
|
+
|
|
262
|
+
if (!nextDockTextExpanded) {
|
|
263
|
+
setIsDockExpandableExpanded(false);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (isDockExpandableExpanded) {
|
|
267
|
+
setIsDockExpandableExpanded(false);
|
|
268
|
+
setIsDockTextExpanded(false);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const onToggleNavGroup = (_event: React.MouseEvent<HTMLButtonElement>, isExpanded: boolean) => {
|
|
274
|
+
if (!isDockExpandableExpanded && !isDockTextExpanded && !isDockExpanded) {
|
|
275
|
+
setIsNavGroupExpanded(true);
|
|
276
|
+
} else {
|
|
277
|
+
setIsNavGroupExpanded(isExpanded);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!isMobile) {
|
|
281
|
+
if (!isDockExpandableExpanded && !isDockTextExpanded) {
|
|
282
|
+
setIsDockExpandableExpanded(true);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (!isDockTextExpanded) {
|
|
286
|
+
setIsDockTextExpanded(false);
|
|
287
|
+
}
|
|
209
288
|
}
|
|
210
289
|
};
|
|
211
290
|
|
|
@@ -221,6 +300,7 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
221
300
|
isSidebarOpen={isDockExpanded}
|
|
222
301
|
onSidebarToggle={onMobileToggle}
|
|
223
302
|
isHamburgerButton
|
|
303
|
+
id="mobile-masthead-toggle"
|
|
224
304
|
/>
|
|
225
305
|
</MastheadToggle>
|
|
226
306
|
<MastheadBrand>
|
|
@@ -278,12 +358,35 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
278
358
|
to="#nav-link1"
|
|
279
359
|
itemId={0}
|
|
280
360
|
isActive={activeItem === 0}
|
|
281
|
-
icon={<
|
|
361
|
+
icon={<RhUiCubesIcon />}
|
|
282
362
|
anchorRef={navItem1Ref}
|
|
283
363
|
aria-label="System panel"
|
|
284
364
|
>
|
|
285
365
|
System panel
|
|
286
366
|
</NavItem>
|
|
367
|
+
<NavExpandable
|
|
368
|
+
title="Folder"
|
|
369
|
+
groupId="nav-expandable-group-1"
|
|
370
|
+
isExpanded={isNavGroupExpanded}
|
|
371
|
+
icon={<RhUiFolderIcon />}
|
|
372
|
+
hasExpandableIcon={!isMobile}
|
|
373
|
+
buttonProps={{ ref: navItem5Ref, 'aria-label': 'Folder' }}
|
|
374
|
+
onExpand={onToggleNavGroup}
|
|
375
|
+
>
|
|
376
|
+
<NavItem
|
|
377
|
+
preventDefault
|
|
378
|
+
id="nav-expandable-item-1"
|
|
379
|
+
to="#nav-expandable-item-1"
|
|
380
|
+
groupId="nav-expandable-group-1"
|
|
381
|
+
itemId={5}
|
|
382
|
+
isActive={activeItem === 5}
|
|
383
|
+
icon={<RhUiResourceIcon />}
|
|
384
|
+
anchorRef={navItem6Ref}
|
|
385
|
+
aria-label="Subnav link 1"
|
|
386
|
+
>
|
|
387
|
+
Subnav link 1
|
|
388
|
+
</NavItem>
|
|
389
|
+
</NavExpandable>
|
|
287
390
|
<NavItem
|
|
288
391
|
preventDefault
|
|
289
392
|
id="nav-link2"
|
|
@@ -322,12 +425,14 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
322
425
|
</NavItem>
|
|
323
426
|
</NavList>
|
|
324
427
|
</Nav>
|
|
325
|
-
{!isDockTextExpanded && !isDockExpanded && (
|
|
428
|
+
{!isDockTextExpanded && !isDockExpanded && !isDockExpandableExpanded && (
|
|
326
429
|
<>
|
|
327
430
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem1Ref} content="System panel"></Tooltip>
|
|
328
431
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem2Ref} content="Policy"></Tooltip>
|
|
329
432
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem3Ref} content="Authentication"></Tooltip>
|
|
330
433
|
<Tooltip aria="none" aria-live="off" triggerRef={navItem4Ref} content="Network services"></Tooltip>
|
|
434
|
+
<Tooltip aria="none" aria-live="off" triggerRef={navItem5Ref} content="Folder"></Tooltip>
|
|
435
|
+
<Tooltip aria="none" aria-live="off" triggerRef={navItem6Ref} content="Subnav link 1"></Tooltip>
|
|
331
436
|
</>
|
|
332
437
|
)}
|
|
333
438
|
</ToolbarItem>
|
|
@@ -428,6 +533,7 @@ export const NavDockedNav: React.FunctionComponent = () => {
|
|
|
428
533
|
<Page
|
|
429
534
|
variant="docked"
|
|
430
535
|
isDockExpanded={isDockExpanded}
|
|
536
|
+
isDockExpandableExpanded={isDockExpandableExpanded}
|
|
431
537
|
isDockTextExpanded={isDockTextExpanded}
|
|
432
538
|
masthead={mobileMasthead}
|
|
433
539
|
dockContent={dockedMasthead}
|
package/src/helpers/index.ts
CHANGED