Skip to content

feat: M17 Implement 6 AJAX/Migration Controls (Timer, ScriptManager, UpdatePanel, UpdateProgress, ScriptManagerProxy, Substitution)#402

Merged
csharpfritz merged 13 commits intoFritzAndFriends:devfrom
csharpfritz:milestone17/missing-controls
Feb 27, 2026
Merged

feat: M17 Implement 6 AJAX/Migration Controls (Timer, ScriptManager, UpdatePanel, UpdateProgress, ScriptManagerProxy, Substitution)#402
csharpfritz merged 13 commits intoFritzAndFriends:devfrom
csharpfritz:milestone17/missing-controls

Conversation

@csharpfritz
Copy link
Copy Markdown
Collaborator

M17: Implement 6 AJAX/Migration Controls

Closes #396, Closes #397, Closes #398, Closes #399, Closes #400, Closes #401

New Controls

  • Timer Interval-based tick events via System.Threading.Timer
  • ScriptManager Migration compatibility stub (renders nothing)
  • ScriptManagerProxy Migration compatibility stub (renders nothing)
  • UpdatePanel div/span wrapper with Block/Inline render modes
  • UpdateProgress Loading indicator with DynamicLayout and DisplayAfter
  • Substitution Delegate-based content renderer

Also Included

  • 3 new enums: ScriptMode, UpdatePanelUpdateMode, UpdatePanelRenderMode
  • 2 POCOs: ScriptReference, ServiceReference
  • 47 new bUnit tests (1,360 total, 0 failures)
  • 5 sample pages in AfterBlazorServerSide
  • 6 documentation pages in docs/EditorControls/
  • ComponentCatalog entries for AJAX and Migration Helpers categories
  • 6 Playwright integration tests (5 smoke + 1 interactive Timer test)

Review Status

Forge (Lead/Web Forms Reviewer) approved with minor follow-up notes:

  1. ScriptManager EnablePartialRendering default should be true
  2. ScriptManager missing Scripts collection
  3. UpdateProgress CssClass not applied to rendered div
  4. UpdateProgress style gap (visibility vs display)

These are non-blocking and will be addressed in a follow-up PR.

csharpfritz and others added 7 commits February 27, 2026 09:02
Session: 2026-02-27-m17-kickoff
Requested by: Jeffrey T. Fritz

Changes:
- Logged M17 kickoff session (M16 closed, 6 new issues FritzAndFriends#396-401)
- Merged 2 directive inbox files into decisions.md
- Propagated branching workflow and PR-closure directives to all agent histories
- No deduplication needed

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-02-27-m17-kickoff
Requested by: Jeffrey T. Fritz

Changes:
- Summarized beast history.md (17KB -> ~4KB)
- Summarized cyclops history.md (31KB -> ~4KB)
- Summarized forge history.md (17KB -> ~3KB)
- Summarized jubilee history.md (23KB -> ~3KB)
- Summarized rogue history.md (21KB -> ~4KB)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-02-27-m17-kickoff
Requested by: Jeffrey T. Fritz

Changes:
- Merged 3 new inbox files (beast-m17-docs, cyclops-m17-controls, jubilee-m17-samples)
- Propagated AJAX control decisions to all affected agents
- Updated decisions.md with 7 new decision entries

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tePanel, UpdateProgress, ScriptManagerProxy, Substitution)

Closes FritzAndFriends#396, Closes FritzAndFriends#397, Closes FritzAndFriends#398, Closes FritzAndFriends#399, Closes FritzAndFriends#400, Closes FritzAndFriends#401

- Timer: interval-based tick events via System.Threading.Timer
- ScriptManager/ScriptManagerProxy: migration compatibility stubs (render nothing)
- UpdatePanel: div/span wrapper with Block/Inline render modes
- UpdateProgress: loading indicator with DynamicLayout and DisplayAfter
- Substitution: delegate-based content renderer

