Skip to content

fix(ui): RichTextEditor ignoriert veraltete Echos eigener Eingaben (0.9.1) - #26

Merged
rrolf merged 1 commit into
mainfrom
fix/ui-rich-text-echo
Oct 17, 2026
Merged

rrolf merged 1 commit into
mainfrom
fix/ui-rich-text-echo

Conversation

@rrolf

@rrolf rrolf commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Problem: RichTextEditor übernahm jeden value, der vom Editor-HTML abwich. Kommt unter Last eine veraltete Kopie der eigenen letzten Eingabe zurück (asynchrone State-/Autosave-Runden), setzte sich der Editor darauf zurück – das zuletzt getippte Zeichen bzw. ein Leerzeichen am Ende ging verloren. Gefunden über schwankende E2E-Tests in Abstimmbar (virtUOS/abstimmbar#205, dort vorerst per Wrapper umgangen); Ausleihbar ist ebenso betroffen.

Fix: Der Editor merkt sich, welche Werte er selbst per onChange gemeldet hat.

  • Kommt eine ältere eigene Meldung als value zurück → ignorieren.
  • Kommt die neueste zurück → die Elternkomponente hat aufgeholt, Liste leeren.
  • Jede andere Änderung von value gilt als Änderung von außen und wird übernommen – auch wenn sie einem früheren Text gleicht (z. B. Formular auf "" zurücksetzen, Wechsel zu einem Datensatz mit gleichem Text).
  • Sonst unverändert (emitUpdate:false, addToHistory:false).

Version 0.9.1, CHANGELOG-Eintrag.

Geprüft in Abstimmbar mit nur diesem Fix (Wrapper entfernt, 0.9.1-Tarball): betroffene E2E-Specs 200/200 bei 10 Wiederholungen; Tippen, Fett, Undo/Redo, Speichern/Neuladen ok. Gegenprobe mit 0.9.0 schlägt fehl.

🤖 Generated with Claude Code

The outside-value sync called setContent whenever `value` differed from the
editor's HTML. Own edits come back as `value` one render later; under load a
keystroke lands before the sync effect runs, so the echo is already stale
and reset the editor - dropping the newest keystroke and, for good, a
trailing space.

The editor now records the HTML it emits via onChange: an echo of a pending
own emission is ignored, catching up with the newest emission clears the
queue, and any other change of the prop is external and applied (also when
it equals an earlier text, e.g. a form reset to ""). setContent still uses
emitUpdate:false and addToHistory:false.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rrolf
rrolf merged commit 7cd5dbd into main Oct 17, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant