From 4dd89010e01928f778baec0a95ece25accccd786 Mon Sep 17 00:00:00 2001 From: Anton Liashkevich Date: Mon, 3 Aug 2026 11:08:46 -0400 Subject: [PATCH 1/2] ui: add row divider to Internet Clients list and fix layout break on multi-net-id chains Rows now get a bottom border to visually separate list items. The net-id column is capped in width with ellipsis truncation and a tooltip, since chained sessions can report many net ids and were overflowing the row. --- .../src/components/topology/InternetPanel.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/members/nullnet-server/ui/src/components/topology/InternetPanel.tsx b/members/nullnet-server/ui/src/components/topology/InternetPanel.tsx index 4b6b2fe..cc723d8 100644 --- a/members/nullnet-server/ui/src/components/topology/InternetPanel.tsx +++ b/members/nullnet-server/ui/src/components/topology/InternetPanel.tsx @@ -44,6 +44,8 @@ export default function InternetPanel() { {sessionList.map(s => { const isFocused = focusedClientIp === s.client_ip; + const netIds = chainByProxyNetId.get(s.network_id); + const netIdsLabel = netIds ? `nets ${netIds.join(', ')}` : `net ${s.network_id}`; return (
-
-
- {chainByProxyNetId.has(s.network_id) - ? `nets ${chainByProxyNetId.get(s.network_id)!.join(', ')}` - : `net ${s.network_id}`} +
+
+ {netIdsLabel}
{formatTime(s.created_at)}
From 7a1426156d089b283d72e2871755897672f69a31 Mon Sep 17 00:00:00 2001 From: Anton Liashkevich Date: Mon, 3 Aug 2026 11:34:37 -0400 Subject: [PATCH 2/2] ui: truncate chained net-id lists in Dashboard and EdgePanel Same layout break as the Internet Clients panel: sessions routed through a proxy chain can report many net ids, and the joined list had no width constraint, so it wrapped across lines and inflated row height. Both spots now truncate with an ellipsis and a tooltip with the full list. --- .../ui/src/components/topology/EdgePanel.tsx | 19 +++++++++++++------ .../nullnet-server/ui/src/pages/Dashboard.tsx | 12 +++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/members/nullnet-server/ui/src/components/topology/EdgePanel.tsx b/members/nullnet-server/ui/src/components/topology/EdgePanel.tsx index e5caf4d..fe3f5de 100644 --- a/members/nullnet-server/ui/src/components/topology/EdgePanel.tsx +++ b/members/nullnet-server/ui/src/components/topology/EdgePanel.tsx @@ -142,6 +142,9 @@ export default function EdgePanel({ edges }: Props) { {edges.map((e, i) => { const session = sessionByNetId.get(e.net_id); + const netIdsLabel = e.via_proxy && chainByProxyNetId.has(e.net_id) + ? `nets ${chainByProxyNetId.get(e.net_id)!.join(', ')}` + : `net ${e.net_id}`; return (
-
- - {e.via_proxy && chainByProxyNetId.has(e.net_id) - ? `nets ${chainByProxyNetId.get(e.net_id)!.join(', ')}` - : `net ${e.net_id}`} +
+ + {netIdsLabel} {e.setup_ms > 0 && ( - {e.setup_ms}ms setup + {e.setup_ms}ms setup )}
{e.egress && ( diff --git a/members/nullnet-server/ui/src/pages/Dashboard.tsx b/members/nullnet-server/ui/src/pages/Dashboard.tsx index dd02c65..aa740e1 100644 --- a/members/nullnet-server/ui/src/pages/Dashboard.tsx +++ b/members/nullnet-server/ui/src/pages/Dashboard.tsx @@ -119,6 +119,9 @@ function DashboardView() { {graph!.edges.map((e, i) => { const session = sessionByNetId.get(e.net_id); + const netIdsLabel = e.via_proxy && chainByProxyNetId.has(e.net_id) + ? chainByProxyNetId.get(e.net_id)!.join(', ') + : String(e.net_id); return ( {e.to} - {e.via_proxy && chainByProxyNetId.has(e.net_id) - ? chainByProxyNetId.get(e.net_id)!.join(', ') - : e.net_id} +
+ {netIdsLabel} +
{session?.client_net ?? }