From 190b9033119f8df8268460849a9ffab8d873994a Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Tue, 4 Aug 2026 10:37:20 +0800 Subject: [PATCH] Fix: Resolved issue where the default model could not be deleted. (#17755) --- web/src/components/dynamic-form.tsx | 32 ++++++++++++++++--- .../components/draft-mode-card.tsx | 1 + .../components/saved-mode-card.tsx | 3 +- .../setting-model/layout/system-setting.tsx | 1 - 4 files changed, 30 insertions(+), 7 deletions(-) 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 });