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 {