diff --git a/scm-plugins/scm-git-plugin/src/main/js/GitGlobalConfiguration.js b/scm-plugins/scm-git-plugin/src/main/js/GitGlobalConfiguration.js index 3718cc2900..ab5147e8e3 100644 --- a/scm-plugins/scm-git-plugin/src/main/js/GitGlobalConfiguration.js +++ b/scm-plugins/scm-git-plugin/src/main/js/GitGlobalConfiguration.js @@ -1,7 +1,7 @@ //@flow import React from "react"; import { translate } from "react-i18next"; -import { Title, GlobalConfiguration } from "@scm-manager/ui-components"; +import { Title, Configuration } from "@scm-manager/ui-components"; import GitConfigurationForm from "./GitConfigurationForm"; type Props = { @@ -22,7 +22,7 @@ class GitGlobalConfiguration extends React.Component { return (
- <GlobalConfiguration link={link} render={props => <GitConfigurationForm {...props} />}/> + <Configuration link={link} render={props => <GitConfigurationForm {...props} />}/> </div> ); } diff --git a/scm-plugins/scm-hg-plugin/src/main/js/HgGlobalConfiguration.js b/scm-plugins/scm-hg-plugin/src/main/js/HgGlobalConfiguration.js index e92672a282..4eb4e0da41 100644 --- a/scm-plugins/scm-hg-plugin/src/main/js/HgGlobalConfiguration.js +++ b/scm-plugins/scm-hg-plugin/src/main/js/HgGlobalConfiguration.js @@ -1,6 +1,6 @@ //@flow import React from "react"; -import { Title, GlobalConfiguration } from "@scm-manager/ui-components"; +import { Title, Configuration } from "@scm-manager/ui-components"; import { translate } from "react-i18next"; import HgConfigurationForm from "./HgConfigurationForm"; @@ -18,7 +18,7 @@ class HgGlobalConfiguration extends React.Component<Props> { return ( <div> <Title title={t("scm-hg-plugin.config.title")}/> - <GlobalConfiguration link={link} render={props => <HgConfigurationForm {...props} />}/> + <Configuration link={link} render={props => <HgConfigurationForm {...props} />}/> </div> ); } diff --git a/scm-plugins/scm-svn-plugin/src/main/js/SvnGlobalConfiguration.js b/scm-plugins/scm-svn-plugin/src/main/js/SvnGlobalConfiguration.js index c17829a67f..e6ea1783d7 100644 --- a/scm-plugins/scm-svn-plugin/src/main/js/SvnGlobalConfiguration.js +++ b/scm-plugins/scm-svn-plugin/src/main/js/SvnGlobalConfiguration.js @@ -1,7 +1,7 @@ //@flow import React from "react"; import { translate } from "react-i18next"; -import { Title, GlobalConfiguration } from "@scm-manager/ui-components"; +import { Title, Configuration } from "@scm-manager/ui-components"; import SvnConfigurationForm from "./SvnConfigurationForm"; type Props = { @@ -18,7 +18,7 @@ class SvnGlobalConfiguration extends React.Component<Props> { return ( <div> <Title title={t("scm-svn-plugin.config.title")}/> - <GlobalConfiguration link={link} render={props => <SvnConfigurationForm {...props} />}/> + <Configuration link={link} render={props => <SvnConfigurationForm {...props} />}/> </div> ); } diff --git a/scm-ui-components/packages/ui-components/src/config/GlobalConfiguration.js b/scm-ui-components/packages/ui-components/src/config/Configuration.js similarity index 87% rename from scm-ui-components/packages/ui-components/src/config/GlobalConfiguration.js rename to scm-ui-components/packages/ui-components/src/config/Configuration.js index b2b7dca647..07b68f39a6 100644 --- a/scm-ui-components/packages/ui-components/src/config/GlobalConfiguration.js +++ b/scm-ui-components/packages/ui-components/src/config/Configuration.js @@ -11,8 +11,8 @@ import { type RenderProps = { readOnly: boolean, - initialConfiguration: Configuration, - onConfigurationChange: (Configuration, boolean) => void + initialConfiguration: ConfigurationType, + onConfigurationChange: (ConfigurationType, boolean) => void }; type Props = { @@ -23,7 +23,7 @@ type Props = { t: (string) => string }; -type Configuration = { +type ConfigurationType = { _links: Links } & Object; @@ -33,8 +33,8 @@ type State = { modifying: boolean, contentType?: string, - configuration?: Configuration, - modifiedConfiguration?: Configuration, + configuration?: ConfigurationType, + modifiedConfiguration?: ConfigurationType, valid: boolean }; @@ -42,7 +42,7 @@ type State = { * GlobalConfiguration uses the render prop pattern to encapsulate the logic for * synchronizing the configuration with the backend. */ -class GlobalConfiguration extends React.Component<Props, State> { +class Configuration extends React.Component<Props, State> { constructor(props: Props) { super(props); @@ -84,7 +84,7 @@ class GlobalConfiguration extends React.Component<Props, State> { }); }; - loadConfig = (configuration: Configuration) => { + loadConfig = (configuration: ConfigurationType) => { this.setState({ configuration, fetching: false, @@ -107,7 +107,7 @@ class GlobalConfiguration extends React.Component<Props, State> { return !modificationUrl; }; - configurationChanged = (configuration: Configuration, valid: boolean) => { + configurationChanged = (configuration: ConfigurationType, valid: boolean) => { this.setState({ modifiedConfiguration: configuration, valid @@ -159,4 +159,4 @@ class GlobalConfiguration extends React.Component<Props, State> { } -export default translate("config")(GlobalConfiguration); +export default translate("config")(Configuration); diff --git a/scm-ui-components/packages/ui-components/src/config/ConfigurationBinder.js b/scm-ui-components/packages/ui-components/src/config/ConfigurationBinder.js index 477eee5238..960fe7db21 100644 --- a/scm-ui-components/packages/ui-components/src/config/ConfigurationBinder.js +++ b/scm-ui-components/packages/ui-components/src/config/ConfigurationBinder.js @@ -9,6 +9,16 @@ class ConfigurationBinder { i18nNamespace: string = "plugins"; + navLink(to: string, labelI18nKey: string, t: any){ + return <NavLink to={to} label={t(labelI18nKey)} />; + } + + route(path: string, Component: any){ + return <Route path={path} + render={() => Component} + exact/>; + } + bindGlobal(to: string, labelI18nKey: string, linkName: string, ConfigurationComponent: any) { // create predicate based on the link name of the index resource @@ -19,25 +29,48 @@ class ConfigurationBinder { // create NavigationLink with translated label const ConfigNavLink = translate(this.i18nNamespace)(({t}) => { - return <NavLink to={"/config" + to} label={t(labelI18nKey)} />; + return this.navLink("/config" + to, labelI18nKey, t); }); // bind navigation link to extension point binder.bind("config.navigation", ConfigNavLink, configPredicate); - // route for global configuration, passes the link from the index resource to component const ConfigRoute = ({ url, links }) => { const link = links[linkName].href; - return <Route path={url + to} - render={() => <ConfigurationComponent link={link}/>} - exact/>; + return this.route(url + to, <ConfigurationComponent link={link}/>); }; // bind config route to extension point binder.bind("config.route", ConfigRoute, configPredicate); } + bindRepository(to: string, labelI18nKey: string, linkName: string, RepositoryComponent: any) { + + // create predicate based on the link name of the current repository route + // if the linkname is not available, the navigation link and the route are not bound to the extension points + const repoPredicate = (props: Object) => { + return props.repository && props.repository._links && props.repository._links[linkName]; + }; + + // create NavigationLink with translated label + const RepoNavLink = translate(this.i18nNamespace)(({t, url}) => { + return this.navLink(url + to, labelI18nKey, t); + }); + + // bind navigation link to extension point + binder.bind("repository.navigation", RepoNavLink, repoPredicate); + + + // route for global configuration, passes the current repository to component + const RepoRoute = ({ url, repository }) => { + return this.route(url + to, <RepositoryComponent repository={repository}/>); + }; + + // bind config route to extension point + binder.bind("repository.route", RepoRoute, repoPredicate); + } + } export default new ConfigurationBinder(); diff --git a/scm-ui-components/packages/ui-components/src/config/index.js b/scm-ui-components/packages/ui-components/src/config/index.js index 9596e9cda5..6833632a0d 100644 --- a/scm-ui-components/packages/ui-components/src/config/index.js +++ b/scm-ui-components/packages/ui-components/src/config/index.js @@ -1,3 +1,3 @@ // @flow export { default as ConfigurationBinder } from "./ConfigurationBinder"; -export { default as GlobalConfiguration } from "./GlobalConfiguration"; +export { default as Configuration } from "./Configuration"; diff --git a/scm-ui/src/repos/containers/RepositoryRoot.js b/scm-ui/src/repos/containers/RepositoryRoot.js index 9b8991a91a..94768d2b6a 100644 --- a/scm-ui/src/repos/containers/RepositoryRoot.js +++ b/scm-ui/src/repos/containers/RepositoryRoot.js @@ -35,7 +35,7 @@ import PermissionsNavLink from "../components/PermissionsNavLink"; import Sources from "../sources/containers/Sources"; import RepositoryNavLink from "../components/RepositoryNavLink"; import { getRepositoriesLink } from "../../modules/indexResource"; -import {ExtensionPoint} from '@scm-manager/ui-extensions'; +import {ExtensionPoint} from "@scm-manager/ui-extensions"; type Props = { namespace: string,