diff --git a/scm-ui/public/locales/de/repos.json b/scm-ui/public/locales/de/repos.json index 922a2b270f..141d58d1d2 100644 --- a/scm-ui/public/locales/de/repos.json +++ b/scm-ui/public/locales/de/repos.json @@ -1,5 +1,6 @@ { "repository": { + "namespace": "Namespace", "name": "Name", "type": "Typ", "contact": "Kontakt", @@ -8,10 +9,12 @@ "lastModified": "Zuletzt bearbeitet" }, "validation": { + "namespace-invalid": "Der Namespace des Repository ist ungültig", "name-invalid": "Der Name des Repository ist ungültig", "contact-invalid": "Der Kontakt muss eine gültige E-Mail Adresse sein" }, "help": { + "namespaceHelpText": "Der Namespace des Repository. Dieser wird Teil der URL des Repository sein.", "nameHelpText": "Der Name des Repository. Dieser wird Teil der URL des Repository sein.", "typeHelpText": "Der Typ des Repository (Mercurial, Git oder Subversion).", "contactHelpText": "E-Mail Adresse der Person, die für das Repository verantwortlich ist.", diff --git a/scm-ui/public/locales/en/repos.json b/scm-ui/public/locales/en/repos.json index ebc0adfd34..f10c771d96 100644 --- a/scm-ui/public/locales/en/repos.json +++ b/scm-ui/public/locales/en/repos.json @@ -1,5 +1,6 @@ { "repository": { + "namespace": "Namespace", "name": "Name", "type": "Type", "contact": "Contact", @@ -8,10 +9,12 @@ "lastModified": "Last Modified" }, "validation": { + "namespace-invalid": "The repository namespace is invalid", "name-invalid": "The repository name is invalid", "contact-invalid": "Contact must be a valid mail address" }, "help": { + "namespaceHelpText": "The namespace of the repository. This name will be part of the repository url.", "nameHelpText": "The name of the repository. This name will be part of the repository url.", "typeHelpText": "The type of the repository (e.g. Mercurial, Git or Subversion).", "contactHelpText": "Email address of the person who is responsible for this repository.", diff --git a/scm-ui/src/repos/components/form/RepositoryForm.js b/scm-ui/src/repos/components/form/RepositoryForm.js index fcd88f0417..40e8cbee54 100644 --- a/scm-ui/src/repos/components/form/RepositoryForm.js +++ b/scm-ui/src/repos/components/form/RepositoryForm.js @@ -15,12 +15,14 @@ type Props = { submitForm: Repository => void, repository?: Repository, repositoryTypes: RepositoryType[], + namespaceStrategy: string, loading?: boolean, t: string => string }; type State = { repository: Repository, + namespaceValidationError: boolean, nameValidationError: boolean, contactValidationError: boolean }; @@ -38,9 +40,9 @@ class RepositoryForm extends React.Component { description: "", _links: {} }, + namespaceValidationError: false, nameValidationError: false, - contactValidationError: false, - descriptionValidationError: false + contactValidationError: false }; } @@ -61,6 +63,7 @@ class RepositoryForm extends React.Component { isValid = () => { const repository = this.state.repository; return !( + this.state.namespaceValidationError || this.state.nameValidationError || this.state.contactValidationError || this.isFalsy(repository.name) @@ -127,6 +130,22 @@ class RepositoryForm extends React.Component { }); } + renderNamespaceField = () => { + const { namespaceStrategy, t } = this.props; + if (namespaceStrategy === "CustomNamespaceStrategy") { + const repository = this.state.repository; + return ; + } + return null; + }; + renderCreateOnlyFields() { if (!this.isCreateMode()) { return null; @@ -135,6 +154,7 @@ class RepositoryForm extends React.Component { const repository = this.state.repository; return ( <> + {this.renderNamespaceField()} { ); } + handleNamespaceChange = (namespace: string) => { + this.setState({ + namespaceValidationError: !validator.isNameValid(namespace), + repository: { ...this.state.repository, namespace } + }); + }; + handleNameChange = (name: string) => { this.setState({ nameValidationError: !validator.isNameValid(name), diff --git a/scm-ui/src/repos/containers/Create.js b/scm-ui/src/repos/containers/Create.js index 2cdd61fbbd..8931caa212 100644 --- a/scm-ui/src/repos/containers/Create.js +++ b/scm-ui/src/repos/containers/Create.js @@ -4,7 +4,7 @@ import { connect } from "react-redux"; import { translate } from "react-i18next"; import { Page } from "@scm-manager/ui-components"; import RepositoryForm from "../components/form"; -import type { Repository, RepositoryType } from "@scm-manager/ui-types"; +import type { Repository, RepositoryType, NamespaceStrategies } from "@scm-manager/ui-types"; import { fetchRepositoryTypesIfNeeded, getFetchRepositoryTypesFailure, @@ -19,15 +19,21 @@ import { } from "../modules/repos"; import type { History } from "history"; import { getRepositoriesLink } from "../../modules/indexResource"; +import { + fetchNamespaceStrategiesIfNeeded, + getFetchNamespaceStrategiesFailure, getNamespaceStrategies, isFetchNamespaceStrategiesPending +} from "../../config/modules/namespaceStrategies"; type Props = { repositoryTypes: RepositoryType[], - typesLoading: boolean, + namespaceStrategies: NamespaceStrategies, + pageLoading: boolean, createLoading: boolean, error: Error, repoLink: string, // dispatch functions + fetchNamespaceStrategiesIfNeeded: () => void, fetchRepositoryTypesIfNeeded: () => void, createRepo: ( link: string, @@ -45,6 +51,7 @@ class Create extends React.Component { componentDidMount() { this.props.resetForm(); this.props.fetchRepositoryTypesIfNeeded(); + this.props.fetchNamespaceStrategiesIfNeeded(); } repoCreated = (repo: Repository) => { @@ -55,9 +62,10 @@ class Create extends React.Component { render() { const { - typesLoading, + pageLoading, createLoading, repositoryTypes, + namespaceStrategies, createRepo, error } = this.props; @@ -67,13 +75,14 @@ class Create extends React.Component { { createRepo(repoLink, repo, (repo: Repository) => this.repoCreated(repo) @@ -87,14 +96,18 @@ class Create extends React.Component { const mapStateToProps = state => { const repositoryTypes = getRepositoryTypes(state); - const typesLoading = isFetchRepositoryTypesPending(state); + const namespaceStrategies = getNamespaceStrategies(state); + const pageLoading = isFetchRepositoryTypesPending(state) + || isFetchNamespaceStrategiesPending(state); const createLoading = isCreateRepoPending(state); - const error = - getFetchRepositoryTypesFailure(state) || getCreateRepoFailure(state); + const error = getFetchRepositoryTypesFailure(state) + || getCreateRepoFailure(state) + || getFetchNamespaceStrategiesFailure(state); const repoLink = getRepositoriesLink(state); return { repositoryTypes, - typesLoading, + namespaceStrategies, + pageLoading, createLoading, error, repoLink @@ -106,6 +119,9 @@ const mapDispatchToProps = dispatch => { fetchRepositoryTypesIfNeeded: () => { dispatch(fetchRepositoryTypesIfNeeded()); }, + fetchNamespaceStrategiesIfNeeded: () => { + dispatch(fetchNamespaceStrategiesIfNeeded()); + }, createRepo: ( link: string, repository: Repository,