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>
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
"""
|
||
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>
|
||
'''
|