# Epic 3: Filtering & Search **Goal:** Ajouter un système de filtrage multicritères et de recherche textuelle sur la liste des personnages. L'utilisateur peut rapidement trouver les personnages qui correspondent à ses critères (classe, serveur, compte, team, etc.). ## Story 3.1: Filter Sidebar Component **As a** user, **I want** a sidebar with filter options on the characters list, **so that** I can narrow down the displayed characters. **Acceptance Criteria:** 1. Sidebar à gauche de la liste des personnages 2. Section "Classe" : checkboxes pour chaque classe (17 classes) 3. Section "Serveur" : checkboxes pour chaque serveur existant 4. Section "Compte" : checkboxes pour chaque compte existant 5. Section "Team" : checkboxes pour chaque team existante 6. Section "Niveau" : slider ou inputs min/max (1-200) 7. Bouton "Réinitialiser les filtres" 8. Sidebar collapsible sur mobile (bouton toggle) 9. Compteur de résultats mis à jour en temps réel ## Story 3.2: Filter Logic Implementation **As a** developer, **I want** server-side filtering with URL state, **so that** filters are shareable and persist on refresh. **Acceptance Criteria:** 1. Filtres stockés dans les query params de l'URL (ex: `?class=CRA,IOP&server=1`) 2. API endpoint accepte les paramètres de filtre 3. Requête Prisma optimisée avec WHERE dynamique 4. Filtres combinés en AND (classe ET serveur ET compte...) 5. Au sein d'un même filtre, valeurs combinées en OR (Cra OU Iop) 6. État des filtres synchronisé avec l'URL au changement 7. Chargement initial lit les filtres depuis l'URL 8. Debounce sur les changements pour éviter trop de requêtes ## Story 3.3: Text Search **As a** user, **I want** to search characters by name, **so that** I can quickly find a specific character. **Acceptance Criteria:** 1. Champ de recherche au-dessus du tableau 2. Recherche sur le nom du personnage (insensible à la casse) 3. Recherche également sur le nom du compte 4. Résultats filtrés en temps réel (debounce 300ms) 5. Recherche combinable avec les filtres sidebar 6. Icône "clear" pour vider la recherche 7. Placeholder : "Rechercher un personnage..." 8. Recherche stockée dans l'URL (`?q=...`) ## Story 3.4: Column Sorting **As a** user, **I want** to sort the characters table by clicking column headers, **so that** I can organize the data as needed. **Acceptance Criteria:** 1. Colonnes triables : nom, classe, niveau, serveur, compte 2. Clic sur header = tri ascendant, second clic = descendant, troisième = reset 3. Indicateur visuel de la colonne triée (flèche up/down) 4. Tri côté serveur pour performance 5. Tri par défaut : niveau descendant (200 en premier) 6. Tri stocké dans l'URL (`?sort=level&order=desc`) 7. Un seul tri actif à la fois ## Story 3.5: Saved Filter Presets **As a** user, **I want** to save and reuse filter combinations, **so that** I don't have to reconfigure common filters. **Acceptance Criteria:** 1. Bouton "Sauvegarder ce filtre" quand filtres actifs 2. Modal pour nommer le preset 3. Liste des presets sauvegardés dans la sidebar (section "Mes filtres") 4. Clic sur preset applique tous ses filtres 5. Bouton supprimer sur chaque preset 6. Presets stockés en base de données (model `FilterPreset`) 7. Limite de 10 presets maximum 8. Presets spécifiques à l'utilisateur (pour futur multi-user) ---