@@ -213,39 +213,80 @@ export const CreateWorkspacePageViewExperimental: FC<
213
213
214
214
setPresetParameterNames ( selectedPreset . Parameters . map ( ( p ) => p . Name ) ) ;
215
215
216
+ const currentValues = form . values . rich_parameter_values ?? [ ] ;
217
+
218
+ const updates : Array < {
219
+ field : string ;
220
+ fieldValue : TypesGen . WorkspaceBuildParameter ;
221
+ parameter : PreviewParameter ;
222
+ presetValue : string ;
223
+ } > = [ ] ;
224
+
216
225
for ( const presetParameter of selectedPreset . Parameters ) {
217
226
const parameterIndex = parameters . findIndex (
218
227
( p ) => p . name === presetParameter . Name ,
219
228
) ;
220
229
if ( parameterIndex === - 1 ) continue ;
221
230
222
231
const parameterField = `rich_parameter_values.${ parameterIndex } ` ;
232
+ const parameter = parameters [ parameterIndex ] ;
233
+ const currentValue = currentValues . find (
234
+ ( p ) => p . name === presetParameter . Name ,
235
+ ) ?. value ;
236
+
237
+ if ( currentValue !== presetParameter . Value ) {
238
+ updates . push ( {
239
+ field : parameterField ,
240
+ fieldValue : {
241
+ name : presetParameter . Name ,
242
+ value : presetParameter . Value ,
243
+ } ,
244
+ parameter,
245
+ presetValue : presetParameter . Value ,
246
+ } ) ;
247
+ }
248
+ }
223
249
224
- form . setFieldValue ( parameterField , {
225
- name : presetParameter . Name ,
226
- value : presetParameter . Value ,
227
- } ) ;
250
+ if ( updates . length > 0 ) {
251
+ for ( const update of updates ) {
252
+ form . setFieldValue ( update . field , update . fieldValue ) ;
253
+ form . setFieldTouched ( update . parameter . name , true ) ;
254
+ }
255
+
256
+ sendDynamicParamsRequest (
257
+ updates . map ( ( update ) => ( {
258
+ parameter : update . parameter ,
259
+ value : update . presetValue ,
260
+ } ) ) ,
261
+ ) ;
228
262
}
229
263
} , [
230
264
presetOptions ,
231
265
selectedPresetIndex ,
232
266
presets ,
233
267
form . setFieldValue ,
268
+ form . setFieldTouched ,
234
269
parameters ,
270
+ form . values . rich_parameter_values ,
235
271
] ) ;
236
272
237
273
// send the last user modified parameter and all touched parameters to the websocket
238
274
const sendDynamicParamsRequest = (
239
- parameter : PreviewParameter ,
240
- value : string ,
275
+ parameters : Array < { parameter : PreviewParameter ; value : string } > ,
241
276
) => {
242
277
const formInputs : Record < string , string > = { } ;
243
- formInputs [ parameter . name ] = value ;
244
- const parameters = form . values . rich_parameter_values ?? [ ] ;
278
+ const formParameters = form . values . rich_parameter_values ?? [ ] ;
279
+
280
+ for ( const { parameter, value } of parameters ) {
281
+ formInputs [ parameter . name ] = value ;
282
+ }
245
283
246
284
for ( const [ fieldName , isTouched ] of Object . entries ( form . touched ) ) {
247
- if ( isTouched && fieldName !== parameter . name ) {
248
- const param = parameters . find ( ( p ) => p . name === fieldName ) ;
285
+ if (
286
+ isTouched &&
287
+ ! parameters . some ( ( p ) => p . parameter . name === fieldName )
288
+ ) {
289
+ const param = formParameters . find ( ( p ) => p . name === fieldName ) ;
249
290
if ( param ?. value ) {
250
291
formInputs [ fieldName ] = param . value ;
251
292
}
@@ -260,12 +301,20 @@ export const CreateWorkspacePageViewExperimental: FC<
260
301
parameterField : string ,
261
302
value : string ,
262
303
) => {
304
+ const currentFormValue = form . values . rich_parameter_values ?. find (
305
+ ( p ) => p . name === parameter . name ,
306
+ ) ?. value ;
307
+
263
308
await form . setFieldValue ( parameterField , {
264
309
name : parameter . name ,
265
310
value,
266
311
} ) ;
267
- form . setFieldTouched ( parameter . name , true ) ;
268
- sendDynamicParamsRequest ( parameter , value ) ;
312
+
313
+ // Only send the request if the value has changed from the form value
314
+ if ( currentFormValue !== value ) {
315
+ form . setFieldTouched ( parameter . name , true ) ;
316
+ sendDynamicParamsRequest ( [ { parameter, value } ] ) ;
317
+ }
269
318
} ;
270
319
271
320
useSyncFormParameters ( {
0 commit comments