Skip to content

Add dashboard close buttons and refine the resource sidebar - #21792

Merged
David Pine (IEvangelist) merged 4 commits into
mainfrom
ievangelist-dashboard-detail-close-buttons
Nov 6, 2026
Merged

David Pine (IEvangelist) merged 4 commits into
mainfrom
ievangelist-dashboard-detail-close-buttons

Conversation

@IEvangelist

@IEvangelist David Pine (IEvangelist) commented Nov 5, 2026 •

Copy link
Copy Markdown
Member

Description

Make it straightforward to dismiss dashboard content and choose another resource without a separate sidebar-expansion control.

Desktop content panels now have a localized Close view X matching the adjacent toolbar buttons. Closing navigates to the parent route and shows the resource list across the canvas. Selecting a resource restores its content and the saved sidebar width; Select all reopens the current tab's all-resources content. Ordinary sidebar collapse, reopening, resizing, resource commands and terminal sessions remain unchanged.

Coverage includes resource/parameter overview, console logs, structured logs, traces and trace details, metrics and meter/instrument details, and terminal views. Unscoped tab content also supports close/reopen without losing its URL filters. Trace parent links retain resource selection and list filters, including direct links/new tabs. The separate terminal popout and transient dialogs are unchanged.

At 768px and narrower, the resource dropdown replaces the page X. The drawer dismiss button uses the same toolbar styling. Drawer navigation, filters and kind controls share aligned gutters and top spacing, with a fixed header/footer and one scrolling resource list.

The manual full-canvas toggle and its unused localized strings are removed. Existing full-canvas activity, row actions, selection animations and browser coverage are retained and updated for the close/Select all flow. Sidebar motion now uses a consistent 200ms eased transition rather than the previous 300ms collapse/400ms selection reveal, while retaining reduced-motion support and immediate pointer resizing.

Shared sidebar interactions use one in-flight registration across overlapping renders. Browser tests wait for the real close destination and interaction readiness rather than assuming a click means navigation and asynchronous setup have finished.

Review corrections preserve the closed presentation across destination-page saved-filter redirects, reopen a retained selected resource without deselecting it, recognize mixed-case route keywords, return query-based instruments to their meter parent, and preserve filters when Select all reopens top-level unscoped content. Directly opened trace and metric detail pages still navigate to the tab when choosing Select all. Drawer tests use 43 resources and verify actual overflow and positive scrolling.

Related issue: N/A (user-requested dashboard UX).

User-facing usage

  1. Open a resource or parameter, then choose Close view. The parent overview appears as the full-canvas resource list; choose a resource to reopen its details.
  2. Close Overview, Console logs, Structured logs, Traces, Metrics or Terminals, then choose Select all to reopen that tab's content. On Overview, this opens the all-resources summary.
  3. Open a trace detail directly or in a new tab. Closing returns to its traces list with resource selection and filters retained. Instrument and meter routes return to their immediate metrics parent; resource terminal views return to the resource overview.
  4. On phone/tablet dropdown layouts, open the resource dropdown, choose a resource or Select all, or dismiss the drawer with X. Filters and footer controls remain accessible while the list scrolls.

Validation

All tests use Release artifacts so the running Debug TestShop dashboard remains available. Latest review-correction validation is against commit 633deba325.

$env:MSBUILDTERMINALLOGGER='false'
dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj -c Release --no-launch-profile -- --filter-class '*.ResourcesLayoutCloseTests' --filter-class '*.ResourcesLayoutTests' --filter-class '*.ResourcesLayoutActivityTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Passed: 182 tests. Includes parent routes, mixed-case route keywords, direct-link trace context, saved-session redirects with the destination Traces page rendered, same-URL close/Select all, retained-resource reopening, filter preservation, direct-detail Select all destination URLs, mobile drawer dismissal, viewport changes, retained sidebar interactions and no resource lifecycle commands. The new navigation regressions were reproduced before applying their fixes.

