Termin aus Mail, Rollen & Rechte, Abwesenheiten, Glas-Darstellung und Pi-Betrieb

- Termin aus Mail: Mailtext oder .eml per Drag & Drop/Strg+V auf Terminplan
  oder Aufgaben, KI schlägt Aufgaben vor, Prüfung im Aufgaben-Panel; neues
  Notizfeld je Aufgabe (plan_todos.notiz)
- Terminplan: Meilensteine ohne Aufgabenbezug je in eigener Zeile,
  "+ Neu"-Menü klappt neben schmaler Seitenleiste nach rechts, Leistungsphasen
- Rollen & Rechte, Abwesenheiten-Seite, Benachrichtigungen, Rundgang
- Glas-Darstellung, Logo als Favicon
- Pi-Betrieb: PDF-Arbeit im Kindprozess, Wächter, Einrichtungs- und
  Prüfskript inkl. WLAN-Wächter

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
erikandClaude Opus 5.5 committed 2026-10-29 14:16:52 +01:00
1 parent f4fb3c550b
commit b7e0bd0d92
56 files changed
+12265 -2974

No files matched your search

+10 -7
View File
@@ -23,15 +23,17 @@
// Bereich wie jeder andere: Menüband und Seitenleiste bleiben stehen, der
// Wechsel dorthin läuft über denselben showTab()-Weg wie der Wechsel vom
// Dashboard ins Projektboard.
const TAB_PANELS = ['board','wochenbericht','load','people','planung','planchecker','dashboard','wand','settings','admin','plan'];
const TAB_PANELS = ['board','wochenbericht','load','abwesenheit','people','planung','planchecker','dashboard','wand','settings','admin','plan'];
function showTab(t){
// Der Bereich „Admin" steht nur Administratoren offen. Ohne diese Weiche
// zeigte ein weitergereichter Deep-Link „/Admin" einem Mitglied eine leere
// Seite — die Karten darin rendert renderAdminArea() für Nicht-Admins gar
// nicht erst. (Ein UI-Gate, mehr nicht: Die Routen dahinter sind
// serverseitig mit requireRole('admin') abgesichert.)
if(t === 'admin' && !(currentUser && currentUser.role === 'admin')) t = DEFAULT_TAB;
// Weichen nach Rollen & Rechte (UI-Gate, die Routen dahinter prüft der
// Server mit requireRecht()): „Admin“ nur mit einem Admin-Recht, die
// Wandtafel nur mit „Wandtafel anzeigen“, und eine Rolle ohne „Anwendung
// nutzen“ (früher das Kiosk-Konto) landet immer auf der Wandtafel.
if(currentUser && !hatRecht('app') && hatRecht('wand')) t = 'wand';
if(t === 'admin' && !hatAdminRecht()) t = DEFAULT_TAB;
if(t === 'abwesenheit' && currentUser && !darfIrgendeineAbwesenheit()) t = DEFAULT_TAB;
if(t === 'wand' && currentUser && !hatRecht('wand')) t = DEFAULT_TAB;
if(t !== currentTab) previousTab = currentTab;
currentTab = t;
saveUiState();
@@ -58,6 +60,7 @@ function showTab(t){
if(t==='board' && currentWeek()) renderBoard();
if(t==='wochenbericht') renderWochenbericht();
if(t==='load') renderLoad();
if(t==='abwesenheit'){ abwBeimOeffnen(); renderAbwesenheiten(); }
if(t==='people') renderPeople();
if(t==='planung') renderPlanung();
if(t==='planchecker') renderPlanChecker();