Plan Checker, Wochenbericht-Fokus-Modus und Wandtafel-Dashboard-Feinschliff

Plan Checker (neues Studenten-Werkzeug, Seitenleiste + Admin → Plan-Checker-
Merkmale): lädt einen Bauplan als PDF hoch und lässt ChatGPT oder Claude ihn
gegen eine gepflegte Merkmalsliste prüfen. PDF-Rendering (pdf.js +
@napi-rs/canvas) berücksichtigt jetzt Ebenen (Optional Content Groups) und
WASM-Decoder korrekt, sendet eine Übersicht plus mehrere hochaufgelöste
Kachel-Ausschnitte statt eines einzelnen, zu groben Bilds, und beide Anbieter
bekommen dasselbe Bildmaterial. Jedes Prüfergebnis kann auf eines der
gesendeten Bilder als Beleg verweisen (bildIndex) — als Screenshot im
Ergebnis anklickbar, öffnet vergrößert in einem Modal statt eines von Chrome
blockierten target=_blank-Links auf eine data:-URL. KI-Modellname ist jetzt
pro Konto überschreibbar (Einstellungen → Mein Konto) für Drittanbieter mit
abweichendem Modell-Katalog.

Wochenbericht: dichte Kartenansicht bekommt einen Fokus-Modus — nur der
Kommentar liegt offen, Leistungsphasen und Beteiligte stecken in
aufklappbaren Abschnitten statt dauerhaft nebeneinander zu stehen.

Projektbereich: Terminplan-Auslastung rechnet jetzt exakt wie der
Auslastungs-Tab/die Wandtafel (statt einer unabhängigen, tageweisen
Schätzung); die LPH-Fortschrittsliste im Dashboard zeigt nur noch die
beauftragten Leistungsphasen.

Wandtafel: Dashboard-Kopf mit Kennzahlen-Reihe und Panel-Reihe neu
strukturiert, in den Blautönen des Firmenlogos; dieselbe Palette wurde
anschließend auf den gesamten App-weiten Dark Mode übernommen.

Dateibereinigung: nicht mehr benötigte Test-Uploads/Backups entfernt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
erikandClaude Sonnet 5 committed 2026-10-05 14:01:41 +02:00
1 parent db63a29365
commit 6ba93b2a92
308 files changed
+64441 -743

No files matched your search

