fix: bug-label batch — 15 issues aangepakt #1708

Merged
brenno merged 17 commits from fix/bug-label-batch into main 2026-08-22 01:46:18 +00:00
Owner

Samenvatting

Deze PR lost vijftien bug-label issues op in één samenhangende batch:

  • #1660, #1661 — Crash op deckNotifier bij slepen/duplicaten opruimen met documenttabblad open. Gefixt met openFilePath en deckNotifierOrNull met graceful refusal.
  • #1662 — Tabel bewerken raakte de tijdlijntabel ernaast. nthTableBlockRange slaat nu timeline-tabellen over.
  • #1663 — Onbekende TLP viel stil terug op none. Nu fail-closed op red (strengste lezing).
  • #1664deckToDocumentMarkdown trimde inspringing weg. body.trim()body.trimRight().
  • #1666, #1668 — Grafiekhydratatie: geen 8 MiB-plafond meer, CRLF-behoud, en compacte fence (geen newline vóór sluithek) wordt herkend.
  • #1670 — Overzicht Bron-modus sprong naar verkeerde kop met frontmatter. headingBlockIndex gebruikt nu document.body i.p.v. document.source.
  • #1672 — Ongedaan maken zette tab altijd vuil en cursor aan eind. visualEdited wordt nu correct hersteld bij undo.
  • #1676 — In-place save van bestaand document werkte Recente bestanden niet bij. addRecentFile toegevoegd aan het save-pad.
  • #1678reference-location: section/block werd onterecht als document behandeld. Nu page (default), want OciDeck kan ze niet als Pandoc renderen.
  • #1680 — PDF-export tekende tijdlijn als gewone tabel. Volgt nu het LaTeX-patroon: protect → replace sentinels met PdfListBlock.
  • #1682withBody hergebruikte frontmatter bij --- body. Delegeert nu naar withSource dat de frontmatter controleert.
  • #1684 — Conversiedialoog noemde echte verliezen niet. Documentstijl, documentvelden en voetnoten nu expliciet in de drop-lijst.
  • #1646 — Presentatie→document: padloos tabblad, afbeeldingen verdwijnen. DocumentState.projectPath toegevoegd; convertDeckToDocument geeft deck.projectPath mee.
  • #1647 — Setext-koppen verschenen als alinea in weergave, kop in uitvoer. _parse herkent nu ===/--- onder een tekstregel als H1/H2.

Elke bug heeft een regressietest.

Test plan

  • make check groen (10.446 tests, 87.2% dekking)
  • make check-secrets — geen lekken (gitleaks + trufflehog)
  • make sast — 0 findings (semgrep)
  • Elke bug heeft een regressietest die rood werd tegen de onherstelde code

Generated with Devin

## Samenvatting Deze PR lost vijftien bug-label issues op in één samenhangende batch: - **#1660, #1661** — Crash op `deckNotifier` bij slepen/duplicaten opruimen met documenttabblad open. Gefixt met `openFilePath` en `deckNotifierOrNull` met graceful refusal. - **#1662** — Tabel bewerken raakte de tijdlijntabel ernaast. `nthTableBlockRange` slaat nu timeline-tabellen over. - **#1663** — Onbekende TLP viel stil terug op `none`. Nu fail-closed op `red` (strengste lezing). - **#1664** — `deckToDocumentMarkdown` trimde inspringing weg. `body.trim()` → `body.trimRight()`. - **#1666, #1668** — Grafiekhydratatie: geen 8 MiB-plafond meer, CRLF-behoud, en compacte fence (geen newline vóór sluithek) wordt herkend. - **#1670** — Overzicht Bron-modus sprong naar verkeerde kop met frontmatter. `headingBlockIndex` gebruikt nu `document.body` i.p.v. `document.source`. - **#1672** — Ongedaan maken zette tab altijd vuil en cursor aan eind. `visualEdited` wordt nu correct hersteld bij undo. - **#1676** — In-place save van bestaand document werkte Recente bestanden niet bij. `addRecentFile` toegevoegd aan het save-pad. - **#1678** — `reference-location: section/block` werd onterecht als `document` behandeld. Nu `page` (default), want OciDeck kan ze niet als Pandoc renderen. - **#1680** — PDF-export tekende tijdlijn als gewone tabel. Volgt nu het LaTeX-patroon: protect → replace sentinels met `PdfListBlock`. - **#1682** — `withBody` hergebruikte frontmatter bij `---` body. Delegeert nu naar `withSource` dat de frontmatter controleert. - **#1684** — Conversiedialoog noemde echte verliezen niet. Documentstijl, documentvelden en voetnoten nu expliciet in de drop-lijst. - **#1646** — Presentatie→document: padloos tabblad, afbeeldingen verdwijnen. `DocumentState.projectPath` toegevoegd; `convertDeckToDocument` geeft `deck.projectPath` mee. - **#1647** — Setext-koppen verschenen als alinea in weergave, kop in uitvoer. `_parse` herkent nu `===`/`---` onder een tekstregel als H1/H2. Elke bug heeft een regressietest. #### Test plan - [x] `make check` groen (10.446 tests, 87.2% dekking) - [x] `make check-secrets` — geen lekken (gitleaks + trufflehog) - [x] `make sast` — 0 findings (semgrep) - [x] Elke bug heeft een regressietest die rood werd tegen de onherstelde code Generated with [Devin](https://devin.ai)
_adoptDroppedImage en _addImagesToActiveDeck in app_shell.dart lezen
deckNotifierOrNull in plaats van deckNotifier — een documenttabblad als
actieve tab gooide anders StateError bij een gesleepte afbeelding.

