enhancement
major
minor
defect
critical
major
minor
Problem
Ein Upload geht nur als <upload-command> in den Befehlen eines <panel>. Ein <button> in einem Formular oder Dialog mit derselben Upload-Aktion zeigt beim Klick keine Dateiauswahl.
Version: 8.0.0-alpha12, React-View-Layer (tl-layout-view/tl-layout-react).
Reproduktion (Prime)
Dialog „Neue Version“ (prime/project/document-version-dialog.view.xml): Die Dateiauswahl sollte ein Knopf „Datei wählen...“ neben dem Kommentarfeld sein.
- Einen <button> mit Upload-Aktion in den Dialog setzen und klicken: Es passiert nichts.
Prime: „Datei wählen...“ steht als <upload-command> in den Befehlen eines <panel> im Dialog und schreibt in den Kanal file.
Erwartetes Verhalten
Upload-Aktionen funktionieren an jedem Befehlsort, auch als <button> und als Befehl eines <form>.
Lösung
Die Dateiauswahl und der Upload liegen im Button-Control ReactUploadButtonControl (Client TLUploadButton); der Klick eines normalen ReactButtonControl auf einem <upload-command> bewirkt nichts. Bisher wählte nur die Werkzeugleiste (ToolbarBuilder) das Upload-Control, <button>, <floating-action>, die Aktionen eines <alert> und die Datenliste des Chats bauten immer einen normalen Button.
Das Befehlsmodell erzeugt jetzt selbst den passenden Button (CommandModel.createButton(ReactContext), von UploadCommandModel überschrieben). Alle Stellen, die einen Button zu einem Befehlsmodell bauen, gehen über diese Methode, sodass Upload-Befehle an jedem Befehlsort die Dateiauswahl öffnen.
Ein konfigurierter Befehl (ViewCommandModel) läuft immer in dem View-Kontext, in dem er deklariert ist, egal wo sein Button oder Menüeintrag angezeigt wird. Die Befehle in den <commands> eines <form> erscheinen in der Werkzeugleiste des umgebenden Panels und laufen trotzdem im Formular (mit dessen Formularmodell); ein <upload-command> dort öffnet die Dateiauswahl. Ebenso laufen die Einträge eines <context-menu> im Kontext des deklarierenden Elements und sehen dessen Kanäle, auch wenn das Menü über den Fensterrahmen geöffnet wird. Die bisherigen Hüllen, die nur den Kontext austauschten (FormElement.FormScopedCommandModel, DataListControl.InListContext in tl-chat), entfallen.
Demo (tl-demo-react, Demos → Dokumentanzeige): Der Knopf „Datei wählen...“ unter dem Hinweis lädt Dokumente hoch; das Formular „Eigenschaften“ unter der Dokumentliste bietet im Bearbeitungsmodus „Datei ersetzen“ als Befehl des Formulars an, die gewählte Datei landet im Formular und wird mit „Speichern“ übernommen.
Migration
Nur Java-Code, der com.top_logic.layout.view.command.ViewCommandModel direkt verwendet:
- ViewCommandModel.execute(ReactContext, Object) heißt jetzt execute(Object); der Befehl läuft im Kontext, mit dem das Modell erzeugt wurde. Das Kontext-Argument entfällt.
- Die öffentlichen Konstruktoren von ViewCommandModel und ViewUploadCommandModel erwarten als erstes Argument den ViewContext, in dem der Befehl läuft. ViewCommandModel.create(...) / forCommand(...) akzeptieren keinen null-Kontext mehr.
- RowCommandColumn.RowCommand.of(...) erwartet keinen Kontext mehr.
- Eine eigene Hülle um ein ViewCommandModel, die nur einen anderen Ausführungskontext einsetzt, ist überflüssig und kann entfallen.