diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/index.spec.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/index.spec.tsx
index 8ba2f095005..88d50e4b99f 100644
--- a/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/index.spec.tsx
+++ b/web/app/components/header/account-setting/model-provider-page/model-selector/__tests__/index.spec.tsx
@@ -108,10 +108,10 @@ describe('ModelSelector', () => {
>,
)
- expect(screen.getByRole('combobox', { name: 'System reasoning model' })).toBeInTheDocument()
+ expect(screen.getByRole('button', { name: 'System reasoning model' })).toBeInTheDocument()
})
- it('exposes required and invalid field guidance on the combobox trigger', () => {
+ it('exposes required and invalid field guidance on the popover trigger', () => {
renderWithQueryClient(
<>
Embedding model
@@ -126,10 +126,9 @@ describe('ModelSelector', () => {
>,
)
- const trigger = screen.getByRole('combobox', { name: 'Embedding model' })
+ const trigger = screen.getByRole('button', { name: /Embedding model/ })
expect(trigger).toHaveAccessibleDescription('Select an embedding model.')
- expect(trigger).toHaveAttribute('aria-invalid', 'true')
- expect(trigger).toHaveAttribute('aria-required', 'true')
+ expect(trigger).toHaveAccessibleName(/common\.errorMsg\.fieldRequired/)
})
it('should toggle popup and close it after selecting a model', () => {
diff --git a/web/app/components/header/account-setting/model-provider-page/model-selector/model-selector-trigger.tsx b/web/app/components/header/account-setting/model-provider-page/model-selector/model-selector-trigger.tsx
index e5238e0c627..47be1ed5aa5 100644
--- a/web/app/components/header/account-setting/model-provider-page/model-selector/model-selector-trigger.tsx
+++ b/web/app/components/header/account-setting/model-provider-page/model-selector/model-selector-trigger.tsx
@@ -3,6 +3,7 @@ import { cn } from '@langgenius/dify-ui/cn'
import { PopoverTrigger } from '@langgenius/dify-ui/popover'
import { Tooltip, TooltipContent, TooltipTrigger } from '@langgenius/dify-ui/tooltip'
import { useQuery } from '@tanstack/react-query'
+import { useId } from 'react'
import { useTranslation } from 'react-i18next'
import { consoleQuery } from '@/service/client'
import {
@@ -50,6 +51,7 @@ function ModelSelectorTrigger({
isModelCompatible = true,
}: ModelSelectorTriggerProps) {
const { t } = useTranslation()
+ const requiredTextId = useId()
const isSelected = !!currentProvider && !!currentModel
const isDeprecated = !isSelected && !!defaultModel
@@ -95,6 +97,13 @@ function ModelSelectorTrigger({
: isSelected && ((!isActive && statusI18nKey) || !isModelCompatible)
? tooltipLabel
: undefined
+ const configureModelLabel = t(($) => $['detailPanel.configureModel'], { ns: 'plugin' })
+ const requiredText = ariaRequired
+ ? t(($) => $['errorMsg.fieldRequired'], { field: '', ns: 'common' }).trim()
+ : undefined
+ const triggerLabelledBy = [ariaLabelledBy, requiredText ? requiredTextId : undefined]
+ .filter(Boolean)
+ .join(' ')
return (
@@ -110,9 +119,9 @@ function ModelSelectorTrigger({
aria-label={
ariaLabelledBy
? undefined
- : t(($) => $['detailPanel.configureModel'], { ns: 'plugin' })
+ : [configureModelLabel, requiredText].filter(Boolean).join(' ')
}
- aria-labelledby={ariaLabelledBy}
+ aria-labelledby={triggerLabelledBy || undefined}
data-deprecated={isDeprecated ? '' : undefined}
data-invalid={ariaInvalid ? '' : undefined}
data-model-status={status}
@@ -137,6 +146,11 @@ function ModelSelectorTrigger({
/>
}
>
+ {requiredText && (
+
+ {requiredText}
+
+ )}
{isEmpty ? (
- {t(($) => $['detailPanel.configureModel'], { ns: 'plugin' })}
+ {configureModelLabel}
)}
diff --git a/web/features/new-rag/__tests__/knowledge-settings-form.spec.tsx b/web/features/new-rag/__tests__/knowledge-settings-form.spec.tsx
index 4b2a98b2b73..8a9f6f97be2 100644
--- a/web/features/new-rag/__tests__/knowledge-settings-form.spec.tsx
+++ b/web/features/new-rag/__tests__/knowledge-settings-form.spec.tsx
@@ -121,13 +121,12 @@ vi.mock('@/app/components/header/account-setting/model-provider-page/model-selec
<>