diff --git a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor index 3624efff22d..652ca3fb134 100644 --- a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor +++ b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor @@ -74,7 +74,7 @@ - + diff --git a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs index a077c3097fb..fd957a3ce5f 100644 --- a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs @@ -46,6 +46,9 @@ private sealed class ConsoleLogsSubscription [Inject] public required IDashboardClient DashboardClient { get; init; } + [Inject] + public required ILocalStorage LocalStorage { get; init; } + [Inject] public required ISessionStorage SessionStorage { get; init; } @@ -73,10 +76,6 @@ private sealed class ConsoleLogsSubscription [Parameter] public string? ResourceName { get; set; } - [Parameter] - [SupplyParameterFromQuery(Name = "hideTimestamp")] - public bool? HideTimestamp { get; set; } - private readonly CancellationTokenSource _resourceSubscriptionCts = new(); private readonly ConcurrentDictionary _resourceByName = new(StringComparers.ResourceName); private ImmutableList>? _resources; @@ -93,6 +92,7 @@ private sealed class ConsoleLogsSubscription private readonly List _resourceMenuItems = new(); // State + private bool _hideTimestamp; public ConsoleLogsViewModel PageViewModel { get; set; } = null!; public string BasePath => DashboardUrls.ConsoleLogBasePath; @@ -103,7 +103,13 @@ protected override async Task OnInitializedAsync() _resourceSubscriptionToken = _resourceSubscriptionCts.Token; _logEntries = new(Options.Value.Frontend.MaxConsoleLogCount); _noSelection = new() { Id = null, Name = ControlsStringsLoc[nameof(ControlsStrings.LabelNone)] }; - PageViewModel = new ConsoleLogsViewModel { SelectedOption = _noSelection, SelectedResource = null, Status = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsLoadingResources)], HideTimestamp = false }; + PageViewModel = new ConsoleLogsViewModel { SelectedOption = _noSelection, SelectedResource = null, Status = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsLoadingResources)] }; + + var timestampStorageResult = await LocalStorage.GetUnprotectedAsync(BrowserStorageKeys.ConsoleLogConsoleSettings); + if (timestampStorageResult.Value?.HideTimestamp is { } hideTimestamp) + { + _hideTimestamp = hideTimestamp; + } var loadingTcs = new TaskCompletionSource(); @@ -262,11 +268,11 @@ private void UpdateMenuButtons() Icon = new Icons.Regular.Size16.ArrowDownload() }); - if (PageViewModel.HideTimestamp) + if (_hideTimestamp) { _logsMenuItems.Add(new() { - OnClick = () => ToggleTimestamp(hideTimestamp: false), + OnClick = () => ToggleTimestampAsync(hideTimestamp: false), Text = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsTimestampShow)], Icon = new Icons.Regular.Size16.CalendarClock() }); @@ -275,7 +281,7 @@ private void UpdateMenuButtons() { _logsMenuItems.Add(new() { - OnClick = () => ToggleTimestamp(hideTimestamp: true), + OnClick = () => ToggleTimestampAsync(hideTimestamp: true), Text = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsTimestampHide)], Icon = new Icons.Regular.Size16.DismissSquareMultiple() }); @@ -308,10 +314,12 @@ private void UpdateMenuButtons() } } - private async Task ToggleTimestamp(bool hideTimestamp) + private async Task ToggleTimestampAsync(bool hideTimestamp) { - PageViewModel.HideTimestamp = hideTimestamp; - await this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: false); + await LocalStorage.SetUnprotectedAsync(BrowserStorageKeys.ConsoleLogConsoleSettings, new ConsoleLogConsoleSettings(HideTimestamp: hideTimestamp)); + _hideTimestamp = hideTimestamp; + + StateHasChanged(); } private async Task ExecuteResourceCommandAsync(CommandViewModel command) @@ -536,14 +544,11 @@ public class ConsoleLogsViewModel public required string Status { get; set; } public required SelectViewModel SelectedOption { get; set; } public required ResourceViewModel? SelectedResource { get; set; } - public required bool HideTimestamp { get; set; } } - public class ConsoleLogsPageState - { - public string? SelectedResource { get; set; } - public bool HideTimestamp { get; set; } - } + public record ConsoleLogsPageState(string? SelectedResource); + + public record ConsoleLogConsoleSettings(bool HideTimestamp); public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) { @@ -562,25 +567,16 @@ public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) viewModel.Status = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsNoResourceSelected)]; } - if (HideTimestamp is { } hideTimestamp) - { - viewModel.HideTimestamp = hideTimestamp; - } - return Task.CompletedTask; } public string GetUrlFromSerializableViewModel(ConsoleLogsPageState serializable) { - return DashboardUrls.ConsoleLogsUrl(serializable.SelectedResource, serializable.HideTimestamp); + return DashboardUrls.ConsoleLogsUrl(serializable.SelectedResource); } public ConsoleLogsPageState ConvertViewModelToSerializable() { - return new ConsoleLogsPageState - { - SelectedResource = PageViewModel.SelectedResource?.Name, - HideTimestamp = PageViewModel.HideTimestamp - }; + return new ConsoleLogsPageState(PageViewModel.SelectedResource?.Name); } } diff --git a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs index f734c4c6342..1d5e8eeaeab 100644 --- a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs +++ b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs @@ -13,6 +13,7 @@ internal static class BrowserStorageKeys public const string StructuredLogsPageState = "Aspire_PageState_StructuredLogs"; public const string MetricsPageState = "Aspire_PageState_Metrics"; public const string ConsoleLogsPageState = "Aspire_PageState_ConsoleLogs"; + public const string ConsoleLogConsoleSettings = "Aspire_ConsoleLog_ConsoleSettings"; public static string SplitterOrientationKey(string viewKey) { diff --git a/src/Aspire.Dashboard/Utils/DashboardUrls.cs b/src/Aspire.Dashboard/Utils/DashboardUrls.cs index dd07457b12e..8c80a0e9365 100644 --- a/src/Aspire.Dashboard/Utils/DashboardUrls.cs +++ b/src/Aspire.Dashboard/Utils/DashboardUrls.cs @@ -24,17 +24,13 @@ public static string ResourcesUrl(string? resource = null) return url; } - public static string ConsoleLogsUrl(string? resource = null, bool? hideTimestamp = null) + public static string ConsoleLogsUrl(string? resource = null) { var url = $"/{ConsoleLogBasePath}"; if (resource != null) { url += $"/resource/{Uri.EscapeDataString(resource)}"; } - if (hideTimestamp ?? false) - { - url = QueryHelpers.AddQueryString(url, "hideTimestamp", "true"); - } return url; }