dotnet test --project tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj -c Release --no-launch-profile -- --filter-method '*.ResourcePaneMotionTests.*' --filter-method '*.ResourcePanelNavigationTests.*' --filter-method '*.ResourcePaneFullCanvasTests.*' --filter-method '*.ResourceRowModifierClicks_SelectSeveralResources' --filter-method '*.FullCanvas_RowWhitespaceNavigatesOnceAndPreservesNestedActions' --filter-method '*.PaneWidth_DisclosesMetadataWithoutChangingSelectionAndKeepsEndpointBehavior' --filter-method '*.SelectionSurfaces_UseDashboardNeutralTokensAcrossThemes' --filter-not-trait 'quarantined=true' --parallel none

Passed: 69 tests. Includes responsive navigation, real overflowing-drawer scrolling, filtered close/reopen, retained-resource reopening, desktop/mobile Select all from direct trace and metrics detail links, retained full-canvas and motion tests, interrupted/reversed selection, keyboard focus, modifier selection, row actions and endpoint behavior. Collections ran serially on this shared development machine.

Outerloop coverage is intentionally enabled only for these explicitly selected browser scenarios. It covers 320, 390, 768, 769, 1024 and 1440px navigation/drawer behavior and desktop animation at 2000px.

The earlier combined regression run was 125 passed, 7 failed (132 total):

dotnet test --project tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj -c Release --no-launch-profile -- --filter-class '*.ResourcePanelNavigationTests' --filter-class '*.ResourcePaneFullCanvasTests' --filter-class '*.ResourcePaneMotionTests' --filter-class '*.ResourcePaneInteractionTests' --filter-class '*.ResourcePaneResponsiveTests' --filter-not-trait 'quarantined=true'

The change-related navigation/selection/timing failures were corrected and included in the passing focused selections (originally 57 tests, now 69 with review regressions). The combined 132-test selection was not rerun after the final corrections; it is not claimed fully green.

An isolated unchanged-main control at eef8a45871db9ad8fcbb153451001a3819a81aca reproduced the collapsed-filter-header selector timeout in FilterAndGrouping_StayInsideVisualViewportAcrossPaneModesAndResize and the focus assertion in SelectionAndResize_PreserveAvailableTracesTab; those pre-existing issues are not fixed here. The control command was:

dotnet test --project artifacts\dashboard-close-baseline\tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj -c Release --no-launch-profile -- --filter-method '*.FilterAndGrouping_StayInsideVisualViewportAcrossPaneModesAndResize' --filter-method '*.SelectionSurfaces_UseDashboardNeutralTokensAcrossThemes' --filter-method '*.HierarchyAndSource_PreserveTreePathsAndCompleteDisclosure' --filter-method '*.DynamicRows_PreserveTokenGeometryAfterModelAndPresentationChanges' --filter-method '*.SelectionAndResize_PreserveAvailableTracesTab' --filter-method '*.StartTime_RemainsCompleteAndAccessibleAcrossCulturesAndWidths' --filter-method '*.ResourceRowModifierClicks_SelectSeveralResources' --filter-not-trait 'quarantined=true'

Control result: 21 passed, 3 failed (24 total).

dotnet build src\Aspire.Dashboard\Aspire.Dashboard.csproj -c Release /t:UpdateXlf /v:q
git diff --check

Passed. Toggle string removals were propagated through generated XLF updates. Builds emit the existing NU1903 advisory for the repository-pinned Microsoft.DotNet.ILCompiler; dependencies were not changed.

Manual browser verification used this branch's source-built TestShop dashboard: desktop close/Select all, scoped trace parent navigation, normal sidebar collapse/reopen/resizing, and responsive dropdown/drawer flows. Screenshots below were captured after dismissing notification alerts and waiting for resource/activity loading in both themes. Review corrections do not change the captured styling or motion.

Screenshots / Recordings

This PR includes UI changes. The screenshots show both content and resource-list presentation from the source-built TestShop dashboard, with notification alerts dismissed.

Content

Resolution Light Dark
Desktop, 1440 x 900 Desktop content in light theme Desktop content in dark theme
Tablet, 768 x 1024 Tablet content in light theme Tablet content in dark theme
Mobile, 390 x 844 Mobile content in light theme Mobile content in dark theme

Resource list

