Skip to content

feat: Event handler fidelity + LoginView/LoginStatus AuthorizeView redesign#421

Merged
csharpfritz merged 85 commits intoFritzAndFriends:mainfrom
csharpfritz:squad/event-handler-investigation
Mar 6, 2026
Merged

feat: Event handler fidelity + LoginView/LoginStatus AuthorizeView redesign#421
csharpfritz merged 85 commits intoFritzAndFriends:mainfrom
csharpfritz:squad/event-handler-investigation

Conversation

@csharpfritz
Copy link
Collaborator

Summary

This PR delivers two major improvements to BlazorWebFormsComponents that significantly smooth the Web Forms to Blazor migration path:

1. LoginView and LoginStatus AuthorizeView Redesign

Both login controls now delegate to Blazor's native AuthorizeView component instead of manually injecting AuthenticationStateProvider.

  • LoginView: Inherits BaseWebFormsComponent (no wrapper div), two-phase render with RoleGroups, delegates to AuthorizeView
  • LoginStatus: Wraps markup in AuthorizeView Authorized/NotAuthorized sections, removes manual auth injection, adds null guard on LoginPageUrl

2. P0 Event Handler Fidelity Fixes (7 issues)

Comprehensive audit of all EventCallback parameters compared against Web Forms 4.8 originals. All 7 blocking P0 issues resolved:

P0 Issue Resolution
P0-1 Repeater had 0 events Added ItemCommand, ItemCreated, ItemDataBound
P0-2 DataList missing 7/8 events Added 7 command/selection events + bare alias
P0-3 GridView missing RowDataBound Added with GridViewRowEventArgs
P0-4 GridView missing RowCreated Added (fires before RowDataBound per Web Forms)
P0-5 DetailsView missing ItemCreated Added ItemCreated/OnItemCreated
P0-6 FormView OnItemInserted wrong type Fixed to FormViewInsertedEventArgs
P0-7 SelectMethod fires only once Now re-fires on parameter changes

New EventArgs Classes

  • RepeaterCommandEventArgs, RepeaterItemEventArgs
  • DataListCommandEventArgs
  • GridViewRowEventArgs
  • FormViewInsertedEventArgs

Convention: EventCallback Aliases

All events have both bare name AND On-prefix as independent Parameter properties, supporting either RowDataBound or OnRowDataBound in migrated markup.

Test Coverage

  • 49 new bUnit tests for P0 event additions
  • 20 login control tests updated for AuthorizeView
  • All 1519 tests pass (0 failures)

Remaining Work (P1/P2 future PRs)

Full audit documented additional P1 and P2 improvements including Button OnClick type, Sender properties, async SelectMethod, and InsertMethod/UpdateMethod/DeleteMethod.

csharpfritz and others added 30 commits March 2, 2026 13:24
…ritzAndFriends#410)