+145 -2
View File
@@ -1183,9 +1183,48 @@ step into a project explicit. Everything lives in `public/js/auftrag.js`:
- **Dashboard** — KPI tiles (`renderPlanKpis()`), the session comment and the
LPH progress list (`renderPlanInfo()`), "Nächste Termine" and "Team"
(`renderPlanDashboard()`), plus three compact cards that jump to the
Ressourcen/Dateien section or open the Verlauf modal.
Ressourcen/Dateien section or open the Verlauf modal. **The LPH progress
list shows only the BEAUFTRAGTEN Leistungsphasen** (`p.beauftragteLP`,
set in "Einstellungen") — Erik reported it still listing phases that
weren't marked as commissioned there. `renderPlanInfo()` previously
mapped over the full `LPHS` constant unconditionally; it now filters to
`p.beauftragteLP` when that list is non-empty, falling back to all of
`LPHS` otherwise (older projects with nothing beauftragt) — the exact
same `nurBeauftragteLph` rule `BOARD_OPTS` already applies to the
Wochenbericht/Board card (`js/board/board.js`), just unconditional here
rather than opt-in, since the Dashboard has no second, unfiltered
rendering of this list to preserve.
- **Terminplan** — the Gantt with its toolbar and, below it, the resource
load (`#resourceLoadContainer`, formerly a modal).
load (`#resourceLoadContainer`, formerly a modal). **Uses the exact same
Wochenstunden calculation as the Auslastung tab/Wandtafel**
(`computeResourceLoads()`, `js/plan/plan-gantt.js`, calling
`berechneAuslastung()`/`loadAmpelColor()`/`kapazitaetsFaktor()` from
`js/load/load.js`) — Erik reported the two disagreeing ("Die Auslastung
der Projektbeteiligten im Terminplan ist eine andere als die in der
sonstigen Anwendung"). It previously counted something unrelated: workday
spans derived from each person's assigned TODO date ranges in THIS
Gantt, relative to a locally-scoped maximum among this project's own
team — a scheduling-density number with no connection to honorar,
Leistungsphase, or capacity, so the same person could show a completely
different figure here than on the Auslastung tab. Now, for every project
of the session (this one and every other), it runs the identical
per-role `berechneAuslastung()` call `renderLoad()` makes and sums it per
person — the headline number and Ampel color shown here are therefore
now literally the same as that person's total on the Auslastung tab, not
just similarly computed. The split into "aus diesem Projekt" vs. "aus
den übrigen Projekten der Sitzung" (`stundenProjekt`/`stundenAndere`,
surfaced as a `plan-resource-other` badge) is kept from the old
days-based version — without it, someone could look idle in this one
project while fully booked elsewhere — just re-expressed in hours
instead of workdays. The Team-Auslastung KPI tile (`renderPlanKpis()`)
and the compact heat-row preview (`#planResourceSummary`) consume the
same `computeResourceLoads()` output and were updated the same way
(percentage now relative to capacity, not to the locally-scoped
maximum). A fixed side effect: the old bar/number colors were hardcoded
hex (`#c53030`/`#d69e2e`/`#2f855a`), invisible to the dark-mode token
system entirely — `loadAmpelColor()` returns `var(--red)` etc., so this
view now also follows the app-wide dark-mode palette like everywhere
else.
- **Aufgaben** — the same todos/milestones as a list (`renderPlanTasks()`,
`js/plan/plan-tasks.js`). No own data and no own dialogs: a row opens the
very same `openTodoModal()`/`openMilestoneModal()` as the Gantt, and the
@@ -2827,6 +2866,110 @@ across Gewerke or users. Erik's own words: "macht so keinen Sinn mehr."
back — meant for a staff member previewing the tab via their own,
non-kiosk account, not for the kiosk account itself, which has no reason
to ever leave it (and would just hit 403s on whatever tab it landed on).
- **Redesigned again, on-screen label now "Dashboard".** After the
two-column layout below had been live for a while, Erik asked for a round
of completely fresh full-board concepts (not incremental tweaks to the
existing look). From a 3-way comparison of genuinely different structures
(a "Leitstand"/control-room instrument panel, a size-varied card mosaic, an
auto-rotating single-focus carousel) he picked the Leitstand's
**structure** — not its monochrome/terminal skin. A second round then
explored skins of that SAME structure (Erik: "es muss nicht retro
aussehen... es darf auch vom grundlegenden Design abgewichen werden, es
soll nur die selbe Struktur sein"), landing on "Pastell Freundlich",
finally recolored into the two blues of the company logo (sampled directly
from `public/logo.ico`: `#94b0cc` light, `#116896` dark) instead of a
generic pastel mix or the app's own `--accent`. The **current** structure,
replacing the two-column one described below:
- **Kopf** (`wandDashKopfHtml()`) — the marke now reads **"Dashboard"**
(Erik: "ersetze den Schriftzug Wandtafel durch Dashboard" — a label
invented for this screen's own header, not a rename of the tab/route/
sidebar entry, which all stay "Wandtafel" throughout this file and the
code), the current session label + a live clock, and — moved out of the
old "Heute" tile — a small antippable avatar cluster for who's absent
today (`wandZeigeUebersicht('abwesend')`, unchanged target).
- **Kennzahlen-Reihe** (`wandKpiReiheHtml()`) — four tiles: Auslastung
gesamt and Besprochen gesamt (`wandGesamtKennzahlen()`, new — the SAME
per-Gewerk sums from `wandAuslastungJeGewerk()`/`wandBesprochenDaten()`
simply totalled across all three Gewerke rather than broken out, so the
deliberate multi-Gewerke double-count applies here too automatically),
plus offene Aufgaben/überfällig (unchanged counts from
`wandHeuteDaten()`, moved out of the old "Heute" tile and still
individually clickable to the same two overviews).
- **Panel-Reihe** (`.dash-grid`, three panels framed by the shared
`wandPanel()`) — Auslastung je Gewerk and Besprochen je Gewerk keep
their exact previous per-row content and click targets
(`wandAuslastungInhalt()`/`wandBesprochenInhalt()`, simply the old tile
functions with the `wandKachel()` wrapper stripped off); the third
panel, "Aktuell" (`wandAktuellInhalt()`), reverts the feed from the
three-column by-type grouping (see further below, now superseded) back
to one flat list sorted by closeness to today, capped at `WAND_FEED_MAX`
(6) — a colored dot per entry (`.dash-feed-punkt`) still marks
Neu/Überfällig/Termin, just without the column headers/counts that
needed more width than a third of this narrower row affords. Every
entry stays individually clickable into its project, unchanged.
- The **Übersicht drill-downs and the full project list below are
unchanged in content and behavior** — only restyled with the same
`--dash-*` tokens so the whole screen reads as one identity rather than
a themed top half bolted onto a generically-styled bottom half. The
project list specifically was deliberately left on the app's normal
`.board-row` styling, not reskinned — see its own bullet further below,
"Ein Ort je Angabe"-adjacent reasoning that still applies unchanged.
- **New CSS custom properties, `--dash-*`, declared on
`body.wandtafel-aktiv`** (styles.css) with the usual three-way light/
dark pairing (bare block, `@media (prefers-color-scheme:dark)
html:not([data-theme="light"])`, `html[data-theme="dark"]`) — kept
deliberately separate from the app-wide `--accent`/`--surface` tokens,
since this one screen now intentionally carries its own brand identity
rather than the generic app chrome. `--dash-hover` exists only because a
plain semi-transparent white overlay (the obvious reach for "lighten on
hover") looks wrong once panels are already dark in dark mode — it's
tuned per theme instead of hardcoded once.
- **First web font this app has ever loaded**: `Fredoka` (numerals/marke)
and `Nunito Sans` (body), both via a Google Fonts `<link>` in
`App.html`, scoped in a comment to "only the Wandtafel". Breaks, for
this one screen, the otherwise all-system-font convention — accepted
because the approved design specifically depended on Fredoka's
character, and because the `font-family` fallback stack degrades
silently (system sans) rather than breaking anything if the kiosk has no
internet access, the same acceptable-offline-degradation precedent
pdfmake's CDN script already set for PDF export.
- **`renderWandStand()` ("Stand: HH:MM Uhr") is gone** — the header's own
live clock next to the session label now serves the same "hasn't frozen"
purpose, so a second, separate timestamp at the old feed column's foot
(which no longer exists as a column) would have been redundant.
- **Known documentation debt**: the "Two columns, version 2" bullet and
its sub-bullets immediately below describe the PREVIOUS structure this
redesign replaced. The underlying per-element click-target
philosophy, the `wandUebersicht` drill-down mechanism, and the specific
overview targets they describe are all still accurate and unchanged —
only the surrounding layout (two columns of tiles vs. the current
kopf+KPI-reihe+panel-reihe) and some renamed functions
(`wandTileAuslastung`→`wandAuslastungInhalt`,
`wandTileBesprochen`→`wandBesprochenInhalt`, `wandTileHeute` removed,
`wandKachel`→`wandPanel`, `wandLinkeSpalteHtml` removed,
`wandFeedHtml`/`WAND_FEED_SPALTEN` → `wandAktuellInhalt`) are stale.
Treat class names like `.wand-c-layout`/`.wand-c-rechts`/`.wand-kachel`/
`.wand-stat`/`.wand-namen`/`.wand-avatar`/`.wand-feed-gruppe*` mentioned
below as historical — none of them exist in styles.css any more.
- **Follow-up: the Dashboard's logo-blue palette then became the WHOLE
app's dark mode**, not just this one screen — Erik: "kannst du das gesamte
dark mode Farbschema an das der Wandtafel anpassen?". The dark-mode
`--accent`/`--text`/`--bg`/`--surface*`/`--line*` tokens (the ONE shared
`:root`/`html[data-theme="dark"]` definition at the top of styles.css,
confirmed by grep to be the only place these specific hex values appear —
every component in the app already read them exclusively through
`var(...)`, so this was a token-value swap, not a sweep across individual
rules) now carry the same cool blue-teal family as `--dash-*` above,
instead of the previous generic Apple-style blue/near-black. `--green`/
`--amber`/`--red` were retuned to the same gedeckter palette rather than
left alone or collapsed into the accent hue — they stay functionally
independent status colors (Ampel-Logik, Auftragsstatus, etc.), per
"semantic color is separate from the brand accent," just recolored to sit
well against the new cooler background instead of clashing with it.
`--band-neu` (the Wochenbericht card header color for "neu kommentiert")
reuses the exact same dark logo blue as `--dash-ink`'s light-mode value
(`#116896`) — dark enough under its own white text regardless of page
theme. Light mode is untouched; only the dark-mode token blocks changed.
- **Two columns, version 2 (Erik's choice from the layout comparison),
replacing an earlier six-tile 3×2 grid.** The grid version left visibly
uneven whitespace: a tile with a single number (e.g. "Abwesend heute")