Skip to content

Commit 2626f18

Browse files
csharpfritzCopilotCopilot
authored
Milestone 8: Release Readiness (#344)
* Initial plan * Add Calendar component implementation with basic structure Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com> * Add unit tests for Calendar component - all 19 tests passing Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com> * Add Calendar sample page and documentation Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com> * Add Calendar sample page and documentation * Fix code review issues: safe substring and synchronous event handling Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com> * fix: refactor Calendar to use CalendarSelectionMode enum (#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 * samples: add demo pages for Calendar, FileUpload, ImageMap - 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 * docs: add documentation for Calendar, FileUpload, ImageMap, PageService * fix: restore .ai-team agent history and decisions lost in PR #338 merge The FileUpload PR (#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). * feat: add Copilot custom agent definitions in .github/agents/ 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. * fix: replace individual agent files with Squad coordinator agent 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. * docs(ai-team): log Sprint 2 completion 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 * Updated the squad * docs(ai-team): Sprint 3 planning session 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 * docs(ai-team): Sprint 3 execution complete 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%) * docs(ai-team): Milestone 4 planning - Chart component 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 * docs(ai-team): Summarize Forge history (13.2KB -> 4.3KB) 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 * feat: Milestone 6 — Feature Gap Closure (54 work items, ~345 gaps closed) 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 * fix: Menu JS interop crash, Calendar attribute rendering, Menu auto-ID generation - Add null safety and try/catch in Menu.js to prevent circuit crash - Fix Calendar.razor attribute rendering issue - Auto-generate Menu ID when not explicitly provided Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: update Cyclops history and decision inbox for M8 bug fixes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: formally defer Substitution/Xml, polish documentation - Mark Substitution and Xml as Deferred in status.md - Create DeferredControls.md with migration guidance - Fix mkdocs.yml nav issues - Update README component stats - Remove Chart hedging language Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: add shared PagerSettings sub-component for GridView/FormView/DetailsView - Add PagerButtons and PagerPosition enums - Add PagerSettings class with Web Forms-compatible properties - Add IPagerSettingsContainer interface - Add UiPagerSettings base component - Wire PagerSettings into GridView, FormView, and DetailsView - Follow existing style sub-component CascadingParameter pattern Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): M8 session log and decision merge Session: 2026-02-24-m8-release-readiness Requested by: Jeffrey T. Fritz Changes: - Logged M8 session to .ai-team/log/2026-02-24-m8-release-readiness.md - Merged 18 decisions from inbox (Menu auto-ID, Substitution/Xml deferral, M8 scope, PagerSettings, M7 plan, integration tests, TreeView, GridView, DataGrid, ListView, FormView, DetailsView, validators, Menu improvements, Playwright patterns, rendermode fix) - Propagated team updates to all 6 agent histories - Deduplicated decisions.md (0 exact heading duplicates found) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: bump version to 0.14 for Milestone 8 release Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: csharpfritz <78577+csharpfritz@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2ed384b commit 2626f18

47 files changed

Lines changed: 1009 additions & 594 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.ai-team/agents/beast/history.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,9 @@
5656
Team update (2026-02-23): Login controls now inherit BaseStyledComponent update docs for outer style support decided by Rogue, Cyclops
5757
Team update (2026-02-23): Milestone 6 Work Plan ratified 54 WIs, Beast assigned branding (UI-11) and docs (UI-12) decided by Forge
5858
Team update (2026-02-23): Menu Orientation requires Razor local variable workaround document this pattern decided by Jubilee
59+
60+
- **Milestone 8 release-readiness docs polish:** Formally deferred Substitution and Xml controls in `status.md` (changed from 🔴 Not Started to ⏸️ Deferred with rationale). Added Deferred column to summary table. Updated `docs/Migration/DeferredControls.md` to mark Chart as fully implemented (removed "Phase 1"/"Partial" hedging). Removed all "Phase 1"/"Phase 2/3" hedging from `docs/DataControls/Chart.md`. Fixed duplicate `DeferredControls.md` entry in `mkdocs.yml` and re-alphabetized Migration nav. Fixed broken `ImageMap` link in `README.md` (pointed to EditorControls, should be NavigationControls). Added missing doc links in README for MultiView, View, ChangePassword, CreateUserWizard. Marked Xml as deferred in README component list.
61+
62+
Team update (2026-02-24): Menu auto-ID pattern components with JS interop should auto-generate IDs decided by Cyclops
63+
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
64+
Team update (2026-02-24): PagerSettings shared sub-component created update docs when component stabilizes decided by Cyclops

.ai-team/agents/colossus/history.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@ Added 9 smoke tests and 9 interaction tests for M7 sample pages: GridView Select
3131
- For `<div>` containers with multiple `<strong>` labels (e.g., TreeView/Menu feedback panels), use `page.Locator("div").Filter(new() { HasTextString = "Target label:" }).Last` to match the specific container div.
3232
- When waiting for FormView to render its item template buttons, use a specific selector like `button:has-text('Edit')` instead of generic `button, input[type='submit']` — the latter matches sidebar/nav buttons that already exist, causing the wait to resolve prematurely before the FormView renders.
3333
- To avoid strict-mode violations when text appears in both rendered output AND code examples, target the specific rendered element (e.g., `page.Locator("td").Filter(new() { HasTextString = "Widget Catalog" }).First`) rather than using bare `text=` locators.
34+
35+
Team update (2026-02-24): Menu auto-ID pattern Menu now auto-generates IDs, JS interop crash fixed decided by Cyclops
36+
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz

.ai-team/agents/cyclops/history.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,12 @@ Audited 13 controls. Found: AccessKey/ToolTip missing from base class (universal
6363
Team update (2026-02-23): P2 test observation Login/ChangePassword/CreateUserWizard already inherit BaseStyledComponent, so WI-52 may have been a no-op or template-only change decided by Rogue
6464
Team update (2026-02-23): Milestone 6 Work Plan ratified 54 WIs across P0/P1/P2 tiers targeting ~345 feature gaps decided by Forge
6565
Team update (2026-02-23): UI overhaul requested ComponentCatalog (UI-2) and search (UI-8) assigned to Cyclops decided by Jeffrey T. Fritz
66+
67+
### Milestone 8 Release-Readiness Bug Fixes (2026-02-24)
68+
69+
- **Menu JS interop crash (Bug 1):** `Menu.js` `Sys.WebForms.Menu` constructor crashes when `getElement()` returns null (e.g., headless Chrome timing). Fixed by adding null guard after `getElement()` (early return if element missing) and wrapping entire constructor body in try/catch to prevent unhandled exceptions from killing the Blazor circuit. File: `src/BlazorWebFormsComponents/wwwroot/Menu/Menu.js`.
70+
- **Calendar attribute rendering (Bug 2):** `Calendar.razor` line 64 used raw Razor expression injection to conditionally add `scope="col"` to `<th>` tags. This caused `@(UseAccessibleHeader` to appear literally in server logs due to Razor parsing issues. Fixed by replacing with proper conditional attribute: `scope="@(UseAccessibleHeader ? "col" : null)"` -- Blazor omits the attribute entirely when value is null. File: `src/BlazorWebFormsComponents/Calendar.razor`.
71+
- **Menu auto-ID generation (Bug 3):** Menu JS interop requires a DOM element ID, but when no `ID` parameter is provided, it passes an empty string causing null element lookup. Fixed by adding `OnParametersSet` override in `Menu.razor.cs` that auto-generates `menu_{GetHashCode():x}` when ID is null/empty. File: `src/BlazorWebFormsComponents/Menu.razor.cs`.
72+
- **Shared PagerSettings sub-component:** Created `PagerSettings` class (plain C# POCO, not a Blazor component) with all 12 Web Forms PagerSettings properties (Mode, PageButtonCount, First/Last/Next/PreviousPageText, image URLs, Position, Visible). Created `PagerPosition` enum in `Enums/` (PagerButtons already existed). Created `IPagerSettingsContainer` interface in `Interfaces/`. Created `UiPagerSettings` abstract base component following the `UiTableItemStyle` CascadingParameter pattern but for settings instead of styles. Created 3 concrete sub-component pairs: `GridViewPagerSettings`, `FormViewPagerSettings`, `DetailsViewPagerSettings` — each inherits `UiPagerSettings` and uses `[CascadingParameter(Name = "ParentXxx")]` to set properties on the parent's `PagerSettings` instance. Wired into GridView, FormView, DetailsView: added `IPagerSettingsContainer` to each control's interface list, added `PagerSettings` property + `PagerSettingsContent` RenderFragment parameter, rendered `@PagerSettingsContent` inside existing `<CascadingValue>` block. Key files: `Enums/PagerPosition.cs`, `PagerSettings.cs`, `Interfaces/IPagerSettingsContainer.cs`, `UiPagerSettings.cs`, `GridViewPagerSettings.razor(.cs)`, `FormViewPagerSettings.razor(.cs)`, `DetailsViewPagerSettings.razor(.cs)`.
73+
Team update (2026-02-24): Substitution/Xml formally deferred no implementation needed decided by Beast
74+
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz

.ai-team/agents/forge/history.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,8 @@ Planned M7: "Control Depth & Navigation Overhaul" — 51 work items targeting ~1
8484
- Re-audit must open the milestone — all planning-docs/ files are stale (pre-M6 numbers)
8585

8686
📌 Team update (2026-02-23): Milestone 7 planned — 51 WIs, ~138 gaps, "Control Depth & Navigation Overhaul". P0: GridView completion + re-audit. P1: TreeView, Menu, DetailsView, FormView, Validators. P2: ListView CRUD, DataGrid, Menu levels. — decided by Forge
87+
88+
Team update (2026-02-24): Menu auto-ID pattern established components with JS interop should auto-generate IDs when none provided decided by Cyclops
89+
Team update (2026-02-24): Substitution/Xml formally deferred in status.md and README decided by Beast
90+
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
91+
Team update (2026-02-24): PagerSettings shared sub-component created for GridView/FormView/DetailsView decided by Cyclops

.ai-team/agents/jubilee/history.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,7 @@ Chart: 8 basic + 4 advanced sample pages (DataBinding, MultiSeries, Styling, Cha
3838
Team update (2026-02-23): Label AssociatedControlID switches rendered element (label vs span) decided by Cyclops
3939
Team update (2026-02-23): Milestone 6 Work Plan ratified 54 WIs across P0/P1/P2 tiers decided by Forge
4040
Team update (2026-02-23): UI overhaul requested Jubilee is frontend lead (UI-1,3,4,5,6,7,10) decided by Jeffrey T. Fritz
41+
42+
Team update (2026-02-24): Menu auto-ID pattern Menu now auto-generates IDs for JS interop decided by Cyclops
43+
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
44+
Team update (2026-02-24): PagerSettings shared sub-component created samples may need PagerSettings demos decided by Cyclops

.ai-team/agents/rogue/history.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ Wrote 44 bUnit tests for P0 base class changes: AccessKey (4), ToolTip (8), Imag
3030

3131
📌 Test pattern: BaseListControl.GetItems() applies DataTextFormatString to both static and data-bound items. AppendDataBoundItems=false replaces static items. When Items is null, static items always show. — Rogue
3232

33+
📌 Test pattern: Menu Orientation tests require JSInterop.Mode = JSRuntimeMode.Loose and @using BlazorWebFormsComponents.Enums. Login control tests require AuthenticationStateProvider and NavigationManager mock services. — Rogue
34+
35+
3336
📌 Test pattern: Menu Orientation tests require JSInterop.Mode = JSRuntimeMode.Loose and @using BlazorWebFormsComponents.Enums. Login control tests require AuthenticationStateProvider and NavigationManager mock services. — Rogue
3437

3538
Team update (2026-02-23): BaseDataBoundComponent now inherits BaseStyledComponent removed duplicate IStyle from 11 data controls decided by Cyclops
@@ -85,3 +88,6 @@ Wrote 41 bUnit tests across 6 new test files for P2 features:
8588
Team update (2026-02-23): CausesValidation/ValidationGroup added to CheckBox, RadioButton, TextBox decided by Cyclops
8689
Team update (2026-02-23): Label AssociatedControlID switches rendered element (label vs span) decided by Cyclops
8790
Team update (2026-02-23): Milestone 6 Work Plan ratified 54 WIs across P0/P1/P2 tiers decided by Forge
91+
92+
Team update (2026-02-24): M8 scope excludes version bump to 1.0 and release decided by Jeffrey T. Fritz
93+
Team update (2026-02-24): PagerSettings shared sub-component created may need bUnit tests decided by Cyclops

0 commit comments

Comments
 (0)