GitButler bc30f2900b GitButler Workspace Commit
This is placeholder commit and will be replaced by a merge of your virtual branches.

Due to GitButler managing multiple virtual branches, you cannot switch back and
forth between git branches and virtual branches easily. 

If you switch to another branch, GitButler will need to be reinitialized.
If you commit on this branch, GitButler will throw it away.

For more information about what we're doing here, check out our docs:
https://docs.gitbutler.com/features/branch-management/integration-branch
2026-10-02 07:47:57 +02:00
2026-10-02 07:47:57 +02:00
2026-10-02 07:47:57 +02:00
2026-10-02 07:47:57 +02:00
2026-10-01 06:46:51 +02:00
2026-09-14 18:10:49 +02:00
2026-10-01 06:46:51 +02:00
2026-10-01 06:46:51 +02:00
2026-10-01 06:46:51 +02:00

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 aus zwei HTML-Einstiegen (Test.html für die Hauptansicht mit Tabs, project-plan.html für die Projektplanung/GANTT-Ansicht) plus 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, project-plan.html, die Module unter js/, 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 /<Dept>/Projektplan(/<ProjName>)? → liefert project-plan.html (GANTT-Ansicht); die Identifikation erfolgt über die Query-Parameter weekLabel und projNr, der Projektname ist nur ein lesbares Pfad-Segment
    • 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
  • project-plan.html

    • die Planungsansicht (GANTT/TODOs/Meilensteine) pro Projekt
    • öffnet sich in einem neuen Tab über openProjectPlan() (js/gantt.js)
    • lädt nur die gemeinsamen Helfermodule plus js/plan/* und window-übergreifend abgestimmte Pfade
  • styles.css

    • Layout und Styling der Oberfläche

Docker-bezogene Dateien

  • Docker/Dockerfile

    • Basis-Image: node:22-alpine (nötig, da node:sqlite erst ab Node 22.13 ohne Flag stabil verfügbar ist)
    • kopiert package.json und package-lock.json, installiert Produktionsabhängigkeiten mit npm ci
    • kopiert server.js und public/ nach /app
    • legt sicherheitshalber /app/sessions an
    • läuft als nicht-root-User node
    • enthält einen HEALTHCHECK auf /health
    • startet node server.js
  • docker-compose.yml (im Projektstamm)

    • definiert den Service projektuebersicht
    • baut das Image mit Build-Kontext . und Docker/Dockerfile
    • mappt Port 3003:3003
    • bindet das Host-Verzeichnis ./sessions in den Container nach /app/sessions
    • setzt restart: unless-stopped
    • definiert einen healthcheck
  • .dockerignore

    • schließt unnötige Dateien aus dem Docker-Build aus: node_modules/, npm-debug.log, .git, .gitignore, Docker/* (außer Docker/Dockerfile)

Sonstige Dateien

  • dein_bild.ico

    • optionales Icon, wird vom Server statisch ausgeliefert, wenn angefragt
  • AGENTS.md

    • Projektnotizen / Dokumentation, aber nicht Teil des Anwendungslaufs

Persistenz und Datenfluss

Speicherung

  • Alle persistierten Daten werden in einer SQLite-Datenbank (node:sqlite, DatabaseSync, WAL-Modus, PRAGMA foreign_keys = ON) unter sessions/projektuebersicht.db gespeichert.
  • Das Schema ist vollständig relational (19 Tabellen): weeks, week_people (+ week_people_roles), attendance, projects, project_lph, project_assign, project_aufwand, project_aktuelle_lp, project_plan, plan_people, plan_todos (+ plan_todo_assignees, plan_todo_deps), plan_milestones (+ plan_milestone_deps), people (+ person_roles, person_absences). Projekt-/Personen-IDs bleiben dadurch über Neustarts stabil.
  • Der Datenbankpfad ist über die Umgebungsvariable DB_PATH übersteuerbar (für Tests/Backups), Standard ist sessions/projektuebersicht.db.

Server-API

  • Der Server wird in server.js erstellt und startet auf Port 3003 oder dem Wert von process.env.PORT.
  • Das Frontend ruft den Server über window.location.origin an (Fallback http://localhost:3003 bei file://-Öffnung).

Wo werden die Daten gespeichert?

  • Das Frontend schreibt über den Server in die SQLite-Datenbank.
  • In js/store.js speichert die Anwendung nur geänderte Sitzungen (Dirty-Tracking über markWeekDirty()/markPeopleDirty()) via /save-week (Sitzungen) bzw. /save-people (globale Personen); ein In-Flight-Guard verhindert Doppel-Speicherungen. Jede Sitzung führt einen Revisions-Zeitstempel (updated_at, übertragen als updatedAt); speichert ein Client mit veralteter Revision (baseUpdatedAt), antwortet der Server mit HTTP 409 und der Client lädt nur diese eine Sitzung neu (andere ungespeicherte Änderungen bleiben erhalten).
  • Der Server zerlegt die JSON-Objekte in die relationalen Tabellen (serializeWeek()/loadWeeks()) in einer Transaktion pro Sitzung. Beim Start migriert migrateLegacySchema() idempotent ein altes Single-JSON-Dokument-Schema in das relationale Schema; anschließend ergänzt migrateWeeksUpdatedAt() die updated_at-Spalte der weeks-Tabelle (idempotent). PRAGMA busy_timeout = 5000 verhindert Fehler bei parallelen Schreibzugriffen.

Betrieb

Lokal mit Node.js (Node ≥ 22.13)

npm install
npm start

Danach ist die Anwendung erreichbar unter http://localhost:3003.

Falls der Port belegt ist:

PORT=3004 npm start

Mit Docker

Im Projektstamm ausführen:

docker compose up --build

Danach ist die Anwendung erreichbar unter:

http://localhost:3003

Wichtige Hinweise

  • Der Server benötigt Lese-/Schreibzugriff auf sessions/ (für die SQLite-Datenbank und das Docker-Bind-Mount).
  • Die Docker-Compose-Konfiguration liegt im Projektstamm und mountet ./sessions in den Container. Achte darauf, dass der relative Pfad im Kontext korrekt ist, wenn du docker compose aus einem anderen Verzeichnis startest.
  • js/store.js und js/server.js arbeiten mit Abteilungsparametern und speichern Daten abteilungsweise getrennt.
  • Die Passwortfunktion (Tabs „Projekte“/„Projektbeteiligte“, Sitzungslöschung, Entsperren) ist nur ein einfacher Client-Mechanismus im Frontend (SHA256-Vergleich) und kein echter Sicherheitsmechanismus.
  • Globale Personen werden pro Abteilung in der Datenbank verwaltet. Wird eine Person global gelöscht, bleibt sie in bereits existierenden Sitzungen sichtbar (Wochen-Personenkopien).
  • CryptoJS und pdfmake werden von cdnjs.cloudflare.com geladen — PDF-Export und Passwortprüfung funktionieren ohne Internet nicht.
S
Description
No description provided
Readme
30 MiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 76.5%
CSS 17.1%
HTML 5.5%
Shell 0.8%