diff --git a/pom.xml b/pom.xml index e04a47ef41..5b300fb634 100644 --- a/pom.xml +++ b/pom.xml @@ -386,7 +386,7 @@ com.github.sdorra buildfrontend-maven-plugin - 2.1.1 + 2.2.0 org.apache.maven.plugins @@ -817,6 +817,10 @@ **/*StoreFactory.java,**/*UserPassword.js + 8.11.4 + ./scm-ui/target/frontend/buildfrontend-node/node-v${node.version}-linux-x64/bin/node + + diff --git a/scm-ui-components/packages/ui-components/src/navigation/NavAction.js b/scm-ui-components/packages/ui-components/src/navigation/NavAction.js index 5eacbb7407..3ae30d4b68 100644 --- a/scm-ui-components/packages/ui-components/src/navigation/NavAction.js +++ b/scm-ui-components/packages/ui-components/src/navigation/NavAction.js @@ -2,16 +2,23 @@ import React from "react"; type Props = { + icon?: string, label: string, action: () => void }; class NavAction extends React.Component { render() { - const { label, action } = this.props; + const { label, icon, action } = this.props; + + let showIcon = null; + if (icon) { + showIcon = (<>{" "}); + } + return (
  • - {label} + {showIcon}{label}
  • ); } diff --git a/scm-ui-components/packages/ui-components/src/navigation/NavLink.js b/scm-ui-components/packages/ui-components/src/navigation/NavLink.js index 9a7c72adb1..53b124ef31 100644 --- a/scm-ui-components/packages/ui-components/src/navigation/NavLink.js +++ b/scm-ui-components/packages/ui-components/src/navigation/NavLink.js @@ -6,6 +6,7 @@ import {Link, Route} from "react-router-dom"; type Props = { to: string, + icon?: string, label: string, activeOnlyWhenExact?: boolean, activeWhenMatch?: (route: any) => boolean @@ -23,10 +24,17 @@ class NavLink extends React.Component { } renderLink = (route: any) => { - const { to, label } = this.props; + const { to, icon, label } = this.props; + + let showIcon = null; + if (icon) { + showIcon = (<>{" "}); + } + return (
  • + {showIcon} {label}
  • @@ -35,6 +43,7 @@ class NavLink extends React.Component { render() { const { to, activeOnlyWhenExact } = this.props; + return ( ); diff --git a/scm-ui/src/containers/Profile.js b/scm-ui/src/containers/Profile.js index 40392d151e..e9bdbaa4b9 100644 --- a/scm-ui/src/containers/Profile.js +++ b/scm-ui/src/containers/Profile.js @@ -18,7 +18,7 @@ import { } from "@scm-manager/ui-components"; import ChangeUserPassword from "./ChangeUserPassword"; import ProfileInfo from "./ProfileInfo"; -import {ExtensionPoint} from "@scm-manager/ui-extensions"; +import { ExtensionPoint } from "@scm-manager/ui-extensions"; type Props = { me: Me, @@ -79,6 +79,7 @@ class Profile extends React.Component {
    { if (!this.isEditable()) { return null; } - return ; + return ; } } diff --git a/scm-ui/src/groups/components/navLinks/SetPermissionsNavLink.js b/scm-ui/src/groups/components/navLinks/SetPermissionsNavLink.js index 860fbad51e..b2d7062f5e 100644 --- a/scm-ui/src/groups/components/navLinks/SetPermissionsNavLink.js +++ b/scm-ui/src/groups/components/navLinks/SetPermissionsNavLink.js @@ -17,7 +17,7 @@ class ChangePermissionNavLink extends React.Component { if (!this.hasPermissionToSetPermission()) { return null; } - return ; + return ; } hasPermissionToSetPermission = () => { diff --git a/scm-ui/src/groups/containers/AddGroup.js b/scm-ui/src/groups/containers/AddGroup.js index c19f6156d1..69c1171ea9 100644 --- a/scm-ui/src/groups/containers/AddGroup.js +++ b/scm-ui/src/groups/containers/AddGroup.js @@ -68,11 +68,13 @@ class AddGroup extends React.Component { }); }); }; - groupCreated = () => { - this.props.history.push("/groups"); + groupCreated = (group: Group) => { + this.props.history.push("/group/" + group.name); }; createGroup = (group: Group) => { - this.props.createGroup(this.props.createLink, group, this.groupCreated); + this.props.createGroup(this.props.createLink, group, () => + this.groupCreated(group) + ); }; } diff --git a/scm-ui/src/groups/containers/SingleGroup.js b/scm-ui/src/groups/containers/SingleGroup.js index 72d6946220..3db1fa0006 100644 --- a/scm-ui/src/groups/containers/SingleGroup.js +++ b/scm-ui/src/groups/containers/SingleGroup.js @@ -29,7 +29,7 @@ import { translate } from "react-i18next"; import GeneralGroup from "./GeneralGroup"; import { getGroupsLink } from "../../modules/indexResource"; import SetPermissions from "../../permissions/components/SetPermissions"; -import {ExtensionPoint} from "@scm-manager/ui-extensions"; +import { ExtensionPoint } from "@scm-manager/ui-extensions"; type Props = { name: string, @@ -105,7 +105,9 @@ class SingleGroup extends React.Component { path={`${url}/settings/permissions`} exact component={() => ( - + )} /> {
    { group={group} permissionsUrl={`${url}/settings/permissions`} /> - +
    diff --git a/scm-ui/src/repos/components/GeneralRepoNavLink.js b/scm-ui/src/repos/components/GeneralRepoNavLink.js index 650cf0f62c..314c86c6ff 100644 --- a/scm-ui/src/repos/components/GeneralRepoNavLink.js +++ b/scm-ui/src/repos/components/GeneralRepoNavLink.js @@ -21,7 +21,7 @@ class GeneralRepoNavLink extends React.Component { if (!this.isEditable()) { return null; } - return ; + return ; } } diff --git a/scm-ui/src/repos/components/PermissionsNavLink.js b/scm-ui/src/repos/components/PermissionsNavLink.js index 773ad94246..1d6d52eb0b 100644 --- a/scm-ui/src/repos/components/PermissionsNavLink.js +++ b/scm-ui/src/repos/components/PermissionsNavLink.js @@ -20,7 +20,7 @@ class PermissionsNavLink extends React.Component { } const { permissionUrl, t } = this.props; return ( - + ); } } diff --git a/scm-ui/src/repos/containers/Create.js b/scm-ui/src/repos/containers/Create.js index 4cf8d468de..2cdd61fbbd 100644 --- a/scm-ui/src/repos/containers/Create.js +++ b/scm-ui/src/repos/containers/Create.js @@ -29,7 +29,11 @@ type Props = { // dispatch functions fetchRepositoryTypesIfNeeded: () => void, - createRepo: (link: string, Repository, callback: () => void) => void, + createRepo: ( + link: string, + Repository, + callback: (repo: Repository) => void + ) => void, resetForm: () => void, // context props @@ -43,9 +47,10 @@ class Create extends React.Component { this.props.fetchRepositoryTypesIfNeeded(); } - repoCreated = () => { + repoCreated = (repo: Repository) => { const { history } = this.props; - history.push("/repos"); + + history.push("/repo/" + repo.namespace + "/" + repo.name); }; render() { @@ -70,7 +75,9 @@ class Create extends React.Component { repositoryTypes={repositoryTypes} loading={createLoading} submitForm={repo => { - createRepo(repoLink, repo, this.repoCreated); + createRepo(repoLink, repo, (repo: Repository) => + this.repoCreated(repo) + ); }} /> diff --git a/scm-ui/src/repos/containers/RepositoryRoot.js b/scm-ui/src/repos/containers/RepositoryRoot.js index 52c0a7ed83..9291017ba9 100644 --- a/scm-ui/src/repos/containers/RepositoryRoot.js +++ b/scm-ui/src/repos/containers/RepositoryRoot.js @@ -174,12 +174,14 @@ class RepositoryRoot extends React.Component {
    { repository={repository} linkName="sources" to={`${url}/sources`} + icon="fas fa-code" label={t("repositoryRoot.menu.sourcesNavLink")} activeOnlyWhenExact={false} /> diff --git a/scm-ui/src/repos/modules/repos.js b/scm-ui/src/repos/modules/repos.js index 3e574aa938..aa77b4553b 100644 --- a/scm-ui/src/repos/modules/repos.js +++ b/scm-ui/src/repos/modules/repos.js @@ -164,16 +164,21 @@ export function fetchRepoFailure( export function createRepo( link: string, repository: Repository, - callback?: () => void + callback?: (repo: Repository) => void ) { return function(dispatch: any) { dispatch(createRepoPending()); return apiClient .post(link, repository, CONTENT_TYPE) - .then(() => { + .then(response => { + const location = response.headers.get("Location"); dispatch(createRepoSuccess()); + return apiClient.get(location); + }) + .then(response => response.json()) + .then(response => { if (callback) { - callback(); + callback(response); } }) .catch(err => { diff --git a/scm-ui/src/repos/modules/repos.test.js b/scm-ui/src/repos/modules/repos.test.js index e8d9873e99..ca4b6802b8 100644 --- a/scm-ui/src/repos/modules/repos.test.js +++ b/scm-ui/src/repos/modules/repos.test.js @@ -415,9 +415,14 @@ describe("repos fetch", () => { it("should successfully create repo slarti/fjords", () => { fetchMock.postOnce(REPOS_URL, { - status: 201 + status: 201, + headers: { + location: "repositories/slarti/fjords" + } }); + fetchMock.getOnce(REPOS_URL + "/slarti/fjords", slartiFjords); + const expectedActions = [ { type: CREATE_REPO_PENDING @@ -435,12 +440,19 @@ describe("repos fetch", () => { it("should successfully create repo slarti/fjords and call the callback", () => { fetchMock.postOnce(REPOS_URL, { - status: 201 + status: 201, + headers: { + location: "repositories/slarti/fjords" + } }); + + fetchMock.getOnce(REPOS_URL + "/slarti/fjords", slartiFjords); + let callMe = "not yet"; - const callback = () => { + const callback = (r: any) => { + expect(r).toEqual(slartiFjords); callMe = "yeah"; }; diff --git a/scm-ui/src/users/components/navLinks/GeneralUserNavLink.js b/scm-ui/src/users/components/navLinks/GeneralUserNavLink.js index e222a7bec2..a9b3b9a37f 100644 --- a/scm-ui/src/users/components/navLinks/GeneralUserNavLink.js +++ b/scm-ui/src/users/components/navLinks/GeneralUserNavLink.js @@ -21,7 +21,7 @@ class GeneralUserNavLink extends React.Component { if (!this.isEditable()) { return null; } - return ; + return ; } } diff --git a/scm-ui/src/users/components/navLinks/SetPasswordNavLink.js b/scm-ui/src/users/components/navLinks/SetPasswordNavLink.js index 7dfd807a93..79234308aa 100644 --- a/scm-ui/src/users/components/navLinks/SetPasswordNavLink.js +++ b/scm-ui/src/users/components/navLinks/SetPasswordNavLink.js @@ -17,7 +17,7 @@ class ChangePasswordNavLink extends React.Component { if (!this.hasPermissionToSetPassword()) { return null; } - return ; + return ; } hasPermissionToSetPassword = () => { diff --git a/scm-ui/src/users/components/navLinks/SetPermissionsNavLink.js b/scm-ui/src/users/components/navLinks/SetPermissionsNavLink.js index c0ccd80e6c..84b0f9da76 100644 --- a/scm-ui/src/users/components/navLinks/SetPermissionsNavLink.js +++ b/scm-ui/src/users/components/navLinks/SetPermissionsNavLink.js @@ -17,7 +17,7 @@ class ChangePermissionNavLink extends React.Component { if (!this.hasPermissionToSetPermission()) { return null; } - return ; + return ; } hasPermissionToSetPermission = () => { diff --git a/scm-ui/src/users/containers/AddUser.js b/scm-ui/src/users/containers/AddUser.js index 1946f7849a..069df04187 100644 --- a/scm-ui/src/users/containers/AddUser.js +++ b/scm-ui/src/users/containers/AddUser.js @@ -12,7 +12,7 @@ import { } from "../modules/users"; import { Page } from "@scm-manager/ui-components"; import { translate } from "react-i18next"; -import {getUsersLink} from "../../modules/indexResource"; +import { getUsersLink } from "../../modules/indexResource"; type Props = { loading?: boolean, @@ -33,13 +33,15 @@ class AddUser extends React.Component { this.props.resetForm(); } - userCreated = () => { + userCreated = (user: User) => { const { history } = this.props; - history.push("/users"); + history.push("/user/" + user.name); }; createUser = (user: User) => { - this.props.addUser(this.props.usersLink, user, this.userCreated); + this.props.addUser(this.props.usersLink, user, () => + this.userCreated(user) + ); }; render() { diff --git a/scm-ui/src/users/containers/SingleUser.js b/scm-ui/src/users/containers/SingleUser.js index 188de0aaee..64ed7946e4 100644 --- a/scm-ui/src/users/containers/SingleUser.js +++ b/scm-ui/src/users/containers/SingleUser.js @@ -111,6 +111,7 @@ class SingleUser extends React.Component {