import { useEffect, useState } from "preact/hooks"; type Student = { numEtud: number; nom: string; prenom: string; idPromo: string; }; type Promotion = { id: string; annee: string | null }; export default function AdminConsultNotes() { const [students, setStudents] = useState([]); const [promos, setPromos] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [filterPromo, setFilterPromo] = useState(""); const [filterNom, setFilterNom] = useState(""); const [filterPrenom, setFilterPrenom] = useState(""); const [applied, setApplied] = useState({ promo: "", nom: "", prenom: "", }); useEffect(() => { async function load() { try { const [sRes, pRes] = await Promise.all([ fetch("/students/api/students"), fetch("/students/api/promotions"), ]); if (!sRes.ok) throw new Error("Impossible de charger les étudiants"); setStudents(await sRes.json()); if (pRes.ok) setPromos(await pRes.json()); } catch (e) { setError(e instanceof Error ? e.message : "Erreur"); } finally { setLoading(false); } } load(); }, []); const filtered = students.filter((s) => { if (applied.promo && s.idPromo !== applied.promo) return false; if ( applied.nom && !s.nom.toLowerCase().includes(applied.nom.toLowerCase()) ) return false; if ( applied.prenom && !s.prenom.toLowerCase().includes(applied.prenom.toLowerCase()) ) return false; return true; }); function applyFilters() { setApplied({ promo: filterPromo, nom: filterNom, prenom: filterPrenom }); } return (

Consulter les Notes

{error &&

{error}

}
setFilterNom((e.target as HTMLInputElement).value)} /> setFilterPrenom((e.target as HTMLInputElement).value)} />
{loading ?

Chargement…

: (
{filtered.length === 0 ? ( ) : filtered.map((s) => ( ))}
Promo Nom Prénom N° Étudiant Action
Aucun étudiant trouvé
{s.idPromo} {s.nom} {s.prenom} {s.numEtud}
)}
); }