mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-16 18:26:16 +01:00
Merge with 2.0.0-m3
This commit is contained in:
@@ -70,7 +70,7 @@ class Profile extends React.Component<Props, State> {
|
||||
<div className="column">
|
||||
<Navigation>
|
||||
<Section label={t("profile.navigation-label")}>
|
||||
<NavLink to={`${url}`} label={t("profile.information")} />
|
||||
<NavLink to={`${url}`} icon="fas fa-info-circle" label={t("profile.information")} />
|
||||
</Section>
|
||||
<Section label={t("profile.actions-label")}>
|
||||
<NavLink
|
||||
|
||||
@@ -3,6 +3,8 @@ import React from "react";
|
||||
import { translate } from "react-i18next";
|
||||
import {
|
||||
AutocompleteAddEntryToTableField,
|
||||
LabelWithHelpIcon,
|
||||
MemberNameTable,
|
||||
InputField,
|
||||
SubmitButton,
|
||||
Textarea
|
||||
@@ -10,7 +12,6 @@ import {
|
||||
import type { Group, SelectValue } from "@scm-manager/ui-types";
|
||||
|
||||
import * as validator from "./groupValidation";
|
||||
import MemberNameTable from "./MemberNameTable";
|
||||
|
||||
type Props = {
|
||||
t: string => string,
|
||||
@@ -97,6 +98,10 @@ class GroupForm extends React.Component<Props, State> {
|
||||
validationError={false}
|
||||
helpText={t("group-form.help.descriptionHelpText")}
|
||||
/>
|
||||
<LabelWithHelpIcon
|
||||
label={t("group.members")}
|
||||
helpText={t("group-form.help.memberHelpText")}
|
||||
/>
|
||||
<MemberNameTable
|
||||
members={group.members}
|
||||
memberListChanged={this.memberListChanged}
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
//@flow
|
||||
import React from "react";
|
||||
import { translate } from "react-i18next";
|
||||
import {
|
||||
RemoveEntryOfTableButton,
|
||||
LabelWithHelpIcon
|
||||
} from "@scm-manager/ui-components";
|
||||
|
||||
type Props = {
|
||||
members: string[],
|
||||
t: string => string,
|
||||
memberListChanged: (string[]) => void
|
||||
};
|
||||
|
||||
type State = {};
|
||||
|
||||
class MemberNameTable extends React.Component<Props, State> {
|
||||
render() {
|
||||
const { t } = this.props;
|
||||
return (
|
||||
<div>
|
||||
<LabelWithHelpIcon
|
||||
label={t("group.members")}
|
||||
helpText={t("group-form.help.memberHelpText")}
|
||||
/>
|
||||
<table className="table is-hoverable is-fullwidth">
|
||||
<tbody>
|
||||
{this.props.members.map(member => {
|
||||
return (
|
||||
<tr key={member}>
|
||||
<td key={member}>{member}</td>
|
||||
<td>
|
||||
<RemoveEntryOfTableButton
|
||||
entryname={member}
|
||||
removeEntry={this.removeEntry}
|
||||
disabled={false}
|
||||
label={t("remove-member-button.label")}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
removeEntry = (membername: string) => {
|
||||
const newMembers = this.props.members.filter(name => name !== membername);
|
||||
this.props.memberListChanged(newMembers);
|
||||
};
|
||||
}
|
||||
|
||||
export default translate("groups")(MemberNameTable);
|
||||
@@ -28,7 +28,7 @@ export class DeleteGroupNavLink extends React.Component<Props> {
|
||||
buttons: [
|
||||
{
|
||||
label: t("delete-group-button.confirm-alert.submit"),
|
||||
onClick: () => this.deleteGroup()
|
||||
onClick: () => this.deleteGroup(),
|
||||
},
|
||||
{
|
||||
label: t("delete-group-button.confirm-alert.cancel"),
|
||||
@@ -49,7 +49,7 @@ export class DeleteGroupNavLink extends React.Component<Props> {
|
||||
if (!this.isDeletable()) {
|
||||
return null;
|
||||
}
|
||||
return <NavAction label={t("delete-group-button.label")} action={action} />;
|
||||
return <NavAction icon="fas fa-times" label={t("delete-group-button.label")} action={action} />;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ class EditGroupNavLink extends React.Component<Props, State> {
|
||||
if (!this.isEditable()) {
|
||||
return null;
|
||||
}
|
||||
return <NavLink label={t("edit-group-button.label")} to={editUrl} />;
|
||||
return <NavLink to={editUrl} icon="fas fa-cog" label={t("edit-group-button.label")} />;
|
||||
}
|
||||
|
||||
isEditable = () => {
|
||||
|
||||
@@ -17,7 +17,7 @@ class ChangePermissionNavLink extends React.Component<Props> {
|
||||
if (!this.hasPermissionToSetPermission()) {
|
||||
return null;
|
||||
}
|
||||
return <NavLink label={t("set-permissions-button.label")} to={permissionsUrl} />;
|
||||
return <NavLink to={permissionsUrl} label={t("set-permissions-button.label")} />;
|
||||
}
|
||||
|
||||
hasPermissionToSetPermission = () => {
|
||||
|
||||
@@ -68,11 +68,13 @@ class AddGroup extends React.Component<Props, State> {
|
||||
});
|
||||
});
|
||||
};
|
||||
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)
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -131,6 +131,7 @@ class SingleGroup extends React.Component<Props> {
|
||||
<Section label={t("single-group.navigation-label")}>
|
||||
<NavLink
|
||||
to={`${url}`}
|
||||
icon="fas fa-info-circle"
|
||||
label={t("single-group.information-label")}
|
||||
/>
|
||||
<SetPermissionsNavLink
|
||||
@@ -149,7 +150,11 @@ class SingleGroup extends React.Component<Props> {
|
||||
deleteGroup={this.deleteGroup}
|
||||
/>
|
||||
<EditGroupNavLink group={group} editUrl={`${url}/edit`} />
|
||||
<NavLink to="/groups" label={t("single-group.back-label")} />
|
||||
<NavLink
|
||||
to="/groups"
|
||||
icon="fas fa-undo-alt"
|
||||
label={t("single-group.back-label")}
|
||||
/>
|
||||
</Section>
|
||||
</Navigation>
|
||||
</div>
|
||||
|
||||
@@ -51,7 +51,7 @@ class DeleteNavAction extends React.Component<Props> {
|
||||
if (!this.isDeletable()) {
|
||||
return null;
|
||||
}
|
||||
return <NavAction label={t("delete-nav-action.label")} action={action} />;
|
||||
return <NavAction action={action} icon="fas fa-times" label={t("delete-nav-action.label")} />;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class EditNavLink extends React.Component<Props> {
|
||||
return null;
|
||||
}
|
||||
const { editUrl, t } = this.props;
|
||||
return <NavLink to={editUrl} label={t("edit-nav-link.label")} />;
|
||||
return <NavLink to={editUrl} icon="fas fa-cog" label={t("edit-nav-link.label")} />;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,6 @@ describe("EditNavLink", () => {
|
||||
<EditNavLink repository={repository} editUrl="" />,
|
||||
options.get()
|
||||
);
|
||||
expect(navLink.text()).toBe("edit-nav-link.label");
|
||||
expect(navLink.text()).toBe(" edit-nav-link.label");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -20,7 +20,7 @@ class PermissionsNavLink extends React.Component<Props> {
|
||||
}
|
||||
const { permissionUrl, t } = this.props;
|
||||
return (
|
||||
<NavLink to={permissionUrl} label={t("repository-root.permissions")} />
|
||||
<NavLink to={permissionUrl} icon="fas fa-lock" label={t("repository-root.permissions")} />
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,6 @@ describe("PermissionsNavLink", () => {
|
||||
<PermissionsNavLink repository={repository} permissionUrl="" />,
|
||||
options.get()
|
||||
);
|
||||
expect(navLink.text()).toBe("repository-root.permissions");
|
||||
expect(navLink.text()).toBe(" repository-root.permissions");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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<Props> {
|
||||
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<Props> {
|
||||
repositoryTypes={repositoryTypes}
|
||||
loading={createLoading}
|
||||
submitForm={repo => {
|
||||
createRepo(repoLink, repo, this.repoCreated);
|
||||
createRepo(repoLink, repo, (repo: Repository) =>
|
||||
this.repoCreated(repo)
|
||||
);
|
||||
}}
|
||||
/>
|
||||
</Page>
|
||||
|
||||
@@ -169,11 +169,12 @@ class RepositoryRoot extends React.Component<Props> {
|
||||
<div className="column">
|
||||
<Navigation>
|
||||
<Section label={t("repository-root.navigation-label")}>
|
||||
<NavLink to={url} label={t("repository-root.information")} />
|
||||
<NavLink to={url} icon="fas fa-info-circle" label={t("repository-root.information")} />
|
||||
<RepositoryNavLink
|
||||
repository={repository}
|
||||
linkName="changesets"
|
||||
to={`${url}/changesets/`}
|
||||
icon="fas fa-code-branch"
|
||||
label={t("repository-root.history")}
|
||||
activeWhenMatch={this.matches}
|
||||
activeOnlyWhenExact={false}
|
||||
@@ -182,6 +183,7 @@ class RepositoryRoot extends React.Component<Props> {
|
||||
repository={repository}
|
||||
linkName="sources"
|
||||
to={`${url}/sources`}
|
||||
icon="fas fa-code"
|
||||
label={t("repository-root.sources")}
|
||||
activeOnlyWhenExact={false}
|
||||
/>
|
||||
@@ -189,7 +191,6 @@ class RepositoryRoot extends React.Component<Props> {
|
||||
permissionUrl={`${url}/permissions`}
|
||||
repository={repository}
|
||||
/>
|
||||
<EditNavLink repository={repository} editUrl={`${url}/edit`} />
|
||||
<ExtensionPoint
|
||||
name="repository.navigation"
|
||||
props={extensionProps}
|
||||
@@ -198,7 +199,8 @@ class RepositoryRoot extends React.Component<Props> {
|
||||
</Section>
|
||||
<Section label={t("repository-root.actions-label")}>
|
||||
<DeleteNavAction repository={repository} delete={this.delete} />
|
||||
<NavLink to="/repos" label={t("repository-root.back-label")} />
|
||||
<EditNavLink repository={repository} editUrl={`${url}/edit`} />
|
||||
<NavLink to="/repos" icon="fas fa-undo" label={t("repository-root.back-label")} />
|
||||
</Section>
|
||||
</Navigation>
|
||||
</div>
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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";
|
||||
};
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class DeleteUserNavLink extends React.Component<Props> {
|
||||
if (!this.isDeletable()) {
|
||||
return null;
|
||||
}
|
||||
return <NavAction label={t("delete-user-button.label")} action={action} />;
|
||||
return <NavAction icon="fas fa-times" label={t("delete-user-button.label")} action={action} />;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ class EditUserNavLink extends React.Component<Props> {
|
||||
if (!this.isEditable()) {
|
||||
return null;
|
||||
}
|
||||
return <NavLink label={t("edit-user-button.label")} to={editUrl} />;
|
||||
return <NavLink to={editUrl} icon="fas fa-cog" label={t("edit-user-button.label")} />;
|
||||
}
|
||||
|
||||
isEditable = () => {
|
||||
|
||||
@@ -17,7 +17,7 @@ class ChangePasswordNavLink extends React.Component<Props> {
|
||||
if (!this.hasPermissionToSetPassword()) {
|
||||
return null;
|
||||
}
|
||||
return <NavLink label={t("set-password-button.label")} to={passwordUrl} />;
|
||||
return <NavLink to={passwordUrl} label={t("set-password-button.label")} />;
|
||||
}
|
||||
|
||||
hasPermissionToSetPassword = () => {
|
||||
|
||||
@@ -17,7 +17,7 @@ class ChangePermissionNavLink extends React.Component<Props> {
|
||||
if (!this.hasPermissionToSetPermission()) {
|
||||
return null;
|
||||
}
|
||||
return <NavLink label={t("set-permissions-button.label")} to={permissionsUrl} />;
|
||||
return <NavLink to={permissionsUrl} label={t("set-permissions-button.label")} />;
|
||||
}
|
||||
|
||||
hasPermissionToSetPermission = () => {
|
||||
|
||||
@@ -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<Props> {
|
||||
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() {
|
||||
|
||||
@@ -122,6 +122,7 @@ class SingleUser extends React.Component<Props> {
|
||||
<Section label={t("single-user.navigation-label")}>
|
||||
<NavLink
|
||||
to={`${url}`}
|
||||
icon="fas fa-info-circle"
|
||||
label={t("single-user.information-label")}
|
||||
/>
|
||||
<EditUserNavLink user={user} editUrl={`${url}/edit`} />
|
||||
@@ -136,7 +137,7 @@ class SingleUser extends React.Component<Props> {
|
||||
</Section>
|
||||
<Section label={t("single-user.actions-label")}>
|
||||
<DeleteUserNavLink user={user} deleteUser={this.deleteUser} />
|
||||
<NavLink to="/users" label={t("single-user.back-label")} />
|
||||
<NavLink to="/users" icon="fas fa-undo" label={t("single-user.back-label")} />
|
||||
</Section>
|
||||
</Navigation>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user