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


The following commit(s) were added to refs/heads/main by this push:
     new 9e34ba44c88a camel-jbang (tui) - Align x-axis timeline between 
endpoint charts
9e34ba44c88a is described below

commit 9e34ba44c88a5509434f1c31c3b5e48d5e39233c
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Aug 12 21:34:19 2026 +0200

    camel-jbang (tui) - Align x-axis timeline between endpoint charts
    
    The throughput and payload size charts had different x-axis timelines
    (e.g. -40s vs -80s) because they computed renderPoints independently
    from different-width areas. Now uses a three-column layout (flow panel,
    throughput chart, payload chart) so both charts get equal width and
    share the same renderPoints for aligned timelines.
    
    camel-jbang (tui) - Add space before chart legend in title bar
    
    The colored legend indicator was flush against the border corner,
    looking like a chart artifact. Add leading space padding.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../dsl/jbang/core/commands/tui/EndpointsTab.java  | 48 +++++++++++++++++-----
 .../dsl/jbang/core/commands/tui/FlowHelper.java    | 21 +++++++++-
 2 files changed, 57 insertions(+), 12 deletions(-)

diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
index 4fceee674992..305cf77220da 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/EndpointsTab.java
@@ -371,11 +371,17 @@ class EndpointsTab extends AbstractTableTab {
                         .sum();
 
                 if (hasSizeHistory) {
-                    List<Rect> chartSplit = Layout.horizontal()
-                            .constraints(Constraint.percentage(50), 
Constraint.percentage(50))
+                    // three-column layout: flow panel (fixed) | throughput 
chart | payload chart
+                    List<Rect> threeParts = Layout.horizontal()
+                            .constraints(Constraint.length(flowPanelWidth), 
Constraint.fill(), Constraint.fill())
                             .split(chunks.get(1));
-                    renderEndpointFlow(frame, chartSplit.get(0), inTotal, 
outTotal, info.name, info.pid);
-                    renderPayloadSizeChart(frame, chartSplit.get(1), info.pid);
+                    hSplit.setBorderPos(threeParts.get(1).x());
+                    FlowHelper.renderFlowPanel(frame, threeParts.get(0), 
inTotal, outTotal, info.name);
+                    int renderPoints = Math.min(
+                            FlowHelper.computeRenderPoints(threeParts.get(1)),
+                            FlowHelper.computeRenderPoints(threeParts.get(2)));
+                    renderThroughputChartDirect(frame, threeParts.get(1), 
info.pid, renderPoints);
+                    renderPayloadSizeChart(frame, threeParts.get(2), info.pid, 
renderPoints);
                 } else {
                     renderEndpointFlow(frame, chunks.get(1), inTotal, 
outTotal, info.name, info.pid);
                 }
@@ -457,7 +463,7 @@ class EndpointsTab extends AbstractTableTab {
         return 2;
     }
 
-    private void renderEndpointFlow(
+    private int renderEndpointFlow(
             Frame frame, Rect area, long inTotal, long outTotal, String name, 
String pid) {
         flowPanelWidth = Math.max(20, Math.min(flowPanelWidth, area.width() - 
20));
         List<Rect> hParts = Layout.horizontal()
@@ -480,7 +486,9 @@ class EndpointsTab extends AbstractTableTab {
         LinkedList<Long> inHist = inHistMap.getOrDefault(pid, new 
LinkedList<>());
         LinkedList<Long> outHist = outHistMap.getOrDefault(pid, new 
LinkedList<>());
 
-        FlowHelper.renderThroughputChart(frame, hParts.get(1), inHist, 
outHist);
+        int renderPoints = FlowHelper.computeRenderPoints(hParts.get(1));
+        FlowHelper.renderThroughputChart(frame, hParts.get(1), inHist, 
outHist, null, renderPoints);
+        return renderPoints;
     }
 
     private void renderSingleEndpointChart(Frame frame, Rect area, String 
selectedUri, IntegrationInfo info) {
@@ -519,17 +527,37 @@ class EndpointsTab extends AbstractTableTab {
             List<Rect> chartSplit = Layout.horizontal()
                     .constraints(Constraint.percentage(50), 
Constraint.percentage(50))
                     .split(hParts.get(1));
-            FlowHelper.renderThroughputChart(frame, chartSplit.get(0), inHist, 
outHist, selectedUri);
-            FlowHelper.renderPayloadSizeChart(frame, chartSplit.get(1), 
inSizeHist, outSizeHist);
+            // use the same render points for both charts so their x-axis 
timelines align
+            int renderPoints = Math.min(
+                    FlowHelper.computeRenderPoints(chartSplit.get(0)),
+                    FlowHelper.computeRenderPoints(chartSplit.get(1)));
+            FlowHelper.renderThroughputChart(frame, chartSplit.get(0), inHist, 
outHist, selectedUri, renderPoints);
+            FlowHelper.renderPayloadSizeChart(frame, chartSplit.get(1), 
inSizeHist, outSizeHist, renderPoints);
         } else {
             FlowHelper.renderThroughputChart(frame, hParts.get(1), inHist, 
outHist, selectedUri);
         }
     }
 
-    private void renderPayloadSizeChart(Frame frame, Rect area, String pid) {
+    private void renderThroughputChartDirect(Frame frame, Rect area, String 
pid, int renderPoints) {
+        Map<String, LinkedList<Long>> inHistMap = switch (filter) {
+            case 1 -> endpointRemoteInHistory;
+            case 2 -> endpointRemoteStubInHistory;
+            default -> endpointInHistory;
+        };
+        Map<String, LinkedList<Long>> outHistMap = switch (filter) {
+            case 1 -> endpointRemoteOutHistory;
+            case 2 -> endpointRemoteStubOutHistory;
+            default -> endpointOutHistory;
+        };
+        LinkedList<Long> inHist = inHistMap.getOrDefault(pid, new 
LinkedList<>());
+        LinkedList<Long> outHist = outHistMap.getOrDefault(pid, new 
LinkedList<>());
+        FlowHelper.renderThroughputChart(frame, area, inHist, outHist, null, 
renderPoints);
+    }
+
+    private void renderPayloadSizeChart(Frame frame, Rect area, String pid, 
int renderPoints) {
         LinkedList<Long> inHist = endpointInSizeHistory.getOrDefault(pid, new 
LinkedList<>());
         LinkedList<Long> outHist = endpointOutSizeHistory.getOrDefault(pid, 
new LinkedList<>());
-        FlowHelper.renderPayloadSizeChart(frame, area, inHist, outHist);
+        FlowHelper.renderPayloadSizeChart(frame, area, inHist, outHist, 
renderPoints);
     }
 
     private void renderDetail(Frame frame, Rect area, List<EndpointInfo> 
sortedEndpoints, IntegrationInfo info) {
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
index d4764cb204c6..fb3a9c1b08cf 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/FlowHelper.java
@@ -100,9 +100,18 @@ final class FlowHelper {
         renderThroughputChart(frame, area, inHist, outHist, null);
     }
 
+    static int computeRenderPoints(Rect area) {
+        return Math.max(20, (Math.min(MAX_CHART_POINTS, area.width() - 6) / 
20) * 20);
+    }
+
     static void renderThroughputChart(
             Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long> 
outHist, String chartLabel) {
-        int renderPoints = Math.max(20, (Math.min(MAX_CHART_POINTS, 
area.width() - 6) / 20) * 20);
+        renderThroughputChart(frame, area, inHist, outHist, chartLabel, 
computeRenderPoints(area));
+    }
+
+    static void renderThroughputChart(
+            Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long> 
outHist,
+            String chartLabel, int renderPoints) {
         long[] inArr = new long[renderPoints];
         long[] outArr = new long[renderPoints];
         for (int i = 0; i < renderPoints; i++) {
@@ -133,6 +142,9 @@ final class FlowHelper {
             titleSpans.add(Span.styled(label, Theme.label().bold()));
             titleSpans.add(Span.raw("] "));
         }
+        if (chartLabel == null) {
+            titleSpans.add(Span.raw(" "));
+        }
         titleSpans.add(Span.styled("▬", Theme.success()));
         titleSpans.add(Span.raw(String.format(" in:%-4s ", 
MetricsCollector.formatThroughput(curIn))));
         titleSpans.add(Span.styled("▬", Style.EMPTY.fg(Theme.accent())));
@@ -153,7 +165,11 @@ final class FlowHelper {
 
     static void renderPayloadSizeChart(
             Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long> 
outHist) {
-        int renderPoints = Math.max(20, (Math.min(MAX_CHART_POINTS, 
area.width() - 6) / 20) * 20);
+        renderPayloadSizeChart(frame, area, inHist, outHist, 
computeRenderPoints(area));
+    }
+
+    static void renderPayloadSizeChart(
+            Frame frame, Rect area, LinkedList<Long> inHist, LinkedList<Long> 
outHist, int renderPoints) {
         long[] inArr = new long[renderPoints];
         long[] outArr = new long[renderPoints];
         for (int i = 0; i < renderPoints; i++) {
@@ -170,6 +186,7 @@ final class FlowHelper {
         long curOut = outArr[renderPoints - 1];
 
         Line chartTitle = Line.from(
+                Span.raw(" "),
                 Span.styled("▬", Theme.label()),
                 Span.raw(String.format(" in:%-8s ", sizeToString(curIn))),
                 Span.styled("▬", Theme.notice()),

Reply via email to