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:
81
backend/frontend/meetings_templates.py
Normal file
81
backend/frontend/meetings_templates.py
Normal 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>
|
||||
'''
|
||||
Reference in New Issue
Block a user