- Fix ListView EditItemTemplate not rendering when EditIndex changes (FritzAndFriends#406)
- Add TDD tests for ListView EditItemTemplate rendering
- feat(FormView): Add RenderOuterTable parameter
- feat(Validations): Add ModelErrorMessage component with 13 bUnit tests
- docs(ModelErrorMessage): Add docs, sample page, catalog entry
- test(ModelErrorMessage): Add smoke + interactive integration tests
- WingtipToys migration analysis and planning
- AI team session logs and decision merges

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…#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 FritzAndFriends#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 FritzAndFriends#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 (FritzAndFriends#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 FritzAndFriends#406

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update Cyclops history and decision inbox for FritzAndFriends#406 fix

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix ListView EditItemTemplate not rendering on EditIndex change (FritzAndFriends#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 FritzAndFriends#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 FritzAndFriends#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>
…in, Identity (FritzAndFriends#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>
…s#415)

* chore: bump version.json to 0.17 for next dev cycle

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(listview): implement 16 CRUD events (FritzAndFriends#356)

Fix two Web Forms lifecycle deviations:
- ItemCreated: changed from EventCallback firing once on first render to
  EventCallback<ListViewItemEventArgs> firing per-item before ItemDataBound
- ItemCommand: now fires for ALL commands before routing to specific handlers,
  matching Web Forms behavior where ItemCommand always fires first

All 16 events verified: ItemInserting/Inserted, ItemUpdating/Updated,
ItemDeleting/Deleted, ItemEditing, ItemCanceling, Sorting/Sorted,
PagePropertiesChanging/Changed, LayoutCreated, SelectedIndexChanging/Changed,
ItemCreated, DataBound. All 43 ListView tests pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: add migration toolkit (6 priority documents)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): log ListView/toolkit session

Session: 2026-03-03-listview-crud-and-toolkit
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-03-listview-crud-and-toolkit.md
- Decisions already merged from inbox (prior session)
- Cross-agent updates already propagated (prior session)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: add distributable BWFC migration skill for Copilot

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update Beast history and add decision record for bwfc-migration skill

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: split migration skill into 3 focused skills

Refactor the monolithic bwfc-migration skill (852 lines) into three
focused skills optimized for Copilot context efficiency:

- bwfc-migration (436 lines): Core markup migration  controls,
  expressions, directives, code-behind, layouts. Used per-page.
- bwfc-identity-migration (270 lines): ASP.NET Identity/Membership
  to Blazor Identity. One-time architectural concern.
- bwfc-data-migration (381 lines): EF6 to EF Core, DataSource to
  services, Session to scoped services, architecture decisions.

Each skill cross-references the others in its description and body.
Skills are designed to be portable  drop into any project's
.github/skills/ folder to enable Web Forms migration with BWFC.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): log ListView/toolkit session and merge decisions

Session: 2026-03-03-listview-crud-and-toolkit
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged decision inbox files into decisions.md
- Consolidated overlapping migration toolkit delivery format decisions

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* refactor: move distributable skills and scripts into migration-toolkit/

Per Jeff's directive: distributable migration assets belong in
migration-toolkit/, not .github/skills/. Internal project skills
remain in .github/skills/.

- Moved 3 BWFC migration skills to migration-toolkit/skills/
- Copied 2 PowerShell scripts to migration-toolkit/scripts/
- Updated migration-toolkit/README.md with new structure

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update Forge history and decision record for toolkit restructure

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tzAndFriends#416)

* docs: fix component count and internal references in toolkit

- Updated component count from 52 to 58 across 6 categories (not 7)
- Added Chart, ImageMap, and Substitution to Editor Controls coverage table
- Replaced all internal repo references (../.github/skills/, ../.github/agents/)
  with distributed toolkit paths (skills/bwfc-migration/, skills/bwfc-data-migration/)
- Fixed wrong org name (AzimoLabs -> FritzAndFriends) in URLs
- Toolkit docs now accurate for external distribution

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: create migration test run structure and template

Establishes docs/migration-tests/ as the standard location for
migration benchmark reports with per-run subfolders.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* benchmark: Layer 1 scan and migrate for WingtipToys

Ran bwfc-scan.ps1 and bwfc-migrate.ps1 against original WingtipToys
Web Forms source. Captured timing and output for benchmark report.

Scan: 0.9s, 32 files, 230 controls, 100% BWFC coverage
Migrate: 2.4s, 276 transforms, 33 razor files + 32 code-behind
Build: 338 errors (expected - code-behind needs Layer 2)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* benchmark: Layer 2+3 migration for WingtipToys

Completed structural and architectural migration of FreshWingtipToys
using BWFC migration skills. Captured timing for each phase.

- Phase 1 (Data infrastructure): 121s - models, services, EF Core, DI
- Phase 2 (Core storefront): 136s - 8 pages migrated
- Phase 3 (Checkout + Admin): 187s - 6 pages migrated
- Phase 4 (Layout): 20s - MainLayout, App, Routes
- Phase 5 (Build fix): 99s - 3 rounds to clean build
- Total: ~563s (~9.4 min) for Layer 2+3
- Build result: 0 errors, 0 warnings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: update Cyclops history and decision doc for Layer 2+3 benchmark

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* benchmark: verification screenshots and runtime fixes

- Move static assets to wwwroot/ for proper Blazor static file serving
- Copy product images from Catalog/Images to wwwroot/Images/Products/
- Fix CartStateService to use cookie-based cart ID (persists across circuits)
- Add 6 verification screenshots: homepage, products, details, cart, category, login
- Update benchmark report with full Layer 1-3 details, architecture table, screenshots

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: correct benchmark report verification accuracy

Update report to distinguish page-load verification from functional testing.
Add Known Issues section for cart, login, and register interactive features.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix shopping cart, login, and register in FreshWingtipToys

Issue 1 - Shopping Cart: TextBox component was missing @onchange handler,
so TextChanged/OnTextChanged callbacks never fired. Added HandleChange
method to TextBox.razor.cs that updates Text, triggers validation, and
invokes both TextChanged and OnTextChanged callbacks. Wired @onchange
to both <input> and <textarea> elements in TextBox.razor.

Issue 2 - Login: SignInManager.PasswordSignInAsync cannot set cookies
from a SignalR circuit (InteractiveServer mode). Replaced direct
SignInManager call with navigation to a minimal API endpoint
(/Account/PerformLogin) that runs in HTTP context where cookies work.

Issue 3 - Register: Same SignalR cookie limitation. UserManager.CreateAsync
works fine in SignalR (no cookies), but SignInManager.SignInAsync does not.
After user creation, redirect to /Account/PerformRegisterSignIn endpoint
that validates credentials and sets the auth cookie via HTTP.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
FritzAndFriends#417)

- Remove leftover LogError debug spam from UiStyle.cs that caused false
  console errors in Playwright tests
- Add side-by-side visual comparison screenshots to benchmark report
- Update migration tests README status to Complete

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tzAndFriends#418)

* fix: await async OnClick handlers and prevent TextBox value loss

ButtonBaseComponent.Click() was void and didn't await InvokeAsync(),
causing async OnClick/OnCommand handlers to fire-and-forget. Exceptions
were silently swallowed and StateHasChanged never ran after completion.
This broke Shopping Cart update, Login, and Register in Blazor Server.

TextBox used only @onchange (blur-triggered), so when one field's
TextChanged callback triggered a re-render, downstream fields had their
typed values overwritten by the server-side empty state. Added @oninput
handler for internal Text sync while preserving @onchange for TextChanged
(Web Forms blur-triggered semantics).

Also fixed ImageButton to use EventCallback instead of Action for the
onclick handler, ensuring async Click() is properly awaited.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: static assets, logout endpoint, and migration tooling updates

- Program.cs: UseStaticFiles() -> MapStaticAssets() for _framework/blazor.web.js
- Program.cs: Add /Account/PerformLogout POST endpoint for SignInManager
- MainLayout.razor: Logout form targets /Account/PerformLogout with data-enhance=false
- Add Properties/launchSettings.json for Development environment
- bwfc-migrate.ps1: Generate MapStaticAssets() + launchSettings.json in scaffold
- SKILL.md: Add static assets, launchSettings, and Identity auth migration guidance

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: WingtipToys migration benchmark Run 2  11/11 features PASS

Full migration benchmark with updated tooling:
- Layer 1 scan+migrate: 5.6s (32 files, 277 transforms)
- Build: 7.3s (0 errors)
- 11/11 features verified with Playwright
- 6 page screenshots captured
- Executive summary report with timing and comparisons

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Log migration Run 2 session, merge decisions

Session: 2026-03-04-migration-run2
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-04-migration-run2.md
- Merged 7 decisions from inbox into decisions.md
- Consolidated overlapping toolkit decisions (346+350)
- Propagated cross-agent updates to all 6 agent history files
- Summarized Beast, Cyclops, Forge history.md (exceeded 12KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: WingtipToys full from-scratch migration regression Run 3

Complete from-scratch migration regression of WingtipToys (32 files,
230 controls) using the BWFC migration toolkit. Unlike Run 2 which
copied Layer 2 from FreshWingtipToys, Run 3 writes all models,
services, layout, identity pages, and storefront pages from scratch
based on original Web Forms source.

Results: 11/11 features PASS (identical to Run 2)
- Home page, product categories, product list, product details
- Add to cart, shopping cart (view/update/remove)
- Register, login, logout

Build: 0 errors, 63 warnings (all in BWFC library)
Layer 1 (automated): 3.7s scan+migrate
Layer 3 (build): 11.9s

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Log migration Run 3 session

Session: 2026-03-04-migration-run3
Requested by: Jeffrey T. Fritz

* docs: correct unconverted patterns  DataBinder/Eval already supported

Run 2 and Run 3 reports incorrectly listed Eval with format strings as
unconverted patterns requiring Layer 2. BWFC's DataBinder.Eval fully
supports format strings, and the migration script already converts
single-arg Eval. Updated both reports to distinguish:
- Patterns already covered by BWFC (Eval with/without format strings)
- Patterns that truly need Layer 2 (String.Format, GetRouteUrl, code blocks)

Added decision proposal for enhancing bwfc-migrate.ps1 with two
additional regex transforms for format-string Eval and simple
String.Format patterns.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Log DataBinder correction, merge Eval regex decision

Session: 2026-03-04-databinder-correction
Requested by: Jeffrey T. Fritz

Changes:
- Logged DataBinder correction session
- Merged eval-regex-enhancement decision from inbox
- Propagated decision update to Cyclops history
- No duplicates found in decisions.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: enhance bwfc-migrate.ps1 with master page transforms and Eval regexes

Add ConvertFrom-MasterPage function that handles .master-specific transforms:
- Inject @inherits LayoutComponentBase
- Strip document wrapper (DOCTYPE, html, head, body)
- Extract head metadata into HeadContent block
- Remove ScriptManager block entirely
- Replace ContentPlaceHolder MainContent with @Body
- Remap output path to Components/Layout/MainLayout.razor
- Flag LoginView and SelectMethod for Layer 2 attention

Add New-AppRazorScaffold function generating App.razor and Routes.razor.

Add two new expression regexes in ConvertFrom-Expressions:
- Eval with format string: Eval("prop", "{0:C}") -> @context.prop.ToString("C")
- String.Format with Item: String.Format("{0:c}", Item.Prop) -> interpolated

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Log master page script session, merge decisions

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: WingtipToys migration Run 4 with master page + Eval enhancements

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* chore: update Forge history and decisions with Run 4 results

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Log migration Run 4 session, merge decisions

Session: 2026-03-04-migration-run4
Requested by: Jeffrey T. Fritz

Changes:
- Logged Forge migration Run 4 (289 transforms, 0 errors, 11/11 PASS)
- Merged inbox decision: forge-run4-results.md into decisions.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: fix Run 4 report image links and enhance executive summary

- Fix Original Web Forms screenshot paths (../../ -> ../../../) to correctly
  resolve from docs/migration-tests/wingtiptoys-run4-2026-03-04/ to repo root
- Enhance Section 1 executive summary with run-time metrics (~3s script,
  12.32s build), success metrics (289 transforms, 0 errors, 11/11 pass),
  Run 3 comparisons, and quick-reference metrics table

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: complete GetRouteUrl RouteValueDictionary overloads

The two RouteValueDictionary overloads were stubbed (returning null).
Now delegate to LinkGenerator.GetPathByRouteValues like the
object overloads.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): log GetRouteUrl completion and report fixes session

Session: 2026-03-04-getrouteurl-and-report-fixes
Requested by: Jeff Fritz

Changes:
- logged session to .ai-team/log/2026-03-04-getrouteurl-and-report-fixes.md
- merged 2 decision(s) from inbox into decisions.md
- propagated updates to affected agent history files (beast, cyclops, forge, colossus)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ganization (FritzAndFriends#419)

* Organize planning-docs into subdirectories

Move 75 files into categorized subdirectories while preserving git history:
- components/  53 per-component analysis docs
- milestones/  11 milestone plans, audits, and post-fix reports
- analysis/  9 cross-cutting analysis docs
- reports/  1 executive report

Update README.md to serve as index/table of contents for the new structure.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: migration script enhancements + integration test gaps

Script enhancements (bwfc-migrate.ps1):
- ConvertFrom-LoginView: auto-converts LoginView to AuthorizeView
  (AnonymousTemplateNotAuthorized, LoggedInTemplateAuthorized)
- ConvertFrom-GetRouteUrl: converts Page.GetRouteUrl calls to
  BWFC GetRouteUrlHelper pattern with Evalcontext translation
- ConvertFrom-SelectMethod: strips SelectMethod attributes and
  inserts TODO-annotated DI service injection guidance

Integration tests (6 new entries):
- CheckBoxList, DataPager, ImageButton, ListBox, LoginView, Theming
  added to ControlSampleTests.cs with matching interactive tests

Housekeeping:
- .gitignore: exclude samples/FreshWingtipToys/ and feasibility doc
- Capture directive about excluded scratch artifacts

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): capture PR target directive

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): session log and inbox merge for 2026-03-04 milestone work

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: script easy wins  bare Item binding, Register cleanup, uc: prefix

- Add bare <%#: Item %>  @context regex (fixes 3 OpenAuthProviders items)
- Improve Register directive messaging (less alarming flagging)
- Strip uc:/uc1:/uc2: tag prefixes alongside asp: (fixes 1 item)

Combined with PR FritzAndFriends#419's LoginView/GetRouteUrl/SelectMethod, this reduces
WingtipToys Run 4 manual items from 18  ~10 (44% reduction).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): session log and decision merge for Run 5 migration

