'use client'; import { useState, useEffect } from 'react'; import gstoolsLogo from './gstools_logo.jpg'; interface Aufgabe { id: number; beschreibung: string; erledigt: boolean; erstellt: string; } interface Pagination { page: number; limit: number; total: number; totalPages: number; } type SortOption = 'text_asc' | 'text_desc' | 'datum_asc' | 'datum_desc'; export default function TodoApp() { const [aufgaben, setAufgaben] = useState([]); const [neueAufgabe, setNeueAufgabe] = useState(''); const [sortierung, setSortierung] = useState('datum_desc'); const [isLoading, setIsLoading] = useState(true); const [pagination, setPagination] = useState({ page: 1, limit: 10, total: 0, totalPages: 1 }); // Lade Aufgaben vom Server mit Paginierung und Sortierung const loadAufgaben = async (page: number = 1) => { try { setIsLoading(true); const response = await fetch(`/api/tasks?page=${page}&limit=10&sort=${sortierung}`); if (response.ok) { const data = await response.json(); setAufgaben(data.aufgaben); setPagination(data.pagination); } } catch (error) { console.error('Fehler beim Laden der Aufgaben:', error); } finally { setIsLoading(false); } }; // Initial laden useEffect(() => { loadAufgaben(1); }, []); // Aufgaben werden bereits serverseitig sortiert, keine clientseitige Sortierung nötig const sortierteAufgaben = aufgaben; const handleHinzufuegen = async (e: React.FormEvent) => { e.preventDefault(); if (neueAufgabe.trim()) { try { const response = await fetch('/api/tasks', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ beschreibung: neueAufgabe.trim() }), }); if (response.ok) { setNeueAufgabe(''); // Zur ersten Seite zurück, wenn neue Aufgabe hinzugefügt wird await loadAufgaben(1); } } catch (error) { console.error('Fehler beim Hinzufügen:', error); } } }; const handleLoeschen = async (id: number) => { if (confirm('Möchtest du diese Aufgabe wirklich löschen?')) { try { const response = await fetch(`/api/tasks/${id}`, { method: 'DELETE', }); if (response.ok) { // Aktuelle Seite neu laden oder zur vorherigen, wenn leer await loadAufgaben(pagination.page); } } catch (error) { console.error('Fehler beim Löschen:', error); } } }; const handleErledigen = async (id: number) => { try { const response = await fetch(`/api/tasks/${id}`, { method: 'PUT', }); if (response.ok) { await loadAufgaben(pagination.page); } } catch (error) { console.error('Fehler beim Aktualisieren:', error); } }; // Sortierung ändern und Aufgaben neu laden const handleSortierungAendern = async (e: React.ChangeEvent) => { const neueSortierung = e.target.value as SortOption; setSortierung(neueSortierung); await loadAufgaben(1); }; return (

To-Do-Liste

{/* Sortieroptionen und Export */}
Sortieren nach:
{/* Formular zum Hinzufügen */}
setNeueAufgabe(e.target.value)} placeholder="Neue Aufgabe eingeben..." required disabled={isLoading} />
{/* To-Do-Liste */} {isLoading ? (

Lädt Aufgaben...

) : sortierteAufgaben.length > 0 ? ( ) : (

Die To-Do-Liste ist leer. Füge eine neue Aufgabe hinzu!

)} {/* Paginierung */} {pagination.totalPages > 1 && (
Seite {pagination.page} von {pagination.totalPages} ({pagination.total} Aufgaben)
)}
); }