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 <>