Skip to content

Comments

Milestone 6: Feature Gap Closure - 54 work items closing ~345 audit gaps#342

Merged
csharpfritz merged 23 commits intoFritzAndFriends:devfrom
csharpfritz:dev
Feb 23, 2026
Merged

Milestone 6: Feature Gap Closure - 54 work items closing ~345 audit gaps#342
csharpfritz merged 23 commits intoFritzAndFriends:devfrom
csharpfritz:dev

Conversation

@csharpfritz
Copy link
Collaborator

Milestone 6 Feature Gap Closure

Summary

Closes the highest-impact feature gaps identified in the 53-control audit. This milestone delivers 54 work items across 3 priority tiers, closing an estimated ~345 audit gaps and raising overall project health from ~68% to ~85%.

Files changed: 168 | +5,712 / -1,775 lines
Tests: 1,065 passing (0 failures)


P0 Base Class Fixes (~180 gaps closed)

WI Change Impact
WI-01 to WI-03 AccessKey on BaseWebFormsComponent ~40 gaps across all 53 controls
WI-04 to WI-06 ToolTip on BaseWebFormsComponent ~35 gaps across all controls
WI-07 to WI-09 DataBoundComponent inherits BaseStyledComponent ~70 gaps across 5+ data controls
WI-10 to WI-12 ValidatorDisplay enum + Display on BaseValidator 6 gaps + layout fidelity
WI-13/14 SetFocusOnError on BaseValidator 6 gaps
WI-15/16 Image base class to BaseStyledComponent 11 gaps
WI-17/18 Label base class to BaseStyledComponent 11 gaps

P1 Individual Control Improvements (~120 gaps closed)

  • GridView: Paging, Sorting, Row Editing (WI-19 to WI-27)
  • Calendar: 9 style sub-components + DayNameFormat/TitleFormat enums (WI-28 to WI-32)
  • FormView: HeaderText, FooterText, EmptyDataText/Template, CssClass (WI-33 to WI-35)
  • HyperLink: NavigationUrl renamed to NavigateUrl with backward compat (WI-36/37)
  • ValidationSummary: HeaderText, ShowSummary, ValidationGroup (WI-38 to WI-40)
  • PasswordRecovery: Re-audit (0% to 73.7%) (WI-41)
  • Docs: GridView, Calendar, FormView documentation (WI-42 to WI-44)
  • Integration Tests: Playwright tests for GridView pages (WI-45/46)

P2 Nice-to-Have (~45 gaps closed)

  • BaseListControl: DataTextFormatString + AppendDataBoundItems (WI-47/48)
  • CausesValidation: CheckBox, RadioButton, TextBox (WI-49)
  • Menu Orientation: Horizontal/Vertical enum (WI-50)
  • Label AssociatedControlID: Renders label-for for accessibility (WI-51)
  • Login controls: Changed to BaseStyledComponent (~30 gaps) (WI-52)
  • Tests + Samples: 32 bUnit tests + sample pages (WI-53/54)

Testing

  • Unit tests: 1,065 passing (0 failures, 0 skipped)
  • Build: 0 errors across library, test, and sample projects
  • Integration tests: Playwright tests for GridView Paging, Sorting, InlineEditing

Breaking Changes

  • HyperLink.NavigationUrl renamed to NavigateUrl (old forwarded via Obsolete)
  • Calendar string style properties marked Obsolete in favor of sub-components
  • AppendDataBoundItems defaults to false (matches Web Forms behavior)

Copilot AI and others added 23 commits February 9, 2026 17:08
Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>
Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>
Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>
Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com>
…ends#333)

- Create CalendarSelectionMode enum (None, Day, DayWeek, DayWeekMonth)
- Refactor Calendar.SelectionMode from string to CalendarSelectionMode enum
- Remove .GetAwaiter().GetResult() blocking call in CreateDayRenderArgs
- Add Caption, CaptionAlign, UseAccessibleHeader properties
- Update tests and samples to use enum values
- Calendar: date selection, selection modes, styling, day/title formats, events

- FileUpload: basic upload, file type filtering, multiple files, disabled, styled

- ImageMap: navigate/postback/mixed hot spot modes, rectangle/circle/polygon shapes

- Updated NavMenu and ComponentList with links to all three new components
…ents into dev

# Conflicts:
#	docs/EditorControls/FileUpload.md
…Friends#338 merge

