2020-08-21 00:09:05 +00:00
|
|
|
import {
|
2024-04-18 10:14:53 +00:00
|
|
|
Avatar,
|
|
|
|
Divider,
|
2020-08-24 18:11:17 +00:00
|
|
|
Dropdown,
|
|
|
|
DropdownItem,
|
2024-04-18 10:14:53 +00:00
|
|
|
DropdownList,
|
|
|
|
Masthead,
|
|
|
|
MastheadBrand,
|
|
|
|
MastheadContent,
|
|
|
|
MastheadToggle,
|
|
|
|
MenuToggle,
|
|
|
|
PageToggleButton,
|
|
|
|
Toolbar,
|
|
|
|
ToolbarContent,
|
|
|
|
ToolbarItem,
|
|
|
|
} from "@patternfly/react-core";
|
|
|
|
import { BarsIcon, EllipsisVIcon, HelpIcon } from "@patternfly/react-icons";
|
|
|
|
import { useState } from "react";
|
2021-07-21 09:30:18 +00:00
|
|
|
import { useTranslation } from "react-i18next";
|
2024-04-18 10:14:53 +00:00
|
|
|
import { Link, useHref } from "react-router-dom";
|
2024-05-08 08:23:43 +00:00
|
|
|
import { useEnvironment, useHelp } from "@keycloak/keycloak-ui-shared";
|
2023-05-03 11:27:27 +00:00
|
|
|
import { HelpHeader } from "./components/help-enabler/HelpHeader";
|
2021-08-10 13:07:59 +00:00
|
|
|
import { useRealm } from "./context/realm-context/RealmContext";
|
2021-07-21 09:30:18 +00:00
|
|
|
import { useWhoAmI } from "./context/whoami/WhoAmI";
|
2021-08-10 13:07:59 +00:00
|
|
|
import { toDashboard } from "./dashboard/routes/Dashboard";
|
2020-08-04 12:59:41 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
const ManageAccountDropdownItem = () => {
|
2024-05-08 08:23:43 +00:00
|
|
|
const { keycloak } = useEnvironment();
|
|
|
|
|
2020-08-21 00:09:05 +00:00
|
|
|
const { t } = useTranslation();
|
2023-02-09 16:31:16 +00:00
|
|
|
return (
|
2022-07-14 13:02:28 +00:00
|
|
|
<DropdownItem
|
|
|
|
key="manage account"
|
|
|
|
id="manage-account"
|
|
|
|
onClick={() => keycloak.accountManagement()}
|
|
|
|
>
|
|
|
|
{t("manageAccount")}
|
|
|
|
</DropdownItem>
|
|
|
|
);
|
2023-02-09 16:31:16 +00:00
|
|
|
};
|
2020-08-21 00:09:05 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
const SignOutDropdownItem = () => {
|
2024-05-08 08:23:43 +00:00
|
|
|
const { keycloak } = useEnvironment();
|
2023-02-09 16:31:16 +00:00
|
|
|
const { t } = useTranslation();
|
|
|
|
return (
|
2022-07-14 13:02:28 +00:00
|
|
|
<DropdownItem
|
|
|
|
id="sign-out"
|
|
|
|
key="sign out"
|
|
|
|
onClick={() => keycloak.logout({ redirectUri: "" })}
|
|
|
|
>
|
|
|
|
{t("signOut")}
|
|
|
|
</DropdownItem>
|
|
|
|
);
|
2023-02-09 16:31:16 +00:00
|
|
|
};
|
2020-08-21 00:09:05 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
const ServerInfoDropdownItem = () => {
|
|
|
|
const { realm } = useRealm();
|
|
|
|
const { t } = useTranslation();
|
2021-08-10 13:07:59 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
return (
|
|
|
|
<DropdownItem
|
|
|
|
key="server info"
|
2024-04-18 10:14:53 +00:00
|
|
|
component={(props) => <Link {...props} to={toDashboard({ realm })} />}
|
2023-02-09 16:31:16 +00:00
|
|
|
>
|
|
|
|
{t("realmInfo")}
|
|
|
|
</DropdownItem>
|
|
|
|
);
|
|
|
|
};
|
2020-08-21 00:09:05 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
const HelpDropdownItem = () => {
|
|
|
|
const { t } = useTranslation();
|
|
|
|
const { enabled, toggleHelp } = useHelp();
|
|
|
|
return (
|
2024-01-09 19:02:31 +00:00
|
|
|
<DropdownItem
|
|
|
|
data-testId="helpIcon"
|
|
|
|
icon={<HelpIcon />}
|
|
|
|
onClick={toggleHelp}
|
|
|
|
>
|
2023-02-09 16:31:16 +00:00
|
|
|
{enabled ? t("helpEnabled") : t("helpDisabled")}
|
|
|
|
</DropdownItem>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
const kebabDropdownItems = [
|
|
|
|
<ManageAccountDropdownItem key="kebab Manage Account" />,
|
|
|
|
<ServerInfoDropdownItem key="kebab Server Info" />,
|
|
|
|
<HelpDropdownItem key="kebab Help" />,
|
2024-04-18 10:14:53 +00:00
|
|
|
<Divider component="li" key="kebab sign out separator" />,
|
2023-02-09 16:31:16 +00:00
|
|
|
<SignOutDropdownItem key="kebab Sign out" />,
|
|
|
|
];
|
|
|
|
|
|
|
|
const userDropdownItems = [
|
|
|
|
<ManageAccountDropdownItem key="Manage Account" />,
|
|
|
|
<ServerInfoDropdownItem key="Server info" />,
|
2024-04-18 10:14:53 +00:00
|
|
|
<Divider component="li" key="sign out separator" />,
|
2023-02-09 16:31:16 +00:00
|
|
|
<SignOutDropdownItem key="Sign out" />,
|
|
|
|
];
|
|
|
|
|
|
|
|
const KebabDropdown = () => {
|
|
|
|
const [isDropdownOpen, setDropdownOpen] = useState(false);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Dropdown
|
|
|
|
isPlain
|
2024-04-18 10:14:53 +00:00
|
|
|
onOpenChange={(isOpen) => setDropdownOpen(isOpen)}
|
|
|
|
toggle={(ref) => (
|
|
|
|
<MenuToggle
|
|
|
|
id="user-dropdown-kebab"
|
|
|
|
ref={ref}
|
|
|
|
variant="plain"
|
|
|
|
onClick={() => setDropdownOpen(!isDropdownOpen)}
|
|
|
|
isExpanded={isDropdownOpen}
|
|
|
|
>
|
|
|
|
<EllipsisVIcon />
|
|
|
|
</MenuToggle>
|
|
|
|
)}
|
2023-02-09 16:31:16 +00:00
|
|
|
isOpen={isDropdownOpen}
|
2024-04-18 10:14:53 +00:00
|
|
|
>
|
|
|
|
<DropdownList>{kebabDropdownItems}</DropdownList>
|
|
|
|
</Dropdown>
|
2023-02-09 16:31:16 +00:00
|
|
|
);
|
|
|
|
};
|
2020-08-21 00:09:05 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
const UserDropdown = () => {
|
|
|
|
const { whoAmI } = useWhoAmI();
|
|
|
|
const [isDropdownOpen, setDropdownOpen] = useState(false);
|
2020-11-12 12:55:52 +00:00
|
|
|
|
2023-02-09 16:31:16 +00:00
|
|
|
return (
|
|
|
|
<Dropdown
|
|
|
|
isPlain
|
|
|
|
isOpen={isDropdownOpen}
|
2024-04-18 10:14:53 +00:00
|
|
|
onOpenChange={(isOpen) => setDropdownOpen(isOpen)}
|
|
|
|
toggle={(ref) => (
|
|
|
|
<MenuToggle
|
|
|
|
id="user-dropdown"
|
|
|
|
ref={ref}
|
|
|
|
onClick={() => setDropdownOpen(!isDropdownOpen)}
|
|
|
|
>
|
2023-02-09 16:31:16 +00:00
|
|
|
{whoAmI.getDisplayName()}
|
2024-04-18 10:14:53 +00:00
|
|
|
</MenuToggle>
|
|
|
|
)}
|
|
|
|
>
|
|
|
|
<DropdownList>{userDropdownItems}</DropdownList>
|
|
|
|
</Dropdown>
|
2023-02-09 16:31:16 +00:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const Header = () => {
|
2024-05-08 08:23:43 +00:00
|
|
|
const { environment, keycloak } = useEnvironment();
|
2024-04-18 10:14:53 +00:00
|
|
|
const { t } = useTranslation();
|
2023-02-09 16:31:16 +00:00
|
|
|
const { realm } = useRealm();
|
2020-11-12 12:55:52 +00:00
|
|
|
|
2024-04-18 10:14:53 +00:00
|
|
|
const picture = keycloak.tokenParsed?.picture;
|
2023-05-17 11:53:38 +00:00
|
|
|
const logo = environment.logo ? environment.logo : "/logo.svg";
|
2024-04-18 10:14:53 +00:00
|
|
|
const url = useHref(toDashboard({ realm }));
|
|
|
|
const logoUrl = environment.logoUrl ? environment.logoUrl : url;
|
2023-05-17 11:53:38 +00:00
|
|
|
|
2020-08-21 00:09:05 +00:00
|
|
|
return (
|
2024-04-18 10:14:53 +00:00
|
|
|
<Masthead>
|
|
|
|
<MastheadToggle>
|
|
|
|
<PageToggleButton variant="plain" aria-label={t("navigation")}>
|
|
|
|
<BarsIcon />
|
|
|
|
</PageToggleButton>
|
|
|
|
</MastheadToggle>
|
|
|
|
<MastheadBrand href={logoUrl}>
|
|
|
|
<img
|
|
|
|
src={environment.resourceUrl + logo}
|
|
|
|
id="masthead-logo"
|
|
|
|
alt={t("logo")}
|
|
|
|
aria-label={t("logo")}
|
|
|
|
className="keycloak__pageheader_brand"
|
|
|
|
/>
|
|
|
|
</MastheadBrand>
|
|
|
|
<MastheadContent>
|
|
|
|
<Toolbar>
|
|
|
|
<ToolbarContent>
|
|
|
|
<ToolbarItem
|
|
|
|
align={{ default: "alignRight" }}
|
|
|
|
visibility={{
|
|
|
|
default: "hidden",
|
|
|
|
md: "visible",
|
|
|
|
}} /** the settings and help icon buttons are only visible on desktop sizes and replaced by a kebab dropdown for other sizes */
|
|
|
|
>
|
|
|
|
<HelpHeader />
|
|
|
|
</ToolbarItem>
|
|
|
|
<ToolbarItem
|
|
|
|
align={{ default: "alignLeft" }}
|
|
|
|
visibility={{
|
|
|
|
md: "hidden",
|
|
|
|
}} /** this kebab dropdown replaces the icon buttons and is hidden for desktop sizes */
|
|
|
|
>
|
|
|
|
<KebabDropdown />
|
|
|
|
</ToolbarItem>
|
|
|
|
<ToolbarItem
|
|
|
|
visibility={{
|
|
|
|
default: "hidden",
|
|
|
|
md: "visible",
|
|
|
|
}} /** this user dropdown is hidden on mobile sizes */
|
|
|
|
>
|
|
|
|
<UserDropdown />
|
|
|
|
</ToolbarItem>
|
|
|
|
<ToolbarItem
|
|
|
|
variant="overflow-menu"
|
|
|
|
align={{ default: "alignRight" }}
|
|
|
|
className="pf-v5-u-m-0-on-lg"
|
|
|
|
>
|
|
|
|
<Avatar
|
|
|
|
src={picture || environment.resourceUrl + "/img_avatar.svg"}
|
|
|
|
alt={t("avatarImage")}
|
|
|
|
aria-label={t("avatarImage")}
|
|
|
|
/>
|
|
|
|
</ToolbarItem>
|
|
|
|
</ToolbarContent>
|
|
|
|
</Toolbar>
|
|
|
|
</MastheadContent>
|
|
|
|
</Masthead>
|
2020-08-21 00:09:05 +00:00
|
|
|
);
|
2020-08-24 18:11:17 +00:00
|
|
|
};
|