All files / lib/filter epreuveFilter.ts

100% Statements 31/31
95.23% Branches 20/21
100% Functions 6/6
100% Lines 29/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69                            3x         20x   20x 9x 28x         20x 1x 4x 7x     4x       20x 2x 9x 8x 8x   8x 8x   8x       20x 6x     20x 4x 22x 22x 11x 11x 11x   22x       20x  
import {Epreuve, EpreuveCardType, EpreuveFilters} from "@/type/evenement/epreuve";
 
/**
 * Filtre une liste d'épreuves selon les critères spécifiés
 * @param epreuves - Liste des épreuves au format carte à filtrer
 * @param filters - Critères de filtrage à appliquer
 * @param fullEpreuves - Liste complète des épreuves avec toutes les données (optionnel, nécessaire pour filtrer par disciplineId)
 * @returns Liste filtrée des épreuves
 * @example
 * const filteredEpreuves = filterEpreuves(epreuves, {
 *   libelle: 'natation',
 *   date: '2024-07-26'
 * });
 */
export function filterEpreuves(
  epreuves: EpreuveCardType[],
  filters: EpreuveFilters,
  fullEpreuves?: Epreuve[] // ton tableau complet avec discipline.id
): EpreuveCardType[] {
  let filtered = [...epreuves];
 
  if (filters.libelle) {
    filtered = filtered.filter(epreuve =>
      epreuve.libelle.toLowerCase().includes(filters.libelle!.toLowerCase()) ||
      epreuve.discipline.toLowerCase().includes(filters.libelle!.toLowerCase())
    );
  }
 
  if (filters.disciplineId) {
    filtered = filtered.filter(epreuve => {
      const epreuveComplete = fullEpreuves?.find(e =>
        e.libelle === epreuve.libelle &&
        e.discipline.nom === epreuve.discipline
      );
      return epreuveComplete ? epreuveComplete.discipline.id === filters.disciplineId : false;
    });
  }
 
  if (filters.date) {
    filtered = filtered.filter(epreuve => {
      if (!epreuve.dateRaw) return false;
      const epreuveDate = new Date(epreuve.dateRaw);
      const filterDate = new Date(filters.date!);
 
      const epreuveDateOnly = new Date(epreuveDate.getFullYear(), epreuveDate.getMonth(), epreuveDate.getDate());
      const filterDateOnly = new Date(filterDate.getFullYear(), filterDate.getMonth(), filterDate.getDate());
 
      return epreuveDateOnly >= filterDateOnly;
    });
  }
 
  if (filters.tour) {
    filtered = filtered.filter(epreuve => epreuve.tour === filters.tour);
  }
 
  if (filters.sortBy) {
    filtered.sort((a, b) => {
      let comparison = 0;
      if (filters.sortBy === 'date') {
        comparison = new Date(a.dateRaw).getTime() - new Date(b.dateRaw).getTime();
      } else if (filters.sortBy === 'libelle') {
        comparison = a.libelle.localeCompare(b.libelle);
      }
      return filters.sortOrder === 'desc' ? -comparison : comparison;
    });
  }
 
  return filtered;
}