Persist selected table on tables page

This commit is contained in:
2026-03-21 11:08:40 +01:00
parent fbbeebf056
commit de670c98cd

View File

@@ -311,6 +311,7 @@
}
@code {
private const string SelectedTableStorageKey = "rolemaster.tables.selectedTable";
private LookupReferenceData? referenceData;
private CriticalTableDetail? tableDetail;
private string selectedTableSlug = string.Empty;
@@ -341,6 +342,7 @@
private int? curatingResultId;
private CriticalCellEditorModel? curationModel;
private bool isTableMenuOpen;
private bool hasResolvedStoredTableSelection;
private CriticalTableReference? SelectedTableReference =>
referenceData?.CriticalTables.FirstOrDefault(item => string.Equals(item.Key, selectedTableSlug, StringComparison.OrdinalIgnoreCase));
@@ -372,6 +374,7 @@
{
selectedTableSlug = tableSlug;
isTableMenuOpen = false;
await PersistSelectedTableAsync(tableSlug);
await LoadTableDetailAsync();
}
@@ -412,6 +415,34 @@
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (!hasResolvedStoredTableSelection && referenceData?.CriticalTables.Count > 0)
{
try
{
var storedTableSlug = await JSRuntime.InvokeAsync<string?>("localStorage.getItem", SelectedTableStorageKey);
hasResolvedStoredTableSelection = true;
var resolvedTableSlug = ResolveSelectedTableSlug(storedTableSlug);
if (!string.Equals(resolvedTableSlug, selectedTableSlug, StringComparison.OrdinalIgnoreCase))
{
selectedTableSlug = resolvedTableSlug;
await LoadTableDetailAsync();
await PersistSelectedTableAsync(selectedTableSlug);
await InvokeAsync(StateHasChanged);
return;
}
if (!string.Equals(storedTableSlug, selectedTableSlug, StringComparison.OrdinalIgnoreCase))
{
await PersistSelectedTableAsync(selectedTableSlug);
}
}
catch (InvalidOperationException)
{
// During prerender localStorage is unavailable. Retry after interactive render.
}
}
if (tableDetail is null || appliedLayoutVersion == tableLayoutVersion)
{
return;
@@ -812,6 +843,25 @@
private string GetSelectedTableLabel() =>
SelectedTableReference?.Label ?? "Select a table";
private string ResolveSelectedTableSlug(string? storedTableSlug)
{
if (referenceData is null || referenceData.CriticalTables.Count == 0)
{
return string.Empty;
}
if (!string.IsNullOrWhiteSpace(storedTableSlug) &&
referenceData.CriticalTables.Any(item => string.Equals(item.Key, storedTableSlug, StringComparison.OrdinalIgnoreCase)))
{
return storedTableSlug;
}
return referenceData.CriticalTables.First().Key;
}
private Task PersistSelectedTableAsync(string tableSlug) =>
JSRuntime.InvokeVoidAsync("localStorage.setItem", SelectedTableStorageKey, tableSlug).AsTask();
private string GetTableOptionCssClass(CriticalTableReference table)
{
var classes = new List<string>();