translate users module

This commit is contained in:
Sebastian Sdorra
2018-07-24 16:04:55 +02:00
parent d4eadc21df
commit fd01cb0573
6 changed files with 89 additions and 32 deletions

View 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"
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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));