diff --git a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor index a969103..b02bc59 100644 --- a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor +++ b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor @@ -181,9 +181,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) { - // 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) + if (!_revealApplied && TemplateIdParam > 0 && _tree != null) { _revealApplied = true; await _tree.RevealNode($"t:{TemplateIdParam}", select: true); diff --git a/src/ScadaLink.CentralUI/Components/Shared/TreeView.razor b/src/ScadaLink.CentralUI/Components/Shared/TreeView.razor index 2f8d85a..67c1121 100644 --- a/src/ScadaLink.CentralUI/Components/Shared/TreeView.razor +++ b/src/ScadaLink.CentralUI/Components/Shared/TreeView.razor @@ -127,7 +127,10 @@ else var keys = System.Text.Json.JsonSerializer.Deserialize>(json); if (keys != null) { - _expandedKeys = new HashSet(keys); + // Union (don't replace): callers may have invoked RevealNode before + // this async storage load completed. Preserving those reveal-added + // keys ensures deep-link reveal isn't clobbered by the restore. + foreach (var k in keys) _expandedKeys.Add(k); _initialExpansionApplied = true; } }