mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-08 14:35:45 +01:00
translate users module
This commit is contained in:
30
scm-ui/public/locales/en/users.json
Normal file
30
scm-ui/public/locales/en/users.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"user": {
|
||||||
|
"name": "Username",
|
||||||
|
"displayName": "Display Name",
|
||||||
|
"mail": "E-Mail",
|
||||||
|
"password": "Password",
|
||||||
|
"admin": "Admin",
|
||||||
|
"active": "Active"
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"title": "Users",
|
||||||
|
"subtitle": "Create, read, update and delete users",
|
||||||
|
"add-button": "Add User"
|
||||||
|
},
|
||||||
|
"delete-user-button": {
|
||||||
|
"label": "Delete",
|
||||||
|
"confirm-alert": {
|
||||||
|
"title": "Delete user",
|
||||||
|
"message": "Do you really want to delete the user?",
|
||||||
|
"submit": "Yes",
|
||||||
|
"cancel": "No"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"edit-user-button": {
|
||||||
|
"label": "Edit"
|
||||||
|
},
|
||||||
|
"user-form": {
|
||||||
|
"submit": "Submit"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
// @flow
|
// @flow
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { translate } from "react-i18next";
|
||||||
import type { User } from "../types/User";
|
import type { User } from "../types/User";
|
||||||
import type { UserEntry } from "../types/UserEntry";
|
import type { UserEntry } from "../types/UserEntry";
|
||||||
import { confirmAlert } from "../../components/ConfirmAlert";
|
import { confirmAlert } from "../../components/ConfirmAlert";
|
||||||
@@ -8,6 +9,7 @@ import DeleteButton from "../../components/DeleteButton";
|
|||||||
type Props = {
|
type Props = {
|
||||||
entry: UserEntry,
|
entry: UserEntry,
|
||||||
confirmDialog?: boolean,
|
confirmDialog?: boolean,
|
||||||
|
t: string => string,
|
||||||
deleteUser: (user: User) => void
|
deleteUser: (user: User) => void
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -21,16 +23,17 @@ class DeleteUserButton extends React.Component<Props> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
confirmDelete = () => {
|
confirmDelete = () => {
|
||||||
|
const { t } = this.props;
|
||||||
confirmAlert({
|
confirmAlert({
|
||||||
title: "Delete user",
|
title: t("delete-user-button.confirm-alert.title"),
|
||||||
message: "Do you really want to delete the user?",
|
message: t("delete-user-button.confirm-alert.message"),
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
label: "Yes",
|
label: t("delete-user-button.confirm-alert.submit"),
|
||||||
onClick: () => this.deleteUser()
|
onClick: () => this.deleteUser()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "No",
|
label: t("delete-user-button.confirm-alert.cancel"),
|
||||||
onClick: () => null
|
onClick: () => null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -42,16 +45,20 @@ class DeleteUserButton extends React.Component<Props> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { confirmDialog, entry } = this.props;
|
const { confirmDialog, entry, t } = this.props;
|
||||||
const action = confirmDialog ? this.confirmDelete : this.deleteUser;
|
const action = confirmDialog ? this.confirmDelete : this.deleteUser;
|
||||||
|
|
||||||
if (!this.isDeletable()) {
|
if (!this.isDeletable()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<DeleteButton label="Delete" action={action} loading={entry.loading} />
|
<DeleteButton
|
||||||
|
label={t("delete-user-button.label")}
|
||||||
|
action={action}
|
||||||
|
loading={entry.loading}
|
||||||
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default DeleteUserButton;
|
export default translate("users")(DeleteUserButton);
|
||||||
|
|||||||
@@ -1,21 +1,29 @@
|
|||||||
//@flow
|
//@flow
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { translate } from "react-i18next";
|
||||||
import EditButton from "../../components/EditButton";
|
import EditButton from "../../components/EditButton";
|
||||||
import type { UserEntry } from "../types/UserEntry";
|
import type { UserEntry } from "../types/UserEntry";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
t: string => string,
|
||||||
entry: UserEntry
|
entry: UserEntry
|
||||||
};
|
};
|
||||||
|
|
||||||
class EditUserButton extends React.Component<Props> {
|
class EditUserButton extends React.Component<Props> {
|
||||||
render() {
|
render() {
|
||||||
const { entry } = this.props;
|
const { entry, t } = this.props;
|
||||||
const link = "/users/edit/" + entry.entry.name;
|
const link = "/users/edit/" + entry.entry.name;
|
||||||
|
|
||||||
if (!this.isEditable()) {
|
if (!this.isEditable()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return <EditButton label="Edit" link={link} loading={entry.loading} />;
|
return (
|
||||||
|
<EditButton
|
||||||
|
label={t("edit-user-button.label")}
|
||||||
|
link={link}
|
||||||
|
loading={entry.loading}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
isEditable = () => {
|
isEditable = () => {
|
||||||
@@ -23,4 +31,4 @@ class EditUserButton extends React.Component<Props> {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export default EditUserButton;
|
export default translate("users")(EditUserButton);
|
||||||
|
|||||||
@@ -1,14 +1,17 @@
|
|||||||
// @flow
|
// @flow
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { translate } from "react-i18next";
|
||||||
import type { User } from "../types/User";
|
import type { User } from "../types/User";
|
||||||
import InputField from "../../components/InputField";
|
import InputField from "../../components/InputField";
|
||||||
import Checkbox from "../../components/Checkbox";
|
import Checkbox from "../../components/Checkbox";
|
||||||
import SubmitButton from "../../components/SubmitButton";
|
import SubmitButton from "../../components/SubmitButton";
|
||||||
|
import Loading from "../../components/Loading";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
submitForm: User => void,
|
submitForm: User => void,
|
||||||
user?: User,
|
user?: User,
|
||||||
loading?: boolean
|
loading?: boolean,
|
||||||
|
t: string => string
|
||||||
};
|
};
|
||||||
|
|
||||||
class UserForm extends React.Component<Props, User> {
|
class UserForm extends React.Component<Props, User> {
|
||||||
@@ -34,48 +37,52 @@ class UserForm extends React.Component<Props, User> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
const { t } = this.props;
|
||||||
const user = this.state;
|
const user = this.state;
|
||||||
if (user) {
|
if (user) {
|
||||||
return (
|
return (
|
||||||
<div className="container">
|
<div className="container">
|
||||||
<form onSubmit={this.submit}>
|
<form onSubmit={this.submit}>
|
||||||
<InputField
|
<InputField
|
||||||
label="Username"
|
label={t("user.name")}
|
||||||
onChange={this.handleUsernameChange}
|
onChange={this.handleUsernameChange}
|
||||||
value={user ? user.name : ""}
|
value={user ? user.name : ""}
|
||||||
/>
|
/>
|
||||||
<InputField
|
<InputField
|
||||||
label="Display Name"
|
label={t("user.displayName")}
|
||||||
onChange={this.handleDisplayNameChange}
|
onChange={this.handleDisplayNameChange}
|
||||||
value={user ? user.displayName : ""}
|
value={user ? user.displayName : ""}
|
||||||
/>
|
/>
|
||||||
<InputField
|
<InputField
|
||||||
label="E-Mail"
|
label={t("user.mail")}
|
||||||
onChange={this.handleEmailChange}
|
onChange={this.handleEmailChange}
|
||||||
value={user ? user.mail : ""}
|
value={user ? user.mail : ""}
|
||||||
/>
|
/>
|
||||||
<InputField
|
<InputField
|
||||||
label="Password"
|
label={t("user.password")}
|
||||||
type="password"
|
type="password"
|
||||||
onChange={this.handlePasswordChange}
|
onChange={this.handlePasswordChange}
|
||||||
value={user ? user.password : ""}
|
value={user ? user.password : ""}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
label="Admin"
|
label={t("user.admin")}
|
||||||
onChange={this.handleAdminChange}
|
onChange={this.handleAdminChange}
|
||||||
checked={user ? user.admin : false}
|
checked={user ? user.admin : false}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
label="Active"
|
label={t("user.active")}
|
||||||
onChange={this.handleActiveChange}
|
onChange={this.handleActiveChange}
|
||||||
checked={user ? user.active : false}
|
checked={user ? user.active : false}
|
||||||
/>
|
/>
|
||||||
<SubmitButton label="Submit" loading={this.props.loading} />
|
<SubmitButton
|
||||||
|
label={t("user-form.submit")}
|
||||||
|
loading={this.props.loading}
|
||||||
|
/>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return <div>Loading...</div>;
|
return <Loading />;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,4 +111,4 @@ class UserForm extends React.Component<Props, User> {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export default UserForm;
|
export default translate("users")(UserForm);
|
||||||
|
|||||||
@@ -1,26 +1,28 @@
|
|||||||
// @flow
|
// @flow
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { translate } from "react-i18next";
|
||||||
import UserRow from "./UserRow";
|
import UserRow from "./UserRow";
|
||||||
import type { User } from "../types/User";
|
import type { User } from "../types/User";
|
||||||
import type { UserEntry } from "../types/UserEntry";
|
import type { UserEntry } from "../types/UserEntry";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
t: string => string,
|
||||||
entries: Array<UserEntry>,
|
entries: Array<UserEntry>,
|
||||||
deleteUser: User => void
|
deleteUser: User => void
|
||||||
};
|
};
|
||||||
|
|
||||||
class UserTable extends React.Component<Props> {
|
class UserTable extends React.Component<Props> {
|
||||||
render() {
|
render() {
|
||||||
const { deleteUser } = this.props;
|
const { deleteUser, t } = this.props;
|
||||||
const entries = this.props.entries;
|
const entries = this.props.entries;
|
||||||
return (
|
return (
|
||||||
<table className="table is-hoverable is-fullwidth">
|
<table className="table is-hoverable is-fullwidth">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Name</th>
|
<th>{t("user.name")}</th>
|
||||||
<th>Display Name</th>
|
<th>{t("user.displayName")}</th>
|
||||||
<th>E-Mail</th>
|
<th>{t("user.mail")}</th>
|
||||||
<th>Admin</th>
|
<th>{t("user.admin")}</th>
|
||||||
<th />
|
<th />
|
||||||
<th />
|
<th />
|
||||||
</tr>
|
</tr>
|
||||||
@@ -37,4 +39,4 @@ class UserTable extends React.Component<Props> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default UserTable;
|
export default translate("users")(UserTable);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// @flow
|
// @flow
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
|
import { translate } from "react-i18next";
|
||||||
|
|
||||||
import { fetchUsers, deleteUser, getUsersFromState } from "../modules/users";
|
import { fetchUsers, deleteUser, getUsersFromState } from "../modules/users";
|
||||||
import Page from "../../components/Page";
|
import Page from "../../components/Page";
|
||||||
@@ -12,6 +13,7 @@ import type { UserEntry } from "../types/UserEntry";
|
|||||||
type Props = {
|
type Props = {
|
||||||
loading?: boolean,
|
loading?: boolean,
|
||||||
error: Error,
|
error: Error,
|
||||||
|
t: string => string,
|
||||||
userEntries: Array<UserEntry>,
|
userEntries: Array<UserEntry>,
|
||||||
fetchUsers: () => void,
|
fetchUsers: () => void,
|
||||||
deleteUser: User => void,
|
deleteUser: User => void,
|
||||||
@@ -24,11 +26,11 @@ class Users extends React.Component<Props, User> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { userEntries, deleteUser, loading, error } = this.props;
|
const { userEntries, deleteUser, loading, t, error } = this.props;
|
||||||
return (
|
return (
|
||||||
<Page
|
<Page
|
||||||
title="Users"
|
title={t("users.title")}
|
||||||
subtitle="Create, read, update and delete users"
|
subtitle={t("users.subtitle")}
|
||||||
loading={loading || !userEntries}
|
loading={loading || !userEntries}
|
||||||
error={error}
|
error={error}
|
||||||
>
|
>
|
||||||
@@ -39,10 +41,11 @@ class Users extends React.Component<Props, User> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderAddButton() {
|
renderAddButton() {
|
||||||
if (this.props.canAddUsers) {
|
const { canAddUsers, t } = this.props;
|
||||||
|
if (canAddUsers) {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<AddButton label="Add User" link="/users/add" />
|
<AddButton label={t("users.add-button")} link="/users/add" />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
@@ -83,4 +86,4 @@ const mapDispatchToProps = dispatch => {
|
|||||||
export default connect(
|
export default connect(
|
||||||
mapStateToProps,
|
mapStateToProps,
|
||||||
mapDispatchToProps
|
mapDispatchToProps
|
||||||
)(Users);
|
)(translate("users")(Users));
|
||||||
|
|||||||
Reference in New Issue
Block a user