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

davsclaus pushed a commit to branch tui-keystroke-overlay
in repository https://gitbox.apache.org/repos/asf/camel.git

commit c53cb9473c7d4ffd9fcc4076c59c7b68a9fcf0ae
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu May 21 18:12:12 2026 +0200

    camel-tui: Add sorting to health/http tabs, fix log page navigation, 
default chart to single
    
    - Health tab: add sort by group/name/status (default: name)
    - HTTP tab: add TOTAL to sortable columns
    - Log tab: wire PgUp/PgDn into handleKeyEvent
    - Overview chart defaults to single instead of all
    
    Co-Authored-By: Claude <[email protected]>
---
 .../dsl/jbang/core/commands/tui/CamelMonitor.java  |  2 +-
 .../dsl/jbang/core/commands/tui/HealthTab.java     | 42 ++++++++++++++++++----
 .../camel/dsl/jbang/core/commands/tui/HttpTab.java |  5 +--
 .../camel/dsl/jbang/core/commands/tui/LogTab.java  |  8 +++++
 4 files changed, 47 insertions(+), 10 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
index f79c0d2be4ce..d2cf25145fb7 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
@@ -192,7 +192,7 @@ public class CamelMonitor extends CamelCommand {
     private static final int CHART_ALL = 0;
     private static final int CHART_SINGLE = 1;
     private static final int CHART_OFF = 2;
-    private int chartMode = CHART_ALL;
+    private int chartMode = CHART_SINGLE;
 
     private volatile long lastRefresh;
     private boolean showKillConfirm;
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 b95750f04f90..2da1b9fbf79f 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
@@ -33,11 +33,18 @@ import dev.tamboui.widgets.table.Row;
 import dev.tamboui.widgets.table.Table;
 import dev.tamboui.widgets.table.TableState;
 
+import static org.apache.camel.dsl.jbang.core.commands.tui.MonitorContext.*;
+
 class HealthTab implements MonitorTab {
 
+    private static final String[] SORT_COLUMNS = { "group", "name", "status" };
+
     private final MonitorContext ctx;
     private final TableState tableState = new TableState();
     private boolean showOnlyDown;
+    private String sort = "name";
+    private int sortIndex = 1;
+    private boolean sortReversed;
 
     HealthTab(MonitorContext ctx) {
         this.ctx = ctx;
@@ -45,6 +52,16 @@ class HealthTab implements MonitorTab {
 
     @Override
     public boolean handleKeyEvent(KeyEvent ke) {
+        if (ke.isChar('s')) {
+            sortIndex = (sortIndex + 1) % SORT_COLUMNS.length;
+            sort = SORT_COLUMNS[sortIndex];
+            sortReversed = false;
+            return true;
+        }
+        if (ke.isChar('S')) {
+            sortReversed = !sortReversed;
+            return true;
+        }
         if (ke.isCharIgnoreCase('d')) {
             showOnlyDown = !showOnlyDown;
             return true;
@@ -73,7 +90,8 @@ class HealthTab implements MonitorTab {
             return;
         }
 
-        List<HealthCheckInfo> healthChecks = getFilteredHealthChecks(info);
+        List<HealthCheckInfo> healthChecks = new 
ArrayList<>(getFilteredHealthChecks(info));
+        healthChecks.sort(this::sortHealth);
 
         List<Row> rows = new ArrayList<>();
         for (HealthCheckInfo hc : healthChecks) {
@@ -123,9 +141,9 @@ class HealthTab implements MonitorTab {
         Table table = Table.builder()
                 .rows(rows)
                 .header(Row.from(
-                        Cell.from(Span.styled("GROUP", Style.EMPTY.bold())),
-                        Cell.from(Span.styled("NAME", Style.EMPTY.bold())),
-                        Cell.from(Span.styled("STATUS", Style.EMPTY.bold())),
+                        Cell.from(Span.styled(sortLabel("GROUP", "group", 
sort, sortReversed), sortStyle("group", sort))),
+                        Cell.from(Span.styled(sortLabel("NAME", "name", sort, 
sortReversed), sortStyle("name", sort))),
+                        Cell.from(Span.styled(sortLabel("STATUS", "status", 
sort, sortReversed), sortStyle("status", sort))),
                         Cell.from(Span.styled("KIND", Style.EMPTY.bold())),
                         Cell.from(Span.styled("MESSAGE", Style.EMPTY.bold()))))
                 .widths(
@@ -142,15 +160,25 @@ class HealthTab implements MonitorTab {
 
     @Override
     public void renderFooter(List<Span> spans) {
-        MonitorContext.hint(spans, "Esc", "back");
-        MonitorContext.hint(spans, "d", "toggle DOWN");
-        MonitorContext.hint(spans, "1-9", "tabs");
+        hint(spans, "Esc", "back");
+        hint(spans, "s", "sort");
+        hint(spans, "d", "toggle DOWN");
+        hint(spans, "1-9", "tabs");
     }
 
     boolean isShowOnlyDown() {
         return showOnlyDown;
     }
 
+    private int sortHealth(HealthCheckInfo a, HealthCheckInfo b) {
+        int result = switch (sort) {
+            case "name" -> compareStr(a.name, b.name);
+            case "status" -> compareStr(a.state, b.state);
+            default -> compareStr(a.group, b.group);
+        };
+        return sortReversed ? -result : result;
+    }
+
     List<HealthCheckInfo> getFilteredHealthChecks(IntegrationInfo info) {
         if (showOnlyDown) {
             return info.healthChecks.stream().filter(hc -> 
"DOWN".equals(hc.state)).toList();
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HttpTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HttpTab.java
index c9ef20aed030..15c2a0bf74a4 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HttpTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/HttpTab.java
@@ -51,7 +51,7 @@ import static 
org.apache.camel.dsl.jbang.core.commands.tui.MonitorContext.*;
 
 class HttpTab implements MonitorTab {
 
-    private static final String[] SORT_COLUMNS = { "method", "path", 
"consumes", "produces", "source" };
+    private static final String[] SORT_COLUMNS = { "method", "path", "total", 
"consumes", "produces", "source" };
     private static final Set<String> OPENAPI_HTTP_VERBS
             = Set.of("get", "post", "put", "delete", "patch", "options", 
"head", "trace");
 
@@ -202,6 +202,7 @@ class HttpTab implements MonitorTab {
         visible.sort((a, b) -> {
             int result = switch (sort) {
                 case "path" -> compareStr(a.path, b.path);
+                case "total" -> Long.compare(a.hits, b.hits);
                 case "source" -> Boolean.compare(b.fromRest, a.fromRest);
                 case "consumes" -> compareStr(a.consumes, b.consumes);
                 case "produces" -> compareStr(a.produces, b.produces);
@@ -315,7 +316,7 @@ class HttpTab implements MonitorTab {
         Row header = Row.from(
                 Cell.from(Span.styled(sortLabel("METHOD", "method"), 
sortStyle("method"))),
                 Cell.from(Span.styled(sortLabel("PATH", "path"), 
sortStyle("path"))),
-                rightCell("TOTAL", 8, Style.EMPTY.bold()),
+                rightCell(sortLabel("TOTAL", "total"), 8, sortStyle("total")),
                 Cell.from(Span.styled(sortLabel("CONSUMES", "consumes"), 
sortStyle("consumes"))),
                 Cell.from(Span.styled(sortLabel("PRODUCES", "produces"), 
sortStyle("produces"))),
                 Cell.from(Span.styled(sortLabel("SOURCE", "source"), 
sortStyle("source"))),
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/LogTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/LogTab.java
index 6c1c3164ce19..a66d0661a549 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/LogTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/LogTab.java
@@ -139,6 +139,14 @@ class LogTab implements MonitorTab {
                 return true;
             }
         }
+        if (ke.isPageUp()) {
+            pageUp();
+            return true;
+        }
+        if (ke.isPageDown()) {
+            pageDown();
+            return true;
+        }
         if (ke.isHome()) {
             followMode = false;
             scroll = 0;

Reply via email to