From 1f86945d46e0402ba4675cd8023e11711464fbed Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 12 May 2026 09:50:22 -0400 Subject: [PATCH] refactor(ui/templates): drop row kebabs; double-click opens templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The right-click context menu is now the single entry point for every per-row action — folders, templates, and composition leaves. Drop the ⋮ kebab buttons that duplicated the menu and the click-to-open behavior that was easy to trigger by accident while navigating the tree. Templates and composition slots open on double-click instead. - RenderNodeKebab removed entirely. - Selectable / SelectedKeyChanged / OnTreeNodeSelected dropped from the TreeView wiring — single-click no longer navigates. - New OpenTemplate(id) helper bound to @ondblclick on Template and Composition labels. --- .../Components/Pages/Design/Templates.razor | 75 ++----------------- 1 file changed, 8 insertions(+), 67 deletions(-) diff --git a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor index b811c92..0c6a4e1 100644 --- a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor +++ b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor @@ -83,9 +83,7 @@ ChildrenSelector="n => n.Children" HasChildrenSelector="n => n.Kind != TmplNodeKind.Composition && n.Children.Count > 0" KeySelector="n => (object)n.Key" - StorageKey="templates-tree" - Selectable="true" - SelectedKeyChanged="OnTreeNodeSelected"> + StorageKey="templates-tree"> @RenderNodeLabel(node) @@ -234,6 +232,9 @@ private TreeView _tree = default!; + private void OpenTemplate(int templateId) => + NavigationManager.NavigateTo($"/design/templates/{templateId}"); + private RenderFragment RenderNodeLabel(TmplNode node) => __builder => { switch (node.Kind) @@ -249,83 +250,23 @@ @node.Children.Count } - @RenderNodeKebab(node) break; case TmplNodeKind.Template: @node.Label - @RenderNodeKebab(node) + title="@node.Label" + @ondblclick="() => OpenTemplate(node.EntityId)">@node.Label break; case TmplNodeKind.Composition: - @node.Label - @RenderNodeKebab(node) + @node.Label break; } }; - private RenderFragment RenderNodeKebab(TmplNode node) => __builder => - { - - - - - }; - - private void OnTreeNodeSelected(object? key) - { - if (key is not string s) return; - if (s.StartsWith("t:") && int.TryParse(s[2..], out var tid)) - { - NavigationManager.NavigateTo($"/design/templates/{tid}"); - } - else if (s.StartsWith("c:") && int.TryParse(s[2..], out var cid)) - { - var comp = _templates.SelectMany(t => t.Compositions).FirstOrDefault(c => c.Id == cid); - if (comp != null) - { - NavigationManager.NavigateTo($"/design/templates/{comp.ComposedTemplateId}"); - } - } - // Folder selection is intentionally a no-op (use right-click for folder actions). - } - private RenderFragment RenderNodeContextMenu(TmplNode node) => __builder => { switch (node.Kind)