[UI] Users Modal done

This commit is contained in:
Ruidy Nemausat 2020-04-17 17:20:39 +02:00
parent bff1315ca1
commit d80225786f
2 changed files with 61 additions and 40 deletions

BIN
app.db

Binary file not shown.

View file

@ -1,12 +1,21 @@
import React, { FC, useState, ChangeEvent, FormEvent } from "react"; import React, { FC, useState, ChangeEvent, FormEvent } from "react";
import { useParams } from "react-router-dom";
import { Grid } from "@material-ui/core";
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";
import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction";
import ListItemText from "@material-ui/core/ListItemText";
import ListItemAvatar from "@material-ui/core/ListItemAvatar";
import Checkbox from "@material-ui/core/Checkbox";
import Avatar from "@material-ui/core/Avatar";
import { Modal } from "./Modal"; import { Modal } from "./Modal";
import { AvatarList } from "../Avatars/AvatarList"; import { AvatarList } from "../Avatars/AvatarList";
import { User } from "../../types/User";
import { FilterBar } from "../FilterBar"; import { FilterBar } from "../FilterBar";
import { UsersModalEntry } from "./UsersModalEntry";
import { User } from "../../types/User";
import { patch } from "../../utils/http"; import { patch } from "../../utils/http";
import { Constants } from "../../utils/Constants"; import { Constants } from "../../utils/Constants";
import { UsersModalEntry } from "./UsersModalEntry";
import { useParams } from "react-router-dom";
interface IProps { interface IProps {
show: boolean; show: boolean;
@ -15,29 +24,56 @@ interface IProps {
handleClose(): void; handleClose(): void;
} }
const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: {
width: "100%",
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
})
);
export const UsersModal: FC<IProps> = ({ export const UsersModal: FC<IProps> = ({
show, show,
handleClose, handleClose,
users, users,
allUsers, allUsers,
}) => { }) => {
const [filterText, setFilterText] = useState<string>("");
const [members, setMembers] = useState<User[]>(users);
const { id } = useParams(); const { id } = useParams();
const [filterText, setFilterText] = useState<string>("");
const handleChange = (e: ChangeEvent<HTMLInputElement>): void => { const handleChange = (e: ChangeEvent<HTMLInputElement>): void => {
setFilterText(e.target.value); setFilterText(e.target.value);
}; };
const memberIDs = users.map((u) => u.id);
const [members, setMembers] = useState<string[]>(memberIDs);
const handleToggle = (value: string) => () => {
const currentIndex = members.indexOf(value);
const newChecked = [...members];
if (currentIndex === -1) {
newChecked.push(value);
} else {
newChecked.splice(currentIndex, 1);
}
setMembers(newChecked);
};
const handleSubmit = async (e: FormEvent) => { const handleSubmit = async (e: FormEvent) => {
e.preventDefault(); e.preventDefault();
await patch<User[]>( await patch<User[]>(
`${Constants.projectsURI}/${id}/members`, `${Constants.projectsURI}/${id}/members`,
members.map((m) => m.id) members //.map((m) => m.id)
); );
handleClose(); handleClose();
}; };
const classes = useStyles();
return ( return (
<Modal <Modal
name="Manage Users" name="Manage Users"
@ -46,48 +82,33 @@ export const UsersModal: FC<IProps> = ({
action="Submit" action="Submit"
handleAction={handleSubmit} handleAction={handleSubmit}
> >
<div className="row valign-wrapper indigo"> <Grid container justify="center">
<div className="col s10">
<h4 className="white-text">Manage users</h4>
</div>
<div className="col s2">
<i
className="right material-icons indigo lighten-3 circle"
onClick={handleClose}
>
close
</i>
</div>
</div>
<div className="center">
<AvatarList users={users} /> <AvatarList users={users} />
<FilterBar <FilterBar
filterText={filterText} filterText={filterText}
clearFilterText={() => setFilterText("")} clearFilterText={() => setFilterText("")}
handleChange={handleChange} handleChange={handleChange}
/> />
</div> </Grid>
<form onSubmit={handleSubmit}> <List dense className={classes.root}>
<ul> {allUsers.map((u: User) => (
{allUsers.map((u: User) => ( <ListItem key={u.id}>
<li key={u.id}> <ListItemAvatar>
<UsersModalEntry <Avatar alt={u.fullName} src={u.picture} />
user={u} </ListItemAvatar>
members={members} <ListItemText id={u.id} primary={u.fullName} />
setMembers={setMembers} <ListItemSecondaryAction>
<Checkbox
edge="end"
onChange={handleToggle(u.id)}
checked={members.indexOf(u.id) !== -1}
inputProps={{ "aria-labelledby": `checkbox-${u.id}` }}
/> />
</li> </ListItemSecondaryAction>
))} </ListItem>
</ul> ))}
<div className="modal-footer grey lighten-3"> </List>
<input
type="submit"
className="modal-close waves-effect waves-green btn indigo"
value="Done"
/>
</div>
</form>
</Modal> </Modal>
); );
}; };