// ----------------------------- // Projektübersicht — globale Konstanten & Zustand // ----------------------------- // Diese Datei wird als Erstes von Test.html und project-plan.html geladen und // legt alle zentralen Konstanten (Leistungsphasen, Rollen, Gruppen, Abteilungen, // Farben, Passwort-Hash) sowie den globalen In-Memory-Zustand (db, // currentDepartment, currentTab) fest. Sie stellt keine Funktionen, sondern nur // Daten bereit, auf die alle weiteren Module (js/store.js, js/board/board.js, // js/gantt.js, js/plan/*, ...) zugreifen. Auf dem Plan-Gantt lädt zusätzlich // js/plan/plan-state.js Zustand für die Planungsseite. // Konstanten: Leistungsphasen, Rollen und LocalStorage-Key const LPHS = ["LPH 1","LPH 2","LPH 3","LPH 4","LPH 5","LPH 6","LPH 7","LPH 8", "W+M"]; // Spalten für Leistungsphasen const ROLES = ["Planung","Projektleitung","Bauüberwachung"]; // Gruppierung der Personen const GROUP_ORDER = ["Aktive Projekte","Kleine Projekte","In Anbahnung","Allgemein"]; // Reihenfolge der Projektgruppen const STORAGE = "projuebersicht_v1"; // Durch lokale UI-State-Persistenz genutzter Key // DEFAULT_DEPARTMENT: Fallback-Abteilung beim ersten Start const DEFAULT_DEPARTMENT = 'ELT'; // DEFAULT_TAB: Tab, der beim ersten Start angezeigt wird ('board' = Projektboard) const DEFAULT_TAB = 'board'; // Farbpalette für GANTT-Balken (eine pro Projekt, wiederholend) const GANTT_COLORS = ['#0071e3','#248a3d','#b25000','#7c3aed','#d70015','#0ca678','#d9480f','#5f3dc4']; // Passwortschutz: SHA256-Hash des erlaubten Passworts. // Wenn Sie das Passwort ändern möchten, generieren Sie den SHA256-Hash (https://emn178.github.io/online-tools/sha256.html) // des neuen Passworts und ersetzen Sie den Wert hier. const PROTECTED_PASSWORD_HASH = "107bab579e8500e459690cf48ba77de32be43cadb8421bbe79fad20a55b39b6f"; // requestedAction speichert die Aktion, die nach erfolgreicher Passwort-Eingabe ausgeführt wird. let requestedAction = null; // saveSyncTimer: Handle für den debounced Speicher-Timer (Sync auf Server) let saveSyncTimer = null; // isAuthenticated: Merkt sich, ob das Passwort-Schutz-Modal bereits erfolgreich bestätigt wurde let isAuthenticated = false; // In-memory Datenbank: Sitzungen (weeks) und aktuell ausgewählte Sitzung let db = { weeks: [], currentWeek: null, globalPeople: {} }; // Aktuelle Abteilung (ELT, HLS, ARCH). Daten werden in sessions// getrennt gespeichert. let currentDepartment = DEFAULT_DEPARTMENT; // currentTab: aktuell aktiver Tab der Hauptseite (z. B. 'board') let currentTab = DEFAULT_TAB; // DEPARTMENTS: Auflistung der gültigen Abteilungen mit Anzeigename und Icon const DEPARTMENTS = { ELT: { label: 'Elektro', icon: '' }, HLS: { label: 'HLS', icon: '' }, ARCH: { label: 'Architektur', icon: '' } }; // TAB_SLUGS / TAB_BY_SLUG: sprechende URL-Abschnitte für die Tabs, damit jede // Abteilungs-/Tab-Kombination eine eigene Seite hat (z. B. "/HLS/Auslastung"). // Wird von js/ui.js (applyUrlRoute/updateRouteUrl) und dem Server genutzt. const TAB_SLUGS = { board: 'Projektübersicht', load: 'Auslastung', projects:'Projekte', people: 'Projektbeteiligte' }; const TAB_BY_SLUG = Object.fromEntries(Object.entries(TAB_SLUGS).map(([k,v]) => [v,k])); // PLAN_SLUG: URL-Schlüssel für die Projektplan-Seite (project-plan.html), im // gleichen Deep-Link-Schema wie die Tabs: "//Projektplan". const PLAN_SLUG = 'Projektplan';