enhancement
major
minor
defect
critical
major
minor
major
#30043
TL Views: Ein Wert, den der Server festlegt, während der React-Rich-Text-Editor den Fokus hat, wird nie übernommen; der Editor behält seinen Text nach dem Absenden bei.
Problem
TLWysiwygEditor.tsx (com.top_logic.layout.react.wysiwyg) wendet eine Wertänderung vom Server nur an, solange der Editor nicht im Fokus ist:
React.useEffect(() => {
currentHtmlRef.current = value;
if (editor && !editor.isDestroyed && !editor.isFocused) {
... editor.commands.setContent(value, { emitUpdate: false });
}
...
}, [value, editor]);
Wenn der Server einen neuen Wert setzt, während der Editor den Fokus hat, wird dieser übersprungen. Später wird er nicht mehr angewendet: Der Effekt wird erst bei der nächsten Wertänderung erneut ausgeführt, und das Entfernen des Fokus vom Editor holt den Rückstand nicht auf. Der Editor zeigt weiterhin den alten Text an, und der nächste Tastenanschlag sendet diesen alten Text als Benutzereingabe zurück.
Zu sehen in der TL Development-App im Snapshot-Build 59 mit dem Kommentar-Composer, einem Rich-Text- <value-input> über einen Kanal. „Kommentar hinzufügen“ speichert den Kommentar und löscht den Kanal. Der Server sendet den leeren Wert (im SSE-Status sichtbar), und der Editor zeigt weiterhin den gesendeten Text an. Die Datei-Chips und das Feld „Zitiert“ desselben Kompositors werden wie erwartet gelöscht.
Erwartet
Ein vom Server festgelegter Wert wird vom Editor angezeigt. Wenn der Editor den Fokus hat und der Benutzer seit dem zuletzt gesendeten Wert nichts mehr eingegeben hat, ersetzt der neue Wert den Inhalt sofort. Andernfalls wird der Konflikt gezielt aufgelöst, beispielsweise hat der Serverwert Vorrang und die Cursorposition wird nach Möglichkeit beibehalten. Ein Wert wird niemals stillschweigend verworfen.
Test
Ein Rich-Text-Element <value-input> und ein Befehl, der dessen Kanal löscht, ausgeführt über eine Tastenkombination oder eine Schaltfläche, die keinen Fokus erhält, während der Editor im Fokus ist: Der Editor ist danach leer.
Lösung
- Der Editor merkt sich den zuletzt gesendeten Text. Ein Serverwert, der diesem Text entspricht, ist das Echo der eigenen Eingabe und wird ignoriert (sonst ginge das inzwischen Eingegebene verloren). Ein anderer Serverwert wird ohne noch nicht gesendete Eingabe sofort übernommen, auch bei Fokus; bei noch nicht gesendeter Eingabe hat der Serverwert Vorrang, das ausstehende Senden entfällt. Der Cursor bleibt, soweit möglich, an seiner Stelle. Dasselbe gilt für die HTML-Quelltextansicht.
- Der Editor meldet seinen ausstehenden (entprellten) Text beim Befehlskanal an, genau wie die anderen Eingabefelder (registerPendingFlush): Ein Aktionsbefehl, z. B. „Kommentar hinzufügen“ per Tastenkürzel, sendet zuerst den getippten Text.
- Andere unkontrollierte Editoren mit derselben Fokusprüfung (z. B. der Code-Editor) erhalten dieselbe Regel über eine gemeinsame Hilfsfunktion in tl-react-bridge.