diff --git a/index.html b/index.html index 4fd35d9..f63b45e 100644 --- a/index.html +++ b/index.html @@ -178,7 +178,7 @@ JARVIS DashboardMain UI↗ - + JARVIS AdminAdmin panel↗
@@ -210,19 +210,32 @@
-
πŸ“„
+
πŸ“₯

Downloads

+ + +
+
+
πŸ—„οΈ
+

Backup Status

+
+ +

+
+
@@ -314,6 +327,10 @@ Parker Slingshot Rentalsparkerslingshotrentals.com↗ +
+ + Tom Tom Enterprisesfacebook.com/tomtomenterprises↗ +
@@ -426,6 +443,167 @@ + +
+
+
✈️
+

BWJ Travel

+
+ +
+ + +
+
+
πŸ“»
+

Ham Radio

+
+ +
+ + +
+
+
πŸ”†
+

Laser Engraving

+
+ +
+
@@ -507,6 +685,45 @@ } tick(); setInterval(tick, 1000); + // ── Backup Status card β€” reads daily-refreshed JSON from MSP360 collector ── + async function loadBackupStatus() { + const el = document.getElementById('backup-status-list'); + const updatedEl = document.getElementById('backup-status-updated'); + try { + const r = await fetch('/downloads/backup-status.json', { cache: 'no-store' }); + const data = await r.json(); + const dotFor = (result) => { + const s = (result || '').toLowerCase(); + if (s === 'success') return 'dot-green'; + if (s === 'warning') return 'dot-yellow'; + if (s === 'running') return 'dot-cyan'; + if (s === 'fail') return 'dot-red'; + return 'dot-gray'; + }; + const lastSuccessText = (iso) => { + if (!iso) return 'Never succeeded'; + const d = new Date(iso); + return 'Last success ' + d.toLocaleString('en-US', {month:'short', day:'numeric', hour:'2-digit', minute:'2-digit'}); + }; + el.innerHTML = data.hosts.map(h => ` + + `).join(''); + if (data.updated) { + const d = new Date(data.updated); + updatedEl.textContent = 'Updated ' + d.toLocaleString('en-US', {month:'short', day:'numeric', hour:'2-digit', minute:'2-digit'}); + } + } catch (e) { + el.innerHTML = ''; + } + } + loadBackupStatus(); + + // ── Notes β€” server-backed so they sync across all devices ───────────── const API = '/notes.php'; let _notes = [];