Resolution Light Dark
Desktop, 1440 x 900 Desktop full-canvas resource list in light theme Desktop full-canvas resource list in dark theme
Tablet, 768 x 1024 Tablet resource drawer in light theme Tablet resource drawer in dark theme
Mobile, 390 x 844 Mobile resource drawer in light theme Mobile resource drawer in dark theme

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 21792

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 21792"

@IEvangelist

Copy link
Copy Markdown
Member Author

Source-built TestShop dashboard screenshots

Notification alerts were dismissed before capture. Content and resource list/drawer views are shown in both themes.

Content

Resolution Light Dark
Desktop, 1440 x 900 Desktop content in light theme Desktop content in dark theme
Tablet, 768 x 1024 Tablet content in light theme Tablet content in dark theme
Mobile, 390 x 844 Mobile content in light theme Mobile content in dark theme

Resource list

Resolution Light Dark
Desktop, 1440 x 900 Desktop full-canvas resource list in light theme Desktop full-canvas resource list in dark theme
Tablet, 768 x 1024 Tablet resource drawer in light theme Tablet resource drawer in dark theme
Mobile, 390 x 844 Mobile resource drawer in light theme Mobile resource drawer in dark theme

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Close/reopen navigation still mishandles retained selections and saved-state redirects, and can discard URL filters or skip the immediate parent view.

6 open issues
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated file
What changed in this PR

This PR replaces the dashboard’s manual full-canvas toggle with a Close view / Select all flow, integrating dismissal and reopening into resource navigation.

Changes:

  • Adds desktop close buttons and parent-route handling, including trace selection and filter context.
  • Refines mobile drawer layout and standardizes sidebar transitions.
  • Updates component and browser coverage, documents the navigation flow, and removes unused toggle strings.
File Description
tests/​Aspire.Dashboard.Playwright.Tests/​Integration/​Playwright/​ResourcePaneResponsiveTests.cs Adapts responsive scenarios to close/reopen navigation.
tests/​Aspire.Dashboard.Playwright.Tests/​Integration/​Playwright/​ResourcePaneMotionTests.cs Updates transition and interruption coverage.
tests/​Aspire.Dashboard.Playwright.Tests/​Integration/​Playwright/​ResourcePanelNavigationTests.cs Adds desktop and mobile navigation scenarios.
tests/​Aspire.Dashboard.Playwright.Tests/​Integration/​Playwright/​ResourcePaneInteractionTests.cs Updates modifier-selection coverage.
tests/​Aspire.Dashboard.Playwright.Tests/​Integration/​Playwright/​ResourcePaneFullCanvasTests.cs Replaces toggle scenarios with close/Select all flows.
tests/​Aspire.Dashboard.Playwright.Tests/​Integration/​Playwright/​Infrastructure/​ResourcePaneNavigation.cs Adds a navigation-aware browser helper.
tests/​Aspire.Dashboard.Components.Tests/​Shared/​ResourceSetupHelpers.cs Adds a resource-list visibility helper.
tests/​Aspire.Dashboard.Components.Tests/​Layout/​ResourcesLayoutTests.cs Migrates existing layout tests.
tests/​Aspire.Dashboard.Components.Tests/​Layout/​ResourcesLayoutCloseTests.cs Covers parent routes, reopening, and viewport changes.
tests/​Aspire.Dashboard.Components.Tests/​Layout/​ResourcesLayoutActivityTests.cs Preserves activity coverage with the new helper.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.zh-Hant.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.zh-Hans.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.tr.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.ru.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.pt-BR.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.pl.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.ko.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.ja.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.it.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.fr.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.es.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.de.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​xlf/​Layout.cs.xlf Removes obsolete toggle strings.
src/​Aspire.Dashboard/​Resources/​Layout.resx Removes unused full-canvas labels.
src/​Aspire.Dashboard/​Resources/​Layout.Designer.cs Removes corresponding resource accessors.
src/​Aspire.Dashboard/​README.md Documents close/reopen and drawer behavior.
src/​Aspire.Dashboard/​Components/​Pages/​Traces.razor Carries context into trace-detail navigation.
src/​Aspire.Dashboard/​Components/​Pages/​TraceDetail.razor.cs Uses context-aware parent and detail URLs.
src/​Aspire.Dashboard/​Components/​Pages/​StructuredLogs.razor Preserves resource context in trace links.
src/​Aspire.Dashboard/​Components/​Pages/​ResourceOverview.razor Uses context-aware trace links.
src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor.css Refines drawer geometry and sidebar motion.
src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor.cs Implements close state, parent URLs, reopening, and shared registration.
src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor Adds close controls and removes the canvas toggle.
src/​Aspire.Dashboard/​Components/​Controls/​PropertyValues/​TraceIdButtonValue.razor.cs Preserves context when opening traces.
src/​Aspire.Dashboard/​Components/​Controls/​DetailPageCloseButton.razor.cs Invokes close handling before parent navigation.
src/​Aspire.Dashboard/​Components/​Controls/​DetailPageCloseButton.razor Defines the localized toolbar close button.

