From d8e6f44616eab48aa7dcaa55acae0de46a667fac Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 11 May 2026 12:39:21 -0400 Subject: [PATCH] fix(ui/templates): defer deep-link reveal until TreeView restores sessionStorage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../Components/Pages/Design/Templates.razor | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor index 061e475..a969103 100644 --- a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor +++ b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor @@ -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); } }