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:
1 parent
db63a29365
commit
6ba93b2a92
308 files changed
+64441
-743
No files matched your search
@@ -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")
|
||||
|
||||
Reference in new issue
Block a user