Review effort: Balanced

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

The Select all shortcut incorrectly preserves detail-page URLs, leaving directly opened trace details open instead of navigating to /traces.

1 open issue
6 resolved since last review
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated file

Review effort: Balanced

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Unresolved bugs can leave sidebar interactions unusable after reconnection, narrow all-source metrics views when closing details, and prevent browser Back navigation from reopening details.

No open issues 🎉

3 previously missed issues

In code that hasn't changed since last review

Medium severity Keep browser Back navigation from hiding the metrics detail page

src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor.cs:455

This also treats browser history navigation to a query-based detail as session-state restoration. For example, open /metrics?meter=Test directly, close it to /metrics, then press Back: both paths are /metrics and neither URL selects a resource, so restoringPageState is true and the meter page remains hidden/inert behind full canvas. Distinguish actual saved-state redirects from user/history navigation so Back reopens the detail, and add a regression for this sequence.

Medium severity Clear failed pane interaction registration to allow reconnect retries

src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor.cs:524

If the circuit disconnects during RegisterPaneInteractionsAsync, the outer JSDisconnectedException handler swallows the failure, but _paneInteractionsRegistration keeps the faulted task. After reconnection, every render awaits that same task and exits through the catch again, so unfinished sidebar handlers and the resizer can never register without a reload. Clear the cached task on failure while ensuring an older failed waiter cannot clear a newer registration.

Medium severity Preserve all-sources metrics view when closing a detail page

src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor.cs:779

In a standalone dashboard with metrics-emitting sources and no resource selection, closing /metrics?meter=Test&duration=30 selects the first metrics source instead of returning to /metrics?duration=30. The instance GetTabUrl(Metrics) applies a tab-switching fallback that silently narrows the all-sources view. Use the overload that takes the current selection explicitly, and add a standalone metrics regression.

1 resolved since last review
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated file

Review effort: Balanced

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@IEvangelist
David Pine (IEvangelist) force-pushed the ievangelist-dashboard-detail-close-buttons branch from 633deba to 53cce2a Compare November 5, 2026 21:25
@IEvangelist
David Pine (IEvangelist) enabled stacked auto-merge (squash) November 5, 2026 21:25
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot November 5, 2026 21:27
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Unresolved issues prevent sidebar registration from recovering after disconnects, lose trace filters through the View details action, and keep query-based metric details hidden after browser Back navigation.

3 open issues
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated file

Review effort: Balanced

@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

- Mark the automatic page state restoration redirect with a history entry
  state so browser back/forward to a query-based detail (for example
  /metrics?meter=Test) reopens the content instead of being mistaken for a
  restoration that keeps the full-canvas list.
- Clear a faulted pane interaction registration so it can be retried after
  the circuit reconnects, without discarding a newer attempt.
- Route the trace row's View details action through the layout's contextual
  trace detail URL so it keeps the list's selection and filters.
@github-actions

github-actions Bot commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

Tests selector

14 / 101 PR test projects · 2 PR jobs, from 38 changed files.

Selected PR test projects (14 / 101)

Aspire.Dashboard.Components.Tests, Aspire.Dashboard.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Playground.Tests, Aspire.Templates.Tests, Infrastructure.Tests

Selected PR jobs (2)

extension-e2e, native-dashboard-validation


How these were chosen — grouped by what changed

⚠️ 11 of the 14 selected test projects come from a single change — src/Aspire.Dashboard/Components/Controls/DetailPageCloseButton.razor.

