Skip to content

[Input] Required message refactoring - Part 1 - #5399

Open
Vincent Baaij (vnbaaij) wants to merge 5 commits into
devfrom
users/vnbaaij/required-message-foundation
Open

Vincent Baaij (vnbaaij) wants to merge 5 commits into
devfrom
users/vnbaaij/required-message-foundation

Conversation

@vnbaaij

Copy link
Copy Markdown
Collaborator

This pull request introduces a unified and extensible approach to required-field validation messages across Fluent UI input components. The changes centralize the logic for displaying required messages, ensure proper error messaging from model annotations, and update sample data and documentation to reflect these improvements.

Core validation improvements:

  • Introduced reusable required-field message logic in FluentInputBase, including the CreateRequiredMessageCondition method and helpers to extract error messages from RequiredAttribute annotations. This ensures all input components display consistent and customizable required messages based on model validation attributes.
  • Updated input components (FluentCheckbox, FluentSwitch, FluentRadioGroup, FluentCalendar, FluentNumberInput, FluentTextInput, FluentTextArea) to use the new required message condition logic, replacing duplicated or ad-hoc implementations. For composed components, like AutoComplete, a separate PR will be created (which can only be merged after this one)

Validation message display behavior:

  • Modified FluentField.razor to show required-field messages only when there are no validation messages from the EditContext, preventing duplicate or conflicting messages
  • Made CreateFieldIdentifier method in FluentField.razor.cs internal for broader use in validation logic.

Sample data and documentation updates:

Test updates:

  • Unit tests added and/or updated (for example adjusted checkbox component test baselines to reflect the new message rendering logic (removal of empty message elements when not needed)).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@vnbaaij Vincent Baaij (vnbaaij) added this to the v5.0.1 milestone Oct 6, 2026
Copilot AI balanced review requested due to automatic review settings October 6, 2026 13:42
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

✅ All tests passed successfully

Details on your Workflow / Core Tests page.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Field-message suppression and constructor-time localization capture introduce user-visible regressions.

Review effort: Balanced
Findings: 2 Medium severity

Open (2)
What changed in this PR

Centralizes required-field validation messaging across Fluent input components, including annotation-derived messages and updated examples/tests.

Changes:

  • Adds reusable required-message logic to FluentInputBase.
  • Adopts the logic across seven input components and adjusts field rendering.
  • Updates tests, snapshots, and form sample data.