The FileUpload PR (FritzAndFriends#338) inadvertently reverted Sprint 1 gate review
entries from agent histories (beast, cyclops, forge, jubilee, rogue)
and downgraded the FileUpload InputFile decision in decisions.md.

Restored from commit f85aa42 (docs(ai-team): Sprint 1 gate review results).
Creates .agent.md files for all 6 team agents (Beast, Cyclops, Forge,
Jubilee, Rogue, Scribe) so they appear in GitHub Copilot's agent picker.
Content sourced from existing .ai-team/agents/*/charter.md files.
Squad is the single Copilot agent that delegates to the specialized
agents defined in .ai-team/agents/. Individual agent files were
incorrectly created  the correct pattern is one coordinator agent
(squad.agent.md) that routes work to Forge, Cyclops, Beast, Jubilee,
Rogue, and Scribe based on task type.
Session: 2026-02-10-sprint2-complete
Requested by: Jeffrey T. Fritz

Changes:
- Logged Sprint 2 session (4 components shipped with docs, samples, tests)
- Merged Sprint 2 design review decision from inbox
- Removed duplicate FileUpload InputFile decision from inbox (already consolidated)
- Appended Sprint 2 completion decision to decisions.md
- Propagated cross-agent updates to all 5 agent histories
…ents into dev

# Conflicts:
#	docs/UtilityFeatures/PageService.md
#	samples/AfterBlazorServerSide/Components/Pages/ControlSamples/Calendar/Index.razor
Session: 2026-02-11-sprint3-planning
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-02-11-sprint3-planning.md
- Merged 3 decisions from inbox into decisions.md
- Updated status.md to reflect 48/53 components complete
- Sprint 3 scope: DetailsView + PasswordRecovery
- Propagated cross-agent updates to all agent history files
Session: 2026-02-12-sprint3-execution
Requested by: Jeffrey T. Fritz

Changes:
- Logged Sprint 3 execution session
- Merged 7 decisions from inbox into decisions.md
- Sprint 3 gate review: DetailsView + PasswordRecovery APPROVED
- Propagated cross-agent updates to Beast, Colossus, Cyclops, Rogue, Jubilee
- status.md updated to 50/53 (94%)
Session: 2026-02-12-milestone4-planning
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-02-12-milestone4-planning.md
- Merged decisions from inbox (Chart.js evaluation, milestone plan, milestones directive)
- Propagated milestone 4 updates to 5 agent history files
Session: 2026-02-12-milestone4-planning
Requested by: Scribe (automatic)

Changes:
- Summarized Forge history.md (exceeded ~12KB threshold)
- Preserved all team updates and key patterns
…sed)

Closes the highest-impact feature gaps from the 53-control audit.

P0 — Base class fixes (~180 gaps): AccessKey, ToolTip on all controls;
DataBoundComponent inherits BaseStyledComponent; ValidatorDisplay + SetFocusOnError;
Image/Label base class upgrades.

P1 — Control improvements (~120 gaps): GridView paging/sorting/row editing;
Calendar style sub-components + enums; FormView header/footer/empty data;
HyperLink NavigateUrl rename; ValidationSummary HeaderText/ShowSummary/ValidationGroup.

P2 — Nice-to-have (~45 gaps): DataTextFormatString + AppendDataBoundItems on
BaseListControl; CausesValidation on CheckBox/RadioButton/TextBox; Menu Orientation;
Label AssociatedControlID; Login controls base class upgrade.

168 files changed, +5,712 / -1,775 lines
1,065 tests passing, 0 failures
@code {
bool _validSubmit = false;
bool _invalidSubmit = false;
ForwardRef<InputBase<string>> NameRef = new ForwardRef<InputBase<string>>();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'NameRef' can be 'readonly'.

@code {
bool _invalidSubmit = false;
ForwardRef<InputBase<string>> Name = new ForwardRef<InputBase<string>>();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'Name' can be 'readonly'.
}

// Separate model/handler instances per test to avoid shared state
private ExampleModel exampleModel = new ExampleModel();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'exampleModel' can be 'readonly'.
private void HandleInvalidSubmit() { _invalidSubmit = true; }

private bool _invalidSubmit2 = false;
ForwardRef<InputBase<string>> Name2 = new ForwardRef<InputBase<string>>();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'Name2' can be 'readonly'.

private bool _invalidSubmit2 = false;
ForwardRef<InputBase<string>> Name2 = new ForwardRef<InputBase<string>>();
private ExampleModel exampleModel2 = new ExampleModel();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'exampleModel2' can be 'readonly'.
private void HandleInvalidSubmit2() { _invalidSubmit2 = true; }

private bool _invalidSubmit3 = false;
ForwardRef<InputBase<string>> Name3 = new ForwardRef<InputBase<string>>();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'Name3' can be 'readonly'.

private bool _invalidSubmit3 = false;
ForwardRef<InputBase<string>> Name3 = new ForwardRef<InputBase<string>>();
private ExampleModel exampleModel3 = new ExampleModel();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'exampleModel3' can be 'readonly'.
private void HandleInvalidSubmit3() { _invalidSubmit3 = true; }

private bool _invalidSubmit4 = false;
ForwardRef<InputBase<string>> Name4 = new ForwardRef<InputBase<string>>();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'Name4' can be 'readonly'.

private bool _invalidSubmit4 = false;
ForwardRef<InputBase<string>> Name4 = new ForwardRef<InputBase<string>>();
private ExampleModel exampleModel4 = new ExampleModel();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'exampleModel4' can be 'readonly'.
@code {
bool _validSubmit = false;
bool _invalidSubmit = false;
ForwardRef<InputBase<string>> NameRef = new ForwardRef<InputBase<string>>();

Check notice

Code scanning / CodeQL

Missed 'readonly' opportunity Note test

Field 'NameRef' can be 'readonly'.
@csharpfritz csharpfritz merged commit 311d744 into FritzAndFriends:dev Feb 23, 2026
4 checks passed
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.

2 participants