Repository navigation
Dashboard resource navigation and parameter overview - #21793
James Newton-King (JamesNK) wants to merge 3 commits into
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 21793Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 21793" |
There was a problem hiding this comment.
🟡 Changes recommended
Unmounting the collapsed pane leaves the animation test hanging, while unresolved resource-selection and popup-sizing defects impair dashboard interactions.
6 open issues
Update collapse tests for the unmounted pane lifecycle · New Count all telemetry sources in the AppHost row · New Allow popup contents to fit the popup width · New Track pane resizing throughout full-canvas expansion · New Route mobile resource selection to the layout drawer · New Add browser coverage for the collapsed resource picker · New
4 files not reviewed
src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated filesrc/Aspire.Dashboard/Resources/Resources.Designer.cs: Generated filesrc/Aspire.Dashboard/Resources/StructuredLogs.Designer.cs: Generated filesrc/Aspire.Dashboard/Resources/Traces.Designer.cs: Generated file
What changed in this PR
This PR updates Aspire Dashboard navigation and introduces a dedicated parameter overview, with resource selection carried across pages and a focused flow for reviewing missing values.
Changes:
- Adds a collapsed resource picker, page-specific resource lists, and a Close action for resource details.
- Adds parameter summaries and missing-value review while preserving the resource graph preference.
- Improves telemetry empty states and updates component tests, documentation, and localization resources.
| File | Description |
|---|---|
tests/Aspire.Dashboard.Components.Tests/Shared/ResourceSetupHelpers.cs |
Mocks picker JavaScript calls. |
tests/Aspire.Dashboard.Components.Tests/Pages/TracesTests.cs |
Tests resource-specific empty states and clearing selection. |
tests/Aspire.Dashboard.Components.Tests/Pages/StructuredLogsTests.cs |
Tests empty-state navigation to all resources. |
tests/Aspire.Dashboard.Components.Tests/Pages/ResourcesTests.cs |
Tests parameter sidebar selection. |
tests/Aspire.Dashboard.Components.Tests/Pages/ResourceOverviewParametersTests.cs |
Covers parameter summaries, live updates, and missing-value review. |
tests/Aspire.Dashboard.Components.Tests/Pages/ResourceOverviewEmptyPanelsTests.cs |
Updates coverage for hidden panels and Close. |
tests/Aspire.Dashboard.Components.Tests/Pages/MetricsTests.cs |
Tests selection prompts without telemetry. |
tests/Aspire.Dashboard.Components.Tests/Layout/MobileNavMenuTests.cs |
Covers mobile Parameters navigation. |
tests/Aspire.Dashboard.Components.Tests/Layout/DesktopNavMenuTests.cs |
Covers desktop Parameters navigation. |
tests/Aspire.Dashboard.Components.Tests/Controls/ApplicationSummaryTests.cs |
Tests app-wide missing-parameter counts. |
src/Shared/DashboardUrls.cs |
Adds missing-parameter review URLs. |
src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs |
Removes the resource-kind preference key. |
src/Aspire.Dashboard/Resources/xlf/Traces.zh-Hant.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.zh-Hans.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.tr.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.ru.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.pt-BR.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.pl.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.ko.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.ja.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.it.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.fr.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.es.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.de.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Traces.cs.xlf |
Adds trace empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.zh-Hant.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.zh-Hans.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.tr.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.ru.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.pt-BR.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.pl.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.ko.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.ja.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.it.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.fr.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.es.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.de.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/StructuredLogs.cs.xlf |
Adds log empty-state localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hant.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hans.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.tr.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.ru.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.pt-BR.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.pl.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.ko.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.ja.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.it.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.fr.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.es.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.de.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Resources.cs.xlf |
Adds parameter-summary localization entries. |
src/Aspire.Dashboard/Resources/xlf/Layout.zh-Hant.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.zh-Hans.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.tr.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.ru.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.pt-BR.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.pl.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.ko.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.ja.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.it.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.fr.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.es.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.de.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/xlf/Layout.cs.xlf |
Adds the “All” localization entry. |
src/Aspire.Dashboard/Resources/Traces.resx |
Defines resource-specific trace messages. |
src/Aspire.Dashboard/Resources/Traces.Designer.cs |
Exposes new trace strings. |
src/Aspire.Dashboard/Resources/StructuredLogs.resx |
Defines resource-specific log messages. |
src/Aspire.Dashboard/Resources/StructuredLogs.Designer.cs |
Exposes new structured-log strings. |
src/Aspire.Dashboard/Resources/Resources.resx |
Defines parameter-summary labels and headlines. |
src/Aspire.Dashboard/Resources/Resources.Designer.cs |
Exposes parameter-summary strings. |
src/Aspire.Dashboard/Resources/Layout.resx |
Defines the sidebar “All” label. |
src/Aspire.Dashboard/Resources/Layout.Designer.cs |
Exposes the “All” label. |
src/Aspire.Dashboard/README.md |
Documents navigation, selection, and parameter workflows. |
src/Aspire.Dashboard/DashboardWebApplication.cs |
Removes the deleted redirect’s trimming registration. |
src/Aspire.Dashboard/Components/Pages/Traces.razor |
Offers all-resource navigation from empty traces. |
src/Aspire.Dashboard/Components/Pages/StructuredLogs.razor |
Offers all-resource navigation from empty logs. |
src/Aspire.Dashboard/Components/Pages/Resources.razor.cs |
Integrates parameter selection with the shared layout. |
src/Aspire.Dashboard/Components/Pages/Resources.razor |
Renders parameter overviews and routes selection actions. |
src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor.css |
Removes panel-selector styling. |
src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor.cs |
Adds parameter-review state and adjusts subscriptions. |
src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor |
Implements parameter routing and always hides empty panels. |
src/Aspire.Dashboard/Components/Pages/ParametersRedirect.razor.cs |
Removes the Parameters redirect implementation. |
src/Aspire.Dashboard/Components/Pages/ParametersRedirect.razor |
Removes the redirect route. |
src/Aspire.Dashboard/Components/Pages/Metrics.razor |
Prompts selection for resources without telemetry. |
src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor.js |
Adds native picker handling and revises activity observation. |
src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor.css |
Styles the picker and Close action. |
src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor |
Adds picker markup, page-specific lists, and Close. |
src/Aspire.Dashboard/Components/Layout/MobileNavMenu.razor.cs |
Adds mobile Parameters navigation. |
src/Aspire.Dashboard/Components/Layout/DesktopNavMenu.razor.cs |
Adds desktop Parameters navigation. |
src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor.cs |
Computes parameter summaries and app-wide missing values. |
src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor |
Renders parameter summaries and missing-value links. |
Review effort: Balanced
| @if (_isResourcePickerOpen) | ||
| { | ||
| @resourcePane | ||
| } |
| var allResources = _resourceByName.Values.Where(r => MatchesPage(r) && !r.IsResourceHidden(_filter.ShowHiddenResources)).ToList(); | ||
| var allResourceCount = allResources.Count(r => !r.IsParameter); | ||
| var allParameterCount = allResources.Count(r => r.IsParameter); | ||
| var allTelemetrySourceCount = DashboardClient.IsEnabled ? paneTelemetrySourceCount : _telemetryOnlyResources.Count; |
| .resource-pane.resource-pane-popup { | ||
| flex: 0 1 auto; | ||
| width: 100%; | ||
| max-height: min(600px, calc(100dvh - 120px)); | ||
| border-right: 0; | ||
| } |
| // The collapsed picker can unmount the pane. Observe its stable workspace so | ||
| // expanding it can resume activity without retaining the previous pane node. | ||
| resize.observe(layoutElement); |
| </div> | ||
| } | ||
| else if (PageViewModel.Instruments == null) | ||
| else if (PageViewModel.Instruments == null || ResourcesLayout?.SelectedResourceWithoutTelemetryName is not null) |
|
|
||
| const resourcePickers = new WeakMap(); | ||
|
|
||
| export function setResourcePickerOpen(layoutElement, dotNetRef, open) { |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Preserve selections across Parameters, show resource-specific telemetry empty states, keep the picker open for modifier clicks, and add a close button to resource overviews. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Restore page-specific sidebar filtering and All selection after rebasing. Keep the resource-detail close action and always hide empty panels. Replace the Parameters grid with a parameter-specific attention summary. Restore app-wide missing-parameter links and the missing-value review flow. Validated with 406 focused dashboard component tests and desktop/mobile browser checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
b953ab6 to
d081738
Compare
Tests selector16 / 101 PR test projects · 5 PR jobs, from 92 changed files. Selected PR test projects (16 / 101)
Selected PR jobs (5)
How these were chosen — grouped by what changed
🔧 📦 affected project 📦 affected project 🔧 🔧 🔧 🔧 🔧 🧪 🧪 🧪 🧪 🧪 🧪 🧪 🧪 🧪 🧪 🧪 Job reasons
Selection computed for commit |
There was a problem hiding this comment.
🟡 Changes recommended
The resource picker has unresolved mobile-selection and keyboard-focus defects, while existing browser tests target removed controls and lack coverage for native popover interactions.
9 open issues
Update browser tests for the new resource navigation controls · New Update collapse tests for the unmounted pane lifecycle Keep keyed resource rows as siblings to preserve component state · New Restore picker-button focus after keyboard selection · New Route mobile resource selection to the layout drawer Track pane resizing throughout full-canvas expansion Allow popup contents to fit the popup width Count all telemetry sources in the AppHost row Add browser coverage for the collapsed resource picker
4 files not reviewed
src/Aspire.Dashboard/Resources/Layout.Designer.cs: Generated filesrc/Aspire.Dashboard/Resources/Resources.Designer.cs: Generated filesrc/Aspire.Dashboard/Resources/StructuredLogs.Designer.cs: Generated filesrc/Aspire.Dashboard/Resources/Traces.Designer.cs: Generated file
Review effort: Balanced
| var allParameterCount = allResources.Count(r => r.IsParameter); | ||
| var allTelemetrySourceCount = DashboardClient.IsEnabled ? paneTelemetrySourceCount : _telemetryOnlyResources.Count; | ||
| var allResourcesText = Loc[DashboardClient.IsEnabled ? nameof(Dashboard.Resources.Layout.ResourceHeaderAllResources) : nameof(Dashboard.Resources.Layout.TelemetryHeaderAllSources)].Value; | ||
| var allResourcesText = Loc[DashboardClient.IsEnabled ? nameof(Dashboard.Resources.Layout.ResourcePaneAll) : nameof(Dashboard.Resources.Layout.TelemetryHeaderAllSources)].Value; |
| foreach (var row in paneRows) | ||
| { | ||
| RenderResourceRow(__builder, row.Resource, row, treeGuides[row.Resource.Name]); | ||
| @((RenderFragment)(builder => RenderResourceRow(builder, row.Resource, row, treeGuides[row.Resource.Name]))) |
| @if (_isResourcePickerOpen) | ||
| { | ||
| @resourcePane | ||
| } |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
## Description Make resource switching available while the dashboard sidebar is collapsed, without reopening the full sidebar. This extracts only the resource-selector dropdown from #21793. ### User-facing usage Click the resource-name button to open the searchable resource list. Normal selection closes it; Ctrl/Cmd/Shift selection keeps it open. Selecting all closes it. Mobile retains the existing drawer. ### Validation - Passed: **1,394 component tests** (before the final CSS-only adjustments): ```powershell dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true" ``` - Passed after the styling changes: ```powershell aspire resource aspire-dashboard rebuild --apphost playground\TestShop\TestShop.AppHost\TestShop.AppHost.csproj --non-interactive ``` - Browser-verified popup placement, normal/modifier selection, Select all, dismissal, and button styling. ### Screenshots / Recordings > **This PR includes UI changes.** Please add screenshots or screen recordings so reviewers can evaluate the visual changes without running locally. > > - For before/after comparisons, place them side-by-side or label them clearly. > - For interactive changes (animations, transitions, new flows), prefer a short screen recording (GIF or video). > - If you cannot capture visuals now, note what scenario to test and mark this section as TODO.  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: Copilot <223556219+Copilot@users.noreply.github.com>



Description
Draft for trying the CI build and gathering feedback on dashboard navigation: collapsed resource picker, selection preserved across pages, resource-detail Close, and a parameter overview with missing-value review.
Fixes # (issue)
User-facing usage
Install the CI build using the PR dogfooding guide. Try resource selection across Resources, Parameters, and logs, plus the missing-parameter button.
Screenshots / Recordings
TODO: record the picker and parameter-review flows above; the hidden browser capture was incomplete.
Validation: 406 tests passed; desktop/mobile manually verified
Result: passed, 406 tests. Full repository suite not run.
Checklist
<remarks />and<code />elements on your triple slash comments?