Add table context URL serializer
This commit is contained in:
@@ -4,10 +4,12 @@
|
||||
@using System.Collections.Generic
|
||||
@using System.Diagnostics.CodeAnalysis
|
||||
@using System.Linq
|
||||
@inject NavigationManager NavigationManager
|
||||
@inject IJSRuntime JSRuntime
|
||||
@inject LookupService LookupService
|
||||
@inject RolemasterDb.App.Frontend.AppState.PinnedTablesState PinnedTablesState
|
||||
@inject RolemasterDb.App.Frontend.AppState.RecentTablesState RecentTablesState
|
||||
@inject RolemasterDb.App.Frontend.AppState.TableContextUrlSerializer TableContextUrlSerializer
|
||||
|
||||
<PageTitle>Critical Tables</PageTitle>
|
||||
|
||||
@@ -285,6 +287,7 @@
|
||||
isTableMenuOpen = false;
|
||||
await PersistSelectedTableAsync(tableSlug);
|
||||
await LoadTableDetailAsync();
|
||||
SyncTableContextUrl();
|
||||
}
|
||||
|
||||
private async Task LoadTableDetailAsync()
|
||||
@@ -335,16 +338,18 @@
|
||||
{
|
||||
try
|
||||
{
|
||||
var routeContext = TableContextUrlSerializer.Parse(NavigationManager.Uri);
|
||||
var storedTableSlug = await JSRuntime.InvokeAsync<string?>("localStorage.getItem", SelectedTableStorageKey);
|
||||
hasResolvedStoredTableSelection = true;
|
||||
|
||||
var resolvedTableSlug = ResolveSelectedTableSlug(storedTableSlug);
|
||||
var resolvedTableSlug = ResolveSelectedTableSlug(routeContext.TableSlug ?? storedTableSlug);
|
||||
if (string.IsNullOrWhiteSpace(selectedTableSlug) ||
|
||||
!string.Equals(resolvedTableSlug, selectedTableSlug, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
selectedTableSlug = resolvedTableSlug;
|
||||
await LoadTableDetailAsync();
|
||||
await PersistSelectedTableAsync(selectedTableSlug);
|
||||
SyncTableContextUrl();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
return;
|
||||
}
|
||||
@@ -353,6 +358,8 @@
|
||||
{
|
||||
await PersistSelectedTableAsync(selectedTableSlug);
|
||||
}
|
||||
|
||||
SyncTableContextUrl();
|
||||
}
|
||||
catch (InvalidOperationException)
|
||||
{
|
||||
@@ -793,6 +800,27 @@
|
||||
private Task PersistSelectedTableAsync(string tableSlug) =>
|
||||
JSRuntime.InvokeVoidAsync("localStorage.setItem", SelectedTableStorageKey, tableSlug).AsTask();
|
||||
|
||||
private void SyncTableContextUrl()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(selectedTableSlug))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var targetUri = TableContextUrlSerializer.BuildRelativeUri(
|
||||
"/tables",
|
||||
new RolemasterDb.App.Frontend.AppState.TableContextSnapshot(
|
||||
TableSlug: selectedTableSlug,
|
||||
Mode: RolemasterDb.App.Frontend.AppState.TableContextMode.Reference));
|
||||
|
||||
if (string.Equals(NavigationManager.ToBaseRelativePath(NavigationManager.Uri), targetUri.TrimStart('/'), StringComparison.Ordinal))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
NavigationManager.NavigateTo(targetUri, replace: true);
|
||||
}
|
||||
|
||||
private Task TogglePinnedTableAsync()
|
||||
{
|
||||
if (SelectedTableReference is not { } selectedTable)
|
||||
|
||||
Reference in New Issue
Block a user