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
breakpilot-pwa/backend/frontend/modules/system_info.py
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

967 lines
28 KiB
Python

"""
BreakPilot Studio - System Info Module
Zeigt System-Informationen und Dokumentation an, analog zu den Admin-Seiten
im Next.js Frontend.
"""
class SystemInfoModule:
"""System-Info Modul fuer BreakPilot Studio."""
@staticmethod
def get_css() -> str:
"""CSS fuer das System-Info Panel."""
return """
/* ==========================================
SYSTEM INFO MODULE
========================================== */
#panel-system-info {
display: none;
flex-direction: column;
padding: 24px;
min-height: calc(100vh - 104px);
}
#panel-system-info.active {
display: flex;
}
.system-info-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 24px;
}
.system-info-title {
font-size: 24px;
font-weight: 700;
color: var(--bp-text);
margin-bottom: 4px;
}
.system-info-subtitle {
font-size: 14px;
color: var(--bp-text-muted);
}
.system-info-version {
padding: 6px 12px;
background: var(--bp-accent-soft);
color: var(--bp-accent);
border-radius: 999px;
font-size: 12px;
font-weight: 600;
}
/* Privacy Notes */
.privacy-notes {
background: rgba(59, 130, 246, 0.1);
border: 1px solid rgba(59, 130, 246, 0.3);
border-radius: 12px;
padding: 16px;
margin-bottom: 24px;
}
.privacy-notes-title {
font-size: 14px;
font-weight: 600;
color: #3b82f6;
margin-bottom: 8px;
}
.privacy-notes-list {
list-style: none;
}
.privacy-notes-list li {
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 13px;
color: #60a5fa;
margin-bottom: 4px;
}
.privacy-notes-list li::before {
content: "";
color: #3b82f6;
flex-shrink: 0;
}
/* Tabs */
.system-info-tabs {
display: flex;
gap: 16px;
border-bottom: 1px solid var(--bp-border);
margin-bottom: 24px;
}
.system-info-tab {
padding: 12px 4px;
font-size: 14px;
font-weight: 500;
color: var(--bp-text-muted);
cursor: pointer;
border-bottom: 2px solid transparent;
transition: all 0.2s;
background: none;
border-top: none;
border-left: none;
border-right: none;
}
.system-info-tab:hover {
color: var(--bp-text);
}
.system-info-tab.active {
color: var(--bp-primary);
border-bottom-color: var(--bp-primary);
}
/* Tab Content */
.system-info-content {
flex: 1;
min-height: 400px;
}
.tab-pane {
display: none;
}
.tab-pane.active {
display: block;
}
/* Features Section */
.features-grid {
display: flex;
flex-direction: column;
gap: 12px;
}
.feature-card {
background: var(--bp-surface-elevated);
border: 1px solid var(--bp-border);
border-radius: 8px;
padding: 16px;
}
.feature-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.feature-name {
font-size: 15px;
font-weight: 600;
color: var(--bp-text);
}
.feature-status {
padding: 2px 8px;
border-radius: 999px;
font-size: 11px;
font-weight: 500;
}
.feature-status.active {
background: rgba(34, 197, 94, 0.15);
color: #22c55e;
}
.feature-status.planned {
background: rgba(245, 158, 11, 0.15);
color: #f59e0b;
}
.feature-status.disabled {
background: rgba(100, 116, 139, 0.15);
color: #64748b;
}
.feature-description {
font-size: 13px;
color: var(--bp-text-muted);
}
/* Architecture Section */
.architecture-diagram {
background: var(--bp-surface-elevated);
border: 1px solid var(--bp-border);
border-radius: 12px;
padding: 24px;
}
.architecture-layer {
margin-bottom: 16px;
padding: 16px;
border-radius: 8px;
border: 2px solid;
text-align: center;
}
.architecture-layer-title {
font-size: 13px;
font-weight: 600;
margin-bottom: 8px;
}
.architecture-components {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: center;
}
.architecture-component {
padding: 4px 12px;
border-radius: 4px;
font-size: 12px;
font-weight: 500;
}
.architecture-arrow {
text-align: center;
color: var(--bp-text-muted);
font-size: 20px;
margin: 8px 0;
}
/* Roadmap Section */
.roadmap-phases {
display: flex;
flex-direction: column;
gap: 16px;
}
.roadmap-phase {
background: var(--bp-surface-elevated);
border: 1px solid var(--bp-border);
border-radius: 8px;
padding: 16px;
}
.roadmap-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.roadmap-title {
font-size: 15px;
font-weight: 600;
color: var(--bp-text);
}
.roadmap-priority {
padding: 2px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
}
.roadmap-priority.high {
background: rgba(239, 68, 68, 0.15);
color: #ef4444;
}
.roadmap-priority.medium {
background: rgba(245, 158, 11, 0.15);
color: #f59e0b;
}
.roadmap-priority.low {
background: rgba(59, 130, 246, 0.15);
color: #3b82f6;
}
.roadmap-items {
list-style: none;
}
.roadmap-items li {
font-size: 13px;
color: var(--bp-text-muted);
padding: 4px 0;
padding-left: 16px;
position: relative;
}
.roadmap-items li::before {
content: "";
position: absolute;
left: 0;
color: var(--bp-text-muted);
}
/* Technical Table */
.technical-table {
width: 100%;
border-collapse: collapse;
background: var(--bp-surface-elevated);
border-radius: 8px;
overflow: hidden;
}
.technical-table th,
.technical-table td {
padding: 12px 16px;
text-align: left;
font-size: 13px;
border-bottom: 1px solid var(--bp-border);
}
.technical-table th {
background: var(--bp-surface);
font-weight: 600;
color: var(--bp-text-muted);
text-transform: uppercase;
font-size: 11px;
}
.technical-table td {
color: var(--bp-text);
}
.technical-table tr:last-child td {
border-bottom: none;
}
/* Audit Section */
.audit-sections {
display: flex;
flex-direction: column;
gap: 16px;
}
.audit-section {
background: var(--bp-surface-elevated);
border: 1px solid var(--bp-border);
border-radius: 8px;
padding: 16px;
}
.audit-section-title {
font-size: 15px;
font-weight: 600;
color: var(--bp-text);
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.audit-section-title::before {
content: "";
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
background: var(--bp-primary);
color: white;
border-radius: 50%;
font-size: 12px;
}
.audit-items {
display: flex;
flex-direction: column;
gap: 8px;
}
.audit-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid var(--bp-border-subtle);
}
.audit-item:last-child {
border-bottom: none;
}
.audit-item-label {
font-size: 13px;
color: var(--bp-text-muted);
}
.audit-item-value {
font-size: 13px;
font-weight: 500;
padding: 2px 8px;
border-radius: 4px;
}
.audit-item-value.ok {
background: rgba(34, 197, 94, 0.15);
color: #22c55e;
}
.audit-item-value.warning {
background: rgba(245, 158, 11, 0.15);
color: #f59e0b;
}
.audit-item-value.critical {
background: rgba(239, 68, 68, 0.15);
color: #ef4444;
}
/* Documentation Section */
.documentation-container {
background: var(--bp-bg);
color: var(--bp-text);
padding: 24px;
border-radius: 12px;
overflow: auto;
max-height: 600px;
}
.documentation-container h2 {
font-size: 20px;
margin: 24px 0 12px 0;
color: var(--bp-text);
}
.documentation-container h2:first-child {
margin-top: 0;
}
.documentation-container h3 {
font-size: 16px;
margin: 20px 0 8px 0;
color: var(--bp-text);
}
.documentation-container p {
font-size: 14px;
line-height: 1.6;
margin-bottom: 12px;
color: var(--bp-text-muted);
}
.documentation-container pre {
background: var(--bp-surface);
padding: 16px;
border-radius: 8px;
overflow-x: auto;
font-size: 12px;
font-family: 'Monaco', 'Menlo', monospace;
margin: 12px 0;
color: var(--bp-text);
}
.documentation-container ul,
.documentation-container ol {
margin: 12px 0;
padding-left: 24px;
}
.documentation-container li {
font-size: 14px;
margin-bottom: 4px;
color: var(--bp-text-muted);
}
.documentation-container table {
width: 100%;
border-collapse: collapse;
margin: 12px 0;
}
.documentation-container th,
.documentation-container td {
padding: 8px 12px;
border: 1px solid var(--bp-border);
text-align: left;
font-size: 13px;
}
.documentation-container th {
background: var(--bp-surface);
}
/* Export Buttons */
.export-buttons {
display: flex;
justify-content: flex-end;
gap: 12px;
margin-top: 16px;
}
"""
@staticmethod
def get_html() -> str:
"""HTML fuer das System-Info Panel."""
return """
<!-- SYSTEM INFO PANEL -->
<div id="panel-system-info" class="module-panel">
<!-- Header -->
<div class="system-info-header">
<div>
<h1 class="system-info-title">BreakPilot Studio - System Info</h1>
<p class="system-info-subtitle">Plattform-Dokumentation und technische Details</p>
</div>
<span class="system-info-version">Version 2.0</span>
</div>
<!-- Privacy Notes -->
<div class="privacy-notes">
<h3 class="privacy-notes-title">Datenschutz-Hinweise</h3>
<ul class="privacy-notes-list">
<li>Alle Daten werden DSGVO-konform verarbeitet</li>
<li>Verschluesselte Datenuebertragung (TLS 1.3)</li>
<li>Daten werden in deutschen Rechenzentren gehostet</li>
<li>Regelmaessige Sicherheitsaudits</li>
</ul>
</div>
<!-- Tabs -->
<div class="system-info-tabs">
<button class="system-info-tab active" data-tab="overview">Uebersicht</button>
<button class="system-info-tab" data-tab="architecture">Architektur</button>
<button class="system-info-tab" data-tab="roadmap">Roadmap</button>
<button class="system-info-tab" data-tab="technical">Technisch</button>
<button class="system-info-tab" data-tab="audit">Audit</button>
<button class="system-info-tab" data-tab="documentation">Dokumentation</button>
</div>
<!-- Tab Content -->
<div class="system-info-content">
<!-- Overview Tab -->
<div id="tab-overview" class="tab-pane active">
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Features</h3>
<div class="features-grid">
<div class="feature-card">
<div class="feature-header">
<span class="feature-name">Arbeitsblaetter-Generator</span>
<span class="feature-status active">Aktiv</span>
</div>
<p class="feature-description">KI-gestuetzte Erstellung von Arbeitsblaettern und Lernmaterialien</p>
</div>
<div class="feature-card">
<div class="feature-header">
<span class="feature-name">Klausurkorrektur</span>
<span class="feature-status active">Aktiv</span>
</div>
<p class="feature-description">Automatische Klausurkorrektur mit OCR und KI-Bewertung</p>
</div>
<div class="feature-card">
<div class="feature-header">
<span class="feature-name">Elternkommunikation</span>
<span class="feature-status active">Aktiv</span>
</div>
<p class="feature-description">Rechtssichere Elternbriefe und Benachrichtigungen</p>
</div>
<div class="feature-card">
<div class="feature-header">
<span class="feature-name">Videokonferenzen</span>
<span class="feature-status active">Aktiv</span>
</div>
<p class="feature-description">Integrierte Jitsi-Videokonferenzen fuer Elterngespraeche</p>
</div>
<div class="feature-card">
<div class="feature-header">
<span class="feature-name">Messenger</span>
<span class="feature-status active">Aktiv</span>
</div>
<p class="feature-description">Sichere Matrix-basierte Kommunikation</p>
</div>
<div class="feature-card">
<div class="feature-header">
<span class="feature-name">Unified Inbox</span>
<span class="feature-status planned">Geplant</span>
</div>
<p class="feature-description">Zentrale E-Mail-Verwaltung mit KI-Unterstuetzung</p>
</div>
</div>
</div>
<!-- Architecture Tab -->
<div id="tab-architecture" class="tab-pane">
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">System-Architektur</h3>
<div class="architecture-diagram">
<div class="architecture-layer" style="border-color: #3b82f6; background: rgba(59, 130, 246, 0.1);">
<div class="architecture-layer-title" style="color: #3b82f6;">Frontend (Next.js / Python)</div>
<div class="architecture-components">
<span class="architecture-component" style="background: rgba(59, 130, 246, 0.2); color: #3b82f6;">Admin Dashboard</span>
<span class="architecture-component" style="background: rgba(59, 130, 246, 0.2); color: #3b82f6;">Studio UI</span>
<span class="architecture-component" style="background: rgba(59, 130, 246, 0.2); color: #3b82f6;">API Routes</span>
</div>
</div>
<div class="architecture-arrow">↓</div>
<div class="architecture-layer" style="border-color: #8b5cf6; background: rgba(139, 92, 246, 0.1);">
<div class="architecture-layer-title" style="color: #8b5cf6;">Backend Services</div>
<div class="architecture-components">
<span class="architecture-component" style="background: rgba(139, 92, 246, 0.2); color: #8b5cf6;">FastAPI Backend</span>
<span class="architecture-component" style="background: rgba(139, 92, 246, 0.2); color: #8b5cf6;">Consent Service (Go)</span>
<span class="architecture-component" style="background: rgba(139, 92, 246, 0.2); color: #8b5cf6;">Klausur Service</span>
</div>
</div>
<div class="architecture-arrow">↓</div>
<div class="architecture-layer" style="border-color: #10b981; background: rgba(16, 185, 129, 0.1);">
<div class="architecture-layer-title" style="color: #10b981;">KI & Processing</div>
<div class="architecture-components">
<span class="architecture-component" style="background: rgba(16, 185, 129, 0.2); color: #10b981;">OpenAI GPT-4o</span>
<span class="architecture-component" style="background: rgba(16, 185, 129, 0.2); color: #10b981;">Claude 3.5</span>
<span class="architecture-component" style="background: rgba(16, 185, 129, 0.2); color: #10b981;">vast.ai GPU</span>
</div>
</div>
<div class="architecture-arrow">↓</div>
<div class="architecture-layer" style="border-color: #f59e0b; background: rgba(245, 158, 11, 0.1);">
<div class="architecture-layer-title" style="color: #f59e0b;">Datenbanken</div>
<div class="architecture-components">
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">PostgreSQL</span>
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">Qdrant</span>
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">Valkey</span>
<span class="architecture-component" style="background: rgba(245, 158, 11, 0.2); color: #f59e0b;">MinIO</span>
</div>
</div>
</div>
</div>
<!-- Roadmap Tab -->
<div id="tab-roadmap" class="tab-pane">
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Optimierungs-Roadmap</h3>
<div class="roadmap-phases">
<div class="roadmap-phase">
<div class="roadmap-header">
<span class="roadmap-title">Phase 1: KI-Erweiterung</span>
<span class="roadmap-priority high">High</span>
</div>
<ul class="roadmap-items">
<li>Multi-Provider LLM-Unterstuetzung</li>
<li>Lokale Modelle mit Ollama</li>
<li>RAG-Verbesserungen</li>
<li>Automatische Qualitaetspruefung</li>
</ul>
</div>
<div class="roadmap-phase">
<div class="roadmap-header">
<span class="roadmap-title">Phase 2: Collaboration</span>
<span class="roadmap-priority medium">Medium</span>
</div>
<ul class="roadmap-items">
<li>Echtzeit-Zusammenarbeit</li>
<li>Kommentar-System</li>
<li>Versionskontrolle</li>
<li>Team-Workspaces</li>
</ul>
</div>
<div class="roadmap-phase">
<div class="roadmap-header">
<span class="roadmap-title">Phase 3: Analytics</span>
<span class="roadmap-priority low">Low</span>
</div>
<ul class="roadmap-items">
<li>Nutzungsstatistiken</li>
<li>Lernfortschritt-Tracking</li>
<li>KI-Insights</li>
<li>Reporting-Dashboard</li>
</ul>
</div>
</div>
</div>
<!-- Technical Tab -->
<div id="tab-technical" class="tab-pane">
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Technische Details</h3>
<table class="technical-table">
<thead>
<tr>
<th>Komponente</th>
<th>Technologie</th>
<th>Version</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td>Backend</td>
<td style="font-family: monospace;">FastAPI</td>
<td>0.109+</td>
<td>Python Async API</td>
</tr>
<tr>
<td>Consent Service</td>
<td style="font-family: monospace;">Go + Gin</td>
<td>1.21+</td>
<td>DSGVO-Consent-Verwaltung</td>
</tr>
<tr>
<td>Database</td>
<td style="font-family: monospace;">PostgreSQL</td>
<td>16</td>
<td>Relationale Daten</td>
</tr>
<tr>
<td>Vector DB</td>
<td style="font-family: monospace;">Qdrant</td>
<td>1.12+</td>
<td>RAG & Semantic Search</td>
</tr>
<tr>
<td>Cache</td>
<td style="font-family: monospace;">Valkey</td>
<td>8.x</td>
<td>Redis-kompatibel</td>
</tr>
<tr>
<td>Storage</td>
<td style="font-family: monospace;">MinIO</td>
<td>Latest</td>
<td>S3-kompatibel</td>
</tr>
<tr>
<td>KI</td>
<td style="font-family: monospace;">OpenAI / Anthropic</td>
<td>GPT-4o / Claude 3.5</td>
<td>LLM Provider</td>
</tr>
</tbody>
</table>
</div>
<!-- Audit Tab -->
<div id="tab-audit" class="tab-pane">
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Audit-relevante Informationen</h3>
<div class="audit-sections">
<div class="audit-section">
<h4 class="audit-section-title">DSGVO-Compliance</h4>
<div class="audit-items">
<div class="audit-item">
<span class="audit-item-label">Art. 7 Einwilligung</span>
<span class="audit-item-value ok">Implementiert</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Art. 13/14 Informationspflichten</span>
<span class="audit-item-value ok">Implementiert</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Art. 17 Recht auf Loeschung</span>
<span class="audit-item-value ok">Implementiert</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Art. 20 Datenportabilitaet</span>
<span class="audit-item-value ok">Implementiert</span>
</div>
</div>
</div>
<div class="audit-section">
<h4 class="audit-section-title">Technische Sicherheit</h4>
<div class="audit-items">
<div class="audit-item">
<span class="audit-item-label">Verschluesselung</span>
<span class="audit-item-value ok">AES-256 at rest</span>
</div>
<div class="audit-item">
<span class="audit-item-label">TLS</span>
<span class="audit-item-value ok">1.3</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Audit-Log</span>
<span class="audit-item-value ok">Lueckenlos</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Backup</span>
<span class="audit-item-value ok">Taeglich, 30 Tage</span>
</div>
</div>
</div>
<div class="audit-section">
<h4 class="audit-section-title">Betrieb</h4>
<div class="audit-items">
<div class="audit-item">
<span class="audit-item-label">Hosting</span>
<span class="audit-item-value ok">Deutschland (Hetzner)</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Uptime SLA</span>
<span class="audit-item-value ok">> 99.9%</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Monitoring</span>
<span class="audit-item-value ok">24/7</span>
</div>
<div class="audit-item">
<span class="audit-item-label">Penetration Tests</span>
<span class="audit-item-value warning">Quartalsweise</span>
</div>
</div>
</div>
</div>
</div>
<!-- Documentation Tab -->
<div id="tab-documentation" class="tab-pane">
<h3 style="font-size: 12px; text-transform: uppercase; color: var(--bp-text-muted); margin-bottom: 16px;">Vollstaendige Dokumentation</h3>
<div class="documentation-container">
<h2>BreakPilot Studio - Plattformdokumentation</h2>
<h3>1. Uebersicht</h3>
<p>BreakPilot Studio ist eine umfassende Plattform fuer Lehrkraefte zur Erstellung von Lernmaterialien, Klausurkorrektur und Elternkommunikation. Die Plattform nutzt modernste KI-Technologie fuer automatisierte Workflows.</p>
<h3>2. Module</h3>
<table>
<tr><th>Modul</th><th>Beschreibung</th><th>Status</th></tr>
<tr><td>Arbeitsblaetter</td><td>KI-gestuetzte Erstellung von Lernmaterialien</td><td>Aktiv</td></tr>
<tr><td>Klausurkorrektur</td><td>Automatische Korrektur mit Feedback</td><td>Aktiv</td></tr>
<tr><td>Elternbriefe</td><td>Rechtssichere Kommunikation</td><td>Aktiv</td></tr>
<tr><td>Videokonferenz</td><td>Integrierte Jitsi-Meetings</td><td>Aktiv</td></tr>
<tr><td>Messenger</td><td>Matrix-basierte Kommunikation</td><td>Aktiv</td></tr>
<tr><td>Content Creator</td><td>Interaktive Lerneinheiten</td><td>Aktiv</td></tr>
</table>
<h3>3. API-Dokumentation</h3>
<p>Die API ist unter <code>/docs</code> (Swagger) und <code>/redoc</code> (ReDoc) dokumentiert.</p>
<pre>
# Beispiel: Arbeitsblatt generieren
POST /api/worksheets/generate
{
"topic": "Quadratische Funktionen",
"grade": 10,
"difficulty": "medium"
}
</pre>
<h3>4. Sicherheit</h3>
<ul>
<li>JWT-basierte Authentifizierung</li>
<li>Role-Based Access Control (RBAC)</li>
<li>Verschluesselte Datenspeicherung</li>
<li>Regelmaessige Security-Audits</li>
</ul>
<h3>5. Datenschutz</h3>
<p>Alle personenbezogenen Daten werden DSGVO-konform verarbeitet. Details finden sich in der Datenschutzerklaerung.</p>
<h3>6. Support</h3>
<p>Bei Fragen oder Problemen wenden Sie sich an den Support unter support@breakpilot.de</p>
</div>
<div class="export-buttons">
<button class="btn btn-ghost" onclick="exportSystemInfoJSON()">JSON Export</button>
<button class="btn btn-primary" onclick="printSystemInfo()">Drucken / PDF</button>
</div>
</div>
</div>
</div>
"""
@staticmethod
def get_js() -> str:
"""JavaScript fuer das System-Info Panel."""
return """
// ==========================================
// SYSTEM INFO MODULE
// ==========================================
console.log('System Info Module loaded');
// Tab-Wechsel
document.querySelectorAll('.system-info-tab').forEach(tab => {
tab.addEventListener('click', function() {
const tabId = this.dataset.tab;
// Alle Tabs deaktivieren
document.querySelectorAll('.system-info-tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.tab-pane').forEach(p => p.classList.remove('active'));
// Ausgewaehlten Tab aktivieren
this.classList.add('active');
document.getElementById('tab-' + tabId).classList.add('active');
});
});
// JSON Export
function exportSystemInfoJSON() {
const data = {
title: 'BreakPilot Studio System-Info',
version: '2.0',
exported_at: new Date().toISOString(),
features: [
{ name: 'Arbeitsblaetter-Generator', status: 'active' },
{ name: 'Klausurkorrektur', status: 'active' },
{ name: 'Elternkommunikation', status: 'active' },
{ name: 'Videokonferenzen', status: 'active' },
{ name: 'Messenger', status: 'active' },
{ name: 'Unified Inbox', status: 'planned' }
],
technical: [
{ component: 'Backend', technology: 'FastAPI', version: '0.109+' },
{ component: 'Consent Service', technology: 'Go + Gin', version: '1.21+' },
{ component: 'Database', technology: 'PostgreSQL', version: '16' },
{ component: 'Vector DB', technology: 'Qdrant', version: '1.12+' },
{ component: 'Cache', technology: 'Valkey', version: '8.x' }
]
};
const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'breakpilot-system-info.json';
a.click();
URL.revokeObjectURL(url);
}
// Print/PDF
function printSystemInfo() {
const printWindow = window.open('', '_blank');
if (printWindow) {
const docContent = document.querySelector('.documentation-container')?.innerHTML || '';
printWindow.document.write(`
<!DOCTYPE html>
<html>
<head>
<title>BreakPilot Studio - System-Info</title>
<style>
body { font-family: system-ui, sans-serif; padding: 40px; max-width: 800px; margin: 0 auto; }
h1, h2, h3 { color: #1e293b; }
pre { background: #f1f5f9; padding: 12px; border-radius: 6px; overflow-x: auto; }
code { background: #f1f5f9; padding: 2px 6px; border-radius: 4px; }
table { border-collapse: collapse; width: 100%; margin: 16px 0; }
th, td { border: 1px solid #e2e8f0; padding: 8px 12px; text-align: left; }
th { background: #f8fafc; }
</style>
</head>
<body>
<h1>BreakPilot Studio - System-Info</h1>
<p><em>Exportiert am: ${new Date().toLocaleString('de-DE')}</em></p>
<hr>
${docContent}
</body>
</html>
`);
printWindow.document.close();
printWindow.print();
}
}
// Show System Info Panel
function showSystemInfoPanel() {
console.log('Showing System Info Panel');
}
// Load function for module loader
function loadSystemInfoModule() {
console.log('System Info Module initialized');
showSystemInfoPanel();
}
// Expose globally
window.loadSystemInfoModule = loadSystemInfoModule;
window.exportSystemInfoJSON = exportSystemInfoJSON;
window.printSystemInfo = printSystemInfo;
"""