|
| 1 | +import React, { useState } 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 | + MastheadToggle, |
| 14 | + MastheadMain, |
| 15 | + MastheadBrand, |
| 16 | + MastheadContent, |
| 17 | + MenuToggle, |
| 18 | + Toolbar, |
| 19 | + ToolbarContent, |
| 20 | + ToolbarGroup, |
| 21 | + ToolbarItem, |
| 22 | + PageToggleButton |
| 23 | +} from '@patternfly/react-core'; |
| 24 | +import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon'; |
| 25 | +import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'; |
| 26 | +import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; |
| 27 | +import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'; |
| 28 | +import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon'; |
| 29 | +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; |
| 30 | +import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg'; |
| 31 | +import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg'; |
| 32 | + |
| 33 | +interface DashboardHeaderProps { |
| 34 | + notificationBadge?: React.ReactNode; |
| 35 | +} |
| 36 | + |
| 37 | +const DashboardHeader: React.FC<DashboardHeaderProps> = ({ notificationBadge }) => { |
| 38 | + const [isDropdownOpen, setIsDropdownOpen] = useState(false); |
| 39 | + const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false); |
| 40 | + const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false); |
| 41 | + |
| 42 | + const kebabDropdownItems = ( |
| 43 | + <> |
| 44 | + <DropdownItem> |
| 45 | + <CogIcon /> Settings |
| 46 | + </DropdownItem> |
| 47 | + <DropdownItem> |
| 48 | + <HelpIcon /> Help |
| 49 | + </DropdownItem> |
| 50 | + </> |
| 51 | + ); |
| 52 | + |
| 53 | + const userDropdownItems = ( |
| 54 | + <> |
| 55 | + <DropdownItem key="group 2 profile">My profile</DropdownItem> |
| 56 | + <DropdownItem key="group 2 user">User management</DropdownItem> |
| 57 | + <DropdownItem key="group 2 logout">Logout</DropdownItem> |
| 58 | + </> |
| 59 | + ); |
| 60 | + |
| 61 | + const onDropdownToggle = () => { |
| 62 | + setIsDropdownOpen((prevIsDropdownOpen) => !prevIsDropdownOpen); |
| 63 | + }; |
| 64 | + |
| 65 | + const onDropdownSelect = () => { |
| 66 | + setIsDropdownOpen(false); |
| 67 | + }; |
| 68 | + |
| 69 | + const onKebabDropdownToggle = () => { |
| 70 | + setIsKebabDropdownOpen((prevIsKebabDropdownOpen) => !prevIsKebabDropdownOpen); |
| 71 | + }; |
| 72 | + |
| 73 | + const onKebabDropdownSelect = () => { |
| 74 | + setIsKebabDropdownOpen(false); |
| 75 | + }; |
| 76 | + |
| 77 | + const onFullKebabToggle = () => { |
| 78 | + setIsFullKebabDropdownOpen((prevIsFullKebabDropdownOpen) => !prevIsFullKebabDropdownOpen); |
| 79 | + }; |
| 80 | + |
| 81 | + const onFullKebabSelect = () => { |
| 82 | + setIsFullKebabDropdownOpen(false); |
| 83 | + }; |
| 84 | + |
| 85 | + return ( |
| 86 | + <Masthead> |
| 87 | + <MastheadToggle> |
| 88 | + <PageToggleButton variant="plain" aria-label="Global navigation"> |
| 89 | + <BarsIcon /> |
| 90 | + </PageToggleButton> |
| 91 | + </MastheadToggle> |
| 92 | + <MastheadMain> |
| 93 | + <MastheadBrand> |
| 94 | + <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} /> |
| 95 | + </MastheadBrand> |
| 96 | + </MastheadMain> |
| 97 | + <MastheadContent> |
| 98 | + <Toolbar id="toolbar" isFullHeight isStatic> |
| 99 | + <ToolbarContent> |
| 100 | + <ToolbarGroup |
| 101 | + variant="icon-button-group" |
| 102 | + align={{ default: 'alignRight' }} |
| 103 | + spacer={{ default: 'spacerNone', md: 'spacerMd' }} |
| 104 | + > |
| 105 | + {notificationBadge ? ( |
| 106 | + notificationBadge |
| 107 | + ) : ( |
| 108 | + <ToolbarItem> |
| 109 | + <Button |
| 110 | + aria-label="Notifications" |
| 111 | + variant={ButtonVariant.plain} |
| 112 | + icon={<BellIcon />} |
| 113 | + onClick={() => {}} |
| 114 | + /> |
| 115 | + </ToolbarItem> |
| 116 | + )} |
| 117 | + <ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}> |
| 118 | + <ToolbarItem> |
| 119 | + <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} /> |
| 120 | + </ToolbarItem> |
| 121 | + <ToolbarItem> |
| 122 | + <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} /> |
| 123 | + </ToolbarItem> |
| 124 | + </ToolbarGroup> |
| 125 | + <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}> |
| 126 | + <Dropdown |
| 127 | + isOpen={isKebabDropdownOpen} |
| 128 | + onSelect={onKebabDropdownSelect} |
| 129 | + onOpenChange={setIsKebabDropdownOpen} |
| 130 | + popperProps={{ position: 'right' }} |
| 131 | + toggle={(toggleRef: React.RefObject<any>) => ( |
| 132 | + <MenuToggle |
| 133 | + ref={toggleRef} |
| 134 | + isExpanded={isKebabDropdownOpen} |
| 135 | + onClick={onKebabDropdownToggle} |
| 136 | + variant="plain" |
| 137 | + aria-label="Settings and help" |
| 138 | + > |
| 139 | + <EllipsisVIcon aria-hidden="true" /> |
| 140 | + </MenuToggle> |
| 141 | + )} |
| 142 | + > |
| 143 | + <DropdownList>{kebabDropdownItems}</DropdownList> |
| 144 | + </Dropdown> |
| 145 | + </ToolbarItem> |
| 146 | + <ToolbarItem visibility={{ md: 'hidden' }}> |
| 147 | + <Dropdown |
| 148 | + isOpen={isFullKebabDropdownOpen} |
| 149 | + onSelect={onFullKebabSelect} |
| 150 | + onOpenChange={setIsFullKebabDropdownOpen} |
| 151 | + popperProps={{ position: 'right' }} |
| 152 | + toggle={(toggleRef: React.RefObject<any>) => ( |
| 153 | + <MenuToggle |
| 154 | + ref={toggleRef} |
| 155 | + isExpanded={isFullKebabDropdownOpen} |
| 156 | + onClick={onFullKebabToggle} |
| 157 | + variant="plain" |
| 158 | + aria-label="Toolbar menu" |
| 159 | + > |
| 160 | + <EllipsisVIcon aria-hidden="true" /> |
| 161 | + </MenuToggle> |
| 162 | + )} |
| 163 | + > |
| 164 | + <DropdownGroup key="group 2" aria-label="User actions"> |
| 165 | + <DropdownList>{userDropdownItems}</DropdownList> |
| 166 | + </DropdownGroup> |
| 167 | + <Divider /> |
| 168 | + <DropdownList>{kebabDropdownItems}</DropdownList> |
| 169 | + </Dropdown> |
| 170 | + </ToolbarItem> |
| 171 | + </ToolbarGroup> |
| 172 | + <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}> |
| 173 | + <Dropdown |
| 174 | + isOpen={isDropdownOpen} |
| 175 | + onSelect={onDropdownSelect} |
| 176 | + onOpenChange={setIsDropdownOpen} |
| 177 | + popperProps={{ position: 'right' }} |
| 178 | + toggle={(toggleRef: React.RefObject<any>) => ( |
| 179 | + <MenuToggle |
| 180 | + ref={toggleRef} |
| 181 | + isExpanded={isDropdownOpen} |
| 182 | + onClick={onDropdownToggle} |
| 183 | + icon={<Avatar src={imgAvatar} alt="" />} |
| 184 | + isFullHeight |
| 185 | + > |
| 186 | + Ned Username |
| 187 | + </MenuToggle> |
| 188 | + )} |
| 189 | + > |
| 190 | + <DropdownList>{userDropdownItems}</DropdownList> |
| 191 | + </Dropdown> |
| 192 | + </ToolbarItem> |
| 193 | + </ToolbarContent> |
| 194 | + </Toolbar> |
| 195 | + </MastheadContent> |
| 196 | + </Masthead> |
| 197 | + ); |
| 198 | +}; |
| 199 | + |
| 200 | +export default DashboardHeader; |
0 commit comments