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>
This commit is contained in:
Benjamin Admin
2026-02-09 09:51:32 +01:00
parent f7487ee240
commit bfdaf63ba9
2009 changed files with 749983 additions and 1731 deletions

View File

@@ -0,0 +1,81 @@
"""
Meetings Module - Template Functions.
Enthält:
- render_sidebar: Navigation für Meeting-Seiten
- render_base_page: Basis-Template für alle Meeting-Seiten
"""
from .meetings_styles import BREAKPILOT_STYLES, ICONS
def render_sidebar(active_page: str = "dashboard") -> str:
"""Render the meetings sidebar navigation"""
nav_items = [
{"id": "dashboard", "label": "Dashboard", "icon": "home", "href": "/meetings"},
{"id": "active", "label": "Aktive Meetings", "icon": "video", "href": "/meetings/active"},
{"id": "schedule", "label": "Termine", "icon": "calendar", "href": "/meetings/schedule"},
{"id": "trainings", "label": "Schulungen", "icon": "graduation", "href": "/meetings/trainings"},
{"id": "recordings", "label": "Aufzeichnungen", "icon": "record", "href": "/meetings/recordings"},
{"id": "breakout", "label": "Breakout-Rooms", "icon": "grid", "href": "/meetings/breakout"},
]
nav_html = ""
for item in nav_items:
active_class = "active" if item["id"] == active_page else ""
nav_html += f'''
<a href="{item['href']}" class="nav-item {active_class}">
{ICONS[item['icon']]}
<span>{item['label']}</span>
</a>
'''
return f'''
<aside class="sidebar">
<div class="logo">
<div class="logo-icon">BP</div>
<span class="logo-text">BreakPilot Meet</span>
</div>
<nav class="nav-section">
<div class="nav-section-title">Navigation</div>
{nav_html}
</nav>
<nav class="nav-section" style="margin-top: auto;">
<div class="nav-section-title">Links</div>
<a href="/studio" class="nav-item">
{ICONS['external']}
<span>Zurück zum Studio</span>
</a>
<a href="/school" class="nav-item">
{ICONS['users']}
<span>Schulverwaltung</span>
</a>
</nav>
</aside>
'''
def render_base_page(title: str, content: str, active_page: str = "dashboard") -> str:
"""Render the base page template"""
return f'''
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>BreakPilot Meet {title}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>{BREAKPILOT_STYLES}</style>
</head>
<body>
<div class="app-container">
{render_sidebar(active_page)}
<main class="main-content">
{content}
</main>
</div>
</body>
</html>
'''