@@ -89,6 +89,24 @@ export default function App() {
8989
9090 // Global variables state
9191 const [ globalVariables , setGlobalVariables ] = useState ( [ ] ) ;
92+ const [ defaultValues , setDefaultValues ] = useState ( { } ) ;
93+
94+ // Function to fetch default values for a node type
95+ const fetchDefaultValues = async ( nodeType ) => {
96+ try {
97+ const response = await fetch ( `http://localhost:8000/default-values/${ nodeType } ` ) ;
98+ if ( response . ok ) {
99+ const defaults = await response . json ( ) ;
100+ return defaults ;
101+ } else {
102+ console . error ( 'Failed to fetch default values' ) ;
103+ return { } ;
104+ }
105+ } catch ( error ) {
106+ console . error ( 'Error fetching default values:' , error ) ;
107+ return { } ;
108+ }
109+ } ;
92110
93111 // Function to save a graph to computer with "Save As" dialog
94112 const saveGraph = async ( ) => {
@@ -527,7 +545,7 @@ export default function App() {
527545 ) ;
528546 } ;
529547 // Function to add a new node to the graph
530- const addNode = ( ) => {
548+ const addNode = async ( ) => {
531549 // Get available node types from nodeTypes object
532550 const availableTypes = Object . keys ( nodeTypes ) ;
533551
@@ -555,73 +573,22 @@ export default function App() {
555573 const selectedType = availableTypes [ choiceIndex ] ;
556574 const newNodeId = nodeCounter . toString ( ) ;
557575
558- // Create appropriate data based on node type
576+ // Fetch default values for this node type
577+ const defaults = await fetchDefaultValues ( selectedType ) ;
578+
579+ // Store default values for this node type
580+ setDefaultValues ( prev => ( {
581+ ...prev ,
582+ [ selectedType ] : defaults
583+ } ) ) ;
584+
585+ // Create node data with label and initialize all expected fields as empty strings
559586 let nodeData = { label : `${ selectedType } ${ newNodeId } ` } ;
560587
561- // Add type-specific default parameters
562- switch ( selectedType ) {
563- case 'process' :
564- nodeData = { ...nodeData , residence_time : '' , source_term : '' , initial_value : '' } ;
565- break ;
566- case 'process_horizontal' :
567- nodeData = { ...nodeData , residence_time : '' , source_term : '' , initial_value : '' } ;
568- break ;
569- case 'constant' :
570- nodeData = { ...nodeData , value : '' } ;
571- break ;
572- case 'stepsource' :
573- nodeData = { ...nodeData , amplitude : '1' , delay : '1' } ;
574- break ;
575- case 'pulsesource' :
576- nodeData = { ...nodeData , amplitude : '1' , T : '1' , t_rise : '0.0' , t_fall : '0.0' , tau : '0.0' , duty : '0.5' } ;
577- break ;
578- case 'amplifier' :
579- nodeData = { ...nodeData , gain : '' } ;
580- break ;
581- case 'amplifier_reverse' :
582- nodeData = { ...nodeData , gain : '' } ;
583- break ;
584- case 'multiplier' :
585- break ;
586- case 'integrator' :
587- nodeData = { ...nodeData , initial_value : '' , reset_times : '' } ;
588- break ;
589- case 'adder' :
590- break ;
591- case 'scope' :
592- nodeData = { ...nodeData } ;
593- break ;
594- case 'function' :
595- nodeData = { ...nodeData , expression : '' } ;
596- break ;
597- case 'delay' :
598- nodeData = { ...nodeData , tau : '' } ;
599- break ;
600- case 'rng' :
601- nodeData = { ...nodeData , sampling_rate : '' } ;
602- break ;
603- case 'pid' :
604- nodeData = { ...nodeData , Kp : '' , Ki : '' , Kd : '' , f_max : '' } ;
605- break ;
606- case 'splitter2' :
607- nodeData = { ...nodeData , f1 : '0.5' , f2 : '0.5' } ;
608- break ;
609- case 'splitter3' :
610- nodeData = { ...nodeData , f1 : '1/3' , f2 : '1/3' , f3 : '1/3' } ;
611- break ;
612- case 'bubbler' :
613- nodeData = { ...nodeData , conversion_efficiency : '0.95' , vial_efficiency : '0.9' , replacement_times : '' } ;
614- break ;
615- case 'white_noise' :
616- nodeData = { ...nodeData , spectral_density : '1' , sampling_rate : '' } ;
617- break ;
618- case 'pink_noise' :
619- nodeData = { ...nodeData , spectral_density : '1' , num_octaves : '16' , sampling_rate : '' } ;
620- break ;
621- default :
622- // For any other types, just use basic data
623- break ;
624- }
588+ // Initialize all expected parameters as empty strings
589+ Object . keys ( defaults ) . forEach ( key => {
590+ nodeData [ key ] = '' ;
591+ } ) ;
625592
626593 const newNode = {
627594 id : newNodeId ,
@@ -1069,37 +1036,78 @@ export default function App() {
10691036 } }
10701037 >
10711038 < h3 > { selectedNode . data . label } </ h3 >
1072- { Object . entries ( selectedNode . data )
1073- . map ( ( [ key , value ] ) => (
1074- < div key = { key } style = { { marginBottom : '10px' } } >
1075- < label > { key } :</ label >
1076- < input
1077- type = "text"
1078- value = { value }
1079- onChange = { ( e ) => {
1080- const newValue = e . target . value ;
1081- const updatedNode = {
1082- ...selectedNode ,
1083- data : { ...selectedNode . data , [ key ] : newValue } ,
1084- } ;
1085-
1086- setNodes ( ( nds ) =>
1087- nds . map ( ( node ) =>
1088- node . id === selectedNode . id ? updatedNode : node
1089- )
1090- ) ;
1091- setSelectedNode ( updatedNode ) ;
1092-
1093- } }
1039+ { ( ( ) => {
1040+ // Get default values for this node type
1041+ const nodeDefaults = defaultValues [ selectedNode . type ] || { } ;
1042+
1043+ // Create a list of all possible parameters (both current data and defaults)
1044+ const allParams = new Set ( [
1045+ ...Object . keys ( selectedNode . data ) ,
1046+ ...Object . keys ( nodeDefaults )
1047+ ] ) ;
1048+
1049+ return Array . from ( allParams )
1050+ . map ( key => {
1051+ const currentValue = selectedNode . data [ key ] || '' ;
1052+ const defaultValue = nodeDefaults [ key ] ;
1053+ const placeholder = defaultValue !== undefined && defaultValue !== null ?
1054+ String ( defaultValue ) : '' ;
1055+
1056+ return (
1057+ < div key = { key } style = { { marginBottom : '10px' } } >
1058+ < label style = { {
1059+ color : '#ffffff' ,
1060+ display : 'block' ,
1061+ marginBottom : '4px' ,
1062+ fontSize : '14px'
1063+ } } >
1064+ { key } :
1065+ </ label >
1066+ < input
1067+ type = "text"
1068+ value = { currentValue }
1069+ placeholder = { placeholder }
1070+ onChange = { ( e ) => {
1071+ const newValue = e . target . value ;
1072+ const updatedNode = {
1073+ ...selectedNode ,
1074+ data : { ...selectedNode . data , [ key ] : newValue } ,
1075+ } ;
10941076
1095- style = { { width : '100%' , marginTop : 4 } }
1096- />
1097- </ div >
1098- ) ) }
1077+ setNodes ( ( nds ) =>
1078+ nds . map ( ( node ) =>
1079+ node . id === selectedNode . id ? updatedNode : node
1080+ )
1081+ ) ;
1082+ setSelectedNode ( updatedNode ) ;
1083+ } }
1084+ style = { {
1085+ width : '100%' ,
1086+ marginTop : 4 ,
1087+ padding : '8px' ,
1088+ borderRadius : '4px' ,
1089+ border : '1px solid #555' ,
1090+ backgroundColor : '#2a2a3e' ,
1091+ color : '#ffffff' ,
1092+ fontSize : '14px'
1093+ } }
1094+ />
1095+ </ div >
1096+ ) ;
1097+ } ) ;
1098+ } ) ( ) }
10991099
11001100 < br />
11011101 < button
1102- style = { { marginTop : 10 } }
1102+ style = { {
1103+ marginTop : 10 ,
1104+ padding : '8px 16px' ,
1105+ backgroundColor : '#666' ,
1106+ color : 'white' ,
1107+ border : 'none' ,
1108+ borderRadius : '4px' ,
1109+ cursor : 'pointer'
1110+ } }
11031111 onClick = { ( ) => setSelectedNode ( null ) }
11041112 >
11051113 Close
0 commit comments