diff --git a/scm-ui-components/packages/ui-components/src/navigation/PrimaryNavigation.js b/scm-ui-components/packages/ui-components/src/navigation/PrimaryNavigation.js index 06ff997e2d..956bf3996c 100644 --- a/scm-ui-components/packages/ui-components/src/navigation/PrimaryNavigation.js +++ b/scm-ui-components/packages/ui-components/src/navigation/PrimaryNavigation.js @@ -2,60 +2,72 @@ import React from "react"; import { translate } from "react-i18next"; import PrimaryNavigationLink from "./PrimaryNavigationLink"; +import type { Links } from "@scm-manager/ui-types"; +import { binder } from "@scm-manager/ui-extensions"; type Props = { t: string => string, - repositoriesLink: string, - usersLink: string, - groupsLink: string, - configLink: string, - logoutLink: string + links: Links, }; class PrimaryNavigation extends React.Component { - render() { - const { t, repositoriesLink, usersLink, groupsLink, configLink, logoutLink } = this.props; - const links = [ - repositoriesLink ? ( - ): null, - usersLink ? ( - ) : null, - groupsLink ? ( - ) : null, - configLink ? ( - ) : null, - logoutLink ? ( - ) : null - ]; + createNavigationAppender = (navigationItems) => { + const { t, links } = this.props; + + return (to: string, match: string, label: string, linkName: string) => { + const link = links[linkName]; + if (link) { + const navigationItem = ( + ) + ; + navigationItems.push(navigationItem); + } + }; + }; + + createLogoutFromExtension = () => { + const { t, links } = this.props; + + const props = { + links, + label: t("primary-navigation.logout") + }; + + return binder.getExtension("primary-navigation.logout", props); + }; + + createNavigationItems = () => { + const navigationItems = []; + + const append = this.createNavigationAppender(navigationItems); + append("/repos", "/(repo|repos)", "primary-navigation.repositories", "repositories"); + append("/users", "/(user|users)", "primary-navigation.users", "users"); + append("/groups", "/(group|groups)", "primary-navigation.groups", "groups"); + append("/config", "/config", "primary-navigation.config", "config"); + + if (binder.hasExtension("primary-navigation.logout")) { + const extension = this.createLogoutFromExtension(); + navigationItems.push(extension); + } else { + append("/logout", "/logout", "primary-navigation.logout", "logout"); + } + + return navigationItems; + }; + + render() { + const navigationItems = this.createNavigationItems(); return ( ); diff --git a/scm-ui/src/containers/App.js b/scm-ui/src/containers/App.js index 50fc805eb2..dd3dd36639 100644 --- a/scm-ui/src/containers/App.js +++ b/scm-ui/src/containers/App.js @@ -19,15 +19,11 @@ import { Footer, Header } from "@scm-manager/ui-components"; -import type { Me } from "@scm-manager/ui-types"; +import type { Links, Me } from "@scm-manager/ui-types"; import { - getConfigLink, getFetchIndexResourcesFailure, - getGroupsLink, - getLogoutLink, + getLinks, getMeLink, - getRepositoriesLink, - getUsersLink, isFetchIndexResourcesPending } from "../modules/indexResource"; @@ -36,11 +32,7 @@ type Props = { authenticated: boolean, error: Error, loading: boolean, - repositoriesLink: string, - usersLink: string, - groupsLink: string, - configLink: string, - logoutLink: string, + links: Links, meLink: string, // dispatcher functions @@ -63,22 +55,14 @@ class App extends Component { loading, error, authenticated, - t, - repositoriesLink, - usersLink, - groupsLink, - configLink, - logoutLink + links, + t } = this.props; let content; const navigation = authenticated ? ( ) : ( "" @@ -120,22 +104,14 @@ const mapStateToProps = state => { isFetchMePending(state) || isFetchIndexResourcesPending(state); const error = getFetchMeFailure(state) || getFetchIndexResourcesFailure(state); - const repositoriesLink = getRepositoriesLink(state); - const usersLink = getUsersLink(state); - const groupsLink = getGroupsLink(state); - const configLink = getConfigLink(state); - const logoutLink = getLogoutLink(state); + const links = getLinks(state); const meLink = getMeLink(state); return { authenticated, me, loading, error, - repositoriesLink, - usersLink, - groupsLink, - configLink, - logoutLink, + links, meLink }; };