Session: 2026-03-04-run5-migration
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 5 migration session (309 transforms, clean build)
- Merged decisions from inbox (Cyclops run5-migration, Beast run5-report)
- Propagated cross-agent updates to Cyclops and Beast
- Summarized oversized Cyclops and Forge history.md entries

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Run 5 WingtipToys migration benchmark with enhanced toolkit

- Fresh WingtipToys migration: 3.25s script (309 transforms, 32 files) + clean build (0 errors, 4.56s)
- Comprehensive 9-section benchmark report with Run 4 vs Run 5 comparison
- BWFC capability analysis: 95+ EventCallbacks, component coverage assessment
- Migration standards skill: .NET 10 target, EF Core, ASP.NET Core Identity, event handler mapping
- Synced migration-toolkit/ as canonical home: enhanced script (47KB, 1164 lines), skills, README
- Updated AfterWingtipToys sample with fresh migration output (~80 files)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): migration standards directives and session log

Session: 2026-03-04-migration-standards
Requested by: Jeffrey T. Fritz

Changes:
- Logged migration standards session
- Merged migration standards and toolkit canonical directives
- Merged Forge Run 5 analysis decisions
- Consolidated toolkit canonical decision with earlier restructure
- Propagated cross-agent updates to Forge, Cyclops, Beast
- Summarized Forge and Cyclops histories (both over 12KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Run 6 improvement analysis session

Session: 2026-03-04-run6-analysis
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-04-run6-analysis.md
- Merged Forge's Run 6 improvement decisions from inbox
- Consolidated overlapping BWFC migration standards + Run 6 enhancements
- Propagated updates to affected agent history files (cyclops, beast, rogue, forge)
- Archived Forge history entries older than 2 weeks to history-archive.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(migration): implement Run 6 top-4 script enhancements

1. Scaffold TFM: net8.0  net10.0, _Imports.razor adds RenderMode using + @rendermode InteractiveServer
2. SelectMethod TODO: BWFC-aware guidance (use Items parameter, OnInitializedAsync)
3. Static files: copy to wwwroot/ subdirectory instead of project root
4. Compilable stubs: detect Identity/Auth/Payment pages and emit @page/@code stubs

Saves ~205s of manual fix time per migration run.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Run 6 script implementation session

Session: 2026-03-04-run6-implementation
Requested by: Jeffrey T. Fritz

Changes:
- Logged Cyclops implementation session
- Merged Cyclops script enhancement decisions from inbox

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): Run 6 benchmark session

