Skip to content

Rapport: resourcediagram — de Gantt-afdruk per resource, met een blad per persoon (#113) - #132

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

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

Conversation

@Nozzit

@Nozzit Nozzit commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

What and why

Fixes #113. De melder (gfayat) wil een grafisch "wie doet wat, en wanneer"-overzicht dat hij kan afdrukken — als overlegdocument én als los vel per persoon — en liefst als eigen rapporttype, omdat "Gantt groeperen op resource + Volg weergave" meerdere handelingen kost en de schermweergave verbouwt. Overbelasting in rood noemde hij secundair; die zit er bewust niet in.

Nieuw rapporttype Resourcediagram (resourceGantt) op het Rapport-tabblad:

  • Dezelfde Gantt-render (preview, raster- én vector-PDF), maar de rijenbron is de pure module src/engine/reports/resourceGantt.ts (computeResourceGanttRows, invoer een ReportContext-subset): per resource-identiteit een band, daaronder zijn bladtaken op start. Naam is alleen het label: resources met (volgens de collator) gelijke naam — ook Jan/jan/Jan — krijgen Jan #1 / jan #2, een naamloze een surrogaat #<positie> dat door dezelfde duplicaatpas gaat. Bandvolgorde via één Intl.Collator op de app-taal (i18n.language), nooit de OS-taal van de afdrukker — zelfde vel, zelfde bladnummering op elke machine. Bewust níét de schermgroepering computeViewRows: die bandt op naam en zou twee gelijknamige medewerkers op één vel zetten. Een taak met twee resources staat onder beide banden; dubbele toewijzing = één rij (de telling volgt de records, zoals Resourcetoewijzingen); onbekende resource = "zonder resource".
  • Optie Elke resource op een nieuwe pagina (blad per persoon): PrintOptions.pageBreakBeforeGroupsRenderReportResult.forcedBreakOffsets → nieuw forcedBreakOffsetsPx in tileLayout.computeTileLayout. Een gedwongen positie wint zonder de MIN_BREAK_FILL-vulgraaddrempel (een resource met één taak krijgt bewust een bijna leeg vel); een gedwongen positie die niet op de pagina past gedraagt zich als een gewone toegestane positie. Beide pagineerders (paginate.ts, paginateVector.ts) geven het door. Zonder de optie is de tegeling byte-identiek.
  • Optie Taken zonder resource meenemen: de "(geen)"-band als laatste.
  • Alle Gantt-instellingen gelden, op twee na: Volg weergave (de rijen komen niet van het scherm) en Afhankelijkheden — een taak kan onder meerdere banden staan en pijlen zouden bij "blad per persoon" van het vel af lopen; reportTypeDrawsRelations() (reportSettings) is het ene predicaat dat showDeps forceert én het vinkje verbergt. Samenvattingsblok telt resources / toewijzingen / zonder resource (die laatste telt ook mijlpalen en hammocks, want die worden getekend — anders dan het tabelrapport Resourcetoewijzingen; staat in de gids); zonder toewijzingen zegt de preview dat i.p.v. "geen taken" (en bij een leeg project gewoon "geen taken"); exportsuffix -resourcediagram.pdf. isGanttReportType() bundelt de twee Gantt-achtige typen in ReportPanel.
  • Opties persistent in reportSettings.resourceGantt (met tolerante parser, zoals de rest). previewOptionsSignature serialiseert rows als structuur (sleutel/label/diepte) i.p.v. volledige Task-objecten per toewijzing.

Schermbewijs in artifacts/resourcediagram/ (zelfde conventie als artifacts/tabel-overhaul).

Hyperkritische reviews (subagent, Opus), twee rondes. Ronde 1 (verwerkt in 786f031): banden op naam i.p.v. identiteit; relatiepijlen op de verkeerde bandkopie + afgeknipt; tellingen ≠ Resourcetoewijzingen; naamloze resource ⇒ taken stil weg; verkeerde lege-staat-tekst; gids it/ar-label; gids beloofde "relaties onverkort"; testgaten incl. de vector-tak; signatuur-serialisatie; mapcontract. Ronde 2 ("ja, mits", verwerkt in 1cf581b): bandvolgorde hing aan de host-locale (N1); Jan/jan zonder volgnummer maar wél gelijk gesorteerd (N5); surrogaat #2 botst met een letterlijke "#2" (N4); showDeps-forcering op twee losse plekken (N6); gids beweerde onwaar dat verzameltaken nooit een toewijzing hebben — importeurs maken die wél, en zo'n toewijzing wordt hier niet getoond (N2, 14 gidsen); "Toewijzingen" telde rijen i.p.v. records (N8); dode export/duplicaat-helper (N7, N9); ja/ko-dubbelzin en nl/en-formulering (N10, N11). Buiten dit diff, opgelost in #135: de voet met legenda stond bij élke meerpagina-Gantt-afdruk alleen op het laatste vel, en het vaste "Pagina 1 van 1" erin (N3) — #135 maakt de voet een herhaalbaar blok en haalt het nepnummer weg.

How it was verified

  • npm run verify green — alle onderdelen lokaal gedraaid op de met main samengevoegde boom: typecheck, lint, planning (alle batterijen + tijdzone-matrix), library, mcp, dev-server, verify:examples, verify:docs (34 artikelen × 14 talen), verify:i18n, store-/gantt-boundaries, cycles, en de browsersuite. Eén kanttekening bij die laatste: tests/browser/just-updated-dialog.spec.ts faalt in deze sandbox op console.error: Failed to load resource: net::ERR_CERT_AUTHORITY_INVALID — Chromium vertrouwt de CA van de uitgaande proxy hier niet bij het ophalen van de GitHub-release-info (releaseInfo.ts), en de harness telt elke console.error als fout. Dit diff raakt geen updater-/netwerkcode; CI (test-job, echt netwerk) is op 786f031 groen inclusief die spec.
  • Nieuwe regressie: tests/planning/check-reports.ts (banden op id; gelijknamig ⇒ twee banden met unieke sleutels; hoofdletter-/spatie-/accentvarianten alle genummerd en bij elkaar gesorteerd; surrogaat naast letterlijke "feat: debug terminal overlay + timescale dropdown fix #2"; bandvolgorde per app-taal — en ⇒ Älg vóór Zorg, sv ⇒ erna; dubbele/onbekende toewijzing; "(geen)" alleen op verzoek; geen verzameltaken; leeg project), tests/planning/check-print-report.ts (gedwongen posities uit de render liggen op rijgrenzen; drie banden ⇒ drie pagina's terwijl ze samen op één passen — ook zonder kopherhaling, in actual en met de tijdlijn over 2 pagina's; dunne pagina toegestaan; verre gedwongen positie later gehonoreerd; lege lijst byte-identiek), nieuw tests/planning/check-report-resource-gantt-setting.ts (defaults, round-trip, tolerantie, het relatiepredicaat), tests/browser/resource-gantt-report.spec.ts (rapporttype kiezen, samenvatting 2/3/1, geen relatie-/volg-weergave-optie, preview 1 → 2 → 3 pagina's via de twee opties, export-suffix, en de geëxporteerde vector-PDF telt 3 pagina's via pdf-lib).
  • Met de hand in Chromium bekeken (zie de screenshots in artifacts/resourcediagram/).

Does this touch

  • Project data — n.v.t.: rapportopties zijn app-voorkeuren (ops-reportSettings), geen projectdata.
  • Scheduling logic — n.v.t.: de solver wordt niet geraakt; de rekenmodule is puur en getest in tests/planning/check-reports.ts.
  • User-visible text — via t(...); reportType.resourceGantt + resourceGantt.* in alle 14 report.json-locales (verify:i18n groen).
  • @tauri-apps/* — n.v.t.

Documentation

  • public/docs/{nl,en}/gids-rapporten-printen.md: sectie Resourcediagram (incl. de twee uitzonderingen, banden-per-identiteit, de telling, verzameltaak-toewijzingen uit een import, de voet op het laatste vel — tot Rapport: voet met legenda op elke pagina (#113, nabespreking) #135), intro (elf rapporttypen), leerlijst en praktijkbullet. De 12 vertaalde gidsen hebben dezelfde sectie met dezelfde uitzonderingen en de verzameltaak-correctie; de fijnere nl/en-nuances (surrogaatlabel, telverschil, voet) volgen de maandelijkse vertaalronde.
  • CLAUDE.md: rapportparagraaf (elf typen, banden op identiteit, relaties uit, de forced-break-keten).
  • docs/CHANGELOG.md bewust niet: die wordt alleen bij een release bijgewerkt.

🤖 Generated with Claude Code

https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq

… per persoon (issue #113)

Nieuw rapporttype `resourceGantt` naast de Gantt-afdruk: dezelfde render, maar de
rijenbron is `computeResourceGanttRows` (src/engine/reports/resourceGantt.ts) — per
resource een band, daaronder zijn bladtaken op start, via dezelfde groepeerpijplijn
als het scherm (`computeViewRows`), dus een taak met twee resources staat onder beide
banden. De melder wilde "wie doet wat, en wanneer" grafisch, als eigen tabblad, zonder
eerst de schermweergave te groeperen.

Twee opties, bewaard in `reportSettings.resourceGantt`:
- Elke resource op een nieuwe pagina — `PrintOptions.pageBreakBeforeGroups` levert
  `RenderReportResult.forcedBreakOffsets`; `tileLayout` kent nu `forcedBreakOffsetsPx`,
  waar een gedwongen positie zonder vulgraaddrempel wint (een resource met één taak
  krijgt bewust een bijna leeg vel). Raster- en vector-pagineerder geven het door.
- Taken zonder resource meenemen — de "(geen)"-band als laatste.

Alle Gantt-opties gelden onverkort; alleen Volg weergave verdwijnt bij dit type.
Samenvatting telt resources/toewijzingen/zonder resource; lege staat zegt dat er nog
geen toewijzingen zijn; exportsuffix `-resourcediagram.pdf`. Overbelasting in rood
op de bandrij bewust niet (secundair volgens de melder).

Regressie: check-reports.ts (rijen, tellingen, dubbele resource, (geen)-band),
check-print-report.ts (gedwongen posities in render en tegeling) en
tests/browser/resource-gantt-report.spec.ts. i18n in 14 locales, gids nl+en plus de
sectie in de 12 vertaalde gidsen (verify:docs eist kopstructuurpariteit), CLAUDE.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
… blad per resource

Twee Chromium-screenshots van de gemergede branch, zoals artifacts/tabel-overhaul:
de live preview met de banden Guillaume/Noam/Torenkraan (Casco onder twee resources),
en pagina 2 met "Elke resource op een nieuwe pagina" aan — één vel voor Noam.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…pijlen (review op #132)

Bevindingen van de hyperkritische review verwerkt:

1. Banden op resource-IDENTITEIT i.p.v. naam. `computeViewRows` bandt resources op naam
   (`resourceNames`), zodat twee gelijknamige medewerkers één uitdeelvel kregen, hun gedeelde
   taak twee keer onder dezelfde band stond (identieke rowKeys) en `counts.resources` loog.
   `resourceGantt.ts` bouwt zijn rijen nu zelf: per resource-id een band, naam als label,
   gelijknamigen `Jan #1`/`Jan #2`, naamloze een surrogaat `#<positie>` i.p.v. stil in de
   verborgen "(geen)"-band te verdwijnen (bevinding 4); volgorde cijfer-/taalbewust en
   hoofdletterongevoelig, gelijk ⇒ projectvolgorde. Invoer is nu een ReportContext-subset
   (bevinding 11); dubbele toewijzing = één rij; onbekende resource = zonder resource.
2. Relaties uit én verborgen bij dit type: `rowIndexOf` in de printrender ankert een taak die
   onder n banden staat op de laatste kopie, en bij "blad per resource" liepen de pijlen de
   bladrand af. `showDeps` wordt voor `resourceGantt` geforceerd op false, de checkbox verdwijnt
   (zoals Volg weergave).
3. Tellingen versus Resourcetoewijzingen: resources nu op id; het verschil in "zonder resource"
   (dit rapport telt mijlpalen/hammocks mee omdat het ze tekent) staat in de gids en het type.
6. Leeg project ⇒ gewone "geen taken"-melding i.p.v. "wijs eerst resources toe".
7. Gids it/ar: "(geen)"-label gelijkgetrokken met task:structure.none.
8. Gidsen (14 talen): "relaties gelden onverkort" weg; banden-per-identiteit en de twee
   uitzonderingen benoemd; nl/en ook de telling en de voet-op-het-laatste-vel.
10. `previewOptionsSignature` serialiseert `rows` als structuur (sleutel/label/diepte) i.p.v.
    volledige Task-objecten per toewijzing.

Regressie: check-reports.ts (gelijknamig ⇒ twee banden met unieke sleutels, naamloos ⇒ surrogaat,
dubbele/onbekende toewijzing, bandvolgorde, leeg project), check-print-report.ts (gedwongen
breken zonder kopherhaling, in 'actual' en met tijdlijn over 2 pagina's), nieuw
check-report-resource-gantt-setting.ts (defaults, round-trip, tolerantie), browserspec: geen
relatie-/volg-weergave-optie zichtbaar en de geëxporteerde vector-PDF telt 3 pagina's (pdf-lib).

Niet gedaan (pre-existing, aparte klus): de voet met legenda staat bij elke meerpagina-afdruk
alleen op het laatste vel — nu in de gids vermeld.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
…ollator, één relatiepredicaat (review ronde 2)

Tweede hyperkritische review op #132 ("ja, mits"), verwerkt:

N1  De bandvolgorde hing aan de host-locale (`localeCompare(b, undefined, …)`): dezelfde
    planning gaf op een Zweedse machine een andere bladnummering dan op een Nederlandse.
    `computeResourceGanttRows` krijgt nu `opts.locale` (de app-taal, `i18n.language`); één
    `Intl.Collator` voor sortering én gelijknaamdetectie. Test: en ⇒ Älg vóór Zorg, sv ⇒ erna.
N5  `Jan`/`jan`/` Jan ` kregen geen volgnummer maar sorteerden wél als gelijk. Duplicaten worden
    nu met dezelfde collator (sensitivity base) gegroepeerd ⇒ `Jan #1`, `jan #2`, `Jan #3`.
N4  Het surrogaat `#n` voor een naamloze resource deelt de naamruimte met een resource die
    letterlijk "#2" heet; surrogaten gaan nu door dezelfde duplicaatpas (`#2 #1`, `#2 #2`).
N6  `showDeps`-forcering en verborgen vinkje hangen aan één predicaat,
    `reportTypeDrawsRelations()` in reportSettings, headless bewaakt (plus: showDeps staat
    standaard aan, dus de forcering is dragend).
N8  `counts.assignments` telt records i.p.v. rijen — dezelfde telling als Resourcetoewijzingen.
N9  `startOf` weg; `taskStart` uit reportCommon.
N7  `RESOURCE_GANTT_NONE_KEY` niet meer geëxporteerd; `resourceBandLabels` blijft publiek en
    wordt nu rechtstreeks getest.
N2  Gids (14 talen): "verzameltaken worden nooit toegewezen" was onwaar — MSPDI/MPP-importeurs
    maken zulke toewijzingen wél; nu: "een toewijzing op een verzameltaak (uit een import) wordt
    hier niet getoond". Module-commentaar idem.
N10 ja/ko: dubbele zin over "rijen niet van het scherm" weg.
N11 nl/en: de reden voor "geen relaties" eerlijker geformuleerd (kan onder meerdere banden
    staan; pijlen zouden bij blad per resource van het vel lopen).

N3 (het vaste "Pagina 1 van 1" in de voet) zit in #135, samen met de voet op elke pagina.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
@Nozzit
Nozzit merged commit a195d68 into main Sep 14, 2026
8 checks passed
pull Bot pushed a commit to pepe57/open-planner-studio that referenced this pull request Sep 14, 2026
… nabespreking)

De Gantt-afdruk tekent één voetstrook (projectnaam, afdrukdatum, legenda, merk) onder de laatste
rij; de pagineerder herhaalde alleen de kop, dus bij een meerpagina-afdruk stond de legenda
uitsluitend op de laatste pagina. Met "een blad per persoon" (OpenAEC-Foundation#132) is dat geen randgeval meer:
een uitgedeeld vel zonder legenda is onleesbaar (hyperkritische review op OpenAEC-Foundation#132, bevinding 5).

De voet is nu, net als de kop, een herhaalbaar blok:
- `RenderReportResult.footerHeight` (de render meldt zijn voethoogte, schaalt mee met de
  rapport-lettergrootte; tabelrenders en de lege staat hebben er geen);
- `tileLayout.computeTileLayout` kent `repeatFooterHeightPx`: de body loopt van onder de kop tot
  boven de voet (`repeatFooterSrcY`), elke pagina houdt onderaan het printgebied `footerTopPt`
  vrij; zonder de optie byte-identiek, met dezelfde degeneratievangnetten als de kop;
- raster-pagineerder, vector-pagineerder én preview tekenen de strook per pagina uit hetzelfde
  bronvenster (in de vector-tak komt de voettekst daardoor per pagina mee, zoals de koptekst);
- instelling `repeatFooter` (standaard aan, zoals de kop) in ops-reportSettings, checkbox naast
  "Kop op elke pagina herhalen", 14 locales, gids nl+en.

Het vaste "Pagina 1 van 1" in de voet is weg: de render kent het paginatotaal niet en het zou nu
op elke pagina zo staan; het echte "n / totaal" drukken de pagineerders al in de ondermarge.

Regressie: check-print-report.ts (voethoogte, tegeling met/zonder voet byte-identiek, laatste
body-tegel eindigt boven de voet, rijgrenzen blijven, degeneratie, zonder kop en in 'actual',
samen met blad-per-resource, geen nep-paginanummer), nieuw check-report-footer-setting.ts,
browserspec report-footer.spec.ts (telt per PDF-pagina de XObject-tekeningen: 3 mét voet, 2 zonder;
preview rastert opnieuw). report-preview-performance.spec.ts: fixture 260 → 240 rijen, want het
paginatotaal stond precies op de previewcachegrens en de voet kost per pagina één strook body.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014zosxbSXvi3YSGmeN1MsQq
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.

Pouvoir imprimer un diagramme des ressources

2 participants