Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 49 additions & 13 deletions public/js/peers.js
Original file line number Diff line number Diff line change
Expand Up @@ -1465,9 +1465,31 @@
}
}

// Aurora renders the peer traffic as a bar chart (matching the dashboard's
// .chart/.col/.bar markup); default/pro keep the SVG line/area chart.
function renderAuroraTrafficBars(container, dataPoints) {
if (!dataPoints || dataPoints.length === 0) {
container.innerHTML = '<div class="empty-state" style="padding:30px 0;text-align:center;color:var(--faint);font-size:13px">' + escapeHtml(GC.t['dashboard.chart_no_data'] || 'No traffic data') + '</div>';
return;
}
var maxVal = Math.max(1, Math.max.apply(null, dataPoints.map(function(d) { return Math.max(d.upload || 0, d.download || 0); })));
var n = dataPoints.length;
container.innerHTML = dataPoints.map(function(d, i) {
var dnH = Math.max(2, Math.round(((d.download || 0) / maxVal) * 130));
var upH = Math.max(2, Math.round(((d.upload || 0) / maxVal) * 130));
var label = (n <= 12 || i % Math.ceil(n / 8) === 0) ? (d.label || '') : '';
return '<div class="col">'
+ '<div class="bar" style="height:' + dnH + 'px"></div>'
+ '<div class="bar up" style="height:' + upH + 'px"></div>'
+ '<div class="lab">' + escapeHtml(label) + '</div>'
+ '</div>';
}).join('');
}

function renderTrafficChart(dataPoints) {
var svg = document.getElementById('traffic-peer-chart');
if (!svg) return;
if (isAurora()) { renderAuroraTrafficBars(svg, dataPoints); return; }
if (!dataPoints || dataPoints.length === 0) {
svg.innerHTML = '<text x="50%" y="50%" text-anchor="middle" fill="var(--text-3)" font-size="13">No data</text>';
return;
Expand Down Expand Up @@ -2299,19 +2321,11 @@
uav.innerHTML = '<svg viewBox="0 0 24 24" fill="none"><rect x="3" y="4" width="18" height="6" rx="2" stroke="currentColor" stroke-width="2"/><rect x="3" y="14" width="18" height="6" rx="2" stroke="currentColor" stroke-width="2"/></svg>';
uh.appendChild(uav);

// Name + IP — flex:1+min-width:0 lets identity shrink so badge+gear always visible
var identity = document.createElement('div');
identity.style.cssText = 'flex:1;min-width:0;overflow:hidden';
var un = document.createElement('div');
un.className = 'un';
un.style.cssText = 'white-space:nowrap;overflow:hidden;text-overflow:ellipsis';
un.textContent = gw.name;
var ud = document.createElement('div');
ud.className = 'ud';
ud.textContent = gw.ip || '';
identity.appendChild(un);
identity.appendChild(ud);
uh.appendChild(identity);
// Name + IP moved to dedicated rows below; a flex spacer keeps the status
// badge + gear pushed to the right of the header.
var spacer = document.createElement('div');
spacer.style.cssText = 'flex:1;min-width:0';
uh.appendChild(spacer);

// Right side: status badge + gear button — gap:8px keeps them clearly separated
var right = document.createElement('span');
Expand Down Expand Up @@ -2344,6 +2358,28 @@
uh.appendChild(right);
unit.appendChild(uh);

// Name + IP rows (moved out of the .uh title)
var nameRow = document.createElement('div');
nameRow.className = 'urow';
var nrk = document.createElement('span');
nrk.textContent = gwT('peers.gateway.name', 'Name');
var nrv = document.createElement('b');
nrv.style.cssText = 'overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:62%';
nrv.textContent = gw.name;
nameRow.appendChild(nrk);
nameRow.appendChild(nrv);
unit.appendChild(nameRow);

var ipRow = document.createElement('div');
ipRow.className = 'urow';
var iprk = document.createElement('span');
iprk.textContent = gwT('peers.gateway.ip', 'IP');
var iprv = document.createElement('b');
iprv.textContent = gw.ip || '—';
ipRow.appendChild(iprk);
ipRow.appendChild(iprv);
unit.appendChild(ipRow);

// Metric rows
var row1 = document.createElement('div');
row1.className = 'urow';
Expand Down
10 changes: 5 additions & 5 deletions templates/aurora/partials/modals/peer-traffic.njk
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
<button class="tab" data-period="7d">7d</button>
<button class="tab" data-period="30d">30d</button>
</div>
<div style="background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px;overflow:hidden">
<svg id="traffic-peer-chart" viewBox="0 0 520 120" style="width:100%;height:120px"></svg>
<div style="background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 12px 4px;overflow:hidden">
<div class="chart" id="traffic-peer-chart" style="margin-top:0"></div>
</div>
<div style="display:flex;gap:16px;justify-content:center;margin-top:8px;font-size:11px;color:var(--text-3)">
<span><span style="display:inline-block;width:10px;height:3px;background:var(--green);border-radius:2px;vertical-align:middle;margin-right:4px"></span>{{ t('peers.upload') or 'Upload' }}</span>
<span><span style="display:inline-block;width:10px;height:3px;background:var(--teal);border-radius:2px;vertical-align:middle;margin-right:4px"></span>{{ t('peers.download') or 'Download' }}</span>
<div style="display:flex;gap:16px;justify-content:center;margin-top:10px;font-size:11px;color:var(--text-3)">
<span><span style="display:inline-block;width:10px;height:9px;background:var(--teal);border-radius:3px;vertical-align:middle;margin-right:5px"></span>{{ t('peers.download') or 'Download' }}</span>
<span><span style="display:inline-block;width:10px;height:9px;background:var(--coral);border-radius:3px;vertical-align:middle;margin-right:5px"></span>{{ t('peers.upload') or 'Upload' }}</span>
</div>
</div>
<div class="modal-foot">
Expand Down
Loading