Session: 2026-03-04-run6-benchmark
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 6 migration benchmark session
- Merged Forge Run 6 benchmark decisions from inbox
- Propagated updates to affected agent histories
- Summarized Forge and Cyclops histories (exceeded ~12KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Run 6 WingtipToys migration benchmark  55% time reduction

Layer 1 (script): 4.58s, 269 transforms, 79 static files to wwwroot/
Layer 2 (manual): ~3 min 25s  EF Core models, services, page wiring
Total: ~4 min 30s (down from ~10 min in Run 5)

All 4 enhancements validated:
- net10.0 TFM scaffolding (eliminated build fix round)
- BWFC-aware SelectMethod TODO (highest impact  preserved data controls)
- wwwroot static file pathing (eliminated manual asset relocation)
- Compilable stub auto-generation (6 pages auto-stubbed)

2 script bugs found:
- @rendermode in _Imports.razor invalid in .NET 10
- Stub detection misses code-behind-only Identity references

Final build: 0 errors, 0 warnings on net10.0

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: correct @rendermode placement in migration skills and standards

Document that @rendermode is a directive attribute on component instances
(Routes, HeadOutlet in App.razor), not a standalone directive in _Imports.razor.

- migration-standards/SKILL.md: new Render Mode Placement subsection
- bwfc-migration/SKILL.md: Step 2 adds @using static, new Step 2b for App.razor
- METHODOLOGY.md: scaffold table includes App.razor
- beast/history.md: append render mode correction learnings

Reference: https://learn.microsoft.com/aspnet/core/blazor/components/render-modes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: remove invalid @rendermode InteractiveServer from _Imports.razor scaffold

The @rendermode directive attribute cannot be used as a standalone directive
in _Imports.razor. Removed it from both migration-toolkit and scripts copies
of bwfc-migrate.ps1. The @using static import and App.razor @rendermode
attributes were already correct.

Closes the Run 6 benchmark build errors (8 errors from invalid directive).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): capture @rendermode placement directive

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): rendermode fix session log and decisions merge

