@patternfly/react-core 6.5.0-prerelease.61 → 6.5.0-prerelease.63
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 +12 -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/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 +2 -0
- package/dist/esm/components/Button/Button.js +3 -3
- package/dist/esm/components/Button/Button.js.map +1 -1
- package/dist/esm/components/Compass/Compass.d.ts +9 -1
- 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/Compass/CompassDockMain.d.ts +9 -0
- package/dist/esm/components/Compass/CompassDockMain.d.ts.map +1 -0
- package/dist/esm/components/Compass/CompassDockMain.js +10 -0
- package/dist/esm/components/Compass/CompassDockMain.js.map +1 -0
- package/dist/esm/components/Compass/index.d.ts +1 -0
- package/dist/esm/components/Compass/index.d.ts.map +1 -1
- package/dist/esm/components/Compass/index.js +1 -0
- package/dist/esm/components/Compass/index.js.map +1 -1
- package/dist/esm/components/OverflowMenu/OverflowMenu.d.ts +7 -1
- package/dist/esm/components/OverflowMenu/OverflowMenu.d.ts.map +1 -1
- package/dist/esm/components/OverflowMenu/OverflowMenu.js +33 -3
- package/dist/esm/components/OverflowMenu/OverflowMenu.js.map +1 -1
- package/dist/esm/components/Page/Page.d.ts +3 -3
- package/dist/esm/components/Page/Page.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/Toolbar.d.ts +5 -1
- package/dist/esm/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/Toolbar.js +2 -2
- package/dist/esm/components/Toolbar/Toolbar.js.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarContent.d.ts +9 -1
- package/dist/esm/components/Toolbar/ToolbarContent.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarContent.js +2 -2
- package/dist/esm/components/Toolbar/ToolbarContent.js.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarGroup.d.ts +9 -1
- package/dist/esm/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarGroup.js +3 -3
- package/dist/esm/components/Toolbar/ToolbarGroup.js.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarItem.d.ts +9 -1
- package/dist/esm/components/Toolbar/ToolbarItem.d.ts.map +1 -1
- package/dist/esm/components/Toolbar/ToolbarItem.js +2 -2
- package/dist/esm/components/Toolbar/ToolbarItem.js.map +1 -1
- package/dist/esm/demos/DashboardHeader.js +2 -2
- package/dist/esm/demos/DashboardHeader.js.map +1 -1
- package/dist/js/components/Button/Button.js +3 -3
- package/dist/js/components/Button/Button.js.map +1 -1
- package/dist/js/components/Compass/Compass.d.ts +9 -1
- 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/Compass/CompassDockMain.d.ts +9 -0
- package/dist/js/components/Compass/CompassDockMain.d.ts.map +1 -0
- package/dist/js/components/Compass/CompassDockMain.js +14 -0
- package/dist/js/components/Compass/CompassDockMain.js.map +1 -0
- package/dist/js/components/Compass/index.d.ts +1 -0
- package/dist/js/components/Compass/index.d.ts.map +1 -1
- package/dist/js/components/Compass/index.js +1 -0
- package/dist/js/components/Compass/index.js.map +1 -1
- package/dist/js/components/OverflowMenu/OverflowMenu.d.ts +7 -1
- package/dist/js/components/OverflowMenu/OverflowMenu.d.ts.map +1 -1
- package/dist/js/components/OverflowMenu/OverflowMenu.js +32 -2
- package/dist/js/components/OverflowMenu/OverflowMenu.js.map +1 -1
- package/dist/js/components/Page/Page.d.ts +3 -3
- package/dist/js/components/Page/Page.d.ts.map +1 -1
- package/dist/js/components/Toolbar/Toolbar.d.ts +5 -1
- package/dist/js/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/js/components/Toolbar/Toolbar.js +2 -2
- package/dist/js/components/Toolbar/Toolbar.js.map +1 -1
- package/dist/js/components/Toolbar/ToolbarContent.d.ts +9 -1
- package/dist/js/components/Toolbar/ToolbarContent.d.ts.map +1 -1
- package/dist/js/components/Toolbar/ToolbarContent.js +2 -2
- package/dist/js/components/Toolbar/ToolbarContent.js.map +1 -1
- package/dist/js/components/Toolbar/ToolbarGroup.d.ts +9 -1
- package/dist/js/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
- package/dist/js/components/Toolbar/ToolbarGroup.js +3 -3
- package/dist/js/components/Toolbar/ToolbarGroup.js.map +1 -1
- package/dist/js/components/Toolbar/ToolbarItem.d.ts +9 -1
- package/dist/js/components/Toolbar/ToolbarItem.d.ts.map +1 -1
- package/dist/js/components/Toolbar/ToolbarItem.js +2 -2
- package/dist/js/components/Toolbar/ToolbarItem.js.map +1 -1
- package/dist/js/demos/DashboardHeader.js +2 -2
- package/dist/js/demos/DashboardHeader.js.map +1 -1
- package/dist/umd/assets/{output-BFFKwYEy.css → output-CRZSV91U.css} +21320 -21111
- 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 +6 -6
- package/src/components/Button/Button.tsx +4 -4
- package/src/components/Button/examples/Button.md +2 -2
- package/src/components/Button/examples/ButtonPlainHasNoPadding.tsx +2 -2
- package/src/components/Button/examples/ButtonVariations.tsx +2 -2
- package/src/components/Compass/Compass.tsx +24 -2
- package/src/components/Compass/CompassDockMain.tsx +21 -0
- package/src/components/Compass/__tests__/Compass.test.tsx +30 -0
- package/src/components/Compass/__tests__/CompassDockMain.test.tsx +41 -0
- package/src/components/Compass/__tests__/__snapshots__/CompassDockMain.test.tsx.snap +13 -0
- package/src/components/Compass/examples/Compass.md +1 -1
- package/src/components/Compass/index.ts +1 -0
- package/src/components/EmptyState/__tests__/EmptyState.test.tsx +2 -2
- package/src/components/EmptyState/__tests__/__snapshots__/EmptyState.test.tsx.snap +2 -2
- package/src/components/InputGroup/examples/InputGroup.md +1 -1
- package/src/components/InputGroup/examples/InputGroupWithPopover.tsx +3 -3
- package/src/components/OverflowMenu/OverflowMenu.tsx +42 -4
- package/src/components/OverflowMenu/__tests__/OverflowMenu.test.tsx +18 -0
- package/src/components/OverflowMenu/examples/OverflowMenu.md +17 -1
- package/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainerHeight.tsx +109 -0
- package/src/components/OverflowMenu/examples/OverflowMenuSimpleVertical.tsx +76 -0
- package/src/components/Page/Page.tsx +3 -3
- package/src/components/SearchInput/__tests__/SearchInput.test.tsx +2 -2
- package/src/components/SearchInput/__tests__/__snapshots__/SearchInput.test.tsx.snap +2 -2
- package/src/components/SearchInput/examples/SearchInput.md +1 -1
- package/src/components/SearchInput/examples/SearchInputAdvanced.tsx +2 -2
- package/src/components/Toolbar/Toolbar.tsx +9 -1
- package/src/components/Toolbar/ToolbarContent.tsx +12 -2
- package/src/components/Toolbar/ToolbarGroup.tsx +12 -2
- package/src/components/Toolbar/ToolbarItem.tsx +12 -2
- package/src/components/Toolbar/__tests__/Toolbar.test.tsx +63 -2
- package/src/components/Toolbar/__tests__/ToolbarGroup.test.tsx +26 -0
- package/src/components/Toolbar/__tests__/ToolbarItem.test.tsx +26 -0
- package/src/components/Toolbar/examples/Toolbar.md +19 -1
- package/src/components/Toolbar/examples/ToolbarDynamicSticky.tsx +75 -0
- package/src/components/Toolbar/examples/ToolbarVertical.tsx +22 -0
- package/src/components/Tooltip/examples/Tooltip.md +1 -1
- package/src/demos/Compass/Compass.md +6 -3
- package/src/demos/Compass/examples/CompassDemo.tsx +2 -2
- package/src/demos/Compass/examples/CompassDockDemo.tsx +312 -131
- package/src/demos/DashboardHeader.tsx +2 -2
- package/src/demos/Masthead.md +1 -1
- package/src/demos/Nav.md +3 -2
- package/src/demos/NotificationDrawer/NotificationDrawer.md +1 -1
- package/src/demos/NotificationDrawer/examples/NotificationDrawerBasic.tsx +6 -2
- package/src/demos/NotificationDrawer/examples/NotificationDrawerGrouped.tsx +6 -2
- package/src/demos/Page.md +1 -1
- package/src/demos/RTL/RTL.md +1 -1
- package/src/demos/RTL/examples/PaginatedTable.tsx +2 -2
- package/src/demos/examples/Masthead/MastheadWithHorizontalNav.tsx +2 -2
- package/src/demos/examples/Masthead/MastheadWithUtilitiesAndUserDropdownMenu.tsx +2 -2
- package/src/demos/examples/Nav/NavDockedNav.tsx +47 -13
- package/src/demos/examples/Nav/NavFlyout.tsx +2 -2
- package/src/demos/examples/Nav/NavHorizontal.tsx +2 -2
- package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +2 -2
- package/src/demos/examples/Nav/NavManual.tsx +2 -2
- package/src/demos/examples/Page/PageContextSelector.tsx +2 -2
- package/src/demos/examples/Page/PageStickySectionBreadcrumb.tsx +2 -2
- package/src/demos/examples/Page/PageStickySectionGroup.tsx +2 -2
- package/src/demos/examples/Page/PageStickySectionGroupAlternate.tsx +2 -2
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
OverflowMenu,
|
|
4
|
+
OverflowMenuControl,
|
|
5
|
+
OverflowMenuContent,
|
|
6
|
+
OverflowMenuGroup,
|
|
7
|
+
OverflowMenuItem,
|
|
8
|
+
OverflowMenuDropdownItem,
|
|
9
|
+
MenuToggle,
|
|
10
|
+
Dropdown,
|
|
11
|
+
DropdownList
|
|
12
|
+
} from '@patternfly/react-core';
|
|
13
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
14
|
+
|
|
15
|
+
export const OverflowMenuSimpleVertical: React.FunctionComponent = () => {
|
|
16
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
17
|
+
|
|
18
|
+
const onToggle = () => {
|
|
19
|
+
setIsOpen(!isOpen);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const onSelect = () => {
|
|
23
|
+
setIsOpen(!isOpen);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const dropdownItems = [
|
|
27
|
+
<OverflowMenuDropdownItem itemId={0} key="item1" isShared>
|
|
28
|
+
Item 1
|
|
29
|
+
</OverflowMenuDropdownItem>,
|
|
30
|
+
<OverflowMenuDropdownItem itemId={1} key="item2" isShared>
|
|
31
|
+
Item 2
|
|
32
|
+
</OverflowMenuDropdownItem>,
|
|
33
|
+
<OverflowMenuDropdownItem itemId={2} key="item3" isShared>
|
|
34
|
+
Item 3
|
|
35
|
+
</OverflowMenuDropdownItem>,
|
|
36
|
+
<OverflowMenuDropdownItem itemId={3} key="item4" isShared>
|
|
37
|
+
Item 4
|
|
38
|
+
</OverflowMenuDropdownItem>,
|
|
39
|
+
<OverflowMenuDropdownItem itemId={4} key="item5" isShared>
|
|
40
|
+
Item 5
|
|
41
|
+
</OverflowMenuDropdownItem>
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<OverflowMenu breakpoint="md" isVertical>
|
|
46
|
+
<OverflowMenuContent>
|
|
47
|
+
<OverflowMenuItem>Item</OverflowMenuItem>
|
|
48
|
+
<OverflowMenuItem>Item</OverflowMenuItem>
|
|
49
|
+
<OverflowMenuGroup>
|
|
50
|
+
<OverflowMenuItem>Item</OverflowMenuItem>
|
|
51
|
+
<OverflowMenuItem>Item</OverflowMenuItem>
|
|
52
|
+
<OverflowMenuItem>Item</OverflowMenuItem>
|
|
53
|
+
</OverflowMenuGroup>
|
|
54
|
+
</OverflowMenuContent>
|
|
55
|
+
<OverflowMenuControl>
|
|
56
|
+
<Dropdown
|
|
57
|
+
onSelect={onSelect}
|
|
58
|
+
toggle={(toggleRef) => (
|
|
59
|
+
<MenuToggle
|
|
60
|
+
ref={toggleRef}
|
|
61
|
+
aria-label="Simple example overflow menu"
|
|
62
|
+
variant="plain"
|
|
63
|
+
onClick={onToggle}
|
|
64
|
+
isExpanded={isOpen}
|
|
65
|
+
icon={<EllipsisVIcon />}
|
|
66
|
+
/>
|
|
67
|
+
)}
|
|
68
|
+
isOpen={isOpen}
|
|
69
|
+
onOpenChange={(isOpen) => setIsOpen(isOpen)}
|
|
70
|
+
>
|
|
71
|
+
<DropdownList>{dropdownItems}</DropdownList>
|
|
72
|
+
</Dropdown>
|
|
73
|
+
</OverflowMenuControl>
|
|
74
|
+
</OverflowMenu>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
@@ -24,9 +24,9 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
24
24
|
variant?: 'default' | 'docked';
|
|
25
25
|
/** @beta Flag indicating the docked nav is expanded on mobile. Only applies when variant is docked. */
|
|
26
26
|
isDockExpanded?: boolean;
|
|
27
|
-
/** @beta Flag indicating the docked nav should display text on desktop. Only applies when variant is docked, and
|
|
28
|
-
*
|
|
29
|
-
|
|
27
|
+
/** @beta Flag indicating the docked nav should display text on desktop. Only applies when variant is docked, and
|
|
28
|
+
* will handle toggling the visibility of the text in individual isDocked components.
|
|
29
|
+
*/
|
|
30
30
|
isDockTextExpanded?: boolean;
|
|
31
31
|
/** The horizontal masthead content (e.g. <Masthead />). When using the docked variant, this content will only render at mobile viewports. */
|
|
32
32
|
masthead?: React.ReactNode;
|
|
@@ -6,7 +6,7 @@ import { SearchInput } from '../SearchInput';
|
|
|
6
6
|
import { FormGroup } from '../../Form';
|
|
7
7
|
import { Button } from '../../Button';
|
|
8
8
|
import { AnimationsProvider } from '../../../helpers/AnimationsProvider';
|
|
9
|
-
import
|
|
9
|
+
import RhUiExternalLinkFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-external-link-fill-icon';
|
|
10
10
|
import badgeStyles from '@patternfly/react-styles/css/components/Badge/badge';
|
|
11
11
|
import textInputGroupStyles from '@patternfly/react-styles/css/components/TextInputGroup/text-input-group';
|
|
12
12
|
import inputGroupStyles from '@patternfly/react-styles/css/components/InputGroup/input-group';
|
|
@@ -128,7 +128,7 @@ describe('SearchInput', () => {
|
|
|
128
128
|
advancedSearchDelimiter=":"
|
|
129
129
|
formAdditionalItems={
|
|
130
130
|
<FormGroup fieldId="test-form-group">
|
|
131
|
-
<Button variant="link" isInline icon={<
|
|
131
|
+
<Button variant="link" isInline icon={<RhUiExternalLinkFillIcon />} iconPosition="right">
|
|
132
132
|
Link
|
|
133
133
|
</Button>
|
|
134
134
|
</FormGroup>
|
|
@@ -496,11 +496,11 @@ exports[`SearchInput advanced search with custom attributes 1`] = `
|
|
|
496
496
|
fill="currentColor"
|
|
497
497
|
height="1em"
|
|
498
498
|
role="img"
|
|
499
|
-
viewBox="0 0
|
|
499
|
+
viewBox="0 0 32 32"
|
|
500
500
|
width="1em"
|
|
501
501
|
>
|
|
502
502
|
<path
|
|
503
|
-
d="
|
|
503
|
+
d="M28.5 2h-25C2.673 2 2 2.673 2 3.5v25c0 .827.673 1.5 1.5 1.5h25c.827 0 1.5-.673 1.5-1.5v-25c0-.827-.673-1.5-1.5-1.5Zm-3.375 17a1.125 1.125 0 0 1-2.25 0v-8.284L11.796 21.795a1.122 1.122 0 0 1-1.592 0 1.127 1.127 0 0 1 0-1.591l11.08-11.08H13a1.125 1.125 0 0 1 0-2.25h10.5c.896 0 1.625.729 1.625 1.625v10.5Z"
|
|
504
504
|
/>
|
|
505
505
|
</svg>
|
|
506
506
|
</span>
|
|
@@ -6,7 +6,7 @@ propComponents: ['SearchInput', 'SearchInputSearchAttribute', 'SearchInputExpand
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
import { useRef, useState } from 'react';
|
|
9
|
-
import
|
|
9
|
+
import RhUiExternalLinkFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-external-link-fill-icon';
|
|
10
10
|
|
|
11
11
|
## Examples
|
|
12
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
import { Button, Checkbox, FormGroup, SearchInput } from '@patternfly/react-core';
|
|
3
|
-
import
|
|
3
|
+
import RhUiExternalLinkFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-external-link-fill-icon';
|
|
4
4
|
|
|
5
5
|
export const SearchInputAdvanced: React.FunctionComponent = () => {
|
|
6
6
|
const [value, setValue] = useState('username:player firstname:john');
|
|
@@ -45,7 +45,7 @@ export const SearchInputAdvanced: React.FunctionComponent = () => {
|
|
|
45
45
|
formAdditionalItems={
|
|
46
46
|
useCustomFooter ? (
|
|
47
47
|
<FormGroup>
|
|
48
|
-
<Button variant="link" isInline icon={<
|
|
48
|
+
<Button variant="link" isInline icon={<RhUiExternalLinkFillIcon />} iconPosition="end">
|
|
49
49
|
Link
|
|
50
50
|
</Button>
|
|
51
51
|
</FormGroup>
|
|
@@ -38,8 +38,12 @@ export interface ToolbarProps extends React.HTMLProps<HTMLDivElement>, OUIAProps
|
|
|
38
38
|
isFullHeight?: boolean;
|
|
39
39
|
/** Flag indicating the toolbar is static */
|
|
40
40
|
isStatic?: boolean;
|
|
41
|
-
/** Flag indicating the toolbar should stick to the top of its container */
|
|
41
|
+
/** Flag indicating the toolbar should stick to the top of its container. This property applies both the sticky position and styling. */
|
|
42
42
|
isSticky?: boolean;
|
|
43
|
+
/** @beta Flag indicating the toolbar should have sticky positioning to the top of its container */
|
|
44
|
+
isStickyBase?: boolean;
|
|
45
|
+
/** @beta Flag indicating the toolbar should have stuck styling, when the toolbar is not at the top of the scroll container */
|
|
46
|
+
isStickyStuck?: boolean;
|
|
43
47
|
/** @beta Flag indicating the toolbar has a vertical orientation */
|
|
44
48
|
isVertical?: boolean;
|
|
45
49
|
/** Insets at various breakpoints. */
|
|
@@ -144,6 +148,8 @@ class Toolbar extends Component<ToolbarProps, ToolbarState> {
|
|
|
144
148
|
children,
|
|
145
149
|
isFullHeight,
|
|
146
150
|
isStatic,
|
|
151
|
+
isStickyBase,
|
|
152
|
+
isStickyStuck,
|
|
147
153
|
inset,
|
|
148
154
|
isSticky,
|
|
149
155
|
isVertical,
|
|
@@ -171,6 +177,8 @@ class Toolbar extends Component<ToolbarProps, ToolbarState> {
|
|
|
171
177
|
isFullHeight && styles.modifiers.fullHeight,
|
|
172
178
|
isStatic && styles.modifiers.static,
|
|
173
179
|
isSticky && styles.modifiers.sticky,
|
|
180
|
+
isStickyBase && styles.modifiers.stickyBase,
|
|
181
|
+
isStickyStuck && styles.modifiers.stickyStuck,
|
|
174
182
|
isVertical && styles.modifiers.vertical,
|
|
175
183
|
formatBreakpointMods(inset, styles, '', getBreakpoint(width)),
|
|
176
184
|
colorVariant === 'primary' && styles.modifiers.primary,
|
|
@@ -8,7 +8,7 @@ import { PageContext } from '../Page/PageContext';
|
|
|
8
8
|
export interface ToolbarContentProps extends React.HTMLProps<HTMLDivElement> {
|
|
9
9
|
/** Classes applied to root element of the data toolbar content row */
|
|
10
10
|
className?: string;
|
|
11
|
-
/** Visibility at various breakpoints. */
|
|
11
|
+
/** Visibility at various width breakpoints. */
|
|
12
12
|
visibility?: {
|
|
13
13
|
default?: 'hidden' | 'visible';
|
|
14
14
|
md?: 'hidden' | 'visible';
|
|
@@ -16,6 +16,14 @@ export interface ToolbarContentProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
16
16
|
xl?: 'hidden' | 'visible';
|
|
17
17
|
'2xl'?: 'hidden' | 'visible';
|
|
18
18
|
};
|
|
19
|
+
/** Visibility at various height breakpoints. */
|
|
20
|
+
visibilityAtHeight?: {
|
|
21
|
+
default?: 'hidden' | 'visible';
|
|
22
|
+
md?: 'hidden' | 'visible';
|
|
23
|
+
lg?: 'hidden' | 'visible';
|
|
24
|
+
xl?: 'hidden' | 'visible';
|
|
25
|
+
'2xl'?: 'hidden' | 'visible';
|
|
26
|
+
};
|
|
19
27
|
/** Value to set for content wrapping at various breakpoints */
|
|
20
28
|
rowWrap?: {
|
|
21
29
|
default?: 'wrap' | 'nowrap';
|
|
@@ -59,6 +67,7 @@ class ToolbarContent extends Component<ToolbarContentProps> {
|
|
|
59
67
|
isExpanded,
|
|
60
68
|
toolbarId,
|
|
61
69
|
visibility,
|
|
70
|
+
visibilityAtHeight,
|
|
62
71
|
rowWrap,
|
|
63
72
|
alignItems,
|
|
64
73
|
clearAllFilters,
|
|
@@ -69,11 +78,12 @@ class ToolbarContent extends Component<ToolbarContentProps> {
|
|
|
69
78
|
|
|
70
79
|
return (
|
|
71
80
|
<PageContext.Consumer>
|
|
72
|
-
{({ width, getBreakpoint }) => (
|
|
81
|
+
{({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
|
|
73
82
|
<div
|
|
74
83
|
className={css(
|
|
75
84
|
styles.toolbarContent,
|
|
76
85
|
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
|
|
86
|
+
formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
|
|
77
87
|
className
|
|
78
88
|
)}
|
|
79
89
|
ref={this.expandableContentRef}
|
|
@@ -23,7 +23,7 @@ export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>,
|
|
|
23
23
|
| 'action-group-inline'
|
|
24
24
|
| 'action-group-plain'
|
|
25
25
|
| 'label-group';
|
|
26
|
-
/** Visibility at various breakpoints. */
|
|
26
|
+
/** Visibility at various width breakpoints. */
|
|
27
27
|
visibility?: {
|
|
28
28
|
default?: 'hidden' | 'visible';
|
|
29
29
|
md?: 'hidden' | 'visible';
|
|
@@ -31,6 +31,14 @@ export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>,
|
|
|
31
31
|
xl?: 'hidden' | 'visible';
|
|
32
32
|
'2xl'?: 'hidden' | 'visible';
|
|
33
33
|
};
|
|
34
|
+
/** Visibility at various height breakpoints. */
|
|
35
|
+
visibilityAtHeight?: {
|
|
36
|
+
default?: 'hidden' | 'visible';
|
|
37
|
+
md?: 'hidden' | 'visible';
|
|
38
|
+
lg?: 'hidden' | 'visible';
|
|
39
|
+
xl?: 'hidden' | 'visible';
|
|
40
|
+
'2xl'?: 'hidden' | 'visible';
|
|
41
|
+
};
|
|
34
42
|
/** Applies to a child of a flex layout, and aligns that child (and any adjacent children on the other side of it) to one side of the main axis */
|
|
35
43
|
align?: {
|
|
36
44
|
default?: 'alignEnd' | 'alignStart' | 'alignCenter';
|
|
@@ -178,6 +186,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
|
|
|
178
186
|
render() {
|
|
179
187
|
const {
|
|
180
188
|
visibility,
|
|
189
|
+
visibilityAtHeight,
|
|
181
190
|
align,
|
|
182
191
|
alignItems,
|
|
183
192
|
alignSelf,
|
|
@@ -195,7 +204,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
|
|
|
195
204
|
|
|
196
205
|
return (
|
|
197
206
|
<PageContext.Consumer>
|
|
198
|
-
{({ width, getBreakpoint }) => (
|
|
207
|
+
{({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
|
|
199
208
|
<div
|
|
200
209
|
className={css(
|
|
201
210
|
styles.toolbarGroup,
|
|
@@ -209,6 +218,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
|
|
|
209
218
|
| 'labelGroup'
|
|
210
219
|
],
|
|
211
220
|
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
|
|
221
|
+
formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
|
|
212
222
|
formatBreakpointMods(align, styles, '', getBreakpoint(width)),
|
|
213
223
|
formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
|
|
214
224
|
formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
|
|
@@ -17,7 +17,7 @@ export interface ToolbarItemProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
17
17
|
className?: string;
|
|
18
18
|
/** A type modifier which modifies spacing specifically depending on the type of item */
|
|
19
19
|
variant?: ToolbarItemVariant | 'pagination' | 'label' | 'label-group' | 'separator' | 'expand-all';
|
|
20
|
-
/** Visibility at various breakpoints. */
|
|
20
|
+
/** Visibility at various width breakpoints. */
|
|
21
21
|
visibility?: {
|
|
22
22
|
default?: 'hidden' | 'visible';
|
|
23
23
|
md?: 'hidden' | 'visible';
|
|
@@ -25,6 +25,14 @@ export interface ToolbarItemProps extends React.HTMLProps<HTMLDivElement> {
|
|
|
25
25
|
xl?: 'hidden' | 'visible';
|
|
26
26
|
'2xl'?: 'hidden' | 'visible';
|
|
27
27
|
};
|
|
28
|
+
/** Visibility at various height breakpoints. */
|
|
29
|
+
visibilityAtHeight?: {
|
|
30
|
+
default?: 'hidden' | 'visible';
|
|
31
|
+
md?: 'hidden' | 'visible';
|
|
32
|
+
lg?: 'hidden' | 'visible';
|
|
33
|
+
xl?: 'hidden' | 'visible';
|
|
34
|
+
'2xl'?: 'hidden' | 'visible';
|
|
35
|
+
};
|
|
28
36
|
/** Applies to a child of a flex layout, and aligns that child (and any adjacent children on the other side of it) to one side of the main axis */
|
|
29
37
|
align?: {
|
|
30
38
|
default?: 'alignEnd' | 'alignStart' | 'alignCenter';
|
|
@@ -174,6 +182,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
|
|
|
174
182
|
className,
|
|
175
183
|
variant,
|
|
176
184
|
visibility,
|
|
185
|
+
visibilityAtHeight,
|
|
177
186
|
gap,
|
|
178
187
|
columnGap,
|
|
179
188
|
rowGap,
|
|
@@ -202,7 +211,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
|
|
|
202
211
|
|
|
203
212
|
return (
|
|
204
213
|
<PageContext.Consumer>
|
|
205
|
-
{({ width, getBreakpoint }) => (
|
|
214
|
+
{({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
|
|
206
215
|
<div
|
|
207
216
|
className={css(
|
|
208
217
|
styles.toolbarItem,
|
|
@@ -211,6 +220,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
|
|
|
211
220
|
isAllExpanded && styles.modifiers.expanded,
|
|
212
221
|
isOverflowContainer && styles.modifiers.overflowContainer,
|
|
213
222
|
formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
|
|
223
|
+
formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
|
|
214
224
|
formatBreakpointMods(align, styles, '', getBreakpoint(width)),
|
|
215
225
|
formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
|
|
216
226
|
formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fragment } from 'react';
|
|
1
|
+
import { createElement, Fragment } from 'react';
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import '@testing-library/jest-dom';
|
|
4
4
|
|
|
@@ -206,6 +206,32 @@ describe('Toolbar', () => {
|
|
|
206
206
|
});
|
|
207
207
|
});
|
|
208
208
|
|
|
209
|
+
const bps = ['default', 'md', 'lg', 'xl', '2xl'] as const;
|
|
210
|
+
describe.each(bps)(`ToolbarContent visibilityAtHeight`, (bp) => {
|
|
211
|
+
it(`Applies correct visible class at ${bp}`, () => {
|
|
212
|
+
render(
|
|
213
|
+
<ToolbarContent data-testid="toolbarcontent" visibilityAtHeight={{ [bp]: 'visible' }}>
|
|
214
|
+
Test
|
|
215
|
+
</ToolbarContent>
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
if (bp !== 'default') {
|
|
219
|
+
expect(screen.getByTestId('toolbarcontent')).toHaveClass(`pf-m-visible-on-${bp}-height`);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it(`Applies correct hidden class at ${bp}`, () => {
|
|
224
|
+
render(
|
|
225
|
+
<ToolbarContent data-testid="toolbarcontent" visibilityAtHeight={{ [bp]: 'hidden' }}>
|
|
226
|
+
Test
|
|
227
|
+
</ToolbarContent>
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
const expectedClass = bp === 'default' ? 'pf-m-hidden' : `pf-m-hidden-on-${bp}-height`;
|
|
231
|
+
expect(screen.getByTestId('toolbarcontent')).toHaveClass(expectedClass);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
|
|
209
235
|
it(`Renders toolbar without ${styles.modifiers.vertical} by default`, () => {
|
|
210
236
|
render(
|
|
211
237
|
<Toolbar data-testid="Toolbar-test-is-not-vertical">
|
|
@@ -220,7 +246,7 @@ describe('Toolbar', () => {
|
|
|
220
246
|
expect(screen.getByTestId('Toolbar-test-is-not-vertical')).not.toHaveClass(styles.modifiers.vertical);
|
|
221
247
|
});
|
|
222
248
|
|
|
223
|
-
it(
|
|
249
|
+
it(`Renders with class ${styles.modifiers.vertical} when isVertical is true`, () => {
|
|
224
250
|
const items = (
|
|
225
251
|
<Fragment>
|
|
226
252
|
<ToolbarItem>Test</ToolbarItem>
|
|
@@ -238,4 +264,39 @@ describe('Toolbar', () => {
|
|
|
238
264
|
|
|
239
265
|
expect(screen.getByTestId('Toolbar-test-is-vertical')).toHaveClass(styles.modifiers.vertical);
|
|
240
266
|
});
|
|
267
|
+
|
|
268
|
+
it(`Does not add ${styles.modifiers.stickyBase} and ${styles.modifiers.stickyStuck} classes by default`, () => {
|
|
269
|
+
render(
|
|
270
|
+
<Toolbar data-testid="toolbar-sticky-default">
|
|
271
|
+
<ToolbarContent>
|
|
272
|
+
<ToolbarItem>Test</ToolbarItem>
|
|
273
|
+
</ToolbarContent>
|
|
274
|
+
</Toolbar>
|
|
275
|
+
);
|
|
276
|
+
const el = screen.getByTestId('toolbar-sticky-default');
|
|
277
|
+
expect(el).not.toHaveClass(styles.modifiers.stickyBase);
|
|
278
|
+
expect(el).not.toHaveClass(styles.modifiers.stickyStuck);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it(`Adds ${styles.modifiers.stickyBase} when isStickyBase is true`, () => {
|
|
282
|
+
render(
|
|
283
|
+
<Toolbar data-testid="toolbar-sticky-base" isStickyBase>
|
|
284
|
+
<ToolbarContent>
|
|
285
|
+
<ToolbarItem>Test</ToolbarItem>
|
|
286
|
+
</ToolbarContent>
|
|
287
|
+
</Toolbar>
|
|
288
|
+
);
|
|
289
|
+
expect(screen.getByTestId('toolbar-sticky-base')).toHaveClass(styles.modifiers.stickyBase);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it(`Adds ${styles.modifiers.stickyStuck} when isStickyStuck is true`, () => {
|
|
293
|
+
render(
|
|
294
|
+
<Toolbar data-testid="toolbar-sticky-stuck" isStickyStuck>
|
|
295
|
+
<ToolbarContent>
|
|
296
|
+
<ToolbarItem>Test</ToolbarItem>
|
|
297
|
+
</ToolbarContent>
|
|
298
|
+
</Toolbar>
|
|
299
|
+
);
|
|
300
|
+
expect(screen.getByTestId('toolbar-sticky-stuck')).toHaveClass(styles.modifiers.stickyStuck);
|
|
301
|
+
});
|
|
241
302
|
});
|
|
@@ -37,4 +37,30 @@ describe('ToolbarGroup', () => {
|
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
39
|
});
|
|
40
|
+
|
|
41
|
+
const bps = ['default', 'md', 'lg', 'xl', '2xl'] as const;
|
|
42
|
+
describe.each(bps)(`ToolbarGroup visibilityAtHeight`, (bp) => {
|
|
43
|
+
it(`Applies correct visible class at ${bp}`, () => {
|
|
44
|
+
render(
|
|
45
|
+
<ToolbarGroup data-testid="toolbargroup" visibilityAtHeight={{ [bp]: 'visible' }}>
|
|
46
|
+
Test
|
|
47
|
+
</ToolbarGroup>
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
if (bp !== 'default') {
|
|
51
|
+
expect(screen.getByTestId('toolbargroup')).toHaveClass(`pf-m-visible-on-${bp}-height`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it(`Applies correct hidden class at ${bp}`, () => {
|
|
56
|
+
render(
|
|
57
|
+
<ToolbarGroup data-testid="toolbargroup" visibilityAtHeight={{ [bp]: 'hidden' }}>
|
|
58
|
+
Test
|
|
59
|
+
</ToolbarGroup>
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const expectedClass = bp === 'default' ? 'pf-m-hidden' : `pf-m-hidden-on-${bp}-height`;
|
|
63
|
+
expect(screen.getByTestId('toolbargroup')).toHaveClass(expectedClass);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
40
66
|
});
|
|
@@ -37,4 +37,30 @@ describe('ToolbarItem', () => {
|
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
39
|
});
|
|
40
|
+
|
|
41
|
+
const bps = ['default', 'md', 'lg', 'xl', '2xl'] as const;
|
|
42
|
+
describe.each(bps)(`ToolbarItem visibilityAtHeight`, (bp) => {
|
|
43
|
+
it(`Applies correct visible class at ${bp}`, () => {
|
|
44
|
+
render(
|
|
45
|
+
<ToolbarItem data-testid="toolbaritem" visibilityAtHeight={{ [bp]: 'visible' }}>
|
|
46
|
+
Test
|
|
47
|
+
</ToolbarItem>
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
if (bp !== 'default') {
|
|
51
|
+
expect(screen.getByTestId('toolbaritem')).toHaveClass(`pf-m-visible-on-${bp}-height`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it(`Applies correct hidden class at ${bp}`, () => {
|
|
56
|
+
render(
|
|
57
|
+
<ToolbarItem data-testid="toolbaritem" visibilityAtHeight={{ [bp]: 'hidden' }}>
|
|
58
|
+
Test
|
|
59
|
+
</ToolbarItem>
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const expectedClass = bp === 'default' ? 'pf-m-hidden' : `pf-m-hidden-on-${bp}-height`;
|
|
63
|
+
expect(screen.getByTestId('toolbaritem')).toHaveClass(expectedClass);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
40
66
|
});
|
|
@@ -5,7 +5,7 @@ propComponents: ['Toolbar', 'ToolbarContent', 'ToolbarGroup', 'ToolbarItem', 'To
|
|
|
5
5
|
section: components
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
import { Fragment, useState } from 'react';
|
|
8
|
+
import { Fragment, useState, useLayoutEffect, useRef } from 'react';
|
|
9
9
|
|
|
10
10
|
import EditIcon from '@patternfly/react-icons/dist/esm/icons/edit-icon';
|
|
11
11
|
import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon';
|
|
@@ -34,6 +34,14 @@ To adjust a toolbar’s inset, use the `inset` property. You can set the inset v
|
|
|
34
34
|
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
+
### Vertical toolbar
|
|
38
|
+
|
|
39
|
+
A toolbar's orientation may be changed using the `isVertical` property. Responsive behavior when height is adjusted may be customized for the `ToolbarContent`, `ToolbarGroup`, and `ToolbarItem` components using their respective `visibilityAtHeight` property.
|
|
40
|
+
|
|
41
|
+
```ts file="./ToolbarVertical.tsx"
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
|
|
37
45
|
### Sticky toolbar
|
|
38
46
|
|
|
39
47
|
To lock a toolbar and prevent it from scrolling with other content, use a sticky toolbar.
|
|
@@ -44,6 +52,14 @@ In the following example, toggle the "is toolbar sticky" checkbox to see the dif
|
|
|
44
52
|
|
|
45
53
|
```
|
|
46
54
|
|
|
55
|
+
### Dynamic sticky toolbar
|
|
56
|
+
|
|
57
|
+
A toolbar may alternatively be made sticky with two properties: `isStickyBase` and `isStickyStuck` - which allows separate control of the sticky position and sticky styling respectively. In this example, `isStickyStuck` is only applied when the sticky element is not at the top of the scroll parent container.
|
|
58
|
+
|
|
59
|
+
```ts file="./ToolbarDynamicSticky.tsx"
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
|
|
47
63
|
### With groups of items
|
|
48
64
|
|
|
49
65
|
You can group similar items together to create desired associations and to enable items to respond to changes in viewport width together.
|
|
@@ -114,11 +130,13 @@ When all of a toolbar's required elements cannot fit in a single line, you can s
|
|
|
114
130
|
```
|
|
115
131
|
|
|
116
132
|
## Examples with spacers and wrapping
|
|
133
|
+
|
|
117
134
|
You may adjust the space between toolbar items to arrange them into groups. Read our spacers documentation to learn more about using spacers.
|
|
118
135
|
|
|
119
136
|
Items are spaced “16px” apart by default and can be modified by changing their or their parents' `gap`, `columnGap`, and `rowGap` properties. You can set the property values at multiple breakpoints, including "default", "md", "lg", "xl", and "2xl".
|
|
120
137
|
|
|
121
138
|
### Toolbar content wrapping
|
|
139
|
+
|
|
122
140
|
The toolbar content section will wrap by default, but you can set the `rowRap` property to `noWrap` to make it not wrap.
|
|
123
141
|
|
|
124
142
|
```ts file="./ToolbarContentWrap.tsx"
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { useLayoutEffect, useState, useRef } from 'react';
|
|
2
|
+
import { Toolbar, ToolbarItem, ToolbarContent, SearchInput, Checkbox } from '@patternfly/react-core';
|
|
3
|
+
|
|
4
|
+
const useIsStuckFromScrollParent = ({
|
|
5
|
+
shouldTrack,
|
|
6
|
+
scrollParentRef
|
|
7
|
+
}: {
|
|
8
|
+
/** Indicates whether to track the scroll top position of the scroll parent element */
|
|
9
|
+
shouldTrack: boolean;
|
|
10
|
+
/** Reference to the scroll parent element */
|
|
11
|
+
scrollParentRef: React.RefObject<any>;
|
|
12
|
+
}): boolean => {
|
|
13
|
+
const [isStuck, setIsStuck] = useState(false);
|
|
14
|
+
|
|
15
|
+
useLayoutEffect(() => {
|
|
16
|
+
if (!shouldTrack) {
|
|
17
|
+
setIsStuck(false);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const scrollElement = scrollParentRef.current;
|
|
22
|
+
if (!scrollElement) {
|
|
23
|
+
setIsStuck(false);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const syncFromScroll = () => {
|
|
28
|
+
setIsStuck(scrollElement.scrollTop > 0);
|
|
29
|
+
};
|
|
30
|
+
syncFromScroll();
|
|
31
|
+
scrollElement.addEventListener('scroll', syncFromScroll, { passive: true });
|
|
32
|
+
return () => scrollElement.removeEventListener('scroll', syncFromScroll);
|
|
33
|
+
}, [shouldTrack, scrollParentRef]);
|
|
34
|
+
|
|
35
|
+
return isStuck;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export const ToolbarDynamicSticky = () => {
|
|
39
|
+
const scrollParentRef = useRef<HTMLDivElement>(null);
|
|
40
|
+
const isStickyStuck = useIsStuckFromScrollParent({ shouldTrack: true, scrollParentRef });
|
|
41
|
+
const [showEvenOnly, setShowEvenOnly] = useState(true);
|
|
42
|
+
const [searchValue, setSearchValue] = useState('');
|
|
43
|
+
const array = Array.from(Array(30), (_, x) => x); // create array of numbers from 1-30 for demo purposes
|
|
44
|
+
const numbers = showEvenOnly ? array.filter((number) => number % 2 === 0) : array;
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<div id="dynamic-sticky-scroll-parent" ref={scrollParentRef} style={{ overflowY: 'scroll', height: '200px' }}>
|
|
48
|
+
<Toolbar id="toolbar-dynamic-sticky" inset={{ default: 'insetNone' }} isStickyBase isStickyStuck={isStickyStuck}>
|
|
49
|
+
<ToolbarContent>
|
|
50
|
+
<ToolbarItem>
|
|
51
|
+
<SearchInput
|
|
52
|
+
aria-label="Sticky example search input"
|
|
53
|
+
value={searchValue}
|
|
54
|
+
onChange={(_event, value) => setSearchValue(value)}
|
|
55
|
+
onClear={() => setSearchValue('')}
|
|
56
|
+
/>
|
|
57
|
+
</ToolbarItem>
|
|
58
|
+
<ToolbarItem alignSelf="center">
|
|
59
|
+
<Checkbox
|
|
60
|
+
label="Show only even number items"
|
|
61
|
+
isChecked={showEvenOnly}
|
|
62
|
+
onChange={(_event, checked) => setShowEvenOnly(checked)}
|
|
63
|
+
id="showOnlyEvenCheckbox"
|
|
64
|
+
/>
|
|
65
|
+
</ToolbarItem>
|
|
66
|
+
</ToolbarContent>
|
|
67
|
+
</Toolbar>
|
|
68
|
+
<ul>
|
|
69
|
+
{numbers.map((number) => (
|
|
70
|
+
<li key={number}>{`item ${number}`}</li>
|
|
71
|
+
))}
|
|
72
|
+
</ul>
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem } from '@patternfly/react-core';
|
|
2
|
+
|
|
3
|
+
export const ToolbarVertical: React.FunctionComponent = () => (
|
|
4
|
+
<Toolbar id="toolbar-vertical" isVertical>
|
|
5
|
+
<ToolbarContent>
|
|
6
|
+
<ToolbarGroup variant="action-group-plain">
|
|
7
|
+
<ToolbarItem>Item 1</ToolbarItem>
|
|
8
|
+
<ToolbarItem>Item 2</ToolbarItem>
|
|
9
|
+
<ToolbarItem>Item 3</ToolbarItem>
|
|
10
|
+
</ToolbarGroup>
|
|
11
|
+
<ToolbarGroup variant="action-group-plain" visibilityAtHeight={{ default: 'hidden', md: 'visible' }}>
|
|
12
|
+
<ToolbarItem>Item 4 (visible above md breakpoint)</ToolbarItem>
|
|
13
|
+
<ToolbarItem visibilityAtHeight={{ default: 'hidden', lg: 'visible' }}>
|
|
14
|
+
Item 5 (visible above lg breakpoint)
|
|
15
|
+
</ToolbarItem>
|
|
16
|
+
<ToolbarItem visibilityAtHeight={{ default: 'hidden', lg: 'visible' }}>
|
|
17
|
+
Item 6 (visible above lg breakpoint)
|
|
18
|
+
</ToolbarItem>
|
|
19
|
+
</ToolbarGroup>
|
|
20
|
+
</ToolbarContent>
|
|
21
|
+
</Toolbar>
|
|
22
|
+
);
|
|
@@ -6,7 +6,7 @@ propComponents: ['Tooltip']
|
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
import { useEffect, useRef, useState } from 'react';
|
|
9
|
-
import
|
|
9
|
+
import RhUiQuestionMarkCircleIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-icon';
|
|
10
10
|
import CopyIcon from '@patternfly/react-icons/dist/esm/icons/copy-icon';
|
|
11
11
|
import './TooltipExamples.css';
|
|
12
12
|
|