alle new
This commit is contained in:
erik committed 2026-10-01 06:46:51 +02:00
1 parent da64472251
commit 5b20adee48
1605 files changed
+396517 -1674

No files matched your search

+40 -28
View File
@@ -4,48 +4,57 @@
// Einstiegsmodul der Hauptseite: wird als letztes Skript ausschließlich von
// Test.html geladen und startet direkt beim Laden den Initialisierungsablauf
// (automatische Ausführung unten in der Datei, nur wenn ein 'board'-Element
// existiert – auf project-plan.html fehlt es). Es stellt renderAll(),
// existiert). Es stellt renderAll(),
// initUiState() und syncRangeDisplay() bereit und nutzt loadUiState()/
// loadTheme()/loadHeaderState() aus js/ui.js, switchDepartment() aus
// js/store.js, showTab() aus js/tabs-auth.js sowie die Render-Funktionen
// renderBoard()/renderLoad()/renderProjects()/renderPeople() aus js/board/board.js,
// js/load/load.js, js/projects/projects.js, js/people/people.js.
// loadTheme()/loadHeaderState()/loadSidebarCollapseState() aus js/ui.js, load() aus js/store.js,
// showTab()/TAB_PANELS aus js/tabs-auth.js sowie die Render-Funktionen
// renderBoard()/renderWochenbericht()/renderLoad()/renderProjects()/renderPeople()
// aus js/board/board.js, js/wochenbericht/wochenbericht.js, js/load/load.js,
// js/projects/projects.js, js/people/people.js.
// renderAll: Convenience um UI-Elemente zu initialisieren
function renderAll(){
refreshWeekSelect();
updateWeekDate();
renderBoard();
const activeTab = document.querySelector('.tab.active')?.dataset.tab || currentTab;
if(activeTab === 'load') renderLoad();
else if(activeTab === 'projects') renderProjects();
if(activeTab === 'wochenbericht') renderWochenbericht();
else if(activeTab === 'load') renderLoad();
else if(activeTab === 'people') renderPeople();
else if(activeTab === 'dashboard') renderDashboard();
else if(activeTab === 'settings') renderSettings();
else if(activeTab === 'admin') renderAdminArea();
// Der Projektbereich rendert nicht hier, sondern in showTab('plan') —
// load() ruft direkt im Anschluss showTab(currentTab) auf, und erst dort
// ist der Bereich sichtbar (das GANTT braucht die Containerbreite).
}
// initUiState: stellt beim Start den UI-Zustand her (LocalStorage-UI-State,
// Theme, Header-Status), setzt Titel und aktive Abteilungs-Schaltfläche und
// zeigt den ersten Tab an. Eine Deep-Link-URL (z. B. "/HLS/Auslastung") aus
// applyUrlRoute() übersteuert dabei Abteilung und Tab; passwortgeschützte Tabs
// öffnen das Passwort-Modal (showTab ohne skipAuth). Kein Rückgabewert.
// Theme, Header-Status), setzt den Seitentitel und zeigt den ersten Tab an.
// Eine Deep-Link-URL (z. B. "/Auslastung") aus applyUrlRoute() übersteuert
// dabei den Tab. Kein Rückgabewert.
function initUiState(){
loadUiState();
const route = applyUrlRoute();
if(route && DEPARTMENTS[route.department]){
currentDepartment = route.department;
if(route){
currentTab = route.tab;
// Deep-Link auf den Projektbereich ("/Projektplan/<Name>?weekLabel=…"):
// Ziel merken, damit showTab('plan') es rendern kann. Beim ersten Aufruf
// ist db.weeks noch leer — load() ruft showTab(currentTab) erneut auf,
// sobald die Sitzungen da sind. Ein Sandbox-Plan der Planung trägt statt
// projNr ein planId (siehe updateRouteUrl(), js/ui.js) — PlanApp.sandboxPlanId
// wird deshalb nach setPlanTarget() gesetzt, das es sonst zurücksetzt.
if(route.tab === 'plan'){
setPlanTarget(route.weekLabel, route.projNr, route.projName);
if(route.weekLabel === SANDBOX_WEEK_LABEL) window.PlanApp.sandboxPlanId = route.planId || '';
}
}
loadTheme();
loadHeaderState();
document.querySelectorAll('.dept-tab').forEach(btn => {
btn.classList.toggle('active', btn.dataset.dept === currentDepartment);
});
const info = DEPARTMENTS[currentDepartment];
document.title = 'Projektübersicht ' + info.label;
loadSidebarCollapseState();
document.title = 'Projektübersicht';
const titleEl = document.getElementById('pageTitle');
if(titleEl) titleEl.textContent = info.icon + ' Projektübersicht ' + info.label;
if(titleEl) titleEl.textContent = 'Projektübersicht';
const tab = ['board','load','projects','people'].includes(currentTab) ? currentTab : DEFAULT_TAB;
// Geschützte Tabs ('projects'/'people') verlangen hier ihr Passwort.
const tab = TAB_PANELS.includes(currentTab) ? currentTab : DEFAULT_TAB;
showTab(tab);
}
@@ -64,10 +73,13 @@ function syncRangeDisplay(displayId, startId, endId){
disp.value = from ? (from + ' – ' + to) : '';
}
// Automatische Initialisierung nur auf der Hauptseite (Projektboard).
// Andere Seiten (z.B. Projektplan) laden diese Module nicht oder nur als
// Hilfsfunktionen und haben ihre eigene Seitenlogik (js/plan/*).
// Automatische Initialisierung der Hauptseite — seit Projektbereich und
// Benutzerverwaltung eigene Bereiche sind, ist sie die einzige Seite. Der eigentliche
// Start läuft erst nach erfolgreicher Anmeldung (checkAuthAndInit(), js/auth.js) —
// ohne gültige Session zeigt das Login-Overlay und blockiert die App.
if(document.getElementById('board')){
initUiState();
switchDepartment(currentDepartment);
checkAuthAndInit(() => {
initUiState();
load();
});
}