diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index fb9a51a..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec99bcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# SQLite-Datenbank (Laufzeitartefakt in sessions/) +sessions/*.db +sessions/*.db-wal +sessions/*.db-shm + +# macOS-Artefakte +.DS_Store diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 093811d..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,198 +0,0 @@ -# AGENTS.md - -## Overview - -Single-page app for tracking engineering projects across weekly sessions -("Sitzungen"). Vanilla JS/HTML/CSS frontend + Node.js/Express server. No build -step, no bundler, no tests. Data is persisted as semicolon-separated CSVs -under `sessions/`. - -Two HTML entrypoints, both served statically by Express: -- `Test.html` — the main app (tabs: Projektboard, Auslastung, Projekte, - Projektbeteiligte). Served at `/`. -- `project-plan.html` — per-project Gantt/TODO planning view, opened in a new - tab via `openProjectPlan()` in `js/gantt.js`. Loads the shared helper modules - (`globals`, `utils`, `ui`, `date-picker`, `csv`, `server`, `gantt`) plus the - plan modules under `js/plan/` — NOT the full main module set. - -All UI strings/comments/CSV content are German. Preserve German in -user-facing text. - -## File structure - -``` -. -├── server.js # Express server + CSV API -├── package.json # deps: express, cors only -├── docker-compose.yml # at repo ROOT; build context ., dockerfile Docker/Dockerfile -├── Docker/Dockerfile # node:20-alpine -├── .dockerignore -├── .vscode/extensions.json -├── public/ -│ ├── Test.html # main app (served at /) -│ ├── js/ # shared modules (classic scripts, global fns) -│ │ ├── globals.js # Konstanten (LPHS, ROLES, LPH-Farben, DEPARTMENTS) + db/currentDepartment -│ │ ├── utils.js # esc, uid, Datum-/Differenz-Helfer, personIdForName, peopleByRole, assignKey, weekSortKey-Quelle -│ │ ├── ui.js # LocalStorage-UI-State, Header-Collapse, Theme -│ │ ├── date-picker.js # Datums-/Bereichspicker-Overlays -│ │ ├── csv.js # CSV-Parser/Serializer + weekSortKey, filenameForWeek -│ │ ├── server.js # baseUrl, sendCsvToServer, deleteCsvFromServer, blobToDataUrl -│ │ ├── store.js # save/syncAllToServer, switchDepartment, load, seed -│ │ ├── weeks.js # Wochen-Auswahl, -Erzeugung, -Klonen, Auto-Lock, -Löschung -│ │ ├── gantt.js # GANTT-Diagramm (buildGanttHtml, openProjectPlan), geshared -│ │ ├── showmode.js # Show-Mode (Präsentationsmodus) -│ │ ├── tabs-auth.js # showTab, confirmPassword (SHA256-Passwortschutz) -│ │ ├── pdf.js # PDF-Export (pdfmake, A3 quer) -│ │ └── init.js # renderAll/initUiState + Seiteneinstieg (nur Test.html) -│ │ ├── board/ # tab-specific: Projektboard -│ │ │ └── board.js # Projektboard-Rendering, Status-Editor, Anwesenheit, Zuordnung -│ │ ├── people/ # tab-specific: Projektbeteiligte -│ │ │ └── people.js # Personen-Tab-Rendering + Drag-and-Drop + Abwesenheiten -│ │ ├── projects/ # tab-specific: Projekte -│ │ │ └── projects.js # Projekte-Tab-Rendering + Drag-and-Drop -│ │ ├── load/ # tab-specific: Auslastung -│ │ │ └── load.js # Auslastungs-Tab, LP-Modal, Neues-Projekt-Modal -│ ├── project-plan.html # Gantt/TODO planning view -│ ├── js/plan/ # planning modules (nur von project-plan.html geladen) -│ │ ├── plan-state.js # PlanApp-Zustand, Datenladepath, savePlan, Toasts -│ │ ├── plan-build-gantt.js # buildGanttHtml-Erweiterung (TODO- und Meilensteinzeilen) -│ │ ├── plan-gantt.js # renderPlanGantt, Abhängigkeitslinien, Zoom, Ressourcen-Load -│ │ ├── plan-drag.js # GANTT-Balken-Drag/Resize + TODO-/Meilenstein-Zeilen-Drag -│ │ ├── plan-modals.js # TODO-, Meilenstein- und Abwesenheits-Modals -│ │ └── plan-schedule.js # Kritischer Pfad, Auto-Schedule, Mail-Link -│ ├── styles.css -│ └── dein_bild.ico -└── sessions/ # data; bind-mounted into Docker container - ├── ELT/ HLS/ ARCH/ # one folder per department -``` - -## Running - -```bash -npm install -npm start # http://localhost:3003, or PORT=3004 if occupied -docker compose up --build # Docker variant (compose file is at repo root) -``` - -- PORT env var overrides default 3003 in `server.js`. -- Frontend must be served over HTTP: `baseUrl()` in `js/server.js` uses - `window.location.origin` or falls back to `http://localhost:3003` when opened - via `file://` (then only seed/demo data loads). -- Check `/health` returns `{ok:true}` after starting. - -## Server API (`server.js`) - -- `GET /` → `Test.html`; `GET /health`. -- Deep links per department + tab: `GET //` → `Test.html`, e.g. - `/HLS/Auslastung` or `/ELT/Projektübersicht`. Tab slugs (`TAB_SLUGS` in - `js/globals.js`) are `Projektübersicht|Auslastung|Projekte|Projektbeteiligte`; - anything else returns 404. Exception: `GET //Projektplan(/)?` - (`PLAN_SLUG`) serves `project-plan.html`, the GANTT view, with - `weekLabel|projNr` as query params (the project name is a readable path - segment only; identification happens via weekLabel + projNr). The frontend - reads/writes these routes via `applyUrlRoute()`/`updateRouteUrl()` in - `js/ui.js` and all static assets in the HTML use **absolute** paths - (`/js/...`, `/styles.css`) so they resolve on nested routes. -- `GET /load-all?department=` → `{sessions:[{filename,content}], people}` with - `_people.csv` content in `people`; sessions sorted by filename. -- `POST /save-csv {filename, csv, department}` → writes UTF-8 BOM CSV. -- `POST /delete-csv {filename, department}`. -- Valid departments hard-coded as `ELT|HLS|ARCH` in `server.js` - (`VALID_DEPARTMENTS`); anything else silently falls back to `ELT`. Same set in - `DEPARTMENTS` in `js/globals.js`. -- `safeName()` strictly validates filenames (path traversal protection); - static assets get `Cache-Control: no-store`. -- JSON body limit is 2 MB. - -## CSV format - -- Delimiter `;`, UTF-8 with BOM. Hand-editing is possible but risky; the parser - reconstructs objects from the fixed column layout. -- Week files `