'use client' import React, { useState, useEffect, useCallback } from 'react' import { Task, TASK_CATEGORIES, PRIORITY_LABELS, PRIORITY_COLORS, TASK_STATUS_LABELS, TASK_STATUS_COLORS, apiFetch, formatDate, } from './types' import { Skeleton, Modal, Badge, FormLabel, FormInput, FormTextarea, FormSelect, PrimaryButton, SecondaryButton, ErrorState, EmptyState, IconTask, IconPlus, IconCheck, IconCalendar, } from './ui-primitives' export function AufgabenTab({ assignmentId, addToast, }: { assignmentId: string addToast: (msg: string, type?: 'success' | 'error') => void }) { const [tasks, setTasks] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [statusFilter, setStatusFilter] = useState('all') const [showModal, setShowModal] = useState(false) const [saving, setSaving] = useState(false) const [newTitle, setNewTitle] = useState('') const [newDesc, setNewDesc] = useState('') const [newCategory, setNewCategory] = useState(TASK_CATEGORIES[0]) const [newPriority, setNewPriority] = useState('medium') const [newDueDate, setNewDueDate] = useState('') const fetchTasks = useCallback(async () => { setLoading(true) setError('') try { const params = statusFilter !== 'all' ? `?status=${statusFilter}` : '' const data = await apiFetch(`/api/sdk/v1/dsb/assignments/${assignmentId}/tasks${params}`) setTasks(data) } catch (e: unknown) { setError(e instanceof Error ? e.message : 'Fehler beim Laden der Aufgaben') } finally { setLoading(false) } }, [assignmentId, statusFilter]) useEffect(() => { fetchTasks() }, [fetchTasks]) const handleCreateTask = async (e: React.FormEvent) => { e.preventDefault() setSaving(true) try { await apiFetch(`/api/sdk/v1/dsb/assignments/${assignmentId}/tasks`, { method: 'POST', body: JSON.stringify({ title: newTitle, description: newDesc, category: newCategory, priority: newPriority, due_date: newDueDate || null, }), }) addToast('Aufgabe erstellt') setShowModal(false) setNewTitle(''); setNewDesc(''); setNewCategory(TASK_CATEGORIES[0]) setNewPriority('medium'); setNewDueDate('') fetchTasks() } catch (e: unknown) { addToast(e instanceof Error ? e.message : 'Fehler', 'error') } finally { setSaving(false) } } const handleCompleteTask = async (taskId: string) => { try { await apiFetch(`/api/sdk/v1/dsb/tasks/${taskId}/complete`, { method: 'POST' }) addToast('Aufgabe abgeschlossen') fetchTasks() } catch (e: unknown) { addToast(e instanceof Error ? e.message : 'Fehler', 'error') } } const statusFilters = [ { value: 'all', label: 'Alle' }, { value: 'open', label: 'Offen' }, { value: 'in_progress', label: 'In Bearbeitung' }, { value: 'completed', label: 'Erledigt' }, ] return (
{/* Toolbar */}
{statusFilters.map((f) => ( ))}
setShowModal(true)} className="flex items-center gap-1.5"> Neue Aufgabe
{/* Content */} {loading ? (
{Array.from({ length: 4 }).map((_, i) => )}
) : error ? ( ) : tasks.length === 0 ? ( } title="Keine Aufgaben" description="Erstellen Sie eine neue Aufgabe um zu beginnen." /> ) : (
{tasks.map((task) => (

{task.title}

{task.description &&

{task.description}

}
{task.due_date && ( Frist: {formatDate(task.due_date)} )} Erstellt: {formatDate(task.created_at)}
{task.status !== 'completed' && task.status !== 'cancelled' && ( )}
))}
)} {/* Create task modal */} setShowModal(false)} title="Neue Aufgabe erstellen">
Titel *
Beschreibung
Kategorie ({ value: c, label: c }))} />
Prioritaet
Faelligkeitsdatum
setShowModal(false)}>Abbrechen {saving ? 'Erstelle...' : 'Aufgabe erstellen'}
) }