Skip to content

Commit 70feccc

Browse files
csharpfritzCopilot
andauthored
Milestone 22: WingtipToys Migration Tooling Pipeline (#413)
* chore: bump version.json to 0.17 for next dev cycle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add TDD tests for ListView EditItemTemplate rendering (Issue #406) Write 6 bUnit tests in EditTemplateTests.razor verifying EditItemTemplate renders when EditIndex matches item index. 2 pass (negative/null edge cases), 4 fail pre-fix confirming the template swap bug described in Issue #406. Tests cover: EditIndex parameter rendering, non-matching items still using ItemTemplate, default EditIndex=-1, HandleCommand edit/cancel template swap, and EditItemTemplate null fallback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix ListView EditItemTemplate not rendering when EditIndex changes (#406) The template selection logic and even/odd toggle were inside CascadingValue's ChildContent, which is a deferred RenderFragment. Variables like dataItemIndex captured by this closure had their final loop value (item count) instead of the per-iteration value when the CascadingValue rendered. Moved template selection and even/odd toggle before the CascadingValue so they execute during BuildRenderTree when dataItemIndex has the correct value per iteration. Also updated the CrudEvents test to assert actual template rendering instead of documenting the gap. Closes #406 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update Cyclops history and decision inbox for #406 fix Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix ListView EditItemTemplate not rendering on EditIndex change (#406) Add @key="dataItemIndex" to CascadingValue elements in ListView.razor's foreach loops (both non-grouped and grouped paths). Without @key, Blazor's positional diff did not detect template swaps when EditIndex changed because the CascadingValue structure looked identical to the diff engine. Closes #406 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): log M22 planning session, merge decisions Session: 2026-03-02-m22-planning-release Requested by: Jeffrey T. Fritz Changes: - Logged session to .ai-team/log/2026-03-02-m22-planning-release.md - Merged Forge M22 planning decision from inbox - Merged Cyclops ListView EditItemTemplate fix decision from inbox - Merged Rogue ListView EditTemplate TDD tests decision from inbox - Propagated M22 planning updates to agent histories Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): summarize oversized agent histories Session: 2026-03-02-m22-planning-release Requested by: Jeffrey T. Fritz Changes: - Summarized forge history.md (17KB > 10KB): M17 gate review through Themes roadmap - Summarized cyclops history.md (17KB > 12KB): M20 theming and release process - Summarized rogue history.md (13KB > 10KB): M20 theming and FontInfo tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Added WingtipToys * docs(ai-team): WingtipToys migration analysis session Session: 2026-03-02-wingtiptoys-migration-analysis Requested by: Jeffrey T. Fritz Changes: - Logged session to .ai-team/log/2026-03-02-wingtiptoys-migration-analysis.md - Merged Forge's migration plan from inbox into decisions.md - Propagated team update to agent history files Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): merge squad WingtipToys defaults from inbox Session: 2026-03-02-wingtiptoys-migration-analysis Requested by: Jeffrey T. Fritz Changes: - Merged squad-wingtiptoys-defaults.md from inbox into decisions.md - Deleted processed inbox file Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(FormView): Add RenderOuterTable parameter When RenderOuterTable=false, FormView renders template content directly without the wrapping <table> element, matching Web Forms behavior. Default is true for backward compatibility. Includes 8 new bUnit tests covering default, explicit true/false, empty data, edit mode, and structural equivalence scenarios. Closes the only blocking component gap for WingtipToys migration. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): FormView fix, migration strategy, project reframe Session: 2026-03-02-formview-migration-strategy Requested by: Jeffrey T. Fritz Changes: - Logged session: FormView RenderOuterTable fix + migration tooling strategy - Merged 3 decisions: user directive (migration tool focus), FormView RenderOuterTable impl, ASPX migration tooling strategy - Propagated team updates to affected agents Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(Validations): Add ModelErrorMessage component Add ModelErrorMessage component to close the last BWFC control gap. Matches ASP.NET Web Forms <asp:ModelErrorMessage> for zero-markup migration. - Inherits BaseStyledComponent (display-only, not a validator) - Reads errors from EditContext via string-keyed ModelStateKey - Renders <span> with error text when errors exist, nothing when clean - Supports CssClass, SetFocusOnError, AssociatedControlID - Strips BWFC validator metadata (\x1F encoding) from messages - HTML-encodes error messages for XSS safety - Multiple errors joined with <br> in single <span> - Added bwfc.Validation.SetFocus JS function to Basepage.js - 13 bUnit tests covering all edge cases (1464/1464 total passing) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ModelErrorMessage): Add docs, sample page, catalog entry - Created docs/ValidationControls/ModelErrorMessage.md with full docs - Created ModelErrorMessageSample.razor with EditForm demo - Added ComponentCatalog.cs entry in Validation section - Updated status.md: Validation Controls 7->8, TOTAL 51->52 - Updated mkdocs.yml nav with ModelErrorMessage page Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): M21 wrap-up session log, merge decisions Session: 2026-03-02-m21-wrapup Requested by: Jeffrey T. Fritz Changes: - Logged M21 wrap-up session (ModelErrorMessage component, docs, samples, tests) - Merged 2 decision inbox files (Beast docs, Forge spec) into decisions.md - Deduplicated decisions.md (5 exact dupes removed, 3 ModelErrorMessage blocks consolidated) - Propagated ModelErrorMessage decisions to Cyclops, Rogue, Beast, Jubilee, Forge histories Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test(ModelErrorMessage): Add smoke + interactive integration tests - Added InlineData smoke test in ControlSampleTests.cs - Added 3 Playwright interactive tests in InteractiveComponentTests.cs: - Submit empty form shows error spans - Valid submit shows no errors - Clear button removes errors - Uses WaitForSelectorAsync pattern for CI stability Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): merge Colossus integration test decision Session: 2026-03-02-m21-wrapup Requested by: Jeffrey T. Fritz Changes: - Merged Colossus integration test decision from inbox Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(migration): Add three-layer migration pipeline tooling - Add webforms-migration Copilot skill with complete transformation rules - Add bwfc-scan.ps1 project scanner (inventory + readiness scoring) - Add bwfc-migrate.ps1 mechanical transform script (~40% automation) - Add migration.agent.md interactive migration agent definition - Add AutomatedMigration.md MkDocs guide for the pipeline - Update mkdocs.yml navigation Three-layer pipeline: Script (40%) -> Skill (45%) -> Agent (15%) Verified: WingtipToys scans at 100% readiness, 230/230 controls covered Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): merge PR target directive Session: 2026-03-02-m22-migration-tooling Requested by: Jeffrey T. Fritz Changes: - Merged PR target directive from inbox Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): WingtipToys migration analysis session Session: 2026-03-02-wingtiptoys-migration-analysis Requested by: Jeffrey T. Fritz Changes: - Updated session log with PR #413, Layer 1-3 effectiveness metrics - Merged forge-wingtiptoys-migration-analysis.md from decisions inbox - Propagated cross-agent updates to Forge, Cyclops, Rogue - Summarized Forge history (21KB -> 8KB), Cyclops (15KB -> 11KB), Rogue (12KB -> 9KB) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): log executive report and screenshot session Session: 2026-03-02-executive-report-screenshots Requested by: Jeffrey T. Fritz Changes: - Logged session to .ai-team/log/2026-03-02-executive-report-screenshots.md - No inbox decisions to merge (inbox empty) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make AfterWingtipToys Blazor sample site buildable and renderable Convert the Layer 1 migration output of WingtipToys into a working Blazor site for screenshot demos. Key changes: - Create Blazor infrastructure: App.razor, Routes.razor, _Imports.razor, MainLayout.razor with Bootstrap 3 navbar and category menu - Create model classes: Product, Category, CartItem - Stub all code-behind files with ComponentBase (replacing System.Web types) - Add sample data to Default, ProductList, ShoppingCart, ProductDetails pages - Fix razor markup: replace Web Forms expressions with Blazor syntax - Simplify Account, Checkout, Admin pages to remove invalid references - Remove Site.Mobile.razor and ViewSwitcher.razor (not needed for demo) - Copy WingtipToys logo to wwwroot/Images - Build succeeds with 0 errors, 0 warnings Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: sync cart data, fix connection strings, add product images - Update AfterWingtipToys ShoppingCart with real product data matching original - Update WingtipToys Web.config LocalDB connection string: v11.0 -> MSSQLLocalDB - Add Directory.Build.props to block NBGV inheritance in WingtipToys - Add product images to AfterWingtipToys wwwroot - Update ProductList with proper data binding Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: add executive report with real side-by-side screenshots Both original Web Forms (IIS Express :5200) and migrated Blazor (Kestrel :5201) running simultaneously. Screenshots show Home, Products, and Shopping Cart comparisons from live applications. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: add actual migration timeline appendix to executive report Adds footnote on estimated effort and detailed appendix showing real Squad + BWFC timing: 4.5 hours wall clock for 33 files (analysis through running site), with 5 agents working in parallel. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: resolve 7 CSS/visual differences between original and migrated WingtipToys - Switch from CDN Bootstrap to local Bootswatch Cerulean theme (navbar color fix) - Restore GroupItemCount=4, GroupTemplate, LayoutTemplate to ProductList (4-column grid) - Fix BoundField.DataFormatString bug: pass obj directly instead of obj.ToString() - Add missing Trucks category (5 categories matching original) - Update to all 16 products with correct CategoryIDs from original seeder - Copy Site.css + Cerulean CSS to wwwroot/Content/ for static file serving - Add CSS fidelity analysis section to executive report Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: update screenshots after CSS fidelity fixes Fresh Playwright screenshots showing: - Blue Cerulean navbar (was dark gray) - 4-column product grid with 16 products (was single column, 8 products) - Dollar sign currency formatting on cart prices (was missing) - Updated side-by-side comparison PNGs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): CSS fixes session log and decision merge Session: 2026-03-03-css-fixes-screenshots Requested by: Jeff Fritz Changes: - Logged session to .ai-team/log/2026-03-03-css-fixes-screenshots.md - Merged 2 decisions from inbox into decisions.md (Cyclops WingtipToys build config, Forge CSS fidelity) - Propagated cross-agent updates to Cyclops and Forge history - Summarized Cyclops history.md (14.2KB -> 9.7KB) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 3e1b282 commit 70feccc

218 files changed

Lines changed: 45556 additions & 22 deletions

File tree

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
@@ -88,3 +88,9 @@
8888

8989
Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge
9090

91+
- **Executive Migration Report (`planning-docs/WINGTIPTOYS-MIGRATION-EXECUTIVE-REPORT.md`):**
92+
- Created executive migration report for manager audience
93+
- Key metrics: 96.6% control coverage, 55-70% time savings, 18-26 hour migration estimate
94+
- Structured for non-technical readers: bottom-line callout, business value lead, tables for data, minimal jargon
95+
- Sections: What is BWFC, Migration Scope, Component Coverage, Three-Layer Pipeline, Time & Cost Impact, Layer 1 Results, Page Readiness, Risk Reduction, What's Next
96+

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,27 @@ Team update (2026-02-27): UpdatePanel Triggers deliberately omitted decided by
5959
Team update (2026-02-28): GetCssClassOrNull() uses IsNullOrEmpty not IsNullOrWhiteSpace low priority noted by Rogue
6060
Team update (2026-03-01): Skins & Themes has dual docs SkinsAndThemes.md (practical guide, update first) and ThemesAndSkins.md (architecture). Update SkinsAndThemes.md first for API changes decided by Beast
6161

62+
<!-- Summarized 2026-03-03 by Scribe covers M20 theming through CSS fixes -->
63+
64+
### M20 Theming, Release & WingtipToys Context (2026-03-01 through 2026-03-03)
65+
66+
**Issue #366 theme wiring:** CascadingParameter ThemeConfiguration moved to BaseWebFormsComponent (named CascadedTheme). ApplySkin>ApplyThemeSkin (virtual override chain). ThemeProvider uses @inherits ComponentBase. WebFormsPage cascades Theme ?? CascadedTheme. Lesson: _Imports.razor @inherits affects ALL .razor files.
67+
68+
**FontInfo auto-sync:** Name/Names backing-field properties with bidirectional sync. ApplyThemeSkin guards both Font.Name AND Font.Names. Lesson: paired Web Forms properties must replicate sync behavior.
69+
70+
**Unified release.yml:** Single workflow on release:published. Version from tag_name. NuGet override: -p:PackageVersion + -p:Version. version.json 3-segment SemVer. deploy-server-side.yml/nuget.yml to workflow_dispatch-only.
71+
72+
**Issue #406 ListView EditItemTemplate:** (1) Closure bug: moved template selection before CascadingValue. (2) Diffing bug: added @key. Lessons: @key in loops with template switching; never reference loop-external mutable vars in ChildContent.
73+
74+
**FormView RenderOuterTable:** [Parameter] bool RenderOuterTable=true. When false, suppresses table wrapper/header/footer/pager. Driven by WingtipToys ProductDetails.aspx.
75+
76+
**Original WingtipToys build:** Connection strings v11.0 to MSSQLLocalDB. Empty Directory.Build.props blocks NBGV. `nuget install` for packages.config. IIS Express port 5200.
77+
78+
**CSS fixes screenshot refresh (2026-03-03):** 7 visual fixes applied (Cerulean theme, 4-column grid, BoundField currency, Trucks category, Site.css, category IDs). 6 screenshots updated. Lessons: Playwright blocks file:// -- serve via HTTP; verify visual requirements before capturing; detached dotnet run needs Get-NetTCPConnection for PID cleanup.
79+
80+
📌 Team update (2026-03-02): Skins & Themes roadmap — 3 waves, 15 WIs — decided by Forge
81+
📌 Team updates (2026-03-02): M22 planned (Forge), project reframed as migration system (Jeff), FormView RenderOuterTable resolved (Cyclops), ModelErrorMessage 29/29 coverage (Forge), WingtipToys pipeline validated — 28/29 controls covered.
82+
📌 Team update (2026-03-03): WingtipToys CSS fidelity — 7 visual differences identified requiring fixes (Cerulean theme, 4-column grid, BoundField bug, Trucks category, Site.css, category IDs) — decided by Forge
6283
<!-- Summarized 2026-03-02 by Scribe -- covers M20 theming + release process -->
6384

6485
### M20 Theming & Release Process Summary (2026-03-01 through 2026-03-02)

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

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,46 @@ Line-by-line classification: DataList (110 lines), GridView (33 lines), ListView
5757
Team updates: M17 audit fixes resolved (PR #402), Skins dual docs (SkinsAndThemes.md + ThemesAndSkins.md), Normalizer pipeline codified (Issue #387).
5858

5959

60-
### Summary: Build/Version/Release Process Audit (2026-03-02)
6160

62-
**By:** Forge
63-
**What:** Full audit of 7 CI/CD workflows, NBGV version management, and release coordination. Audit saved to `.ai-team/decisions/inbox/forge-version-release-audit.md`.
64-
65-
**Critical findings:**
66-
1. `version.json` on main says `0.15` but latest tag is `v0.16` — NBGV computes `0.15.X`, not `0.16.0`. Every artifact built from main has wrong version prefix.
67-
2. NuGet (tag-triggered), Docker (main-push-triggered), docs (main-push or tag), and demos (main-push) all fire independently with no version coordination.
68-
3. `docs.yml` uses deprecated `::set-output` and has a release-detection regex that never matches this project's 2-segment tags (`v0.16`). Docs only deploy on main push, never on tag.
69-
4. No GitHub Release automation — releases are created manually, not all tags have releases.
70-
5. Docker image version comes from `nbgv get-version` on runner which reads stale `version.json`, not the tag.
71-
72-
**Recommendation:**
73-
- Create unified `release.yml` triggered by GitHub Release `published` event. One trigger → NuGet + Docker + docs + demos, all with same version from tag.
74-
- Keep NBGV but use it correctly: version.json drives dev/CI versions, release workflow overrides with `-p:Version=${TAG}` for exact release version.
75-
- Standardize on 3-segment SemVer tags (`v0.17.0`).
76-
- Retire independent deployment triggers (nuget.yml tag trigger, deploy-server-side.yml main-push trigger).
77-
- Automate post-release version bump via PR to dev.
78-
- Fix docs.yml deprecated syntax and broken regex immediately.
61+
<!-- Summarized 2026-03-02 by Scribe -- covers Build/Release audit through WingtipToys pipeline validation -->
62+
63+
### Build/Release & M22 Migration Summary (2026-03-02)
64+
65+
**Build/Version/Release audit:** version.json on main said 0.15 vs latest tag v0.16. Unified release.yml implemented (PR #408) single workflow on release:published coordinates NuGet + Docker + docs + demos. NBGV 3.9.50, PackageId Fritz.BlazorWebFormsComponents, Docker ghcr.io/fritzandfriends/blazorwebformscomponents/serversidesamples. version.json now 0.17.0 (3-segment SemVer). Old nuget.yml/deploy-server-side.yml refactored to workflow_dispatch-only.
66+
67+
**M22 Copilot-Led Migration Showcase:** 12 work items, 4 waves. 57 controls (51 functional, 6 stubs). All 16 core demo controls ready. Use existing BeforeWebForms sample (6-8 pages). Separate .github/copilot-migration-instructions.md. Skins & AJAX Toolkit OUT. ListView EditItemTemplate bug (#406) IN.
68+
69+
**WingtipToys initial analysis:** 15+ pages, 22 controls, 100% BWFC coverage (all 4 "missing" controls already existed). Only blocking gap was FormView RenderOuterTable (resolved). Architecture: LayoutComponentBase, @page directives, EF Core + IDbContextFactory, scoped DI services, scaffolded Identity UI, HttpClient for PayPal, InteractiveServer. 36 work items, 5 phases.
70+
71+
**ASPX/ASCX tooling strategy:** 85+ syntax patterns from 33 WingtipToys files. Three-layer pipeline: Layer 1 (bwfc-migrate.ps1, ~40%, mechanical regex), Layer 2 (Copilot skill, ~45%, structural), Layer 3 (Copilot agent, ~15%, semantic). NOT building: standalone CLI, VS Code extension, Roslyn analyzer. SelectMethod->Items = #1 structural transform. Session->scoped DI = hardest semantic transform.
72+
73+
**ModelErrorMessage spec:** BaseStyledComponent (not BaseValidator). CascadingParameter EditContext. ModelStateKey->Field(key). Renders <span>, nothing when no error. Strips \x1F metadata. Validations/ folder. 29/29 WingtipToys coverage.
74+
75+
**WingtipToys pipeline validation (post-script):** Layer 1 ~70% markup: 147+ tag removals, 165+ runat removals, 35+ expression conversions. 18 data-binding expressions unconverted (<%#: inside GetRouteUrl/String.Format/Eval). 3 user-control prefixes survive. FormView RenderOuterTable working. ModelErrorMessage in 2 files. Actionable: (1) add <%#: regex, (2) strip uc:/friendlyUrls: prefixes, (3) SelectMethod->Items as #1 Layer 2 example, (4) Identity scaffold guidance. **18-26 hours total, 4-6 hours for demo subset.**
76+
77+
Team updates (2026-03-02): Unified release (PR #408), project reframed as migration acceleration system (Jeff), ModelErrorMessage docs (52 components, Beast), WingtipToys pipeline validated (4 ready, 21 skill, 8 architecture).
78+
79+
### WingtipToys CSS Fidelity Audit (2026-03-02)
80+
81+
**7 visual differences found** between original WingtipToys (:5200) and migrated Blazor (:5201):
82+
83+
1. **Navbar color (CRITICAL):** Original uses Bootswatch Cerulean v3.2.0 (`#033c73` dark blue navbar, `#ffffff` white link text). Migrated loads stock Bootstrap 3.4.1 from CDN (`#222222` dark gray navbar, `#999999` gray link text). Root cause: `App.razor` references CDN bootstrap instead of the custom `Content/bootstrap.css`. File: `samples/WingtipToys/WingtipToys/Content/bootstrap.css` line 1 = `bootswatch v3.2.0`, line 4177 = `background-color: #033c73`.
84+
85+
2. **Heading colors:** Bootswatch Cerulean sets `h1-h6 { color: #317eac }` (line 995). Stock Bootstrap uses `#333333`. Visible on "Welcome.", "Shopping Cart", "Products" headings.
86+
87+
3. **Link colors:** Cerulean: `a { color: #2fa4e7 }` (line 906). Stock Bootstrap 3.4.1: `#337ab7`. Affects category menu, product names, "Add To Cart" links.
88+
89+
4. **Product grid layout (CRITICAL):** Original `ProductList.aspx` uses `GroupItemCount="4"` + `GroupTemplate` + `LayoutTemplate` for 4-column grid. Migrated `ProductList.razor` omits all three — products render in single column. BWFC ListView supports GroupItemCount (lines 80-134 of `ListView.razor`), so this is a migration omission.
90+
91+
5. **Missing "Trucks" category:** Original has 5 categories (data-driven via ListView). `MainLayout.razor` hardcodes only 4 (Cars, Planes, Boats, Rockets — missing Trucks).
92+
93+
6. **Site.css not loaded:** `Content/Site.css` exists in migrated project but is not referenced in `App.razor`. Original bundles it via `Bundle.config`. Missing `body { padding-top: 50px }` and `.body-content` padding rules.
94+
95+
7. **BoundField DataFormatString bug:** `BoundField.razor.cs` line 48: `string.Format(DataFormatString, obj?.ToString())` converts obj to string BEFORE formatting, so `{0:c}` currency format is lost. Cart "Price (each)" shows "15.95" instead of "$15.95". Fix: use `obj` not `obj?.ToString()`.
96+
97+
**Key files:** Original CSS: `samples/WingtipToys/WingtipToys/Content/bootstrap.css` (Bootswatch Cerulean). Migrated layout: `samples/AfterWingtipToys/Components/App.razor` (CDN bootstrap ref). Migrated content: `samples/AfterWingtipToys/Components/Layout/MainLayout.razor`. BWFC bug: `src/BlazorWebFormsComponents/BoundField.razor.cs:48`.
7998

99+
Team update (2026-03-03): Original WingtipToys build/run config documented (LocalDB, NBGV isolation, NuGet restore, IIS Express port 5200) decided by Cyclops
80100
**Key infrastructure details learned:**
81101
- NBGV 3.9.50 in `Directory.Build.props`, applied to all projects
82102
- NuGet PackageId: `Fritz.BlazorWebFormsComponents`

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,17 @@
6969
Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge
7070

7171

72+
📌 Team update (2026-03-02): ModelErrorMessage documentation shipped — docs/ValidationControls/ModelErrorMessage.md, status.md updated to 52 components — decided by Beast
73+
74+
### M22 Executive Screenshot Comparison Pages (2026-03-02)
75+
76+
- **Created 3 HTML comparison pages** in `planning-docs/screenshots/` for Playwright screenshots at 1400×900:
77+
- `comparison-productlist.html` — ListView before/after (Web Forms → Blazor+BWFC)
78+
- `comparison-shoppingcart.html` — GridView, BoundField, TemplateField, TextBox, CheckBox, Label, Button
79+
- `comparison-login.html` — PlaceHolder, Literal, Label, TextBox, RequiredFieldValidator, CheckBox, Button, HyperLink
80+
- **Used dark theme** (#1e1e1e background) with red (`#f48771`) highlighting for removed Web Forms artifacts and green (`#89d185`) for new Blazor syntax.
81+
- **Highlighted key migration changes:** `asp:` prefix removal, `runat="server"` removal, `ItemType``TItem`, server binding expressions → `@context`, `ViewStateMode`/`EnableViewState` removal.
82+
- **Stats bar** at bottom of each page shows controls migrated, attributes preserved, and lines changed.
83+
- **Source files read:** ProductList.aspx, ShoppingCart.aspx, Account/Login.aspx and their AfterWingtipToys .razor counterparts.
7284
� Team update (2026-03-02): ModelErrorMessage documentation shipped docs/ValidationControls/ModelErrorMessage.md, status.md updated to 52 components decided by Beast
7385

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ Key patterns: Button=input, Label=span, Panel=div for theme tests. Missing SkinI
7676

7777
Team updates: Unified release process (PR #408), Skins & Themes roadmap (3 waves, 15 WIs).
7878

79+
80+
### ListView EditItemTemplate Tests (Issue #406, 2026-03-02)
81+
82+
6 bUnit tests in ListView/EditTemplateTests.razor: EditIndex matching/non-matching/negative, HandleCommand Edit/Cancel swap, null EditItemTemplate fallback. TDD: 2 pass (negative/null), 4 fail (the bug). CSS class selectors (span.display vs span.edit) for template identification. HandleCommand tests use cut.InvokeAsync() for Blazor dispatcher context.
83+
84+
### FormView RenderOuterTable Tests (2026-03-02)
85+
86+
8 bUnit tests in FormView/RenderOuterTable.razor: default/true/false rendering, template content, structural equivalence, empty data (text + template), edit mode. All pass. Compare element counts not raw Markup (Blazor generates unique event handler IDs per render). RenderOuterTable=false: no table/tr/td wrappers, empty data path also strips wrappers.
87+
88+
📌 Test patterns: (1) CSS class selectors for template switching tests. (2) cut.InvokeAsync for HandleCommand. (3) FindAll().Count for structural comparison, not ShouldBe on Markup.
89+
90+
📌 Team updates (2026-03-02): Skins roadmap (3 waves, 15 WIs, Forge), M22 planned (Forge), project reframed as migration system (Jeff), ModelErrorMessage 29/29 (Forge), WingtipToys pipeline validated — three-layer pipeline (Script→Skill→Agent), 18-26 hours total, scaffolded Identity UI for Account pages (Forge).
7991
Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge
8092
### ListView EditItemTemplate Rendering Tests (Issue #406)
8193

.ai-team/decisions.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5470,3 +5470,27 @@ Nothing is rendered (the component returns `null` / empty fragment). This matche
54705470
**By:** Colossus
54715471
**What:** Added 1 smoke test `[InlineData]` and 3 interactive tests for the ModelErrorMessage sample page (`/ControlSamples/ModelErrorMessage`). Smoke test added to `ValidationControl_Loads_WithoutErrors` Theory group. Interactive tests cover: submit-shows-errors, valid-submit-no-errors, and clear-button-removes-errors.
54725472
**Why:** Every sample page gets an integration test — no exceptions. The ModelErrorMessage component is a validation control that conditionally renders `<span class="text-danger">` elements, so tests verify both the error-present and error-absent states via DOM element counting. The Clear button test exercises the EditContext reset path, which is unique to this sample page.
5473+
5474+
### 2026-03-02: PR target repository directive
5475+
**By:** Jeffrey T. Fritz (via Copilot)
5476+
**What:** PRs should always target the upstream repository (FritzAndFriends/BlazorWebFormsComponents), not the fork (csharpfritz/BlazorWebFormsComponents). Use cross-fork PR format: head = csharpfritz:{branch}, base = dev on FritzAndFriends.
5477+
**Why:** User request captured for team memory
5478+
5479+
5480+
### 2026-03-02: WingtipToys Migration Analysis Results
5481+
**By:** Forge
5482+
**What:** Comprehensive page-by-page comparison of all 33 WingtipToys source files (.aspx/.ascx/.master) against their migrated Blazor equivalents (.razor). Layer 1 (bwfc-migrate.ps1) successfully handled ~70% of markup transforms: 147+ tag prefix removals, 165+ runat="server" removals, Content wrapper stripping, @page directive generation, ~35 expression conversions, ItemType→TItem conversion, comment syntax, and URL prefix conversion. 18 data-binding expressions remain unconverted (<%#: syntax), 8 SelectMethod attributes need Items/DataItem replacement, 3 GetRouteUrl calls need route interpolation, 3 user-control tag prefixes (uc:, friendlyUrls:) need stripping. BWFC has 100% control coverage for WingtipToys (28/29 controls exist; ContentPlaceHolder maps to @Body). 4 pages are fully ready, 21 need Layer 2 skill work, 8 need Layer 3 architecture (Identity, EF, Session, PayPal). Estimated total migration effort: 18-26 hours across all three layers.
5483+
**Why:** Jeff needs to understand the effectiveness of the three-layer migration pipeline (Script → Skill → Agent) before the M22 Copilot-Led Migration Showcase. This analysis validates that Layer 1 handles high-volume mechanical transforms effectively, Layer 2 covers structural patterns via the Copilot Skill, and Layer 3 architectural decisions are limited to auth/data/session/integrations. The pipeline is proven: a developer using all three layers could migrate WingtipToys to a running Blazor app in under a day. Key actionable findings: (1) Layer 1 should add regex for <%#: Item.X %> → @context.X conversion, (2) Layer 1 should strip user-control tag prefixes during Register directive removal, (3) Account pages should use scaffolded Identity UI rather than migrating OWIN code-behind, (4) SelectMethod→Items is the #1 most common Layer 2 transform.
5484+
5485+
5486+
### 2026-03-02: Original WingtipToys Build & Run Configuration
5487+
**By:** Cyclops
5488+
**Date:** 2026-03-02
5489+
**What:** Documented how to build and run the original WingtipToys ASP.NET Web Forms app locally. Connection strings changed from `(LocalDb)\v11.0` to `(LocalDb)\MSSQLLocalDB`. Created empty `samples/WingtipToys/Directory.Build.props` to block NBGV inheritance. Use `nuget install` for packages.config restore. IIS Express on port 5200.
5490+
**Why:** Machine-specific config needed for any dev running the original app for comparison screenshots. Changes confined to samples/WingtipToys/.
5491+
5492+
### 2026-03-02: WingtipToys CSS Fidelity 7 Visual Differences Identified
5493+
**By:** Forge
5494+
**Date:** 2026-03-02
5495+
**What:** Side-by-side comparison found 7 CSS/visual differences: (1) Wrong Bootstrap theme stock BS3 instead of Bootswatch Cerulean, (2) Single-column product grid instead of 4-column, (3) Missing Trucks category, (4) Site.css not referenced, (5) BoundField DataFormatString bug premature .ToString() loses numeric formatting, (6) bootstrap-theme.min.css adding unwanted gradients, (7) Cart prices missing dollar sign (symptom of #5). Fixes: replace CDN with local Cerulean CSS, add GroupItemCount/templates to ListView, add Trucks category, fix BoundField.razor.cs line 48.
5496+
**Why:** Migration showcase screenshots must visually match the original. The BoundField bug is a library-level defect affecting all DataFormatString consumers.

0 commit comments

Comments
 (0)