@@ -35,7 +35,7 @@ function HubServiceConfPopover({ roCrateServiceDef, service, isOpen = false, set
3535 const { systemConfig, authData } = useAuth ( ) ;
3636 const { refreshServices } = useServicesContext ( ) ;
3737 const [ newBucket , setNewBucket ] = useState ( false ) ;
38- const buckets = useGetPrivateBuckets ( ) ;
38+ const buckets = useGetPrivateBuckets ( isOpen ) ;
3939
4040 const oidcGroups = getAllowedVOs ( systemConfig , authData ) ;
4141 const asyncService = roCrateServiceDef . type . some ( t => t . toLowerCase ( ) === "asynchronous" ) ;
@@ -90,6 +90,7 @@ function HubServiceConfPopover({ roCrateServiceDef, service, isOpen = false, set
9090 token : "" ,
9191 enviromentVars : { } as Record < string , string > ,
9292 enviromentSecrets : { } as Record < string , string > ,
93+ nodePort : "" ,
9394 } ) ;
9495 const [ newVolume , setNewVolume ] = useState ( false ) ;
9596 const [ volumes , setVolumes ] = useState < ManagedVolume [ ] > ( [ ] ) ;
@@ -119,6 +120,7 @@ function HubServiceConfPopover({ roCrateServiceDef, service, isOpen = false, set
119120 token : false ,
120121 enviromentVars : { } as Record < string , boolean > ,
121122 enviromentSecrets : { } as Record < string , boolean > ,
123+ nodePort : false ,
122124 } ) ;
123125
124126 useEffect ( ( ) => {
@@ -143,6 +145,7 @@ function HubServiceConfPopover({ roCrateServiceDef, service, isOpen = false, set
143145 token : genRandomString ( 128 ) ,
144146 enviromentVars : service . environment ?. variables || { } ,
145147 enviromentSecrets : service . environment ?. secrets || { } ,
148+ nodePort : service . expose ?. nodePort || "" ,
146149 } ) ) ;
147150 setNewBucket ( false ) ;
148151 setVolumes ( [ ] ) ;
@@ -158,6 +161,7 @@ function HubServiceConfPopover({ roCrateServiceDef, service, isOpen = false, set
158161 token : false ,
159162 enviromentVars : { } as Record < string , boolean > ,
160163 enviromentSecrets : { } as Record < string , boolean > ,
164+ nodePort : false ,
161165 } ) ;
162166
163167 let cancelled = false ;
@@ -219,6 +223,7 @@ function HubServiceConfPopover({ roCrateServiceDef, service, isOpen = false, set
219223 token : ! formData . token ,
220224 enviromentVars : Object . fromEntries ( Object . entries ( formData . enviromentVars ) . map ( ( [ key , value ] ) => [ key , ! value || value . length === 0 ] ) ) ,
221225 enviromentSecrets : Object . fromEntries ( Object . entries ( formData . enviromentSecrets ) . map ( ( [ key , value ] ) => [ key , ! value || value . length === 0 ] ) ) ,
226+ nodePort : ! ! service ?. expose ?. nodePort && ! formData . nodePort ,
222227 } ;
223228
224229 setErrors ( newErrors ) ;
@@ -417,6 +422,22 @@ return (
417422 </ SelectContent >
418423 </ Select >
419424 </ div >
425+ { service ?. expose ?. nodePort && (
426+ < div >
427+ < Label htmlFor = "nodePort" > Node Port</ Label >
428+ < Input
429+ id = "nodePort"
430+ type = "number"
431+ placeholder = "Enter Node Port"
432+ value = { formData . nodePort }
433+ className = { errors . nodePort ? "border-red-500 focus:border-red-500" : "" }
434+ onChange = { ( e ) => {
435+ setFormData ( { ...formData , nodePort : e . target . value } ) ;
436+ if ( errors . nodePort ) setErrors ( { ...errors , nodePort : false } ) ;
437+ } }
438+ />
439+ </ div >
440+ ) }
420441 { ( asyncService || mountBucket ) &&
421442 < div >
422443 < Label > Bucket</ Label >
@@ -584,55 +605,69 @@ return (
584605 </ div >
585606 </ div >
586607 }
587- { formData ?. enviromentVars && Object . entries ( formData . enviromentVars ) . map ( ( [ key , value ] ) => (
588- < div key = { `var-${ key } ` } >
589- < Label > { key } </ Label >
590- < Input
591- disabled = { ifEndpointService ( key , value , formData . name ) !== value }
592- type = "input"
593- value = { ifEndpointService ( key , value , formData . name ) }
594- style = { { width : "100%" ,
595- fontWeight : "normal" ,
596- } }
597- onChange = { ( e ) => {
598- setFormData ( ( prev ) => ( {
599- ...prev ,
600- enviromentVars : {
601- ...prev . enviromentVars ,
602- [ key ] : e . target . value ,
603- } ,
604- } ) ) ;
605- if ( errors . enviromentVars && errors . enviromentVars [ key ] ) setErrors ( { ...errors , enviromentVars : { ...errors . enviromentVars , [ key ] : false } } ) ;
606- } }
607- placeholder = { `Enter ${ key } ` }
608- className = { errors . enviromentVars [ key ] ? "border-red-500 focus:border-red-500" : "" }
609- />
608+ { Object . keys ( formData ?. enviromentVars ?? { } ) . length > 0 && (
609+ < div >
610+ < Label > Environment Variables</ Label >
611+ < hr className = "mb-2" />
612+
613+ { Object . entries ( formData . enviromentVars ) . map ( ( [ key , value ] ) => (
614+ < div key = { `var-${ key } ` } >
615+ < Label > { key } </ Label >
616+ < Input
617+ disabled = { ifEndpointService ( key , value , formData . name ) !== value }
618+ type = "input"
619+ value = { ifEndpointService ( key , value , formData . name ) }
620+ style = { { width : "100%" ,
621+ fontWeight : "normal" ,
622+ } }
623+ onChange = { ( e ) => {
624+ setFormData ( ( prev ) => ( {
625+ ...prev ,
626+ enviromentVars : {
627+ ...prev . enviromentVars ,
628+ [ key ] : e . target . value ,
629+ } ,
630+ } ) ) ;
631+ if ( errors . enviromentVars && errors . enviromentVars [ key ] ) setErrors ( { ...errors , enviromentVars : { ...errors . enviromentVars , [ key ] : false } } ) ;
632+ } }
633+ placeholder = { `Enter ${ key } ` }
634+ className = { errors . enviromentVars [ key ] ? "border-red-500 focus:border-red-500" : "" }
635+ />
636+ </ div >
637+ ) ) }
610638 </ div >
611- ) ) }
612- { formData ?. enviromentSecrets && Object . entries ( formData . enviromentSecrets ) . map ( ( [ key , value ] ) => (
613- < div key = { `secret-${ key } ` } >
614- < Label > { key } </ Label >
615- < Input
616- type = "password"
617- value = { value }
618- style = { { width : "100%" ,
619- fontWeight : "normal" ,
639+ ) }
640+ { Object . keys ( formData ?. enviromentSecrets ?? { } ) . length > 0 && (
641+ < div >
642+ < Label > Environment Secrets</ Label >
643+ < hr className = "mb-2" />
644+
645+ { Object . entries ( formData . enviromentSecrets ) . map ( ( [ key , value ] ) => (
646+ < div key = { `secret-${ key } ` } >
647+ < Label > { key } </ Label >
648+ < Input
649+ type = "password"
650+ value = { value }
651+ style = { { width : "100%" ,
652+ fontWeight : "normal" ,
653+ } }
654+ onChange = { ( e ) => {
655+ setFormData ( ( prev ) => ( {
656+ ...prev ,
657+ enviromentSecrets : {
658+ ...prev . enviromentSecrets ,
659+ [ key ] : e . target . value ,
660+ } ,
661+ } ) ) ;
662+ if ( errors . enviromentSecrets && errors . enviromentSecrets [ key ] ) setErrors ( { ...errors , enviromentSecrets : { ...errors . enviromentSecrets , [ key ] : false } } ) ;
620663 } }
621- onChange = { ( e ) => {
622- setFormData ( ( prev ) => ( {
623- ...prev ,
624- enviromentSecrets : {
625- ...prev . enviromentSecrets ,
626- [ key ] : e . target . value ,
627- } ,
628- } ) ) ;
629- if ( errors . enviromentSecrets && errors . enviromentSecrets [ key ] ) setErrors ( { ...errors , enviromentSecrets : { ...errors . enviromentSecrets , [ key ] : false } } ) ;
630- } }
631- placeholder = { `Enter ${ key } ` }
632- className = { errors . enviromentSecrets [ key ] ? "border-red-500 focus:border-red-500" : "" }
633- />
664+ placeholder = { `Enter ${ key } ` }
665+ className = { errors . enviromentSecrets [ key ] ? "border-red-500 focus:border-red-500" : "" }
666+ />
667+ </ div >
668+ ) ) }
634669 </ div >
635- ) ) }
670+ ) }
636671 </ div >
637672 < DialogFooter >
638673 < RequestButton className = "grid grid-cols-[auto] sm:grid-cols-1 gap-2" variant = { "mainGreen" } request = { handleDeploy } >
0 commit comments