Also includes:
- 47 new bUnit tests (1360 total, 0 failures)
- 5 sample pages in AfterBlazorServerSide
- 6 documentation pages in docs/EditorControls/
- New enums: ScriptMode, UpdatePanelUpdateMode, UpdatePanelRenderMode
- ComponentCatalog entries for AJAX and Migration Helpers categories

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- 5 smoke tests in ControlSampleTests.cs (new AjaxControl theory group)
- 1 interactive test for Timer counter increment
- Routes: Timer, UpdatePanel, UpdateProgress, ScriptManager, Substitution

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-02-27-m17-pr-created
Requested by: Jeffrey T. Fritz

Changes:
- Logged M17 PR creation session
- Merged Forge review decision from inbox
- Merged Rogue test decision from inbox
- Propagated cross-agent updates to Cyclops and Colossus

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Comment on lines +49 to +57
var cut = Render<Timer>(p => p
.Add(t => t.Interval, 50)
.Add(t => t.OnTick, () =>
{
tickCount++;
if (tickCount >= 1)
tcs.TrySetResult(true);
})
);

Check warning

Code scanning / CodeQL

Useless assignment to local variable Warning test

This assignment to
cut
is useless, since its value is never read.
Comment on lines +70 to +74
var cut = Render<Timer>(p => p
.Add(t => t.Interval, 50)
.Add(t => t.Enabled, false)
.Add(t => t.OnTick, () => { tickCount++; })
);

Check warning

Code scanning / CodeQL

Useless assignment to local variable Warning test

This assignment to
cut
is useless, since its value is never read.
csharpfritz and others added 6 commits February 27, 2026 09:57
Forge audited all 6 new controls against .NET Framework 4.8.1 API:
- Timer: 100% property/event coverage
- ScriptManager: 41% (acceptable for no-op stub)
- ScriptManagerProxy: 50% (acceptable for no-op stub)
- UpdatePanel: 80% property coverage
- UpdateProgress: 100% with 2 minor HTML gaps
- Substitution: 100% with Blazor adaptation

5 follow-up items documented (none blocking).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- ScriptManager: EnablePartialRendering now defaults to true (matches WF)
- ScriptManager: Added Scripts collection (List<ScriptReference>)
- UpdateProgress: CssClass now renders on output div element
- UpdateProgress: Non-dynamic mode renders display:block;visibility:hidden
- ScriptReference: Added ScriptMode, NotifyScriptLoaded, ResourceUICultures

Tests: 9 new bUnit tests covering all 5 fixes (1367 total, 0 failures)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
All issues now show  in coverage summary. Updated property counts
and HTML match status to reflect fixes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Build and Test workflow was failing because dotnet test writes
TRX files to TestResults/ in the CWD (repo root) by default, but
the upload-artifact and dorny/test-reporter steps expected them at
src/BlazorWebFormsComponents.Test/TestResults/. Adding
--results-directory ensures the TRX file lands where both steps
can find it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Session: 2026-02-27-m17-audit-fixes
Requested by: Jeffrey T. Fritz

Changes:
- Logged session to .ai-team/log/2026-02-27-m17-audit-fixes.md
- Merged 3 decisions from inbox into decisions.md (Forge audit, Cyclops fixes, Rogue tests)
- Consolidated overlapping M17 audit decisions into single block
- Removed duplicate deployment pipeline decision
- Propagated updates to forge, cyclops, rogue, beast, colossus history files
- Summarized colossus history (>12KB), archived old entries to history-archive.md

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

The AfterBlazorClientSide project shares pages from AfterBlazorServerSide.
The Substitution sample uses HttpContext which requires an explicit using
directive for Microsoft.AspNetCore.Http to compile in the WebAssembly project.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@csharpfritz csharpfritz merged commit 8d445f4 into FritzAndFriends:dev Feb 27, 2026
5 checks passed
@csharpfritz csharpfritz deleted the milestone17/missing-controls branch February 27, 2026 17:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants