import { useState } from "react"; import "./App.css"; function App() { const [institution, setInstitution] = useState(""); const [dateInfo, setDateInfo] = useState(""); const [listType, setListType] = useState("k"); const [studentsFile, setStudentsFile] = useState(null); const [familiesFile, setFamiliesFile] = useState(null); const [isLoading, setIsLoading] = useState(false); const handleGenerate = async (e: React.FormEvent) => { e.preventDefault(); if (!studentsFile) return alert("Bitte Namensliste (CSV) hochladen!"); setIsLoading(true); const formData = new FormData(); formData.append("institution", institution); formData.append("date_info", dateInfo); formData.append("list_type", listType); formData.append("students_file", studentsFile); if (familiesFile) formData.append("families_file", familiesFile); try { const API_URL = ""; const response = await fetch(`${API_URL}/api/generate-list`, { method: "POST", body: formData, }); if (!response.ok) throw new Error("Fehler bei der Generierung"); const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `Listen_${institution.replace(/\s+/g, "_")}_${listType}.pdf`; document.body.appendChild(a); a.click(); a.remove(); } catch (err) { alert("Es gab einen Fehler: " + err); } finally { setIsLoading(false); } }; return (

Listentool

Generiere Fotoauftragslisten aus CSV Dateien.

setInstitution(e.target.value)} placeholder="Grundschule Klettham, Erding" className="mt-1 block w-full border-gray-300 rounded-md shadow-sm border p-2 focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" />
setDateInfo(e.target.value)} placeholder="07.+09.07.2025" className="mt-1 block w-full border-gray-300 border p-2 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" />
setStudentsFile(e.target.files?.[0] || null)} className="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100" />
setFamiliesFile(e.target.files?.[0] || null)} className="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-indigo-50 file:text-indigo-700 hover:file:bg-indigo-100" />
); } export default App;