Green mesh banner on each remote card, naming the failing leg when it is not green

This commit is contained in:
Gmer4Lfe
2026-08-17 14:42:15 -04:00
parent d417bd5360
commit e7e9d9fecf
2 changed files with 33 additions and 0 deletions
+9
View File
@@ -548,6 +548,15 @@ function vv_pt_nodes(): array {
'api_key_preview' => $apiKeyPreview,
'metrics' => $metrics,
'media_seed' => $isMe ? [] : vv_pt_media_seed($setupDb, $nodeIdUpper),
// Every condition that has to hold for this partner to actually be usable, each
// reported separately. One rolled-up boolean would have said "not ok" for the last
// hour without saying that the only failing part was a name lookup.
'mesh' => $isMe ? null : [
'tailscale' => $ts['online'] === true,
'ssh' => !empty($system['unraid_version']) || !empty($system['uptime_sec']),
'partnership' => ($ptDb['state'] ?? '') === 'ACTIVE',
'onboarded' => $onboardPhase >= 2,
],
];
}
return $nodes;
+24
View File
@@ -1311,6 +1311,30 @@ function _renderActions(nodes, cfg) {
}
}
// ── Mesh health banner ─────────────────────────────────────────────────
// Green only when every leg holds. When one does not, the banner names which — "mesh
// degraded" on its own sends someone hunting through four subsystems, and the answer is
// already known here.
const mesh = remote.mesh;
if (mesh) {
const legs = [
['Tailscale', mesh.tailscale],
['SSH', mesh.ssh],
['Partnership', mesh.partnership],
['Onboarded', mesh.onboarded],
];
const bad = legs.filter(l => !l[1]).map(l => l[0]);
const ok = bad.length === 0;
html += `<div style="margin-top:9px;padding:7px 10px;border-radius:3px;
background:${ok ? '#0a1a0a' : '#1a1200'};border:1px solid ${ok ? '#1a4a1a' : '#3a2800'};
display:flex;align-items:center;gap:8px;flex-wrap:wrap;">
<span style="font-size:11px;color:${ok ? '#4caf50' : '#ff9800'};font-weight:600;">
${ok ? '✓ Mesh connected — all systems good' : '⚠ Mesh degraded'}</span>
<span style="font-size:9px;color:${ok ? '#2e6b2e' : '#8a6a2a'};font-family:monospace;">
${ok ? legs.map(l => l[0]).join(' · ') : 'failing: ' + bad.join(', ')}</span>
</div>`;
}
// ── Delete Keys panel ──────────────────────────────────────────────────
if (isDeleting) {
html += `<div style="margin-top:10px;padding:10px;background:#0a0a0a;border:1px solid #2a1515;