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 } return <>

{ isNewGroup ? L("account.new_group") : L("account.group") + ": " + group.name }

  1. Home
  2. {L("account.group")}
  3. { isNewGroup ? L("general.new") : groupId }
{L("account.group_name")} setGroup({...group, name: e.target.value})}/> {L("account.color")} setGroup({...group, color: color})} />
{!isNewGroup && api.hasPermission("groups/getMembers") ?
navigate(`/admin/user/${entry.id}`) }, { label: L("general.remove"), element: Delete, disabled: !api.hasPermission("groups/removeMember"), onClick: (entry) => setDialogData({ open: true, title: L("Remove member"), message: sprintf(L("Do you really want to remove user '%s' from this group?"), entry.fullName || entry.name), onOption: (option) => option === 0 && onRemoveMember(entry.id) }) } ]), ]} />
: <> }
setDialogData({open: false})} title={dialogData.title} message={dialogData.message} onOption={dialogData.onOption} inputs={dialogData.inputs} options={[L("general.ok"), L("general.cancel")]} /> }