Skip to content

Rapport: resourcediagram — typelaag, rapportageperiode en toewijzingskolommen (#113, manuvarkey 1–3) - #138

Merged
Nozzit merged 7 commits into
mainfrom
claude/newest-issue-5kqmzu
Sep 14, 2026
Merged

Nozzit merged 7 commits into
mainfrom
claude/newest-issue-5kqmzu

Conversation

@Nozzit

@Nozzit Nozzit commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

What and why

Refs #113. Na de merge van het resourcediagram (#132) stelde manuvarkey drie uitbreidingen voor; dit zijn ze, elk als eigen commit en eigen optie in reportSettings.resourceGantt, bediend in het Rapport-paneel. Volgorde bewust: eerst het kleinste (2), dan wat op #134 wachtte (3), dan het grootste (1).

Punt 2 — Groeperen op resourcetype (14b01d8, optie groupByType, default uit). Eerst een band per type in de vaste volgorde arbeid, ploeg, onderaannemer, materieel, materiaal (RESOURCE_TYPE_BAND_ORDER — niet op vertaald label gesorteerd, zodat een uitgedeeld vel in elke taal dezelfde blokvolgorde heeft), daarbinnen de resourcebanden op diepte 1, de taken op diepte 2; "(geen)" blijft achteraan op diepte 0. Bij Elke resource op een nieuwe pagina krijgt een band direct onder een band geen eigen gedwongen breekpositie, zodat een typekop bij zijn eerste resource blijft in plaats van alleen op een leeg vel. Zonder de optie byte-identiek.

Punt 3 — Rapportageperiode (27c984b, optie period, default Hele project). De gedeelde rapportageperiode uit #134 (ReportingPeriodField, resolveReportingPeriod; useResolvedPeriod is nu geëxporteerd) als tijdvenster: alleen bladtaken die het venster raken (start ≤ tot én einde ≥ van, dagniveau — dezelfde overlapregel als de tabelrapporten), tellingen op die gefilterde set, counts.outsidePeriod/inPeriod in het overzichtsblok en een eigen lege-staat-tekst (alleen als er géén bladtaak meer in het venster staat). De render kent PrintOptions.timeWindow: tijdas exact van van t/m tot zonder de 7/14-dagenmarge, en omdat Draw2D geen clip kent klemt clampX balken (ook gesplitste; de 3 px-minimumbreedte schuift naar binnen), voortgang, speling, samenvattingshaken (zonder haakje op een afgekapt uiteinde) en baseline op het chartgebied; mijlpaal- en baselineruiten met hun middelpunt in de chart worden naar binnen geklemd, erbuiten niet getekend; een balk die er helemaal buiten valt tekent niets, ook geen label; relaties worden bij een venster nooit getekend; een venster zonder werkdag valt op de gecomprimeerde as terug op de kalender-as. Bij Hele project geen venster ⇒ byte-identiek.

Punt 1 — Eenheden/dag en curve (8fdeb52, optie showAssignmentColumns, default aan — dit is de informatie waarvoor je het rapport uitdeelt; het resourcediagram zit nog in geen release, dus er is geen bestaand gebruikersgedrag dat hierdoor verandert — reviewer heeft dat tegen de releasetags gecontroleerd). De engine levert assignmentByRowKey: per taakrij onder een resourceband de toewijzing van díé band op die taak — unitsPerDay opgeteld over records van dezelfde resource; de curvetoestand is exact de weergaveregel van het eigenschappenpaneel (contour gekoppeld aan de toewijzing ⇒ Contour, curveValues zonder OPS-vorm ⇒ Geïmporteerde curve, anders curve, afwezig = UNIFORM), alleen als alle records dezelfde hebben, anders null. Let op: dat is een weergaveregel, niet de verdeelregel van assignmentDayUnits (die verdeelt met curveValues óók naast een curve); rapport en paneel lopen gelijk, een gedeelde toestandshelper is een vervolgstap. De render tekent twee kolommen direct achter de naam (COL.units 45, COL.curve 98 — gemeten op de ingebedde Inter voor pl/pt): eenheden rechts uitgelijnd, de vertaalde curve links en afgekort, een streepje bij verschillende curves; buildPrintRows hangt de toewijzing aan PrintRow.assignment. Zonder de optie byte-identiek, ook mét meegegeven rowAssignments; de preview-signatuur serialiseert de Map expliciet.

Schermbewijs: artifacts/resourcediagram/04-typelaag-en-toewijzingskolommen.png en 05-rapportageperiode-14-sep-tot-11-okt.png (van vóór de reviewfixes; de kolomkoppen en -breedte zijn sindsdien licht gewijzigd).

Hyperkritische reviews (subagent, Opus), twee rondes. Ronde 1 "nee, nog niet", tien bevindingen, verwerkt in 9ecbe4b: Curve-kolom zei "Uniform" bij gecontoureerde of geïmporteerde curves (hoog); mijlpaalruit kon bij een venster half over de tabel hangen; misleidende emptyPeriod; default gedocumenteerd; gecomprimeerde as zonder werkdag; kolombreedte; minimumbreedte over de rand; kleurvakken van een afgekapte balk; relaties per conventie uit; lege-staat-tekst en gids. Ronde 2 "ja, mits", verwerkt in 8b6bbc7: kolom 98 px (pl paste nog niet), de onware claim "dezelfde drie lagen als de lastverdeling" gecorrigeerd in doc, gids en hier, contourkoppeling op de volledige recordlijst (legacy-terugval anders dan het paneel), lege staat met woord-wrap i.p.v. ellipsis, ruitklem alleen bij een middelpunt in de chart, minimumbreedte verschoven i.p.v. afgeknepen, en een vacuüm vervulbare testassertie dichtgezet. De reviewer bewees de byte-identiteit zonder opties met een eigen probe tegen een bb47188-worktree (lege diff). Bewust gelaten (pre-existing): weekend-dagcijfers op de kalender-as, decimaalteken van de eenheden (punt, zoals num()), het artifacts/-beleid.

How it was verified

  • npm run verify green — lokaal, alle onderdelen los op de branch vóór de reviewfixes: typecheck, lint, verify:docs (34 × 14), verify:i18n, cycles, store-/gantt-boundaries, examples, de volledige planningssuite (188 batterijen + tijdzone-matrix, exit 0), library, mcp, dev-server; de volledige browsersuite 145/146 (de ene: just-updated-dialog.spec.ts op ERR_CERT_AUTHORITY_INVALID van de sandbox-proxy-CA, code die dit diff niet raakt en op CI groen). Reviewer ronde 2 draaide de volledige planningssuite (560/560) nogmaals op 9ecbe4b. Na elke reviewronde opnieuw: typecheck, lint, cycles, docs, de drie rapportbatterijen (252 rapportchecks, print-report, settings) en de browserspecs resource-gantt-report, report-footer, report-preview-performance.
  • Regressie per punt in tests/planning/check-reports.ts, check-print-report.ts (incl. ruit binnen het chartgebied bij 4 px/dag met een recorder die gevulde paden vastlegt, minimumbreedte bij 1 px/dag, gewrapte lege staat, tabelbreedte +143), check-report-resource-gantt-setting.ts en tests/browser/resource-gantt-report.spec.ts.

Does this touch

  • Project data — n.v.t.: rapportvoorkeuren in ops-reportSettings.
  • Scheduling logic — n.v.t.
  • User-visible text — via t(...): resourceGantt.groupByType, emptyPeriod, outsidePeriod, showAssignmentColumns en tableHeaders.unitsPerDay/curve in alle 14 report.json-locales; curvenamen uit het bestaande common:resource.curve.* en task:properties.assignments.{contoured,importedCurve}.
  • @tauri-apps/* — n.v.t.

Documentation

  • public/docs/{nl,en}/gids-rapporten-printen.md: resourcediagram-sectie (drie opties, typebandtelling, Contour/Geïmporteerde curve, bredere tabel) en de periodesectie. De twaalf vertaalde gidsen volgen de maandelijkse vertaalronde (verify:docs eist kop-/linkpariteit, die klopt).
  • CLAUDE.md: rapportparagraaf voor de drie opties.
  • docs/CHANGELOG.md bewust niet (alleen bij een release).

🤖 Generated with Claude Code

https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq

… manuvarkey punt 2)

Optie "Groeperen op resourcetype": eerst een band per type — arbeid, ploeg,
onderaannemer, materieel, materiaal, in die vaste volgorde (niet op vertaald
label, zodat een uitgedeeld vel in elke taal dezelfde blokvolgorde heeft) —
daarbinnen de resourcebanden zoals voorheen, de taken op diepte 2. "(geen)"
blijft achteraan op diepte 0: taken zonder resource hebben geen type. Zonder de
optie zijn de rijen byte-identiek.

Bij "elke resource op een nieuwe pagina" krijgt een band direct onder een band
geen eigen gedwongen breekpositie, zodat een typekop bij zijn eerste resource
blijft in plaats van alleen op een leeg vel te staan.

Instelling in reportSettings.resourceGantt (tolerante parser), vinkje in het
paneel, sleutel in 14 locales, gidsen nl+en. Regressie: check-reports
(volgorde, dieptes, tellingen, unieke sleutels, byte-identiek zonder optie,
gelijknamigen over twee typen), check-print-report (breekposities bij een
typelaag), settings-check, browserspec (typekop blijft bij eerste resource:
nog steeds drie pagina's).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…, manuvarkey punt 3)

Het resourcediagram krijgt de gedeelde rapportageperiode (issue #120,
`ReportingPeriodField`/`resolveReportingPeriod`) als eigen optie: alleen
bladtaken die het venster raken (start ≤ tot én einde ≥ van, dagniveau,
dezelfde overlapregel als de tabelrapporten) doen mee, de tellingen volgen die
gefilterde set en `counts.outsidePeriod` telt het weggelatene; het paneel toont
dat en geeft een eigen lege-staat-tekst. Default *Hele project* = geen venster,
byte-identiek aan vóór deze optie.

De render kent nu `PrintOptions.timeWindow`: de tijdas loopt exact van `from`
t/m `to` zonder de marge van 7/14 dagen, en omdat `Draw2D` geen clip kent
wordt de geometrie geklemd op het chartgebied — balken (ook gesplitste),
voortgang, speling, mijlpalen, samenvattingshaken (zonder haakje op een
afgekapt uiteinde) en baseline; een balk of ruit die helemaal buiten het
venster valt tekent niets, ook geen label. Zonder venster is de render
byte-identiek. Relatiepijlen worden niet geklemd: het venster wordt alleen
aangeboden op het resourcediagram, dat er geen tekent.

Instelling via dezelfde tolerante periodeparser als de tabelrapporten, twee
sleutels in 14 locales, gidsen nl+en (resourcediagram- en periodesectie).
Regressie: check-reports (venster van één dag, overlapregel, outsidePeriod,
leeg venster, alles-omvattend venster identiek), check-print-report (asbreedte
= vensterdagen × zoom, balk geklemd op de chartrand, geen balk/label buiten
het venster, tabelrij blijft, byte-identiek), settings-check (onbekende
preset en omgekeerd bereik ⇒ Hele project, round-trip), browserspec (eigen
bereik ⇒ één resource, tellingen incl. buiten de periode, terug naar Hele
project herstelt alles).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…manuvarkey punt 1)

Per taakrij onder een resourceband levert `computeResourceGanttRows` nu de
toewijzing van die band op die taak (`assignmentByRowKey`, per `rowKey`):
eenheden per dag opgeteld over records van dezelfde resource, de curve alleen
als alle records dezelfde hebben (afwezig telt als UNIFORM), anders null.
Rijen onder "(geen)" hebben geen entry.

De render tekent dat als twee tabelkolommen direct achter de naam
(`PrintOptions.assignmentColumns` + `rowAssignments` + `curveLabels`): eenheden
rechts uitgelijnd (geheel zonder decimalen, anders tot twee), de vertaalde
curve links en afgekort met `fitText`, een streepje bij verschillende curves;
kolomkoppen via `labels.tableHeaders.unitsPerDay`/`curve`. De tabel wordt
precies de twee kolombreedtes (45 + 75) breder; `buildPrintRows` hangt de
toewijzing aan `PrintRow.assignment`. Zonder de optie byte-identiek, ook mét
meegegeven `rowAssignments`. De preview-signatuur serialiseert de Map expliciet
(anders `{}`, dus geen herrender bij een gewijzigde inzet).

Optie `showAssignmentColumns` standaard aan (dit is de informatie waarvoor het
rapport wordt uitgedeeld), tolerante parser; drie sleutels in 14 locales
(twee kolomkoppen, één optielabel); curvenamen uit `common:resource.curve.*`;
gidsen nl+en; CLAUDE.md-rapportparagraaf voor de drie nieuwe opties.
Regressie: check-reports (optelling, UNIFORM-terugval, null bij verschillende
curves, entries exact voor de taakrijen onder resourcebanden), check-print-report
(tabelbreedte, celteksten per kolom, koppen, zonder optie byte-identiek),
settings-check, browserspec (standaard aan; uitzetten rastert opnieuw).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…ode van het resourcediagram (#113)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…staat, kolombreedte (#113)

Hyperkritische review op de drie punten van manuvarkey ("nee, nog niet"):

1. De Curve-kolom zei "Uniform" waar de app zelf "Contour" of "Geïmporteerde
   curve" zegt: de engine las alleen `assignment.curve`, terwijl de
   lastverdeling (`assignmentDayUnits`) en het eigenschappenpaneel drie lagen
   kennen. `RowAssignment.curve` is nu `RowCurve` (contour op de taak via
   `matchContoursToAssignments` > `curveValues` zonder OPS-vorm = 'imported'
   > `curve`, afwezig = UNIFORM); het paneel geeft de twee toestandslabels
   uit `task:properties.assignments.*` mee.
2. Met een tijdvenster kon een mijlpaalruit (en de baselineruit) op de eerste
   vensterdag bij lage zoom half over de tabel hangen: de zichtbaarheidstest
   was geen klem. Het middelpunt wordt nu binnen [tabelrand + size, chartrand
   − size] geklemd; de testrecorder legt gevulde paden vast en bewaakt dat
   niets in het chartgebied links van de tabelrand komt.
3. `emptyPeriod` wees naar de periode terwijl er wél taken in het venster
   stonden zonder toewijzing: nieuw `counts.inPeriod`, de melding komt alleen
   als er géén bladtaak meer in het venster is.
4. De default (kolommen aan) blijft — het resourcediagram is nog in geen
   release uitgeleverd, dus er is geen bestaand gedrag dat breekt — maar de
   gidsen nl+en zeggen nu expliciet dat de tabel breder en de tijdas smaller
   wordt, en wat *Contour*/*Geïmporteerde curve* betekent.
5. Gecomprimeerde as + venster zonder werkdag kleefde naar een datum buiten
   het venster: valt voor dat venster terug op de kalender-as.
6. Curve-kolom 75 → 92 px (pl/pt-labels pasten niet, gemeten op Inter).
7. De 3 px-minimumbreedte van een balk steekt niet meer over de chartrand.
8. Kleurvakken (resourcekleurmodus) worden op de ruwe tijdas verdeeld en per
   vak op het chartgebied geknipt, zodat een afgekapte balk de kleuren van
   het zichtbare stuk toont.
9. Relaties worden bij een venster nooit getekend (`showDeps && !windowed`)
   i.p.v. alleen per conventie.
10. Lege-staat-tekst gaat door `fitText`; gids: het getal achter een typeband
    telt taakrijen.

Regressie: check-reports (imported/contoured/OPS-vorm/contour-per-resource,
inPeriod), check-print-report (ruit binnen het chartgebied bij 4 px/dag,
minimumbreedte geklemd bij 1 px/dag, tabelbreedte +137).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
… curvetoestand-doc, contourkoppeling, lege-staat-wrap (#113)

Hyperkritische review ronde 2 ("ja, mits"):

- Curve-kolom 92 → 98 px: "Obciążony na początku"/"Zaimportowana krzywa" (pl)
  pasten op de echte Inter-metriek nog niet in 84 px netto.
- De moduledoc claimde "dezelfde drie lagen als de lastverdeling"; dat is
  onwaar (`assignmentDayUnits` verdeelt met `curveValues` óók naast een
  `curve`, en negeert een contour zonder periodes). De doc zegt nu wat het
  is: de weergaveregel van het eigenschappenpaneel, zodat rapport en paneel
  gelijk lopen; een gedeelde toestandshelper is een vervolgstap. Gids nl+en:
  "Geïmporteerde curve" alleen als het geen van de acht eigen vormen is, en
  de tijdas kan bij lange namen met afkappen uit bijna verdwijnen.
- Contourkoppeling op de volledige recordlijst per taak (ook records naar een
  onbekende resource), zoals `contourLookup` en het paneel — anders viel de
  legacy-terugval (`assignments.length === 1`) hier anders uit dan daar.
- Lege staat: woord-wrap (`wrapWords`) i.p.v. één afgekapte regel — de Duitse
  `emptyPeriod` kapte bij 100 % al halverwege de instructie af.
- Ruitklem alleen als het middelpunt zelf in de chart ligt (anders niet
  tekenen): een naar binnen geklemde baselineruit suggereerde een dag waarop
  de mijlpaal niet valt.
- Minimumbreedte van een balk bij een venster: naar binnen geschoven zoals de
  ruit i.p.v. afgeknepen tot sub-pixel; zonder venster ongewijzigd.
- Test: ruit-assertie eist `pts.length > 0` (was vacuüm vervulbaar), wrap-test
  op de lege staat, legacy-contour met een record naar een onbekende resource.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
De twee updater-specs faalden op CI (run 34869219752) op een 403 van
api.github.com — de onbevoegde Releases-API is op een gedeelde runner
rate-limited — en in een sandbox achter een proxy op
ERR_CERT_AUTHORITY_INVALID; beide als console.error, die de harness als
fout telt. De tests asserteren niets uit die vergelijking (de pure
functies staan in tests/planning/check-just-updated.ts), dus de route
antwoordt nu deterministisch met een lege lijst. Lokaal 2/2 groen, waar
dezelfde spec eerder in deze sandbox rood stond.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
@Nozzit
Nozzit merged commit f34f859 into main Sep 14, 2026
8 checks passed
Nozzit pushed a commit that referenced this pull request Sep 14, 2026
…kolommen laten vallen, weekendcijfers, getalnotatie, artifacts-beleid, middernacht-doc

Alle zes vervolgpunten die na PR #138 waren blijven liggen, in één keer:

- Eén weergaveregel voor de curvetoestand van een toewijzing
  (`src/engine/contour/curveState.ts`: `assignmentCurveState`,
  `contouredAssignmentIds`) die het eigenschappenpaneel én het resourcediagram
  delen; het verschil met de verdeelregel van `assignmentDayUnits` staat daar
  gedocumenteerd in plaats van op twee plekken herhaald.
- De toewijzingskolommen vallen automatisch weg zodra de tabel minder dan
  `MIN_CHART_WIDTH_PX` (240 px) tijdlijn per papierbreedte overlaat (lange
  taaknamen met afkappen uit); `RenderReportResult.assignmentColumnsDropped`,
  melding in het overzichtsblok, sleutel in 14 locales.
- Een tijdvenster zonder werkdag dat op de kalender-as terugvalt nummert nu ook
  de weekenddagen (anders stond er geen enkel dagcijfer).
- Eén getalnotatie voor alle rapporten (`src/utils/reportNumber.ts`): hoogstens
  twee decimalen, geen duizendtalscheiding, decimaalteken van de app-taal —
  tabelrapporten via `dd.num`/`dd.signed`, de eenhedenkolom via
  `PrintOptions.numberLocale`; zonder taal de neutrale punt (tests ongewijzigd).
- Artifacts-beleid vastgelegd: `artifacts/<onderwerp>/` = klein gecommit
  schermbewijs bij een PR, `qa/` = lokaal (CLAUDE.md, .gitignore).
- Gids nl+en: presets zonder statusdatum schuiven na middernacht een dag op;
  de kolommen kunnen wegvallen bij een brede naamkolom.

Regressie: check-print-report (weglaten bij 800 px naamkolom op A4 liggend,
niet bij de gewone; weekendcijfers 10/11 op een weekendvenster; "1,5" bij
numberLocale nl), check-reports (curvetoestand-helper, contourkoppeling,
getalnotatie nl/en/de/plus). Browserspecs resourcediagram, tabelrapporten,
contourdialoog en rapportopties groen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
Nozzit added a commit that referenced this pull request Sep 14, 2026
…kqmzu

Rapport: restpunten uit de reviews op #138 (curvetoestand, kolommen laten vallen, weekendcijfers, getalnotatie, artifacts-beleid)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants