diff --git a/saved_graphs/baby.json b/saved_graphs/baby.json
index 0991b427..f76ae5c6 100644
--- a/saved_graphs/baby.json
+++ b/saved_graphs/baby.json
@@ -58,7 +58,10 @@
},
{
"data": {
- "label": "Neutron source"
+ "label": "Neutron source",
+ "labels": "",
+ "sampling_rate": "",
+ "t_wait": ""
},
"dragging": false,
"id": "5",
@@ -75,7 +78,10 @@
},
{
"data": {
- "label": "Neutron rate"
+ "label": "Neutron rate",
+ "labels": "",
+ "sampling_rate": "",
+ "t_wait": ""
},
"dragging": false,
"id": "6",
@@ -130,7 +136,10 @@
},
{
"data": {
- "label": "IV vial activity"
+ "label": "IV vial activity",
+ "labels": "",
+ "sampling_rate": "",
+ "t_wait": ""
},
"dragging": false,
"id": "21",
@@ -269,7 +278,10 @@
"y": 1097.1334152526842
},
"data": {
- "label": "OV vial activity"
+ "label": "OV vial activity",
+ "labels": "",
+ "sampling_rate": "",
+ "t_wait": ""
},
"measured": {
"width": 120,
@@ -286,7 +298,10 @@
"y": 786
},
"data": {
- "label": "BABY inventory"
+ "label": "BABY inventory",
+ "labels": "",
+ "sampling_rate": "",
+ "t_wait": ""
},
"measured": {
"width": 120,
diff --git a/src/App.jsx b/src/App.jsx
index 0b05e2a6..0e80367f 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -93,6 +93,24 @@ export default function App() {
// Global variables state
const [globalVariables, setGlobalVariables] = useState([]);
+ const [defaultValues, setDefaultValues] = useState({});
+
+ // Function to fetch default values for a node type
+ const fetchDefaultValues = async (nodeType) => {
+ try {
+ const response = await fetch(`http://localhost:8000/default-values/${nodeType}`);
+ if (response.ok) {
+ const defaults = await response.json();
+ return defaults;
+ } else {
+ console.error('Failed to fetch default values');
+ return {};
+ }
+ } catch (error) {
+ console.error('Error fetching default values:', error);
+ return {};
+ }
+ };
// Function to save a graph to computer with "Save As" dialog
const saveGraph = async () => {
@@ -584,7 +602,7 @@ export default function App() {
);
};
// Function to add a new node to the graph
- const addNode = () => {
+ const addNode = async () => {
// Get available node types from nodeTypes object
const availableTypes = Object.keys(nodeTypes);
@@ -611,78 +629,24 @@ export default function App() {
const selectedType = availableTypes[choiceIndex];
const newNodeId = nodeCounter.toString();
-
- // Create appropriate data based on node type
+
+ // Fetch default values for this node type
+ const defaults = await fetchDefaultValues(selectedType);
+
+ // Store default values for this node type
+ setDefaultValues(prev => ({
+ ...prev,
+ [selectedType]: defaults
+ }));
+
+ // Create node data with label and initialize all expected fields as empty strings
let nodeData = { label: `${selectedType} ${newNodeId}` };
-
- // Add type-specific default parameters
- switch (selectedType) {
- case 'process':
- nodeData = { ...nodeData, residence_time: '', source_term: '', initial_value: '' };
- break;
- case 'process_horizontal':
- nodeData = { ...nodeData, residence_time: '', source_term: '', initial_value: '' };
- break;
- case 'constant':
- nodeData = { ...nodeData, value: '' };
- break;
- case 'stepsource':
- nodeData = { ...nodeData, amplitude: '1', delay: '1' };
- break;
- case 'pulsesource':
- nodeData = { ...nodeData, amplitude: '1', T: '1', t_rise: '0.0', t_fall: '0.0', tau: '0.0', duty: '0.5' };
- break;
- case 'amplifier':
- nodeData = { ...nodeData, gain: '' };
- break;
- case 'amplifier_reverse':
- nodeData = { ...nodeData, gain: '' };
- break;
- case 'multiplier':
- break;
- case 'integrator':
- nodeData = { ...nodeData, initial_value: '', reset_times: '' };
- break;
- case 'adder':
- break;
- case 'scope':
- nodeData = { ...nodeData };
- break;
- case 'function':
- nodeData = { ...nodeData, expression: '' };
- break;
- case 'delay':
- nodeData = { ...nodeData, tau: '' };
- break;
- case 'rng':
- nodeData = { ...nodeData, sampling_rate: '' };
- break;
- case 'pid':
- nodeData = { ...nodeData, Kp: '', Ki: '', Kd: '', f_max: '' };
- break;
- case 'splitter2':
- nodeData = { ...nodeData, f1: '0.5', f2: '0.5' };
- break;
- case 'splitter3':
- nodeData = { ...nodeData, f1: '1/3', f2: '1/3', f3: '1/3' };
- break;
- case 'wall':
- nodeData = { ...nodeData, thickness: '', surface_area: '1', temperature: '', D_0: '1', E_D: '0', n_vertices: '100' };
- break;
- case 'bubbler':
- nodeData = { ...nodeData, conversion_efficiency: '0.95', vial_efficiency: '0.9', replacement_times: '' };
- break;
- case 'white_noise':
- nodeData = { ...nodeData, spectral_density: '1', sampling_rate: '' };
- break;
- case 'pink_noise':
- nodeData = { ...nodeData, spectral_density: '1', num_octaves: '16', sampling_rate: '' };
- break;
- default:
- // For any other types, just use basic data
- break;
- }
-
+
+ // Initialize all expected parameters as empty strings
+ Object.keys(defaults).forEach(key => {
+ nodeData[key] = '';
+ });
+
const newNode = {
id: newNodeId,
type: selectedType,
@@ -1132,37 +1096,78 @@ export default function App() {
}}
>
{selectedNode.data.label}
- {Object.entries(selectedNode.data)
- .map(([key, value]) => (
-
-
- {
- const newValue = e.target.value;
- const updatedNode = {
- ...selectedNode,
- data: { ...selectedNode.data, [key]: newValue },
- };
-
- setNodes((nds) =>
- nds.map((node) =>
- node.id === selectedNode.id ? updatedNode : node
- )
- );
- setSelectedNode(updatedNode);
-
- }}
-
- style={{ width: '100%', marginTop: 4 }}
- />
-
- ))}
+ {(() => {
+ // Get default values for this node type
+ const nodeDefaults = defaultValues[selectedNode.type] || {};
+
+ // Create a list of all possible parameters (both current data and defaults)
+ const allParams = new Set([
+ ...Object.keys(selectedNode.data),
+ ...Object.keys(nodeDefaults)
+ ]);
+
+ return Array.from(allParams)
+ .map(key => {
+ const currentValue = selectedNode.data[key] || '';
+ const defaultValue = nodeDefaults[key];
+ const placeholder = defaultValue !== undefined && defaultValue !== null ?
+ String(defaultValue) : '';
+
+ return (
+
+
+ {
+ const newValue = e.target.value;
+ const updatedNode = {
+ ...selectedNode,
+ data: { ...selectedNode.data, [key]: newValue },
+ };
+
+ setNodes((nds) =>
+ nds.map((node) =>
+ node.id === selectedNode.id ? updatedNode : node
+ )
+ );
+ setSelectedNode(updatedNode);
+ }}
+ style={{
+ width: '100%',
+ marginTop: 4,
+ padding: '8px',
+ borderRadius: '4px',
+ border: '1px solid #555',
+ backgroundColor: '#2a2a3e',
+ color: '#ffffff',
+ fontSize: '14px'
+ }}
+ />
+
+ );
+ });
+ })()}