From c3d33545372ed73b740153917907bf3d16554887 Mon Sep 17 00:00:00 2001 From: Clayzxr Date: Fri, 24 Jan 2025 19:46:53 +0100 Subject: [PATCH] Trying to make EditMobility works --- .../mobility/(_islands)/EditMobility.tsx | 282 +++++++++--------- 1 file changed, 149 insertions(+), 133 deletions(-) diff --git a/routes/(apps)/mobility/(_islands)/EditMobility.tsx b/routes/(apps)/mobility/(_islands)/EditMobility.tsx index 2970a81..7438518 100644 --- a/routes/(apps)/mobility/(_islands)/EditMobility.tsx +++ b/routes/(apps)/mobility/(_islands)/EditMobility.tsx @@ -1,10 +1,20 @@ import { useEffect, useState } from "preact/hooks"; -interface MobilityData { - id: number; - studentId: string; +interface Student { + id: string; firstName: string; lastName: string; + promotionId: number; +} + +interface Promotion { + id: number; + name: string; +} + +interface Mobility { + id: number; + studentId: string; startDate: string | null; endDate: string | null; weeksCount: number | null; @@ -14,12 +24,13 @@ interface MobilityData { } export default function EditMobility() { - const [mobilityData, setMobilityData] = useState([]); + const [data, setData] = useState<{ promotions?: Promotion[]; students?: Student[]; mobilities?: Mobility[] } | null>(null); + const [error, setError] = useState(null); const [isSaving, setIsSaving] = useState(false); useEffect(() => { - const fetchMobilityData = async () => { - console.log("EditMobility: Fetching mobility data..."); + const fetchData = async () => { + console.log("EditMobility: Fetching data from API..."); try { const response = await fetch("/mobility/api/insert_mobility"); console.log("EditMobility: API response status:", response.status); @@ -28,33 +39,54 @@ export default function EditMobility() { throw new Error(`Error fetching data: ${response.statusText}`); } - const data = await response.json(); - console.log("EditMobility: Data fetched successfully:", data); - setMobilityData(data.mobilities || []); + const result = await response.json(); + console.log("EditMobility: Data fetched successfully:", result); + setData(result); } catch (err) { console.error("EditMobility: Error fetching data:", err); + setError("Failed to load mobility data. Please try again later."); } }; - fetchMobilityData(); + fetchData(); }, []); + const handleChange = ( + studentId: string, + field: keyof Mobility, + value: string | number | null, + ) => { + if (!data) return; + + setData((prevData) => { + if (!prevData) return null; + + const updatedMobilities = prevData.mobilities?.map((mobility) => { + if (mobility.studentId === studentId) { + return { ...mobility, [field]: value }; + } + return mobility; + }) || []; + + return { ...prevData, mobilities: updatedMobilities }; + }); + }; + const handleSave = async () => { - console.log("EditMobility: Saving data..."); setIsSaving(true); try { const response = await fetch("/mobility/api/insert_mobility", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ data: mobilityData }), + body: JSON.stringify({ data: data?.mobilities }), }); console.log("EditMobility: Save response status:", response.status); if (response.ok) { - console.log("EditMobility: Data saved successfully."); alert("Data saved successfully!"); + window.location.reload(); // Refresh the page to load updated data } else { throw new Error(`Failed to save data: ${response.statusText}`); } @@ -66,128 +98,112 @@ export default function EditMobility() { } }; + if (error) { + return

{error}

; + } + + if (!data?.promotions) { + return

Loading data...

; + } + return ( -
- - - - - - - - - - - - - - - {mobilityData.map((mobility) => ( - - - - - - - - - - - ))} - -
First NameLast NameStart DateEnd DateWeeks CountDestination CountryDestination NameStatus
{mobility.firstName}{mobility.lastName} - - setMobilityData((prev) => - prev.map((entry) => - entry.id === mobility.id - ? { ...entry, startDate: e.target.value } - : entry - ) - ) - } - /> - - - setMobilityData((prev) => - prev.map((entry) => - entry.id === mobility.id - ? { ...entry, endDate: e.target.value } - : entry - ) - ) - } - /> - - - setMobilityData((prev) => - prev.map((entry) => - entry.id === mobility.id - ? { ...entry, weeksCount: Number(e.target.value) || null } - : entry - ) - ) - } - /> - - - setMobilityData((prev) => - prev.map((entry) => - entry.id === mobility.id - ? { ...entry, destinationCountry: e.target.value } - : entry - ) - ) - } - /> - - - setMobilityData((prev) => - prev.map((entry) => - entry.id === mobility.id - ? { ...entry, destinationName: e.target.value } - : entry - ) - ) - } - /> - - -
+
+

Edit Mobility

+ {data.promotions.map((promo) => ( +
+

Promotion: {promo.name}

+ + + + + + + + + + + + + + + + {data.students + ?.filter((student) => student.promotionId === promo.id) + .map((student) => { + const mobility = data.mobilities?.find((mob) => mob.studentId === student.id) || { + studentId: student.id, + startDate: null, + endDate: null, + weeksCount: null, + destinationCountry: null, + destinationName: null, + mobilityStatus: "N/A", + }; + + return ( + + + + + + + + + + + + ); + })} + +
IDFirst NameLast NameStart DateEnd DateWeeks CountDestination CountryDestination NameStatus
{student.id}{student.firstName}{student.lastName} + handleChange(student.id, "startDate", e.target.value)} + /> + + handleChange(student.id, "endDate", e.target.value)} + /> + + + handleChange(student.id, "weeksCount", Number(e.target.value) || null) + } + /> + + handleChange(student.id, "destinationCountry", e.target.value)} + /> + + handleChange(student.id, "destinationName", e.target.value)} + /> + + +
+
+ ))} -
+ ); }