File Description
tests/​Core/​Components/​TextInput/​FluentTextInputTests.razor Tests default and annotation-based messages.
tests/​Core/​Components/​TextArea/​FluentTextAreaTests.razor Tests required textarea behavior.
tests/​Core/​Components/​Switch/​FluentSwitchTests.razor Tests required switch states.
tests/​Core/​Components/​Switch/​FluentSwitchTests.FluentSwitch_Required.verified.razor.html Updates required snapshot.
tests/​Core/​Components/​Switch/​FluentSwitchTests.FluentSwitch_ReadOnly.verified.razor.html Updates read-only snapshot.
tests/​Core/​Components/​Switch/​FluentSwitchTests.FluentSwitch_LabelTemplate.verified.razor.html Updates label-template snapshot.
tests/​Core/​Components/​Switch/​FluentSwitchTests.FluentSwitch_Default.verified.razor.html Updates default snapshot.
tests/​Core/​Components/​Switch/​FluentSwitchTests.FluentSwitch_Default_TrueValue.verified.razor.html Updates true-value snapshot.
tests/​Core/​Components/​Radio/​FluentRadioTests.FluentRadio_LabelWidth.verified.razor.html Removes empty group message.
tests/​Core/​Components/​Radio/​FluentRadioTests.FluentRadio_LabelTemplate.verified.razor.html Removes empty group message.
tests/​Core/​Components/​Radio/​FluentRadioTests.FluentRadio_Label.verified.razor.html Removes empty group message.
tests/​Core/​Components/​Radio/​FluentRadioTests.FluentRadio_HorizontalOrientation.verified.razor.html Removes empty group message.
tests/​Core/​Components/​Radio/​FluentRadioTests.FluentRadio_Default.verified.razor.html Removes empty group message.
tests/​Core/​Components/​Radio/​FluentRadioGroupTests.razor Tests required radio groups.
tests/​Core/​Components/​Radio/​FluentRadioGroupTests.FluentRadioGroup_WithChildContent.verified.razor.html Updates child-content snapshot.
tests/​Core/​Components/​Radio/​FluentRadioGroupTests.FluentRadioGroup_Items.verified.razor.html Updates items snapshot.
tests/​Core/​Components/​Radio/​FluentRadioGroupTests.FluentRadioGroup_Default.verified.razor.html Updates default snapshot.
tests/​Core/​Components/​Number/​FluentNumberTests.razor Tests required number input.
tests/​Core/​Components/​Field/​FluentFieldTests.FluentField_MessageState-error.verified.razor.html Captures error text styling.
tests/​Core/​Components/​DateTimes/​FluentCalendarTests.razor Tests required calendar behavior.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.razor Tests required checkbox states.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Size-medium.verified.razor.html Updates medium-size snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Size-large.verified.razor.html Updates large-size snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Size-999.verified.razor.html Updates invalid-size snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Size-[empty].verified.razor.html Updates empty-size snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_ShowIndeterminate.verified.razor.html Updates indeterminate snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Shape-square.verified.razor.html Updates square-shape snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Shape-circular.verified.razor.html Updates circular-shape snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Shape-999.verified.razor.html Updates invalid-shape snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Shape-[empty].verified.razor.html Updates empty-shape snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_LabelTemplate.verified.razor.html Updates label-template snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_EnableThreeState.verified.razor.html Updates three-state snapshot.
tests/​Core/​Components/​Checkbox/​FluentCheckboxTests.FluentCheckbox_Default.verified.razor.html Updates default snapshot.
src/​Core/​Components/​TextInput/​FluentTextInput.razor.cs Uses centralized required logic.
src/​Core/​Components/​TextArea/​FluentTextArea.razor.cs Uses centralized required logic.
src/​Core/​Components/​Switch/​FluentSwitch.razor.cs Adds required switch messaging.
src/​Core/​Components/​Radio/​FluentRadioGroup.razor.cs Adds required selection messaging.
src/​Core/​Components/​NumberInput/​FluentNumberInput.razor.cs Uses centralized required logic.
src/​Core/​Components/​Field/​FluentField.razor.cs Exposes field-identifier creation internally.
src/​Core/​Components/​Field/​FluentField.razor Prioritizes validation messages and styles errors.
src/​Core/​Components/​DateTime/​FluentCalendar.razor.cs Uses centralized calendar validation.
src/​Core/​Components/​Checkbox/​FluentCheckbox.razor.cs Adds required checkbox messaging.
src/​Core/​Components/​Base/​FluentInputBase.Validation.cs Implements shared required-message handling.
examples/​Tools/​FluentUI.Demo.SampleData/​Starship.cs Adds required annotation messages.
examples/​Demo/​FluentUI.Demo.Client/​Documentation/​Components/​Forms/​Examples/​BasicForm.razor Marks the teleporter switch required.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/Core/Components/DateTime/FluentCalendar.razor.cs Outdated
Comment thread src/Core/Components/Field/FluentField.razor
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown

Summary - Unit Tests Code Coverage

Summary
Generated on: 10/06/2026 - 14:19:24
Parser: MultiReport (6x Cobertura)
Assemblies: 2
Classes: 361
Files: 427
Line coverage: 98.3% (12502 of 12709)
Covered lines: 12502
Uncovered lines: 207
Coverable lines: 12709
Total lines: 50173
Branch coverage: 92.2% (7492 of 8118)
Covered branches: 7492
Total branches: 8118
Method coverage: Feature is only available for sponsors
Tag: 7990_37477125671

Coverage

