Skip to content

Commit b03e3be

Browse files
committed
fix: get presets working correctly with dynamic params
1 parent fe733af commit b03e3be

File tree

3 files changed

+70
-16
lines changed

3 files changed

+70
-16
lines changed

site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,15 @@ const DebouncedParameterField: FC<DebouncedParameterFieldProps> = ({
222222
const onChangeEvent = useEffectEvent(onChange);
223223
// prevDebouncedValueRef is to prevent calling the onChangeEvent on the initial render
224224
const prevDebouncedValueRef = useRef<string | undefined>();
225+
const prevValueRef = useRef(value);
226+
227+
// This is necessary in the case of fields being set by preset parameters
228+
useEffect(() => {
229+
if (value !== undefined && value !== prevValueRef.current) {
230+
setLocalValue(value);
231+
prevValueRef.current = value;
232+
}
233+
}, [value]);
225234

226235
useEffect(() => {
227236
if (prevDebouncedValueRef.current !== undefined) {
@@ -458,7 +467,7 @@ const ParameterField: FC<ParameterFieldProps> = ({
458467
<Slider
459468
id={id}
460469
className="mt-2"
461-
value={[Number(value)]}
470+
value={[Number.isNaN(Number(value)) ? 0 : Number(value)]}
462471
onValueChange={([value]) => {
463472
onChange(value.toString());
464473
}}

site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ const CreateWorkspacePageExperimental: FC = () => {
101101
}
102102
}, []);
103103

104-
// On sends all initial parameter values to the websocket
104+
// On page load, sends all initial parameter values to the websocket
105105
// (including defaults and autofilled from the url)
106106
// This ensures the backend has the complete initial state of the form,
107107
// which is vital for correctly rendering dynamic UI elements where parameter visibility

site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -213,39 +213,76 @@ export const CreateWorkspacePageViewExperimental: FC<
213213

214214
setPresetParameterNames(selectedPreset.Parameters.map((p) => p.Name));
215215

216-
for (const presetParameter of selectedPreset.Parameters) {
216+
const currentValues = form.values.rich_parameter_values ?? [];
217+
218+
const updates = selectedPreset.Parameters.map((presetParameter) => {
217219
const parameterIndex = parameters.findIndex(
218220
(p) => p.name === presetParameter.Name,
219221
);
220-
if (parameterIndex === -1) continue;
222+
if (parameterIndex === -1) return null;
221223

222224
const parameterField = `rich_parameter_values.${parameterIndex}`;
225+
const parameter = parameters[parameterIndex];
226+
const currentValue = currentValues.find(
227+
(p) => p.name === presetParameter.Name,
228+
)?.value;
229+
230+
if (currentValue !== presetParameter.Value) {
231+
return {
232+
field: parameterField,
233+
fieldValue: {
234+
name: presetParameter.Name,
235+
value: presetParameter.Value,
236+
},
237+
parameter,
238+
presetValue: presetParameter.Value,
239+
};
240+
}
241+
return null;
242+
}).filter(
243+
(update): update is NonNullable<typeof update> => update !== null,
244+
);
245+
246+
if (updates.length > 0) {
247+
for (const update of updates) {
248+
form.setFieldValue(update.field, update.fieldValue);
249+
form.setFieldTouched(update.parameter.name, true);
250+
}
223251

224-
form.setFieldValue(parameterField, {
225-
name: presetParameter.Name,
226-
value: presetParameter.Value,
227-
});
252+
sendDynamicParamsRequest(
253+
updates.map((update) => ({
254+
parameter: update.parameter,
255+
value: update.presetValue,
256+
})),
257+
);
228258
}
229259
}, [
230260
presetOptions,
231261
selectedPresetIndex,
232262
presets,
233263
form.setFieldValue,
264+
form.setFieldTouched,
234265
parameters,
266+
form.values.rich_parameter_values,
235267
]);
236268

237269
// send the last user modified parameter and all touched parameters to the websocket
238270
const sendDynamicParamsRequest = (
239-
parameter: PreviewParameter,
240-
value: string,
271+
parameters: Array<{ parameter: PreviewParameter; value: string }>,
241272
) => {
242273
const formInputs: Record<string, string> = {};
243-
formInputs[parameter.name] = value;
244-
const parameters = form.values.rich_parameter_values ?? [];
274+
const formParameters = form.values.rich_parameter_values ?? [];
275+
276+
for (const { parameter, value } of parameters) {
277+
formInputs[parameter.name] = value;
278+
}
245279

246280
for (const [fieldName, isTouched] of Object.entries(form.touched)) {
247-
if (isTouched && fieldName !== parameter.name) {
248-
const param = parameters.find((p) => p.name === fieldName);
281+
if (
282+
isTouched &&
283+
!parameters.some((p) => p.parameter.name === fieldName)
284+
) {
285+
const param = formParameters.find((p) => p.name === fieldName);
249286
if (param?.value) {
250287
formInputs[fieldName] = param.value;
251288
}
@@ -260,12 +297,20 @@ export const CreateWorkspacePageViewExperimental: FC<
260297
parameterField: string,
261298
value: string,
262299
) => {
300+
const currentFormValue = form.values.rich_parameter_values?.find(
301+
(p) => p.name === parameter.name,
302+
)?.value;
303+
263304
await form.setFieldValue(parameterField, {
264305
name: parameter.name,
265306
value,
266307
});
267-
form.setFieldTouched(parameter.name, true);
268-
sendDynamicParamsRequest(parameter, value);
308+
309+
// Only send the request if the value has changed from the form value
310+
if (currentFormValue !== value) {
311+
form.setFieldTouched(parameter.name, true);
312+
sendDynamicParamsRequest([{ parameter, value }]);
313+
}
269314
};
270315

271316
useSyncFormParameters({

0 commit comments

Comments
 (0)