import {useCallback, useContext, useEffect, useState} from "react";
import {Link, useNavigate, useParams} from "react-router-dom";
import {LocaleContext} from "shared/locale";
import {Button, CircularProgress} from "@material-ui/core";
import * as React from "react";
import ColorPicker from "material-ui-color-picker";
import {ControlsColumn, DataTable, NumericColumn, StringColumn} from "shared/elements/data-table";
import EditIcon from "@mui/icons-material/Edit";
import usePagination from "shared/hooks/pagination";
import {Delete, KeyboardArrowLeft, Save} from "@material-ui/icons";
import Dialog from "shared/elements/dialog";
import {Box, FormControl, FormGroup, FormLabel, styled, TextField} from "@mui/material";
const defaultGroupData = {
name: "",
color: "#ccc",
members: []
};
const ButtonBar = styled(Box)((props) => ({
"& > button": {
marginRight: props.theme.spacing(1)
}
}));
export default function EditGroupView(props) {
const {translate: L, requestModules, currentLocale} = useContext(LocaleContext);
const { groupId } = useParams();
const navigate = useNavigate();
const isNewGroup = groupId === "new";
const pagination = usePagination();
const api = props.api;
// data
const [fetchGroup, setFetchGroup] = useState(!isNewGroup);
const [group, setGroup] = useState(isNewGroup ? defaultGroupData : null);
const [members, setMembers] = useState([]);
// ui
const [dialogData, setDialogData] = useState({open: false});
const [isSaving, setSaving] = useState(false);
useEffect(() => {
requestModules(props.api, ["general", "account"], currentLocale).then(data => {
if (!data.success) {
props.showDialog(data.msg, "Error fetching localization");
}
});
}, [currentLocale]);
const onFetchGroup = useCallback((force = false) => {
if (force || fetchGroup) {
setFetchGroup(false);
api.getGroup(groupId).then(res => {
if (!res.success) {
props.showDialog(res.msg, "Error fetching group");
navigate("/admin/groups");
} else {
setGroup(res.group);
}
});
}
}, [api, fetchGroup]);
const onFetchMembers = useCallback(async (page, count, orderBy, sortOrder) => {
api.fetchGroupMembers(groupId, page, count, orderBy, sortOrder).then((res) => {
if (res.success) {
setMembers(res.users);
pagination.update(res.pagination);
} else {
props.showDialog(res.msg, "Error fetching group members");
return null;
}
});
}, [groupId, api, pagination]);
const onRemoveMember = useCallback(userId => {
api.removeGroupMember(groupId, userId).then(data => {
if (data.success) {
let newMembers = members.filter(u => u.id !== userId);
setMembers(newMembers);
} else {
props.showDialog(data.msg, "Error removing group member");
}
});
}, [api, groupId, members]);
const onSave = useCallback(() => {
setSaving(true);
if (isNewGroup) {
api.createGroup(group.name, group.color).then(data => {
if (!data.success) {
props.showDialog(data.msg, "Error creating group");
setSaving(false);
} else {
navigate(`/admin/groups/${data.id}`)
}
});
} else {
api.updateGroup(groupId, group.name, group.color).then(data => {
setSaving(false);
if (!data.success) {
props.showDialog(data.msg, "Error updating group");
}
});
}
}, [api, groupId, isNewGroup, group]);
useEffect(() => {
onFetchGroup();
}, []);
if (group === null) {
return