Microsoft.FluentUI.AspNetCore.Components - 98.3%
Name Line Branch
Microsoft.FluentUI.AspNetCore.Components 98.3% 92.3%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions.Add
itionalAttributeCondition
100% 100%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions.Add
itionalAttributeCondition.AdditionalAttributeConditionItem
100%
Microsoft.FluentUI.AspNetCore.Components.AutocompleteHeaderFooterContent<TO
ption>
100% 50%
Microsoft.FluentUI.AspNetCore.Components.CachedServices 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarExtended 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTitles 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.ColorHelper 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.DefaultColors 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.HsvColor 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.WheelColor 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnBase 79.1% 75.8%
Microsoft.FluentUI.AspNetCore.Components.ColumnBase 99% 90.2%
Microsoft.FluentUI.AspNetCore.Components.ColumnHeaderCapabilities 100% 80%
Microsoft.FluentUI.AspNetCore.Components.ColumnKeyGridSort 96.1% 87.5%
Microsoft.FluentUI.AspNetCore.Components.ColumnMenuSettings 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnReorderOptions 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnSortMenuItems 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnSortMenuItems 93.5% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnSortOptions 100%
Microsoft.FluentUI.AspNetCore.Components.CustomEmoji 100% 100%
Microsoft.FluentUI.AspNetCore.Components.CustomIcon 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.Defer 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.Hierarchic
alSortHelper
88.8% 85%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.Hierarchic
alSortHelper
88.8% 85%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.InternalGr
idContext
100% 100%
Microsoft.FluentUI.AspNetCore.Components.DataGridSortColumn 50% 0%
Microsoft.FluentUI.AspNetCore.Components.DataGridSortEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.DateTimeProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DateTimeProviderContext 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.DefaultStyles 100%
Microsoft.FluentUI.AspNetCore.Components.DefaultValues 100% 96.1%
Microsoft.FluentUI.AspNetCore.Components.DefaultValues 100% 96.1%
Microsoft.FluentUI.AspNetCore.Components.DefaultValuesComponentBuilder<TCom
ponent, TValue>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.DefaultValuesComponentBuilder<TCom
ponent>
100% 96.4%
Microsoft.FluentUI.AspNetCore.Components.Dialog.MessageBox.FluentMessageBox 100% 75%
Microsoft.FluentUI.AspNetCore.Components.DialogEventArgs 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.DialogInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptions 94.1%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsFooter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsFooterAction 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsHeader 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsHeaderAction 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogResult 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogResult 100%
Microsoft.FluentUI.AspNetCore.Components.DialogService 100% 82.8%
Microsoft.FluentUI.AspNetCore.Components.DynamicComponentRenderer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Emoji 100% 100%
Microsoft.FluentUI.AspNetCore.Components.EmojiCompress 100% 100%
Microsoft.FluentUI.AspNetCore.Components.EmojiExtensions 100% 50%
Microsoft.FluentUI.AspNetCore.Components.EmojiInfo 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DateTimeExtensions 98.4% 90.3%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DisplayAttributeExtensi
ons
100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.Extensions.EnumExtensions 100% 92.3%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FieldSizeExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FluentInputExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FileSizeConverter 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordion 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordionItem 100% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentAnchorButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBar 97.3% 81.1%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBarItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAutocomplete<TOption, TValue
>
94.6% 90.9%
Microsoft.FluentUI.AspNetCore.Components.FluentAutocomplete<TOption, TValue
>
90.2% 85.7%
Microsoft.FluentUI.AspNetCore.Components.FluentAvatar 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentBadge 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentButton 97.7% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendar 96.7% 76.6%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendar 97% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarBase 100% 89.1%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarDay 100% 95.4%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarMonth 100% 85.7%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarYear 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.FluentCard 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCheckbox 100% 97.5%
Microsoft.FluentUI.AspNetCore.Components.FluentColorPicker 97.3% 94.8%
Microsoft.FluentUI.AspNetCore.Components.FluentColorPickerInput 98.6% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentCombobox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCombobox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentComponentBase 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCompoundButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCounterBadge 100% 95.2%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid 97.8% 94.7%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid 97.9% 94.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridCell 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridCell 97.2% 89.7%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridRow 96.9% 96.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridRow 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDatePicker 100% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentDatePicker 95.5% 80.6%
Microsoft.FluentUI.AspNetCore.Components.FluentDialog 97.7% 89.8%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogBody 97.5% 94.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogProvider 95.3% 77.5%
Microsoft.FluentUI.AspNetCore.Components.FluentDivider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDragContainer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDropZone 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDropZone 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentEmoji 100% 95%
Microsoft.FluentUI.AspNetCore.Components.FluentErrorBoundary 94.7% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentField 98.3% 95%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldCondition 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldConditionItem 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldConditionOptions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldParameterSelector 97.7% 94.8%
Microsoft.FluentUI.AspNetCore.Components.FluentGrid 100% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentGridItem 100% 98.4%
Microsoft.FluentUI.AspNetCore.Components.FluentHighlighter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentIcon 100%
Microsoft.FluentUI.AspNetCore.Components.FluentIcon 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentImage 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputBase 73.9% 60%
Microsoft.FluentUI.AspNetCore.Components.FluentInputBase 87.3% 70.8%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFile 98.6% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileBuffer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileErrorEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateManager 97.6% 97%
Microsoft.FluentUI.AspNetCore.Components.FluentJSModule 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCode 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeEventArgs 100% 77.7%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLabel 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLabelInfo 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLayout 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentLayoutHamburger 97.7% 89.4%
Microsoft.FluentUI.AspNetCore.Components.FluentLayoutItem 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.FluentLink 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentListBase<TOption, TValue> 100% 96.6%
Microsoft.FluentUI.AspNetCore.Components.FluentListBase<TOption, TValue> 89.5% 86.6%
Microsoft.FluentUI.AspNetCore.Components.FluentListbox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentListbox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLocalizerExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLocalizerInternal 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMenu 100% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuButton 100% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuItem 100% 92.5%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuList 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBar 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBarProvider 100% 92.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitter 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterPane 100% 85.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterResizeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNav 98.6% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentNavBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNavCategory 96.6% 91.2%
Microsoft.FluentUI.AspNetCore.Components.FluentNavItem 100% 91.4%
Microsoft.FluentUI.AspNetCore.Components.FluentNavSectionHeader 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberInput 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberInput 100% 97.2%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberInputCultureInfo 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOption 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOption 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOptionString 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflow 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflow 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverlay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPaginator 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentPopover 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPresenceBadge 100% 95.4%
Microsoft.FluentUI.AspNetCore.Components.FluentProgress 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressBar 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressRing 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProviders 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPullToRefresh 99.3% 91.7%
Microsoft.FluentUI.AspNetCore.Components.FluentRadio 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioGroup 100% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioGroup 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentRatingDisplay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSelect<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSelect<TOption, TValue> 100% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceBase 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceProviderException<TPr
ovider>
100%
Microsoft.FluentUI.AspNetCore.Components.FluentSkeleton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSlider 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSlider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableList 91.6% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableList 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableListEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSpacer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSpinner 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSplitButton 100%
Microsoft.FluentUI.AspNetCore.Components.FluentStack 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentStatus 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSwitch 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTab 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTabs 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentText 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTextArea 100% 78.5%
Microsoft.FluentUI.AspNetCore.Components.FluentTextInput 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker.TimeEqualityCompa
rer
100% 58.3%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker 100% 78.5%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker 98.9% 78.6%
Microsoft.FluentUI.AspNetCore.Components.FluentToast 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentToastProvider 99% 96.9%
Microsoft.FluentUI.AspNetCore.Components.FluentToggleButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltip 97.9% 89.2%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltipProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeItem 100% 94.7%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeView 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationMessage 100%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationMessage 97.5% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationSummary 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizard 98.4% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStep 97.8% 92.7%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepChangeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepValidator 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FreeOptionOutput 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderRequest<TGridItem
>
95.1% 87.5%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderResult 100%
Microsoft.FluentUI.AspNetCore.Components.GridSort<TGridItem, U> 87.5% 79.1%
Microsoft.FluentUI.AspNetCore.Components.GridSort 100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridItem<TItem, TGridI
tem>
100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridItem<TItem, TGridI
tem>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridUtilities 100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridUtilities<TGridIte
m, TItem>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalSelectColumn<TGridItem
>
100% 95.2%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalSelectColumn<TGridItem
>
98% 95.9%
Microsoft.FluentUI.AspNetCore.Components.HighlighterSplitter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Icon 100% 95%
Microsoft.FluentUI.AspNetCore.Components.IconFromImage 100%
Microsoft.FluentUI.AspNetCore.Components.IconInfo 100%
Microsoft.FluentUI.AspNetCore.Components.IconsExtensions 100% 50%
Microsoft.FluentUI.AspNetCore.Components.IFluentComponentBase 100%
Microsoft.FluentUI.AspNetCore.Components.IFluentComponentChangeAfterKeyPres
s
100% 100%
Microsoft.FluentUI.AspNetCore.Components.IFluentLocalizer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.IGridSort 0%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
ibable
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
ibable
100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
iber
100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.InputFileInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InputFileOptions 100%
Microsoft.FluentUI.AspNetCore.Components.InternalAppBarContext 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InternalListContext 100%
Microsoft.FluentUI.AspNetCore.Components.JSRuntimeExtensions 100% 25%
Microsoft.FluentUI.AspNetCore.Components.JSRuntimeExtensions 100% 25%
Microsoft.FluentUI.AspNetCore.Components.KeyCodeService 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.KeyCodeService.KeyCodeListener 100% 100%
Microsoft.FluentUI.AspNetCore.Components.KeyPress 100%
Microsoft.FluentUI.AspNetCore.Components.LabelInfo 100%
Microsoft.FluentUI.AspNetCore.Components.LayoutHamburgerEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.LibraryToastOptions 100%
Microsoft.FluentUI.AspNetCore.Components.LibraryTooltipOptions 100%
Microsoft.FluentUI.AspNetCore.Components.Localization.LanguageResource 100% 100%
Microsoft.FluentUI.AspNetCore.Components.MarkupSanitizedOptions 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBarEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBarInstance 94.1% 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBarOptions 94.4%
Microsoft.FluentUI.AspNetCore.Components.MessageBarResult 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBoxOptions 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.AppearanceExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.FluentInputAppearanceExt
ensions
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.TooltipPositionExtension 100% 100%
Microsoft.FluentUI.AspNetCore.Components.NotificationService 98.1% 97.4%
Microsoft.FluentUI.AspNetCore.Components.NotificationService 98.1% 97.4%
Microsoft.FluentUI.AspNetCore.Components.NotificationService 98.1% 97.4%
Microsoft.FluentUI.AspNetCore.Components.OptionsSearchEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.OverflowContext 100%
Microsoft.FluentUI.AspNetCore.Components.OverlayOptions 100%
Microsoft.FluentUI.AspNetCore.Components.PaginationState 100% 81.2%
Microsoft.FluentUI.AspNetCore.Components.PropertyColumn<TGridItem, TProp> 100% 75%
Microsoft.FluentUI.AspNetCore.Components.PropertyColumn<TGridItem, TProp> 100% 84.6%
Microsoft.FluentUI.AspNetCore.Components.RangeOfDates 96.5% 86.8%
Microsoft.FluentUI.AspNetCore.Components.SelectAllTemplateArgs 100%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn.ItemKeyEqualityCompar
er
72.7% 66.6%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn 88.7% 93.1%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn 96% 85.8%
Microsoft.FluentUI.AspNetCore.Components.ServiceProviderExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.SpacingExtensions 100% 97.3%
Microsoft.FluentUI.AspNetCore.Components.TemplateColumn 100% 100%
Microsoft.FluentUI.AspNetCore.Components.TemplateColumn 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Theme 100% 80%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeBorders 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeColors 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeCurves 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeFonts 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeLines 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeSpacings 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeStrokes 100%
Microsoft.FluentUI.AspNetCore.Components.ThemeExtensions 93.3% 94.4%
Microsoft.FluentUI.AspNetCore.Components.ThemeService 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.ThemeSettings 100%
Microsoft.FluentUI.AspNetCore.Components.ToastEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.ToastInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ToastOptions 94.7%
Microsoft.FluentUI.AspNetCore.Components.ToastResult 100%
Microsoft.FluentUI.AspNetCore.Components.TooltipEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TotalItemCountChangedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItemExpandedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.AddTag 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.CssBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Debounce 93.3% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Identifier 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.IdentifierContext 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InlineStyleBuilder 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.Utilities.MarkupStringSanitized 100% 92.5%
Microsoft.FluentUI.AspNetCore.Components.Utilities.MarkupStringSanitized.Pa
rsedContent
100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.RangeOf 96.5% 97.2%
Microsoft.FluentUI.AspNetCore.Components.Utilities.StyleBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ZIndex 100%
Microsoft.FluentUI.AspNetCore.Components.Charts - 100%
Name Line Branch
Microsoft.FluentUI.AspNetCore.Components.Charts 100% 89.1%
Microsoft.FluentUI.AspNetCore.Components.Charts.AreaChartSeries 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.ChartAxisValue 100% 85.7%
Microsoft.FluentUI.AspNetCore.Components.Charts.ChartAxisValueJsonConverter 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.Charts.DataVizPaletteExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.DonutDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentAreaChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentCartesianChartBase 100% 85.7%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentChartBase 100% 90%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentDonutChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentFunnelChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentGanttChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentGaugeChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentGroupedVerticalBarCha
rt
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentHeatMapChart 100% 83.3%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentHorizontalBarChart 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentHorizontalBarChartWit
hAxis
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentLineChart 100% 83.3%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentPolarChart 100% 60%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentSankeyChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentScatterChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentSparklineChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentVerticalBarChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentVerticalStackedBarCha
rt
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FunnelDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FunnelSubValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.GanttChartDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.GaugeChartSegment 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.GroupedVerticalBarChartData 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.GroupedVerticalBarChartData
Point
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.GroupedVerticalBarChartLine
DataPoint
100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HeatMapChartData 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartSeries 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartWithAxisD
ataPoint
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartWithAxisS
eries
100%
Microsoft.FluentUI.AspNetCore.Components.Charts.LineChartColorFillBar 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.LineChartLineOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.LineChartSeries 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.PolarAxisOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.PolarChartDataPoint 100% 50%
Microsoft.FluentUI.AspNetCore.Components.Charts.PolarChartSeries 100% 66.6%
Microsoft.FluentUI.AspNetCore.Components.Charts.PolarLineOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.SankeyChartData 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.SankeyChartNode 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.ScatterChartSeries 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.SparklineChartData 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.SparklineChartSeries 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.VerticalBarChartDataPoint 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.VerticalStackedBarChartData 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.VerticalStackedBarChartData
Point
100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.VerticalStackedBarChartLine
DataPoint
100%

