// ----------------------------- // Projektübersicht — Show Mode // ----------------------------- // 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 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; // showModeTimer: Timer-Handle für den Wechsel zur nächsten Folie let showModeTimer = null; // showModeResumeTimer: Timer-Handle für die automatische Fortsetzung nach einer Pause let showModeResumeTimer = null; // showModePaused: true, wenn der Durchlauf gerade pausiert ist let showModePaused = false; // 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 (Ansicht), die zyklisch // durchlaufen wird const SHOW_MODE_SEQUENCE = [ { view: 'board' }, { view: 'load' } ]; // showModeIndex: Position innerhalb der SHOW_MODE_SEQUENCE let showModeIndex = 0; // startShowMode: startet den Präsentationsmodus (falls nicht schon aktiv): // merkt sich Abteilung/Tab, zeigt das Overlay, kollabiert das Menü und beginnt // den Slide-Durchlauf. Kein Rückgabewert. function startShowMode(){ if(showModeActive) return; showModeActive = true; showModePaused = false; showModeOriginal = { tab: currentTab }; showModeIndex = 0; const overlay = document.getElementById('showModeOverlay'); if(overlay) overlay.style.display = 'flex'; // Menü schließen, falls offen setHeaderCollapsed(true, false); showModeNextSlide(); } // stopShowMode: beendet den Präsentationsmodus: stoppt alle Timer, verbirgt // 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); const overlay = document.getElementById('showModeOverlay'); if(overlay) overlay.style.display = 'none'; // 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; showTab(currentTab); renderAll(); } // pauseShowMode: pausiert den Durchlauf (Anzeige "Pausiert") und startet die // automatische Fortsetzung nach SHOW_MODE_PAUSE_DURATION; bei erneutem Aufruf // im pausierten Zustand wird sofort fortgesetzt. Kein Rückgabewert. function pauseShowMode(){ if(!showModeActive) return; if(showModePaused){ // bereits pausiert -> sofort fortsetzen resumeShowMode(); return; } showModePaused = true; clearTimeout(showModeTimer); clearTimeout(showModeResumeTimer); const pausedEl = document.getElementById('showModePaused'); if(pausedEl) pausedEl.style.display = 'block'; showModeResumeTimer = setTimeout(() => { if(showModeActive && showModePaused) resumeShowMode(); }, SHOW_MODE_PAUSE_DURATION); } // resumeShowMode: setzt einen pausierten Durchlauf fort (Timer aufräumen, // Hinweis ausblenden) und zeigt die nächste Folie. Kein Rückgabewert. function resumeShowMode(){ if(!showModeActive) return; showModePaused = false; clearTimeout(showModeResumeTimer); const pausedEl = document.getElementById('showModePaused'); if(pausedEl) pausedEl.style.display = 'none'; showModeNextSlide(); } // showModeNextSlide: stellt die nächste Folie der SHOW_MODE_SEQUENCE dar: // setzt Titel und Ladehinweis und kopiert danach die aktuelle Ansicht ins // Overlay. Kein Rückgabewert. function showModeNextSlide(){ if(!showModeActive || showModePaused) return; const slide = SHOW_MODE_SEQUENCE[showModeIndex % SHOW_MODE_SEQUENCE.length]; showModeIndex++; const titleEl = document.getElementById('showModeTitle'); if(titleEl){ titleEl.textContent = slide.view === 'load' ? 'Auslastung' : 'Projektboard'; } // Ladehinweis anzeigen, damit der alte Inhalt nicht kurz sichtbar flackert const content = document.getElementById('showModeContent'); if(content){ content.innerHTML = '
Lädt…
'; } showTab(slide.view); renderAll(); requestAnimationFrame(() => { requestAnimationFrame(() => { copyCurrentViewToShowMode(); scheduleNextShowModeSlide(); }); }); } // scheduleNextShowModeSlide: plant den Wechsel zur nächsten Folie nach // SHOW_MODE_SLIDE_DURATION (außer im pausierten/inaktiven Zustand). function scheduleNextShowModeSlide(){ if(!showModeActive || showModePaused) return; clearTimeout(showModeTimer); showModeTimer = setTimeout(() => { showModeNextSlide(); }, SHOW_MODE_SLIDE_DURATION); } // copyCurrentViewToShowMode: kopiert das gerenderte HTML des aktuellen Tabs // (Board oder Auslastung) in das Show-Mode-Overlay; in der Auslastungs-Ansicht // werden dabei Titel und Toolbar ausgeblendet. Kein Rückgabewert. function copyCurrentViewToShowMode(){ const content = document.getElementById('showModeContent'); const sourceId = currentTab === 'load' ? 'load' : 'board'; const source = document.getElementById(sourceId); if(content && source){ content.innerHTML = source.innerHTML; // Im Show Mode sollen in der Auslastung Überschrift und Steuerelemente ausgeblendet werden if(currentTab === 'load'){ content.querySelectorAll('.section-title, .toolbar').forEach(el => el.remove()); } } } // ESC-Taste beendet den Show Mode (globaler Keydown-Listener). document.addEventListener('keydown', function(e){ if(showModeActive && e.key === 'Escape'){ stopShowMode(); } });