fix(ui/templates): defer deep-link reveal until TreeView restores sessionStorage

Both page.OnAfterRenderAsync(firstRender=true) and
TreeView.OnAfterRenderAsync(firstRender=true) ran concurrently:
- Page called RevealNode → added ancestor keys to _expandedKeys
- TreeView awaited treeviewStorage.load → replaced _expandedKeys with
  the persisted set (often empty if user collapsed before navigating)

Whichever JS interop completed second won. When TreeView won, the deep-link
reveal silently lost. Gate the reveal on firstRender==false so it runs
strictly after TreeView's restore is done.
This commit is contained in:
Joseph Doherty
2026-05-11 12:39:21 -04:00
parent ca164dca03
commit d8e6f44616

View File

@@ -177,10 +177,15 @@
}
}
private bool _revealApplied;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender && TemplateIdParam > 0 && _tree != null)
// Wait until second render so TreeView has finished restoring its sessionStorage
// expansion state; otherwise that restore races with RevealNode and overwrites it.
if (!_revealApplied && !firstRender && TemplateIdParam > 0 && _tree != null)
{
_revealApplied = true;
await _tree.RevealNode($"t:{TemplateIdParam}", select: true);
}
}