import { Meteor } from 'meteor/meteor'; import React, { useState, useEffect } from 'react'; import { useTracker } from 'meteor/react-meteor-data'; import { useTheme } from '@mui/material/styles'; import _ from 'lodash'; import TextField from "@mui/material/TextField"; import Button from "@mui/material/Button"; import MenuItem from '@mui/material/MenuItem'; import {InputLabel, List, ListItem, ListItemButton, ListItemText} from "@mui/material"; import Box from "@mui/material/Box"; import ToggleButton from '@mui/material/ToggleButton'; import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; 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 {Assets, conditions} from "/imports/api/assets"; import {AssetTypes} from "/imports/api/asset-types"; import {Students} from "/imports/api/students"; import {Staff} from "/imports/api/staff"; import {Link} from "react-router-dom"; const cssTwoColumnContainer = { display: 'grid', gridTemplateColumns: "1fr 1fr", columnGap: '1rem', rowGap: '0.4rem', } const cssEditorField = { minWidth: '10rem' } const AssignmentsByPerson = () => { const theme = useTheme(); const [searchType, setSearchType] = useState("Email") const [search, setSearch] = useState("") const [selectedPerson, setSelectedPerson] = useState("") const [assetId, setAssetId] = useState("") const [openAssignDialog, setOpenAssignDialog] = useState(false) const [assignCondition, setAssignCondition] = useState(conditions[2]) const [assignConditionDetails, setAssignConditionDetails] = useState("") //Dialog stuff. const [openUnassignDialog, setOpenUnassignDialog] = useState(false) const [unassignCondition, setUnassignCondition] = useState(conditions[2]) const [unassignComment, setUnassignComment] = useState("") const [unassignConditionDetails, setUnassignConditionDetails] = useState("") const [unassignAsset, setUnassignAsset] = useState(undefined) const [assetIdInput, setAssetIdInput] = useState(undefined) const {people} = useTracker(() => { let people = []; if(search && search.length > 1) { let query; if(searchType === "Email") { query = {email: {$regex: search, $options: 'i'}}; } else if(searchType === 'First Name') { query = {firstName: {$regex: search, $options: 'i'}} } else { query = {lastName: {$regex: search, $options: 'i'}} } const students = Students.find(query).fetch(); const staff = Staff.find(query).fetch(); for(let next of students) next.type = "Student" for(let next of staff) next.type = "Staff" people = [...staff, ...students] } return {people} }); const {assets} = useTracker(() => { let assets = []; if(selectedPerson) { assets = Assets.find({assigneeId: selectedPerson._id}).fetch(); for(let next of assets) { next.assetType = AssetTypes.findOne({_id: next.assetTypeId}) } } return {assets} }); const {foundAsset} = useTracker(() => { let foundAsset = null; if(assetId) { foundAsset = Assets.findOne({assetId: assetId}); if(foundAsset) { foundAsset.assetType = AssetTypes.findOne({_id: foundAsset.assetTypeId}) if(foundAsset.assigneeId) foundAsset.assignee = foundAsset.assigneeType === "Student" ? Students.findOne({_id: foundAsset.assigneeId}) : Staff.findOne({_id: foundAsset.assigneeId}) } } return {foundAsset} }); const getListItemStyle = (item) => { return { backgroundColor: selectedPerson === item ? '#EECFA6' : 'white' } } const assign = () => { if(foundAsset) { //Open the dialog to get condition. setAssignCondition(foundAsset.condition ? foundAsset.condition : conditions[2]) setAssignConditionDetails(foundAsset.conditionDetails || "") setOpenAssignDialog(true) } } const assignDialogClosed = (assign) => { setOpenAssignDialog(false) if(assign === true) { // Call assets.assign Meteor.call('assets.assign', foundAsset.assetId, selectedPerson.type, selectedPerson._id, assignCondition, assignConditionDetails, (err, result) => { if(err) console.error(err) else { // Clear the asset id field and set focus to it. setAssetId("") if(assetIdInput) assetIdInput.focus() } }) //document.getElementById('assetIdInput').focus() } } //This works too well. The field always gets focus anytime anything is typed anywhere. // useEffect(() => { // if(assetIdInput) assetIdInput.focus() // }) const unassign = (asset) => { // Open the dialog to get condition and comment. setUnassignAsset(asset); setUnassignComment("") setUnassignCondition(asset.condition ? asset.condition : conditions[2]) setUnassignConditionDetails(asset.conditionDetails || "") setOpenUnassignDialog(true); } const unassignDialogClosed = (unassign) => { setOpenUnassignDialog(false) if(unassign === true) { // Call assets.unassign(assetId, comment, condition, conditionDetails, date) Meteor.call('assets.unassign', unassignAsset.assetId, unassignComment, unassignCondition, unassignConditionDetails, (err, result) => { if(err) console.error(err) else if(assetIdInput) assetIdInput.focus() }) } } const getAssetTileStyles = (index) => { return index % 2 ? {backgroundColor: '#FFF'} : {backgroundColor: '#d2d2d2'} } const cssAssetTile = { padding: '.8rem', userSelect: 'none', // '&:nthChild(even)': {backgroundColor: '#935e5e'} } return ( <> Assign Asset
{setAssignCondition(e.target.value)}}> {conditions.map((condition, i) => { return {condition} })}
{setAssignConditionDetails(e.target.value)}}/>
Unassign Asset
{setUnassignCondition(e.target.value)}}> {conditions.map((condition, i) => { return {condition} })}
{setUnassignComment(e.target.value)}}/> {setUnassignConditionDetails(e.target.value)}}/>
setSearchType(type)} aria-label="Search Type"> Email First Name Last Name {setSearch(e.target.value)}}/>
{people.map((next, i) => { return ( {setSelectedPerson(next)}}> ) })}
{selectedPerson && (
setAssetIdInput(input)} style={cssEditorField} variant="standard" label="Asset ID" value={assetId} onChange={(e) => {setAssetId(e.target.value.toUpperCase())}}/>
{foundAsset && foundAsset.assetType.name}
{foundAsset && {foundAsset.assetId}}
{foundAsset && {foundAsset.serial}}
{foundAsset && foundAsset.assignee && (
Assigned To: {foundAsset.assignee.firstName} {foundAsset.assignee.lastName}
)}
)} {assets.map((next, i) => { return (
{next.assetType.name}
{next.assetId}
{next.serial}
) })} {/*
*/} {/* {setAssetId(e.target.value)}}/>*/} {/* {setSerial(e.target.value)}}/>*/} {/*
*/} {/*
*/} {/* {setCondition(e.target.value)}}>*/} {/* {conditions.map((condition, i) => {*/} {/* return {condition}*/} {/* })}*/} {/* */} {/*
*/} {/*
*/} {/* {setConditionDetails(e.target.value)}}/>*/} {/*
*/}
) } export default () => { Meteor.subscribe('students'); Meteor.subscribe('staff'); Meteor.subscribe('assetTypes'); Meteor.subscribe('assets'); return ( ) }