Skip to content

Commit 1f925d1

Browse files
csharpfritzCopilot
andauthored
feat: WingtipToys full feature migration EF Core, Cart, Checkout, Admin, Identity (#414)
* chore: bump version.json to 0.17 for next dev cycle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(wingtiptoys): add EF Core data foundation, models, and CartStateService - Add ProductContext with SQLite, seed 16 products + 5 categories - Add Order/OrderDetail models - Add CartStateService (scoped DI, replaces Session state) - Register all services in Program.cs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(wingtiptoys): wire product browsing, shopping cart, and error page - ProductList: EF Core data binding with category filter - ProductDetails: data-bound product display - MainLayout: dynamic category navigation - AddToCart: CartStateService integration + redirect - ShoppingCart: GridView data binding with update/remove - ErrorPage: error display wiring Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(wingtiptoys): implement checkout flow with mock PayPal - Add CheckoutStateService for checkout state management - Add MockPayPalService (IPayPalService interface) - Wire CheckoutStart: order creation + PayPal redirect - Wire CheckoutReview: order display + payment completion - Wire CheckoutComplete: transaction confirmation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(wingtiptoys): add CartItem primary key configuration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: update executive report with v2 metrics and screenshots - Update to reflect fully functional migration (31/33 pages working) - Add 6 new screenshots (home, products, details, cart, login, category filter) - Update metrics: ~11 hours actual, 16 BWFC components, EF Core + Identity - Add Phase 2 timeline (data foundation, browsing, cart, admin, auth, checkout) - Update remaining work table (most items now complete) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(ai-team): log M22 feature completion session, merge 4 decisions Session: 2026-03-03-milestone22-feature-completion Requested by: Jeff Fritz Changes: - Logged session to .ai-team/log/ - Merged 4 decision(s) from inbox into decisions.md - Propagated updates to agent history files - Summarized oversized history files (Cyclops, Forge, Rogue) - Consolidated overlapping ListView OrderedDictionary decision Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: restore side-by-side comparison screenshots in executive report Replace individual Blazor-only screenshots with paired Web Forms (left) vs Blazor (right) comparison images for home, products, and cart pages. Keep additional migrated pages (details, cars filter, login) in a supplementary table section. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: fix side-by-side comparison screenshots with matched zoom and data All comparisons now use identical 1280x900 viewport screenshots. Cart comparison shows same 3 items on both sides (.40 total). Updated executive report cart description. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 70feccc commit 1f925d1

78 files changed

Lines changed: 1358 additions & 429 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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,10 @@
9494
- Structured for non-technical readers: bottom-line callout, business value lead, tables for data, minimal jargon
9595
- Sections: What is BWFC, Migration Scope, Component Coverage, Three-Layer Pipeline, Time & Cost Impact, Layer 1 Results, Page Readiness, Risk Reduction, What's Next
9696

97+
98+
99+
Team update (2026-03-03): Themes (#369) implementation last ListView CRUD first, WingtipToys features second, themes last directed by Jeff Fritz
100+
101+
102+
Team update (2026-03-03): ListView EventArgs now include IOrderedDictionary properties (Keys, Values, OldValues, NewValues) for full Web Forms parity decided by Cyclops
103+

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,13 @@ Added 5 smoke tests (Timer, UpdatePanel, UpdateProgress, ScriptManager, Substitu
7171
- The ModelErrorMessage component renders nothing when no errors exist (conditional `@if`), so error-gone assertions use `CountAsync() == 0` rather than visibility checks.
7272
- For the Clear button test, used `WaitForSelectorAsync` with `State.Hidden` to reliably wait for Blazor re-render after clearing the EditContext.
7373
- `PressSequentiallyAsync` + `Tab` pattern used for Blazor Server InputText fields, consistent with established team conventions.
74+
75+
76+
Team update (2026-03-03): Themes (#369) implementation last ListView CRUD first, WingtipToys features second, themes last directed by Jeff Fritz
77+
78+
79+
Team update (2026-03-03): WingtipToys 7-phase feature schedule established 26 work items, critical path through Data Foundation Product Browsing Shopping Cart Checkout Polish decided by Forge
80+
81+
82+
Team update (2026-03-03): ListView CRUD test conventions established 43 tests, event ordering via List<string>, cancellation assertions, bUnit double-render handling decided by Rogue
83+

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

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -80,48 +80,15 @@ Team update (2026-02-28): GetCssClassOrNull() uses IsNullOrEmpty not IsNullOrWhi
8080
📌 Team update (2026-03-02): Skins & Themes roadmap — 3 waves, 15 WIs — decided by Forge
8181
📌 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.
8282
📌 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
83-
<!-- Summarized 2026-03-02 by Scribe -- covers M20 theming + release process -->
83+
<!-- Archived 2026-03-03 by Scribe M20 theming + release detail moved to summary above -->
8484

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

87-
**Issue #366 theme wiring:** Moved CascadingParameter ThemeConfiguration to BaseWebFormsComponent (named CascadedTheme to avoid Blazor duplicate-parameter error from _Imports.razor). ApplySkin renamed to ApplyThemeSkin (virtual override chain). ThemeProvider got @inherits ComponentBase to exclude from BaseWebFormsComponent inheritance. WebFormsPage cascades Theme ?? CascadedTheme. Lesson: _Imports.razor @inherits affects ALL .razor files including infrastructure components.
8886

89-
**FontInfo auto-sync:** Name and Names converted to backing-field properties with bidirectional sync (setting Name updates Names and vice versa). ApplyThemeSkin guard checks both Font.Name AND Font.Names before applying theme font. Root cause: ApplyThemeSkin set Font.Name but ToStyle() reads Font.Names. Lesson: paired/synced Web Forms properties must replicate sync behavior.
87+
Team update (2026-03-03): Themes (#369) implementation last ListView CRUD first, WingtipToys features second, themes last directed by Jeff Fritz
9088

91-
**Unified release.yml:** Single workflow on release:published coordinates NuGet + Docker + GHCR + docs + demos. Version from tag_name stripping v prefix. NuGet override: -p:PackageVersion + -p:Version. version.json changed to 3-segment SemVer (0.17.0). deploy-server-side.yml and nuget.yml refactored to workflow_dispatch-only. docs.yml fixed deprecated ::set-output. NBGV ignores git tags -- reads version.json only.
9289

93-
Team updates: Unified release process (PR #408), Skins & Themes roadmap (3 waves, 15 WIs).
90+
Team update (2026-03-03): WingtipToys 7-phase feature schedule established 26 work items, critical path through Data Foundation Product Browsing Shopping Cart Checkout Polish decided by Forge
9491

9592

96-
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
97-
### Issue #406 — ListView EditItemTemplate Not Rendering (2026-03-02)
98-
99-
- **Bug:** Clicking Edit in a ListView with EditItemTemplate fired the ItemEditing event and set EditIndex correctly, but the ListView did not visually swap from ItemTemplate to EditItemTemplate.
100-
- **Root cause:** The `<CascadingValue>` elements wrapping each item in the `foreach` loop lacked `@key` directives. Without `@key`, Blazor's positional diff algorithm could not reliably detect that a specific row's template changed from `ItemTemplate` to `EditItemTemplate` when `EditIndex` changed, because the surrounding structure (CascadingValue with same Name/Value shape) looked identical to the diff engine.
101-
- **Fix:** Added `@key="dataItemIndex"` to both `<CascadingValue>` elements in `ListView.razor` — the non-grouped rendering path (line 60) and the grouped rendering path (line 105). This forces Blazor to track each row by its data index, ensuring template swaps are detected and re-rendered.
102-
- **Lesson:** Always add `@key` to elements inside loops where the rendered content can change based on external state (like EditIndex, SelectedIndex). Without `@key`, Blazor's positional diffing may skip re-rendering rows where only the template selection changed but the data stayed the same. This applies to any data-bound component (GridView, DetailsView, etc.) that uses template switching inside iteration loops.
103-
104-
### Issue #406 — ListView EditItemTemplate Closure Bug (2026-03-01)
105-
106-
- **Root cause:** In `ListView.razor`, the template selection logic (`EditIndex >= 0 && dataItemIndex == EditIndex`) and even/odd toggle (`even = !even`) were inside `<CascadingValue>`'s ChildContent — a deferred RenderFragment. The `dataItemIndex` variable was declared outside the foreach loop and captured by the closure. Since CascadingValue components render their ChildContent AFTER the parent's BuildRenderTree completes, all closures saw the final loop value (item count) instead of the per-iteration value.
107-
- **Fix:** Moved template selection and even/odd toggle from inside the CascadingValue's ChildContent to before the CascadingValue element. These expressions now execute during BuildRenderTree when `dataItemIndex` has the correct per-iteration value. The resolved `currentTemplate` variable is captured correctly by the closure since it's a new local each iteration.
108-
- **Key files:** `src/BlazorWebFormsComponents/ListView.razor` (lines 57-61), `src/BlazorWebFormsComponents.Test/ListView/EditTemplateTests.razor`, `src/BlazorWebFormsComponents.Test/ListView/CrudEvents.razor`
109-
- **Pattern:** In Blazor Razor templates, NEVER reference loop-external mutable variables inside a component's ChildContent (CascadingValue, etc.). Either capture values in loop-local variables before the component, or evaluate expressions before the component tag. This applies to any `<Component>@{code using loop var}</Component>` pattern.
110-
- **Lesson:** `foreach` iteration variables are safe in closures (new per iteration since C# 5), but variables declared outside the loop body are shared across all closures. Blazor components defer ChildContent rendering, so loop-external variables will have their final values.
111-
112-
113-
Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge
114-
115-
Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge
116-
117-
### FormView RenderOuterTable Parameter (2026-03-02)
118-
119-
- **What:** Added `[Parameter] public bool RenderOuterTable { get; set; } = true;` to `FormView.razor.cs`. Updated `FormView.razor` to conditionally wrap content in `<table>` only when `RenderOuterTable` is true. When false, renders just the template content directly (no table, no header/footer rows, no pager — matching Web Forms behavior).
120-
- **Pattern:** Added the parameter in the code-behind file (`.razor.cs`) following existing parameter convention. Used `@if (RenderOuterTable)` / `else` branching in the `.razor` template to separate the two rendering paths. The `RenderOuterTable=false` path still calls `DataBinding`/`DataBound` and uses `CascadingValue` for the current item — only the table wrapper is removed.
121-
- **Why:** WingtipToys `ProductDetails.aspx` uses `RenderOuterTable="false"` to suppress the wrapping table. This was the only blocking gap for the WingtipToys migration. Default `true` preserves backward compatibility — all 29 existing FormView tests pass unchanged.
122-
123-
Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz
124-
Team update (2026-03-02): FormView RenderOuterTable implemented (default true, false suppresses table wrapper). Only blocking gap for WingtipToys resolved. decided by Cyclops
125-
126-
Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge
93+
Team update (2026-03-03): ListView CRUD test conventions established 43 tests, event ordering via List<string>, cancellation assertions, bUnit double-render handling decided by Rogue
12794

0 commit comments

Comments
 (0)