mirror of
https://github.com/scm-manager/scm-manager.git
synced 2026-03-05 03:40:56 +01:00
pass all index resource links to the primary navigation and added an extension point for logout
This commit is contained in:
@@ -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<Props> {
|
||||
render() {
|
||||
const { t, repositoriesLink, usersLink, groupsLink, configLink, logoutLink } = this.props;
|
||||
|
||||
const links = [
|
||||
repositoriesLink ? (
|
||||
<PrimaryNavigationLink
|
||||
to="/repos"
|
||||
match="/(repo|repos)"
|
||||
label={t("primary-navigation.repositories")}
|
||||
key={"repositoriesLink"}
|
||||
/>): null,
|
||||
usersLink ? (
|
||||
<PrimaryNavigationLink
|
||||
to="/users"
|
||||
match="/(user|users)"
|
||||
label={t("primary-navigation.users")}
|
||||
key={"usersLink"}
|
||||
/>) : null,
|
||||
groupsLink ? (
|
||||
<PrimaryNavigationLink
|
||||
to="/groups"
|
||||
match="/(group|groups)"
|
||||
label={t("primary-navigation.groups")}
|
||||
key={"groupsLink"}
|
||||
/>) : null,
|
||||
configLink ? (
|
||||
<PrimaryNavigationLink
|
||||
to="/config"
|
||||
label={t("primary-navigation.config")}
|
||||
key={"configLink"}
|
||||
/>) : null,
|
||||
logoutLink ? (
|
||||
<PrimaryNavigationLink
|
||||
to="/logout"
|
||||
label={t("primary-navigation.logout")}
|
||||
key={"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 = (
|
||||
<PrimaryNavigationLink
|
||||
to={to}
|
||||
match={match}
|
||||
label={t(label)}
|
||||
key={linkName}
|
||||
/>)
|
||||
;
|
||||
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 (
|
||||
<nav className="tabs is-boxed">
|
||||
<ul>
|
||||
{links}
|
||||
{navigationItems}
|
||||
</ul>
|
||||
</nav>
|
||||
);
|
||||
|
||||
@@ -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<Props> {
|
||||
loading,
|
||||
error,
|
||||
authenticated,
|
||||
t,
|
||||
repositoriesLink,
|
||||
usersLink,
|
||||
groupsLink,
|
||||
configLink,
|
||||
logoutLink
|
||||
links,
|
||||
t
|
||||
} = this.props;
|
||||
|
||||
let content;
|
||||
const navigation = authenticated ? (
|
||||
<PrimaryNavigation
|
||||
repositoriesLink={repositoriesLink}
|
||||
usersLink={usersLink}
|
||||
groupsLink={groupsLink}
|
||||
configLink={configLink}
|
||||
logoutLink={logoutLink}
|
||||
links={links}
|
||||
/>
|
||||
) : (
|
||||
""
|
||||
@@ -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
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user