header.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import "ojs/ojtoolbar";
  2. import "ojs/ojmenu";
  3. import "ojs/ojbutton";
  4. import * as ResponsiveUtils from "ojs/ojresponsiveutils";
  5. import { ojMenu } from "ojs/ojmenu";
  6. import { ojButton } from "ojs/ojbutton";
  7. import { FunctionComponent } from "preact";
  8. import { useRef, useState, useEffect } from "preact/hooks";
  9. import { isLinkItem, isPluginItem, NavigationItem, Plugin } from "../hooks/useQuery";
  10. import { NavigateFunction } from "react-router-dom";
  11. type Props = Readonly<{
  12. appName: string,
  13. userLogin: string,
  14. login: () => void,
  15. logout: () => void,
  16. navigate: NavigateFunction;
  17. navigations: NavigationItem[] | undefined,
  18. plugins: Plugin[] | undefined
  19. }>;
  20. export const Header: FunctionComponent<Props> = ({ appName, userLogin, login, logout, navigate, navigations, plugins }) => {
  21. const mediaQueryRef = useRef<MediaQueryList>(window.matchMedia(ResponsiveUtils.getFrameworkQuery("sm-only")));
  22. const [isSmallWidth, setIsSmallWidth] = useState(mediaQueryRef.current.matches);
  23. useEffect(() => {
  24. mediaQueryRef.current.addEventListener("change", handleMediaQueryChange);
  25. return (() => mediaQueryRef.current.removeEventListener("change", handleMediaQueryChange));
  26. }, [mediaQueryRef]);
  27. function handleMediaQueryChange(e: MediaQueryListEvent) {
  28. setIsSmallWidth(e.matches);
  29. }
  30. function getDisplayType() {
  31. return (isSmallWidth ? "icons" : "all");
  32. };
  33. function getEndIconClass() {
  34. return (isSmallWidth ? "oj-icon demo-appheader-avatar" : "oj-component-icon oj-button-menu-dropdown-icon");
  35. }
  36. const loginButtonAction = (_: ojButton.ojAction) => {
  37. login();
  38. };
  39. const userMenuAction = (event: ojMenu.ojMenuAction) => {
  40. switch (event.detail.selectedValue) {
  41. case "out":
  42. logout();
  43. break;
  44. }
  45. };
  46. const navigationAction = (event: ojMenu.ojMenuAction) => {
  47. const navItem: NavigationItem = event.detail.selectedValue;
  48. if (isLinkItem(navItem)) {
  49. window.open(navItem.path, navItem.openInNewTab ? "_blank" : "_self");
  50. } else if (isPluginItem(navItem)) {
  51. // window.location.pathname = plugins.find(p => p.name === navItem.pluginName)?.path;
  52. navigate(plugins.find(p => p.name === navItem.pluginName)?.path);
  53. }
  54. };
  55. return (
  56. <header role="banner" class="oj-web-applayout-header">
  57. <div class="oj-web-applayout-max-width oj-flex-bar oj-sm-align-items-center">
  58. <div class="oj-flex-bar-middle oj-sm-align-items-baseline">
  59. <span
  60. role="img"
  61. class="oj-icon demo-oracle-icon"
  62. title="Oracle Logo"
  63. alt="Oracle Logo"></span>
  64. <h1
  65. class="oj-sm-only-hide oj-web-applayout-header-title"
  66. title="Application Name">
  67. {appName}
  68. </h1>
  69. {navigations &&
  70. <oj-menu-button id="navMenuButton" display="icons" chroming="borderless">
  71. <span slot="endIcon" class="oj-ux-ico-leading-increase"></span>
  72. <oj-menu id="navMenu" slot="menu" onojMenuAction={navigationAction}>
  73. {navigations.map(nav => (
  74. <oj-option value={nav.labelKey}>
  75. {nav.labelKey}
  76. {nav.children &&
  77. <oj-menu>
  78. {nav.children.map(navChild => (<oj-option value={navChild}>{navChild.labelKey}</oj-option>))}
  79. </oj-menu>
  80. }
  81. </oj-option>
  82. ))}
  83. </oj-menu>
  84. </oj-menu-button>
  85. }
  86. </div>
  87. <div class="oj-flex-bar-end">
  88. <oj-toolbar>
  89. {!userLogin &&
  90. <oj-button id="chroming_button5" chroming="danger" onojAction={loginButtonAction}>Login</oj-button>
  91. }
  92. {userLogin &&
  93. <oj-menu-button id="userMenu" display={getDisplayType()} chroming="borderless">
  94. <span>{userLogin}</span>
  95. <span slot="endIcon" class={getEndIconClass()}></span>
  96. <oj-menu id="menu1" slot="menu" onojMenuAction={userMenuAction}>
  97. <oj-option id="pref" value="pref">Preferences</oj-option>
  98. <oj-option id="help" value="help">Help</oj-option>
  99. <oj-option id="about" value="about">About</oj-option>
  100. <oj-option id="out" value="out">Sign Out</oj-option>
  101. </oj-menu>
  102. </oj-menu-button>
  103. }
  104. </oj-toolbar>
  105. </div>
  106. </div>
  107. </header>
  108. );
  109. }