'use client' /** * Abitur-Archiv - Hauptseite * Zentralabitur-Materialien 2021-2025 mit erweiterter Themensuche */ import { useState, useEffect, useCallback } from 'react' import { FileText, Filter, ChevronLeft, ChevronRight, Eye, Download, Search, X, Loader2, Grid, List, LayoutGrid, BarChart3, Archive } from 'lucide-react' import type { AbiturDokument, AbiturDocsResponse } from '@/lib/education/abitur-docs-types' import { formatFileSize, FAECHER, JAHRE, BUNDESLAENDER, NIVEAUS, TYPEN, } from '@/lib/education/abitur-docs-types' import type { ViewMode, ThemaSuggestion } from '@/lib/education/abitur-archiv-types' import { ThemenSuche } from './components/ThemenSuche' import { DokumentCard } from './components/DokumentCard' import { FullscreenViewer } from './components/FullscreenViewer' export default function AbiturArchivPage() { // Documents state 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') // Filters const [filterOpen, setFilterOpen] = useState(false) const [filterFach, setFilterFach] = useState('') const [filterJahr, setFilterJahr] = useState('') const [filterBundesland, setFilterBundesland] = useState('') const [filterNiveau, setFilterNiveau] = useState('') const [filterTyp, setFilterTyp] = useState('') // Theme search const [searchQuery, setSearchQuery] = useState('') const [themes, setThemes] = useState([]) // Modal const [selectedDocument, setSelectedDocument] = useState(null) // Stats const [stats, setStats] = useState({ total: 0, indexed: 0, faecher: 0 }) // Fetch documents 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 (filterBundesland) params.set('bundesland', filterBundesland) if (filterNiveau) params.set('niveau', filterNiveau) if (filterTyp) params.set('typ', filterTyp) if (searchQuery) params.set('thema', searchQuery) try { const response = await fetch(`/api/education/abitur-archiv?${params.toString()}`) if (!response.ok) throw new Error('Fehler beim Laden der Dokumente') const data = await response.json() setDocuments(data.documents || []) setTotalPages(data.total_pages || 1) setTotal(data.total || 0) setThemes(data.themes || []) // Update stats const indexed = (data.documents || []).filter((d: AbiturDokument) => d.status === 'indexed').length const uniqueFaecher = new Set((data.documents || []).map((d: AbiturDokument) => d.fach)).size setStats({ total: data.total || 0, indexed, faecher: uniqueFaecher }) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setLoading(false) } }, [page, filterFach, filterJahr, filterBundesland, filterNiveau, filterTyp, searchQuery]) useEffect(() => { fetchDocuments() }, [fetchDocuments]) const clearFilters = () => { setFilterFach('') setFilterJahr('') setFilterBundesland('') setFilterNiveau('') setFilterTyp('') setSearchQuery('') setPage(1) } const handleSearch = (query: string) => { setSearchQuery(query) setPage(1) } const handleClearSearch = () => { setSearchQuery('') setPage(1) } const handleDownload = (doc: AbiturDokument) => { const link = window.document.createElement('a') link.href = doc.file_path link.download = doc.dateiname link.click() } const handleAddToKlausur = (doc: AbiturDokument) => { // Navigate to klausur-korrektur with document reference const params = new URLSearchParams() params.set('archiv_doc_id', doc.id) params.set('aufgabentyp', doc.typ === 'erwartungshorizont' ? 'vorlage' : 'aufgabe') window.location.href = `/education/klausur-korrektur?${params.toString()}` } const hasActiveFilters = filterFach || filterJahr || filterBundesland || filterNiveau || filterTyp || searchQuery return (
{/* Header */}

Abitur-Archiv

Zentralabitur-Materialien 2021-2025

{/* Stats */}
{stats.total}
Dokumente
{stats.indexed}
Indexiert
{stats.faecher}
Faecher
{/* Main Content */}
{/* Theme Search */}
{/* Filter Bar */}
{hasActiveFilters && ( )}
{/* Results count */} {total} Treffer {/* View Mode Toggle */}
{/* Filter Dropdowns */} {filterOpen && (
{/* Fach */}
{/* Jahr */}
{/* Bundesland */}
{/* Niveau */}
{/* Typ */}
)}
{/* Active Search Query Display */} {searchQuery && (
Suche: {searchQuery}
)} {/* Document Display */}
{loading ? (
) : error ? (

{error}

) : documents.length === 0 ? (

Keine Dokumente gefunden

{hasActiveFilters && ( )}
) : viewMode === 'grid' ? ( /* Grid View */
{documents.map((doc) => ( ))}
) : ( /* List View */ {documents.map((doc) => { const fachLabel = FAECHER.find(f => f.id === doc.fach)?.label || doc.fach return ( setSelectedDocument(doc)} > ) })}
Dokument Fach Jahr Niveau Typ Groesse Status Aktion
{doc.dateiname}
{fachLabel} {doc.jahr} {doc.niveau} {doc.typ === 'erwartungshorizont' ? 'EWH' : 'Aufgabe'} {formatFileSize(doc.file_size)} {doc.status === 'indexed' ? 'Indexiert' : doc.status === 'error' ? 'Fehler' : 'Ausstehend'}
e.stopPropagation()}>
)} {/* Pagination */} {documents.length > 0 && (
Zeige {(page - 1) * limit + 1}-{Math.min(page * limit, total)} von {total} Dokumenten
Seite {page} von {totalPages}
)}
{/* Fullscreen Viewer Modal */} setSelectedDocument(null)} onAddToKlausur={handleAddToKlausur} />
) }