@@ -32,7 +32,7 @@ import {
32
32
TooltipTrigger ,
33
33
} from "components/Tooltip/Tooltip" ;
34
34
import { Info , Settings , TriangleAlert } from "lucide-react" ;
35
- import { type FC , useId } from "react" ;
35
+ import { type FC , useEffect , useId , useState } from "react" ;
36
36
import type { AutofillBuildParameter } from "utils/richParameters" ;
37
37
import * as Yup from "yup" ;
38
38
@@ -164,14 +164,18 @@ const ParameterField: FC<ParameterFieldProps> = ({
164
164
id,
165
165
} ) => {
166
166
const value = validValue ( parameter . value ) ;
167
- const defaultValue = validValue ( parameter . default_value ) ;
167
+ const [ localValue , setLocalValue ] = useState ( value ) ;
168
+
169
+ useEffect ( ( ) => {
170
+ setLocalValue ( value ) ;
171
+ } , [ value ] ) ;
168
172
169
173
switch ( parameter . form_type ) {
170
174
case "dropdown" :
171
175
return (
172
176
< Select
173
177
onValueChange = { onChange }
174
- defaultValue = { defaultValue }
178
+ value = { value }
175
179
disabled = { disabled }
176
180
required = { parameter . required }
177
181
>
@@ -194,31 +198,48 @@ const ParameterField: FC<ParameterFieldProps> = ({
194
198
) ;
195
199
196
200
case "multi-select" : {
201
+ let values : string [ ] = [ ] ;
202
+
203
+ if ( value ) {
204
+ try {
205
+ const parsed = JSON . parse ( value ) ;
206
+ if ( Array . isArray ( parsed ) ) {
207
+ values = parsed ;
208
+ }
209
+ } catch ( e ) {
210
+ console . error (
211
+ "Error parsing parameter value with form_type multi-select" ,
212
+ e ,
213
+ ) ;
214
+ }
215
+ }
216
+
197
217
// Map parameter options to MultiSelectCombobox options format
198
- const comboboxOptions : Option [ ] = parameter . options . map ( ( opt ) => ( {
218
+ const options : Option [ ] = parameter . options . map ( ( opt ) => ( {
199
219
value : opt . value . value ,
200
220
label : opt . name ,
201
221
disable : false ,
202
222
} ) ) ;
203
223
204
- const defaultOptions : Option [ ] = JSON . parse ( defaultValue ) . map (
205
- ( val : string ) => {
206
- const option = parameter . options . find ( ( o ) => o . value . value === val ) ;
207
- return {
208
- value : val ,
209
- label : option ?. name || val ,
210
- disable : false ,
211
- } ;
212
- } ,
224
+ const optionMap = new Map (
225
+ parameter . options . map ( ( opt ) => [ opt . value . value , opt . name ] ) ,
213
226
) ;
214
227
228
+ const selectedOptions : Option [ ] = values . map ( ( val ) => {
229
+ return {
230
+ value : val ,
231
+ label : optionMap . get ( val ) || val ,
232
+ disable : false ,
233
+ } ;
234
+ } ) ;
235
+
215
236
return (
216
237
< MultiSelectCombobox
217
238
inputProps = { {
218
239
id : `${ id } -${ parameter . name } ` ,
219
240
} }
220
- options = { comboboxOptions }
221
- defaultOptions = { defaultOptions }
241
+ options = { options }
242
+ defaultOptions = { selectedOptions }
222
243
onChange = { ( newValues ) => {
223
244
const values = newValues . map ( ( option ) => option . value ) ;
224
245
onChange ( JSON . stringify ( values ) ) ;
@@ -251,11 +272,7 @@ const ParameterField: FC<ParameterFieldProps> = ({
251
272
252
273
case "radio" :
253
274
return (
254
- < RadioGroup
255
- onValueChange = { onChange }
256
- disabled = { disabled }
257
- defaultValue = { defaultValue }
258
- >
275
+ < RadioGroup onValueChange = { onChange } disabled = { disabled } value = { value } >
259
276
{ parameter . options . map ( ( option ) => (
260
277
< div
261
278
key = { option . value . value }
@@ -282,7 +299,6 @@ const ParameterField: FC<ParameterFieldProps> = ({
282
299
< Checkbox
283
300
id = { parameter . name }
284
301
checked = { value === "true" }
285
- defaultChecked = { defaultValue === "true" } // TODO: defaultChecked is always overridden by checked
286
302
onCheckedChange = { ( checked ) => {
287
303
onChange ( checked ? "true" : "false" ) ;
288
304
} }
@@ -299,14 +315,11 @@ const ParameterField: FC<ParameterFieldProps> = ({
299
315
< div className = "flex flex-row items-baseline gap-3" >
300
316
< Slider
301
317
className = "mt-2"
302
- defaultValue = { [
303
- Number (
304
- parameter . default_value . valid
305
- ? parameter . default_value . value
306
- : 0 ,
307
- ) ,
308
- ] }
309
- onValueChange = { ( [ value ] ) => onChange ( value . toString ( ) ) }
318
+ value = { [ Number ( localValue ?? 0 ) ] }
319
+ onValueChange = { ( [ value ] ) => {
320
+ setLocalValue ( value . toString ( ) ) ;
321
+ onChange ( value . toString ( ) ) ;
322
+ } }
310
323
min = { parameter . validations [ 0 ] ?. validation_min ?? 0 }
311
324
max = { parameter . validations [ 0 ] ?. validation_max ?? 100 }
312
325
disabled = { disabled }
@@ -319,8 +332,11 @@ const ParameterField: FC<ParameterFieldProps> = ({
319
332
return (
320
333
< Textarea
321
334
className = "max-w-2xl"
322
- defaultValue = { defaultValue }
323
- onChange = { ( e ) => onChange ( e . target . value ) }
335
+ value = { localValue }
336
+ onChange = { ( e ) => {
337
+ setLocalValue ( e . target . value ) ;
338
+ onChange ( e . target . value ) ;
339
+ } }
324
340
onInput = { ( e ) => {
325
341
const target = e . currentTarget ;
326
342
target . style . maxHeight = "700px" ;
@@ -354,8 +370,11 @@ const ParameterField: FC<ParameterFieldProps> = ({
354
370
return (
355
371
< Input
356
372
type = { inputType }
357
- defaultValue = { defaultValue }
358
- onChange = { ( e ) => onChange ( e . target . value ) }
373
+ value = { localValue }
374
+ onChange = { ( e ) => {
375
+ setLocalValue ( e . target . value ) ;
376
+ onChange ( e . target . value ) ;
377
+ } }
359
378
disabled = { disabled }
360
379
required = { parameter . required }
361
380
placeholder = {
@@ -435,7 +454,7 @@ export const getInitialParameterValues = (
435
454
if ( parameter . ephemeral ) {
436
455
return {
437
456
name : parameter . name ,
438
- value : validValue ( parameter . default_value ) ,
457
+ value : validValue ( parameter . value ) ,
439
458
} ;
440
459
}
441
460
@@ -450,7 +469,7 @@ export const getInitialParameterValues = (
450
469
isValidParameterOption ( parameter , autofillParam ) &&
451
470
autofillParam . value
452
471
? autofillParam . value
453
- : validValue ( parameter . default_value ) ,
472
+ : validValue ( parameter . value ) ,
454
473
} ;
455
474
} ) ;
456
475
} ;
0 commit comments