PDF-export: tijdlijn-rail is geen doorlopende lijn — segmenten haken niet in op kaarten van variabele hoogte #1724

Closed
opened 2026-08-22 19:11:38 +00:00 by brenno · 0 comments
Owner

Wat is het probleem?

Bij de PDF-export van een documenttijdlijn loopt de verticale rail (de "ruggraat") niet als één doorlopende lijn van het eerste naar het laatste event. De lijn bestaat uit losse segmenten per event, en tussen events met kaarten van verschillende hoogte ontstaan zichtbare onderbrekingen. Op het scherm is de rail wel een ononderbroken lijn.

Hoe te reproduceren

  1. Maak een document met een tijdlijn waar events kaarten van verschillende hoogte hebben (bijv. één kort event en één lang event met veel tekst).
  2. Exporteer naar PDF.
  3. Vergelijk de tijdlijn in de PDF met de weergave op het scherm.

Verwacht gedrag

De verticale rail is een doorlopende lijn, net als op het scherm (lib/widgets/reader/parts/document_markdown_timeline.dart). De lijn verbindt alle bolletjes zonder onderbreking, ongeacht de hoogte van de individuele kaarten.

Werkelijk gedrag

De rail bestaat uit vaste segmenten per event (bovenste segment size * 0.8, bolletje-rij size * 0.86, onderste segment size * 3.1), met een totale vaste hoogte van ~4.76 * size. Omdat de Row CrossAxisAlignment.start gebruikt, rekt de rail-kolom niet mee met de kaart ernaast. Wanneer een kaart hoger is dan de vaste rail-hoogte, ontstaat een gap tussen het einde van het onderste segment en het begin van het bovenste segment van het volgende event.

Root cause

lib/services/pdf/document_pdf_timeline.dart, functie _event():

  • De Row op regel 46 gebruikt CrossAxisAlignment.start — de rail-kolom rekt niet mee met de kaart.
  • Het onderste segment (regels 99-108) heeft een vaste hoogte van size * 3.1 in plaats van de resterende ruimte te vullen.
  • Het bovenste segment (regels 68-76) heeft een vaste hoogte van size * 0.8.

Op het scherm (document_markdown_timeline.dart) lost hetzelfde probleem door:

  • IntrinsicHeight + Row met CrossAxisAlignment.stretch (regel 26-28) — de rail rekt mee met de kaart.
  • De rail is een Positioned met top: timelineFirst ? 23 : 0 en bottom: timelineLast ? null : 0 (regels 39-47) — hij vult de volledige hoogte van elk event en verbindt zo met het volgende.

Voorgestelde oplossing

Vervang het onderste segment door een Expanded widget zodat het de resterende ruimte vult, en gebruik CrossAxisAlignment.stretch op de Row (of een vergelijkbare constructie die de rail-kolom de volledige kaarthoogte laat vullen). Het bovenste segment van het volgende event begint dan direct waar het onderste segment van het vorige event eindigt, waardoor de lijn doorloopt.

Voorbeeld

In de bijgevoegde PDF (Incidentrapport RWM) is de tijdlijn te zien op pagina's 7-12. De rail toont duidelijke onderbrekingen tussen events met kaarten van verschillende hoogte.

Labels

bug, accepted

## Wat is het probleem? Bij de PDF-export van een documenttijdlijn loopt de verticale rail (de "ruggraat") niet als één doorlopende lijn van het eerste naar het laatste event. De lijn bestaat uit losse segmenten per event, en tussen events met kaarten van verschillende hoogte ontstaan zichtbare onderbrekingen. Op het scherm is de rail wel een ononderbroken lijn. ## Hoe te reproduceren 1. Maak een document met een tijdlijn waar events kaarten van verschillende hoogte hebben (bijv. één kort event en één lang event met veel tekst). 2. Exporteer naar PDF. 3. Vergelijk de tijdlijn in de PDF met de weergave op het scherm. ## Verwacht gedrag De verticale rail is een doorlopende lijn, net als op het scherm (`lib/widgets/reader/parts/document_markdown_timeline.dart`). De lijn verbindt alle bolletjes zonder onderbreking, ongeacht de hoogte van de individuele kaarten. ## Werkelijk gedrag De rail bestaat uit vaste segmenten per event (bovenste segment `size * 0.8`, bolletje-rij `size * 0.86`, onderste segment `size * 3.1`), met een totale vaste hoogte van `~4.76 * size`. Omdat de `Row` `CrossAxisAlignment.start` gebruikt, rekt de rail-kolom niet mee met de kaart ernaast. Wanneer een kaart hoger is dan de vaste rail-hoogte, ontstaat een gap tussen het einde van het onderste segment en het begin van het bovenste segment van het volgende event. ## Root cause `lib/services/pdf/document_pdf_timeline.dart`, functie `_event()`: - De `Row` op regel 46 gebruikt `CrossAxisAlignment.start` — de rail-kolom rekt niet mee met de kaart. - Het onderste segment (regels 99-108) heeft een vaste hoogte van `size * 3.1` in plaats van de resterende ruimte te vullen. - Het bovenste segment (regels 68-76) heeft een vaste hoogte van `size * 0.8`. Op het scherm (`document_markdown_timeline.dart`) lost hetzelfde probleem door: - `IntrinsicHeight` + `Row` met `CrossAxisAlignment.stretch` (regel 26-28) — de rail rekt mee met de kaart. - De rail is een `Positioned` met `top: timelineFirst ? 23 : 0` en `bottom: timelineLast ? null : 0` (regels 39-47) — hij vult de volledige hoogte van elk event en verbindt zo met het volgende. ## Voorgestelde oplossing Vervang het onderste segment door een `Expanded` widget zodat het de resterende ruimte vult, en gebruik `CrossAxisAlignment.stretch` op de `Row` (of een vergelijkbare constructie die de rail-kolom de volledige kaarthoogte laat vullen). Het bovenste segment van het volgende event begint dan direct waar het onderste segment van het vorige event eindigt, waardoor de lijn doorloopt. ## Voorbeeld In de bijgevoegde PDF (Incidentrapport RWM) is de tijdlijn te zien op pagina's 7-12. De rail toont duidelijke onderbrekingen tussen events met kaarten van verschillende hoogte. ## Labels bug, accepted
brenno 2026-08-22 19:53:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1724
No description provided.