expand on admin functionality, hardening still needs to be implemented.

This commit is contained in:
2025-03-31 10:52:12 +01:00
parent b466c351da
commit c3a7480c65
15 changed files with 447 additions and 13 deletions

View File

@@ -0,0 +1,49 @@
{{ define "content" }}
<h2>📊 Admin Dashboard</h2>
<p class="text-sm text-gray-600">Welcome back, admin.</p>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 my-6">
<div class="bg-white rounded-xl p-4 shadow">
<h3 class="text-sm text-gray-500">Total Tickets</h3>
<p class="text-2xl font-bold">{{ .Stats.TotalTickets }}</p>
</div>
<div class="bg-white rounded-xl p-4 shadow">
<h3 class="text-sm text-gray-500">Total Winners</h3>
<p class="text-2xl font-bold text-green-600">{{ .Stats.TotalWinners }}</p>
</div>
<div class="bg-white rounded-xl p-4 shadow">
<h3 class="text-sm text-gray-500">Prize Fund Awarded</h3>
<p class="text-2xl font-bold text-blue-600">£{{ printf "%.2f" .Stats.TotalPrizeAmount }}</p>
</div>
</div>
<div class="my-6">
<h3 class="text-lg font-semibold mb-2">Recent Ticket Matches</h3>
<table class="w-full text-sm border">
<thead>
<tr class="bg-gray-100">
<th class="px-2 py-1">Draw Date</th>
<th class="px-2 py-1">Triggered By</th>
<th class="px-2 py-1">Matched</th>
<th class="px-2 py-1">Winners</th>
<th class="px-2 py-1">Notes</th>
</tr>
</thead>
<tbody>
{{ range .MatchLogs }}
<tr class="border-t">
<td class="px-2 py-1">{{ .RunAt }}</td>
<td class="px-2 py-1">{{ .TriggeredBy }}</td>
<td class="px-2 py-1">{{ .TicketsMatched }}</td>
<td class="px-2 py-1">{{ .WinnersFound }}</td>
<td class="px-2 py-1 text-xs text-gray-500">{{ .Notes }}</td>
</tr>
{{ else }}
<tr>
<td colspan="5" class="text-center py-2 italic text-gray-400">No match history found</td>
</tr>
{{ end }}
</tbody>
</table>
</div>
{{ end }}

View File

@@ -0,0 +1,9 @@
{{ define "delete_draw" }}
<h2 class="text-xl font-semibold mb-4">Delete Draw</h2>
<form method="POST" action="/admin/draws/delete">
{{ .CSRFField }}
<input type="hidden" name="id" value="{{ .Draw.ID }}">
<p>Are you sure you want to delete the draw on <strong>{{ .Draw.DrawDate }}</strong>?</p>
<button class="btn bg-red-600 hover:bg-red-700">Delete</button>
</form>
{{ end }}

View File

@@ -0,0 +1,46 @@
{{ define "draw_list" }}
<h2 class="text-xl font-bold mb-4">Draws Overview</h2>
<table class="w-full table-auto border">
<thead class="bg-gray-100">
<tr>
<th>ID</th>
<th>Game</th>
<th>Date</th>
<th>Ball Set</th>
<th>Machine</th>
<th>Prizes?</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{{ range .Draws }}
<tr class="border-t">
<td>{{ .ID }}</td>
<td>{{ .GameType }}</td>
<td>{{ .DrawDate }}</td>
<td>{{ .BallSet }}</td>
<td>{{ .Machine }}</td>
<td>
{{ if .PrizeSet }}
{{ else }}
{{ end }}
</td>
<td>
<a href="/admin/draws/modify?id={{ .ID }}" class="text-blue-600">Edit</a> |
<a href="/admin/draws/delete?id={{ .ID }}" class="text-red-600">Delete</a> |
{{ if .PrizeSet }}
<a href="/admin/draws/prizes/modify?draw_date={{ .DrawDate }}" class="text-green-600">Modify Prizes</a>
{{ else }}
<a href="/admin/draws/prizes/add?draw_date={{ .DrawDate }}" class="text-gray-600">Add Prizes</a>
{{ end }}
</td>
</tr>
{{ else }}
<tr><td colspan="7" class="text-center text-gray-500">No draws available.</td></tr>
{{ end }}
</tbody>
</table>
{{ end }}

View File

@@ -0,0 +1,12 @@
{{ define "modify_draw" }}
<h2 class="text-xl font-semibold mb-4">Modify Draw</h2>
<form method="POST" action="/admin/draws/modify">
{{ .CSRFField }}
<input type="hidden" name="id" value="{{ .Draw.ID }}">
<label class="block">Game Type: <input name="game_type" class="input" value="{{ .Draw.GameType }}"></label>
<label class="block">Draw Date: <input name="draw_date" type="date" class="input" value="{{ .Draw.DrawDate }}"></label>
<label class="block">Ball Set: <input name="ball_set" class="input" value="{{ .Draw.BallSet }}"></label>
<label class="block">Machine: <input name="machine" class="input" value="{{ .Draw.Machine }}"></label>
<button class="btn">Update Draw</button>
</form>
{{ end }}

View File

@@ -0,0 +1,11 @@
{{ define "new_draw" }}
<h2 class="text-xl font-semibold mb-4">Add New Draw</h2>
<form method="POST" action="/admin/draws/new">
{{ .CSRFField }}
<label class="block">Game Type: <input name="game_type" class="input"></label>
<label class="block">Draw Date: <input name="draw_date" type="date" class="input"></label>
<label class="block">Ball Set: <input name="ball_set" class="input"></label>
<label class="block">Machine: <input name="machine" class="input"></label>
<button class="btn">Create Draw</button>
</form>
{{ end }}

View File

@@ -0,0 +1,13 @@
{{ define "add_prizes" }}
<h2 class="text-xl font-semibold mb-4">Add Prize Breakdown</h2>
<form method="POST" action="/admin/draws/prizes/add">
{{ .CSRFField }}
<input type="hidden" name="draw_date" value="{{ .DrawDate }}">
{{ range $i, $ := .PrizeLabels }}
<label class="block">{{ . }}
<input name="prize{{ add $i 1 }}_per_winner" class="input">
</label>
{{ end }}
<button class="btn">Save Prizes</button>
</form>
{{ end }}

View File

@@ -0,0 +1,13 @@
{{ define "modify_prizes" }}
<h2 class="text-xl font-semibold mb-4">Modify Prize Breakdown</h2>
<form method="POST" action="/admin/draws/prizes/modify">
{{ .CSRFField }}
<input type="hidden" name="draw_date" value="{{ .DrawDate }}">
{{ range $i, $ := .PrizeLabels }}
<label class="block">{{ . }}
<input name="prize{{ add $i 1 }}_per_winner" class="input" value="{{ index $.Prizes (print "prize" (add $i 1) "_per_winner") }}">
</label>
{{ end }}
<button class="btn">Update Prizes</button>
</form>
{{ end }}

View File

@@ -15,6 +15,7 @@
<p><a href="/login">Login</a></p>
{{ end }}
</div>
<a href="/admin/dashboard" class="hover:underline">Dashboard</a>
{{ if .Flash }}
<div class="flash">{{ .Flash }}</div>