From d51f233b751e95b4d3f12ddbaf0f0c639a3d826c Mon Sep 17 00:00:00 2001 From: Adam Ratzman Date: Mon, 10 Feb 2025 14:39:25 -0500 Subject: [PATCH] Make child resources visible by default, add expand/collapse all children toggle, move resources filters to menu (#7404) * Expand child resources by default, persist * Add resources page settings button * Edit collapse/expand all children text * Change hide/show to collapse/expand * Change hide/show to collapse/expand * Use collapsed resource hash set instead of dictionary * Add filter button back, hide settings button when there are no children * Changes and fixes * Fix build --------- Co-authored-by: Adam Ratzman Co-authored-by: James Newton-King --- .../Components/Pages/Resources.razor | 24 ++++- .../Components/Pages/Resources.razor.cs | 100 ++++++++++++++++-- .../Model/BrowserStorage/StorageResult.cs | 16 ++- .../Model/ResourceGridViewModel.cs | 5 +- .../Resources/Resources.Designer.cs | 18 ++++ src/Aspire.Dashboard/Resources/Resources.resx | 6 ++ .../Resources/xlf/Resources.cs.xlf | 14 ++- .../Resources/xlf/Resources.de.xlf | 14 ++- .../Resources/xlf/Resources.es.xlf | 14 ++- .../Resources/xlf/Resources.fr.xlf | 14 ++- .../Resources/xlf/Resources.it.xlf | 14 ++- .../Resources/xlf/Resources.ja.xlf | 14 ++- .../Resources/xlf/Resources.ko.xlf | 14 ++- .../Resources/xlf/Resources.pl.xlf | 14 ++- .../Resources/xlf/Resources.pt-BR.xlf | 14 ++- .../Resources/xlf/Resources.ru.xlf | 14 ++- .../Resources/xlf/Resources.tr.xlf | 14 ++- .../Resources/xlf/Resources.zh-Hans.xlf | 14 ++- .../Resources/xlf/Resources.zh-Hant.xlf | 14 ++- .../Utils/BrowserStorageKeys.cs | 1 + .../Shared/TestLocalStorage.cs | 6 +- .../Shared/TestSessionStorage.cs | 4 +- 22 files changed, 318 insertions(+), 44 deletions(-) diff --git a/src/Aspire.Dashboard/Components/Pages/Resources.razor b/src/Aspire.Dashboard/Components/Pages/Resources.razor index 02e12b8209..5fd10474ba 100644 --- a/src/Aspire.Dashboard/Components/Pages/Resources.razor +++ b/src/Aspire.Dashboard/Components/Pages/Resources.razor @@ -16,7 +16,7 @@ }
- +

@Loc[nameof(Dashboard.Resources.Resources.ResourcesHeader)]

@@ -30,6 +30,7 @@ Label="@(ViewportInformation.IsDesktop ? null : ControlsStringsLoc[nameof(ControlsStrings.FilterPlaceholder)].Value)" @bind-Value:after="HandleSearchFilterChangedAsync" /> + @if (ViewportInformation.IsDesktop) { + + @if (HasAnyChildResources()) + { + + } } else { + @if (HasAnyChildResources()) + { + var showExpandAllButton = HasCollapsedResources(); + + + @(showExpandAllButton ? Loc[nameof(Dashboard.Resources.Resources.ResourceExpandAllChildren)] : Loc[nameof(Dashboard.Resources.Resources.ResourceCollapseAllChildren)]) + + } +
+ OnResourceFilterVisibilityChangedAsync="@OnResourceFilterVisibilityChangedAsync"/>
} diff --git a/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs b/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs index 2349290c94..8534e9b738 100644 --- a/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/Resources.razor.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Globalization; using System.Text; +using Aspire.Dashboard.Components.Layout; using Aspire.Dashboard.Extensions; using Aspire.Dashboard.Model; using Aspire.Dashboard.Otlp.Storage; @@ -13,6 +14,7 @@ using Microsoft.AspNetCore.Components; using Microsoft.FluentUI.AspNetCore.Components; using Microsoft.JSInterop; +using Icons = Microsoft.FluentUI.AspNetCore.Components.Icons; namespace Aspire.Dashboard.Components.Pages; @@ -42,6 +44,8 @@ public partial class Resources : ComponentBase, IAsyncDisposable public required BrowserTimeProvider TimeProvider { get; init; } [Inject] public required IJSRuntime JS { get; init; } + [Inject] + public required ISessionStorage SessionStorage { get; init; } [CascadingParameter] public required ViewportInformation ViewportInformation { get; set; } @@ -66,7 +70,7 @@ public partial class Resources : ComponentBase, IAsyncDisposable private readonly CancellationTokenSource _watchTaskCancellationTokenSource = new(); private readonly ConcurrentDictionary _resourceByName = new(StringComparers.ResourceName); - private readonly HashSet _expandedResourceNames = []; + private readonly HashSet _collapsedResourceNames = new(StringComparers.ResourceName); private string _filter = ""; private bool _isFilterPopupVisible; private Task? _resourceSubscriptionTask; @@ -75,6 +79,8 @@ public partial class Resources : ComponentBase, IAsyncDisposable private FluentDataGrid _dataGrid = null!; private GridColumnManager _manager = null!; private int _maxHighlightedCount; + private readonly List _resourcesMenuItems = new(); + private AspirePageContentLayout? _contentLayout; private ColumnResizeLabels _resizeLabels = ColumnResizeLabels.Default; private ColumnSortLabels _sortLabels = ColumnSortLabels.Default; @@ -100,12 +106,14 @@ private async Task OnAllFilterVisibilityCheckedChangedAsync() { await ClearSelectedResourceAsync(); await _dataGrid.SafeRefreshDataAsync(); + UpdateMenuButtons(); } private async Task OnResourceFilterVisibilityChangedAsync(string resourceType, bool isVisible) { await ClearSelectedResourceAsync(); await _dataGrid.SafeRefreshDataAsync(); + UpdateMenuButtons(); } private async Task HandleSearchFilterChangedAsync() @@ -138,10 +146,21 @@ protected override async Task OnInitializedAsync() new GridColumn(Name: EndpointsColumn, DesktopWidth: "2.25fr", MobileWidth: "2fr"), new GridColumn(Name: ActionsColumn, DesktopWidth: "minmax(150px, 1.5fr)", MobileWidth: "1fr") ]; + _applicationUnviewedErrorCounts = TelemetryRepository.GetApplicationUnviewedErrorLogsCount(); + UpdateMenuButtons(); if (DashboardClient.IsEnabled) { + var collapsedResult = await SessionStorage.GetAsync>(BrowserStorageKeys.ResourcesCollapsedResourceNames); + if (collapsedResult.Success) + { + foreach (var resourceName in collapsedResult.Value) + { + _collapsedResourceNames.Add(resourceName); + } + } + await SubscribeResourcesAsync(); } @@ -245,6 +264,8 @@ bool UpdateFromResource(ResourceViewModel resource, Func resourceT ResourceStatesToVisibility.TryAdd(resource.State ?? string.Empty, stateVisible(resource.State ?? string.Empty)); ResourceHealthStatusesToVisibility.TryAdd(resource.HealthStatus?.Humanize() ?? string.Empty, healthStatusVisible(resource.HealthStatus?.Humanize() ?? string.Empty)); + UpdateMenuButtons(); + return added; } } @@ -267,7 +288,7 @@ private ValueTask> GetData(GridIt // Rearrange resources based on parent information. // This must happen after resources are ordered so nested resources are in the right order. // Collapsed resources are filtered out of results. - var orderedResources = ResourceGridViewModel.OrderNestedResources(filteredResources.ToList(), r => !_expandedResourceNames.Contains(r.Name)) + var orderedResources = ResourceGridViewModel.OrderNestedResources(filteredResources.ToList(), r => _collapsedResourceNames.Contains(r.Name)) .Where(r => !r.IsHidden) .ToList(); @@ -280,6 +301,37 @@ private ValueTask> GetData(GridIt return ValueTask.FromResult(GridItemsProviderResult.From(query, orderedResources.Count)); } + private void UpdateMenuButtons() + { + _resourcesMenuItems.Clear(); + + if (HasCollapsedResources()) + { + _resourcesMenuItems.Add(new MenuButtonItem + { + IsDisabled = false, + OnClick = OnToggleCollapseAll, + Text = Loc[nameof(Dashboard.Resources.Resources.ResourceExpandAllChildren)], + Icon = new Icons.Regular.Size16.Eye() + }); + } + else + { + _resourcesMenuItems.Add(new MenuButtonItem + { + IsDisabled = false, + OnClick = OnToggleCollapseAll, + Text = Loc[nameof(Dashboard.Resources.Resources.ResourceCollapseAllChildren)], + Icon = new Icons.Regular.Size16.EyeOff() + }); + } + } + + private bool HasCollapsedResources() + { + return _resourceByName.Any(r => !r.Value.IsHiddenState() && _collapsedResourceNames.Contains(r.Key)); + } + private void UpdateMaxHighlightedCount() { var maxHighlightedCount = 0; @@ -353,7 +405,7 @@ private async Task ShowResourceDetailsAsync(ResourceViewModel resource, string? { if (_resourceByName.TryGetValue(value, out current)) { - _expandedResourceNames.Add(value); + _collapsedResourceNames.Remove(value); continue; } } @@ -441,18 +493,47 @@ private async Task OnToggleCollapse(ResourceGridViewModel viewModel) { // View model data is recreated if data updates. // Persist the collapsed state in a separate list. + viewModel.IsCollapsed = !viewModel.IsCollapsed; + if (viewModel.IsCollapsed) { - viewModel.IsCollapsed = false; - _expandedResourceNames.Add(viewModel.Resource.Name); + _collapsedResourceNames.Add(viewModel.Resource.Name); + } + else + { + _collapsedResourceNames.Remove(viewModel.Resource.Name); + } + + await SessionStorage.SetAsync(BrowserStorageKeys.ResourcesCollapsedResourceNames, _collapsedResourceNames.ToList()); + await _dataGrid.SafeRefreshDataAsync(); + UpdateMenuButtons(); + } + + private async Task OnToggleCollapseAll() + { + var resourcesWithChildren = _resourceByName.Values + .Where(r => !r.IsHiddenState()) + .Where(r => _resourceByName.Values.Any(nested => nested.GetResourcePropertyValue(KnownProperties.Resource.ParentName) == r.Name)) + .ToList(); + + if (HasCollapsedResources()) + { + foreach (var resource in resourcesWithChildren) + { + _collapsedResourceNames.Remove(resource.Name); + } } else { - viewModel.IsCollapsed = true; - _expandedResourceNames.Remove(viewModel.Resource.Name); + foreach (var resource in resourcesWithChildren) + { + _collapsedResourceNames.Add(resource.Name); + } } + await SessionStorage.SetAsync(BrowserStorageKeys.ResourcesCollapsedResourceNames, _collapsedResourceNames.ToList()); await _dataGrid.SafeRefreshDataAsync(); + UpdateMenuButtons(); } private static List GetDisplayedEndpoints(ResourceViewModel resource) @@ -460,6 +541,11 @@ private static List GetDisplayedEndpoints(ResourceViewModel r return ResourceEndpointHelpers.GetEndpoints(resource, includeInternalUrls: false); } + private bool HasAnyChildResources() + { + return _resourceByName.Values.Any(r => !string.IsNullOrEmpty(r.GetResourcePropertyValue(KnownProperties.Resource.ParentName))); + } + public async ValueTask DisposeAsync() { _watchTaskCancellationTokenSource.Cancel(); diff --git a/src/Aspire.Dashboard/Model/BrowserStorage/StorageResult.cs b/src/Aspire.Dashboard/Model/BrowserStorage/StorageResult.cs index 23a7849922..9cc9d3411f 100644 --- a/src/Aspire.Dashboard/Model/BrowserStorage/StorageResult.cs +++ b/src/Aspire.Dashboard/Model/BrowserStorage/StorageResult.cs @@ -1,6 +1,20 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace Aspire.Dashboard.Model.BrowserStorage; -public readonly record struct StorageResult(bool Success, TValue? Value); +public readonly struct StorageResult +{ + [MemberNotNullWhen(true, nameof(Value))] + public bool Success { get; } + + public TValue? Value { get; } + + public StorageResult(bool success, TValue? value) + { + Success = success; + Value = value; + } +} diff --git a/src/Aspire.Dashboard/Model/ResourceGridViewModel.cs b/src/Aspire.Dashboard/Model/ResourceGridViewModel.cs index 29abc6910b..f693d6343b 100644 --- a/src/Aspire.Dashboard/Model/ResourceGridViewModel.cs +++ b/src/Aspire.Dashboard/Model/ResourceGridViewModel.cs @@ -14,13 +14,12 @@ public sealed class ResourceGridViewModel public int Depth { get; set; } public bool IsHidden { get; set; } - private bool _isCollapsed; public bool IsCollapsed { - get => _isCollapsed; + get; set { - _isCollapsed = value; + field = value; UpdateHidden(); } } diff --git a/src/Aspire.Dashboard/Resources/Resources.Designer.cs b/src/Aspire.Dashboard/Resources/Resources.Designer.cs index 66b7509003..adfcb3160b 100644 --- a/src/Aspire.Dashboard/Resources/Resources.Designer.cs +++ b/src/Aspire.Dashboard/Resources/Resources.Designer.cs @@ -105,6 +105,15 @@ public static string ResourceActionTracesText { } } + /// + /// Looks up a localized string similar to Collapse child resources. + /// + public static string ResourceCollapseAllChildren { + get { + return ResourceManager.GetString("ResourceCollapseAllChildren", resourceCulture); + } + } + /// /// Looks up a localized string similar to {0} "{1}" failed. /// @@ -168,6 +177,15 @@ public static string ResourceDetailsViewConsoleLogs { } } + /// + /// Looks up a localized string similar to Expand child resources. + /// + public static string ResourceExpandAllChildren { + get { + return ResourceManager.GetString("ResourceExpandAllChildren", resourceCulture); + } + } + /// /// Looks up a localized string similar to (Unset). /// diff --git a/src/Aspire.Dashboard/Resources/Resources.resx b/src/Aspire.Dashboard/Resources/Resources.resx index 2160b40790..4627b62367 100644 --- a/src/Aspire.Dashboard/Resources/Resources.resx +++ b/src/Aspire.Dashboard/Resources/Resources.resx @@ -268,4 +268,10 @@ No telemetry found for this resource. + + Collapse child resources + + + Expand child resources + \ No newline at end of file diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.cs.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.cs.xlf index 9d9f983b76..bba11e2699 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.cs.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.cs.xlf @@ -27,6 +27,11 @@ Trasování + + Collapse child resources + Collapse child resources + + {0} "{1}" failed Selhalo: {0} ({1}) @@ -62,6 +67,11 @@ Zobrazit protokoly konzoly + + Expand child resources + Expand child resources + + (Unset) (nenastaveno) @@ -169,12 +179,12 @@ Has filters - Obsahuje filtry + Obsahuje filtry No filters - Žádné filtry + Žádné filtry diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.de.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.de.xlf index 089021f571..7675ec8d27 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.de.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.de.xlf @@ -27,6 +27,11 @@ Überwachungen + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" fehlgeschlagen @@ -62,6 +67,11 @@ Konsolenprotokolle anzeigen + + Expand child resources + Expand child resources + + (Unset) (Nicht festgelegt) @@ -169,12 +179,12 @@ Has filters - Hat Filter + Hat Filter No filters - Keine Filter + Keine Filter diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.es.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.es.xlf index 1fc3cf41f2..3b74d39b75 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.es.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.es.xlf @@ -27,6 +27,11 @@ Seguimientos + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" erróneo @@ -62,6 +67,11 @@ Ver registros de consola + + Expand child resources + Expand child resources + + (Unset) (Anular) @@ -169,12 +179,12 @@ Has filters - Tiene filtros + Tiene filtros No filters - No hay ningún filtro + No hay ningún filtro diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.fr.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.fr.xlf index 31a7728ee2..edb1ec17e3 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.fr.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.fr.xlf @@ -27,6 +27,11 @@ Traces + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} « {1} » a échoué @@ -62,6 +67,11 @@ Afficher les journaux de console + + Expand child resources + Expand child resources + + (Unset) (Annuler) @@ -169,12 +179,12 @@ Has filters - A des filtres + A des filtres No filters - Aucun filtre + Aucun filtre diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.it.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.it.xlf index 18ac70cfa3..3d9897c88b 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.it.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.it.xlf @@ -27,6 +27,11 @@ Tracce + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" non riuscito @@ -62,6 +67,11 @@ Visualizza log della console + + Expand child resources + Expand child resources + + (Unset) (Annulla) @@ -169,12 +179,12 @@ Has filters - Con filtri + Con filtri No filters - Nessun filtro + Nessun filtro diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.ja.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.ja.xlf index 48b076390a..a08d210254 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.ja.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.ja.xlf @@ -27,6 +27,11 @@ トレース + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" が失敗しました @@ -62,6 +67,11 @@ コンソール ログの表示 + + Expand child resources + Expand child resources + + (Unset) (設定解除) @@ -169,12 +179,12 @@ Has filters - フィルターあり + フィルターあり No filters - フィルターなし + フィルターなし diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.ko.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.ko.xlf index d940140afd..de99eddb29 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.ko.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.ko.xlf @@ -27,6 +27,11 @@ 추적 + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" 실패함 @@ -62,6 +67,11 @@ 콘솔 로그 보기 + + Expand child resources + Expand child resources + + (Unset) (설정 해제) @@ -169,12 +179,12 @@ Has filters - 필터 있음 + 필터 있음 No filters - 필터 없음 + 필터 없음 diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.pl.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.pl.xlf index 01176beb03..090797c2c0 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.pl.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.pl.xlf @@ -27,6 +27,11 @@ Ślady + + Collapse child resources + Collapse child resources + + {0} "{1}" failed Niepowodzenie {0} „{1}” @@ -62,6 +67,11 @@ Wyświetl dzienniki konsoli + + Expand child resources + Expand child resources + + (Unset) (Cofnij ustawienie) @@ -169,12 +179,12 @@ Has filters - Ma filtry + Ma filtry No filters - Brak filtrów + Brak filtrów diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.pt-BR.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.pt-BR.xlf index f06af40f7a..aba46f5e59 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.pt-BR.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.pt-BR.xlf @@ -27,6 +27,11 @@ Rastreamentos + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" falhou @@ -62,6 +67,11 @@ Exibir registros do console + + Expand child resources + Expand child resources + + (Unset) (Remover definição) @@ -169,12 +179,12 @@ Has filters - Tem filtros + Tem filtros No filters - Sem filtros + Sem filtros diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.ru.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.ru.xlf index c41923efd0..bc95ba4204 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.ru.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.ru.xlf @@ -27,6 +27,11 @@ Трассировки + + Collapse child resources + Collapse child resources + + {0} "{1}" failed Сбой {0} "{1}" @@ -62,6 +67,11 @@ Просмотр журналов консоли + + Expand child resources + Expand child resources + + (Unset) (Удалить) @@ -169,12 +179,12 @@ Has filters - Содержит фильтры + Содержит фильтры No filters - Нет фильтров + Нет фильтров diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.tr.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.tr.xlf index efd9a94a23..b378e5bc85 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.tr.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.tr.xlf @@ -27,6 +27,11 @@ İzlemeler + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" başarısız @@ -62,6 +67,11 @@ Konsol günlüklerini görüntüle + + Expand child resources + Expand child resources + + (Unset) (Ayarı Kaldır) @@ -169,12 +179,12 @@ Has filters - Filtreleri var + Filtreleri var No filters - Filtre mevcut değil + Filtre mevcut değil diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hans.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hans.xlf index 32f3bc9ada..4e9f3851c6 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hans.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hans.xlf @@ -27,6 +27,11 @@ 跟踪 + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0} "{1}" 失败 @@ -62,6 +67,11 @@ 查看控制台日志 + + Expand child resources + Expand child resources + + (Unset) (取消设置) @@ -169,12 +179,12 @@ Has filters - 具有筛选器 + 具有筛选器 No filters - 无筛选器 + 无筛选器 diff --git a/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hant.xlf b/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hant.xlf index f0021f7f93..f52dafc73a 100644 --- a/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hant.xlf +++ b/src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hant.xlf @@ -27,6 +27,11 @@ 追蹤 + + Collapse child resources + Collapse child resources + + {0} "{1}" failed {0}「{1}」失敗 @@ -62,6 +67,11 @@ 檢視主機記錄 + + Expand child resources + Expand child resources + + (Unset) (取消設定) @@ -169,12 +179,12 @@ Has filters - 有篩選 + 有篩選 No filters - 沒有篩選 + 沒有篩選 diff --git a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs index 3b638c4e45..80a78fc360 100644 --- a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs +++ b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs @@ -15,6 +15,7 @@ internal static class BrowserStorageKeys public const string ConsoleLogsPageState = "Aspire_PageState_ConsoleLogs"; public const string ConsoleLogConsoleSettings = "Aspire_ConsoleLog_ConsoleSettings"; public const string ConsoleLogFilters = "Aspire_ConsoleLog_Filters"; + public const string ResourcesCollapsedResourceNames = "Aspire_Resources_CollapsedResourceNames"; public static string SplitterOrientationKey(string viewKey) { diff --git a/tests/Aspire.Dashboard.Components.Tests/Shared/TestLocalStorage.cs b/tests/Aspire.Dashboard.Components.Tests/Shared/TestLocalStorage.cs index 96b29fc590..eab5a6ac7d 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Shared/TestLocalStorage.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Shared/TestLocalStorage.cs @@ -12,7 +12,7 @@ public sealed class TestLocalStorage : ILocalStorage public Task> GetAsync(string key) { - return Task.FromResult(new StorageResult(Success: false, Value: default)); + return Task.FromResult(new StorageResult(success: false, value: default)); } public Task> GetUnprotectedAsync(string key) @@ -20,9 +20,9 @@ public Task> GetUnprotectedAsync(string key) if (OnGetUnprotectedAsync is { } callback) { var (success, value) = callback(key); - return Task.FromResult(new StorageResult(Success: success, Value: (T)(value ?? default(T))!)); + return Task.FromResult(new StorageResult(success: success, value: (T)(value ?? default(T))!)); } - return Task.FromResult(new StorageResult(Success: false, Value: default)); + return Task.FromResult(new StorageResult(success: false, value: default)); } public Task SetAsync(string key, T value) diff --git a/tests/Aspire.Dashboard.Components.Tests/Shared/TestSessionStorage.cs b/tests/Aspire.Dashboard.Components.Tests/Shared/TestSessionStorage.cs index 9f01691d77..678c64ea57 100644 --- a/tests/Aspire.Dashboard.Components.Tests/Shared/TestSessionStorage.cs +++ b/tests/Aspire.Dashboard.Components.Tests/Shared/TestSessionStorage.cs @@ -15,10 +15,10 @@ public Task> GetAsync(string key) if (OnGetAsync is { } callback) { var (success, value) = callback(key); - return Task.FromResult(new StorageResult(Success: success, Value: (T)(value ?? default(T))!)); + return Task.FromResult(new StorageResult(success: success, value: (T)(value ?? default(T))!)); } - return Task.FromResult>(new StorageResult(Success: false, Value: default)); + return Task.FromResult>(new StorageResult(success: false, value: default)); } public Task SetAsync(string key, T value)