diff --git a/web/src/components/dynamic-form.tsx b/web/src/components/dynamic-form.tsx index 1930ef631a..1a41c9a23a 100644 --- a/web/src/components/dynamic-form.tsx +++ b/web/src/components/dynamic-form.tsx @@ -115,6 +115,24 @@ interface DynamicFormProps { // updatedField: Partial, // ) => void; labelClassName?: string; + /** + * Options forwarded to `form.reset()` when `defaultValues` change. + * Pass `{ keepDirtyValues: true }` to preserve user edits during + * background refetches / lazy detail loads. Defaults to `{}` + * (hard reset) to preserve the original behavior for existing + * consumers. + */ + resetOptions?: { + keepValues?: boolean; + keepDefaultValues?: boolean; + keepErrors?: boolean; + keepDirty?: boolean; + keepDirtyValues?: boolean; + keepIsSubmitted?: boolean; + keepTouched?: boolean; + keepIsValid?: boolean; + keepSubmitCount?: boolean; + }; } // Form ref interface @@ -643,6 +661,7 @@ const DynamicForm = { defaultValues: formDefaultValues = {} as DefaultValues, // onFieldUpdate, labelClassName, + resetOptions, }: DynamicFormProps, ref: React.Ref, ) => { @@ -876,12 +895,15 @@ const DynamicForm = { (form as any).filterActiveValues = filterActiveValues; useEffect(() => { if (formDefaultValues && Object.keys(formDefaultValues).length > 0) { - form.reset({ - ...generateDefaultValues(fields), - ...formDefaultValues, - }); + form.reset( + { + ...generateDefaultValues(fields), + ...formDefaultValues, + }, + resetOptions, + ); } - }, [form, formDefaultValues, fields]); + }, [form, formDefaultValues, fields, resetOptions]); // Submit handler // const handleSubmit = form.handleSubmit(onSubmit); diff --git a/web/src/pages/user-setting/setting-model/instance-card/components/draft-mode-card.tsx b/web/src/pages/user-setting/setting-model/instance-card/components/draft-mode-card.tsx index 5ad71ffbda..61518bbab4 100644 --- a/web/src/pages/user-setting/setting-model/instance-card/components/draft-mode-card.tsx +++ b/web/src/pages/user-setting/setting-model/instance-card/components/draft-mode-card.tsx @@ -73,6 +73,7 @@ export function DraftModeCard({ onSubmit={() => undefined} defaultValues={formDefaultValues} labelClassName="font-normal" + resetOptions={{ keepDirtyValues: true }} /> {providerName === LLMFactory.AIMLAPI && ( diff --git a/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx b/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx index 12b02de7f2..01eee4efc4 100644 --- a/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx +++ b/web/src/pages/user-setting/setting-model/instance-card/components/saved-mode-card.tsx @@ -190,12 +190,13 @@ export function SavedModeCard({
} fields={formFields} onSubmit={() => undefined} defaultValues={formDefaultValues} labelClassName="font-normal" + resetOptions={{ keepDirtyValues: true }} />
diff --git a/web/src/pages/user-setting/setting-model/layout/system-setting.tsx b/web/src/pages/user-setting/setting-model/layout/system-setting.tsx index 11585aa817..b792cdf3ec 100644 --- a/web/src/pages/user-setting/setting-model/layout/system-setting.tsx +++ b/web/src/pages/user-setting/setting-model/layout/system-setting.tsx @@ -92,7 +92,6 @@ function SystemSetting() { async (field: string, value: string) => { const modelType = FieldToModelType[field]; if (!modelType) return; - if (!value) return; const parsed = parseModelValue(value); if (parsed) { await setDefaultModel({ ...parsed, model_type: modelType });