more QOL improvements
Build Images and Deploy / Update-PROD-Stack (push) Successful in 29s

This commit is contained in:
2026-02-28 01:37:32 -05:00
parent b9981d0e70
commit 4f9e92bda7
18 changed files with 426 additions and 32 deletions
+51
View File
@@ -7,6 +7,7 @@
<span style="color: var(--muted); font-family: monospace; font-size: 1rem;"><%= hunt.short_name %></span>
</div>
<div style="display: flex; gap: 0.5rem; flex-wrap: wrap;">
<a href="/admin/hunts/<%= hunt.id %>/edit" class="btn btn-outline">&#x270F;&#xFE0F; Edit</a>
<a href="/admin/hunts/<%= hunt.id %>/pdf" class="btn btn-success">&#x1F4E5; Download PDF</a>
<a href="/hunt/<%= hunt.short_name %>" class="btn btn-outline">View Public Page</a>
<a href="/hunt/<%= hunt.short_name %>/leaderboard" class="btn btn-outline">Leaderboard</a>
@@ -32,12 +33,62 @@
<div class="value"><%= packages.reduce((sum, p) => sum + p.scan_count, 0) %></div>
<div class="label">Total Scans</div>
</div>
<div class="stat-box">
<div class="value"><%= typeof stats !== 'undefined' ? stats.uniquePlayers : 0 %></div>
<div class="label">Players</div>
</div>
<div class="stat-box">
<div class="value"><%= typeof stats !== 'undefined' ? stats.discoveryRate + '%' : '0%' %></div>
<div class="label">Discovery Rate</div>
</div>
<div class="stat-box">
<div class="value"><%= hunt.expiry_date ? new Date(hunt.expiry_date).toLocaleDateString() : '&mdash;' %></div>
<div class="label">Expires</div>
</div>
</div>
<% if (typeof stats !== 'undefined' && stats.topFinders.length > 0) { %>
<div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem;">
<div class="card" style="flex: 1; min-width: 280px;">
<div class="card-header">Top Finders</div>
<div class="table-wrapper">
<table>
<thead><tr><th>Player</th><th>Finds</th><th>Points</th></tr></thead>
<tbody>
<% stats.topFinders.forEach(f => { %>
<tr>
<td><a href="/player/<%= f.username %>"><%= f.username %></a></td>
<td><%= f.finds %></td>
<td><span class="points-badge">+<%= f.points %></span></td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
<% if (stats.recentScans.length > 0) { %>
<div class="card" style="flex: 1; min-width: 280px;">
<div class="card-header">Recent Scans</div>
<div class="table-wrapper">
<table>
<thead><tr><th>#</th><th>Player</th><th>Points</th><th>When</th></tr></thead>
<tbody>
<% stats.recentScans.forEach(s => { %>
<tr>
<td><%= s.card_number %></td>
<td><a href="/player/<%= s.username %>"><%= s.username %></a></td>
<td><span class="points-badge">+<%= s.points_awarded %></span></td>
<td style="font-size: 0.85rem; color: var(--muted);"><time datetime="<%= s.scanned_at %>"><%= new Date(s.scanned_at).toLocaleString() %></time></td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
<% } %>
</div>
<% } %>
<h2 style="margin-top: 1.5rem; margin-bottom: 1rem;">All Packages</h2>
<div class="table-wrapper">