import { useEffect, useState } from "preact/hooks"; interface Promotion { id: number; name: string; } interface MobilityData { id: number | null; studentId: string; firstName: string; lastName: string; startDate: string | null; endDate: string | null; weeksCount: number | null; destinationCountry: string | null; destinationName: string | null; mobilityStatus: string; promotionId: number; promotionName: string; } export default function EditMobility() { const [mobilityData, setMobilityData] = useState([]); const [promotions, setPromotions] = useState([]); const [isSaving, setIsSaving] = useState(false); useEffect(() => { async function fetchMobilityData() { const response = await fetch("/mobility/api/insert-mobility"); const data = await response.json(); console.log("EditMobility: Data fetched successfully:", data); setPromotions(data.promotions); const initializedData = data.students.map((student: any) => { const existingMobility = data.mobilities.find( (mobility: any) => mobility.studentId === student.id ); return { id: existingMobility ? existingMobility.id : null, studentId: student.id, firstName: student.firstName, lastName: student.lastName, startDate: existingMobility?.startDate || null, endDate: existingMobility?.endDate || null, weeksCount: existingMobility?.weeksCount || null, destinationCountry: existingMobility?.destinationCountry || null, destinationName: existingMobility?.destinationName || null, mobilityStatus: existingMobility?.mobilityStatus || "N/A", promotionId: student.promotionId, promotionName: student.promotionName, }; }); setMobilityData(initializedData); } fetchMobilityData(); }, []); const handleChange = ( studentId: string, field: keyof MobilityData, value: string | number | null ) => { setMobilityData((prev) => prev.map((entry) => entry.studentId === studentId ? { ...entry, [field]: value } : entry ) ); }; const handleSave = async () => { setIsSaving(true); try { const response = await fetch("/mobility/api/insert-mobility", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ data: mobilityData }), }); if (response.ok) { alert("Data saved successfully!"); console.log("EditMobility: Save response status:", response.status); } else { alert("Failed to save data."); console.error("EditMobility: Save response status:", response.status); } } catch (error) { console.error("EditMobility: Error saving data:", error); alert("An error occurred while saving data."); } finally { setIsSaving(false); } }; const groupedData = promotions.map((promo) => ({ promotion: promo.name, students: mobilityData.filter( (entry) => entry.promotionId === promo.id ), })); return (

Edit Mobility

{groupedData.map((group) => (

Promotion: {group.promotion}

{group.students.map((entry) => ( ))}
ID First Name Last Name Start Date End Date Weeks Count Destination Country Destination Name Status
{entry.studentId} {entry.firstName} {entry.lastName} handleChange(entry.studentId, "startDate", e.target.value) } /> handleChange(entry.studentId, "endDate", e.target.value) } /> {entry.weeksCount || "0"} handleChange( entry.studentId, "destinationCountry", e.target.value ) } /> handleChange(entry.studentId, "destinationName", e.target.value) } />
))}
); }