Session: 2026-03-04-rendermode-fix
Requested by: Jeffrey T. Fritz

Changes:
- Logged rendermode fix session
- Merged decision inbox (Cyclops rendermode fix, Copilot directive)
- Deduplicated decisions.md (consolidated 3 overlapping rendermode decisions)
- Propagated cross-agent updates to cyclops, beast, forge history.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: pin EF Core to 10.0.3 and update migration skills

- Pin AfterWingtipToys to Microsoft.EntityFrameworkCore 10.0.3 (was preview.*)
- Update migration-standards skill with EF Core version requirement
- Update bwfc-data-migration skill with EF Core 10.0.3 reference
- Add directive to decisions inbox

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): EF Core version directive session

Session: 2026-03-04-efcore-version
Requested by: Jeffrey T. Fritz

Changes:
- Logged EF Core version directive session
- Merged EF Core directive from inbox into decisions.md
- Propagated update to agent history files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: add WebFormsPageBase for zero-change Page.Title migration

Introduces WebFormsPageBase : ComponentBase that provides:
- Title, MetaDescription, MetaKeywords (delegate to IPageService)
- IsPostBack => false (if (!IsPostBack) compiles unchanged)
- Page => this (Page.Title = "X" works as-is from Web Forms)

Converted pages use @inherits WebFormsPageBase in _Imports.razor.
Eliminates per-page @Inject IPageService and IsPostBack rewrites.

Includes 8 bUnit tests (1472 total, 0 failures).
Updates migration toolkit skills and methodology docs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): WebFormsPageBase session log and decisions

Session: 2026-03-04-webformspagebase
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-04-webformspagebase.md
- Merged decision files from inbox into decisions.md
- Propagated updates to agent history files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: consolidate WebFormsPage with IPageService head rendering

WebFormsPage now provides NamingContainer + ThemeProvider + page head
rendering (<PageTitle> + <meta> tags) in a single layout component.
Developers only need two setup lines:
  1. @inherits WebFormsPageBase (in _Imports.razor)
  2. <WebFormsPage> wrapping @Body (in layout)

- Added IPageService subscription to WebFormsPage.razor.cs
- Added <PageTitle> and <HeadContent> rendering to WebFormsPage.razor
- Added RenderPageHead parameter (default: true) for opt-out
- 7 new bUnit tests (1479 total, 0 failures)
- Updated Page System documentation with new architecture diagram
- Page.razor kept as standalone fallback for non-WebFormsPage layouts

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(ai-team): log WebFormsPage consolidation session

Session: 2026-03-04-webformspage-consolidation
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged 2 decisions from inbox into decisions.md (forge-page-consolidation, cyclops-webformspage-consolidation)
- Consolidated into single decision block: WebFormsPage IPageService head rendering consolidation
- Propagated updates to cyclops, forge, rogue, beast history files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: wire WebFormsPageBase into sample app

- Add @inherits WebFormsPageBase to Pages/_Imports.razor
- Wrap @Body with <WebFormsPage> in MainLayout.razor
- All 217 integration tests pass, all 1479 bUnit tests pass

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-05-event-handler-investigation
Requested by: Jeff Fritz

Changes:
- Logged event handler investigation session
- Merged Forge audit and Rogue gap analysis from inbox
- Consolidated overlapping decisions into unified event handler parity decision
- Propagated updates to cyclops, beast, jubilee history files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…patibility

Add 50 On-prefixed [Parameter] EventCallback aliases across 7 data components
to match Web Forms markup attribute names. This enables zero-touch migration
from Web Forms where event attributes use the On prefix (e.g., OnSorting,
OnSelectedIndexChanged).

Components updated:
- GridView: 9 aliases (OnSorting, OnSelectedIndexChanged, OnRowEditing, etc.)
- DetailsView: 11 aliases (OnItemCommand, OnModeChanging, OnModeChanged, etc.)
- FormView: 6 aliases (OnModeChanging, OnItemCommand, OnPageIndexChanging, etc.)
- ListView: 16 aliases (OnItemCommand, OnItemEditing, OnSorting, etc.)
- DataGrid: 5 aliases (OnPageIndexChanged, OnSortCommand, etc.)
- Menu: 2 aliases (OnMenuItemClick, OnMenuItemDataBound)
- TreeView: 1 alias (OnSelectedNodeChanged)

Pattern: coalescing invocation (Original.HasDelegate ? Original : OnOriginal)
ensures backward compatibility - existing Blazor consumers keep working.

Also fixes migration script:
- Add AutoPostBack to StripAttributes with ManualItem warning
- Add event handler attribute scan emitting ManualItem per file

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-05-event-handler-aliases
Requested by: Jeff Fritz

Changes:
- Logged alias implementation session
- Merged Cyclops alias pattern and Rogue script fix decisions
- Consolidated overlapping decisions into single implementation record
- Propagated updates to forge, beast, jubilee history files

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
BaseWebFormsComponent injects IHttpContextAccessor but the library
cannot register it (no ASP.NET Core shared framework reference).
Add the registration in the consuming app, matching the pattern
already used in AfterBlazorServerSide.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
In BWFC, GroupTemplate and LayoutTemplate are RenderFragment<RenderFragment>.
The inner content (items/groups) is passed as @context and must be rendered
explicitly. The original Web Forms markup used placeholder IDs which don't
apply in Blazor  @context is the mechanism for placing inner content.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
OnInitializedAsync only runs once. When the query string changes
(e.g. ?id=1 to ?id=3), the SupplyParameterFromQuery parameter updates
but the data doesn't reload. OnParametersSetAsync re-runs on every
parameter change, enabling category link navigation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-05-migration-skill-update
Requested by: Jeff Fritz

