PDF-export toont tijdlijn als platte genummerde lijst, niet als visuele tijdlijn #1712

Closed
opened 2026-08-22 09:14:09 +00:00 by brenno · 3 comments
Owner

Probleem

Bij het exporteren van een rapportage naar PDF wordt een tijdlijn met de <!-- timeline -->-marker niet als visuele tijdlijn getekend, maar als een platte genummerde lijst met vetgedrukte tijdaanduidingen. Op het scherm (in de documentweergave) wél, in de PDF niet.

Zie bijv. het incidentrapport incidentrapport-rwm-onjuiste-maprechten-q-schijf-2026-07-31.md, sectie 3 "Feitenrelaas en tijdlijn": op het scherm verschijnt een tijdlijn met verticale rail, bolletjes, horizontale verbindingen naar kaarten met afgeronde hoeken en schaduw, en een eindmarkering. In de PDF-export staat dezelfde inhoud als een gewone genummerde lijst:

1. 12:02  Persoon A probeert Persoon B telefonisch te bereiken.
2. 12:50  Persoon C meldt aan Persoon A dat de mappen voor iedereen zichtbaar zijn.
3. 12:54  In de interne appgroep wordt gemeld...

Dat is semantisch dichterbij dan de vorige vorm (een kale tabel, #1680), maar visueel is het platte tekst — de tijdlijn-identiteit gaat verloren.

Reproductie

  1. Open een document met een <!-- timeline -->-marker gevolgd door een tijdlijntabel (bijv. het incidentrapport hierboven).
  2. Exporteer naar PDF (Document → Exporteren → PDF).
  3. Vergelijk de tijdlijn-sectie in de PDF met de weergave op het scherm.

Verwacht gedrag

De PDF toont de tijdlijn met een visuele rail, bolletjes per gebeurtenis, en kaarten — vergelijkbaar met de documentweergave op het scherm (_TimelineEventView in document_markdown_timeline.dart), geïnterpreteerd binnen de mogelijkheden van package:pdf.

Huidig gedrag

De PDF toont een genummerde lijst (PdfListBlock met ordered: true) met vetgedrukte tijdaanduiding per punt. Dit was de oplossing voor #1680, die de tijdlijn van een kale tabel naar "de dichtstbijzijnde bestaande blokvorm" bracht — een tussenstap, niet het einddoel.

Technische analyse

Wat er nu gebeurt

In lib/services/pdf/markdown_to_pdf_blocks.dart (functie _protectTimelines, regels 211-253) wordt een gemarkeerde tijdlijn herkend en omgezet in een PdfListBlock(items, ordered: true) met per punt een alinea met vetgedrukte marker + gebeurtenistekst + optionele metadata. De renderer tekent dat als een gewone genummerde lijst.

De blok-typen in lib/services/pdf/document_pdf_blocks.dart kennen geen toegewijd tijdlijn-blok: PdfHeadingBlock, PdfParagraphBlock, PdfListBlock, PdfQuoteBlock, PdfCodeBlock, PdfTableBlock, PdfImageBlock, PdfPageBreakBlock, PdfTocBlock, PdfVerbatimBlock. De tijdlijn wordt in een PdfListBlock geperst omdat dat de dichtstbijzijnde bestaande vorm is.

Wat op het scherm gebeurt

lib/widgets/reader/parts/document_markdown_timeline.dart (_TimelineEventView) tekent per gebeurtenis:

  • Een verticale rail (2px lijn) met per gebeurtenis een bolletje (16px cirkel met rand en schaduw)
  • Een horizontale verbinding van bolletje naar kaart
  • Een kaart met afgeronde hoeken (12px), subtiele achtergrondkleur, rand en schaduw
  • De tijdaanduiding links in de rail, vet en rechts uitgelijnd
  • Een optionele koptekst boven de gebeurtenis (kleine caps)
  • Een metadata-pilletje onder de gebeurtenis
  • Een eindmarkering (┷) onder het laatste bolletje

Oplossingsrichting

  1. Nieuw blok-type: Voeg een PdfTimelineBlock toe aan document_pdf_blocks.dart die de gestructureerde tijdlijn-data draagt (per gebeurtenis: marker, event-tekst als PdfSpans, optionele metadata met koptekst, en de tabel-headers voor marker/event/metadata). Dit maakt de beslissing toetsbaar: een test leest de blokken en ziet een PdfTimelineBlock in plaats van een PdfListBlock.

  2. Produceren in de converter: Laat _protectTimelines in markdown_to_pdf_blocks.dart een PdfTimelineBlock produceren in plaats van een PdfListBlock. De data is al beschikbaar via analyzeMarkedTimeline — alleen de uitvoervorm verandert.

  3. Renderer: Voeg een tak voor PdfTimelineBlock toe in de PDF-renderer (document_pdf_renderer.dart / document_pdf_widgets.dart) die met package:pdf-primitieven een visuele tijdlijn tekent:

    • Een verticale rail (lijn) langs de linkerzijde
    • Per gebeurtenis een bolletje (cirkel) op de rail
    • Een kaart (afgeronde rechthoek met subtiele achtergrond) rechts van de rail
    • De tijdaanduiding links in de railkolom, vet
    • Optioneel: horizontale verbinding van bolletje naar kaart, eindmarkering

    package:pdf ondersteunt lijnen, cirkels, afgeronde rechthoeken en schaduwen, dus dit is haalbaar. De vorm kan eenvoudiger zijn dan op het scherm (bijv. zonder schaduw of met een dunmere rail) zolang de tijdlijn-identiteit behouden blijft.

  4. Test: Een eenheidstest die verifieert dat _protectTimelines een PdfTimelineBlock oplevert (geen PdfListBlock), en een render-integratietest die controleert dat de PDF een tijdlijn-structuur bevat en niet een genummerde lijst.

Scope en grenzen

  • Dit raakt alleen de PDF-export. De LaTeX-export (markdown_to_latex.dart) gebruikt een description-lijst en valt buiten dit issue — LaTeX heeft zijn eigen typografische conventies.
  • Het bestandsformaat (Markdown met <!-- timeline -->-marker) verandert niet.
  • De bewaker-stap: dit voegt een nieuw PdfBlock-subtype toe aan een interne tussenvorm, raakt geen bestandsformaat, opslag, afhankelijkheid of publieke belofte. Het brengt de PDF-export in lijn met wat de documentweergave op het scherm al belooft.

Relatie met #1680

#1680 loste op dat de PDF een tijdlijn als kale tabel tekende. De oplossing was een genummerde lijst — "de dichtstbijzijnde bestaande blokvorm". Dit issue is de volgende stap: een toegewijd tijdlijn-blok met visuele rendering.

## Probleem Bij het exporteren van een rapportage naar PDF wordt een tijdlijn met de `<!-- timeline -->`-marker niet als visuele tijdlijn getekend, maar als een platte genummerde lijst met vetgedrukte tijdaanduidingen. Op het scherm (in de documentweergave) wél, in de PDF niet. Zie bijv. het incidentrapport `incidentrapport-rwm-onjuiste-maprechten-q-schijf-2026-07-31.md`, sectie 3 "Feitenrelaas en tijdlijn": op het scherm verschijnt een tijdlijn met verticale rail, bolletjes, horizontale verbindingen naar kaarten met afgeronde hoeken en schaduw, en een eindmarkering. In de PDF-export staat dezelfde inhoud als een gewone genummerde lijst: ``` 1. 12:02 Persoon A probeert Persoon B telefonisch te bereiken. 2. 12:50 Persoon C meldt aan Persoon A dat de mappen voor iedereen zichtbaar zijn. 3. 12:54 In de interne appgroep wordt gemeld... ``` Dat is semantisch dichterbij dan de vorige vorm (een kale tabel, #1680), maar visueel is het platte tekst — de tijdlijn-identiteit gaat verloren. ## Reproductie 1. Open een document met een `<!-- timeline -->`-marker gevolgd door een tijdlijntabel (bijv. het incidentrapport hierboven). 2. Exporteer naar PDF (Document → Exporteren → PDF). 3. Vergelijk de tijdlijn-sectie in de PDF met de weergave op het scherm. ## Verwacht gedrag De PDF toont de tijdlijn met een visuele rail, bolletjes per gebeurtenis, en kaarten — vergelijkbaar met de documentweergave op het scherm (`_TimelineEventView` in `document_markdown_timeline.dart`), geïnterpreteerd binnen de mogelijkheden van `package:pdf`. ## Huidig gedrag De PDF toont een genummerde lijst (`PdfListBlock` met `ordered: true`) met vetgedrukte tijdaanduiding per punt. Dit was de oplossing voor #1680, die de tijdlijn van een kale tabel naar "de dichtstbijzijnde bestaande blokvorm" bracht — een tussenstap, niet het einddoel. ## Technische analyse ### Wat er nu gebeurt In `lib/services/pdf/markdown_to_pdf_blocks.dart` (functie `_protectTimelines`, regels 211-253) wordt een gemarkeerde tijdlijn herkend en omgezet in een `PdfListBlock(items, ordered: true)` met per punt een alinea met vetgedrukte marker + gebeurtenistekst + optionele metadata. De renderer tekent dat als een gewone genummerde lijst. De blok-typen in `lib/services/pdf/document_pdf_blocks.dart` kennen geen toegewijd tijdlijn-blok: `PdfHeadingBlock`, `PdfParagraphBlock`, `PdfListBlock`, `PdfQuoteBlock`, `PdfCodeBlock`, `PdfTableBlock`, `PdfImageBlock`, `PdfPageBreakBlock`, `PdfTocBlock`, `PdfVerbatimBlock`. De tijdlijn wordt in een `PdfListBlock` geperst omdat dat de dichtstbijzijnde bestaande vorm is. ### Wat op het scherm gebeurt `lib/widgets/reader/parts/document_markdown_timeline.dart` (`_TimelineEventView`) tekent per gebeurtenis: - Een verticale rail (2px lijn) met per gebeurtenis een bolletje (16px cirkel met rand en schaduw) - Een horizontale verbinding van bolletje naar kaart - Een kaart met afgeronde hoeken (12px), subtiele achtergrondkleur, rand en schaduw - De tijdaanduiding links in de rail, vet en rechts uitgelijnd - Een optionele koptekst boven de gebeurtenis (kleine caps) - Een metadata-pilletje onder de gebeurtenis - Een eindmarkering (┷) onder het laatste bolletje ### Oplossingsrichting 1. **Nieuw blok-type**: Voeg een `PdfTimelineBlock` toe aan `document_pdf_blocks.dart` die de gestructureerde tijdlijn-data draagt (per gebeurtenis: marker, event-tekst als `PdfSpan`s, optionele metadata met koptekst, en de tabel-headers voor marker/event/metadata). Dit maakt de beslissing toetsbaar: een test leest de blokken en ziet een `PdfTimelineBlock` in plaats van een `PdfListBlock`. 2. **Produceren in de converter**: Laat `_protectTimelines` in `markdown_to_pdf_blocks.dart` een `PdfTimelineBlock` produceren in plaats van een `PdfListBlock`. De data is al beschikbaar via `analyzeMarkedTimeline` — alleen de uitvoervorm verandert. 3. **Renderer**: Voeg een tak voor `PdfTimelineBlock` toe in de PDF-renderer (`document_pdf_renderer.dart` / `document_pdf_widgets.dart`) die met `package:pdf`-primitieven een visuele tijdlijn tekent: - Een verticale rail (lijn) langs de linkerzijde - Per gebeurtenis een bolletje (cirkel) op de rail - Een kaart (afgeronde rechthoek met subtiele achtergrond) rechts van de rail - De tijdaanduiding links in de railkolom, vet - Optioneel: horizontale verbinding van bolletje naar kaart, eindmarkering `package:pdf` ondersteunt lijnen, cirkels, afgeronde rechthoeken en schaduwen, dus dit is haalbaar. De vorm kan eenvoudiger zijn dan op het scherm (bijv. zonder schaduw of met een dunmere rail) zolang de tijdlijn-identiteit behouden blijft. 4. **Test**: Een eenheidstest die verifieert dat `_protectTimelines` een `PdfTimelineBlock` oplevert (geen `PdfListBlock`), en een render-integratietest die controleert dat de PDF een tijdlijn-structuur bevat en niet een genummerde lijst. ### Scope en grenzen - Dit raakt alleen de PDF-export. De LaTeX-export (`markdown_to_latex.dart`) gebruikt een `description`-lijst en valt buiten dit issue — LaTeX heeft zijn eigen typografische conventies. - Het bestandsformaat (Markdown met `<!-- timeline -->`-marker) verandert niet. - De bewaker-stap: dit voegt een nieuw `PdfBlock`-subtype toe aan een interne tussenvorm, raakt geen bestandsformaat, opslag, afhankelijkheid of publieke belofte. Het brengt de PDF-export in lijn met wat de documentweergave op het scherm al belooft. ## Relatie met #1680 #1680 loste op dat de PDF een tijdlijn als kale tabel tekende. De oplossing was een genummerde lijst — "de dichtstbijzijnde bestaande blokvorm". Dit issue is de volgende stap: een toegewijd tijdlijn-blok met visuele rendering.
Author
Owner

Ook voor andere modaliteiten (HTML en LaTeX) is de weergave belangrijk. Dit is de kernfeature immers.

Ook voor andere modaliteiten (HTML en LaTeX) is de weergave belangrijk. Dit is de kernfeature immers.
Author
Owner

Uit de bredere scherm/exportcontrole blijkt dat de doorlopende HTML-tijdlijn al een rail, bolletjes en kaarten heeft, maar nog achterloopt op de huidige schermweergave uit #1711:

  • de eerste twee kolomkoppen verdwijnen (Fase en Besluit in een tabel Fase | Besluit | Eigenaar); alleen de derde kop wordt als metadatalabel gebruikt;
  • de horizontale verbinding van bolletje naar kaart ontbreekt;
  • de eindmarkering onder de laatste gebeurtenis ontbreekt.

Dit hoort bij dezelfde tijdlijnpariteit als de PDF in dit issue en krijgt daarom geen duplicerend los ticket. Neem bij de oplossing één gedeeld rendercontract als bron en borg PDF én doorlopende HTML tegen dezelfde kolomkoppen en visuele identiteit. LaTeX blijft een bewerkbare bronexport en valt buiten deze visuele eindproductscope.

Uit de bredere scherm/exportcontrole blijkt dat de doorlopende HTML-tijdlijn al een rail, bolletjes en kaarten heeft, maar nog achterloopt op de huidige schermweergave uit #1711: - de eerste twee kolomkoppen verdwijnen (`Fase` en `Besluit` in een tabel `Fase | Besluit | Eigenaar`); alleen de derde kop wordt als metadatalabel gebruikt; - de horizontale verbinding van bolletje naar kaart ontbreekt; - de eindmarkering onder de laatste gebeurtenis ontbreekt. Dit hoort bij dezelfde tijdlijnpariteit als de PDF in dit issue en krijgt daarom geen duplicerend los ticket. Neem bij de oplossing één gedeeld rendercontract als bron en borg PDF én doorlopende HTML tegen dezelfde kolomkoppen en visuele identiteit. LaTeX blijft een bewerkbare bronexport en valt buiten deze visuele eindproductscope.
Author
Owner

Opgepakt. Tak: fix/document-pdf-parity-1712-1716. Verwachte reikwijdte: lib/services/pdf/, lib/services/marp_html/, tests en bestaande documentatie.

Opgepakt. Tak: fix/document-pdf-parity-1712-1716. Verwachte reikwijdte: lib/services/pdf/*, lib/services/marp_html/*, tests en bestaande documentatie.
brenno 2026-08-22 11:01:05 +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#1712
No description provided.