This commit is contained in:
@@ -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">✏️ Edit</a>
|
||||
<a href="/admin/hunts/<%= hunt.id %>/pdf" class="btn btn-success">📥 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() : '—' %></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">
|
||||
|
||||
Reference in New Issue
Block a user