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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d1f6907efc37517cea07432d210f1111edbb27bc
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Jul 10 16:31:19 2026 +0200

    TUI: Fix selection index mismatch in getSelectionContext/getTableDataAsJson 
across 8 tabs
    
    Apply the same sort order used by the render path so that selectedIndex
    and row order in MCP/AI JSON responses match what the user sees on screen.
    
    - ConfigurationTab: sort via sortedProperties() in both methods
    - HistoryTab: apply reorderHistoryDepthFirst() in getSelectionContext
    - MavenDependenciesTab: sort via sortDep in both methods
    - ConsumersTab: sort via sortConsumer in getTableDataAsJson
    - SqlTraceTab: sort via sortTrace in getTableDataAsJson
    - InflightTab: sort via sortExchange in getTableDataAsJson
    - CircuitBreakerTab: sort via sortCb in getTableDataAsJson
    - HealthTab: filter via getFilteredHealthChecks and sort via sortHealth in 
getTableDataAsJson
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java     | 4 +++-
 .../camel/dsl/jbang/core/commands/tui/ConfigurationTab.java      | 4 ++--
 .../apache/camel/dsl/jbang/core/commands/tui/ConsumersTab.java   | 4 +++-
 .../org/apache/camel/dsl/jbang/core/commands/tui/HealthTab.java  | 4 +++-
 .../org/apache/camel/dsl/jbang/core/commands/tui/HistoryTab.java | 2 +-
 .../apache/camel/dsl/jbang/core/commands/tui/InflightTab.java    | 4 +++-
 .../camel/dsl/jbang/core/commands/tui/MavenDependenciesTab.java  | 9 ++++++---
 .../apache/camel/dsl/jbang/core/commands/tui/SqlTraceTab.java    | 4 +++-
 8 files changed, 24 insertions(+), 11 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java
