This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Benjamin Admin 21a844cb8a fix: Restore all files lost during destructive rebase
A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.

This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).

Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:51:32 +01:00

741 lines
21 KiB
Python

"""
BreakPilot Studio - Hilfe & Dokumentation Modul
Benutzerfreundliche Anleitung fuer Lehrer mit Schritt-fuer-Schritt Erklaerungen.
"""
class HilfeModule:
"""Hilfe und Dokumentation fuer Lehrer."""
@staticmethod
def get_css() -> str:
"""CSS fuer das Hilfe-Modul."""
return """
/* =============================================
HILFE & DOKUMENTATION MODULE
============================================= */
/* Container */
.hilfe-container {
max-width: 100%;
min-height: 100%;
background: var(--bp-bg, #0f172a);
color: var(--bp-text, #e2e8f0);
}
/* Header */
.hilfe-header {
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
padding: 40px;
text-align: center;
position: relative;
}
.hilfe-header h1 {
color: white;
font-size: 28px;
font-weight: 700;
margin: 0 0 8px 0;
}
.hilfe-header p {
color: rgba(255, 255, 255, 0.85);
font-size: 16px;
margin: 0;
}
/* Navigation Tabs */
.hilfe-nav {
display: flex;
gap: 4px;
padding: 16px 24px;
background: var(--bp-surface, #1e293b);
border-bottom: 1px solid var(--bp-border, #334155);
flex-wrap: wrap;
}
.hilfe-nav-tab {
padding: 10px 20px;
background: transparent;
border: 1px solid var(--bp-border, #334155);
border-radius: 8px;
color: var(--bp-text-muted, #94a3b8);
cursor: pointer;
transition: all 0.2s;
font-size: 14px;
}
.hilfe-nav-tab:hover {
background: var(--bp-surface-elevated, #334155);
color: var(--bp-text, #e2e8f0);
}
.hilfe-nav-tab.active {
background: #3b82f6;
border-color: #3b82f6;
color: white;
}
/* Content */
.hilfe-content {
padding: 32px;
max-width: 900px;
margin: 0 auto;
width: 100%;
}
.hilfe-section {
display: none;
}
.hilfe-section.active {
display: block;
}
/* Cards */
.hilfe-card {
background: var(--bp-surface, #1e293b);
border: 1px solid var(--bp-border, #334155);
border-radius: 16px;
padding: 24px;
margin-bottom: 24px;
}
.hilfe-card h2 {
color: var(--bp-text, #e2e8f0);
font-size: 20px;
margin: 0 0 16px 0;
display: flex;
align-items: center;
gap: 12px;
}
.hilfe-card h3 {
color: var(--bp-text, #e2e8f0);
font-size: 16px;
margin: 24px 0 12px 0;
}
.hilfe-card p {
color: var(--bp-text-muted, #94a3b8);
font-size: 14px;
line-height: 1.7;
margin: 0 0 16px 0;
}
/* Step List */
.hilfe-steps {
list-style: none;
padding: 0;
margin: 0;
counter-reset: step;
}
.hilfe-step {
position: relative;
padding: 20px 20px 20px 70px;
background: var(--bp-surface-elevated);
border-radius: 12px;
margin-bottom: 12px;
counter-increment: step;
}
.hilfe-step::before {
content: counter(step);
position: absolute;
left: 20px;
top: 50%;
transform: translateY(-50%);
width: 36px;
height: 36px;
background: linear-gradient(135deg, #3b82f6, #1d4ed8);
color: white;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 14px;
}
.hilfe-step h4 {
color: var(--bp-text);
font-size: 15px;
margin: 0 0 6px 0;
}
.hilfe-step p {
color: var(--bp-text-muted);
font-size: 13px;
margin: 0;
line-height: 1.5;
}
/* Info Box */
.hilfe-info {
background: rgba(59, 130, 246, 0.1);
border: 1px solid rgba(59, 130, 246, 0.3);
border-radius: 12px;
padding: 16px 20px;
margin: 16px 0;
display: flex;
gap: 12px;
align-items: flex-start;
}
.hilfe-info-icon {
font-size: 20px;
flex-shrink: 0;
}
.hilfe-info-text {
color: var(--bp-text);
font-size: 14px;
line-height: 1.6;
}
.hilfe-info-text strong {
color: #3b82f6;
}
/* Warning Box */
.hilfe-warning {
background: rgba(245, 158, 11, 0.1);
border: 1px solid rgba(245, 158, 11, 0.3);
border-radius: 12px;
padding: 16px 20px;
margin: 16px 0;
display: flex;
gap: 12px;
align-items: flex-start;
}
.hilfe-warning-icon {
font-size: 20px;
flex-shrink: 0;
}
.hilfe-warning-text {
color: var(--bp-text);
font-size: 14px;
line-height: 1.6;
}
/* Success Box */
.hilfe-success {
background: rgba(34, 197, 94, 0.1);
border: 1px solid rgba(34, 197, 94, 0.3);
border-radius: 12px;
padding: 16px 20px;
margin: 16px 0;
display: flex;
gap: 12px;
align-items: flex-start;
}
.hilfe-success-icon {
font-size: 20px;
flex-shrink: 0;
}
.hilfe-success-text {
color: var(--bp-text);
font-size: 14px;
line-height: 1.6;
}
/* FAQ */
.hilfe-faq {
border: 1px solid var(--bp-border);
border-radius: 12px;
overflow: hidden;
margin-bottom: 12px;
}
.hilfe-faq-question {
padding: 16px 20px;
background: var(--bp-surface-elevated);
color: var(--bp-text);
font-size: 14px;
font-weight: 600;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
transition: background 0.2s;
}
.hilfe-faq-question:hover {
background: var(--bp-border);
}
.hilfe-faq-arrow {
transition: transform 0.3s;
}
.hilfe-faq.open .hilfe-faq-arrow {
transform: rotate(180deg);
}
.hilfe-faq-answer {
padding: 0 20px;
max-height: 0;
overflow: hidden;
transition: all 0.3s;
background: var(--bp-surface);
}
.hilfe-faq.open .hilfe-faq-answer {
padding: 16px 20px;
max-height: 500px;
}
.hilfe-faq-answer p {
margin: 0;
}
/* Keyboard Shortcuts */
.hilfe-shortcut {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid var(--bp-border);
}
.hilfe-shortcut:last-child {
border-bottom: none;
}
.hilfe-shortcut-keys {
display: flex;
gap: 4px;
}
.hilfe-shortcut-keys kbd {
background: var(--bp-surface-elevated);
border: 1px solid var(--bp-border);
border-radius: 6px;
padding: 4px 10px;
font-family: monospace;
font-size: 13px;
color: var(--bp-text);
}
.hilfe-shortcut-desc {
color: var(--bp-text-muted);
font-size: 14px;
}
/* Contact Card */
.hilfe-contact {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
margin-top: 24px;
}
@media (max-width: 600px) {
.hilfe-contact {
grid-template-columns: 1fr;
}
}
.hilfe-contact-card {
background: var(--bp-surface-elevated);
border-radius: 12px;
padding: 20px;
text-align: center;
}
.hilfe-contact-icon {
font-size: 32px;
margin-bottom: 12px;
}
.hilfe-contact-title {
color: var(--bp-text);
font-size: 16px;
font-weight: 600;
margin-bottom: 4px;
}
.hilfe-contact-info {
color: var(--bp-text-muted);
font-size: 14px;
}
"""
@staticmethod
def get_html() -> str:
"""HTML fuer das Hilfe-Modul."""
return """
<!-- Hilfe & Dokumentation Panel -->
<div class="panel panel-hilfe" id="panel-hilfe" style="display: none;">
<div class="hilfe-container">
<!-- Header -->
<div class="hilfe-header">
<h1>Hilfe & Dokumentation</h1>
<p>Schritt-fuer-Schritt Anleitungen fuer alle BreakPilot-Funktionen</p>
</div>
<!-- Navigation -->
<div class="hilfe-nav">
<button class="hilfe-nav-tab active" data-tab="start" onclick="showHilfeTab('start')">Schnellstart</button>
<button class="hilfe-nav-tab" data-tab="abitur" onclick="showHilfeTab('abitur')">Abiturkorrektur</button>
<button class="hilfe-nav-tab" data-tab="arbeitsblatt" onclick="showHilfeTab('arbeitsblatt')">Arbeitsblaetter</button>
<button class="hilfe-nav-tab" data-tab="tastatur" onclick="showHilfeTab('tastatur')">Tastenkuerzel</button>
<button class="hilfe-nav-tab" data-tab="faq" onclick="showHilfeTab('faq')">FAQ</button>
<button class="hilfe-nav-tab" data-tab="kontakt" onclick="showHilfeTab('kontakt')">Kontakt</button>
</div>
<!-- Content -->
<div class="hilfe-content">
<!-- Schnellstart Section -->
<div id="hilfe-start" class="hilfe-section active">
<div class="hilfe-card">
<h2>Willkommen bei BreakPilot</h2>
<p>BreakPilot ist Ihr digitaler Assistent fuer den Schulalltag. Mit KI-Unterstuetzung sparen Sie Zeit bei der Korrektur, Erstellung von Materialien und Kommunikation.</p>
<div class="hilfe-info">
<span class="hilfe-info-icon">💡</span>
<div class="hilfe-info-text">
<strong>Tipp:</strong> Druecken Sie <kbd>Ctrl+K</kbd> um schnell zwischen Modulen zu suchen.
</div>
</div>
<h3>Die wichtigsten Module</h3>
<ul class="hilfe-steps">
<li class="hilfe-step">
<h4>Abiturklausuren korrigieren</h4>
<p>KI-gestuetzte Korrektur nach dem 15-Punkte-System mit automatischer Gutachten-Generierung.</p>
</li>
<li class="hilfe-step">
<h4>Arbeitsblaetter erstellen</h4>
<p>Laden Sie PDFs hoch und erstellen Sie interaktive Lernmaterialien mit Mindmaps und Tests.</p>
</li>
<li class="hilfe-step">
<h4>Elternbriefe schreiben</h4>
<p>Rechtssichere Elternbriefe mit GFK-Analyse und Vorlagen.</p>
</li>
<li class="hilfe-step">
<h4>Klassen verwalten</h4>
<p>Schueler, Noten und Klassenbuch an einem Ort.</p>
</li>
</ul>
<div class="hilfe-success">
<span class="hilfe-success-icon">🔒</span>
<div class="hilfe-success-text">
<strong>Datenschutz:</strong> Alle Daten bleiben auf dem Schulserver. Keine Cloud-Speicherung, keine Weitergabe an Dritte.
</div>
</div>
</div>
</div>
<!-- Abiturkorrektur Section -->
<div id="hilfe-abitur" class="hilfe-section">
<div class="hilfe-card">
<h2>Abiturklausuren korrigieren</h2>
<p>Die KI-gestuetzte Abiturkorrektur hilft Ihnen, bis zu 80% Zeit bei der Erstkorrektur zu sparen.</p>
<h3>So starten Sie</h3>
<ul class="hilfe-steps">
<li class="hilfe-step">
<h4>Klicken Sie auf "Abiturklausuren" im Dashboard</h4>
<p>Oder nutzen Sie die Sidebar und waehlen "Klausurkorrektur" unter Leistungsbewertung.</p>
</li>
<li class="hilfe-step">
<h4>Waehlen Sie eine Einstiegsoption</h4>
<p><strong>Schnellstart:</strong> Laden Sie Arbeiten direkt hoch - ideal fuer sofortiges Loslegen.<br>
<strong>Neue Klausur:</strong> Erstellen Sie eine Klausur mit allen Metadaten fuer vollstaendige Verwaltung.</p>
</li>
<li class="hilfe-step">
<h4>Laden Sie die eingescannten Arbeiten hoch</h4>
<p>Unterstuetzte Formate: PDF, JPG, PNG. Drag & Drop oder Dateiauswahl moeglich.</p>
</li>
<li class="hilfe-step">
<h4>Optional: Erwartungshorizont bereitstellen</h4>
<p>Waehlen Sie einen Aufgabentyp und beschreiben Sie die Aufgabenstellung. Die KI nutzt dies fuer bessere Bewertungsvorschlaege.</p>
</li>
<li class="hilfe-step">
<h4>Korrigieren Sie die Arbeiten</h4>
<p>Im 2/3-1/3 Layout: Links das Dokument mit Zoom, rechts die Bewertungskriterien.</p>
</li>
<li class="hilfe-step">
<h4>Setzen Sie Anmerkungen</h4>
<p>Klicken Sie auf das Dokument um Fehler zu markieren:<br>
<strong>RS (rot):</strong> Rechtschreibfehler<br>
<strong>Gram (blau):</strong> Grammatikfehler<br>
<strong>Inhalt (gruen):</strong> Inhaltliche Anmerkungen</p>
</li>
<li class="hilfe-step">
<h4>Bewerten Sie die 5 Kriterien</h4>
<p>Rechtschreibung (15%), Grammatik (15%), Inhalt (40%), Struktur (15%), Stil (15%)</p>
</li>
<li class="hilfe-step">
<h4>Generieren Sie das Gutachten</h4>
<p>Klicken Sie "Gutachten generieren" fuer einen KI-Vorschlag. Sie koennen es frei bearbeiten.</p>
</li>
</ul>
<div class="hilfe-info">
<span class="hilfe-info-icon">📊</span>
<div class="hilfe-info-text">
<strong>Fairness-Analyse:</strong> Nach mehreren Korrekturen koennen Sie die Fairness-Analyse nutzen, um Ausreisser zu identifizieren und die Konsistenz Ihrer Bewertungen zu pruefen.
</div>
</div>
<h3>PDF-Export</h3>
<p>Exportieren Sie Ihre Ergebnisse als PDF:</p>
<ul style="color: var(--bp-text-muted); line-height: 1.8; padding-left: 20px;">
<li><strong>Einzelgutachten:</strong> PDF fuer einen Schueler</li>
<li><strong>Alle Gutachten:</strong> Gesamtes PDF fuer alle Arbeiten</li>
<li><strong>Notenuebersicht:</strong> Uebersicht aller Noten</li>
<li><strong>Anmerkungen:</strong> Alle Annotationen als PDF</li>
</ul>
<div class="hilfe-warning">
<span class="hilfe-warning-icon">⚠️</span>
<div class="hilfe-warning-text">
<strong>Wichtig:</strong> Der KI-Vorschlag ist nur ein Startpunkt. Pruefen und passen Sie alle Bewertungen und Gutachten nach Ihrem fachlichen Urteil an.
</div>
</div>
</div>
</div>
<!-- Arbeitsblaetter Section -->
<div id="hilfe-arbeitsblatt" class="hilfe-section">
<div class="hilfe-card">
<h2>Arbeitsblaetter erstellen</h2>
<p>Erstellen Sie interaktive Lernmaterialien aus Ihren vorhandenen PDFs.</p>
<h3>Schritt-fuer-Schritt</h3>
<ul class="hilfe-steps">
<li class="hilfe-step">
<h4>Oeffnen Sie "Arbeitsblaetter" im Dashboard</h4>
<p>Oder ueber die Sidebar unter "Studio".</p>
</li>
<li class="hilfe-step">
<h4>Laden Sie ein PDF hoch</h4>
<p>Ziehen Sie die Datei in den Upload-Bereich oder klicken Sie zum Auswaehlen.</p>
</li>
<li class="hilfe-step">
<h4>Waehlen Sie Generierungsoptionen</h4>
<p>Mindmap, Multiple-Choice-Test, Lueckentext oder Zusammenfassung.</p>
</li>
<li class="hilfe-step">
<h4>Bearbeiten Sie das Ergebnis</h4>
<p>Passen Sie die generierten Inhalte nach Bedarf an.</p>
</li>
<li class="hilfe-step">
<h4>Exportieren oder teilen</h4>
<p>Speichern Sie als PDF oder teilen Sie direkt mit Schuelern.</p>
</li>
</ul>
<div class="hilfe-success">
<span class="hilfe-success-icon">✨</span>
<div class="hilfe-success-text">
Die KI analysiert den Text und erstellt passende Lernmaterialien. Sie behalten die volle Kontrolle ueber alle Inhalte.
</div>
</div>
</div>
</div>
<!-- Tastenkuerzel Section -->
<div id="hilfe-tastatur" class="hilfe-section">
<div class="hilfe-card">
<h2>Tastenkuerzel</h2>
<p>Arbeiten Sie schneller mit diesen Tastenkuerzeln.</p>
<h3>Navigation</h3>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>Ctrl</kbd><kbd>K</kbd></div>
<div class="hilfe-shortcut-desc">Schnellsuche oeffnen</div>
</div>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>Esc</kbd></div>
<div class="hilfe-shortcut-desc">Suche schliessen / Abbrechen</div>
</div>
<h3>Im Korrektur-Modus</h3>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>+</kbd></div>
<div class="hilfe-shortcut-desc">Hineinzoomen</div>
</div>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>-</kbd></div>
<div class="hilfe-shortcut-desc">Herauszoomen</div>
</div>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>←</kbd></div>
<div class="hilfe-shortcut-desc">Vorherige Arbeit</div>
</div>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>→</kbd></div>
<div class="hilfe-shortcut-desc">Naechste Arbeit</div>
</div>
<div class="hilfe-shortcut">
<div class="hilfe-shortcut-keys"><kbd>Ctrl</kbd><kbd>S</kbd></div>
<div class="hilfe-shortcut-desc">Speichern</div>
</div>
</div>
</div>
<!-- FAQ Section -->
<div id="hilfe-faq" class="hilfe-section">
<div class="hilfe-card">
<h2>Haeufige Fragen</h2>
<div class="hilfe-faq" onclick="toggleFaq(this)">
<div class="hilfe-faq-question">
Kann ich eine Korrektur unterbrechen und spaeter fortsetzen?
<span class="hilfe-faq-arrow">▼</span>
</div>
<div class="hilfe-faq-answer">
<p>Ja, alle Aenderungen werden automatisch gespeichert. Sie koennen jederzeit unterbrechen und spaeter an derselben Stelle weitermachen.</p>
</div>
</div>
<div class="hilfe-faq" onclick="toggleFaq(this)">
<div class="hilfe-faq-question">
Was passiert mit meinen Daten?
<span class="hilfe-faq-arrow">▼</span>
</div>
<div class="hilfe-faq-answer">
<p>Alle Daten werden lokal auf dem Schulserver gespeichert. Es gibt keine Cloud-Speicherung und keine Weitergabe an Dritte. Die KI-Verarbeitung erfolgt auf unserer eigenen Infrastruktur.</p>
</div>
</div>
<div class="hilfe-faq" onclick="toggleFaq(this)">
<div class="hilfe-faq-question">
Kann ich den KI-Vorschlag komplett ueberschreiben?
<span class="hilfe-faq-arrow">▼</span>
</div>
<div class="hilfe-faq-answer">
<p>Ja, das Gutachten ist frei editierbar. Der KI-Vorschlag ist nur ein Startpunkt. Sie haben die volle Kontrolle ueber alle Inhalte.</p>
</div>
</div>
<div class="hilfe-faq" onclick="toggleFaq(this)">
<div class="hilfe-faq-question">
Wie funktioniert die Handschrift-Erkennung?
<span class="hilfe-faq-arrow">▼</span>
</div>
<div class="hilfe-faq-answer">
<p>Das System erkennt Handschrift automatisch mit einer speziellen KI. Bei schlechter Lesbarkeit koennen Sie den erkannten Text manuell korrigieren.</p>
</div>
</div>
<div class="hilfe-faq" onclick="toggleFaq(this)">
<div class="hilfe-faq-question">
Werden Schuelernamen an die KI gesendet?
<span class="hilfe-faq-arrow">▼</span>
</div>
<div class="hilfe-faq-answer">
<p>Nein! Die Klausurkorrektur verwendet Pseudonymisierung. Schuelernamen bleiben immer lokal in Ihrem Browser. Nur anonymisierte Tokens werden zur Verarbeitung gesendet.</p>
</div>
</div>
<div class="hilfe-faq" onclick="toggleFaq(this)">
<div class="hilfe-faq-question">
Wie funktioniert die Zweitkorrektur?
<span class="hilfe-faq-arrow">▼</span>
</div>
<div class="hilfe-faq-answer">
<p>Nach Abschluss der Erstkorrektur kann ein Zweitkorrektor zugewiesen werden. Bei einer Differenz von 3 Punkten ist eine Einigung erforderlich, bei 4+ Punkten wird automatisch eine Drittkorrektur ausgeloest.</p>
</div>
</div>
</div>
</div>
<!-- Kontakt Section -->
<div id="hilfe-kontakt" class="hilfe-section">
<div class="hilfe-card">
<h2>Hilfe & Support</h2>
<p>Bei Fragen oder Problemen stehen Ihnen folgende Ansprechpartner zur Verfuegung.</p>
<div class="hilfe-contact">
<div class="hilfe-contact-card">
<div class="hilfe-contact-icon">👨‍💼</div>
<div class="hilfe-contact-title">Schuladministrator</div>
<div class="hilfe-contact-info">Erster Ansprechpartner fuer technische Fragen</div>
</div>
<div class="hilfe-contact-card">
<div class="hilfe-contact-icon">📧</div>
<div class="hilfe-contact-title">E-Mail Support</div>
<div class="hilfe-contact-info">support@breakpilot.de</div>
</div>
</div>
<div class="hilfe-info" style="margin-top: 24px;">
<span class="hilfe-info-icon">📚</span>
<div class="hilfe-info-text">
<strong>Weitere Ressourcen:</strong> Nutzen Sie die einzelnen Modul-Anleitungen in der Sidebar oder schauen Sie in das System-Info Modul fuer technische Details.
</div>
</div>
</div>
</div>
</div>
</div><!-- /hilfe-container -->
</div>
"""
@staticmethod
def get_js() -> str:
"""JavaScript fuer das Hilfe-Modul."""
return """
// =============================================
// HILFE & DOKUMENTATION MODULE
// =============================================
let hilfeInitialized = false;
function loadHilfeModule() {
if (hilfeInitialized) {
console.log('Hilfe module already initialized');
return;
}
console.log('Initializing Hilfe Module...');
hilfeInitialized = true;
console.log('Hilfe Module initialized');
}
function showHilfeTab(tabName) {
// Update tabs
document.querySelectorAll('.hilfe-nav-tab').forEach(tab => {
tab.classList.toggle('active', tab.dataset.tab === tabName);
});
// Update sections
document.querySelectorAll('.hilfe-section').forEach(section => {
section.classList.remove('active');
});
const targetSection = document.getElementById('hilfe-' + tabName);
if (targetSection) {
targetSection.classList.add('active');
}
}
function toggleFaq(element) {
element.classList.toggle('open');
}
// Show panel function
function showHilfePanel() {
hideAllPanels();
const panel = document.getElementById('panel-hilfe');
if (panel) {
panel.classList.add('active');
loadHilfeModule();
}
}
"""