feat: Event handler fidelity + LoginView/LoginStatus AuthorizeView redesign#421
Merged
csharpfritz merged 85 commits intoFritzAndFriends:mainfrom Mar 6, 2026
Merged
Conversation
…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>
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>
blogtheristo
reviewed
Mar 6, 2026
| 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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
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:
New EventArgs Classes
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
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.