Files
gh-christianlouis-leagueledger/app/templates/leaderboard.html
T
Christian Krakau-Louis 0de2eb5830 Implement user authentication and management system with FastAPI
- Added authentication routes for login, registration, password reset, and account deletion in `auth.py`.
- Implemented user profile management, including updating user information and changing passwords.
- Created dashboard views to display user-specific information and recent activity in `dashboard.py`.
- Developed leaderboard views to show team rankings and points in `leaderboard.py`.
- Added QR code generation and redemption functionality in `qr.py` and `redeem.py`.
- Implemented team management features, allowing users to create and join teams in `teams.py`.
- Introduced session debugging utility to assist with session-related issues in `debug_session.py`.
- Configured Docker Compose for MySQL database and FastAPI application with environment variables.
- Updated requirements.txt to include necessary dependencies for the application.
2025-04-11 17:46:59 +02:00

118 lines
5.0 KiB
HTML

{% extends "base.html" %}
{% block content %}
<div class="space-y-6">
<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>
</div>
<div class="mt-4 md:mt-0">
<form method="get" action="/leaderboard/">
<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">
<option value="all" {% if timeframe == "all" %}selected{% endif %}>All Time</option>
<option value="month" {% if timeframe == "month" %}selected{% endif %}>This Month</option>
<option value="week" {% if timeframe == "week" %}selected{% endif %}>This Week</option>
</select>
</form>
</div>
</div>
<!-- Podium (on larger screens) -->
<div class="hidden md:flex justify-center items-end space-x-8 mb-12">
<!-- 2nd Place -->
{% if top_teams[1] %}
<div class="flex flex-col items-center">
<div class="w-20 h-20 rounded-full bg-white shadow-md flex items-center justify-center mb-4">
<span class="text-4xl font-bold text-gray-500">2</span>
</div>
<div class="bg-gray-100 w-32 h-32 flex flex-col items-center justify-center rounded-t-lg">
<p class="font-bold text-lg">{{ top_teams[1].name }}</p>
<p class="text-irish-green font-bold">{{ top_teams[1].points }} pts</p>
</div>
</div>
{% endif %}
<!-- 1st Place -->
{% if top_teams[0] %}
<div class="flex flex-col items-center">
<div class="w-24 h-24 rounded-full bg-golden-ale shadow-md flex items-center justify-center mb-4">
<span class="text-5xl font-bold text-white">1</span>
</div>
<div class="bg-gray-100 w-36 h-40 flex flex-col items-center justify-center rounded-t-lg shadow-md">
<p class="font-bold text-xl">{{ top_teams[0].name }}</p>
<p class="text-irish-green font-bold text-xl">{{ top_teams[0].points }} pts</p>
</div>
</div>
{% endif %}
<!-- 3rd Place -->
{% if top_teams[2] %}
<div class="flex flex-col items-center">
<div class="w-16 h-16 rounded-full bg-[#CD7F32] shadow-md flex items-center justify-center mb-4">
<span class="text-3xl font-bold text-white">3</span>
</div>
<div class="bg-gray-100 w-28 h-28 flex flex-col items-center justify-center rounded-t-lg">
<p class="font-bold">{{ top_teams[2].name }}</p>
<p class="text-irish-green font-bold">{{ top_teams[2].points }} pts</p>
</div>
</div>
{% endif %}
</div>
<!-- Timeframe Indicator -->
<div class="bg-irish-green bg-opacity-10 text-irish-green px-4 py-3 rounded-md text-center font-bold mb-6">
Showing {{ time_label }} Rankings
</div>
<!-- Leaderboard Table -->
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<table class="min-w-full">
<thead class="bg-irish-green text-white">
<tr>
<th class="py-3 px-4 text-left">Rank</th>
<th class="py-3 px-4 text-left">Team</th>
<th class="py-3 px-4 text-right">Points</th>
<th class="py-3 px-4 text-center">Change</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200">
{% for team in teams %}
<tr class="{% if team.rank == 1 %}bg-golden-ale bg-opacity-10{% endif %} hover:bg-gray-50">
<td class="py-3 px-4 font-bold">{{ team.rank }}</td>
<td class="py-3 px-4">{{ team.name }}</td>
<td class="py-3 px-4 text-right font-bold">{{ team.points }}</td>
<td class="py-3 px-4 text-center">
{% if team.change > 0 %}
<span class="text-green-600"><i class="fas fa-arrow-up"></i> {{ team.change }}</span>
{% elif team.change < 0 %}
<span class="text-red-600"><i class="fas fa-arrow-down"></i> {{ team.change|abs }}</span>
{% else %}
<span class="text-gray-400">-</span>
{% endif %}
</td>
</tr>
{% endfor %}
{% if not teams %}
<tr>
<td colspan="4" class="py-8 text-center text-gray-500">No teams found. Start a quiz league to see rankings here!</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<!-- Team Formation CTA -->
<div class="bg-irish-green rounded-lg shadow-md p-6 text-center text-white">
<h3 class="text-xl font-garamond font-bold mb-2">Ready to join the rankings?</h3>
<p class="mb-4">Create or join a team and start climbing the leaderboard today!</p>
<a href="/teams/" class="inline-block bg-white text-irish-green font-bold px-6 py-2 rounded-md hover:bg-gray-100 transition">
Join a Team
</a>
</div>
</div>
{% endblock %}