feat: gestion des utilisateurs, rôles et équipes

- Ajout de la section de gestion des utilisateurs avec rôles (Admin, Trésorerie, Agent de Saisie).
- Restriction des accès par rôle (Admin a tout, Trésorerie a adhérents/paiements, Agent de saisie a adhérents/planning).
- Flux de modification obligatoire de mot de passe temporaire au premier login (par défaut AsTalange123).
- Intégration de la configuration des équipes du club.
This commit is contained in:
2026-05-30 23:11:12 +02:00
parent 7e9504ffe0
commit 8a15139efb
29 changed files with 948 additions and 35 deletions
@@ -0,0 +1,92 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Paramétrage - Équipes</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style> body { font-family: 'Inter', sans-serif; } </style>
</head>
<body class="bg-gray-50 text-gray-900 flex h-screen overflow-hidden">
<!-- Sidebar -->
<div th:replace="~{fragments/sidebar :: sidebar}"></div>
<main class="flex-1 flex flex-col h-screen overflow-hidden">
<header class="h-16 bg-white border-b border-gray-200 flex items-center px-6">
<h2 class="text-lg font-semibold text-gray-800">Configuration des Équipes</h2>
</header>
<div class="flex-1 overflow-auto p-6">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Left: Add Team Form Card -->
<div class="bg-white rounded-xl shadow-sm border border-gray-100 p-6 h-fit">
<h3 class="text-lg font-bold text-gray-900 mb-4">Créer une Équipe</h3>
<form th:action="@{/equipes}" method="post" class="space-y-4">
<div>
<label for="nom" class="block text-sm font-medium text-gray-700 mb-1">Nom de l'équipe</label>
<input type="text" id="nom" name="nom" placeholder="Ex: Équipe A, Équipe 1" required
class="w-full border border-gray-300 rounded-lg px-4 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-colors">
</div>
<div>
<label for="categorie" class="block text-sm font-medium text-gray-700 mb-1">Catégorie associée</label>
<select id="categorie" name="categorieId" required
class="w-full border border-gray-300 rounded-lg px-4 py-2 text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-colors">
<option value="">Choisir une catégorie...</option>
<option th:each="cat : ${categories}" th:value="${cat.id}"
th:text="${cat.nom + ' (' + cat.saison.nom + ')'}"></option>
</select>
</div>
<div class="pt-2">
<button type="submit" class="w-full py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg text-sm font-semibold transition-colors shadow-sm">
+ Ajouter l'équipe
</button>
</div>
</form>
</div>
<!-- Right: Teams List Card -->
<div class="lg:col-span-2 bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden">
<div class="px-6 py-4 border-b border-gray-100 flex justify-between items-center bg-gray-50">
<h3 class="font-bold text-gray-900">Équipes Paramétrées</h3>
<span class="text-xs font-semibold text-gray-500 bg-gray-200 px-2.5 py-1 rounded-full"
th:text="${saisonActive != null ? 'Saison active : ' + saisonActive.nom : 'Toutes les Saisons'}">Saison Actuelle</span>
</div>
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="bg-gray-50 text-gray-500 text-xs uppercase tracking-wider border-b border-gray-100">
<th class="py-3 px-6 font-medium">Nom de l'équipe</th>
<th class="py-3 px-6 font-medium">Catégorie</th>
<th class="py-3 px-6 font-medium">Saison</th>
<th class="py-3 px-6 font-medium text-right">Actions</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-100 text-sm">
<tr th:if="${#lists.isEmpty(equipes)}">
<td colspan="4" class="py-8 text-center text-gray-500">Aucune équipe configurée pour le moment. Usez du formulaire à gauche pour en créer une.</td>
</tr>
<tr th:each="team : ${equipes}" class="hover:bg-gray-50 transition-colors">
<td class="py-4 px-6 font-medium text-gray-900" th:text="${team.nom}">Équipe 1</td>
<td class="py-4 px-6 text-gray-600">
<span class="bg-blue-50 text-blue-700 px-2.5 py-1 rounded-full text-xs font-medium" th:text="${team.categorie.nom}">U15</span>
</td>
<td class="py-4 px-6 text-gray-500" th:text="${team.saison.nom}">2024-2025</td>
<td class="py-4 px-6 text-right flex justify-end items-center">
<form th:action="@{/equipes/{id}/delete(id=${team.id})}" method="post" onsubmit="return confirm('Supprimer cette équipe ? Elle sera dissociée de toutes ses licences.');">
<button type="submit" class="text-red-500 hover:text-red-700 font-medium text-xs bg-red-50 hover:bg-red-100 px-2.5 py-1.5 rounded-lg transition-colors">
Supprimer
</button>
</form>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</main>
</body>
</html>