index eedf97e70c36..4e210e6c3980 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CircuitBreakerTab.java
@@ -488,7 +488,9 @@ class CircuitBreakerTab extends AbstractTableTab {
         JsonObject result = new JsonObject();
         result.put("tab", "CircuitBreaker");
         JsonArray rows = new JsonArray();
-        for (CircuitBreakerInfo cb : info.circuitBreakers) {
+        List<CircuitBreakerInfo> sorted = new 
ArrayList<>(info.circuitBreakers);
+        sorted.sort(this::sortCb);
+        for (CircuitBreakerInfo cb : sorted) {
             JsonObject row = new JsonObject();
             row.put("routeId", cb.routeId);
             row.put("id", cb.id);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConfigurationTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConfigurationTab.java
index 25d85eebbbfd..007a5e7139c5 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConfigurationTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConfigurationTab.java
@@ -370,7 +370,7 @@ class ConfigurationTab extends AbstractTableTab {
         if (info == null || info.configProperties.isEmpty()) {
             return null;
         }
-        List<String> items = info.configProperties.stream().map(p -> 
p.key).toList();
+        List<String> items = sortedProperties(info).stream().map(p -> 
p.key).toList();
         Integer sel = tableState.selected();
         return new SelectionContext("table", items, sel != null ? sel : -1, 
items.size(), "Configuration");
     }
@@ -455,7 +455,7 @@ class ConfigurationTab extends AbstractTableTab {
         JsonObject result = new JsonObject();
         result.put("tab", "Configuration");
         JsonArray rows = new JsonArray();
-        for (ConfigProperty cp : info.configProperties) {
+        for (ConfigProperty cp : sortedProperties(info)) {
             JsonObject row = new JsonObject();
             row.put("key", cp.key);
             row.put("value", cp.value);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConsumersTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConsumersTab.java
index c6e326a69a70..c3152dac3e23 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConsumersTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ConsumersTab.java
@@ -385,7 +385,9 @@ class ConsumersTab extends AbstractTableTab {
         JsonObject result = new JsonObject();
         result.put("tab", "Consumers");
         JsonArray rows = new JsonArray();
-        for (ConsumerInfo ci : info.consumers) {
+        List<ConsumerInfo> sorted = new ArrayList<>(info.consumers);
+        sorted.sort(this::sortConsumer);
+        for (ConsumerInfo ci : sorted) {
             JsonObject row = new JsonObject();
             row.put("id", ci.id);
             row.put("uri", ci.uri);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HealthTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HealthTab.java
index 4b6a0dcf5b89..3fe734b5bc08 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HealthTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HealthTab.java
@@ -296,7 +296,9 @@ class HealthTab extends AbstractTableTab {
         JsonObject result = new JsonObject();
         result.put("tab", "Health");
         JsonArray rows = new JsonArray();
-        for (HealthCheckInfo hi : info.healthChecks) {
+        List<HealthCheckInfo> checks = new 
ArrayList<>(getFilteredHealthChecks(info));
+        checks.sort(this::sortHealth);
+        for (HealthCheckInfo hi : checks) {
             JsonObject row = new JsonObject();
             row.put("group", hi.group);
             row.put("name", hi.name);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HistoryTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HistoryTab.java
index 572b6b4592fa..831dc3b69b1d 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HistoryTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HistoryTab.java
@@ -2276,7 +2276,7 @@ class HistoryTab extends AbstractTab {
         if (historyEntries.isEmpty()) {
             return null;
         }
-        List<String> items = historyEntries.stream()
+        List<String> items = reorderHistoryDepthFirst(historyEntries).stream()
                 .map(h -> h.exchangeId != null ? h.exchangeId : "")
                 .toList();
         Integer sel = historyTableState.selected();
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InflightTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InflightTab.java
index 6d5b49859dae..e38f1da51b30 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InflightTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/InflightTab.java
@@ -293,7 +293,9 @@ class InflightTab extends AbstractTableTab {
         JsonObject result = new JsonObject();
         result.put("tab", "Inflight");
         JsonArray rows = new JsonArray();
-        for (InflightInfo ii : info.inflightExchanges) {
+        List<InflightInfo> sorted = new ArrayList<>(info.inflightExchanges);
+        sorted.sort(this::sortExchange);
+        for (InflightInfo ii : sorted) {
             JsonObject row = new JsonObject();
             row.put("exchangeId", ii.exchangeId);
             row.put("fromRouteId", ii.fromRouteId);
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MavenDependenciesTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MavenDependenciesTab.java
index ad309649aa5a..b365db6d3f12 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MavenDependenciesTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/MavenDependenciesTab.java
@@ -464,7 +464,9 @@ class MavenDependenciesTab extends AbstractTableTab {
         if (filteredEntries.isEmpty()) {
             return null;
         }
-        List<String> items = 
filteredEntries.stream().map(DependencyLoader.DepEntry::display).toList();
+        List<DependencyLoader.DepEntry> sorted = new 
ArrayList<>(filteredEntries);
+        sorted.sort(this::sortDep);
+        List<String> items = 
sorted.stream().map(DependencyLoader.DepEntry::display).toList();
         Integer sel = tableState.selected();
         return new SelectionContext("table", items, sel != null ? sel : -1, 
items.size(), "Maven Dependencies");
     }
@@ -563,10 +565,11 @@ class MavenDependenciesTab extends AbstractTableTab {
 
     @Override
     public JsonObject getTableDataAsJson() {
-        List<DependencyLoader.DepEntry> entries = filteredEntries;
-        if (entries.isEmpty()) {
+        if (filteredEntries.isEmpty()) {
             return null;
         }
+        List<DependencyLoader.DepEntry> entries = new 
ArrayList<>(filteredEntries);
+        entries.sort(this::sortDep);
         JsonObject result = new JsonObject();
         result.put("tab", "Maven Dependencies");
         JsonArray rows = new JsonArray();
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlTraceTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlTraceTab.java
index c4ec4d4802a5..55ade2ef52a2 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlTraceTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/SqlTraceTab.java
@@ -495,7 +495,9 @@ class SqlTraceTab extends AbstractTableTab {
         JsonObject result = new JsonObject();
         result.put("tab", "SQL Trace");
         JsonArray rows = new JsonArray();
-        for (SqlTraceInfo si : info.sqlTraceStatements) {
+        List<SqlTraceInfo> sorted = new ArrayList<>(info.sqlTraceStatements);
+        sorted.sort(this::sortTrace);
+        for (SqlTraceInfo si : sorted) {
             JsonObject row = new JsonObject();
             row.put("timestamp", si.timestamp);
             row.put("exchangeId", si.exchangeId);

Reply via email to