Extracted AddUserField

This commit is contained in:
Philipp Czora
2018-08-03 10:37:56 +02:00
parent da115f0caa
commit 7a65ed6ff8
4 changed files with 123 additions and 57 deletions

View File

@@ -29,6 +29,13 @@
"edit-group-button": { "edit-group-button": {
"label": "Edit" "label": "Edit"
}, },
"add-user-button": {
"label": "Add user"
},
"add-user-textfield": {
"label": "Add user",
"error": "Error adding user"
},
"group-form": { "group-form": {
"submit": "Submit", "submit": "Submit",
"name-error": "Group name is invalid", "name-error": "Group name is invalid",

View File

@@ -7,7 +7,7 @@ export type ButtonProps = {
label: string, label: string,
loading?: boolean, loading?: boolean,
disabled?: boolean, disabled?: boolean,
action?: () => void, action?: (event: Event) => void,
link?: string, link?: string,
fullWidth?: boolean, fullWidth?: boolean,
className?: string className?: string
@@ -37,7 +37,7 @@ class Button extends React.Component<Props> {
return ( return (
<button <button
disabled={disabled} disabled={disabled}
onClick={action ? action : () => {}} onClick={action ? action : (event: Event) => {}}
className={classNames( className={classNames(
"button", "button",
"is-" + type, "is-" + type,

View File

@@ -0,0 +1,54 @@
//@flow
import React from "react";
import { translate } from "react-i18next";
import AddButton from "../../components/buttons/AddButton";
import InputField from "../../components/forms/InputField";
type Props = {
t: string => string,
addUser: string => void
};
type State = {
userToAdd: string
};
class AddUserField extends React.Component<Props, State> {
constructor(props) {
super(props);
this.state = {
userToAdd: ""
};
}
render() {
const { t } = this.props;
return (
<div className="field">
<InputField
label={t("add-user-textfield.label")}
errorMessage={t("add-user-textfield.error")}
onChange={this.handleAddUserChange}
validationError={false} //TODO: validate user name
value={this.state.userToAdd}
/>
<AddButton
label={t("add-user-button.label")}
action={this.addButtonClicked}
/>
</div>
);
}
addButtonClicked = (event: Event) => {
event.preventDefault();
this.props.addUser(this.state.userToAdd);
this.setState({ ...this.state, userToAdd: "" });
};
handleAddUserChange = (username: string) => {
this.setState({ ...this.state, userToAdd: username });
};
}
export default translate("groups")(AddUserField);

View File

@@ -6,6 +6,7 @@ import { SubmitButton, Button } from "../../components/buttons";
import { translate } from "react-i18next"; import { translate } from "react-i18next";
import type { Group } from "../types/Group"; import type { Group } from "../types/Group";
import * as validator from "./groupValidation"; import * as validator from "./groupValidation";
import AddUserField from "./AddUserField";
type Props = { type Props = {
t: string => string, t: string => string,
@@ -16,7 +17,6 @@ type Props = {
type State = { type State = {
group: Group, group: Group,
userToAdd: string,
nameValidationError: boolean nameValidationError: boolean
}; };
@@ -34,15 +34,14 @@ class GroupForm extends React.Component<Props, State> {
members: [], members: [],
type: "" type: ""
}, },
nameValidationError: false, nameValidationError: false
userToAdd: ""
}; };
} }
componentDidMount() { componentDidMount() {
const { group } = this.props const { group } = this.props;
if (group) { if (group) {
this.setState({group: {...group}}) this.setState({...this.state, group: { ...group } });
} }
} }
@@ -56,7 +55,7 @@ class GroupForm extends React.Component<Props, State> {
isValid = () => { isValid = () => {
const group = this.state.group; const group = this.state.group;
return !( return !(
this.state.nameValidationError || this.state.nameValidationError ||
this.isFalsy(group.name) || this.isFalsy(group.name) ||
this.isFalsy(group.description) this.isFalsy(group.description)
); );
@@ -69,23 +68,23 @@ class GroupForm extends React.Component<Props, State> {
} }
}; };
render() { render() {
const { t, loading } = this.props; const { t, loading } = this.props;
const group = this.state.group const group = this.state.group;
let nameField = null; let nameField = null;
if (!this.props.group) { if (!this.props.group) {
nameField = ( nameField = (
<InputField <InputField
label={t("group.name")} label={t("group.name")}
errorMessage={t("group-form.name-error")} errorMessage={t("group-form.name-error")}
onChange={this.handleGroupNameChange} onChange={this.handleGroupNameChange}
value={group.name} value={group.name}
validationError={this.state.nameValidationError} validationError={this.state.nameValidationError}
/> />
); );
} }
return ( return (
<form onSubmit={this.submit}> <form onSubmit={this.submit}>
{nameField} {nameField}
<InputField <InputField
@@ -97,49 +96,62 @@ render() {
/> />
<label className="label">{t("group.members")}</label> <label className="label">{t("group.members")}</label>
<table className="table is-hoverable is-fullwidth"> <table className="table is-hoverable is-fullwidth">
<tbody> <tbody>
{this.state.group.members.map((user, index) => { {this.state.group.members.map((user, index) => {
return <tr key={user}> return (
<td key={user}>{user}</td> <tr key={user}>
<td><Button label="Remove" action={this.removeUser.bind(this, user)} key={user}/></td> <td key={user}>{user}</td>
</tr> <td>
})} <Button
</tbody> label="Remove"
</table> action={this.removeUser.bind(this, user)}
<InputField key={user}
label="Add user" />
errorMessage="Error" </td>
onChange={this.handleAddUserChange} </tr>
validationError={false} );
value={this.state.userToAdd}/> })}
</tbody>
<Button label="Add user" action={this.addUserClick} /> </table>
<SubmitButton disabled={!this.isValid()} label={t("group-form.submit")} loading={loading}/> <AddUserField addUser={this.addUser} />
<SubmitButton
disabled={!this.isValid()}
label={t("group-form.submit")}
loading={loading}
/>
</form> </form>
); );
} }
removeUser(user: string, event: Event) { removeUser(user: string, event: Event) {
event.preventDefault();
let newMembers = this.state.group.members.filter(name => name !== user)
this.setState({...this.state, group: {
...this.state.group,
members: newMembers}
})
}
addUserClick = (event: Event) => {
event.preventDefault(); event.preventDefault();
let newMembers = this.state.group.members.filter(name => name !== user);
this.setState({ this.setState({
...this.state, ...this.state,
userToAdd: "",
group: { group: {
...this.state.group, ...this.state.group,
members: [...this.state.group.members, this.state.userToAdd]} members: newMembers
}) }
});
}
addUser = (username: string) => {
if (this.isMember(username)) {
return;
}
this.setState({
...this.state,
group: {
...this.state.group,
members: [...this.state.group.members, username]
}
});
}
isMember = (username: string) => {
return this.state.group.members.includes(username)
} }
handleGroupNameChange = (name: string) => { handleGroupNameChange = (name: string) => {
@@ -154,13 +166,6 @@ removeUser(user: string, event: Event) {
group: { ...this.state.group, description } group: { ...this.state.group, description }
}); });
}; };
handleAddUserChange = (username: string) => {
this.setState({
...this.state,
userToAdd: username
})
}
} }
export default translate("groups")(GroupForm); export default translate("groups")(GroupForm);