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;
