Diff -- /var/www/vhosts/3dshawn.com/site1/TEMPLATES/dashboard.html

O Operator
Diff

/var/www/vhosts/3dshawn.com/site1/TEMPLATES/dashboard.html

modified on local at 2026-07-12 00:02:13

Added
+3
lines
Removed
-1
lines
Context
268
unchanged
Blobs
from 13b6a8ddb8a0
to a0ec3199a428
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
11<div class="page-head">
22 <span class="page-eyebrow"><span class="dot"></span> Overview</span>
33 <h1 class="page-title">Dashboard</h1>
44 <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>
55</div>
66
77<!-- KPI row -->
88<div class="dash-grid">
99 <div class="module glow-teal">
1010 <div class="module-head"><div class="left">
1111 <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>
1212 <div class="module-title">File changes</div>
1313 <span class="module-subtitle">Captured in the last 24 hours across every monitored path on every server.</span>
1414 </div></div>
1515 <div class="module-body kpi kpi-teal">
1616 <div class="num">$kpi_file_today</div>
1717 <div class="lbl">Last 24h</div>
1818 <div class="sub">All watched paths + containers</div>
1919 </div>
2020 </div>
2121
2222 <div class="module glow-amber">
2323 <div class="module-head"><div class="left">
2424 <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>
2525 <div class="module-title">Schema changes</div>
2626 <span class="module-subtitle">DDL diffs across every monitored DB in the last 7 days -- caught even if no one committed them.</span>
2727 </div></div>
2828 <div class="module-body kpi kpi-amber">
2929 <div class="num">$kpi_schema_7d</div>
3030 <div class="lbl">Last 7 days</div>
3131 <div class="sub">Across all monitored databases</div>
3232 </div>
3333 </div>
3434
3535 <div class="module glow-emerald">
3636 <div class="module-head"><div class="left">
3737 <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>
3838 <div class="module-title">Named releases</div>
3939 <span class="module-subtitle">Bookmark moments you've saved. Auto-purge respects these -- their blobs stay forever.</span>
4040 </div></div>
4141 <div class="module-body kpi kpi-emerald">
4242 <div class="num">$kpi_releases</div>
4343 <div class="lbl">Bookmarked</div>
4444 <div class="sub">Point-in-time restore anchors</div>
4545 </div>
4646 </div>
4747
4848 <div class="module glow-rose">
4949 <div class="module-head"><div class="left">
5050 <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>
5151 <div class="module-title">Drift alerts</div>
5252 <span class="module-subtitle">Containers that were supposed to stay immutable but got modified at runtime. Compliance signal.</span>
5353 </div></div>
5454 <div class="module-body kpi kpi-rose">
5555 <div class="num">$kpi_drifted</div>
5656 <div class="lbl">Active drift</div>
5757 <div class="sub">On supposedly-immutable containers</div>
5858 </div>
5959 </div>
6060</div>
6161
6262<!-- 90-day activity timeline -->
6363<div class="module glow-teal" style="margin-bottom:20px">
6464 <div class="module-head"><div class="left">
6565 <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>
6666 <div class="module-title">Activity, last 90 days</div>
6767 <span class="module-subtitle">Every captured change, stacked by kind. Teal is files, amber is schema DDL. Hover for exact daily counts.</span>
6868 </div></div>
6969 <div class="module-body" style="padding-top:10px">
7070 $timeline_svg
7171 </div>
7272</div>
7373
7474<!-- ============================ Per-site health ============================ -->
7575[if:$has_per_site]
7676<div class="module glow-emerald" style="margin-bottom:20px">
7777 <div class="module-head"><div class="left">
7878 <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/><rect x="3" y="16" width="7" height="5"/></svg></div>
7979 <div class="module-title">Per-site health</div>
8080 <span class="module-subtitle">One row per active monitor. Sparkline is the last 30 days of change activity. Click a row to drill into that site's file changes.</span>
8181 </div></div>
8282 <div class="module-body tight">
8383 <table class="tbl">
8484 <thead><tr>
8585 <th style="width:36%">Site / scan</th>
8686 <th style="width:120px">30-day rhythm</th>
8787 <th style="width:100px" class="mono">Active files</th>
8888 <th style="width:100px" class="mono">Captures</th>
8989 <th style="width:100px" class="mono">Last 24h</th>
9090 <th style="width:170px">Last change</th>
9191 </tr></thead>
9292 <tbody>
9393 [loop:@per_site]
9494 <tr>
9595 <td>
9696 <a href="$drilldown_url" style="color:var(--accent-hi);text-decoration:none">
9797 <strong>$scan_name</strong>
9898 </a>
9999 <div class="mono dim" style="font-size:11px">$path_short <span class="pill $kind_pill" style="margin-left:6px;font-size:9.5px">$server_kind</span></div>
100100 </td>
101101 <td>$spark_svg</td>
102102 <td class="mono">$active_files</td>
103103 <td class="mono">$captured_ct</td>
104104 <td class="mono" style="color:var(--accent-hi)">$changes_24h</td>
105105 <td class="mono dim"><span class="ts" data-ts="$last_change_epoch" data-fmt="relative">$last_change_h</span></td>
106106 </tr>
107107 [/loop]
108108 </tbody>
109109 </table>
110110 </div>
111111</div>
112112[/if]
113113
114114<!-- ============================ Change-frequency ranking ============================ -->
115115[if:$has_top_files]
116116<div class="dash-grid" style="grid-template-columns:2fr 1fr;margin-bottom:20px">
117117 <div class="module glow-amber">
118118 <div class="module-head"><div class="left">
119119 <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 17 9 11 13 15 21 7"/><polyline points="14 7 21 7 21 14"/></svg></div>
120120 <div class="module-title">Change-frequency ranking</div>
121121 <span class="module-subtitle">Top 20 files by change count in the last 30 days &mdash; the "live-config heatmap". Files that show up here are likely candidates for pinning to a Named Release.</span>
122 </div></div>
122 </div>
123 <a href="/pin_hotspots.cgi?n=20&days=30" class="tr-chip is-active" style="border:none;margin-left:auto">Pin these &rarr;</a>
124 </div>
123125 <div class="module-body tight" style="max-height:520px;overflow:auto">
124126 <table class="tbl">
125127 <thead><tr>
126128 <th style="width:60px">Rank</th>
127129 <th>File</th>
128130 <th style="width:120px">Site</th>
129131 <th style="width:70px">Changes</th>
130132 <th style="width:150px">Latest</th>
131133 </tr></thead>
132134 <tbody>
133135 [loop:@top_files]
134136 <tr>
135137 <td class="mono" style="color:var(--accent-warn)"><strong>#</strong></td>
136138 <td class="mono" style="font-size:11.5px"><a href="$diff_url" style="color:var(--accent-hi);text-decoration:none">$file_short</a></td>
137139 <td class="dim" style="font-size:11.5px">$scan_name</td>
138140 <td class="mono" style="color:var(--accent-warn);font-weight:700">$change_ct</td>
139141 <td class="mono dim"><span class="ts" data-ts="$latest_epoch" data-fmt="relative">$latest_h</span></td>
140142 </tr>
141143 [/loop]
142144 </tbody>
143145 </table>
144146 </div>
145147 </div>
146148
147149 <!-- ============================ Cross-site dedup ============================ -->
148150 <div class="module glow-teal">
149151 <div class="module-head"><div class="left">
150152 <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/></svg></div>
151153 <div class="module-title">Cross-site dedup</div>
152154 <span class="module-subtitle">Byte-identical files that appear on multiple sites. BLOB_STORE already deduplicates &mdash; but seeing this list makes the shared files visible.</span>
153155 </div></div>
154156 <div class="module-body tight" style="max-height:520px;overflow:auto">
155157 [if:$has_shared_blobs]
156158 <table class="tbl">
157159 <thead><tr><th style="width:60px">Sites</th><th>Blob</th><th style="width:70px">Size</th></tr></thead>
158160 <tbody>
159161 [loop:@shared_blobs]
160162 <tr>
161163 <td class="mono"><strong style="color:var(--accent-hi)">$site_ct</strong></td>
162164 <td class="mono" style="font-size:11px">
163165 <a href="$diff_url" style="color:var(--accent-hi);text-decoration:none">$sha_short</a>
164166 <div class="dim" style="font-size:10.5px;line-height:1.4">$scans_h</div>
165167 </td>
166168 <td class="mono dim">$size_h</td>
167169 </tr>
168170 [/loop]
169171 </tbody>
170172 </table>
171173 [/if]
172174 [if:!$has_shared_blobs]
173175 <div style="padding:26px 14px;text-align:center;color:var(--text-dim);font-size:12.5px">
174176 Nothing shared across sites yet.
175177 </div>
176178 [/if]
177179 </div>
178180 </div>
179181</div>
180182[/if]
181183
182184<!-- Recent activity -->
183185<div class="module glow-teal" style="margin-bottom:20px">
184186 <div class="module-head"><div class="left">
185187 <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>
186188 <div class="module-title">Recent activity</div>
187189 <span class="module-subtitle">Newest first. Click any row to open its full diff. File + schema changes merged into one timeline.</span>
188190 </div></div>
189191 <div class="module-body tight">
190192 [if:$has_recent]
191193 <table class="tbl">
192194 <thead><tr>
193195 <th style="width:80px">Type</th>
194196 <th>What</th>
195197 <th>Detail</th>
196198 <th style="width:170px">When</th>
197199 </tr></thead>
198200 <tbody>
199201 [loop:@recent]
200202 <tr>
201203 <td><span class="pill $kind_pill">$kind</span></td>
202204 <td class="mono" style="font-size:12.5px"><a href="$diff_url" style="color:var(--accent-hi);text-decoration:none">$what</a></td>
203205 <td class="dim" style="font-size:12.5px">$detail</td>
204206 <td class="mono dim"><span class="ts" data-ts="$ts_epoch" data-fmt="datetime">$ts</span></td>
205207 </tr>
206208 [/loop]
207209 </tbody>
208210 </table>
209211 [/if]
210212 [if:!$has_recent]
211213 <div style="padding:36px 14px;text-align:center;color:var(--text-dim);font-size:13.5px">
212214 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.
213215 </div>
214216 [/if]
215217 </div>
216218</div>
217219
218220<div class="dash-grid" style="grid-template-columns:2fr 1fr">
219221 <div class="module glow-emerald">
220222 <div class="module-head"><div class="left">
221223 <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>
222224 <div class="module-title">Named releases</div>
223225 <span class="module-subtitle">Recent bookmarks. Any file blob referenced from a named release is protected from auto-purge.</span>
224226 </div></div>
225227 <div class="module-body tight">
226228 [if:$has_releases]
227229 <table class="tbl">
228230 <thead><tr><th>Name</th><th>By</th><th style="width:130px">When</th></tr></thead>
229231 <tbody>
230232 [loop:@releases]
231233 <tr>
232234 <td><strong>$name</strong><div class="dim" style="font-size:11.5px">$description</div></td>
233235 <td class="dim">$released_by</td>
234236 <td class="mono dim"><span class="ts" data-ts="$released_epoch" data-fmt="date">$released_h</span></td>
235237 </tr>
236238 [/loop]
237239 </tbody>
238240 </table>
239241 [/if]
240242 [if:!$has_releases]
241243 <div style="padding:28px 14px;text-align:center;color:var(--text-dim);font-size:13.5px">
242244 No named releases yet. Bookmark a moment to protect it from auto-purge.
243245 </div>
244246 [/if]
245247 </div>
246248 </div>
247249
248250 <div class="module glow-sky">
249251 <div class="module-head"><div class="left">
250252 <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>
251253 <div class="module-title">Servers</div>
252254 <span class="module-subtitle">Central + agent nodes.</span>
253255 </div></div>
254256 <div class="module-body tight">
255257 <table class="tbl">
256258 <thead><tr><th>Name</th><th>Status</th><th class="dim" style="width:100px">Last seen</th></tr></thead>
257259 <tbody>
258260 [loop:@servers]
259261 <tr>
260262 <td><strong>$server_name</strong> <span class="dim mono" style="font-size:11px">$role</span></td>
261263 <td><span class="pill $status_pill">$status</span></td>
262264 <td class="mono dim"><span class="ts" data-ts="$heartbeat_epoch" data-fmt="relative">$last_heartbeat_h</span></td>
263265 </tr>
264266 [/loop]
265267 </tbody>
266268 </table>
267269 </div>
268270 </div>
269271</div>