170 lines
6.3 KiB
JavaScript
170 lines
6.3 KiB
JavaScript
// -----------------------------
|
|
// 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 = '<div class="show-mode-loading">Lädt…</div>';
|
|
}
|
|
|
|
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();
|
|
}
|
|
}); |