# Projektübersicht — README ## Übersicht Dieses Projekt ist eine lokale Weboberfläche zur Verwaltung von TGA-Projekten (Elektro, HLS, Architektur) über wöchentliche Sitzungen. Die Anwendung besteht aus: - einem Frontend mit `Test.html` als der einen Anwendungsseite — sie enthält alle Bereiche einschließlich des Projektbereichs eines einzelnen Projekts (Terminplan/GANTT, Aufgaben, Dateien, Einstellungen) — dazu `styles.css`, `plan-styles.css` und den JS-Modulen unter `public/js/` - einem einfachen Node.js-/Express-Server in `server.js` - einem Datenspeicher in einer SQLite-Datenbank (`node:sqlite`, benötigt Node ≥ 22.13) unter `sessions/projektuebersicht.db` - einem Docker-Setup (`Docker/Dockerfile` + `docker-compose.yml` im Projektstamm) ## Datei- und Komponentenübersicht ### Wichtige Laufzeit-Dateien - `server.js` - Node.js/Express-Server - dient als API für das Frontend - stellt statische Dateien (`Test.html`, die Module unter `js/`, `styles.css`, `plan-styles.css`, etc.) bereit; statische Assets werden mit `Cache-Control: no-store` ausgeliefert - implementiert Endpunkte: - `GET /` → liefert `Test.html` - `GET /load-all?department=…` → lädt alle Sitzungen plus globale Personenliste einer Abteilung - `POST /save-week {department, week, baseUpdatedAt}` → speichert/aktualisiert eine Sitzung; mit `baseUpdatedAt` (die vom Client gehaltene Revision = `updatedAt` aus `load-all`) erkennt der Server veraltete Speicherungen und antwortet dann mit HTTP 409 `{ok:false, conflict:true, …}`; auch gelöschte Sitzungen werden mit nicht-leerer Basis nicht wiederbelebt (409). Erfolgreiche Saves antworten `{ok:true, updatedAt}` (neue Revision) - `POST /save-people {department, people}` → ersetzt die globale Personenliste einer Abteilung - `POST /delete-week {department, label}` → löscht eine Sitzung - `GET /health` → Gesundheitscheck (`{ok:true}`) - Deep Links je Abteilung + Tab, z. B. `GET /HLS/Auslastung` oder `GET /ELT/Projektübersicht` → liefert `Test.html`; gültige Tab-Slugs sind `Projektübersicht | Auslastung | Projekte | Projektbeteiligte`, alles andere ergibt 404 - `GET /Projektplan(/)?` → liefert ebenfalls `Test.html`; der Projektbereich ist seit dem Umbau kein eigenes Dokument mehr, sondern ein Bereich dieser Seite, den `applyUrlRoute()` (`public/js/ui.js`) aus der Adresse auswählt. Die Identifikation erfolgt über die Query-Parameter `weekLabel` und `projNr`, der Projektname ist nur ein lesbares Pfad-Segment. Alte Links auf `/project-plan.html` werden per 301 auf dieses Schema umgeleitet - validiert Abteilungen gegen `ELT | HLS | ARCH` (unbekannte fallen stillschweigend auf `ELT` zurück) - legt das `sessions`-Verzeichnis beim Start an, falls es nicht existiert - JSON-Body-Limit von 2 MB - beendet sich mit aussagekräftiger Fehlermeldung, wenn der Port belegt ist - `package.json` - definiert den Node.js-Startbefehl `npm start` - enthält Produktionsabhängigkeiten `express` und `cors` - `package-lock.json` - wird für reproduzierbare Docker-Builds verwendet (`npm ci`) - `public/js/` (Module) - Die Client-Logik ist in kleine klassische Script-Dateien aufgeteilt (alle Funktionen global auf `window`, kein Bundler): - gemeinsame Helfer: `globals.js`, `utils.js`, `ui.js`, `date-picker.js`, `server.js`, `store.js`, `weeks.js`, `gantt.js`, `showmode.js`, `tabs-auth.js`, `pdf.js`, `init.js` - tab-spezifisch in eigenen Ordnern: `board/board.js` (Projektboard), `people/people.js` (Projektbeteiligte), `projects/projects.js` (Projekte), `load/load.js` (Auslastung) - Planungs-Module unter `js/plan/` (`plan-state`, `plan-build-gantt`, `plan-gantt`, `plan-drag`, `plan-modals`, `plan-schedule`) - rendert das Projektboard, die Projekt- und Personenverwaltung sowie die Auslastungsansicht - lädt Daten über den Server und speichert Änderungen als JSON-Objekte in die SQLite-Datenbank zurück - verwendet `currentDepartment` zur Trennung von Abteilungen (`ELT`, `HLS`, `ARCH`) - speichert: - alle Sitzungen und die globale Personenliste pro Abteilung in `sessions/projektuebersicht.db` - sortiert Sitzungen nach Kalenderwoche, nicht alphabetisch - sperrt historische Sitzungen automatisch (bis auf die chronologisch letzte) - Personen sind global pro Abteilung verwaltet; historische Sitzungen behalten ihre lokalen Personenkopien - speichert keine Daten in `localStorage` (dort liegt nur UI-Zustand wie Abteilung, Theme und Header-Collapse) - `Test.html` - die Haupt-Benutzeroberfläche der Anwendung (Tabs: Projektboard, Auslastung, Projekte, Projektbeteiligte) - lädt `styles.css` und die JS-Module aus `js/` in fester Reihenfolge (siehe `AGENTS.md`) - enthält die Abteilungsauswahl, Sitzungsnavigation, Tab-Navigation, das Passwort-Modal sowie PDF-Export - lädt CryptoJS (Passwortprüfung) und pdfmake (PDF-Export) von `cdnjs.cloudflare.com` — diese Funktionen benötigen daher Internetzugang - Projektbereich (Bereich `#plan` in `Test.html`, Module unter `js/plan/`) - der eigene Bereich EINES Projekts mit Dashboard, Terminplan (GANTT/TODOs/Meilensteine), Aufgaben, Dateien und Einstellungen - wird über `openProjectPlan()` (`js/gantt.js`) geöffnet — ein gewöhnlicher Bereichswechsel über `showTab('plan')`, genau wie vom Dashboard ins Projektboard; Menüband und Seitenleiste bleiben stehen - war bis zum Umbau ein eigenes Dokument `project-plan.html` mit nachgebauter, abgespeckter Seitenleiste; die Datei ist entfallen, ihre Stile liegen jetzt in `plan-styles.css` - `plan-styles.css` - die Stile des Projektbereichs (früher ein `