Newer
Older
import React, { useEffect, useState } from "react";
// @mui/material components
import { makeStyles } from "@mui/styles";
// core components
import GridItem from "components/Grid/GridItem.js";
import GridContainer from "components/Grid/GridContainer.js";
import Button from "components/CustomButtons/Button.js";
import Card from "components/Card/Card.js";
import CardBody from "components/Card/CardBody.js";
import CardFooter from "components/Card/CardFooter.js";
import CustomInput from "components/CustomInput/CustomInput.js";
import IconButton from "@mui/material/IconButton";
import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline";
import Search from "@mui/icons-material/Search";
import MailOutlineIcon from "@mui/icons-material/MailOutline";
import PersonIcon from "@mui/icons-material/Person";
import InfoIcon from "@mui/icons-material/Info";
import axios from "axios";
import configApiCall from "api.js";
import auth from "auth.js";
import {
api_path_get_list_group,
api_path_delete_group,
api_path_get_group_members,
import AddCircleOutlineIcon from "@mui/icons-material/AddCircleOutline";
import Dialog from "@mui/material/Dialog";
import DialogActions from "@mui/material/DialogActions";
import DialogContent from "@mui/material/DialogContent";
import DialogContentText from "@mui/material/DialogContentText";
import DialogTitle from "@mui/material/DialogTitle";
import LinearProgress from "@mui/material/LinearProgress";
import CreateGroupDialog from "./CreateGroupDialog";
cardCategoryWhite: {
color: "rgba(255,255,255,.62)",
margin: "0",
fontSize: "14px",
marginTop: "0",
marginBottom: "0",
},
cardTitleWhite: {
color: "#FFFFFF",
marginTop: "0px",
minHeight: "auto",
fontWeight: "300",
fontFamily: "'Roboto', 'Helvetica', 'Arial', sans-serif",
marginBottom: "3px",
textDecoration: "none",
},
deleteIcon: {
float: "right",
},
search: {
width: "90%",
},
loading: {
width: "100%",
},
groupsNotFound: {
marginLeft: "10px",
display: "flex",
alignItems: "center",
},
marginBottom: "1rem",
},
};
const useStyles = makeStyles(styles);
export default function Groups() {
const classes = useStyles();
const history = useHistory();
const [groups, setGroups] = useState([]);
const [loading, setLoading] = useState(false);
const [zeroGroup, setZeroGroup] = useState(false);
const [progress, setProgress] = useState(0);
const [searchValue, setSearchValue] = useState(null);
const [openCreate, setOpenCreate] = useState(false);
const [removedGroup, setRemovedGroup] = useState({
id: 0,
name: "groupeName",
const [openRemoveDialog, setOpenRemoveDialog] = useState(false);
const handleRemoveGroup = (group) => {
setRemovedGroup(group);
setOpenRemoveDialog(true);
};
const removeGroup = () => {
axios(
configApiCall(
console.log("Successfully deleted " + removedGroup.name);
setOpenRemoveDialog(false);
})
.catch((error) => {
console.log("Could not delete " + removedGroup.name + " " + error);
};
useEffect(() => {
setLoading(true);
const timer = setInterval(() => {
setProgress((oldProgress) => {
if (oldProgress === 100) {
return 0;
}
const diff = Math.random() * 10;
return Math.min(oldProgress + diff, 100);
});
}, 500);
axios(configApiCall(api_path_get_list_group, "GET", null, null))
.then((response) => {
let allGroups = response.data;
allGroups.forEach((group) => {
axios(
configApiCall(
api_path_get_group_members + group.id,
"GET",
null,
null
)
)
.then((response) => {
group["groupMembersLength"] = response.data.length;
})
.catch((error) => {
if (error.response.status === 401) {
auth.authenticated = false;
history.push("/");
}
if (error.response.status === 404) {
group["groupMembersLength"] = 0;
}
});
});
setLoading(false);
})
.catch((error) => {
if (error.response.status === 401) {
auth.authenticated = false;
if (error.response.status === 404) {
});
return () => {
clearInterval(timer);
};
if (!auth.hasAdminScope()) {
return (
<div>
<h4>
{i18next.t(
"you_are_not_allowed_to_access_this_section",
"You are not allowed to access this section. Please contact your administrator to get administrator privileges."
)}
<CreateGroupDialog
openCreate={openCreate}
setOpenCreate={setOpenCreate}
classes={classes}
/>
<Dialog
open={openRemoveDialog}
onClose={() => setOpenRemoveDialog(false)}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">
{i18next.t("remove_group", "Remove group")}
</DialogTitle>
<DialogContent>
<DialogContentText id="alert-dialog-description">
{i18next.t(
"are_you_sure_you_want_to_delete",
"Are you sure you want to delete"
)}{" "}
<strong>{removedGroup.name}</strong> ?
</DialogContentText>
</DialogContent>
<DialogActions>
<Button onClick={() => setOpenRemoveDialog(false)} color="primary">
</Button>
<Button onClick={removeGroup} color="info" autoFocus>
</Button>
</DialogActions>
</Dialog>
<GridContainer>
<GridItem xs={12} sm={12} md={12}>
{
<Button
variant="contained"
color="primary"
href="#contained-buttons"
onClick={() => setOpenCreate(true)}
<AddCircleOutlineIcon />{" "}
{i18next.t("create_group", "Create group")}
</Button>
}
<div className={classes.searchWrapper}>
{!zeroGroup && (
<CustomInput
formControlProps={{
className: classes.margin + " " + classes.search,
}}
inputProps={{
placeholder: i18next.t(
"search_groups_placeholder",
"Search groups…"
),
"aria-label": i18next.t("search_groups", "Search groups"),
},
onKeyUp: (e) => setSearchValue(e.target.value),
}}
)}
{!zeroGroup && <Search />}
<div className={classes.loading}>
{!zeroGroup && loading && (
<LinearProgress variant="determinate" value={progress} />
)}
</div>
</GridItem>
{zeroGroup ? (
<div className={classes.groupsNotFound}>
<InfoIcon />{" "}
<p style={{ marginLeft: "10px" }}>
{i18next.t("no_groups_found", "No groups Found")}
</p>
groups
.filter((data) => {
if (searchValue === null) {
return data;
} else {
return data.name
.toLowerCase()
.includes(searchValue.toLowerCase());
}
})
.map((group) => (
<GridItem xs={12} sm={6} md={3} lg={2} xl={2} key={group.name}>
<CardBody profile>
<h3 className={classes.cardTitle}>{group.name}</h3>
<ul>
<li>
<PersonIcon
fontSize="small"
style={{ marginRight: "10px" }}
/>
<strong style={{ marginRight: "5px" }}>
</li>
<li>
<MailOutlineIcon
fontSize="small"
style={{ marginRight: "10px" }}
/>
<strong style={{ marginRight: "5px" }}>
</strong>
{group.blueprint}
</li>
</ul>
</CardBody>
>
<DeleteOutlineIcon />
</IconButton>
</CardFooter>
</Card>
</GridItem>
))
)}
</GridContainer>
</div>
);
}