_openPaths in duplicate_cleanup_dialog.dart gebruikt openFilePath
(soort-agnostisch) in plaats van deckNotifier.currentState.filePath —

Beide zijn hetzelfde patroon dat elders in de schil al gold
(deckNotifierOrNull / openFilePath); deze twee plekken waren gemist.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
nthTableBlockRange telde alle GFM-pipetabellen, ook de tabel onder
`<!-- timeline -->`. De weergave telt die als _Kind.timeline, niet
_Kind.table, dus de ordinalen liepen uit de pas: potlood op tabel 0 in
beeld verving de tijdlijn in de bron.

Skip nu de marker + tabelgroep in nthTableBlockRange, net als _parse.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
TlpLevel.fromKey herkent nu de officiële TLP 2.0-spelling (TLP-AMBER,
TLP:RED, TLP:AMBER+STRICT) naast de korte sleutels. Onbekende waarden
worden niet meer stil als TlpLevel.none behandeld (fail-open op
classificatie) maar als TlpLevel.red (strengste lezing, fail-closed).

Een typo of een onbekende spelling omzeilt zo niet meer de
exportblokkade en het classificatielabel.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
body.trim() strippte leidende spaties/tabs die in Markdown betekenis
dragen (ingesprongen code, nestlijsten). Vervangen door trimRight():
trailing whitespace weghalen, leidende inspringing behouden.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
#1666: _inlineBlock controleert nu file.length() tegen
FileService.maxChartDataBytes (8 MiB) vóór readAsString — zelfde cap
als het deck-openpad, voorkomt DoS op het exportpad. De herschreven
fence gebruikt de oorspronkelijke regelscheiding (CRLF of LF) in plaats
van altijd LF.

