From 6fb6b9e06b48998b44d2eee5a052bbd5f6afb093 Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Thu, 30 Jul 2026 16:50:31 +0800 Subject: [PATCH] fix(setting-model): support field-level autoComplete to suppress browser autofill (#17559) --- web/src/components/dynamic-form.tsx | 9 +++++++++ .../field-config/generic-api-key-config.ts | 4 ++++ .../provider-schema/hooks/use-provider-fields.tsx | 7 ++++++- .../user-setting/setting-model/provider-schema/types.ts | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/web/src/components/dynamic-form.tsx b/web/src/components/dynamic-form.tsx index 107109f922..1930ef631a 100644 --- a/web/src/components/dynamic-form.tsx +++ b/web/src/components/dynamic-form.tsx @@ -93,6 +93,14 @@ export interface FormFieldConfig { labelClassName?: string; className?: string; disabled?: boolean; + /** + * HTML `autocomplete` attribute forwarded to the underlying ``. + * Use `'new-password'` to suppress browser autofill — Chrome ignores + * `'off'` on forms that contain a password field (treats them as login + * forms), so `'new-password'` is the reliable value for autofill-prone + * fields like api_key / instance_name / base_url / group_id. + */ + autoComplete?: string; } // Component props interface @@ -613,6 +621,7 @@ export const RenderField = ({ type={field.type} placeholder={field.placeholder} disabled={field.disabled} + autoComplete={field.autoComplete} /> ); diff --git a/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts b/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts index 281df1e0ff..c64b96ba1b 100644 --- a/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts +++ b/web/src/pages/user-setting/setting-model/provider-schema/field-config/generic-api-key-config.ts @@ -32,6 +32,7 @@ export const GenericApiKeyConfig: ProviderConfig = { required: true, placeholder: 'instanceNameMessage', tooltip: 'instanceNameTip', + autoComplete: 'new-password', validation: { message: 'instanceNameMessage' }, }, { @@ -40,6 +41,7 @@ export const GenericApiKeyConfig: ProviderConfig = { type: FormFieldType.Password, required: true, placeholder: 'apiKeyMessage', + autoComplete: 'new-password', validation: { message: 'apiKeyMessage' }, }, { @@ -64,6 +66,7 @@ export const GenericApiKeyConfig: ProviderConfig = { return 'openaiBaseUrlPlaceholder'; }, shouldRender: 'showBaseUrl', + autoComplete: 'new-password', }, { name: 'group_id', @@ -71,6 +74,7 @@ export const GenericApiKeyConfig: ProviderConfig = { type: FormFieldType.Text, required: false, shouldRender: 'showGroupId', + autoComplete: 'new-password', }, ], verifyTransform: (values) => ({ diff --git a/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx b/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx index 0e045bb485..f0e6bae3d8 100644 --- a/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx +++ b/web/src/pages/user-setting/setting-model/provider-schema/hooks/use-provider-fields.tsx @@ -209,6 +209,7 @@ export const useProviderFields = ({ value: o.value, })) as any, defaultValue: field.defaultValue, + autoComplete: field.autoComplete, validation, shouldRender: resolveShouldRender(field.shouldRender), // In viewMode, only the model-related fields are editable. @@ -245,7 +246,11 @@ export const useProviderFields = ({ placeholder={placeholderText} /> ) : ( - + ); }, }; diff --git a/web/src/pages/user-setting/setting-model/provider-schema/types.ts b/web/src/pages/user-setting/setting-model/provider-schema/types.ts index 66bcbd485e..fcc65fd1e1 100644 --- a/web/src/pages/user-setting/setting-model/provider-schema/types.ts +++ b/web/src/pages/user-setting/setting-model/provider-schema/types.ts @@ -85,6 +85,12 @@ export interface FieldConfig { options?: SelectOption[]; /** Default value */ defaultValue?: any; + /** + * HTML `autocomplete` attribute forwarded to the underlying ``. + * Use `'new-password'` to suppress browser autofill (Chrome ignores + * `'off'` on forms containing a password field). + */ + autoComplete?: string; /** * Validation rules. * `message` is treated as an i18n key by the ProviderModal and translated