Changes:
- Beast updated migration-standards SKILL.md with 3 WingtipToys gotchas
- Confidence bumped medium -> high
- Logged session to .ai-team/log/
- No inbox decisions to merge
- No duplicates in decisions.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…onents

Use reflection to call AddHttpContextAccessor() from within the library's
service registration method. This eliminates the need for consuming apps
to manually register IHttpContextAccessor, since all ASP.NET Core apps
have the Microsoft.AspNetCore.Http assembly loaded at runtime.

Removed manual AddHttpContextAccessor() calls from both sample apps.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Documents what AddBlazorWebFormsComponents() registers, including the
new reflection-based IHttpContextAccessor auto-registration.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-05-gridview-gap-analysis
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-05-gridview-gap-analysis.md
- Merged decisions from inbox (Forge gridview-gap, directive about AfterWingtipToys)
- Propagated updates to affected agent histories (Rogue, Forge, Cyclops)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add Test-BwfcControlPreservation function to bwfc-migrate.ps1 that
  compares asp: tag counts in source vs BWFC component counts in output
  and warns when controls may have been flattened to raw HTML
- Update migration-standards SKILL.md with mandatory control preservation
  rules, anti-pattern examples (flattened GridView), and correct patterns
- Document the ShoppingCart GridView case as concrete example
- Wire verification into Convert-WebFormsFile pipeline post-transform

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add section explaining Test-BwfcControlPreservation, the danger of
flattening controls, and how to interpret deficit warnings.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- migration-standards SKILL.md: Full control preservation section with
  rules, ShoppingCart example, BAD/GOOD patterns, confidence bumped to high
- bwfc-migration SKILL.md: Critical Rule warning section + Never Flatten
  Controls gotcha entry
- METHODOLOGY.md: Post-transform verification subsection in Layer 1
- CHECKLIST.md: 3 new checklist items (Layer 1, Layer 2, Verification)
- QUICKSTART.md: Note about automatic control preservation check

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…isions

Session: 2026-03-05-control-preservation-toolkit
Requested by: Jeffrey T. Fritz

