Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .squad/agents/jubilee/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,4 +178,20 @@
- **Key pattern:** `ComponentHealthService` is registered as singleton via `AddComponentHealthDashboard()` extension method. It takes `solutionRoot` path to locate `dev-docs/reference-baselines.json`, test files, docs, and `ComponentCatalog.cs`.
- **Build verified:** 0 errors, all warnings pre-existing BL0005.

### AfterBlazorServerSide Navigation UX Changes (2026-03-15)

**Summary:** Two targeted changes to improve component catalog navigation in the sample app:

1. **Alphabetized components in all categories** — Modified `ComponentCatalog.GetByCategory()` to add `.OrderBy(c => c.Name)` to the LINQ chain. This sorts components alphabetically within each category, fixing the out-of-order AJAX section and ensuring consistent organization across all categories.

2. **AJAX category collapsed on desktop by default** — Modified `NavMenu.razor` method `CheckIfDesktopAndExpandCategories()` to exclude the AJAX category from automatic expansion on desktop. The AJAX section now starts collapsed (too many items), while all other categories expand normally. Mobile behavior unchanged (expands only the category containing the current page).

**Why these changes matter:** The component catalog had grown to 20+ AJAX-related controls, making the desktop navigation cluttered. Alphabetization improves discoverability within each section. Collapsing AJAX by default on desktop keeps the nav compact while still maintaining full access (users can expand when needed).

**Files modified:**
- `samples/AfterBlazorServerSide/ComponentCatalog.cs` (line 193-195)
- `samples/AfterBlazorServerSide/Components/Layout/NavMenu.razor` (line 86-93)

**Build verification:** `dotnet build` completed with 0 errors, pre-existing warnings only.


7 changes: 7 additions & 0 deletions .squad/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -9423,3 +9423,10 @@ Seven new files in `src/BlazorWebFormsComponents/Handlers/` implementing the cor

*— Cyclops, Component Dev*



### 2026-03-19T02:50Z: Defer AJAX controls from Component Health Dashboard
**By:** Squad (Coordinator), on behalf of Jeffrey T. Fritz
**What:** AJAX Control Toolkit extenders will NOT be added to the Component Health Dashboard at this time. The dashboard tracks parity against System.Web.dll controls using reflection-based baselines. ACT extenders are third-party (AjaxControlToolkit.dll) and would need a separate baseline source. This can be revisited if/when the baseline infrastructure supports multiple assemblies.
**Why:** Different baseline source — would require significant infrastructure changes to the reflection tool and tracked-components model.

Expand Down
83 changes: 83 additions & 0 deletions .squad/decisions/inbox/jubilee-ajax-nav-changes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Decision: Navigation UX Improvements for AfterBlazorServerSide Sample App

**Date:** 2026-03-15
**Agent:** Jubilee (Sample Writer)
**Requested by:** Jeffrey T. Fritz

## Context

The AfterBlazorServerSide sample app's component navigation had grown to include 20+ AJAX-related controls. The catalog displayed components in insertion order, resulting in an unsorted AJAX section. Additionally, the desktop view expanded ALL categories by default, creating an overly cluttered navigation panel.

## Decision

Implement two targeted UX improvements:

### 1. Alphabetize Components by Name

**Change:** `ComponentCatalog.cs` method `GetByCategory()`

**Before:**
```csharp
public static IEnumerable<ComponentInfo> GetByCategory(string category) =>
Components.Where(c => c.Category.Equals(category, StringComparison.OrdinalIgnoreCase));
```

**After:**
```csharp
public static IEnumerable<ComponentInfo> GetByCategory(string category) =>
Components.Where(c => c.Category.Equals(category, StringComparison.OrdinalIgnoreCase))
.OrderBy(c => c.Name);
```

**Rationale:** Alphabetical ordering improves component discoverability across all categories. Fixes the out-of-order AJAX section and creates consistent organization throughout the catalog.

### 2. Collapse AJAX Category on Desktop

**Change:** `NavMenu.razor` method `CheckIfDesktopAndExpandCategories()`

**Before:**
```csharp
if (isDesktop)
{
// Expand all categories on desktop
foreach (var category in ComponentCatalog.Categories)
{
expandedCategories.Add(category);
}
}
```

**After:**
```csharp
if (isDesktop)
{
// Expand all categories on desktop except AJAX (too many items)
foreach (var category in ComponentCatalog.Categories)
{
if (!category.Equals("AJAX", StringComparison.OrdinalIgnoreCase))
{
expandedCategories.Add(category);
}
}
}
```

**Rationale:** The AJAX category contains numerous extender and control components. Starting it collapsed on desktop reduces visual clutter while preserving full access (users can expand as needed). Mobile behavior is unchanged, still expanding only the category containing the current page.

## Trade-offs

- **Pro:** Cleaner desktop navigation, improved discoverability
- **Pro:** Mobile experience unchanged
- **Con:** Users must take one extra click to expand AJAX category on first visit
- **Mitigation:** AJAX section remains clearly visible in the nav; expanding takes a single click

## Implementation Notes

- **Files modified:** 2 files, 3 lines of logic added
- **Build status:** ✅ Clean build (0 errors)
- **Testing:** Manual verification that component catalog sorts alphabetically and desktop nav excludes AJAX from auto-expansion
- **Backward compatibility:** No breaking changes; component routing and sample functionality unchanged

## Approval Status

✅ **Implemented** — Changes verified to compile and function as intended.
7 changes: 7 additions & 0 deletions .squad/orchestration-log/2026-03-19T02-50-00Z-jubilee.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## Agent: Jubilee
**Routed by:** Squad (Coordinator)
**Why:** Sample Writer — AfterBlazorServerSide nav changes
**Mode:** background
**Task:** Alphabetize AJAX nav items + start AJAX collapsed on desktop
**Files authorized:** ComponentCatalog.cs, NavMenu.razor
**Outcome:** Pending (spawned)
Original file line number Diff line number Diff line change
Expand Up @@ -1122,7 +1122,7 @@ public async Task DetailsView_Paging_ChangesRecord()
var initialContent = await page.ContentAsync();

// Find pager links (DetailsView renders numeric pager links)
var pagerLinks = await page.Locator("a:has-text('2'), a:has-text('Next')").AllAsync();
var pagerLinks = await page.Locator(".main-content a:has-text('2'), .main-content a:has-text('Next')").AllAsync();
if (pagerLinks.Count > 0)
{
await pagerLinks[0].ClickAsync();
Expand Down
3 changes: 2 additions & 1 deletion samples/AfterBlazorServerSide/ComponentCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ public static class ComponentCatalog
.AsReadOnly();

public static IEnumerable<ComponentInfo> GetByCategory(string category) =>
Components.Where(c => c.Category.Equals(category, StringComparison.OrdinalIgnoreCase));
Components.Where(c => c.Category.Equals(category, StringComparison.OrdinalIgnoreCase))
.OrderBy(c => c.Name);

public static ComponentInfo? GetByRoute(string route) =>
Components.FirstOrDefault(c => c.Route.Equals(route, StringComparison.OrdinalIgnoreCase));
Expand Down
7 changes: 5 additions & 2 deletions samples/AfterBlazorServerSide/Components/Layout/NavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,13 @@

if (isDesktop)
{
// Expand all categories on desktop
// Expand all categories on desktop except AJAX (too many items)
foreach (var category in ComponentCatalog.Categories)
{
expandedCategories.Add(category);
if (!category.Equals("AJAX", StringComparison.OrdinalIgnoreCase))
{
expandedCategories.Add(category);
}
}
}
else
Expand Down
Loading