Plakken in visuele documentmodus landt als blok onder de regel, niet op de cursor #2138
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2138
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptoom
In de documenteditor (visuele stand, de default) plakt Cmd/Ctrl+V een stukje tekst niet op de cursorpositie. De geplakte tekst verschijnt als eigen blok onder de regel waarin de cursor staat — of helemaal onderaan het document.
Oorzaak
De plakroute in visuele modus loopt zo:
WysiwygNotesFieldonderschept Cmd/Ctrl+V (_SanitizedPasteIntent,lib/widgets/markdown_editor/wysiwyg_notes_field.dart~L243-259) en roepttryConsumePasteaan._smartPaste(lib/widgets/parts/document_editor_layouts.dart~L78-123): afbeelding → blok, tabel → blok, en voor alle overige tekst_insertPastedMarkdown(resolved.text)._insertPastedMarkdown(~L128-145) delegeert in visuele modus naar_requestVisualInsert(block: text)._insertMarkdownBlockAtCaretinMarkdownNotesEditor(lib/widgets/markdown_editor/markdown_editor.dart~L327-342) — het blok-invoegpad dat voor tabellen en afbeeldingen is bedoeld._blockInsertOffset(~L379-390) zoekt bewust het einde van de regel waarin de cursor staat ("zo landt een tabel niet halverwege een zin") en voegt dáár in; isquill.selectioninvalide, dan landt het blok opdocument.length - 1— helemaal onderaan.Twee concrete gevolgen:
replacevan de selectie.Extra kwetsbaarheid:
_smartPasteis async (klembord-image-check +Clipboard.getData+readClipboardHtmlvooraf) en de invoeging loopt via een post-frame callback. Als de Quill-selectie in dat gat invalide wordt (focusverlies), is de fallback het documenteinde.De bron-stand heeft dit niet: daar plakt
_insertPastedMarkdownvia_controller.selectionop de echte caret. De caret-correcte route bestaat al in dezelfde widget: de fallback in_pasteSanitizeddoetcontroller.replaceText(index, length, text, …)— precies wat een gewone tekstplak moet doen.Reproductie
Oplossingsrichting
Splits de plakroute op aard van de inhoud:
ClipboardMarkdownKind.markdown): op de Quill-caret invoegen en de actieve selectie vervangen — hergebruik het bestaandereplaceText-pad uit_pasteSanitized(of geef_requestVisualInserteen inline-variant mee die niet via_blockInsertOffsetloopt). De markdown→Quill-omzetting viaMarkdownQuillCodec.documentFromMarkdownkan blijven, maar de delta moet op de caret landen i.p.v. als nieuw blok._smartPastestart), zodat een invalide selectie na de await niet stilletjes naar het documenteinde flopt.Randgeval: is
markdownRoundTripsVisuallyfalse (fallback naar bronveld in visuele stand), dan is_controller.selectionde juiste caret — die tak is al goed.