From d516ef8865413d5f05238459c0fd62767ae31389 Mon Sep 17 00:00:00 2001 From: Adam Ratzman Date: Thu, 23 Jan 2025 13:06:15 -0500 Subject: [PATCH 1/3] Add Async suffix to method, turn console log state class into record and remove timestamp --- .../Components/Pages/ConsoleLogs.razor.cs | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs index a077c3097fb..172be6de713 100644 --- a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs @@ -73,10 +73,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; @@ -103,7 +99,7 @@ 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 loadingTcs = new TaskCompletionSource(); @@ -266,7 +262,7 @@ private void UpdateMenuButtons() { _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 +271,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,7 +304,7 @@ private void UpdateMenuButtons() } } - private async Task ToggleTimestamp(bool hideTimestamp) + private async Task ToggleTimestampAsync(bool hideTimestamp) { PageViewModel.HideTimestamp = hideTimestamp; await this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: false); @@ -536,14 +532,9 @@ 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 Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) { @@ -562,11 +553,6 @@ public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) viewModel.Status = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsNoResourceSelected)]; } - if (HideTimestamp is { } hideTimestamp) - { - viewModel.HideTimestamp = hideTimestamp; - } - return Task.CompletedTask; } @@ -577,10 +563,6 @@ public string GetUrlFromSerializableViewModel(ConsoleLogsPageState serializable) public ConsoleLogsPageState ConvertViewModelToSerializable() { - return new ConsoleLogsPageState - { - SelectedResource = PageViewModel.SelectedResource?.Name, - HideTimestamp = PageViewModel.HideTimestamp - }; + return new ConsoleLogsPageState(PageViewModel.SelectedResource?.Name); } } From d21fc34dc97349d1c521d300ed6d31c893ac86b2 Mon Sep 17 00:00:00 2001 From: Adam Ratzman Date: Thu, 23 Jan 2025 13:19:06 -0500 Subject: [PATCH 2/3] Remove hide timestamp setting from query url, place it in session storage by itself --- .../Components/Pages/ConsoleLogs.razor | 2 +- .../Components/Pages/ConsoleLogs.razor.cs | 19 +++++++++++++++---- .../Utils/BrowserStorageKeys.cs | 1 + src/Aspire.Dashboard/Utils/DashboardUrls.cs | 6 +----- 4 files changed, 18 insertions(+), 10 deletions(-) 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 172be6de713..f91b5170c18 100644 --- a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs +++ b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs @@ -89,10 +89,12 @@ private sealed class ConsoleLogsSubscription private readonly List _resourceMenuItems = new(); // State + private bool _hideTimestamp; public ConsoleLogsViewModel PageViewModel { get; set; } = null!; public string BasePath => DashboardUrls.ConsoleLogBasePath; public string SessionStorageKey => BrowserStorageKeys.ConsoleLogsPageState; + private const string HideTimestampStorageKey = BrowserStorageKeys.ConsoleLogTimestampState; protected override async Task OnInitializedAsync() { @@ -101,6 +103,12 @@ protected override async Task OnInitializedAsync() _noSelection = new() { Id = null, Name = ControlsStringsLoc[nameof(ControlsStrings.LabelNone)] }; PageViewModel = new ConsoleLogsViewModel { SelectedOption = _noSelection, SelectedResource = null, Status = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsLoadingResources)] }; + var timestampStorageResult = await SessionStorage.GetAsync(HideTimestampStorageKey); + if (timestampStorageResult.Value?.HideTimestamp is { } hideTimestamp) + { + _hideTimestamp = hideTimestamp; + } + var loadingTcs = new TaskCompletionSource(); await TrackResourceSnapshotsAsync(); @@ -258,7 +266,7 @@ private void UpdateMenuButtons() Icon = new Icons.Regular.Size16.ArrowDownload() }); - if (PageViewModel.HideTimestamp) + if (_hideTimestamp) { _logsMenuItems.Add(new() { @@ -306,8 +314,9 @@ private void UpdateMenuButtons() private async Task ToggleTimestampAsync(bool hideTimestamp) { - PageViewModel.HideTimestamp = hideTimestamp; - await this.AfterViewModelChangedAsync(_contentLayout, waitToApplyMobileChange: false); + await SessionStorage.SetAsync(HideTimestampStorageKey, new ConsoleLogTimestampState(HideTimestamp: hideTimestamp)); + _hideTimestamp = hideTimestamp; + StateHasChanged(); } private async Task ExecuteResourceCommandAsync(CommandViewModel command) @@ -536,6 +545,8 @@ public class ConsoleLogsViewModel public record ConsoleLogsPageState(string? SelectedResource); + public record ConsoleLogTimestampState(bool HideTimestamp); + public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) { if (_resources is not null && ResourceName is not null) @@ -558,7 +569,7 @@ public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) public string GetUrlFromSerializableViewModel(ConsoleLogsPageState serializable) { - return DashboardUrls.ConsoleLogsUrl(serializable.SelectedResource, serializable.HideTimestamp); + return DashboardUrls.ConsoleLogsUrl(serializable.SelectedResource); } public ConsoleLogsPageState ConvertViewModelToSerializable() diff --git a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs index f734c4c6342..64de29c8739 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 ConsoleLogTimestampState = "Aspire_PageState_ConsoleLogTimestamp"; 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; } From 806f079828f8673fe44ec843d71a1fb5255581ff Mon Sep 17 00:00:00 2001 From: Adam Ratzman Date: Mon, 27 Jan 2025 18:04:26 -0500 Subject: [PATCH 3/3] Use local storage instead, rename type --- .../Components/Pages/ConsoleLogs.razor.cs | 11 +++++++---- src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs b/src/Aspire.Dashboard/Components/Pages/ConsoleLogs.razor.cs index f91b5170c18..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; } @@ -94,7 +97,6 @@ private sealed class ConsoleLogsSubscription public string BasePath => DashboardUrls.ConsoleLogBasePath; public string SessionStorageKey => BrowserStorageKeys.ConsoleLogsPageState; - private const string HideTimestampStorageKey = BrowserStorageKeys.ConsoleLogTimestampState; protected override async Task OnInitializedAsync() { @@ -103,7 +105,7 @@ protected override async Task OnInitializedAsync() _noSelection = new() { Id = null, Name = ControlsStringsLoc[nameof(ControlsStrings.LabelNone)] }; PageViewModel = new ConsoleLogsViewModel { SelectedOption = _noSelection, SelectedResource = null, Status = Loc[nameof(Dashboard.Resources.ConsoleLogs.ConsoleLogsLoadingResources)] }; - var timestampStorageResult = await SessionStorage.GetAsync(HideTimestampStorageKey); + var timestampStorageResult = await LocalStorage.GetUnprotectedAsync(BrowserStorageKeys.ConsoleLogConsoleSettings); if (timestampStorageResult.Value?.HideTimestamp is { } hideTimestamp) { _hideTimestamp = hideTimestamp; @@ -314,8 +316,9 @@ private void UpdateMenuButtons() private async Task ToggleTimestampAsync(bool hideTimestamp) { - await SessionStorage.SetAsync(HideTimestampStorageKey, new ConsoleLogTimestampState(HideTimestamp: hideTimestamp)); + await LocalStorage.SetUnprotectedAsync(BrowserStorageKeys.ConsoleLogConsoleSettings, new ConsoleLogConsoleSettings(HideTimestamp: hideTimestamp)); _hideTimestamp = hideTimestamp; + StateHasChanged(); } @@ -545,7 +548,7 @@ public class ConsoleLogsViewModel public record ConsoleLogsPageState(string? SelectedResource); - public record ConsoleLogTimestampState(bool HideTimestamp); + public record ConsoleLogConsoleSettings(bool HideTimestamp); public Task UpdateViewModelFromQueryAsync(ConsoleLogsViewModel viewModel) { diff --git a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs index 64de29c8739..1d5e8eeaeab 100644 --- a/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs +++ b/src/Aspire.Dashboard/Utils/BrowserStorageKeys.cs @@ -13,7 +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 ConsoleLogTimestampState = "Aspire_PageState_ConsoleLogTimestamp"; + public const string ConsoleLogConsoleSettings = "Aspire_ConsoleLog_ConsoleSettings"; public static string SplitterOrientationKey(string viewKey) {