import { Meteor } from 'meteor/meteor'; import React, { useState } from 'react'; import { useTracker } from 'meteor/react-meteor-data'; import _ from 'lodash'; import Button from '@mui/material/Button'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import Paper from '@mui/material/Paper'; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import classNames from 'classnames'; Meteor.subscribe('allUsers'); Meteor.subscribe('allRoleAssignments'); let UsersTable = ({rows}) => { const [selected, setSelected] = useState(undefined); let selectRow = (e, row) => { setSelected(row); } const [edited, setEdited] = useState(undefined); const [permissions, setPermissions] = useState(undefined); let editRow = (e, row) => { if(row) { setPermissions({ isAdmin: Roles.userIsInRole(row, "admin", {anyScope: true}), laptopManagement: Roles.userIsInRole(row, "laptop-management", {anyScope: true}), }) } else setPermissions(undefined) setEdited(row); } let togglePermission = (permission) => { permissions[permission] = !permissions[permission] setPermissions({...permissions}) } let applyChanges = (e) => { let roles = []; if(permissions.isAdmin) { roles.push('admin'); } else { if(permissions.laptopManagement) { roles.push('laptop-management'); } } Meteor.call("users.setUserRoles", edited._id, roles); setEdited(undefined); } let rejectChanges = (e) => { setEdited(undefined) } return ( Name Email Roles {rows.map((row)=>( {editRow(e, row)}} onClick={(e) => selectRow(e, row)}> {edited && edited._id === row._id ?
togglePermission('isAdmin')}/>} label="Administrator"/>
togglePermission('laptopManagement')}/>} label="Laptop Management"/>
: <> {row.profile.name} {row.services && row.services.google ? row.services.google.email : ""} {row.roles} }
))}
) } /* * Separate the Meteor calls as much as possible to avoid them being run repeatedly unnecessarily (were being run on every selection in the table). */ export default () => { const {rows} = useTracker(() => { const rows = Meteor.users.find({}).fetch(); for(let row of rows) { row.roles = Roles.getRolesForUser(row, {anyScope: true}) } return { rows } }); return }