This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch feature/CAMEL-23672-tui-diagram
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 7876f67763629434563256f125effe83f1547bee
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Jun 3 22:22:41 2026 +0200

    CAMEL-23672: camel-tui - Fix diagram not shown on Enter and uri fallback
    
    Select first EIP node immediately on drill-down (index 0 instead of -1)
    so the diagram renders on the first frame. Also add code-field fallback
    when uri is null for compatibility with older Camel runtimes.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../jbang/core/commands/tui/DiagramSupport.java    | 27 ++++++++++++++++++----
 .../dsl/jbang/core/commands/tui/DiagramTab.java    |  6 ++---
 .../commands/tui/diagram/RouteDiagramWidget.java   | 18 +++++++++++----
 3 files changed, 39 insertions(+), 12 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java
index 8fd0464e085e..738553cf6ccd 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramSupport.java
@@ -594,7 +594,7 @@ class DiagramSupport {
                 && !"from".equals(type)) {
             return null;
         }
-        String baseUri = stripQueryParams(box.layoutNode().treeNode.info.uri);
+        String baseUri = getBaseUri(box.layoutNode().treeNode.info);
         if (baseUri == null || baseUri.isBlank()) {
             return null;
         }
@@ -627,7 +627,7 @@ class DiagramSupport {
                 if (!lr.nodes.isEmpty()) {
                     var firstNode = lr.nodes.get(0);
                     if ("from".equals(firstNode.type) && firstNode.treeNode != 
null) {
-                        String fromBaseUri = 
stripQueryParams(firstNode.treeNode.info.uri);
+                        String fromBaseUri = 
getBaseUri(firstNode.treeNode.info);
                         if (baseUri.equals(fromBaseUri)) {
                             return entry.getKey();
                         }
@@ -638,6 +638,23 @@ class DiagramSupport {
         return null;
     }
 
+    static String getBaseUri(RouteDiagramLayoutEngine.NodeInfo info) {
+        String uri = info.uri;
+        if (uri == null) {
+            uri = extractUriFromCode(info.code);
+        }
+        return stripQueryParams(uri);
+    }
+
+    private static String extractUriFromCode(String code) {
+        if (code == null) {
+            return null;
+        }
+        int open = code.indexOf('[');
+        int close = code.lastIndexOf(']');
+        return (open >= 0 && close > open) ? code.substring(open + 1, close) : 
code;
+    }
+
     static String stripQueryParams(String uri) {
         if (uri == null) {
             return null;
@@ -751,7 +768,7 @@ class DiagramSupport {
         if (currentLayout != null && !currentLayout.nodes.isEmpty()) {
             var fromNode = currentLayout.nodes.get(0);
             if ("from".equals(fromNode.type) && fromNode.treeNode != null) {
-                currentFromUri = stripQueryParams(fromNode.treeNode.info.uri);
+                currentFromUri = getBaseUri(fromNode.treeNode.info);
             }
         }
 
@@ -764,7 +781,7 @@ class DiagramSupport {
                 // Add "from" URIs of other routes (linkable from "to" nodes)
                 var firstNode = lr.nodes.get(0);
                 if ("from".equals(firstNode.type) && firstNode.treeNode != 
null) {
-                    String uri = stripQueryParams(firstNode.treeNode.info.uri);
+                    String uri = getBaseUri(firstNode.treeNode.info);
                     if (uri != null) {
                         endpoints.add(uri);
                     }
@@ -775,7 +792,7 @@ class DiagramSupport {
                         String type = node.type;
                         if (("to".equals(type) || "toD".equals(type) || 
"wireTap".equals(type))
                                 && node.treeNode != null) {
-                            String uri = 
stripQueryParams(node.treeNode.info.uri);
+                            String uri = getBaseUri(node.treeNode.info);
                             if (currentFromUri.equals(uri)) {
                                 endpoints.add(currentFromUri);
                             }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java
index ecdc67961f43..d4b16b783468 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/DiagramTab.java
@@ -141,7 +141,7 @@ class DiagramTab implements MonitorTab {
             if (linkedRouteId != null && diagram.getRouteLayout(linkedRouteId) 
!= null) {
                 routeNavigationStack.push(drillDownRouteId);
                 drillDownRouteId = linkedRouteId;
-                diagram.setSelectedEipNodeIndex(-1);
+                diagram.setSelectedEipNodeIndex(0);
                 diagram.resetScroll();
                 return true;
             }
@@ -158,7 +158,7 @@ class DiagramTab implements MonitorTab {
                     drillDownRouteId = selectedRouteId;
                     topologyMode = false;
                     diagram.setTopologyMode(false);
-                    diagram.setSelectedEipNodeIndex(-1);
+                    diagram.setSelectedEipNodeIndex(0);
                     diagram.resetScroll();
                     diagram.endLoad();
                     // Use cached route layout if available (no IPC needed)
@@ -180,7 +180,7 @@ class DiagramTab implements MonitorTab {
             if (!routeNavigationStack.isEmpty()) {
                 // Go back to the previous route in the stack
                 drillDownRouteId = routeNavigationStack.pop();
-                diagram.setSelectedEipNodeIndex(-1);
+                diagram.setSelectedEipNodeIndex(0);
                 diagram.resetScroll();
                 return true;
             }
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java
index 8762935f9536..a2fae9e0de84 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/diagram/RouteDiagramWidget.java
@@ -429,13 +429,23 @@ public class RouteDiagramWidget implements Widget {
                 && !"from".equals(type)) {
             return false;
         }
-        String uri = node.treeNode.info.uri;
+        String baseUri = getBaseUri(node.treeNode.info);
+        return baseUri != null && linkableEndpoints.contains(baseUri);
+    }
+
+    private static String getBaseUri(RouteDiagramLayoutEngine.NodeInfo info) {
+        String uri = info.uri;
         if (uri == null) {
-            return false;
+            String code = info.code;
+            if (code == null) {
+                return null;
+            }
+            int open = code.indexOf('[');
+            int close = code.lastIndexOf(']');
+            uri = (open >= 0 && close > open) ? code.substring(open + 1, 
close) : code;
         }
         int q = uri.indexOf('?');
-        String baseUri = q >= 0 ? uri.substring(0, q) : uri;
-        return linkableEndpoints.contains(baseUri);
+        return q >= 0 ? uri.substring(0, q) : uri;
     }
 
     private int toRow(int pixelY) {

Reply via email to