aaredb/frontend/src/components/SampleSpreadsheetGrid.tsx
GotthardG 6d67d02259 Expand sample data handling and grid display.
Integrated additional sample parameters into backend and frontend for enhanced data collection. Updated pyproject version to reflect these changes. This improves user interface flexibility and enriches displayed sample metadata.
2025-01-08 09:52:15 +01:00

126 lines
6.1 KiB
TypeScript

import React, { useEffect, useState } from "react";
import { DataGrid, GridColDef, GridCellEditStopParams } from "@mui/x-data-grid";
import { DewarsService } from "../../openapi";
interface SampleSpreadsheetProps {
dewarId: number; // Selected Dewar's ID
}
const SampleSpreadsheet: React.FC<SampleSpreadsheetProps> = ({ dewarId }) => {
const [rows, setRows] = useState<any[]>([]); // Rows for the grid
const [columns, setColumns] = useState<GridColDef[]>([]); // Columns for the grid
// Fetch rows and columns related to the given Dewar ID
useEffect(() => {
if (!dewarId) {
console.error("Invalid or missing Dewar ID");
return;
}
const fetchSamples = async () => {
try {
const response = await DewarsService.getDewarSamplesDewarsDewarsDewarIdSamplesGet(dewarId);
const dewarData = response; // Assume response is already in correct structure
// Transform pucks and samples into rows for the grid
const allRows = [];
dewarData.pucks.forEach((puck: any) => {
puck.samples.forEach((sample: any) => {
allRows.push({
id: sample.id,
puckId: puck.id,
puckName: puck.name,
puckType: puck.type,
dewarName: dewarData.dewar.dewar_name,
position: sample.position,
crystalName: sample.sample_name,
proteinName: sample.proteinname,
priority: sample.priority,
comments: sample.comments,
directory: sample.directory,
oscillation: sample.oscillation,
aperture: sample.aperture,
exposure: sample.exposure,
totalRange: sample.totalrange,
transmission: sample.transmission,
dose: sample.dose,
targetResolution: sample.targetresolution,
datacollectiontype: sample.datacollectiontype,
processingpipeline: sample.processingpipeline,
spacegroupnumber: sample.spacegroupnumber,
cellparameters: sample.cellparameters,
rescutkey: sample.rescutkey,
//rescutvalues: sample.rescutvalues,
pdbid: sample.pdbid,
autoprocfull: sample.autoprocfull,
procfull: sample.procfull,
adpenabled: sample.adpenabled,
noano: sample.noano,
ffcscampaign: sample.ffcscampaign,
});
});
});
setRows(allRows);
setColumns([
{ field: "dewarName", headerName: "Dewar Name", width: 150, editable: false },
{ field: "puckName", headerName: "Puck Name", width: 150 },
{ field: "puckType", headerName: "Puck Type", width: 150 },
{ field: "crystalName", headerName: "Crystal Name", width: 200, editable: true },
{ field: "proteinName", headerName: "Protein Name", width: 200, editable: true },
{ field: "position", headerName: "Position", width: 100, editable: true, type: "number" },
{ field: "priority", headerName: "Priority", width: 100, editable: true, type: "number" },
{ field: "comments", headerName: "Comments", width: 300, editable: true },
{ field: "directory", headerName: "Directory", width: 200 },
{ field: "oscillation", headerName: "Oscillation", width: 150, editable: true, type: "number" },
{ field: "aperture", headerName: "Aperture", width: 150, editable: true, type: "number" },
{ field: "exposure", headerName: "Exposure", width: 150, editable: true, type: "number" },
{ field: "totalRange", headerName: "Total Range", width: 150, editable: true, type: "number" },
{ field: "transmission", headerName: "Transmission", width: 150, editable: true, type: "number" },
{ field: "dose", headerName: "Dose", width: 150, editable: true, type: "number" },
{ field: "targetResolution", headerName: "Target Resolution", width: 200, editable: true, type: "number" },
{ field: "datacollectiontype", headerName: "Data Collection Type", width: 200 },
{ field: "processingpipeline", headerName: "Processing Pipeline", width: 200 },
{ field: "spacegroupnumber", headerName: "Space Group Number", width: 150, type: "number" },
{ field: "cellparameters", headerName: "Cell Parameters", width: 200 },
{ field: "rescutkey", headerName: "Rescut Key", width: 150 },
{ field: "pdbid", headerName: "PDB ID", width: 150 },
{ field: "autoprocfull", headerName: "Auto Proc Full", width: 150 },
{ field: "procfull", headerName: "Proc Full", width: 150 },
{ field: "adpenabled", headerName: "ADP Enabled", width: 150, editable: true, type: "boolean" },
{ field: "noano", headerName: "No Ano", width: 150, editable: true, type: "boolean" },
{ field: "ffcscampaign", headerName: "FFCS Campaign", width: 200 },
]);
} catch (error) {
console.error("Error fetching dewar samples:", error);
}
};
fetchSamples();
}, [dewarId]);
// Handle cell editing to persist changes to the backend
const handleCellEditStop = async (params: GridCellEditStopParams) => {
const { id, field, value } = params;
try {
// Example: Replace with a proper OpenAPI call if available
await DewarsService.updateSampleData(id as number, { [field]: value }); // Assuming this exists
console.log("Updated successfully");
} catch (error) {
console.error("Error saving data:", error);
}
};
return (
<div style={{ height: 500, width: "100%" }}>
<DataGrid
rows={rows}
columns={columns}
pageSize={10}
onCellEditStop={handleCellEditStop}
/>
</div>
);
};
export default SampleSpreadsheet;