WIP: Add points system for movies and picks, admin configuration, and stats page updates

This commit is contained in:
quoije
2025-12-26 12:37:30 -05:00
parent 7722ac89c3
commit 1281d77c4e
22 changed files with 4632 additions and 9 deletions
+236
View File
@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pool Oscars - Mes choix</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./css/app.css" rel="stylesheet">
<link rel="preload" as="image" href="img/logo_w.png">
<script src="./js/app_header_boot.js" defer></script>
<style>
.navbar-custom {
background-color: black;
color: white;
}
.navbar-custom .navbar-brand,
.navbar-custom .nav-link {
color: white;
}
.navbar-custom .nav-link:hover {
color: #ddd;
}
.navbar-toggler {
border-color: white;
}
.navbar-toggler-icon {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='white' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
}
.category-card {
margin-bottom: 1.5rem;
}
.nominee-option {
cursor: pointer;
transition: background-color 0.2s;
}
.nominee-option:hover {
background-color: #f8f9fa;
}
.nominee-option.selected {
background-color: #0d6efd;
color: white;
}
.nominee-option.selected:hover {
background-color: #0b5ed7;
}
.user-picks-card {
margin-bottom: 1.5rem;
}
.pick-item {
padding: 0.5rem;
border-bottom: 1px solid #dee2e6;
}
.pick-item:last-child {
border-bottom: none;
}
.correct-pick {
background-color: #d1e7dd;
}
.incorrect-pick {
background-color: #f8d7da;
}
</style>
</head>
<body class="bg-light">
<nav class="navbar navbar-expand-lg navbar-custom">
<div class="container">
<a class="navbar-brand" style="margin-left: -7px;">
<img src="img/logo_w.png" width="220" height="70" loading="eager" fetchpriority="high" decoding="async" style="max-width: 220px; height: 70px; object-fit: contain;">
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<div class="navbar-nav">
<a href="movies.html" class="nav-link btn btn-outline-light me-2">Films</a>
<a href="checklist.html" class="nav-link btn btn-outline-light me-2">Checklist</a>
<a href="user-stat.html" class="nav-link btn btn-outline-light me-2">Statistiques</a>
<a href="picks.html" class="nav-link btn btn-outline-light me-2">Mes choix</a>
<a id="admin-control-link" href="control.html" class="nav-link btn btn-warning me-2 d-none">Admin</a>
</div>
<div class="d-flex ms-auto mt-2 mt-lg-0 align-items-center">
<span id="user-name" class="navbar-text me-3"></span>
<button id="log-off" class="btn btn-danger">Déconnexion</button>
</div>
</div>
</div>
</nav>
<div class="container mt-5 pb-5">
<h2>Mes choix Oscars</h2>
<div id="alert-container"></div>
<!-- Tabs -->
<ul class="nav nav-tabs mt-3" id="picksTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tab-my-picks" data-bs-toggle="tab" data-bs-target="#pane-my-picks" type="button" role="tab" aria-controls="pane-my-picks" aria-selected="true">
Mes choix
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link d-none" id="tab-all-picks" data-bs-toggle="tab" data-bs-target="#pane-all-picks" type="button" role="tab" aria-controls="pane-all-picks" aria-selected="false">
Voir tous les choix
<span class="badge bg-warning text-dark ms-1">Admin</span>
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link d-none" id="tab-winners" data-bs-toggle="tab" data-bs-target="#pane-winners" type="button" role="tab" aria-controls="pane-winners" aria-selected="false">
Gagnants & Scores
<span class="badge bg-warning text-dark ms-1">Admin</span>
</button>
</li>
</ul>
<div class="tab-content pt-3" id="picksTabsContent">
<!-- My Picks Tab -->
<div class="tab-pane fade show active" id="pane-my-picks" role="tabpanel" aria-labelledby="tab-my-picks" tabindex="0">
<div class="card shadow-sm mb-4">
<div class="card-body">
<div class="d-flex flex-column flex-md-row align-items-start align-items-md-center justify-content-between gap-2">
<div>
<div class="fw-semibold">Année: <span id="current-year">—</span></div>
<div class="text-muted small">Sélectionne tes choix pour chaque catégorie</div>
</div>
<div class="d-flex gap-2">
<button type="button" id="load-my-picks" class="btn btn-outline-secondary">Recharger mes choix</button>
<button type="button" id="submit-picks" class="btn btn-primary">Enregistrer mes choix</button>
</div>
</div>
<div class="mt-3">
<div class="text-muted small">
Progression: <span id="picks-progress">0 / 0</span> catégories complétées
</div>
</div>
</div>
</div>
<div id="categories-container">
<div class="text-center py-4 text-muted">Chargement des catégories…</div>
</div>
</div>
<!-- All Picks Tab (Admin only) -->
<div class="tab-pane fade" id="pane-all-picks" role="tabpanel" aria-labelledby="tab-all-picks" tabindex="0">
<div class="card shadow-sm mb-4">
<div class="card-body">
<div class="d-flex flex-column flex-md-row align-items-start align-items-md-center justify-content-between gap-2">
<div>
<div class="fw-semibold">Année: <span id="all-picks-year">—</span></div>
<div class="text-muted small">Vue d'ensemble de tous les choix des utilisateurs</div>
</div>
<div class="d-flex gap-2">
<button type="button" id="refresh-all-picks" class="btn btn-outline-secondary">Rafraîchir</button>
</div>
</div>
<div class="mt-3">
<div class="text-muted small">
<span id="users-count">0</span> utilisateur(s) ont soumis leurs choix
</div>
</div>
</div>
</div>
<div id="all-picks-container">
<div class="text-center py-4 text-muted">Chargement des choix…</div>
</div>
</div>
<!-- Winners & Scores Tab (Admin only) -->
<div class="tab-pane fade" id="pane-winners" role="tabpanel" aria-labelledby="tab-winners" tabindex="0">
<div class="card shadow-sm mb-4">
<div class="card-body">
<div class="d-flex flex-column flex-md-row align-items-start align-items-md-center justify-content-between gap-2">
<div>
<div class="fw-semibold">Année: <span id="winners-year">—</span></div>
<div class="text-muted small">Marquez les gagnants et calculez les scores</div>
</div>
<div class="d-flex gap-2">
<button type="button" id="calculate-scores" class="btn btn-success">Calculer les scores</button>
<button type="button" id="refresh-winners" class="btn btn-outline-secondary">Rafraîchir</button>
</div>
</div>
<div class="mt-3">
<div class="text-muted small">
<span id="winners-progress">0 / 0</span> catégories avec gagnants marqués
</div>
</div>
</div>
</div>
<div id="winners-container">
<div class="text-center py-4 text-muted">Chargement des catégories…</div>
</div>
<!-- Scores Table -->
<div class="card shadow-sm mt-4">
<div class="card-header">
<h5 class="mb-0">Scores des utilisateurs</h5>
</div>
<div class="card-body">
<div id="scores-container">
<div class="text-center py-4 text-muted">Les scores seront calculés après avoir marqué les gagnants.</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Modal for user picks comparison -->
<div class="modal fade" id="userPicksModal" tabindex="-1" aria-labelledby="userPicksModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="userPicksModalLabel">Détails des choix</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="user-picks-modal-content">
<div class="text-center py-4 text-muted">Chargement...</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.js"></script>
<script src="./js/app_picks.js"></script>
</body>
</html>