Files
Tempest/imports/ui/pages/Assets/AddAssets.jsx
2025-09-25 09:31:02 -07:00

136 lines
5.0 KiB
JavaScript

import { Meteor } from 'meteor/meteor';
import React, { useState } from 'react';
import { useTracker } from 'meteor/react-meteor-data';
import { useTheme } from '@mui/material/styles';
import _ from 'lodash';
import SimpleTable from "/imports/ui/util/SimpleTable";
import TextField from "@mui/material/TextField";
import Button from "@mui/material/Button";
import Select from '@mui/material/Select';
import Chip from '@mui/material/Chip';
import MenuItem from '@mui/material/MenuItem';
import {InputLabel, List, ListItem, ListItemButton, ListItemText} from "@mui/material";
import {Assets, conditions} from "/imports/api/assets";
import {AssetTypes} from "/imports/api/asset-types";
import Box from "@mui/material/Box";
import OutlinedInput from '@mui/material/OutlinedInput';
import FormControl from '@mui/material/FormControl';
const cssContainer = {
display: 'flex',
flexDirection: 'row',
marginTop: '2rem',
backgroundColor: '#DDD',
padding: '0.5rem',
border: '1px solid #999',
borderRadius: '0.2rem'
}
const cssComponent = {
width: '100%',
marginTop: '1rem',
}
const cssEditorField = {
margin: '0.6rem 1rem',
minWidth: '10rem'
}
const AddAssets = ({assetTypes}) => {
const theme = useTheme();
const [selectedAssetTypes, setSelectedAssetTypes] = useState([])
const [selectedAssetType, setSelectedAssetType] = useState("")
const [assetId, setAssetId] = useState("")
const [serial, setSerial] = useState("")
const [condition, setCondition] = useState("New")
const [conditionDetails, setConditionDetails] = useState("")
const getSelectItemStyles = (value) => {
return {
fontWeight: selectedAssetTypes.indexOf(value) === -1 ? theme.typography.fontWeightRegular : theme.typography.fontWeightBold
}
}
const getAssetTypeListItemStyle = (assetType) => {
return {
backgroundColor: selectedAssetType === assetType ? '#EECFA6' : 'white'
}
}
const addAsset = async () => {
//TODO: Check the inputs.
await Meteor.callAsync("assets.add", selectedAssetType._id, assetId, serial, condition, conditionDetails);
setAssetId("")
setSerial("")
}
return (
<>
<div>1: Select Asset Types To Add</div>
<Box style={cssContainer}>
<FormControl style={cssComponent}>
<InputLabel id="selectAssetTypesLabel">Available Asset Types</InputLabel>
<Select labelId='selectAssetTypesLabel' multiple variant="standard"
value={selectedAssetTypes} onChange={(e)=>{setSelectedAssetTypes(e.target.value)}}
renderValue={(selected) => (
<Box sx={{display: 'flex', flexWrap: 'wrap', gap: 0.5}}>
{selected.map((value) => (
<Chip key={value.name} label={value.name}/>
))}
</Box>
)}
>
{assetTypes.map((assetType, i) => {
return <MenuItem key={i} value={assetType} style={getSelectItemStyles(assetType)}>{assetType.name}</MenuItem>
})}
</Select>
</FormControl>
</Box>
<div>2: Select Asset Type and Enter Asset Data</div>
<Box style={cssContainer}>
<div style={{maxHeight: '26rem', overflowY:'auto', minWidth: '10rem', minHeight: '10rem'}}>
<List>
{selectedAssetTypes.map((next, i) => {
return (
<ListItemButton key={next._id} style={getAssetTypeListItemStyle(next)} selected={selectedAssetType === next} onClick={(e) => {setSelectedAssetType(next)}}>
<ListItemText primary={next.name} secondary={next.description}/>
</ListItemButton>
)
})}
</List>
</div>
<div style={{marginLeft: '1rem', display: 'flex', flexDirection: 'column'}}>
<div style={{display: 'flex', flexDirection: 'row'}}>
<TextField style={cssEditorField} variant="standard" label="Asset ID" value={assetId} onChange={(e) => {setAssetId(e.target.value.toUpperCase())}}/>
<TextField style={cssEditorField} variant="standard" label="Serial" value={serial} onChange={(e) => {setSerial(e.target.value)}}/>
</div>
<div style={{display: 'flex', flexDirection: 'row'}}>
<TextField style={cssEditorField} select variant="standard" label="Condition" value={condition} onChange={(e)=>{setCondition(e.target.value)}}>
{conditions.map((condition, i) => {
return <MenuItem key={i} value={condition}>{condition}</MenuItem>
})}
</TextField>
</div>
<div style={{display: 'flex', flexDirection: 'row'}}>
<TextField style={{width: '100%', margin: '1rem'}} multiline variant="outlined" rows={4} label="Condition Details" value={conditionDetails} onChange={(e) => {setConditionDetails(e.target.value)}}/>
</div>
</div>
</Box>
<div style={{display: 'flex', flexDirection: 'row-reverse'}}>
<Button variant="contained" className="button" onClick={addAsset}>Add</Button>
</div>
</>
)
}
export default () => {
Meteor.subscribe('assetTypes');
const {assetTypes} = useTracker(async () => {
const assetTypes = await AssetTypes.find({}, {sort: {year: -1}}).fetchAsync();
return {
assetTypes
}
});
return (
<AddAssets assetTypes={assetTypes}/>
)
}