Changes:
- Logged control preservation toolkit session (Forge skills + Beast docs)
- Merged 2 inbox decisions (copilot-directive, forge-control-preservation)
- Consolidated overlapping control preservation decisions in decisions.md
- Propagated BWFC control preservation decision to all agent histories
- Summarized Beast, Cyclops, Forge, Rogue histories (all under 12KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add IntentionallyConverted exclusion list (Content, ContentPlaceHolder,
  ScriptManager, ScriptReference) so controls correctly removed by earlier
  pipeline stages aren't flagged as missing
- Add SemanticEquivalences map (LoginView  AuthorizeView) so semantic
  conversions are counted correctly
- Add ModelErrorMessage to BwfcComponents search list (real BWFC component)
- Fix Test-UnconvertiblePage: split content patterns from path patterns,
  remove overly broad 'PayPal' and 'Checkout' content matches that were
  incorrectly stubbing ShoppingCart.aspx
- Preservation warnings: 64  2 (only legitimate Site.Master PlaceHolder)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Layer 1 (script): 1.2s, 32 files, 331 transforms, 2 preservation warnings
Layer 2 (structural): ~80s, 5 core storefront pages transformed
Layer 3 (architecture): ~65s, models + DbContext + services
Total: ~2.5 minutes for buildable core storefront
Build: 0 errors on core pages, 14 in out-of-scope Account/Checkout/Admin

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-05-run7-migration
Requested by: Jeffrey T. Fritz

Changes:
- Logged Run 7 Layer 2/3 migration session (Forge, Beast, Squad)
- Merged 3 inbox decisions (beast-run7-report, forge-run7, forge-run7-migration)
- Consolidated 2 overlapping Forge Run 7 Layer 2/3 decisions into single block
- Propagated cross-agent updates to Beast and Forge history

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Page.GetRouteUrl() now works directly on WebFormsPageBase, matching
the Web Forms Page class API. Migrated code-behind that calls
Page.GetRouteUrl("RouteName", new { id = value }) compiles unchanged.

Updated bwfc-migrate.ps1 to no longer rewrite GetRouteUrl calls to
the helper class - they resolve naturally via the base class.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
LoginViewAuthorizeView conversion requires CascadingAuthenticationState
and AddAuthorization() in Program.cs. Without these, the homepage crashes
with InvalidOperationException on Task<AuthenticationState>.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…izeView

The migration script now emits a manual review item reminding developers
to add AddCascadingAuthenticationState() and AddAuthorization() to
Program.cs when LoginView is converted to AuthorizeView.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
App.razor was missing <link> tags for bootstrap.css and Site.css.
Added UseStaticFiles() to Program.cs to ensure wwwroot/Content/ is served.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ProductList: /Images/Products/ -> /Catalog/Images/Thumbs/
ProductDetails: /Images/Products/ -> /Catalog/Images/

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
csharpfritz and others added 27 commits March 5, 2026 14:39
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Validates 5 Layer 1 script fixes:
- P0-1: ItemType preserved on data controls (GridView/ListView/FormView/DetailsView)
- P0-2: Smart stubs  full markup transforms on Account/Checkout pages
- P0-3: Base class stripping (: Page, using System.Web.*)
- P1-1: Validator type params (Type=string, InputType=string)
- P1-4: ImageButton warning detection

Results: 0 errors, 0 warnings, 3 build attempts (down from 7 in Run 9)
Layer 1: 673 ops in 3.35s | Layer 2: ~25 min (down from ~45 min)
35 .razor, 44 .cs, 79 wwwroot | 172 BWFC control instances, 26 types

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Cycle 1 of 3-cycle improvement loop validating 5 Layer 1 script fixes:
- P0-1: ItemType preserved on data controls (was TItem bug)
- P0-2: Smart stubs with full BWFC markup on Account/Checkout pages
- P0-3: Base class stripping (no more : Page in code-behinds)
- P1-1: Validator type params auto-injected
- P1-4: ImageButton replacement warning

Results: Build attempts 73 (57% fewer), Layer 2 time 4525 min (44% faster),
673 Layer 1 transforms, 172 BWFC instances across 26 control types.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ageButton fail

- P1-1/P1-2/P2-5: Add Convert-EnumAttributes for TextMode, ValidatorDisplay, GridLines
- P1-3: Add Convert-BooleanAttributes normalizing True/False to true/false
- P1-4: Add ControlToValidate and ValidationGroup to StripAttributes
- P2-3: Elevate ImageButton->img detection from WARNING to FAIL
- P2-4: Server-side expressions (Request, Session, etc.) wrapped in TODO comments

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-05-cycle1-run10
Requested by: Jeffrey T. Fritz

Changes:
- Logged Cycle 1 Run 10 session (Bishop fixes, migration, Forge review)
- Merged 5 inbox decisions (bishop-cycle1-fixes, bishop-run10-migration, forge-cycle1-analysis, forge-run10-preservation, forge-cycle2-analysis, copilot-directive-itemtype-inference)
- Consolidated overlapping decisions (Layer 1 bugs + base class into single block)
- Removed 3 redundant individual decision blocks (ItemType, Validator, Base class)
- Propagated updates to bishop, cyclops, beast, forge histories
- Inbox cleared (0 files remaining)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…inference

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…x colors

- Add Add-MockAuthService function generating MockAuthService.cs and
  MockAuthenticationStateProvider.cs when Account/Login.aspx detected
- Update New-ProjectScaffold Program.cs template with conditional auth
  service registration (AddCascadingAuthenticationState, AddAuthorization)
- Add LogoutAction enum conversions (Redirect, RedirectToLoginPage, Refresh)
- Add BorderStyle enum conversions (None, NotSet, Dotted, Dashed, Solid, etc.)
- Add Convert-VisibleAttribute: strip Visible=true (default), preserve false
- Add Convert-HexColors: escape #hex values as @("#hex") for Razor
- Wire new transforms into main pipeline after Convert-BooleanAttributes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2025-07-25-cycle2-run11

Changes:
- Merged 3 inbox decisions to decisions.md (bishop-run11 D1-D4, login-register directive, forge-cycle3-analysis)
- Updated bishop/history.md with Run 11 team updates
- Updated forge/history.md with Run 11 preservation review + Cycle 3 analysis
- Updated beast/history.md with Run 11 benchmark report entry
- Deleted merged inbox file (bishop-run11-migration.md)
- copilot-directive-itemtype-inference.md confirmed already merged

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ConvertFrom-PageDirective now uses RelPath for routes (Account/Login.aspx  /Account/Login)
- Add webopt:bundlereference expansion to extract all CSS from bundle folders
- Add .map to StaticExtensions for source map copying

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Includes Run 12 migration output with mock auth service, enum conversions,
and hex color escaping. Account routes still need /Account/ prefix fix
(script corrected in prior commit afa0f82).

Also includes db files from Run 10/11 runtime.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Cycle 3 migration with functional authentication:
- 365 Layer 1 transforms across 32 files
- 184 BWFC control instances (27 unique types)
- 2 build attempts to 0 errors, 0 warnings
- Login page: MockAuth integration with @bind-Text TextBox binding
- Register page: MockAuth registration with auto-login
- LoginStatus preserved on MainLayout with LogoutAction enum
- All Run 11 functional pages maintained
- EF Core SQLite with seed data, CartStateService

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Document Cycle 3 script fixes (mock auth gen, enum conversions, hex colors, visible handling)
- Add Run 12 benchmark results (184 BWFC, 2 build attempts, functional auth)
- Record all quality gate results

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds end-to-end acceptance test project for migrated WingtipToys apps:

Navigation Tests:
- Home page loads successfully
- About, Contact, Products navbar links work
- Shopping Cart, Register, Login links navigate correctly

Shopping Cart Tests:
- Product list displays products
- Add item to cart via product details
- Update cart quantity
- Remove item from cart

Authentication Tests:
- Register page has expected form fields (email, password, confirm)
- Login page has expected form fields (email, password)
- Register -> Login end-to-end flow

Configure via WINGTIPTOYS_BASE_URL env var (defaults to https://localhost:5001).
Uses Playwright + xUnit, targets net10.0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-06-docs-reorganization
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-06-docs-reorganization.md
- Merged docs-reorganization decision from inbox into decisions.md

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Separates end-user docs (docs/) from contributor docs (dev-docs/).

Created:
- dev-docs/ with benchmarks, migration-tests, html-samples, screenshots

Moved:
- Benchmark reports from docs/Migration/Run*.md to dev-docs/benchmarks/
- Migration test reports from docs/migration-tests/ to dev-docs/
- HTML samples from docs/Migration/WebformsHtml/ to dev-docs/
- Screenshots from planning-docs/ to dev-docs/

Deleted:
- samples/Run7-12WingtipToys/ (old test run artifacts)
- docs/samples/ (unused)

Updated:
- mkdocs.yml: Removed internal reports from published nav
- samples/readme.md: Updated folder documentation

Requested by: Jeffrey T. Fritz

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move audit-output/ to dev-docs/audits/
- Move planning-docs/ subfolders to dev-docs/ (analysis, milestones, proposals, component-specs, reports)
- Remove duplicate migration scripts from scripts/ (kept migration-toolkit/scripts/ as authoritative)
- Update dev-docs/README.md with consolidated structure
- migration-toolkit/ remains end-user distributable for NuGet

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-06-folder-consolidation
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/
- Merged 2 decision(s) from inbox into decisions.md
- Updated agent histories with migration-toolkit directive

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…omponentBase stubs

Rewrite all Account, Checkout, Admin, and misc code-behind files from
raw Web Forms code to proper Blazor ComponentBase partial classes with
file-scoped namespaces. Remove all Web Forms references (Microsoft.AspNet.Identity,
Owin, System.Web, FriendlyUrls, etc.).

Account pages:
- Forgot.razor.cs: Rename class from ForgotPassword to Forgot (match filename)
- Lockout, ManageLogins, RegisterExternalLogin, ResetPasswordConfirmation: Simple stubs
- Manage, ManagePassword, AddPhoneNumber, ResetPassword, TwoFactorAuthenticationSignIn,
  VerifyPhoneNumber: Stubs with Title property for razor binding
- OpenAuthProviders: Stub with ReturnUrl parameter and empty providers list

Admin/AdminPage:
- Inject IDbContextFactory<ProductContext>, load categories/products in OnInitializedAsync
- Stub event handlers with EventArgs signature matching BWFC Button.OnClick
- Fix DropDownList Items bindings in razor

Checkout pages:
- All 5 code-behinds replaced with ComponentBase stubs
- CheckoutComplete: Fix Label to use Text parameter, add Continue_Click handler
- CheckoutReview: Add TItem and Items to GridView, remove DetailsView with
  invalid data binding expressions

Razor markup cleanup:
- Remove all Literal, HiddenField, PlaceHolder with Visible=false
- Remove <% %> code blocks and <%# %> data binding expressions
- Remove ModelErrorMessage references
- Fix ListView in OpenAuthProviders with TItem and Items parameters
- Replace friendlyUrls:ViewSwitcher with ViewSwitcher component
- Remove OnClick handlers referencing non-existent methods

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Key changes to make the migrated Blazor app work with Playwright tests:

- Add Bootstrap CSS links to App.razor (hides navbar toggle at desktop width)
- Add form-submit.js to bypass Blazor's enhanced form handling for
  data-enhance='false' forms (intercepts click on submit buttons)
- Switch auth from singleton MockAuthenticationStateProvider to
  cookie-based authentication (ASP.NET Core CookieAuthentication)
  so auth state is per-browser-session, not global
- Use <a role='button' onclick='...'> for form submit buttons since
  Blazor strips onclick from <button> elements in .razor files
- Add minimal API endpoints for AddToCart, RemoveAllCartItems,
  DoRegister, DoLogin to bypass Blazor's navigation interception
- Use onclick='event.preventDefault(); window.location.href=this.href;'
  on AddToCart links to force full HTTP navigation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-06-run7-migration
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-06-run7-migration.md
- Merged inbox decisions into decisions.md (bishop-run7-migration, cyclops-run7-layer2)
- No deduplication needed (no duplicate headings found)
- Propagated cross-agent updates to bishop, cyclops, colossus, forge, beast histories

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Layer 1: bwfc-migrate.ps1 (3.33s, 366 transforms, 0 errors)
- Layer 2: 33 files rewritten, 8 created, 2 build rounds
- Acceptance tests: 14/14 pass after 3 fix iterations
- Report: dev-docs/migration-tests/wingtiptoys-run7-2026-03-06/

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-03-06-run7-skill-improvements
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-03-06-run7-skill-improvements.md
- Merged 4 decision(s) from inbox into decisions.md
- Consolidated 2 overlapping decision pairs (LoginView script + Page_Load mapping)
- Propagated Forge's BWFC recommendations to Bishop and Cyclops history
- Notified all agents: WebFormsPageBase canonical base class, LoginView native component

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Bishop history.md exceeded 12KB threshold. Summarized Run 9-11
and Cycle 1-2 entries into Core Context section. Originals moved
to history-archive.md.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@csharpfritz csharpfritz merged commit 2a3ff3f into FritzAndFriends:main Mar 6, 2026
1 of 3 checks passed
Team update (2026-02-27): Issues must be closed via PR references using 'Closes #N' syntax, no manual closures decided by Jeffrey T. Fritz
**M17 AJAX docs (6 pages):** Timer, ScriptManager, ScriptManagerProxy, UpdatePanel, UpdateProgress, Substitution. New "AJAX Controls" nav section in mkdocs.yml. Migration stub doc pattern established (warning admonition + ignored props + include→remove lifecycle). Substitution moved from deferred to implemented.

**Issue #359 doc updates (5 pages):** ChangePassword and PagerSettings verified complete. FormView got CRUD events + NOT Supported section. DetailsView got full style sub-component elements. DataGrid paging section enhanced. Pattern: DataGrid is the only pageable control without PagerSettings.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh

@csharpfritz csharpfritz deleted the squad/event-handler-investigation branch March 6, 2026 20:55
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