fix: Sidebar — MagicHelp (TrOCR) + Bildung & Schule Kategorie entfernt

Diese Module gehoeren nur in den Admin Lehrer (macmini:3002),
nicht ins Compliance Dashboard. Entfernt: Education Search,
Zeugnisse-Crawler, Abitur-Archiv, Klausur-Korrektur, Magic Help.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-04 09:49:05 +01:00
parent 10e1bf45ae
commit 119689ee9e
12 changed files with 6 additions and 502 deletions

View File

@@ -66,16 +66,6 @@
@apply text-infrastructure-700;
}
.bg-category-education {
@apply bg-education-100;
}
.border-category-education {
@apply border-education-300;
}
.text-category-education {
@apply text-education-700;
}
.bg-category-communication {
@apply bg-communication-100;
}

View File

@@ -77,7 +77,6 @@ export default function RoleSelectPage() {
{cat === 'compliance' && 'DSGVO & Compliance'}
{cat === 'ai' && 'KI & Automatisierung'}
{cat === 'infrastructure' && 'Infrastruktur'}
{cat === 'education' && 'Bildung'}
{cat === 'communication' && 'Kommunikation'}
{cat === 'development' && 'Entwicklung'}
</span>

View File

@@ -56,7 +56,6 @@ const CATEGORY_CONFIG: Record<BackendModule['category'], { name: string; icon: s
compliance: { name: 'DSGVO & Compliance', icon: 'shield', color: 'purple' },
ai: { name: 'KI & Automatisierung', icon: 'brain', color: 'teal' },
infrastructure: { name: 'Infrastruktur & DevOps', icon: 'server', color: 'orange' },
education: { name: 'Bildung & Schule', icon: 'graduation', color: 'blue' },
communication: { name: 'Kommunikation & Alerts', icon: 'mail', color: 'green' },
development: { name: 'Entwicklung & Produkte', icon: 'code', color: 'slate' }
}

View File

@@ -463,7 +463,7 @@ export function DataFlowDiagram() {
fill="#94a3b8"
fontSize="11"
>
/compliance | /ai | /infrastructure | /education | /communication | /development
/compliance | /ai | /infrastructure | /communication | /development
</text>
</g>
</svg>

View File

@@ -39,24 +39,6 @@ function getMockData(): CompanionData {
suggestions: [
{
id: '1',
title: 'Klausuren korrigieren',
description: 'Deutsch LK - 12 unkorrigierte Arbeiten warten',
priority: 'urgent',
icon: 'ClipboardCheck',
actionTarget: '/ai/klausur-korrektur',
estimatedTime: 120,
},
{
id: '2',
title: 'Elternsprechtag vorbereiten',
description: 'Notenuebersicht fuer 8b erstellen',
priority: 'high',
icon: 'Users',
actionTarget: '/education/grades',
estimatedTime: 30,
},
{
id: '3',
title: 'Material hochladen',
description: 'Arbeitsblatt fuer naechste Woche bereitstellen',
priority: 'medium',
@@ -64,15 +46,6 @@ function getMockData(): CompanionData {
actionTarget: '/development/content',
estimatedTime: 15,
},
{
id: '4',
title: 'Lernstandserhebung planen',
description: 'Mathe 7a - Naechster Test in 2 Wochen',
priority: 'low',
icon: 'Calendar',
actionTarget: '/education/planning',
estimatedTime: 45,
},
],
upcomingEvents: [
{

View File

@@ -1,164 +0,0 @@
/**
* Extended TypeScript types for Abitur-Archiv
* Builds upon abitur-docs-types.ts with additional search and integration features
*/
import { AbiturDokument, AbiturDocsFilter } from './abitur-docs-types'
// Theme suggestion for autocomplete search
export interface ThemaSuggestion {
label: string // "Gedichtanalyse Romantik"
count: number // 12 Dokumente
aufgabentyp: string // "gedichtanalyse"
zeitraum?: string // "Romantik"
kategorie?: string // Category for grouping
}
// Extended filter with theme search
export interface AbiturArchivFilter extends AbiturDocsFilter {
thema?: string // Semantic theme search query
aufgabentyp?: string // Specific task type filter
}
// Similar document result from RAG
export interface SimilarDocument {
id: string
dateiname: string
similarity_score: number
fach: string
jahr: number
niveau: 'eA' | 'gA'
typ: 'aufgabe' | 'erwartungshorizont'
aufgaben_nummer: string
}
// Extended document with similar documents
export interface AbiturDokumentExtended extends AbiturDokument {
similar_documents?: SimilarDocument[]
themes?: string[] // Extracted themes from content
}
// Response for archive listing
export interface AbiturArchivResponse {
documents: AbiturDokumentExtended[]
total: number
page: number
limit: number
total_pages: number
themes?: ThemaSuggestion[] // Available themes for current filter
}
// Response for theme suggestions
export interface ThemaSuggestResponse {
suggestions: ThemaSuggestion[]
query: string
}
// Response for similar documents
export interface SimilarDocsResponse {
document_id: string
similar: SimilarDocument[]
}
// Klausur creation from archive
export interface KlausurFromArchivRequest {
archiv_dokument_id: string
aufgabentyp: string
title?: string
}
export interface KlausurFromArchivResponse {
klausur_id: string
eh_id?: string
success: boolean
message?: string
}
// View mode for document display
export type ViewMode = 'grid' | 'list'
// Sort options
export type SortField = 'jahr' | 'fach' | 'datum' | 'dateiname'
export type SortDirection = 'asc' | 'desc'
export interface SortConfig {
field: SortField
direction: SortDirection
}
// Predefined theme categories
export const THEME_CATEGORIES = {
textanalyse: {
label: 'Textanalyse',
subcategories: ['pragmatisch', 'literarisch', 'sachtext', 'rede', 'kommentar']
},
gedichtanalyse: {
label: 'Gedichtanalyse',
subcategories: ['romantik', 'expressionismus', 'barock', 'klassik', 'moderne']
},
dramenanalyse: {
label: 'Dramenanalyse',
subcategories: ['klassisch', 'modern', 'episches_theater']
},
prosaanalyse: {
label: 'Prosaanalyse',
subcategories: ['roman', 'kurzgeschichte', 'novelle', 'erzaehlung']
},
eroerterung: {
label: 'Eroerterung',
subcategories: ['textgebunden', 'materialgestuetzt', 'frei']
},
sprachreflexion: {
label: 'Sprachreflexion',
subcategories: ['sprachwandel', 'sprachkritik', 'kommunikation']
}
} as const
// Popular theme suggestions (static fallback)
export const POPULAR_THEMES: ThemaSuggestion[] = [
{ label: 'Textanalyse', count: 45, aufgabentyp: 'textanalyse_pragmatisch', kategorie: 'Analyse' },
{ label: 'Gedichtanalyse', count: 38, aufgabentyp: 'gedichtanalyse', kategorie: 'Analyse' },
{ label: 'Eroerterung', count: 32, aufgabentyp: 'eroerterung_textgebunden', kategorie: 'Argumentation' },
{ label: 'Dramenanalyse', count: 28, aufgabentyp: 'dramenanalyse', kategorie: 'Analyse' },
{ label: 'Prosaanalyse', count: 25, aufgabentyp: 'prosaanalyse', kategorie: 'Analyse' },
]
// Quick action types for document cards
export type QuickAction = 'preview' | 'download' | 'add_to_klausur' | 'view_similar'
// Fullscreen viewer state
export interface ViewerState {
isFullscreen: boolean
zoom: number
currentPage: number
totalPages: number
}
// Default viewer state
export const DEFAULT_VIEWER_STATE: ViewerState = {
isFullscreen: false,
zoom: 100,
currentPage: 1,
totalPages: 1
}
// Zoom levels
export const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 175, 200] as const
export const MIN_ZOOM = 25
export const MAX_ZOOM = 200
export const ZOOM_STEP = 25
// Helper functions
export function getThemeLabel(aufgabentyp: string): string {
const entries = Object.entries(THEME_CATEGORIES)
for (const [key, value] of entries) {
if (aufgabentyp.startsWith(key)) {
return value.label
}
}
return aufgabentyp
}
export function formatSimilarityScore(score: number): string {
return `${Math.round(score * 100)}%`
}

View File

@@ -1,84 +0,0 @@
/**
* TypeScript types for Abitur Documents (NiBiS, etc.)
*/
export interface AbiturDokument {
id: string
dateiname: string
original_dateiname: string
bundesland: string
fach: string
jahr: number
niveau: 'eA' | 'gA' // erhöhtes/grundlegendes Anforderungsniveau
typ: 'aufgabe' | 'erwartungshorizont'
aufgaben_nummer: string // I, II, III
status: 'pending' | 'indexed' | 'error'
confidence: number
file_path: string
file_size: number
indexed: boolean
vector_ids: string[]
created_at: string
updated_at: string
}
export interface AbiturDocsResponse {
documents: AbiturDokument[]
total: number
page: number
limit: number
total_pages: number
}
export interface AbiturDocsFilter {
fach?: string
jahr?: number
bundesland?: string
niveau?: 'eA' | 'gA'
typ?: 'aufgabe' | 'erwartungshorizont'
page?: number
limit?: number
}
// Available filter options
export const FAECHER = [
{ id: 'deutsch', label: 'Deutsch' },
{ id: 'mathematik', label: 'Mathematik' },
{ id: 'englisch', label: 'Englisch' },
{ id: 'biologie', label: 'Biologie' },
{ id: 'physik', label: 'Physik' },
{ id: 'chemie', label: 'Chemie' },
{ id: 'geschichte', label: 'Geschichte' },
] as const
export const JAHRE = [2025, 2024, 2023, 2022, 2021, 2020] as const
export const BUNDESLAENDER = [
{ id: 'niedersachsen', label: 'Niedersachsen' },
{ id: 'bayern', label: 'Bayern' },
{ id: 'nrw', label: 'Nordrhein-Westfalen' },
{ id: 'bw', label: 'Baden-Württemberg' },
] as const
export const NIVEAUS = [
{ id: 'eA', label: 'Erhöhtes Anforderungsniveau (eA)' },
{ id: 'gA', label: 'Grundlegendes Anforderungsniveau (gA)' },
] as const
export const TYPEN = [
{ id: 'aufgabe', label: 'Aufgabe' },
{ id: 'erwartungshorizont', label: 'Erwartungshorizont' },
] as const
// Helper functions
export function formatFileSize(bytes: number): string {
if (bytes < 1024) return bytes + ' B'
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'
return (bytes / (1024 * 1024)).toFixed(1) + ' MB'
}
export function formatDocumentTitle(doc: AbiturDokument): string {
const fachLabel = FAECHER.find(f => f.id === doc.fach)?.label || doc.fach
const typLabel = doc.typ === 'erwartungshorizont' ? 'EWH' : 'Aufgabe'
return `${fachLabel} ${doc.jahr} - ${doc.niveau} ${doc.aufgaben_nummer} (${typLabel})`
}

View File

@@ -12,7 +12,7 @@ export interface BackendModule {
id: string
name: string
description: string
category: 'compliance' | 'ai' | 'infrastructure' | 'education' | 'communication' | 'development'
category: 'compliance' | 'ai' | 'infrastructure' | 'communication' | 'development'
backend: {
service: string // e.g. 'consent-service', 'python-backend', 'klausur-service'
port: number
@@ -256,56 +256,6 @@ export const MODULE_REGISTRY: BackendModule[] = [
},
priority: 'medium'
},
{
id: 'magic-help',
name: 'Magic Help (TrOCR)',
description: 'Handschrifterkennung mit TrOCR und LoRA Fine-Tuning',
category: 'ai',
backend: {
service: 'klausur-service',
port: 8086,
basePath: '/api/klausur/trocr',
endpoints: [
{ path: '/status', method: 'GET', description: 'TrOCR Status' },
{ path: '/extract', method: 'POST', description: 'Text aus Bild extrahieren' },
{ path: '/training/examples', method: 'GET', description: 'Trainingsbeispiele' },
{ path: '/training/add', method: 'POST', description: 'Trainingsbeispiel hinzufuegen' },
{ path: '/training/fine-tune', method: 'POST', description: 'Fine-Tuning starten' },
]
},
frontend: {
adminV2Page: '/ai/magic-help',
oldAdminPage: '/admin/magic-help',
status: 'connected'
},
priority: 'medium',
notes: 'Lokale Handschrifterkennung mit Privacy-by-Design'
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
description: 'KI-gestuetzte Abitur-Korrektur mit EH-Vorschlaegen',
category: 'ai',
backend: {
service: 'klausur-service',
port: 8086,
basePath: '/api/v1',
endpoints: [
{ path: '/klausuren', method: 'GET', description: 'Alle Klausuren' },
{ path: '/klausuren', method: 'POST', description: 'Klausur erstellen' },
{ path: '/klausuren/{id}/students', method: 'GET', description: 'Studentenarbeiten' },
{ path: '/students/{id}/annotations', method: 'GET', description: 'Anmerkungen' },
{ path: '/students/{id}/gutachten/generate', method: 'POST', description: 'Gutachten generieren' },
]
},
frontend: {
adminV2Page: '/ai/klausur-korrektur',
oldAdminPage: '/admin/klausur-korrektur',
status: 'not-connected'
},
priority: 'high',
notes: 'Komplexes Modul mit eigenem Backend-Service'
},
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
@@ -464,31 +414,6 @@ export const MODULE_REGISTRY: BackendModule[] = [
priority: 'medium'
},
// ===========================================
// EDUCATION MODULES
// ===========================================
{
id: 'edu-search',
name: 'Bildungssuche',
description: 'Suche nach Bildungsinhalten und Ressourcen',
category: 'education',
backend: {
service: 'edu-search-service',
port: 8089,
basePath: '/api/edu',
endpoints: [
{ path: '/search', method: 'GET', description: 'Bildungssuche' },
{ path: '/resources', method: 'GET', description: 'Ressourcen' },
]
},
frontend: {
adminV2Page: '/education/edu-search',
oldAdminPage: '/admin/edu-search',
status: 'connected'
},
priority: 'medium'
},
// ===========================================
// COMMUNICATION MODULES
// ===========================================

View File

@@ -5,7 +5,7 @@
* All DSGVO and Compliance modules are now consolidated under the SDK.
*/
export type CategoryId = 'ai' | 'education' | 'website' | 'sdk-docs'
export type CategoryId = 'ai' | 'website' | 'sdk-docs'
export interface NavModule {
id: string
@@ -42,18 +42,8 @@ export const navigation: NavCategory[] = [
description: 'LLM, OCR, RAG & Machine Learning',
modules: [
// -----------------------------------------------------------------------
// KI-Daten-Pipeline: Magic Help -> OCR -> Indexierung -> Suche
// KI-Daten-Pipeline: OCR -> Indexierung -> Suche
// -----------------------------------------------------------------------
{
id: 'magic-help',
name: 'Magic Help (TrOCR)',
href: '/ai/magic-help',
description: 'TrOCR Testing & Fine-Tuning',
purpose: 'Testen und verbessern Sie die TrOCR-Handschrifterkennung. Laden Sie Bilder hoch, um die OCR-Qualitaet zu pruefen, und trainieren Sie das Modell mit LoRA Fine-Tuning. Bidirektionaler Austausch mit OCR-Labeling.',
audience: ['Entwickler', 'Administratoren', 'QA'],
oldAdminPath: '/admin/magic-help',
subgroup: 'KI-Daten-Pipeline',
},
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
@@ -141,54 +131,6 @@ export const navigation: NavCategory[] = [
],
},
// =========================================================================
// Bildung & Schule
// =========================================================================
{
id: 'education',
name: 'Bildung & Schule',
icon: 'graduation',
color: '#3b82f6', // Blue
colorClass: 'education',
description: 'Bildungsquellen & Lehrplaene',
modules: [
{
id: 'edu-search',
name: 'Education Search',
href: '/education/edu-search',
description: 'Bildungsquellen & Crawler',
purpose: 'Verwalten Sie Bildungsquellen und konfigurieren Sie Crawler fuer neue Inhalte.',
audience: ['Content Manager'],
oldAdminPath: '/admin/edu-search',
},
{
id: 'zeugnisse-crawler',
name: 'Zeugnisse-Crawler',
href: '/education/zeugnisse-crawler',
description: 'Zeugnis-Daten',
purpose: 'Verwalten Sie gecrawlte Zeugnis-Strukturen und -Formate.',
audience: ['Entwickler'],
oldAdminPath: '/admin/zeugnisse-crawler',
},
{
id: 'abitur-archiv',
name: 'Abitur-Archiv',
href: '/education/abitur-archiv',
description: 'Zentralabitur-Materialien 2021-2025',
purpose: 'Durchsuchen und filtern Sie Abitur-Aufgaben und Erwartungshorizonte. Themensuche mit semantischer Suche via RAG. Integration mit Klausur-Korrektur fuer schnelle Vorlagen-Nutzung.',
audience: ['Lehrer', 'Entwickler'],
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/education/klausur-korrektur',
description: 'Abitur-Korrektur mit KI',
purpose: 'KI-gestuetzte Korrektur von Abitur- und Vorabitur-Klausuren. Nutzt die RAG-Pipeline fuer Erwartungshorizont-Vorschlaege.',
audience: ['Lehrer', 'Entwickler'],
oldAdminPath: '/admin/klausur-korrektur',
},
],
},
// =========================================================================
// Website
// =========================================================================
{

View File

@@ -23,7 +23,7 @@ export const roles: Role[] = [
name: 'Entwickler',
description: 'Voller Zugriff auf alle Bereiche',
icon: 'code',
visibleCategories: ['ai', 'education', 'website'],
visibleCategories: ['ai', 'website'],
color: 'bg-primary-100 border-primary-300 text-primary-700',
},
{

View File

@@ -46,18 +46,6 @@ const config: Config = {
800: '#9a3412',
900: '#7c2d12',
},
education: {
50: '#eff6ff',
100: '#dbeafe',
200: '#bfdbfe',
300: '#93c5fd',
400: '#60a5fa',
500: '#3b82f6',
600: '#2563eb',
700: '#1d4ed8',
800: '#1e40af',
900: '#1e3a8a',
},
communication: {
50: '#f0fdf4',
100: '#dcfce7',

View File

@@ -80,16 +80,9 @@ export interface AIModuleLink {
/**
* KI-Daten-Pipeline Module
* Diese Module bilden eine zusammenhaengende Pipeline mit Datenfluss.
* Datenfluss: Magic Help ⟷ OCR-Labeling → RAG Pipeline → Daten & RAG
* Datenfluss: OCR-Labeling → RAG Pipeline → Daten & RAG
*/
export const AI_PIPELINE_MODULES: AIModuleLink[] = [
{
id: 'magic-help',
name: 'Magic Help',
href: '/ai/magic-help',
description: 'TrOCR Testing & LoRA Fine-Tuning',
icon: '✨',
},
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
@@ -149,39 +142,13 @@ export const AI_MODULES: AIModuleLink[] = [
*/
export const AI_MODULE_RELATIONS: Record<string, AIModuleLink[]> = {
// KI-Daten-Pipeline Relations
'magic-help': [
{
id: 'ocr-labeling',
name: 'OCR-Labeling',
href: '/ai/ocr-labeling',
description: 'Ground Truth erstellen',
},
{
id: 'rag-pipeline',
name: 'RAG Pipeline',
href: '/ai/rag-pipeline',
description: 'Erkannte Texte indexieren',
},
],
'ocr-labeling': [
{
id: 'magic-help',
name: 'Magic Help',
href: '/ai/magic-help',
description: 'TrOCR testen & fine-tunen',
},
{
id: 'rag-pipeline',
name: 'RAG Pipeline',
href: '/ai/rag-pipeline',
description: 'Trainierte Daten indexieren',
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/ai/klausur-korrektur',
description: 'OCR in Aktion',
},
],
'rag-pipeline': [
{
@@ -204,12 +171,6 @@ export const AI_MODULE_RELATIONS: Record<string, AIModuleLink[]> = {
href: '/ai/rag-pipeline',
description: 'Neue Dokumente indexieren',
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/ai/klausur-korrektur',
description: 'RAG-Suche nutzen',
},
],
// KI-Werkzeuge Relations (Standalone-Tools)
'llm-compare': [
@@ -233,12 +194,6 @@ export const AI_MODULE_RELATIONS: Record<string, AIModuleLink[]> = {
href: '/ai/llm-compare',
description: 'KI-Provider vergleichen',
},
{
id: 'klausur-korrektur',
name: 'Klausur-Korrektur',
href: '/ai/klausur-korrektur',
description: 'BQAS in Aktion',
},
],
}
@@ -259,24 +214,11 @@ export interface DataFlowConnection {
/**
* Definiert den Datenfluss zwischen den AI-Modulen
*
* Magic Help ⟷ OCR-Labeling: Bidirektionaler Austausch (LoRA + Ground Truth)
* OCR-Labeling → RAG Pipeline: Ground Truth für Training
* RAG Pipeline → Daten & RAG: Embeddings für Vektor-Suche
* Daten & RAG → Klausur-Korrektur: RAG-Suche für Bewertung
*/
export const DATA_FLOW_CONNECTIONS: DataFlowConnection[] = [
{
from: 'magic-help',
to: 'ocr-labeling',
label: 'LoRA Model',
description: 'Verbessertes TrOCR-Modell für OCR-Labeling',
},
{
from: 'ocr-labeling',
to: 'magic-help',
label: 'TrOCR Export',
description: 'Ground Truth Daten im TrOCR-Format für Fine-Tuning',
},
{
from: 'ocr-labeling',
to: 'rag-pipeline',
@@ -289,12 +231,6 @@ export const DATA_FLOW_CONNECTIONS: DataFlowConnection[] = [
label: 'Embeddings',
description: 'Vektor-Embeddings indexierter Dokumente',
},
{
from: 'rag',
to: 'klausur-korrektur',
label: 'RAG-Suche',
description: 'Semantische Suche für Erwartungshorizonte',
},
]
// =============================================================================