Add multi-league foundation

This commit is contained in:
Christian Krakau-Louis
2026-05-22 20:47:28 +02:00
parent e032994628
commit 15e1dc227b
23 changed files with 775 additions and 205 deletions
+13 -2
View File
@@ -4,11 +4,22 @@
<div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-6">
<div>
<h1 class="text-2xl md:text-3xl font-garamond font-bold text-irish-green">League Leaderboard</h1>
<p class="text-gray-600">See how your team ranks against the competition</p>
<p class="text-gray-600">
See how your team ranks in {{ selected_league.name if selected_league else "your league" }}
</p>
</div>
<div class="mt-4 md:mt-0">
<form method="get" action="/leaderboard/">
<form method="get" action="/leaderboard/" class="flex flex-col sm:flex-row gap-3">
<select name="league_id"
onchange="this.form.submit()"
class="border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-irish-green bg-white">
{% for league in leagues %}
<option value="{{ league.id }}" {% if selected_league and selected_league.id == league.id %}selected{% endif %}>
{{ league.name }}
</option>
{% endfor %}
</select>
<select name="timeframe"
onchange="this.form.submit()"
class="border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-irish-green bg-white">
+20 -3
View File
@@ -6,6 +6,20 @@
<p class="text-gray-600">Create and manage QR code sets for your pub quiz events</p>
</div>
<form method="get" action="/qr/" class="mb-6 flex flex-col sm:flex-row sm:items-end gap-3">
<div>
<label for="league_filter" class="block text-sm font-medium text-gray-700">League</label>
<select id="league_filter" name="league_id" onchange="this.form.submit()"
class="mt-1 border border-gray-300 rounded-md px-3 py-2 bg-white focus:outline-none focus:ring-2 focus:ring-irish-green">
{% for league in leagues %}
<option value="{{ league.id }}" {% if selected_league and selected_league.id == league.id %}selected{% endif %}>
{{ league.name }}
</option>
{% endfor %}
</select>
</div>
</form>
<div class="grid md:grid-cols-3 gap-8">
<!-- QR Set Creation -->
<div class="bg-white rounded-lg shadow-md p-6">
@@ -15,6 +29,7 @@
</p>
<form id="qrSetForm" action="/qr/sets" method="post" class="space-y-4">
<input type="hidden" name="league_id" value="{{ selected_league.id }}">
<div>
<label for="name" class="block text-sm font-medium text-gray-700">Set Name</label>
<input type="text" name="name" id="name" required
@@ -140,7 +155,8 @@
<div class="px-6 py-4">
<div class="text-sm text-gray-500">
<p>Created: {{ qr_set.created_at.strftime('%Y-%m-%d') }}</p>
<p>QR Codes: {% if qr_set.qr_codes %}{{ qr_set.qr_codes | length }}{% else %}0{% endif %}</p>
<p>League: {{ qr_set.league.name if qr_set.league else "Default League" }}</p>
<p>QR Codes: {% if qr_set.qr_codes %}{{ qr_set.qr_codes | length }}{% else %}0{% endif %}</p>
</div>
<div class="mt-4 flex justify-between">
<a href="/qr/sets/{{ qr_set.id }}" class="text-irish-green hover:underline">
@@ -199,11 +215,12 @@
quickQrForm.addEventListener('submit', function(e) {
e.preventDefault();
const points = document.getElementById('qr-points').value;
const leagueId = '{{ selected_league.id }}';
// Generate QR code
qrImage.innerHTML = '<img src="/qr/generate/' + points + '" alt="QR Code" class="mx-auto" />';
qrImage.innerHTML = '<img src="/qr/generate/' + points + '?league_id=' + leagueId + '" alt="QR Code" class="mx-auto" />';
qrResult.classList.remove('hidden');
});
});
</script>
{% endblock %}
{% endblock %}
+5 -3
View File
@@ -3,7 +3,7 @@
<div class="max-w-6xl mx-auto p-4">
<div class="mb-8">
<div class="flex items-center">
<a href="/qr" class="text-irish-green hover:underline mr-4">
<a href="/qr{% if qr_set.league_id %}/?league_id={{ qr_set.league_id }}{% endif %}" class="text-irish-green hover:underline mr-4">
<i class="fas fa-arrow-left"></i> Back to Dashboard
</a>
<h1 class="text-3xl font-bold text-irish-green">{{ qr_set.name }}</h1>
@@ -11,7 +11,9 @@
{% if qr_set.description %}
<p class="text-gray-600 mt-2">{{ qr_set.description }}</p>
{% endif %}
<p class="text-sm text-gray-500 mt-1">Created on {{ qr_set.created_at.strftime('%Y-%m-%d') }}</p>
<p class="text-sm text-gray-500 mt-1">
{{ qr_set.league.name if qr_set.league else "Default League" }} • Created on {{ qr_set.created_at.strftime('%Y-%m-%d') }}
</p>
</div>
<div class="grid md:grid-cols-3 gap-8">
@@ -270,4 +272,4 @@
}
});
</script>
{% endblock %}
{% endblock %}
+1
View File
@@ -7,6 +7,7 @@
<div class="flex flex-col md:flex-row justify-between items-center">
<div class="mb-4 md:mb-0">
<h1 class="text-2xl md:text-3xl font-bold text-white">{{ team.name }}</h1>
<p class="text-green-100 mb-1">{{ team.league.name if team.league else "Default League" }}</p>
<div class="flex items-center space-x-2 text-green-100">
<span><i class="fas fa-trophy mr-1"></i> Rank #{{ team_rank }}</span>
<span class="hidden md:inline"></span>
+20 -1
View File
@@ -1,7 +1,25 @@
{% extends "base.html" %}
{% block content %}
<div class="max-w-4xl mx-auto">
<h2 class="text-2xl font-bold mb-6">Teams</h2>
<div class="flex flex-col sm:flex-row sm:items-end sm:justify-between gap-4 mb-6">
<div>
<h2 class="text-2xl font-bold">Teams</h2>
{% if selected_league %}
<p class="text-gray-600">{{ selected_league.name }}</p>
{% endif %}
</div>
<form method="get" action="/teams/">
<label for="league_id" class="block text-sm font-medium text-gray-700">League</label>
<select id="league_id" name="league_id" onchange="this.form.submit()"
class="mt-1 border border-gray-300 rounded-md px-3 py-2 bg-white focus:outline-none focus:ring-2 focus:ring-irish-green">
{% for league in leagues %}
<option value="{{ league.id }}" {% if selected_league and selected_league.id == league.id %}selected{% endif %}>
{{ league.name }}
</option>
{% endfor %}
</select>
</form>
</div>
{% if error %}
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative mb-6" role="alert">
@@ -48,6 +66,7 @@
<h3 class="text-xl font-semibold mb-4" style="color: var(--irish-green);">Create New Team</h3>
{% if user %}
<form action="/teams/create" method="post" class="mt-4">
<input type="hidden" name="league_id" value="{{ selected_league.id }}">
<div class="mb-4">
<label for="name" class="block text-sm font-medium mb-1">Team Name</label>
<input type="text" name="name" id="name" placeholder="Enter team name" required