'use client' /** * Dokumente Tab for edu-search page * Shows filterable list of Abitur documents with pagination */ import { useState, useEffect } from 'react' import { FileText, Filter, ChevronLeft, ChevronRight, Eye, Download, Search, X, Loader2 } from 'lucide-react' import { AbiturDokument, AbiturDocsResponse, formatFileSize, formatDocumentTitle, FAECHER, JAHRE, BUNDESLAENDER, NIVEAUS, TYPEN, } from '@/lib/education/abitur-docs-types' import { PDFPreviewModal } from './PDFPreviewModal' interface DokumenteTabProps { onDocumentCountChange?: (count: number) => void } export function DokumenteTab({ onDocumentCountChange }: DokumenteTabProps) { 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 // 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('') // Modal const [selectedDocument, setSelectedDocument] = useState(null) // Fetch documents useEffect(() => { const fetchDocuments = 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) try { const response = await fetch(`/api/education/abitur-docs?${params.toString()}`) if (!response.ok) throw new Error('Fehler beim Laden der Dokumente') const data: AbiturDocsResponse = await response.json() setDocuments(data.documents || []) setTotalPages(data.total_pages || 1) setTotal(data.total || 0) onDocumentCountChange?.(data.total || 0) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setLoading(false) } } fetchDocuments() }, [page, filterFach, filterJahr, filterBundesland, filterNiveau, filterTyp, onDocumentCountChange]) const clearFilters = () => { setFilterFach('') setFilterJahr('') setFilterBundesland('') setFilterNiveau('') setFilterTyp('') setPage(1) } const hasActiveFilters = filterFach || filterJahr || filterBundesland || filterNiveau || filterTyp return (
{/* Filter Bar */}
{hasActiveFilters && ( )}
{/* Filter Dropdowns */} {filterOpen && (
{/* Fach */}
{/* Jahr */}
{/* Bundesland */}
{/* Niveau */}
{/* Typ */}
)}
{/* Document List */}
{loading ? (
) : error ? (

{error}

) : documents.length === 0 ? (

Keine Dokumente gefunden

{hasActiveFilters && ( )}
) : ( <> {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 */}
Zeige {(page - 1) * limit + 1}-{Math.min(page * limit, total)} von {total} Dokumenten
Seite {page} von {totalPages}
)}
{/* PDF Preview Modal */} setSelectedDocument(null)} />
) }