'use client' /** * Arbeitsvorrat (Task Manager) - User Frontend * * Task management view with: * - All tasks extracted from emails * - Deadline tracking and reminders * - Priority-based organization * * See: docs/klausur-modul/UNIFIED-INBOX-SPECIFICATION.md */ import { useState, useEffect, useCallback } from 'react' import { API_BASE, Task, DashboardStats, FilterStatus, FilterPriority, statusLabels, priorityLabels, } from './_components/types' import { StatCard } from './_components/StatCard' import { CreateTaskModal } from './_components/CreateTaskModal' import { TaskCard } from './_components/TaskCard' export default function TasksPage() { const [tasks, setTasks] = useState([]) const [stats, setStats] = useState(null) const [loading, setLoading] = useState(true) const [filterStatus, setFilterStatus] = useState('all') const [filterPriority, setFilterPriority] = useState('all') const [showCreateModal, setShowCreateModal] = useState(false) const fetchTasks = useCallback(async () => { try { setLoading(true) const params = new URLSearchParams() if (filterStatus !== 'all') params.append('status', filterStatus) if (filterPriority !== 'all') params.append('priority', filterPriority) params.append('include_completed', filterStatus === 'completed' ? 'true' : 'false') const [tasksRes, statsRes] = await Promise.all([ fetch(`${API_BASE}/api/v1/mail/tasks?${params}`), fetch(`${API_BASE}/api/v1/mail/tasks/dashboard`), ]) if (tasksRes.ok) { const data = await tasksRes.json(); setTasks(data.tasks || []) } if (statsRes.ok) { const data = await statsRes.json(); setStats(data) } } catch (err) { console.error('Failed to fetch tasks:', err) } finally { setLoading(false) } }, [filterStatus, filterPriority]) useEffect(() => { fetchTasks() }, [fetchTasks]) const updateTaskStatus = async (taskId: string, status: string) => { try { await fetch(`${API_BASE}/api/v1/mail/tasks/${taskId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status }), }) fetchTasks() } catch (err) { console.error('Failed to update task:', err) } } return (
{/* Header */}

Arbeitsvorrat

Aufgaben aus E-Mails und manuelle Eintraege

Zurueck zur Inbox
{/* Dashboard Stats */} {stats && (
0} /> 0} />
)} {/* Filters */}
Status:
{(['all', 'pending', 'in_progress', 'completed'] as FilterStatus[]).map((status) => ( ))}
Prioritaet:
{(['all', 'urgent', 'high', 'medium', 'low'] as FilterPriority[]).map((priority) => ( ))}
{/* Task List */} {loading ? (
) : tasks.length === 0 ? (

Keine Aufgaben

{filterStatus !== 'all' || filterPriority !== 'all' ? 'Keine Aufgaben mit den gewaehlten Filtern gefunden.' : 'Lassen Sie E-Mails analysieren oder erstellen Sie Aufgaben manuell.'}

) : (
{tasks.map((task) => ( ))}
)}
{showCreateModal && ( setShowCreateModal(false)} onSuccess={() => { setShowCreateModal(false); fetchTasks() }} /> )}
) }