{
LabelPosition = Components.LabelPosition.After;

MessageCondition = CreateRequiredMessageCondition(() => !Value);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

High — Default required conditions hide caller-supplied messages on Checkbox, Switch, and RadioGroup

The new constructor defaults in FluentCheckbox.razor.cs, FluentSwitch, and FluentRadioGroup replace the previous implicit Always condition. The shared condition also calls SetRequiredErrorMessage before checking whether the component is required, focused out, or empty in FluentInputBase.Validation.cs.

Consequently, a consumer-provided Message without a custom MessageCondition is no longer displayed and can be overwritten even when Required is false.

Suggested fix: preserve explicit message behavior. Compute the fallback required message only after the required predicate succeeds, and do not mutate a caller-supplied Message/MessageIcon.

size="@TextSize.Size200">

@CreateIcon(Parameters.MessageIcon)
@CreateIcon(Parameters.MessageIcon)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium — FluentField now suppresses all custom messages when validation errors exist

The new else in FluentField.razor prevents every MessageCondition message from rendering whenever the EditContext has a validation message. This also suppresses unrelated hints, warnings, and status messages. The generated required predicate already checks for validation messages, so the broad rendering-level suppression is unnecessary for avoiding duplicate required messages.

Suggested fix: keep custom message rendering independent. Suppress only the generated required fallback when an EditContext validation message exists.

{
return field =>
{
var fieldIdentifier = fieldIdentifierProvider?.Invoke() ?? FieldIdentifier;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium — Required metadata and validation-message lookup can target different fields

ValidationFieldExpression prefers ValidationFieldFor, but CreateRequiredMessageCondition defaults to the component's FieldIdentifier in FluentInputBase.Validation.cs. For wrappers where the text binding differs from the model field, required-attribute lookup and validation-message suppression can therefore inspect different properties, causing a generic message or duplicate feedback.

Suggested fix: derive one FieldIdentifier from ValidationFieldExpression and use it consistently for both metadata lookup and EditContext.GetValidationMessages.

/// Indicates whether the starship design has been validated.
/// </summary>
[Required]
[Required(ErrorMessage = "Validation is required")]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Medium — The new boolean Required annotations do not validate false

The added/updated [Required] attributes on non-nullable bool properties in Starship.cs always pass because a non-nullable Boolean is never null. The adjacent [Range(typeof(bool), "true", "true")] attributes perform the actual “must be true” validation, so the new RequiredAttribute.ErrorMessage cannot demonstrate the behavior this PR intends to showcase.

Suggested fix: remove [Required] from these Boolean properties and keep the enforcement/message on [Range], or use a nullable Boolean if null is the state being validated.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants