William Gunnells
dockerdash-ui
420b22a
import React, { useState } from 'react';
import Box from '@mui/material/Box';
import Modal from '@mui/material/Modal';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
import client from "../client";
import PlusIcon from '../assets/PlusIcon';
const style = {
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
width: 600,
bgcolor: 'background.paper',
border: '5px solid #000',
boxShadow: 24,
p: 4,
};
export default function ModalComponent({button_styling}) {
const [open, setOpen] = React.useState(false);
const handleOpen = () => setOpen(true);
const handleClose = () => setOpen(false);
const [files, setFiles] = useState({
model: null,
x_test: null,
x_train: null,
y_test: null,
y_train: null,
pred: null,
});
const handleFileChange = (e, label) => {
const selectedFile = e.target.files[0];
setFiles((prevFiles) => ({
...prevFiles,
[label]: selectedFile,
}));
};
const uploadFiles = async (model_id, datacatalog_id) => {
try {
const entries = Object.entries(files);
for (const [label, file] of entries) {
if (!file) {
console.log("Not uploading file for label:", label, "because no file was selected");
continue; // Skip if no file is selected for the label
}
const formData = new FormData();
formData.append('file', file);
await new Promise((resolve) => setTimeout(resolve, 100)); // Introduce 100ms delay
await client.post(
`/upload?param_name=${label}&model_id=${model_id}&datacatalog_id=${datacatalog_id}`,
formData,
{headers: {'Content-Type': 'multipart/form-data'}}
);
}
console.log('File uploads successful');
} catch (error) {
console.error('File uploads failed:', error);
}
};
const handleSubmit = (e) => {
e.preventDefault();
const modelName = e.target.elements.modelName.value;
const modelDesc = e.target.elements.modelDesc.value;
client.get("/tenants")
.then(response => { // Get tenant ID
return response.data[0].id
})
.then((response_tenant_id) => { // 1) Create Model
console.log(response_tenant_id)
const createModelReqBody = {
"name": modelName,
"model_type": "MDL.001",
"date_posted": new Date().toISOString(),
"tenant_id": response_tenant_id,
"description": modelDesc
}
return client.post("/model", createModelReqBody).then((response) => [response_tenant_id, response.data.id])
})
.then((id_array) => { // 2) Create Data Catalog
console.log("ID of newly created model used in new datacatalog:", id_array[1])
const dataCatalogReqBody = {
"dataset_type": "training",
"description": "description of the catalog",
"is_generated_data": true,
"tenant_id": id_array[0],
"model_id": id_array[1],
"name": "some catalog model name",
"dataset_url": "https://www.example.com/dataset/data.csv",
"model_type": "Classification",
"name": "catalog model name",
"parameters": {
"additionalProp1": "string",
"additionalProp2": "string",
"model_name": "2/Model Name/MDL.001/training/dt_model-dac001e0-a852-4fa7-8d98-4c7c3e1d2bf1.joblib"
}
}
return client.post("/datacatalog", dataCatalogReqBody).then((response) => [id_array[1], response.data.id])
})
.then((ids) => {return uploadFiles(ids[0], ids[1]);})
.then(() => window.location.reload())
.catch((error) => console.log(error))
console.log('Model Name:', modelName);
console.log('Description:', modelDesc);
};
return (
<div>
<a onClick={handleOpen} className='cursor-pointer'>
<PlusIcon
styling = {`${button_styling} ml-12 mb-4 border-4 w-32 rounded-md inline-flex`}
text="Add Model" />
</a>
<Modal
open={open}
onClose={handleClose}
aria-labelledby="modal-modal-title"
aria-describedby="modal-modal-description"
>
<Box sx={style}>
<div className='flex justify-center mb-4'>
<h2 id="modal-modal-title" className='text-2xl '>Add Model and Serialized Data</h2>
</div>
<form onSubmit={handleSubmit}>
<TextField id="outlined-basic" style={{ width: '12rem', marginRight: '1rem' }} label="Model Name" name="modelName" variant="outlined" />
<TextField id="outlined-basic" style={{ width: '19rem', marginBottom: '1.5rem'}} label="Description" name="modelDesc" variant="outlined" />
{Object.entries(files).map(([label, file]) => (
<div key={label} className='mb-2'>
<input className="" type="file" onChange={(e) => handleFileChange(e, label)} />
<label>{label}</label>
</div>
))}
<div className="flex justify-center">
<Button type="submit" variant="contained" style={{ backgroundColor: '#e9e9ed', color: '#000', marginRight: '2rem'}}>Submit</Button>
<Button onClick={handleClose} variant="contained" style={{ backgroundColor: '#e9e9ed', color: '#000' }}>Cancel</Button>
</div>
</form>
</Box>
</Modal>
</div>
);
}