🔧 src/Aspire.Dashboard/Components/Controls/DetailPageCloseButton.razor (changed source)
→ 11 via the project graph: Aspire.Dashboard.Tests, Aspire.Hosting.Azure.Kubernetes.Tests (3 hops), Aspire.Hosting.Azure.Tests (2 hops), Aspire.Hosting.Blazor.Tests (2 hops), Aspire.Hosting.Dotnet.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests (2 hops), Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Radius.Tests (2 hops), Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Playground.Tests (2 hops)

📦 affected project Aspire.Dashboard
→ 1 test: Aspire.Templates.Tests

🔧 src/Aspire.Dashboard/Resources/Layout.resx (changed source)
→ 1 directly: Infrastructure.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Layout/ResourcesLayoutActivityTests.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Layout/ResourcesLayoutCloseTests.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Layout/ResourcesLayoutTests.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Shared/ResourceSetupHelpers.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

Job reasons

Job Triggered by
extension-e2e • src/Aspire.Dashboard/Components/Controls/DetailPageCloseButton.razor, src/Aspire.Dashboard/Components/Controls/DetailPageCloseButton.razor.cs, src/Aspire.Dashboard/Components/Controls/PropertyValues/TraceIdButtonValue.razor.cs, src/Aspire.Dashboard/Components/Controls/TraceActions.razor.cs, src/Aspire.Dashboard/Components/IPageWithSessionAndUrlState.cs, src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor, src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor.cs, src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor.css, src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor, src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor, src/Aspire.Dashboard/Components/Pages/TraceDetail.razor.cs, src/Aspire.Dashboard/Components/Pages/Traces.razor, src/Aspire.Dashboard/Model/TraceMenuBuilder.cs, src/Aspire.Dashboard/Resources/Layout.Designer.cs, src/Aspire.Dashboard/Resources/Layout.resx, src/Aspire.Dashboard/Resources/xlf/Layout.cs.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.de.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.es.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.fr.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.it.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.ja.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.ko.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.pl.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.pt-BR.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.ru.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.tr.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.zh-Hans.xlf, src/Aspire.Dashboard/Resources/xlf/Layout.zh-Hant.xlf
• affected project Aspire.Dashboard
native-dashboard-validation • tests/Aspire.Dashboard.Playwright.Tests/Integration/Playwright/Infrastructure/ResourcePaneNavigation.cs
• affected project Aspire.Dashboard

Selection computed for commit f6605c8.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

Human assessment is needed to evaluate a resource-selection navigation edge case that can leave scope unchanged or discard an existing trace filter.

No open issues 🎉

3 resolved since last review
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated file

Review effort: Balanced

@IEvangelist
David Pine (IEvangelist) merged commit 35298c6 into main Nov 6, 2026
162 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 17.0 milestone Nov 6, 2026
David Pine (IEvangelist) added a commit that referenced this pull request Nov 6, 2026
## Description

Make the resource sidebar explain what is available in the current view
without confusing availability, resource health, and selection.

This is the sidebar follow-up to #21792 and targets
`ievangelist-dashboard-detail-close-buttons`. Only the follow-up is
included in this diff; the parent PR is unchanged.

- Show localized **No logs**, **No traces**, **No metrics**, and **Not
applicable** badges with muted, still-interactive rows. Missing
telemetry means no data is currently available, not that the resource
cannot support it. Uninstrumented peers remain available in Traces.
- Explain why parameters do not produce console logs, structured logs,
traces, or metrics, or support terminals. Clicking or keyboard-selecting
a parameter opens its overview. Empty resources still open the existing
no-data view.
- Highlight **Select all** rather than every row for aggregate
selection. Individual, modifier-key, range, and group selection retain
their existing selection indicators and metadata.

Availability uses the existing telemetry-resource subscription and a
cached snapshot lookup. First-signal arrival and clearing update badges
without changing selection. Keep the data query scoped to the selected
resources when their first signal arrives, and refresh logs/traces when
the layout's initial resource snapshot finishes loading.

### User-facing usage

Open Structured logs, Traces, or Metrics and select a resource with a
no-data badge: its empty view opens normally. When that resource sends
telemetry, the badge disappears and its data becomes visible without
selecting it again; clearing that signal restores the badge and empty
state. A running resource can therefore be healthy and still have no
telemetry.

