Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
91c92de
feat: Change Image and Label to inherit BaseStyledComponent (WI-15, W…
csharpfritz Feb 23, 2026
594f278
feat: Update sample pages for AccessKey, ToolTip, CssClass, and Displ…
csharpfritz Feb 23, 2026
2358039
docs: Update Jubilee history with Milestone 6 sample page learnings
csharpfritz Feb 23, 2026
0d5fd13
Milestone 6 Phase 1: P0 base class fixes closing ~180 audit gaps
csharpfritz Feb 23, 2026
4cae30e
Rename NavigationUrl to NavigateUrl on HyperLink component (WI-36)
csharpfritz Feb 23, 2026
7b8661e
Add HeaderText, ShowSummary, and ValidationGroup to ValidationSummary
csharpfritz Feb 23, 2026
b32f3d8
Add header, footer, and empty data support to FormView (WI-33)
csharpfritz Feb 23, 2026
26072c9
feat(Calendar): implement WI-28 and WI-31 - TableItemStyle sub-compon…
csharpfritz Feb 23, 2026
b1ce559
Add sorting support to GridView component (WI-22)
csharpfritz Feb 23, 2026
fa0c5da
Add ValidationSummary tests and HeaderText sample (WI-37, WI-39, WI-40)
csharpfritz Feb 23, 2026
0094d98
Add row editing support to GridView component (WI-25)
csharpfritz Feb 23, 2026
337af6d
Re-audit PasswordRecovery component (WI-41)
csharpfritz Feb 23, 2026
7c914a5
Add tests and samples for P1 features (WI-20/21/23/24/26/27/29/30/32/…
csharpfritz Feb 23, 2026
aab810a
Add Playwright integration tests for GridView Paging, Sorting, and In…
csharpfritz Feb 23, 2026
2387bd8
docs: update GridView, Calendar, and FormView documentation (WI-42, W…
csharpfritz Feb 23, 2026
064baef
feat: add CausesValidation/ValidationGroup to CheckBox, RadioButton, …
csharpfritz Feb 23, 2026
62c2a01
docs: update Cyclops history and decision inbox for WI-49, WI-50
csharpfritz Feb 23, 2026
eba69b7
feat: Milestone 6 Phase 4 P2 nice-to-have features (WI-47 to WI-54)
csharpfritz Feb 23, 2026
f6f461e
docs(ai-team): Log P2 session and merge decisions
csharpfritz Feb 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .ai-team/agents/beast/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,9 @@
Team update (2026-02-23): AccessKey/ToolTip must be added to BaseStyledComponent decided by Beast, Cyclops
Team update (2026-02-23): Chart implementation architecture consolidated (10 decisions) decided by Cyclops, Forge
Team update (2026-02-23): DetailsView/PasswordRecovery branch (sprint3) must be merged forward decided by Forge

Team update (2026-02-23): BaseListControl<TItem> introduced docs should reflect shared base for list controls decided by Cyclops
Team update (2026-02-23): Label AssociatedControlID switches rendered element document accessibility benefit decided by Cyclops
Team update (2026-02-23): Login controls now inherit BaseStyledComponent update docs for outer style support decided by Rogue, Cyclops
Team update (2026-02-23): Milestone 6 Work Plan ratified 54 WIs, Beast assigned branding (UI-11) and docs (UI-12) decided by Forge
Team update (2026-02-23): Menu Orientation requires Razor local variable workaround document this pattern decided by Jubilee
144 changes: 9 additions & 135 deletions .ai-team/agents/colossus/history.md
Original file line number Diff line number Diff line change
@@ -1,144 +1,18 @@
# Colossus — History

## 2026-02-10: Initial integration test audit
<!-- ⚠ Summarized 2026-02-23 by Scribe — original entries covered 2026-02-10 through 2026-02-12 -->

- Audited all 74 sample page routes against existing smoke tests
- Added 32 missing smoke test `[InlineData]` entries in `ControlSampleTests.cs`
- Added 4 interaction tests for Sprint 2 components (MultiView, ChangePassword, CreateUserWizard, Localize)
- Fixed Calendar sample page CS1503 errors (bare enum values → fully qualified `CalendarSelectionMode.X`)
## Summary: Milestones 1–3 Integration Tests (2026-02-10 through 2026-02-12)

## 2026-02-10: Sprint 3 — DetailsView and PasswordRecovery tests
Audited 74 sample routes, added 32 missing smoke tests. Added interaction tests for Sprint 2 (MultiView, ChangePassword, CreateUserWizard, Localize) and Sprint 3 (DetailsView paging/edit, PasswordRecovery 3-step flow). Fixed 7 pre-existing failures: missing `@using BlazorWebFormsComponents.LoginControls` on ChangePassword/CreateUserWizard, external placeholder URLs → local SVGs, duplicate ImageMap InlineData, Calendar console error filter, TreeView broken image path. 116 integration tests passing.

- Added smoke test `[InlineData("/ControlSamples/DetailsView")]` under Data Controls in `ControlSampleTests.cs`
- Added smoke test `[InlineData("/ControlSamples/PasswordRecovery")]` under Login Controls in `ControlSampleTests.cs`
- Added 3 interaction tests for DetailsView in `InteractiveComponentTests.cs`:
- `DetailsView_RendersTable_WithAutoGeneratedRows` — verifies table renders with field rows
- `DetailsView_Paging_ChangesRecord` — verifies pager links navigate between records
- `DetailsView_EditButton_SwitchesMode` — verifies Edit link switches to edit mode with Update/Cancel links
- Added 2 interaction tests for PasswordRecovery in `InteractiveComponentTests.cs`:
- `PasswordRecovery_Step1Form_RendersUsernameInput` — verifies Step 1 username input and submit button render
- `PasswordRecovery_UsernameSubmit_TransitionsToQuestionStep` — verifies username submission fires handler and transitions
- Build verified: 0 errors, 0 warnings
- Key learnings:
- DetailsView sample has 3 sections: auto-generated rows, paging (with `PageIndexChanged` counter), and edit mode (with `ModeChanging`/`ItemUpdating` status message)
- PasswordRecovery sample has 3 instances: default (with all 3 handlers), custom text, and help link. First instance has status message feedback via `_statusMessage`
- DetailsView renders as `<table>` with `<tr>` rows per field — consistent with Web Forms output
- PasswordRecovery Step 1 uses `input[type='text']` for username, button for submit
## Summary: Milestone 4 Chart + Utility Tests (2026-02-12)

📌 Team update (2026-02-12): Sprint 3 gate review — DetailsView and PasswordRecovery APPROVED. 50/53 components (94%). Library effectively feature-complete. — decided by Forge
Chart: 8 smoke tests + 11 canvas tests + 19 enhanced visual tests (dimensions, Chart.js initialization, multi-series datasets, canvas context). Used `WaitUntilState.DOMContentLoaded` for Chart tests. DataBinder + ViewState: 4 utility feature tests (Eval rendering, ViewState counter increment). Enhanced Chart tests use `BoundingBoxAsync()`, `page.EvaluateAsync<T>` for Chart.js internals, ±10px tolerance for dimensions. Total: 120 integration tests.

Team update (2026-02-12): Milestone 4 planned Chart component with Chart.js via JS interop. 8 work items, design review required before implementation. decided by Forge + Squad

## Learnings

### 2026-02-12: Milestone 4 — Chart integration tests (WI-7)

- Added 8 Chart smoke tests as a dedicated `ChartControl_Loads_AndRendersContent` Theory in `ControlSampleTests.cs`
- Follows the Menu pattern: separate Theory with its own verify method (`VerifyChartPageLoads`) that tolerates JS interop console errors but checks for page errors
- Routes: `/ControlSamples/Chart`, `Chart/Line`, `Chart/Bar`, `Chart/Pie`, `Chart/Area`, `Chart/Doughnut`, `Chart/Scatter`, `Chart/StackedColumn`
- Added 4 interactive tests in `InteractiveComponentTests.cs`:
- `Chart_DefaultPage_RendersCanvas` — verifies `<canvas>` on Column (default) page
- `Chart_LinePage_RendersCanvas` — verifies `<canvas>` on Line page
- `Chart_PiePage_RendersCanvas` — verifies `<canvas>` on Pie page
- `Chart_AllTypes_RenderCanvas` — Theory test covering all 8 routes for `<canvas>` element
- All 19 Chart tests pass (8 smoke + 3 individual canvas + 8 theory canvas)
- Used `WaitUntilState.DOMContentLoaded` instead of `NetworkIdle` for Chart tests — Chart.js JS interop can keep network busy
- Key learnings:
- Chart component renders `<div>` wrapping a `<canvas>` element (in `Chart.razor`), so `<canvas>` is always in the DOM even before Chart.js initializes
- Chart pages use JS interop (`ChartJsInterop.cs`) — console errors are expected if Chart.js CDN/bundle isn't fully loaded; page errors are not
- Pre-existing test suite has 97 failures on non-Chart tests due to ASP.NET structured log console errors (`[timestamp] Error:`) being caught by `Assert.Empty(consoleErrors)` — these are unrelated to Chart work


Team update (2026-02-23): DetailsView/PasswordRecovery branch (sprint3) must be merged forward decided by Forge
Team update (2026-02-23): AccessKey/ToolTip must be added to BaseStyledComponent decided by Beast, Cyclops
## 2026-02-12: Boy Scout rule — fixed 7 pre-existing integration test failures

Fixed all 7 failing integration tests. 111/111 passing after fixes.

### Failure 1 & 2: ChangePassword + CreateUserWizard form fields not found
- **Root cause:** The sample pages at `ChangePassword/Index.razor` and `CreateUserWizard/Index.razor` were MISSING `@using BlazorWebFormsComponents.LoginControls`. The components rendered as raw HTML custom elements (`<changepassword>`) instead of Blazor components. PasswordRecovery worked because it had the import.
- **Fix:** Added `@using BlazorWebFormsComponents.LoginControls` to both sample pages. Also updated test selectors from `input[type='password']` / `input[type='text']` to ID-based selectors (`input[id$='_CurrentPassword']`, etc.) with `WaitForAsync` for circuit establishment timing.

### Failure 3 & 4 & 7: Image, ImageMap external placeholder URLs unreachable
- **Root cause:** Sample pages referenced `https://via.placeholder.com/...` URLs which are unreachable in the test environment.
- **Fix:** Created 8 local SVG placeholder images in `wwwroot/img/` (placeholder-150x100.svg, placeholder-80x80.svg, etc.) and replaced all external URLs in both `Image/Index.razor` and `ImageMap/Index.razor`.

### Failure 4 (additional): ImageMap duplicate InlineData
- **Root cause:** ImageMap had entries in BOTH `EditorControl_Loads_WithoutErrors` and `NavigationControl_Loads_WithoutErrors`. Per team decisions, ImageMap is a Navigation Control.
- **Fix:** Removed `[InlineData("/ControlSamples/ImageMap")]` from EditorControl test theory.

### Failure 5: Calendar console errors
- **Root cause:** ASP.NET Core structured log messages (timestamps like `[2026-02-12T16:00:34.529...]`) forwarded to browser console as "error" level. Calendar component and sample page have NO bugs — these are benign framework messages from Blazor's SignalR circuit.
- **Fix:** Added regex filter in `VerifyPageLoadsWithoutErrors` to exclude messages matching `^\[\d{4}-\d{2}-\d{2}T` pattern.

### Failure 6: TreeView/Images broken image path
- **Root cause:** `ImageUrl="/img/C#.png"` but actual file is `CSharp.png`.
- **Fix:** Changed to `ImageUrl="/img/CSharp.png"`.

## Learnings

- **Missing @using is silent:** When a Blazor component can't be resolved, it renders as a raw HTML custom element with no error. This is extremely hard to catch without integration tests that verify actual DOM content.
- **LoginControls namespace:** Components in `BlazorWebFormsComponents.LoginControls` require an explicit `@using` — the root `@using BlazorWebFormsComponents` in `_Imports.razor` doesn't cover sub-namespaces. PasswordRecovery had it; ChangePassword and CreateUserWizard didn't.
- **ASP.NET Core log messages in browser console:** Blazor Server forwards structured log output to the browser console. These appear as "error" type messages starting with ISO 8601 timestamps. Tests must filter these to avoid false positives.
- **SVG placeholders:** Simple inline SVG files are ideal test-safe replacements for external placeholder image services. They're just XML text, always available, and don't require network access.

📌 Team update (2026-02-12): Boy scout fixes logged — 7 pre-existing integration test failures fixed, 111/111 integration tests + 797/797 bUnit tests all green. Commit a4d17f5 on sprint3/detailsview-passwordrecovery. — logged by Scribe

## 2026-02-12: DetailsView edit mode input textbox verification test

- Added `DetailsView_EditMode_RendersInputTextboxes` integration test in `InteractiveComponentTests.cs`
- Test verifies the full edit mode lifecycle:
1. Navigates to `/ControlSamples/DetailsView` and clicks the Edit link
2. Waits for "Mode changing" status message (Blazor Server DOM update)
3. Asserts at least 3 `<input type="text">` elements appear (CustomerID, FirstName, LastName, CompanyName fields)
4. Asserts Update and Cancel links are present via `GetByRole(AriaRole.Link, ...)`
5. Clicks Cancel and verifies return to ReadOnly mode — no text inputs remain
- This test catches the known bug where edit mode shows command row changes (Edit→Update/Cancel) but leaves field values as plain text instead of rendering `<input type="text">` textboxes
- Cyclops is fixing the component in parallel — this test will pass once the fix lands
- Key selector: `input[type='text']` works because the fix uses raw HTML `<input type="text">` not Blazor's `<InputText>` (which omits `type="text"` in .NET 10)

📌 Team update (2026-02-12): DetailsView auto-generated fields must render <input type="text"> in Edit/Insert mode — decided by Cyclops

## 2026-02-12: Sprint 3 missing integration tests — full interactive coverage

- Added 4 new integration tests in `InteractiveComponentTests.cs` for Sprint 3 components:
- `DetailsView_EmptyData_ShowsMessage` — verifies `EmptyDataText="No customers found."` renders when data source is empty. Uses `GetByRole(AriaRole.Cell)` to avoid matching code sample `<pre>` blocks.
- `PasswordRecovery_AnswerSubmit_TransitionsToSuccessStep` — full 3-step flow test: username → question → success. Uses ID-specific selectors (`#PasswordRecovery1_UserName`, `#PasswordRecovery1_Answer`, `#PasswordRecovery1_SubmitButton`) to target the first PasswordRecovery instance. Uses `PressSequentiallyAsync` + Tab for Blazor Server `InputText` binding on re-rendered DOM. Verifies "Recovery email sent successfully" status (the final status after both `OnVerifyingAnswer` and `OnSendingMail` handlers fire).
- `PasswordRecovery_HelpLink_Renders` — verifies the 3rd PasswordRecovery renders a help link `<a id="PasswordRecovery3_HelpLink">` with text "Need more help?" and correct href.
- `PasswordRecovery_CustomText_Applies` — verifies the 2nd PasswordRecovery renders custom `UserNameTitleText="Password Reset"` in a table cell and custom `UserNameLabelText="Email:"` in the label element.
- All 116 integration tests passing (112 existing + 4 new), 0 failures.
- Key learnings:
- Pages with code sample `<pre><code>` blocks cause strict mode violations when using `text=` locators — the same text appears in both the rendered component and the code sample. Use role-based or ID-based selectors instead.
- Pages with multiple PasswordRecovery instances require ID-specific selectors (`#PasswordRecovery1_SubmitButton`) not suffix selectors (`input[id$='_SubmitButton']`) to avoid strict mode violations.
- After a multi-step Blazor Server form flow, the final `_statusMessage` reflects the LAST handler that sets it. For PasswordRecovery step 2→3, `OnVerifyingAnswer` sets one message, then `OnSendingMail` overwrites it — test must assert on the final value.
- `PressSequentiallyAsync` + Tab blur works reliably for Blazor Server `InputText` binding on dynamically re-rendered DOM elements.

## 2026-02-12: DataBinder and ViewState utility feature integration tests

- Added smoke tests in `ControlSampleTests.cs`:
- New "Utility Features" theory section with `[InlineData("/ControlSamples/DataBinder")]` and `[InlineData("/ControlSamples/ViewState")]`
- Added 2 interaction tests in `InteractiveComponentTests.cs`:
- `DataBinder_Eval_RendersProductData` — verifies the DataBinder sample page renders product data ("Laptop Stand", "USB-C Hub", "Mechanical Keyboard") via Repeater with DataBinder.Eval(). Asserts at least 3 `<tbody tr>` rows present.
- `ViewState_Counter_IncrementsOnClick` — verifies the ViewState sample page's "Click Me (ViewState)" button increments a counter stored in ViewState. Clicks twice and verifies counter reaches 1 then 2.
- Build: 0 errors. All 120 integration tests passing (116 existing + 4 new), 0 failures.
- Key learnings:
- DataBinder sample uses `OnAfterRender(firstRender)` to call `DataBind()` on 4 Repeater instances — data only appears after first render, but NetworkIdle wait handles this.
- ViewState sample button text "Click Me (ViewState)" distinguishes it from the "Click Me (Property)" button in section 3. Used `GetByRole(AriaRole.Button, new() { Name = "Click Me (ViewState)" })` for precise targeting.
- Both pages include `<pre><code>` blocks with sample code — assertions use `page.ContentAsync()` for text presence rather than strict locators to avoid matching code samples vs rendered content where appropriate.
### 2026-02-12: Enhanced Chart visual appearance tests

- Added 5 stronger Chart tests in `InteractiveComponentTests.cs` to verify chart appearance:
- `Chart_RendersCanvas_WithDimensions` — verifies canvas has non-zero width/height via BoundingBox
- `Chart_AllTypes_HaveExpectedContainerDimensions` — Theory test verifying all 8 chart types have container dimensions matching ChartWidth/ChartHeight parameters (600x400 for most, 500x400 for Pie/Doughnut)
- `Chart_ChartJsLibrary_IsInitialized` — verifies Chart.js global is loaded and has at least one chart instance via `Chart.instances`
- `Chart_Line_MultipleSeries_RenderMultipleDatasets` — verifies Line chart's 2 series (NY/LA temps) produce 2 datasets via `Chart.instances[0].data.datasets.length`
- `Chart_AllTypes_CanvasHasRenderingContext` — Theory test verifying all 8 chart types have a 2D rendering context
- Total Chart tests: 38 (8 smoke + 11 basic canvas + 19 enhanced visual)
- Build: 0 errors, 0 warnings
- Test patterns:
- Use `LocatorWaitForOptions { State = WaitForSelectorState.Visible }` instead of `Expect()` (class doesn't inherit from `PageTest`)
- Use `page.EvaluateAsync<T>` to query Chart.js internals (`Chart.instances`, dataset counts, etc.)
- Use `BoundingBoxAsync()` to verify element dimensions
- Allow ±10px tolerance on dimension checks for border/padding differences
**Key patterns:** `LocatorWaitForOptions` instead of `Expect()` (no PageTest inheritance). `PressSequentiallyAsync` + Tab for Blazor Server InputText binding. ID-specific selectors for multi-instance pages. Filter ISO 8601 timestamps from console errors.

📌 Team update (2026-02-12): LoginControls sample pages MUST include `@using BlazorWebFormsComponents.LoginControls`. Never use external image URLs. — Colossus

Team update (2026-02-23): Milestone 6 Work Plan ratified 54 WIs across P0/P1/P2 tiers decided by Forge
Team update (2026-02-23): UI overhaul requested Colossus assigned integration tests (UI-9) decided by Jeffrey T. Fritz
Loading
Loading