diff --git a/scm-ui/src/users/containers/AddUser.js b/scm-ui/src/users/containers/AddUser.js index 1d89730972..1ee6fc759d 100644 --- a/scm-ui/src/users/containers/AddUser.js +++ b/scm-ui/src/users/containers/AddUser.js @@ -12,13 +12,15 @@ import { } from "../modules/users"; import { Page } from "@scm-manager/ui-components"; import { translate } from "react-i18next"; +import {getUsersLink} from "../../modules/indexResource"; type Props = { loading?: boolean, error?: Error, + usersLink: string, // dispatcher functions - addUser: (user: User, callback?: () => void) => void, + addUser: (link: string, user: User, callback?: () => void) => void, resetForm: () => void, // context objects @@ -37,7 +39,7 @@ class AddUser extends React.Component { }; createUser = (user: User) => { - this.props.addUser(user, this.userCreated); + this.props.addUser(this.props.usersLink, user, this.userCreated); }; render() { @@ -61,8 +63,8 @@ class AddUser extends React.Component { const mapDispatchToProps = dispatch => { return { - addUser: (user: User, callback?: () => void) => { - dispatch(createUser(user, callback)); + addUser: (link: string, user: User, callback?: () => void) => { + dispatch(createUser(link, user, callback)); }, resetForm: () => { dispatch(createUserReset()); @@ -73,7 +75,9 @@ const mapDispatchToProps = dispatch => { const mapStateToProps = (state, ownProps) => { const loading = isCreateUserPending(state); const error = getCreateUserFailure(state); + const usersLink = getUsersLink(state); return { + usersLink, loading, error }; diff --git a/scm-ui/src/users/containers/SingleUser.js b/scm-ui/src/users/containers/SingleUser.js index 2e6308da2b..f581874742 100644 --- a/scm-ui/src/users/containers/SingleUser.js +++ b/scm-ui/src/users/containers/SingleUser.js @@ -26,16 +26,18 @@ import { import { DeleteUserNavLink, EditUserNavLink } from "./../components/navLinks"; import { translate } from "react-i18next"; +import { getUsersLink } from "../../modules/indexResource"; type Props = { name: string, user: User, loading: boolean, error: Error, + usersLink: string, // dispatcher functions deleteUser: (user: User, callback?: () => void) => void, - fetchUser: string => void, + fetchUser: (string, string) => void, // context objects t: string => string, @@ -45,7 +47,7 @@ type Props = { class SingleUser extends React.Component { componentDidMount() { - this.props.fetchUser(this.props.name); + this.props.fetchUser(this.props.usersLink, this.props.name); } userDeleted = () => { @@ -124,8 +126,9 @@ const mapStateToProps = (state, ownProps) => { isFetchUserPending(state, name) || isDeleteUserPending(state, name); const error = getFetchUserFailure(state, name) || getDeleteUserFailure(state, name); - + const usersLink = getUsersLink(state); return { + usersLink, name, user, loading, @@ -135,8 +138,8 @@ const mapStateToProps = (state, ownProps) => { const mapDispatchToProps = dispatch => { return { - fetchUser: (name: string) => { - dispatch(fetchUser(name)); + fetchUser: (link: string, name: string) => { + dispatch(fetchUser(link, name)); }, deleteUser: (user: User, callback?: () => void) => { dispatch(deleteUser(user, callback)); diff --git a/scm-ui/src/users/containers/Users.js b/scm-ui/src/users/containers/Users.js index e43667b324..48c20c88ec 100644 --- a/scm-ui/src/users/containers/Users.js +++ b/scm-ui/src/users/containers/Users.js @@ -18,6 +18,7 @@ import { Page, Paginator } from "@scm-manager/ui-components"; import { UserTable } from "./../components/table"; import type { User, PagedCollection } from "@scm-manager/ui-types"; import CreateUserButton from "../components/buttons/CreateUserButton"; +import { getUsersLink } from "../../modules/indexResource"; type Props = { users: User[], @@ -26,19 +27,20 @@ type Props = { canAddUsers: boolean, list: PagedCollection, page: number, + usersLink: string, // context objects t: string => string, history: History, // dispatch functions - fetchUsersByPage: (page: number) => void, + fetchUsersByPage: (link: string, page: number) => void, fetchUsersByLink: (link: string) => void }; class Users extends React.Component { componentDidMount() { - this.props.fetchUsersByPage(this.props.page); + this.props.fetchUsersByPage(this.props.usersLink, this.props.page); } onPageChange = (link: string) => { @@ -107,6 +109,8 @@ const mapStateToProps = (state, ownProps) => { const loading = isFetchUsersPending(state); const error = getFetchUsersFailure(state); + const usersLink = getUsersLink(state); + const page = getPageFromProps(ownProps); const canAddUsers = isPermittedToCreateUsers(state); const list = selectListAsCollection(state); @@ -117,14 +121,15 @@ const mapStateToProps = (state, ownProps) => { error, canAddUsers, list, - page + page, + usersLink }; }; const mapDispatchToProps = dispatch => { return { - fetchUsersByPage: (page: number) => { - dispatch(fetchUsersByPage(page)); + fetchUsersByPage: (link: string, page: number) => { + dispatch(fetchUsersByPage(link, page)); }, fetchUsersByLink: (link: string) => { dispatch(fetchUsersByLink(link)); diff --git a/scm-ui/src/users/modules/users.js b/scm-ui/src/users/modules/users.js index 2d6cba7f03..80d8107b3e 100644 --- a/scm-ui/src/users/modules/users.js +++ b/scm-ui/src/users/modules/users.js @@ -32,21 +32,19 @@ export const DELETE_USER_PENDING = `${DELETE_USER}_${types.PENDING_SUFFIX}`; export const DELETE_USER_SUCCESS = `${DELETE_USER}_${types.SUCCESS_SUFFIX}`; export const DELETE_USER_FAILURE = `${DELETE_USER}_${types.FAILURE_SUFFIX}`; -const USERS_URL = "users"; - const CONTENT_TYPE_USER = "application/vnd.scmm-user+json;v=2"; // TODO i18n for error messages // fetch users -export function fetchUsers() { - return fetchUsersByLink(USERS_URL); +export function fetchUsers(link: string) { + return fetchUsersByLink(link); } -export function fetchUsersByPage(page: number) { +export function fetchUsersByPage(link: string, page: number) { // backend start counting by 0 - return fetchUsersByLink(USERS_URL + "?page=" + (page - 1)); + return fetchUsersByLink(link + "?page=" + (page - 1)); } export function fetchUsersByLink(link: string) { @@ -60,7 +58,7 @@ export function fetchUsersByLink(link: string) { }) .catch(cause => { const error = new Error(`could not fetch users: ${cause.message}`); - dispatch(fetchUsersFailure(USERS_URL, error)); + dispatch(fetchUsersFailure(link, error)); }); }; } @@ -89,8 +87,8 @@ export function fetchUsersFailure(url: string, error: Error): Action { } //fetch user -export function fetchUser(name: string) { - const userUrl = USERS_URL + "/" + name; +export function fetchUser(link: string, name: string) { + const userUrl = link.endsWith("/") ? link + name : link + "/" + name; return function(dispatch: any) { dispatch(fetchUserPending(name)); return apiClient @@ -137,11 +135,11 @@ export function fetchUserFailure(name: string, error: Error): Action { //create user -export function createUser(user: User, callback?: () => void) { +export function createUser(link: string, user: User, callback?: () => void) { return function(dispatch: Dispatch) { dispatch(createUserPending(user)); return apiClient - .post(USERS_URL, user, CONTENT_TYPE_USER) + .post(link, user, CONTENT_TYPE_USER) .then(() => { dispatch(createUserSuccess()); if (callback) { diff --git a/scm-ui/src/users/modules/users.test.js b/scm-ui/src/users/modules/users.test.js index c61d288c94..03da4658c2 100644 --- a/scm-ui/src/users/modules/users.test.js +++ b/scm-ui/src/users/modules/users.test.js @@ -122,6 +122,7 @@ const response = { responseBody }; +const URL = "users"; const USERS_URL = "/api/v2/users"; const error = new Error("KAPUTT"); @@ -146,7 +147,7 @@ describe("users fetch()", () => { const store = mockStore({}); - return store.dispatch(fetchUsers()).then(() => { + return store.dispatch(fetchUsers(URL)).then(() => { expect(store.getActions()).toEqual(expectedActions); }); }); @@ -157,7 +158,7 @@ describe("users fetch()", () => { }); const store = mockStore({}); - return store.dispatch(fetchUsers()).then(() => { + return store.dispatch(fetchUsers(URL)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_USERS_PENDING); expect(actions[1].type).toEqual(FETCH_USERS_FAILURE); @@ -169,7 +170,7 @@ describe("users fetch()", () => { fetchMock.getOnce(USERS_URL + "/zaphod", userZaphod); const store = mockStore({}); - return store.dispatch(fetchUser("zaphod")).then(() => { + return store.dispatch(fetchUser(URL, "zaphod")).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_USER_PENDING); expect(actions[1].type).toEqual(FETCH_USER_SUCCESS); @@ -183,7 +184,7 @@ describe("users fetch()", () => { }); const store = mockStore({}); - return store.dispatch(fetchUser("zaphod")).then(() => { + return store.dispatch(fetchUser(URL, "zaphod")).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_USER_PENDING); expect(actions[1].type).toEqual(FETCH_USER_FAILURE); @@ -201,7 +202,7 @@ describe("users fetch()", () => { fetchMock.getOnce(USERS_URL, response); const store = mockStore({}); - return store.dispatch(createUser(userZaphod)).then(() => { + return store.dispatch(createUser(URL, userZaphod)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(CREATE_USER_PENDING); expect(actions[1].type).toEqual(CREATE_USER_SUCCESS); @@ -214,7 +215,7 @@ describe("users fetch()", () => { }); const store = mockStore({}); - return store.dispatch(createUser(userZaphod)).then(() => { + return store.dispatch(createUser(URL, userZaphod)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(CREATE_USER_PENDING); expect(actions[1].type).toEqual(CREATE_USER_FAILURE); @@ -235,7 +236,7 @@ describe("users fetch()", () => { }; const store = mockStore({}); - return store.dispatch(createUser(userZaphod, callback)).then(() => { + return store.dispatch(createUser(URL, userZaphod, callback)).then(() => { expect(callMe).toBe("yeah"); }); });