mirror of
https://github.com/rjNemo/ticket_manager
synced 2026-06-11 11:16:39 +00:00
[UI] Users Modal done
This commit is contained in:
parent
bff1315ca1
commit
d80225786f
2 changed files with 61 additions and 40 deletions
BIN
app.db
BIN
app.db
Binary file not shown.
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue