Skip to content

Commit 4be4b8c

Browse files
committed
Add generic table and populate with reactionsteps from tocomo
1 parent 96699ba commit 4be4b8c

5 files changed

Lines changed: 68 additions & 25 deletions

File tree

backend/src/acidwatch_api/models/datamodel.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,13 @@ class TextResult(BaseModel):
4444
data: str
4545

4646

47-
AnyPanel: TypeAlias = JsonResult | TextResult | ReactionPathsResult
47+
class TableResult(BaseModel):
48+
type: Literal["table"] = "table"
49+
label: str | None = None
50+
data: Any
51+
52+
53+
AnyPanel: TypeAlias = JsonResult | TextResult | ReactionPathsResult | TableResult
4854

4955

5056
class ModelInfo(BaseModel):
@@ -63,16 +69,6 @@ class ModelInfo(BaseModel):
6369
parameters: dict[str, Any]
6470

6571

66-
class InitFinalDiff(BaseModel):
67-
initial: Dict[str, float]
68-
final: Dict[str, float]
69-
change: Dict[str, float]
70-
71-
72-
class Results(BaseModel):
73-
initfinaldiff: InitFinalDiff
74-
75-
7672
class CommonPaths(BaseModel):
7773
paths: Optional[Dict[str, Optional[str]]] = Field(default_factory=dict)
7874
k: Optional[Dict[str, Optional[str]]] = Field(default_factory=dict)
@@ -97,13 +93,6 @@ class ChartData(BaseModel):
9793
variance_minus: Dict[str, float]
9894

9995

100-
class SimulationResults(BaseModel):
101-
results: Results
102-
analysis: Optional[Analysis] = None
103-
chart_data: ChartData
104-
table_data: Optional[Any] = None
105-
106-
10796
class SimulationRequest(BaseModel):
10897
model_config = ConfigDict(
10998
alias_generator=to_camel,

backend/src/acidwatch_api/models/tocomo.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from __future__ import annotations
2-
32
from acidwatch_api.models.base import BaseAdapter, RunResult
4-
from acidwatch_api.models.datamodel import InitFinalDiff
3+
from acidwatch_api.models.datamodel import TableResult
54
from fastapi import APIRouter
6-
75
from acidwatch_api.configuration import SETTINGS
86

97
router = APIRouter()
@@ -52,7 +50,9 @@ async def run(self) -> RunResult:
5250
timeout=60.0,
5351
)
5452
res.raise_for_status()
53+
result = res.json()
5554

56-
data = InitFinalDiff.model_validate(res.json())
57-
58-
return {name.upper(): value for name, value in data.final.items()}
55+
return (
56+
{key.upper(): value for key, value in result["final"].items()},
57+
TableResult(data=result["steps"], label="Reaction Steps"),
58+
)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import React from "react";
2+
import { Table } from "@equinor/eds-core-react";
3+
4+
interface GenericTableProps {
5+
data: Record<string, any>[];
6+
}
7+
8+
const GenericTable: React.FC<GenericTableProps> = ({ data }) => {
9+
if (!data || data.length === 0) return <div>No data</div>;
10+
11+
const columns = Object.keys(data[0]);
12+
13+
return (
14+
<Table>
15+
<Table.Head>
16+
<Table.Row>
17+
{columns.map((col) => (
18+
<Table.Cell key={col}>{col}</Table.Cell>
19+
))}
20+
</Table.Row>
21+
</Table.Head>
22+
<Table.Body>
23+
{data.map((row, idx) => (
24+
<Table.Row key={idx}>
25+
{columns.map((col) => (
26+
<Table.Cell key={col}>
27+
{typeof row[col] === "number"
28+
? Math.abs(row[col]) < 0.001
29+
? "-"
30+
: row[col].toFixed(2)
31+
: (row[col] ?? "-")}
32+
</Table.Cell>
33+
))}
34+
</Table.Row>
35+
))}
36+
</Table.Body>
37+
</Table>
38+
);
39+
};
40+
41+
export default GenericTable;

frontend/src/dto/SimulationResults.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ interface ReactionPathsPanel {
1919
stats: any;
2020
}
2121

22-
export type Panel = TextPanel | JsonPanel | ReactionPathsPanel;
22+
interface TablePanel {
23+
type: "table";
24+
label?: string;
25+
data: Record<string, any>[];
26+
}
27+
28+
export type Panel = TextPanel | JsonPanel | ReactionPathsPanel | TablePanel;
2329
export interface SimulationResults {
2430
modelInput: ModelInput;
2531
finalConcentrations: { [key: string]: number };

frontend/src/pages/Results.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { getSimulationResults } from "../api/api";
1010
import { MassBalanceError } from "../components/MassBalanceError";
1111
import { extractPlotData } from "../functions/Formatting";
1212
import BarChart from "../components/BarChart";
13+
import GenericTable from "../components/GenericTable";
1314

1415
interface ResultsProps {
1516
simulationResults?: SimulationResults;
@@ -28,6 +29,9 @@ function getPanelName(panel: Panel): string {
2829
case "reaction_paths":
2930
return "Reactions";
3031

32+
case "table":
33+
return panel.label ?? "Table data";
34+
3135
default:
3236
return "(Unknown panel)";
3337
}
@@ -44,6 +48,9 @@ function getPanelContent(panel: Panel): React.ReactElement {
4448
case "reaction_paths":
4549
return <Reactions commonPaths={panel.common_paths} reactions={panel.stats} />;
4650

51+
case "table":
52+
return <GenericTable data={panel.data} />;
53+
4754
default:
4855
return <Typography color="red">Unknown panel type</Typography>;
4956
}

0 commit comments

Comments
 (0)