Diff -- /var/www/vhosts/3dshawn.com/site1/TEMPLATES/dashboard.html
Diff
/var/www/vhosts/3dshawn.com/site1/TEMPLATES/dashboard.html
added on local at 2026-07-10 22:19:11
Added
+161
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to c6195145cb05
to c6195145cb05
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.| 1 | <div class="page-head"> | |
| 2 | <span class="page-eyebrow"><span class="dot"></span> Overview</span> | |
| 3 | <h1 class="page-title">Dashboard</h1> | |
| 4 | <p class="page-subtitle">Portfolio-wide health at a glance. Every file change, every schema change, every drifted container -- captured silently, restorable to any moment, no workflow discipline required.</p> | |
| 5 | </div> | |
| 6 | ||
| 7 | <!-- KPI row --> | |
| 8 | <div class="dash-grid"> | |
| 9 | <div class="module glow-teal"> | |
| 10 | <div class="module-head"><div class="left"> | |
| 11 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></div> | |
| 12 | <div class="module-title">File changes</div> | |
| 13 | <span class="module-subtitle">Captured in the last 24 hours across every monitored path on every server.</span> | |
| 14 | </div></div> | |
| 15 | <div class="module-body kpi kpi-teal"> | |
| 16 | <div class="num">$kpi_file_today</div> | |
| 17 | <div class="lbl">Last 24h</div> | |
| 18 | <div class="sub">All watched paths + containers</div> | |
| 19 | </div> | |
| 20 | </div> | |
| 21 | ||
| 22 | <div class="module glow-amber"> | |
| 23 | <div class="module-head"><div class="left"> | |
| 24 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5v6c0 1.7 4 3 9 3s9-1.3 9-3V5"/><path d="M3 11v6c0 1.7 4 3 9 3s9-1.3 9-3v-6"/></svg></div> | |
| 25 | <div class="module-title">Schema changes</div> | |
| 26 | <span class="module-subtitle">DDL diffs across every monitored DB in the last 7 days -- caught even if no one committed them.</span> | |
| 27 | </div></div> | |
| 28 | <div class="module-body kpi kpi-amber"> | |
| 29 | <div class="num">$kpi_schema_7d</div> | |
| 30 | <div class="lbl">Last 7 days</div> | |
| 31 | <div class="sub">Across all monitored databases</div> | |
| 32 | </div> | |
| 33 | </div> | |
| 34 | ||
| 35 | <div class="module glow-emerald"> | |
| 36 | <div class="module-head"><div class="left"> | |
| 37 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 13V7a2 2 0 0 0-2-2h-4l-2-3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5"/><path d="M14 19l2 2 4-4"/></svg></div> | |
| 38 | <div class="module-title">Named releases</div> | |
| 39 | <span class="module-subtitle">Bookmark moments you've saved. Auto-purge respects these -- their blobs stay forever.</span> | |
| 40 | </div></div> | |
| 41 | <div class="module-body kpi kpi-emerald"> | |
| 42 | <div class="num">$kpi_releases</div> | |
| 43 | <div class="lbl">Bookmarked</div> | |
| 44 | <div class="sub">Point-in-time restore anchors</div> | |
| 45 | </div> | |
| 46 | </div> | |
| 47 | ||
| 48 | <div class="module glow-rose"> | |
| 49 | <div class="module-head"><div class="left"> | |
| 50 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg></div> | |
| 51 | <div class="module-title">Drift alerts</div> | |
| 52 | <span class="module-subtitle">Containers that were supposed to stay immutable but got modified at runtime. Compliance signal.</span> | |
| 53 | </div></div> | |
| 54 | <div class="module-body kpi kpi-rose"> | |
| 55 | <div class="num">$kpi_drifted</div> | |
| 56 | <div class="lbl">Active drift</div> | |
| 57 | <div class="sub">On supposedly-immutable containers</div> | |
| 58 | </div> | |
| 59 | </div> | |
| 60 | </div> | |
| 61 | ||
| 62 | <!-- 90-day activity timeline --> | |
| 63 | <div class="module glow-teal" style="margin-bottom:20px"> | |
| 64 | <div class="module-head"><div class="left"> | |
| 65 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 3v18h18"/><rect x="6" y="12" width="3" height="6"/><rect x="11" y="7" width="3" height="11"/><rect x="16" y="10" width="3" height="8"/></svg></div> | |
| 66 | <div class="module-title">Activity, last 90 days</div> | |
| 67 | <span class="module-subtitle">Every captured change, stacked by kind. Teal is files, amber is schema DDL. Hover for exact daily counts.</span> | |
| 68 | </div></div> | |
| 69 | <div class="module-body" style="padding-top:10px"> | |
| 70 | $timeline_svg | |
| 71 | </div> | |
| 72 | </div> | |
| 73 | ||
| 74 | <!-- Recent activity --> | |
| 75 | <div class="module glow-teal" style="margin-bottom:20px"> | |
| 76 | <div class="module-head"><div class="left"> | |
| 77 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg></div> | |
| 78 | <div class="module-title">Recent activity</div> | |
| 79 | <span class="module-subtitle">Newest first. Click any row to open its full diff. File + schema changes merged into one timeline.</span> | |
| 80 | </div></div> | |
| 81 | <div class="module-body tight"> | |
| 82 | [if:$has_recent] | |
| 83 | <table class="tbl"> | |
| 84 | <thead><tr> | |
| 85 | <th style="width:80px">Type</th> | |
| 86 | <th>What</th> | |
| 87 | <th>Detail</th> | |
| 88 | <th style="width:170px">When</th> | |
| 89 | </tr></thead> | |
| 90 | <tbody> | |
| 91 | [loop:@recent] | |
| 92 | <tr> | |
| 93 | <td><span class="pill $kind_pill">$kind</span></td> | |
| 94 | <td class="mono" style="font-size:12.5px"><a href="$diff_url" style="color:var(--accent-hi);text-decoration:none">$what</a></td> | |
| 95 | <td class="dim" style="font-size:12.5px">$detail</td> | |
| 96 | <td class="mono dim">$ts</td> | |
| 97 | </tr> | |
| 98 | [/loop] | |
| 99 | </tbody> | |
| 100 | </table> | |
| 101 | [/if] | |
| 102 | [if:!$has_recent] | |
| 103 | <div style="padding:36px 14px;text-align:center;color:var(--text-dim);font-size:13.5px"> | |
| 104 | No activity captured yet. Start a file monitor or point at a database in the <a href="[url:file_monitors]" style="color:var(--accent-hi)">config</a> to begin capture. | |
| 105 | </div> | |
| 106 | [/if] | |
| 107 | </div> | |
| 108 | </div> | |
| 109 | ||
| 110 | <div class="dash-grid" style="grid-template-columns:2fr 1fr"> | |
| 111 | <div class="module glow-emerald"> | |
| 112 | <div class="module-head"><div class="left"> | |
| 113 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></div> | |
| 114 | <div class="module-title">Named releases</div> | |
| 115 | <span class="module-subtitle">Recent bookmarks. Any file blob referenced from a named release is protected from auto-purge.</span> | |
| 116 | </div></div> | |
| 117 | <div class="module-body tight"> | |
| 118 | [if:$has_releases] | |
| 119 | <table class="tbl"> | |
| 120 | <thead><tr><th>Name</th><th>By</th><th style="width:130px">When</th></tr></thead> | |
| 121 | <tbody> | |
| 122 | [loop:@releases] | |
| 123 | <tr> | |
| 124 | <td><strong>$name</strong><div class="dim" style="font-size:11.5px">$description</div></td> | |
| 125 | <td class="dim">$released_by</td> | |
| 126 | <td class="mono dim">$released_h</td> | |
| 127 | </tr> | |
| 128 | [/loop] | |
| 129 | </tbody> | |
| 130 | </table> | |
| 131 | [/if] | |
| 132 | [if:!$has_releases] | |
| 133 | <div style="padding:28px 14px;text-align:center;color:var(--text-dim);font-size:13.5px"> | |
| 134 | No named releases yet. Bookmark a moment to protect it from auto-purge. | |
| 135 | </div> | |
| 136 | [/if] | |
| 137 | </div> | |
| 138 | </div> | |
| 139 | ||
| 140 | <div class="module glow-sky"> | |
| 141 | <div class="module-head"><div class="left"> | |
| 142 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/></svg></div> | |
| 143 | <div class="module-title">Servers</div> | |
| 144 | <span class="module-subtitle">Central + agent nodes.</span> | |
| 145 | </div></div> | |
| 146 | <div class="module-body tight"> | |
| 147 | <table class="tbl"> | |
| 148 | <thead><tr><th>Name</th><th>Status</th><th class="dim" style="width:100px">Last seen</th></tr></thead> | |
| 149 | <tbody> | |
| 150 | [loop:@servers] | |
| 151 | <tr> | |
| 152 | <td><strong>$server_name</strong> <span class="dim mono" style="font-size:11px">$role</span></td> | |
| 153 | <td><span class="pill $status_pill">$status</span></td> | |
| 154 | <td class="mono dim">$last_heartbeat_h</td> | |
| 155 | </tr> | |
| 156 | [/loop] | |
| 157 | </tbody> | |
| 158 | </table> | |
| 159 | </div> | |
| 160 | </div> | |
| 161 | </div> |