enhancement
major
minor
major
minor
major
#29641
TL Views: Der React-TL-Script-Editor zeigt Hilfetexte zu Funktionen und Modellelementen an (Kontexthilfe zur Vervollständigung, Hover-Tooltips) und springt beim Tippen nicht mehr an den Textanfang
Kontext
Der TL-Script-Editor der React-Oberfläche (<tlscript-editor> in .view.xml, TL-Script-Felder in React-Formularen, die Script-Konsole) bietet beim Tippen Vervollständigungen für Script-Funktionen und Modellelemente (Module, Typen, Attribute) an. Anders als der klassische Editor zeigt er dabei jedoch keine Hilfe an: Weder ist zu einem Vorschlag die Funktionsdokumentation bzw. die Beschreibung des Modellelements sichtbar, noch gibt es beim Überfahren eines Bezeichners mit der Maus einen Tooltip.
Außerdem springt der Cursor beim Tippen scheinbar zufällig an den Anfang des Textes.
Verhalten nach der Änderung
Kontexthilfe zur Vervollständigung. Öffnet sich das Vorschlagsfenster, wird zum jeweils ausgewählten Eintrag direkt neben dem Fenster eine Hilfe angezeigt: bei Script-Funktionen die Funktionsdokumentation (dieselbe wie im klassischen Editor und in der Script-Hilfe), bei Modellelementen die Beschreibung des Elements mit Art, Name, qualifiziertem Bezeichner und Beschreibungstext. Beim Navigieren mit den Pfeiltasten folgt die Hilfe der Auswahl. Eine lange Hilfe ist mit der Maus scrollbar, ohne dass sich das Vorschlagsfenster dabei schließt.
Hover-Hilfe. Verweilt die Maus über dem Namen einer Script-Funktion oder über einer Modellreferenz in Backticks (z.B. `tl.accounts:Person#name`), erscheint ein Tooltip mit derselben Hilfe.
Cursor bleibt stehen. Der Cursor springt beim Tippen nicht mehr an den Textanfang; auch zwischenzeitlich getippte Zeichen gehen nicht mehr verloren.
Ursache und Lösung
Fehlende Hilfe. Der React-Editor (TLScriptEditor.tsx) reicht ein docHTML einer Vervollständigung bereits an das Info-Panel von CodeMirror weiter; der Server (TLScriptEditorReactControl) berechnet die Vervollständigungen jedoch ohne DisplayContext, weshalb TLScriptCompletionService keine Dokumentation erzeugt. Für Modellelemente erzeugt der Dienst bisher überhaupt keine Dokumentation (auch nicht für den klassischen Editor).
- Die Dokumentationssuche wird in einen wiederverwendbaren Helfer im Modul com.top_logic.model.search gebündelt: Funktionsdokumentation über SearchBuilder.getDocumentation, Beschreibung eines Modellelements über den vorhandenen TLPartResourceProvider (Tooltip mit Art, Name, ID und Beschreibung). Der Vervollständigungsdienst setzt damit docHTML auch für Modellelemente; davon profitiert auch der klassische Editor.
- Das React-Control verwendet den im Kommando-Thread installierten DisplayContext (wie andere React-Controls) und liefert die Dokumentation mit den Vervollständigungen aus.
- Das bisher unimplementierte hover-Kommando des Controls liefert über denselben Helfer die Hilfe zu einem Bezeichner bzw. einer Modellreferenz. Der gemeinsame CodeEditor (com.top_logic.layout.react.codeedit) erhält dafür eine generische Hover-Quelle (CodeMirror hoverTooltip), analog zur bestehenden Vervollständigungsquelle; der TL-Script-Editor liefert die Quelle.
- Das Info-Panel wird über Theme-Tokens gestaltet, in der Höhe begrenzt und scrollbar; ein Mausklick in das Panel (z.B. auf den Scrollbalken) nimmt dem Editor nicht den Fokus, so dass das Vorschlagsfenster geöffnet bleibt.
Cursorsprung. Der gemeinsame CodeEditor ersetzt bei einem vom Server kommenden Wert bisher das gesamte Dokument, wodurch der Cursor an Position 0 landet. Der Server schickt nach jeder (entprellten) Eingabe einen solchen Wert zurück: TLScriptFieldControlProvider serialisiert den geparsten Ausdruck neu (abweichende Formatierung ersetzt das Dokument), und TLScriptEditorElement spiegelt den Kanalwert zurück (ein verspätetes Echo überschreibt inzwischen getippte Zeichen).
- TLScriptEditorReactControl unterdrückt das Echo eines vom Client stammenden Wertes nach demselben Muster wie ReactFormFieldControl (Wert wird nur serverseitig still fortgeschrieben).
- Der gemeinsame CodeEditor übernimmt einen extern geänderten Wert als minimale Änderung (gemeinsamer Präfix und Suffix bleiben erhalten), so dass der Cursor bei einer echten serverseitigen Wertänderung an seiner Stelle bleibt.
Nicht enthalten
Eine Umgestaltung des Vorschlagsfensters selbst.