#1668: chartFencePattern gebruikt \r?\n i.p.v. \n (CRLF) en maakt de
newline vóór het sluithek optioneel ((?:\r?\n)?) zodat een compact
blok waarvan de laatste specregel direct aan het sluithek grenst ook
matcht — dezelfde herkenning die de bridge al regel-voor-regel had.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
_scrollToHeading riep headingBlockIndex op document.source (frontmatter
+ body), maar de preview rendert de body. Frontmatter-blokken
(thematische ---, sleutelregels als alinea's) schoven het bloknummer op,
dus de anker landde op de verkeerde plek.

Nu wordt headingBlockIndex aangeroepen op document.body, dezelfde tekst
als de preview.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Drie samenhangende fixes in de undo-lus:

1. isDirty: undo/redo leiden isDirty nu af uit vergelijking met
   savedSource. Is de bron na undo weer gelijk aan de opgeslagen bron,
   dan is de tab niet vuil — de oranje stip en sluit-dialoog verdwijnen.

2. visualEdited: de vlag reist mee in de undo/redo-stapel (als
   (MarkdownDocument, bool)-tuple), zodat undo een visuele edit
   teruggedraait naar een niet-visuele staat en omgekeerd.

3. Cursor: bij een externe bodywijziging (undo/redo) wordt de huidige
   cursorpositie behouden (geklemd op de nieuwe lengte) in plaats van
   naar het einde te springen.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
saveDocumentWithDestination riep addRecentFile alleen aan na
Opslaan-als. Een gewone Cmd+S naar een bestaand pad liet de
recent-lijst ongemoeid — volgorde en kind werden niet vernieuwd.

Nu wordt addRecentFile ook na een succesvolle in-place save
aangeroepen, consistent met openen en Opslaan-als.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
documentFootnotePlacement behandelde section en block als document
(alles achterin), maar OciDeck voert per-sectie/per-blok plaatsing niet
uit — een Pandoc-gebruiker kreeg hier dus andere nootplaatsing dan bij
de ontvanger. Terugvallen op page (noten op de pagina) is veiliger: dat
staat dichter bij per-sectie dan alles achterin.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De PDF-converter stripte alleen de tijdlijn-marker en liet de tabel
eronder als gewone PdfTableBlock tekenen — randen, kolommen, geen
tijdlijn-vorm. De HTML-export projecteert dezelfde tabel wel als
semantische tijdlijn (<ol class="ocideck-timeline">), en de LaTeX-export
als \begin{description}.

Nu volgt de PDF-converter hetzelfde patroon als de LaTeX-converter:
_protectTimelines haalt marker+tabel uit de bron, analyseert de
tijdlijn, en vervangt de sentinel na blokconversie door een genummerde
lijst (PdfListBlock) met vetgedrukte tijdaanduiding en eventuele
metadata. De dichtstbijzijnde bestaande blokvorm — geen nieuwe block
type of renderer nodig.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
withBody hergebruikte blind _frontMatterMetadata zonder te
controleren of de nieuwe bron dezelfde frontmatter heeft. Een
document zonder frontmatter waarvan de body opent met --- kreeg
de oude (lege) metadata, terwijl splitDocumentFrontMatter het ---
blok als frontmatter las — body en frontMatter klopten niet meer.

withBody delegeert nu naar withSource, dat al controleert of de
frontmatter in de nieuwe bron dezelfde is en anders de metadata
opnieuw parset.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De dialoog noemde alleen de vage "geen perfecte spiegeling" en de
---→diagrens, maar niet de concrete verliezen: documentstijl (thema,
paginaformaat, marges), documentvelden (kop/voet) en voetnoten gaan
niet mee naar de presentatie. Die zijn nu expliciet in de drop-lijst.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
convertDeckToDocument riep newDocumentFromMarkdown(source) zonder
projectPath. Het nieuwe documenttabblad had geen bestandspad en geen
projectmap, dus _documentProjectPath gaf null — afbeeldingsverwijzingen
konden niet worden opgelost en de preview bleef leeg.

DocumentState krijgt een projectPath-veld (los van filePath),
newDocumentFromMarkdown accepteert projectPath, en
convertDeckToDocument geeft deck.projectPath mee.
_documentProjectPath valt terug op projectPath wanneer filePath null is.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De documentweergave (_parse) herkende alleen ATX-koppen (# Titel),
niet Setext-koppen (Titel\n===== of Ondertitel\n----------). De
export (markdown-package) herkent die wel, dus verscheen een kop
in de uitvoer als alinea op het scherm.

_parse controleert nu na de eerste paragraafregel of de volgende
regel een Setext-onderstreping is (=== voor H1, --- voor H2). De ---
onderscheidt zich van een horizontale streep door context: direct
na een tekstregel, zonder lege regel ertussen.

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
fix: vertalingen + test-fixes na bug-batch
All checks were successful
scans / scans (pull_request) Successful in 1m58s
static-gate / static-gate (pull_request) Successful in 4m38s
63a0ddc379
- 3 nieuwe Dutch source strings voor #1684 toegevoegd aan alle 31 talen
- recent_file_test aangepast: onbekende TLP valt nu op red (fail-closed, #1663)
- visual_save_byte_faithful_test: SharedPreferences mock voor #1676's
  addRecentFile in saveDocumentWithDestination
- conventie- en methode-lengte baselines bijgewerkt

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno force-pushed fix/bug-label-batch from 63a0ddc379
All checks were successful
scans / scans (pull_request) Successful in 1m58s
static-gate / static-gate (pull_request) Successful in 4m38s
to eab9c8b637
All checks were successful
scans / scans (pull_request) Successful in 2m23s
static-gate / static-gate (pull_request) Successful in 5m41s
2026-08-22 01:40:03 +00:00
Compare
brenno merged commit f942713003 into main 2026-08-22 01:46:18 +00:00
Sign in to join this conversation.
No description provided.