@@ -32,23 +32,27 @@ import {
32
32
TooltipProvider ,
33
33
TooltipTrigger ,
34
34
} from "components/Tooltip/Tooltip" ;
35
- import { Info , Settings , TriangleAlert } from "lucide-react" ;
35
+ import { Info , Link , Settings , TriangleAlert } from "lucide-react" ;
36
36
import { type FC , useEffect , useId , useState } from "react" ;
37
37
import type { AutofillBuildParameter } from "utils/richParameters" ;
38
38
import * as Yup from "yup" ;
39
39
40
40
export interface DynamicParameterProps {
41
41
parameter : PreviewParameter ;
42
+ value ?: string ;
42
43
onChange : ( value : string ) => void ;
43
44
disabled ?: boolean ;
44
45
isPreset ?: boolean ;
46
+ autofill ?: AutofillBuildParameter ;
45
47
}
46
48
47
49
export const DynamicParameter : FC < DynamicParameterProps > = ( {
48
50
parameter,
51
+ value,
49
52
onChange,
50
53
disabled,
51
54
isPreset,
55
+ autofill,
52
56
} ) => {
53
57
const id = useId ( ) ;
54
58
@@ -57,13 +61,18 @@ export const DynamicParameter: FC<DynamicParameterProps> = ({
57
61
className = "flex flex-col gap-2"
58
62
data-testid = { `parameter-field-${ parameter . name } ` }
59
63
>
60
- < ParameterLabel parameter = { parameter } isPreset = { isPreset } />
64
+ < ParameterLabel
65
+ parameter = { parameter }
66
+ isPreset = { isPreset }
67
+ autofill = { autofill }
68
+ />
61
69
< div className = "max-w-lg" >
62
70
< ParameterField
71
+ id = { id }
63
72
parameter = { parameter }
73
+ value = { value }
64
74
onChange = { onChange }
65
75
disabled = { disabled }
66
- id = { id }
67
76
/>
68
77
</ div >
69
78
{ parameter . diagnostics . length > 0 && (
@@ -76,9 +85,14 @@ export const DynamicParameter: FC<DynamicParameterProps> = ({
76
85
interface ParameterLabelProps {
77
86
parameter : PreviewParameter ;
78
87
isPreset ?: boolean ;
88
+ autofill ?: AutofillBuildParameter ;
79
89
}
80
90
81
- const ParameterLabel : FC < ParameterLabelProps > = ( { parameter, isPreset } ) => {
91
+ const ParameterLabel : FC < ParameterLabelProps > = ( {
92
+ parameter,
93
+ isPreset,
94
+ autofill,
95
+ } ) => {
82
96
const hasDescription = parameter . description && parameter . description !== "" ;
83
97
const displayName = parameter . display_name
84
98
? parameter . display_name
@@ -137,6 +151,23 @@ const ParameterLabel: FC<ParameterLabelProps> = ({ parameter, isPreset }) => {
137
151
</ Tooltip >
138
152
</ TooltipProvider >
139
153
) }
154
+ { autofill && (
155
+ < TooltipProvider delayDuration = { 100 } >
156
+ < Tooltip >
157
+ < TooltipTrigger asChild >
158
+ < span className = "flex items-center" >
159
+ < Badge size = "sm" >
160
+ < Link />
161
+ URL Autofill
162
+ </ Badge >
163
+ </ span >
164
+ </ TooltipTrigger >
165
+ < TooltipContent className = "max-w-xs" >
166
+ Autofilled from the URL
167
+ </ TooltipContent >
168
+ </ Tooltip >
169
+ </ TooltipProvider >
170
+ ) }
140
171
</ Label >
141
172
142
173
{ hasDescription && (
@@ -153,22 +184,27 @@ const ParameterLabel: FC<ParameterLabelProps> = ({ parameter, isPreset }) => {
153
184
154
185
interface ParameterFieldProps {
155
186
parameter : PreviewParameter ;
187
+ value ?: string ;
156
188
onChange : ( value : string ) => void ;
157
189
disabled ?: boolean ;
158
190
id : string ;
159
191
}
160
192
161
193
const ParameterField : FC < ParameterFieldProps > = ( {
162
194
parameter,
195
+ value,
163
196
onChange,
164
197
disabled,
165
198
id,
166
199
} ) => {
167
- const value = validValue ( parameter . value ) ;
168
- const [ localValue , setLocalValue ] = useState ( value ) ;
200
+ const initialValue =
201
+ value !== undefined ? value : validValue ( parameter . value ) ;
202
+ const [ localValue , setLocalValue ] = useState ( initialValue ) ;
169
203
170
204
useEffect ( ( ) => {
171
- setLocalValue ( value ) ;
205
+ if ( value !== undefined ) {
206
+ setLocalValue ( value ) ;
207
+ }
172
208
} , [ value ] ) ;
173
209
174
210
switch ( parameter . form_type ) {
@@ -469,14 +505,14 @@ export const getInitialParameterValues = (
469
505
( { name } ) => name === parameter . name ,
470
506
) ;
471
507
508
+ const useAutofill =
509
+ autofillParam &&
510
+ isValidParameterOption ( parameter , autofillParam ) &&
511
+ autofillParam . value ;
512
+
472
513
return {
473
514
name : parameter . name ,
474
- value :
475
- autofillParam &&
476
- isValidParameterOption ( parameter , autofillParam ) &&
477
- autofillParam . value
478
- ? autofillParam . value
479
- : validValue ( parameter . value ) ,
515
+ value : useAutofill ? autofillParam . value : validValue ( parameter . value ) ,
480
516
} ;
481
517
} ) ;
482
518
} ;
@@ -489,14 +525,41 @@ const isValidParameterOption = (
489
525
previewParam : PreviewParameter ,
490
526
buildParam : WorkspaceBuildParameter ,
491
527
) => {
528
+ if ( previewParam . form_type === "multi-select" ) {
529
+ console . log ( "buildParam.value" , buildParam . value ) ;
530
+ let values : string [ ] = [ ] ;
531
+ try {
532
+ const parsed = JSON . parse ( buildParam . value ) ;
533
+ if ( Array . isArray ( parsed ) ) {
534
+ values = parsed ;
535
+ }
536
+ } catch ( e ) {
537
+ console . error (
538
+ "Error parsing parameter value with form_type multi-select" ,
539
+ e ,
540
+ ) ;
541
+ return false ;
542
+ }
543
+
544
+ // If options exist, validate each value
545
+ if ( previewParam . options . length > 0 ) {
546
+ const validValues = previewParam . options . map (
547
+ ( option ) => option . value . value ,
548
+ ) ;
549
+ return values . every ( ( value ) => validValues . includes ( value ) ) ;
550
+ }
551
+ return false ;
552
+ }
553
+ // For parameters with options (dropdown, radio, etc.)
492
554
if ( previewParam . options . length > 0 ) {
493
555
const validValues = previewParam . options . map (
494
556
( option ) => option . value . value ,
495
557
) ;
496
558
return validValues . includes ( buildParam . value ) ;
497
559
}
498
560
499
- return false ;
561
+ // For parameters without options (input, textarea, etc.)
562
+ return true ;
500
563
} ;
501
564
502
565
export const useValidationSchemaForDynamicParameters = (
0 commit comments