import * as React from 'react'; import Paper from '@material-ui/core/Paper'; import {useMutation, useQuery} from '@apollo/react-hooks'; import * as gqlUser from '../gql/user'; import {CenteredSpinner} from '../common/CenteredSpinner'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; import TableCell from '@material-ui/core/TableCell'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; import DeleteIcon from '@material-ui/icons/Delete'; import EditIcon from '@material-ui/icons/Edit'; import DoneIcon from '@material-ui/icons/Done'; import CloseIcon from '@material-ui/icons/Close'; import IconButton from '@material-ui/core/IconButton'; import {useSnackbar} from 'notistack'; import {TextField} from '@material-ui/core'; import {Users} from '../gql/__generated__/Users'; import {RemoveUser, RemoveUserVariables} from '../gql/__generated__/RemoveUser'; import {UpdateUser, UpdateUserVariables} from '../gql/__generated__/UpdateUser'; import Checkbox from '@material-ui/core/Checkbox'; import Button from '@material-ui/core/Button'; import {AddUserDialog} from './AddUserDialog'; import makeStyles from '@material-ui/core/styles/makeStyles'; import {ConfirmDialog} from '../common/ConfirmDialog'; const useStyles = makeStyles((theme) => ({ root: { ...theme.mixins.gutters(), paddingTop: theme.spacing(3), paddingBottom: theme.spacing(3), textAlign: 'center', maxWidth: 800, margin: '0 auto', }, })); const NoEdit = [-1, '', '', false] as const; export const UsersPage = () => { const classes = useStyles(); const {data, loading} = useQuery(gqlUser.Users); const [addUser, setAddUser] = React.useState(false); const refetch = {refetchQueries: [{query: gqlUser.Users}, {query: gqlUser.CurrentUser}]}; const {enqueueSnackbar} = useSnackbar(); const [removeUserConfirmation, setRemoveUserConfirmation] = React.useState(false); const [removeUser] = useMutation(gqlUser.RemoveUser, refetch); const [[editId, editName, editPass, editAdmin], setEditing] = React.useState>( NoEdit ); const [updateUser] = useMutation(gqlUser.UpdateUser, refetch); if (loading || !data || !data.currentUser || !data.users) { return ; } const onClickDelete = () => { if (removeUserConfirmation) { removeUser({variables: {id: removeUserConfirmation[0]}}).then(() => enqueueSnackbar('user deleted', {variant: 'success'}) ); } }; const users = data.users.map((user) => { const onClickSubmit = () => { setEditing(NoEdit); updateUser({ variables: { id: editId, name: editName, admin: editAdmin, pass: editPass || undefined, }, }).then(() => enqueueSnackbar('user edited', {variant: 'success'})); }; const isCurrent = user.id === data.currentUser!.id; const isEdited = editId === user.id; return ( {user.id} {isEdited ? ( setEditing([editId, e.target.value, '', editAdmin])} onKeyDown={(e) => { if (e.key === 'Enter') { onClickSubmit(); } }} onSubmit={onClickSubmit} /> ) : ( user.name + (isCurrent ? ' (current)' : '') )} {isEdited ? ( setEditing([editId, editName, e.target.value, editAdmin])} /> ) : ( '********' )} {isEdited ? ( setEditing([editId, editName, '', e.target.checked])} /> ) : user.admin ? ( 'Yes' ) : ( 'No' )} {isEdited ? ( <> setEditing(NoEdit)} title="Cancel"> ) : ( <> setEditing([user.id, user.name, '', user.admin])} title="Edit"> setRemoveUserConfirmation([user.id, user.name])} title="Delete"> )} ); }); return ( {addUser && setAddUser(false)} />} ID Name Password Admin {users}
{removeUserConfirmation ? ( setRemoveUserConfirmation(false)} fOnSubmit={onClickDelete}> This operation cannot be undone. Deleting the user includes deleting dashboards, time spans, tags and devices of that user. ) : null}
); };