Hover or keyboard-focus a parameter in a telemetry, Console logs, or
Terminal view to see the feature-specific explanation, then press Enter
to open the parameter overview. Use **Select all** for the aggregate
view, Ctrl/Cmd-click to add or remove individual resources, or
Shift-click for a range.

### Screenshots / Recordings

> **This PR includes UI changes.** These 14 screenshots are from this
branch's Release build using deterministic synthetic resources and
telemetry. They show both themes at desktop (1440 x 900), tablet (768 x
1024), and mobile (390 x 844) sizes. No real credentials or application
data are used.

#### Responsive availability and aggregate selection

Only **Select all** is highlighted in the aggregate view. Running
resources with no telemetry are muted; parameters explain why the
current feature is not applicable.

| Viewport | Light | Dark |
| --- | --- | --- |
| Desktop, 1440 x 900 | ![Desktop light: aggregate selection, no-data
badges, and parameter
explanation](https://github.com/user-attachments/assets/0cb9fbcb-a452-4126-85dc-d5e3d7d1fc52)
| ![Desktop dark: aggregate selection, no-data badges, and parameter
explanation](https://github.com/user-attachments/assets/bfc49812-c81c-4985-9888-4339d7308780)
|
| Tablet, 768 x 1024 | ![Tablet light: sidebar badges and parameter
tooltip](https://github.com/user-attachments/assets/665a9cfb-0fab-44a2-b651-f8ffc03cd051)
| ![Tablet dark: sidebar badges and parameter
tooltip](https://github.com/user-attachments/assets/1bc62665-81bd-44d1-acd8-faafb9b84c6b)
|
| Mobile, 390 x 844 | ![Mobile light: interactive muted rows, Select
all, and parameter
tooltip](https://github.com/user-attachments/assets/2ec30c21-3ecd-4de5-bc6f-ca0dafe4d400)
| ![Mobile dark: interactive muted rows, Select all, and parameter
tooltip](https://github.com/user-attachments/assets/959d2ddd-d000-405d-a9cc-0d12a23ce5ae)
|

#### First telemetry and clear, with the same resource selected

The gateway already has a log, but the selected catalog view does not
show it. Catalog's first log removes its badge and appears without
changing selection. Clearing catalog's logs restores the badge and empty
state.

| Selected resource, no logs yet | First log arrives | Catalog logs
cleared |
| --- | --- | --- |
| ![Catalog selected with No logs and its current-data
explanation](https://github.com/user-attachments/assets/b0748df0-e997-4f99-8f9b-a88978b6440c)
| ![Catalog remains selected, its badge disappears, and only its new log
is
shown](https://github.com/user-attachments/assets/903ef6ba-7c72-4e83-a19a-0155ef822002)
| ![Catalog remains selected after clearing logs, restoring No logs and
the empty
view](https://github.com/user-attachments/assets/d6cedee6-f09f-4705-9b08-280022602a9d)
|

#### View-specific explanations and selection

| Scenario | Screenshot |
| --- | --- |
| Traces, dark: selected running resource with no traces | ![Dark Traces
view showing No traces badges, selection rail, and existing empty
state](https://github.com/user-attachments/assets/9e3bedd9-ac44-4129-8956-2da0e24808c7)
|
| Metrics, light: selected running resource with no metrics | ![Light
Metrics view showing No metrics badges and existing empty
state](https://github.com/user-attachments/assets/01c8a962-ef94-4b17-b664-76d2d0d0b2c8)
|
| Console logs, light: nonparameters remain available; parameter
explains why it produces no console logs | ![Console logs parameter
explanation and available nonparameter
resources](https://github.com/user-attachments/assets/d6ed2783-0f26-426e-84d9-663c29b25cee)
|
| Parameter selection opens Overview and removes the contextual
unavailable badge | ![Dark parameter overview reached from Console logs,
with no parameter value
set](https://github.com/user-attachments/assets/608bd353-4987-43b8-b91d-5f71edf12cd4)
|
| Explicit multiselection retains individual rails while Select all is
not filled | ![Dark structured logs view with catalog and orders
explicitly
selected](https://github.com/user-attachments/assets/4791bb02-9218-4438-bf35-d9e268835a6b)
|

### Validation

Run on Windows after `.\restore.cmd` (**passed**), with
`MSBUILDTERMINALLOGGER=false`. All commands below use the
repository-pinned SDK, Release configuration, and
Microsoft.Testing.Platform filters.

**Layout component suite: passed, 481 cases.**

```powershell
dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj -c Release --no-launch-profile -- --filter-namespace 'Aspire.Dashboard.Components.Tests.Layout' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
```

**Availability and telemetry-page compatibility: passed, 81 cases**,
including 16 availability cases. This overlaps the layout suite; counts
are not additive.

```powershell
dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj -c Release --no-launch-profile -- --filter-class '*.ResourceRowAvailabilityTests' --filter-class '*.StructuredLogsTests' --filter-class '*.TracesTests' --filter-class '*.MetricsTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
```

**Focused functional browser suite: passed, 49 cases.** Explicitly opted
into the selected outerloop browser scenarios; unrelated quarantined
tests remain excluded.

```powershell
dotnet test --project tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj -c Release --no-launch-profile -- --filter-method '*.ExistingTelemetry_RemainsVisibleWhenAllResourcesViewReloads' --filter-method '*.UnavailableRows_RemainInteractiveAndUpdateWhenSignalsArriveAndClear' --filter-method '*.ParameterRows_ExplainEachUnavailableFeatureAndKeyboardSelectionOpensOverview' --filter-method '*.AvailabilityBadges_FollowTabChangesWithoutChangingSelection' --filter-method '*.SelectAll_*' --filter-method '*.AllResourcesRow_ClearsSelectionAndSummarizesAllResources' --filter-method '*.ResourceRowModifierClicks_SelectSeveralResources' --filter-method '*.ExtremeName_RetainsFullAccessibleAndHoverKeyboardDisclosure' --filter-method '*.IconTile_PreservesStylesAcrossPaneModesAndDensities' --filter-method '*.SelectionSurfaces_UseDashboardNeutralTokensAcrossThemes' --filter-method '*.DynamicRows_PreserveTokenGeometryAfterModelAndPresentationChanges' --filter-method '*.RowComposition_AlignsStatusAndSingleLineDetailsWithAccessibleContrast' --filter-method '*.PaneWidth_DisclosesMetadataWithoutChangingSelectionAndKeepsEndpointBehavior' --filter-not-trait 'quarantined=true'
```

Coverage includes all three signals arriving and being cleared at three
widths, unchanged selection and data scope, visible feature-specific
parameter explanations and keyboard navigation across five views,
tab-dependent labels, synthetic trace peers, long-name disclosure,
aggregate/individual/group selection, and Ctrl/Cmd-click from the
aggregate set. The initial logs snapshot failure was reproduced before
the lifecycle fix; both logs and traces now have passing load/reload
coverage. Existing styling/geometry tests were aligned with aggregate
selection; no new computed-color-only assertions were added.

`git diff --check`: **passed**. Screenshot capture assertions:
**passed**, including that another resource's log never appears in the
selected resource's view.

Builds report NU1903 for the repository-pinned
`Microsoft.DotNet.ILCompiler` 11.0.0-rc.2.26504.105
([GHSA-p3jp-9v83-76w9](GHSA-p3jp-9v83-76w9)).
This PR does not change dependencies or feeds.

Fixes # (issue)

## Checklist

- Is this feature complete?
  - [x] Yes. Ready to ship.
  - [ ] No. Follow-up changes expected.
- Are you including unit tests for the changes and scenario tests if
relevant?
  - [x] Yes
  - [ ] No
- Did you add public API?
  - [ ] Yes
    - If yes, did you have an API Review for it?
      - [ ] Yes
      - [ ] No
- Did you add `<remarks />` and `<code />` elements on your triple slash
comments?
      - [ ] Yes
      - [ ] No
  - [x] No
- Does the change make any security assumptions or guarantees?
  - [ ] Yes
    - If yes, have you done a threat model and had a security review?
      - [ ] Yes
      - [ ] No
  - [x] No

---------

Co-authored-by: IEvangelist <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants