import { useEffect, useState } from "preact/hooks"; type Student = { numEtud: number; nom: string; prenom: string; idPromo: string; }; type Promotion = { id: string; annee: string }; export default function ConsultStudents() { 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(""); 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 élèves"); setStudents(await sRes.json()); if (pRes.ok) setPromos(await pRes.json()); } catch (e) { setError(e instanceof Error ? e.message : "Erreur"); } finally { setLoading(false); } } useEffect(() => { load(); }, []); async function deleteStudent(numEtud: number) { if (!confirm(`Supprimer l'élève #${numEtud} ?`)) return; try { const res = await fetch(`/students/api/students/${numEtud}`, { method: "DELETE", }); if (!res.ok) throw new Error("Suppression échouée"); await load(); } catch (e) { setError(e instanceof Error ? e.message : "Erreur"); } } const filtered = students.filter((s) => { const matchPromo = !filterPromo || s.idPromo === filterPromo; const matchNom = !filterNom || `${s.nom} ${s.prenom}`.toLowerCase().includes(filterNom.toLowerCase()); return matchPromo && matchNom; }); return (

Gestion des Élèves

{error &&

{error}

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

Chargement…

: (
{filtered.length === 0 ? ( ) : filtered.map((s) => ( ))}
N° étud. Nom Prénom Promo Actions
Aucun élève trouvé
{s.numEtud} {s.nom} {s.prenom} {s.idPromo}
)}
); }