From a72b0954db7778f709086a6285ff08b472963d34 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Mon, 23 Mar 2026 20:41:46 +0100 Subject: [PATCH] fix: add groupName to ExecutionSummary, locale format stat values, inspect column, fix duplicate keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added groupName field to ExecutionSummary Java record and OpenSearch mapper - Dashboard stat cards use locale-formatted numbers (en-US) - Added inspect column (↗) linking directly to exchange detail page - Fixed duplicate React key warning from two columns sharing executionId key Co-Authored-By: Claude Opus 4.6 (1M context) --- .../server/app/search/OpenSearchIndex.java | 1 + .../server/core/search/ExecutionSummary.java | 1 + ui/src/pages/Dashboard/Dashboard.module.css | 18 ++++++++++++++++++ ui/src/pages/Dashboard/Dashboard.tsx | 19 +++++++++++++++---- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java index 436b39cc..132086b3 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/search/OpenSearchIndex.java @@ -323,6 +323,7 @@ public class OpenSearchIndex implements SearchIndex { (String) src.get("execution_id"), (String) src.get("route_id"), (String) src.get("agent_id"), + (String) src.get("group_name"), (String) src.get("status"), src.get("start_time") != null ? Instant.parse((String) src.get("start_time")) : null, src.get("end_time") != null ? Instant.parse((String) src.get("end_time")) : null, diff --git a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/ExecutionSummary.java b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/ExecutionSummary.java index 885e9764..51038dbd 100644 --- a/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/ExecutionSummary.java +++ b/cameleer3-server-core/src/main/java/com/cameleer3/server/core/search/ExecutionSummary.java @@ -23,6 +23,7 @@ public record ExecutionSummary( String executionId, String routeId, String agentId, + String groupName, String status, Instant startTime, Instant endTime, diff --git a/ui/src/pages/Dashboard/Dashboard.module.css b/ui/src/pages/Dashboard/Dashboard.module.css index 2d4ad884..5b32cf35 100644 --- a/ui/src/pages/Dashboard/Dashboard.module.css +++ b/ui/src/pages/Dashboard/Dashboard.module.css @@ -83,6 +83,24 @@ padding-top: 2px; } +.inspectLink { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + font-size: 14px; + color: var(--text-muted); + text-decoration: none; + border-radius: 4px; + transition: color 0.15s, background 0.15s; +} + +.inspectLink:hover { + color: var(--accent, #c6820e); + background: var(--bg-hover); +} + .openDetailLink { display: inline-block; font-size: 13px; diff --git a/ui/src/pages/Dashboard/Dashboard.tsx b/ui/src/pages/Dashboard/Dashboard.tsx index d371a30f..e687a68a 100644 --- a/ui/src/pages/Dashboard/Dashboard.tsx +++ b/ui/src/pages/Dashboard/Dashboard.tsx @@ -84,6 +84,17 @@ export default function Dashboard() { ), }, + { + key: '_inspect' as any, header: '', width: '36px', + render: (_v, row) => ( + { e.stopPropagation(); e.preventDefault(); navigate(`/exchanges/${row.executionId}`); }} + className={styles.inspectLink} + title="Open full details" + >↗ + ), + }, { key: 'routeId', header: 'Route', sortable: true, render: (v) => {String(v)} }, { key: 'groupName', header: 'Application', sortable: true, render: (v) => {String(v ?? '')} }, { key: 'executionId', header: 'Exchange ID', sortable: true, render: (v) => {String(v)} }, @@ -193,7 +204,7 @@ export default function Dashboard() {
0 ? 'up' : exchangeTrend < 0 ? 'down' : 'neutral'} trendValue={exchangeTrend > 0 ? `+${exchangeTrend.toFixed(0)}%` : `${exchangeTrend.toFixed(0)}%`} @@ -203,7 +214,7 @@ export default function Dashboard() { = 0 ? 'up' : 'down'} trendValue={`${successRateDelta >= 0 ? '+' : ''}${successRateDelta.toFixed(1)}%`} accent="success" @@ -226,8 +237,8 @@ export default function Dashboard() { />