'use client' /** * Abitur-Archiv - Lehrer Version * Simplified archive view for teachers */ import { useState, useEffect, useCallback } from 'react' import Link from 'next/link' import { FileText, Filter, ChevronLeft, ChevronRight, Eye, Download, Search, X, Loader2, Grid, List, LayoutGrid, Plus, Archive, BookOpen } from 'lucide-react' // API Base URL const API_BASE = '/api/education/abitur-archiv' // Filter constants const FAECHER = [ { id: 'deutsch', label: 'Deutsch' }, { id: 'englisch', label: 'Englisch' }, { id: 'mathematik', label: 'Mathematik' }, { id: 'biologie', label: 'Biologie' }, { id: 'physik', label: 'Physik' }, { id: 'chemie', label: 'Chemie' }, { id: 'geschichte', label: 'Geschichte' }, ] const JAHRE = [2025, 2024, 2023, 2022, 2021] const NIVEAUS = [ { id: 'eA', label: 'Erhoehtes Niveau (eA)' }, { id: 'gA', label: 'Grundlegendes Niveau (gA)' }, ] const TYPEN = [ { id: 'aufgabe', label: 'Aufgabe' }, { id: 'erwartungshorizont', label: 'Erwartungshorizont' }, ] interface AbiturDokument { id: string dateiname: string fach: string jahr: number niveau: 'eA' | 'gA' typ: 'aufgabe' | 'erwartungshorizont' aufgaben_nummer: string status: string file_path: string file_size: number } export default function AbiturArchivPage() { const [documents, setDocuments] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) // Pagination const [page, setPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [total, setTotal] = useState(0) const limit = 20 // View mode const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid') // Filters const [filterOpen, setFilterOpen] = useState(false) const [filterFach, setFilterFach] = useState('') const [filterJahr, setFilterJahr] = useState('') const [filterNiveau, setFilterNiveau] = useState('') const [filterTyp, setFilterTyp] = useState('') const [searchQuery, setSearchQuery] = useState('') // Preview modal const [previewDoc, setPreviewDoc] = useState(null) const fetchDocuments = useCallback(async () => { setLoading(true) setError(null) const params = new URLSearchParams() params.set('page', page.toString()) params.set('limit', limit.toString()) if (filterFach) params.set('fach', filterFach) if (filterJahr) params.set('jahr', filterJahr) if (filterNiveau) params.set('niveau', filterNiveau) if (filterTyp) params.set('typ', filterTyp) if (searchQuery) params.set('thema', searchQuery) try { // Try the admin-v2 API first const response = await fetch(`${API_BASE}?${params.toString()}`) if (!response.ok) throw new Error('Fehler beim Laden') const data = await response.json() setDocuments(data.documents || []) setTotalPages(data.total_pages || 1) setTotal(data.total || 0) } catch (err) { // Fallback: use mock data setDocuments(getMockDocuments()) setTotal(getMockDocuments().length) setTotalPages(1) } finally { setLoading(false) } }, [page, filterFach, filterJahr, filterNiveau, filterTyp, searchQuery]) useEffect(() => { fetchDocuments() }, [fetchDocuments]) const clearFilters = () => { setFilterFach('') setFilterJahr('') setFilterNiveau('') setFilterTyp('') setSearchQuery('') setPage(1) } const handleSearch = (e: React.FormEvent) => { e.preventDefault() setPage(1) fetchDocuments() } const handleDownload = (doc: AbiturDokument) => { const link = document.createElement('a') link.href = doc.file_path link.download = doc.dateiname link.click() } const handleAddToKlausur = (doc: AbiturDokument) => { window.location.href = `/lehrer/klausur-korrektur?archiv_doc_id=${doc.id}` } const hasActiveFilters = filterFach || filterJahr || filterNiveau || filterTyp || searchQuery const formatFileSize = (bytes: number) => { if (bytes < 1024) return bytes + ' B' if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB' return (bytes / (1024 * 1024)).toFixed(1) + ' MB' } return (
{/* Header */}

Abitur-Archiv

Zentralabitur-Materialien 2021-2025

{total}
Dokumente
{/* Search Bar */}
setSearchQuery(e.target.value)} placeholder="Thema suchen (z.B. Gedichtanalyse, Eroerterung...)" className="w-full pl-10 pr-4 py-2.5 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" />
{/* Filters */}
{hasActiveFilters && ( )}
{total} Treffer
{filterOpen && (
)}
{/* Documents */}
{loading ? (
) : documents.length === 0 ? (

Keine Dokumente gefunden

) : viewMode === 'grid' ? (
{documents.map((doc) => { const fachLabel = FAECHER.find(f => f.id === doc.fach)?.label || doc.fach return (
setPreviewDoc(doc)} >
{doc.typ === 'erwartungshorizont' ? 'EWH' : 'Aufgabe'} {doc.jahr}

{fachLabel} {doc.niveau} - {doc.aufgaben_nummer}

{doc.dateiname}
) })}
) : ( {documents.map((doc) => { const fachLabel = FAECHER.find(f => f.id === doc.fach)?.label || doc.fach return ( ) })}
Dokument Fach Jahr Niveau Typ Aktion
{doc.dateiname}
{fachLabel} {doc.jahr} {doc.niveau} {doc.typ === 'erwartungshorizont' ? 'EWH' : 'Aufgabe'}
)} {/* Pagination */} {documents.length > 0 && (
Seite {page} von {totalPages}
)}
{/* Preview Modal */} {previewDoc && (

{previewDoc.dateiname}