Slim plakken in de visuele editor gebruikt de oude broncursor #1667

Closed
opened 2026-08-21 12:02:02 +00:00 by brenno · 1 comment
Owner

Probleem

Bij gewone tekst of HTML uit de Quill-editor schrijft Slim plakken rechtstreeks in de broncontroller. De actuele visuele caret wordt wel apart in _visualCaret bijgehouden, maar de bronselectie blijft staan waar zij vóór het wisselen naar Visueel stond. De geplakte tekst kan daardoor op de verkeerde plek terechtkomen waarna de visuele editor herlaadt.

Reproductie

  1. Open een rondreisbaar document in Visueel.
  2. Verplaats de caret in Quill naar een andere alinea.
  3. Plak HTML of gewone tekst via Slim plakken.
  4. Controleer waar de tekst is ingevoegd.

Verwacht

Plakken gebruikt de actuele Quill-selectie/caret.

Technische aanwijzing

lib/widgets/document_editor_screen.dart:_smartPaste roept voor niet-tabellen _insertPastedMarkdown aan; die leest _controller.selection in plaats van _visualCaret of een visueel insert-signaal. _insertBlock kent deze visuele route wel.

Gevonden bij audit van commit d439638c6b.

## Probleem Bij gewone tekst of HTML uit de Quill-editor schrijft Slim plakken rechtstreeks in de broncontroller. De actuele visuele caret wordt wel apart in _visualCaret bijgehouden, maar de bronselectie blijft staan waar zij vóór het wisselen naar Visueel stond. De geplakte tekst kan daardoor op de verkeerde plek terechtkomen waarna de visuele editor herlaadt. ## Reproductie 1. Open een rondreisbaar document in Visueel. 2. Verplaats de caret in Quill naar een andere alinea. 3. Plak HTML of gewone tekst via Slim plakken. 4. Controleer waar de tekst is ingevoegd. ## Verwacht Plakken gebruikt de actuele Quill-selectie/caret. ## Technische aanwijzing lib/widgets/document_editor_screen.dart:_smartPaste roept voor niet-tabellen _insertPastedMarkdown aan; die leest _controller.selection in plaats van _visualCaret of een visueel insert-signaal. _insertBlock kent deze visuele route wel. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted

Bevestigd tegen main (e93ef205c). _insertPastedMarkdown (lib/widgets/parts/document_editor_layouts.dart) leest _controller.selection — de cursor van de bron-controller. In de visuele stand staat die waar hij stond vóór het wisselen; de echte caret leeft in Quill en wordt apart in _visualCaret bijgehouden.

_insertBlock kent die weg wél: lib/widgets/document_editor_screen.dart stuurt in Visueel (en als het document rondreist) door naar _requestVisualInsert. De tak voor platte tekst en HTML slaat dat over.

Oplossingsrichting

Eerste keus: _insertPastedMarkdown langs dezelfde poort sturen als _insertBlock — dus in Visueel + rondreisbaar het geplakte fragment als invoegsignaal aan de editor geven in plaats van het in de bron te schrijven. Controleer of insertMarkdownBlock daarvoor bruikbaar is; het verschil met een blok is dat een plak inline mag landen (midden in een alinea), en dat moet het signaal kunnen dragen.

Tweede keus, als dat signaal geen inline-invoeging aankan: _visualCaret naar een bronpositie vertalen met MarkdownCaretMap.of(text).sourceOffsetOf(...) — exact de omzetting die _changeViewMode (document_editor_screen.dart) al doet — en op dát punt invoegen. Dan herlaadt de visuele editor daarna wel, maar op de goede plek.

Regressietest (verplicht)

test/document_editor_screen_test.dart: rondreisbaar document in Visueel, Quill-caret naar de tweede alinea, platte tekst plakken → de tekst staat bij die caret, niet op de oude bronpositie. Herhaal met HTML op het klembord, want dat is een tweede tak in resolveClipboardMarkdown.

Kosten

Klein tot middel, afhankelijk van of het invoegsignaal inline aankan.

Prioriteit

Middel: direct zichtbaar, en het leest voor de gebruiker als verlies van tekst.

## Triage: accepted **Bevestigd tegen `main` (e93ef205c).** `_insertPastedMarkdown` (`lib/widgets/parts/document_editor_layouts.dart`) leest `_controller.selection` — de cursor van de *bron*-controller. In de visuele stand staat die waar hij stond vóór het wisselen; de echte caret leeft in Quill en wordt apart in `_visualCaret` bijgehouden. `_insertBlock` kent die weg wél: `lib/widgets/document_editor_screen.dart` stuurt in Visueel (en als het document rondreist) door naar `_requestVisualInsert`. De tak voor platte tekst en HTML slaat dat over. ## Oplossingsrichting Eerste keus: `_insertPastedMarkdown` langs dezelfde poort sturen als `_insertBlock` — dus in Visueel + rondreisbaar het geplakte fragment als invoegsignaal aan de editor geven in plaats van het in de bron te schrijven. Controleer of `insertMarkdownBlock` daarvoor bruikbaar is; het verschil met een blok is dat een plak inline mag landen (midden in een alinea), en dat moet het signaal kunnen dragen. Tweede keus, als dat signaal geen inline-invoeging aankan: `_visualCaret` naar een bronpositie vertalen met `MarkdownCaretMap.of(text).sourceOffsetOf(...)` — exact de omzetting die `_changeViewMode` (`document_editor_screen.dart`) al doet — en op dát punt invoegen. Dan herlaadt de visuele editor daarna wel, maar op de goede plek. ## Regressietest (verplicht) `test/document_editor_screen_test.dart`: rondreisbaar document in Visueel, Quill-caret naar de tweede alinea, platte tekst plakken → de tekst staat bij die caret, niet op de oude bronpositie. Herhaal met HTML op het klembord, want dat is een tweede tak in `resolveClipboardMarkdown`. ## Kosten Klein tot middel, afhankelijk van of het invoegsignaal inline aankan. ## Prioriteit Middel: direct zichtbaar, en het leest voor de gebruiker als verlies van tekst.
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#1667
No description provided.