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

+33 -79
View File
@@ -3,12 +3,11 @@
// -----------------------------
// Präsentationsmodus für die Hauptseite (nur von Test.html geladen, nach
// js/gantt.js, vor js/tabs-auth.js). Er durchläuft automatisch die in
// SHOW_MODE_SEQUENCE hinterlegten Abteilungs-/Ansichts-Kombinationen (Board
// und Auslastung) und zeigt sie in einem Vollbild-Overlay. Genutzt werden
// showTab() aus js/tabs-auth.js, switchDepartment() aus js/store.js,
// setHeaderCollapsed() aus js/ui.js sowie renderBoard()/renderLoad() aus
// js/board/board.js/js/load/load.js. Der gesamte Lauf-Zustand liegt in den
// Modulvariablen am Dateikopf.
// SHOW_MODE_SEQUENCE hinterlegten Ansichten (Board und Auslastung) und zeigt
// sie in einem Vollbild-Overlay. Genutzt werden showTab() aus
// js/tabs-auth.js, setHeaderCollapsed() aus js/ui.js sowie renderBoard()/
// renderLoad() aus js/board/board.js/js/load/load.js. Der gesamte Lauf-
// Zustand liegt in den Modulvariablen am Dateikopf.
// showModeActive: true, solange der Show Mode läuft
let showModeActive = false;
@@ -18,22 +17,15 @@ let showModeTimer = null;
let showModeResumeTimer = null;
// showModePaused: true, wenn der Durchlauf gerade pausiert ist
let showModePaused = false;
// showModePollTimer: Timer-Handle des Poll-Intervalls in waitForLoadThenRender
// (wird in stopShowMode mit aufgeräumt, sonst rendert es nach dem Beenden weiter)
let showModePollTimer = null;
// showModeOriginal: Abteilung und Tab vor dem Start, wird beim Beenden wiederhergestellt
let showModeOriginal = { department: DEFAULT_DEPARTMENT, tab: DEFAULT_TAB };
// showModeOriginal: Tab vor dem Start, wird beim Beenden wiederhergestellt
let showModeOriginal = { tab: DEFAULT_TAB };
const SHOW_MODE_SLIDE_DURATION = 10000; // 10 Sekunden pro Slide
const SHOW_MODE_PAUSE_DURATION = 60000; // 1 Minute Pause
// SHOW_MODE_SEQUENCE: Reihenfolge der Slides (Abteilung + Ansicht), die
// zyklisch durchlaufen wird
// SHOW_MODE_SEQUENCE: Reihenfolge der Slides (Ansicht), die zyklisch
// durchlaufen wird
const SHOW_MODE_SEQUENCE = [
{ dept: 'ELT', view: 'board' },
{ dept: 'ELT', view: 'load' },
{ dept: 'HLS', view: 'board' },
{ dept: 'HLS', view: 'load' },
{ dept: 'ARCH', view: 'board' },
{ dept: 'ARCH', view: 'load' }
{ view: 'board' },
{ view: 'load' }
];
// showModeIndex: Position innerhalb der SHOW_MODE_SEQUENCE
let showModeIndex = 0;
@@ -45,7 +37,7 @@ function startShowMode(){
if(showModeActive) return;
showModeActive = true;
showModePaused = false;
showModeOriginal = { department: currentDepartment, tab: currentTab };
showModeOriginal = { tab: currentTab };
showModeIndex = 0;
const overlay = document.getElementById('showModeOverlay');
@@ -58,28 +50,29 @@ function startShowMode(){
}
// stopShowMode: beendet den Präsentationsmodus: stoppt alle Timer, verbirgt
// das Overlay und stellt Abteilung und Tab des ursprünglichen Zustands wieder
// her (renderAll danach). Kein Rückgabewert.
// das Overlay und stellt den Tab des ursprünglichen Zustands wieder her
// (renderAll danach). Kein Rückgabewert.
function stopShowMode(){
showModeActive = false;
showModePaused = false;
clearTimeout(showModeTimer);
clearTimeout(showModeResumeTimer);
if(showModePollTimer){ clearInterval(showModePollTimer); showModePollTimer = null; }
const overlay = document.getElementById('showModeOverlay');
if(overlay) overlay.style.display = 'none';
// Ursprünglichen Zustand wiederherstellen. Geschützte Tabs ('projects'/
// 'people') werden nur ohne Passwort angezeigt, wenn bereits authentifiziert –
// sonst öffnet showTab (ohne skipAuth) das Passwort-Modal.
// Inhalt leeren: Die Kopie enthält dieselben Element-IDs wie das echte Board
// bzw. der Auslastungs-Tab (#boardTable, #loadGrid, #loadScope) und steht im
// Dokument VOR ihnen. Blieb sie stehen, trafen renderBoard()/renderLoad()
// ab dann die tote Kopie im ausgeblendeten Overlay — die sichtbare Ansicht
// fror auf dem Stand vor der Präsentation ein, bis die Seite neu geladen wurde.
const content = document.getElementById('showModeContent');
if(content) content.innerHTML = '';
// Ursprünglichen Zustand wiederherstellen.
currentTab = showModeOriginal.tab;
if(currentDepartment !== showModeOriginal.department){
switchDepartment(showModeOriginal.department);
} else {
showTab(currentTab, isAuthenticated);
renderAll();
}
showTab(currentTab);
renderAll();
}
// pauseShowMode: pausiert den Durchlauf (Anzeige "Pausiert") und startet die
@@ -114,8 +107,7 @@ function resumeShowMode(){
}
// showModeNextSlide: stellt die nächste Folie der SHOW_MODE_SEQUENCE dar:
// setzt Titel und Ladehinweis, wechselt ggf. per switchDepartment die Abteilung
// (mit waitForLoadThenRender) und kopiert danach die aktuelle Ansicht ins
// setzt Titel und Ladehinweis und kopiert danach die aktuelle Ansicht ins
// Overlay. Kein Rückgabewert.
function showModeNextSlide(){
if(!showModeActive || showModePaused) return;
@@ -125,8 +117,7 @@ function showModeNextSlide(){
const titleEl = document.getElementById('showModeTitle');
if(titleEl){
const deptLabel = DEPARTMENTS[slide.dept] ? DEPARTMENTS[slide.dept].label : slide.dept;
titleEl.textContent = `${deptLabel} – ${slide.view === 'load' ? 'Auslastung' : 'Projektboard'}`;
titleEl.textContent = slide.view === 'load' ? 'Auslastung' : 'Projektboard';
}
// Ladehinweis anzeigen, damit der alte Inhalt nicht kurz sichtbar flackert
@@ -135,51 +126,14 @@ function showModeNextSlide(){
content.innerHTML = '<div class="show-mode-loading">Lädt…</div>';
}
// Wechsle Department und View in der Hauptansicht, dann kopiere ins Overlay.
// Da switchDepartment asynchron lädt, müssen wir auf den Abschluss warten.
if(currentDepartment !== slide.dept){
// Temporär currentTab setzen, damit nach dem Laden der richtige Tab aktiv ist.
currentTab = slide.view;
switchDepartment(slide.dept);
// Warte bis Daten geladen sind, dann rendern und kopieren
waitForLoadThenRender(slide.view);
} else {
showTab(slide.view, true);
renderAll();
showTab(slide.view);
renderAll();
requestAnimationFrame(() => {
requestAnimationFrame(() => {
requestAnimationFrame(() => {
copyCurrentViewToShowMode();
scheduleNextShowModeSlide();
});
copyCurrentViewToShowMode();
scheduleNextShowModeSlide();
});
}
}
// waitForLoadThenRender: wartet nach dem asynchronen Abteilungswechsel, bis
// Wochen geladen sind (Polling alle 200 ms, Abbruch nach 30 Versuchen), und
// rendert dann die gewünschte Ansicht, kopiert sie ins Show-Mode-Overlay und
// plant die nächste Folie. Parameter: view = 'board' oder 'load'.
function waitForLoadThenRender(view){
let attempts = 0;
showModePollTimer = setInterval(() => {
attempts++;
// Poll nur fortsetzen, solange der Show Mode noch läuft (sonst würde nach
// stopShowMode der gerade wiederhergestellte Zustand überschrieben).
if(!showModeActive && showModePollTimer){ clearInterval(showModePollTimer); showModePollTimer = null; return; }
// Wenn Wochen geladen sind oder nach Seed gefallen ist
if((db.weeks.length > 0 || attempts > 30) && showModeActive){
if(showModePollTimer){ clearInterval(showModePollTimer); showModePollTimer = null; }
showTab(view, true);
renderAll();
// Kurze Verzögerung, damit das DOM aktualisiert ist, bevor kopiert wird
requestAnimationFrame(() => {
requestAnimationFrame(() => {
copyCurrentViewToShowMode();
scheduleNextShowModeSlide();
});
});
}
}, 200);
});
}
// scheduleNextShowModeSlide: plant den Wechsel zur nächsten Folie nach