backend-lehrer (10 files): - game/database.py (785 → 5), correction_api.py (683 → 4) - classroom_engine/antizipation.py (676 → 5) - llm_gateway schools/edu_search already done in prior batch klausur-service (12 files): - orientation_crop_api.py (694 → 5), pdf_export.py (677 → 4) - zeugnis_crawler.py (676 → 5), grid_editor_api.py (671 → 5) - eh_templates.py (658 → 5), mail/api.py (651 → 5) - qdrant_service.py (638 → 5), training_api.py (625 → 4) website (6 pages): - middleware (696 → 8), mail (733 → 6), consent (628 → 8) - compliance/risks (622 → 5), export (502 → 5), brandbook (629 → 7) studio-v2 (3 components): - B2BMigrationWizard (848 → 3), CleanupPanel (765 → 2) - dashboard-experimental (739 → 2) admin-lehrer (4 files): - uebersetzungen (769 → 4), manager (670 → 2) - ChunkBrowserQA (675 → 6), dsfa/page (674 → 5) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
84 lines
3.4 KiB
TypeScript
84 lines
3.4 KiB
TypeScript
'use client'
|
|
|
|
import type { Document, Tab } from './types'
|
|
|
|
interface DocumentsTabProps {
|
|
documents: Document[]
|
|
loading: boolean
|
|
setSelectedDocument: (id: string) => void
|
|
setActiveTab: (tab: Tab) => void
|
|
}
|
|
|
|
export default function DocumentsTab({ documents, loading, setSelectedDocument, setActiveTab }: DocumentsTabProps) {
|
|
return (
|
|
<div className="p-6">
|
|
<div className="flex items-center justify-between mb-6">
|
|
<h2 className="text-lg font-semibold text-slate-900">Dokumente verwalten</h2>
|
|
<button className="px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors text-sm font-medium">
|
|
+ Neues Dokument
|
|
</button>
|
|
</div>
|
|
|
|
{loading ? (
|
|
<div className="text-center py-12 text-slate-500">Lade Dokumente...</div>
|
|
) : documents.length === 0 ? (
|
|
<div className="text-center py-12 text-slate-500">
|
|
Keine Dokumente vorhanden
|
|
</div>
|
|
) : (
|
|
<div className="overflow-x-auto">
|
|
<table className="w-full">
|
|
<thead>
|
|
<tr className="border-b border-slate-200">
|
|
<th className="text-left py-3 px-4 text-sm font-medium text-slate-500">Typ</th>
|
|
<th className="text-left py-3 px-4 text-sm font-medium text-slate-500">Name</th>
|
|
<th className="text-left py-3 px-4 text-sm font-medium text-slate-500">Beschreibung</th>
|
|
<th className="text-left py-3 px-4 text-sm font-medium text-slate-500">Pflicht</th>
|
|
<th className="text-left py-3 px-4 text-sm font-medium text-slate-500">Erstellt</th>
|
|
<th className="text-right py-3 px-4 text-sm font-medium text-slate-500">Aktionen</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{documents.map((doc) => (
|
|
<tr key={doc.id} className="border-b border-slate-100 hover:bg-slate-50">
|
|
<td className="py-3 px-4">
|
|
<span className="px-2 py-1 bg-slate-100 text-slate-700 rounded text-xs font-medium">
|
|
{doc.type}
|
|
</span>
|
|
</td>
|
|
<td className="py-3 px-4 font-medium text-slate-900">{doc.name}</td>
|
|
<td className="py-3 px-4 text-slate-600 text-sm">{doc.description}</td>
|
|
<td className="py-3 px-4">
|
|
{doc.mandatory ? (
|
|
<span className="text-green-600">Ja</span>
|
|
) : (
|
|
<span className="text-slate-400">Nein</span>
|
|
)}
|
|
</td>
|
|
<td className="py-3 px-4 text-sm text-slate-500">
|
|
{new Date(doc.created_at).toLocaleDateString('de-DE')}
|
|
</td>
|
|
<td className="py-3 px-4 text-right">
|
|
<button
|
|
onClick={() => {
|
|
setSelectedDocument(doc.id)
|
|
setActiveTab('versions')
|
|
}}
|
|
className="text-primary-600 hover:text-primary-700 text-sm font-medium mr-3"
|
|
>
|
|
Versionen
|
|
</button>
|
|
<button className="text-slate-500 hover:text-slate-700 text-sm">
|
|
Bearbeiten
|
|
</button>
|
|
</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|