TopLogic - the automated application engine
  • Releases
  • Dokumentation
  • Github
  • Discord
  1. Home
  2. Releases
  3. TL_7.2.0
  4. #23471

7.2.0
TopLogic Release

2020-07-31

Verbesserung

Top-Thema
#22685
Support von PostgreSQL
#23383
Formular-Editor
#23471
Kontextmenü
#23854
Theme-Editor
#24071
Theme "dezent"
#24085
Neue Sichten in der Anwendung erstellen
#24188
TL-Script-Editor mit Context-Hilfe
#24863
Modell-Export in die Entwicklungsumgebung
#24926
JavaDoc für Top-Logic
#24936
Übersetzungsservice
Wichtig
#23468
Grid: Vereinheitlichung Selektionsverhalten
#23469
Fileupload mittels Drag&Drop direkt vom Filesystem des Clients
#23470
Grid: Zusammenlegen von Filter- und Sortierungsbuttons im Spaltenheader
#23681
Tabellen: Auswertungszeile
#23912
Control-Rendering über Templates
#23962
XML-Editor mit Syntax-Highlighting
#24044
Hartcodierte Icon-Referenzen durch Theme-Variablen ersetzten
#24122
ConfigurationDescriptor aus XML-Datei erzeugen
#24158
Export und Import von Themes
#24255
Versenden von E-Mails ermöglichen, die nur im CC oder BCC Empfänger haben
#24375
Funktion "Dokumentsperre" vereinfachen.
#24377
Kommentarfeld für Dokumente
#24378
Persistierung von Einstellungen in Auswahldialogen
#24461
Optimized Jetty-Startup in the IDE
#24464
Vereinfachte Layout-Templates mit berechneten Alias-Variablen
#24499
TL-Script: Count-Funktion
#24540
Werte für composite-Attribute inline anlegen
#24620
Migration: Rewriter, der Attribut mit XSL transformiert
#24679
Darstellung von fremden Objekten in BPE
#24701
Fachdefinitionen in BPE Ex/Importer übernehmen
#24728
Typ-Default von Attribut-Annotationen optional vererben
#24729
Modell-Annotationen an Tabellen-Definitionen setzen
#24733
Internationalisierbare Log-Meldungen
#24757
Typisierte Konfiguration: Properties mit ValueFormat und ValueBinding gleichzeitig erlauben
#24760
Übersetzungen für `ResKey`s in deklarativen Formularen eingeben
#24888
Exakte Versionsangabe auf der Monitor-Seite
#24905
Neue Login-Seite
#24997
Automatische Datenmigration bei neu angelegten Tabellen
Detail
#23917
Renderer parametrisieren
#23919
Config-Item-Templates zu Rendering-Templates verallgemeinern
#23969
LockStrategy für Interfaces
#23970
BreadcrumbComponent
#23973
Upload von Binärdaten in Deklarativen Formularen
#24024
Theme Konfigurationen in einer eigenen Datei
#24167
Dialog zur Erstellung mehrerer ConfigurationItem's
#24196
Update Jetty to 9.4.22
#24200
Model-Factory mit Default-Namen ohne Factory-Annotation nutzen
#24210
Upload-Möglichkeit von Fonts im Theme-Editor
#24318
GUI-Assertion FormField#isMandatory()
#24319
Konfiguratives "Mandatory"-Override für Properties in deklarativen Formularen
#24367
Typisierte Konfiguration: BinaryData-Properties standardmäßig serialisieren
#24373
Script recorder - Export/Import von Vorlagen
#24374
Script Recorder: "Server-Script auswählen" ausblendbar machen.
#24376
TLKafkaProducer erweiterbar machen.
#24407
Layout-Refactoring: (Admin-)Layouts so umstrukturieren, dass .layout.xml und Component-XML benachbart sind
#24410
MigrationProzessor zum Löschen des gespeicherten Applikationsmodells
#24419
Mehrfachvererbung bei Themes
#24457
Externes Modul für PostgreSQL Treiber
#24492
TL-Script-Editor für Script-Attribute und Properties verwenden
#24494
Breite des Textfeldes am Modell-Attribut annotieren
#24495
Titel für Tabellen-Definitionen in Workflow-Schritten
#24503
Möglichkeit einen Editor in Dialogen im Edit-Modus zu öffnen
#24516
Anzeige von prozessfremden Attributen
#24521
Allgemeine Layout-Option: resetInvisible
#24524
Keine Punkte in Umgebungsvariablen
#24535
GenericObject als Standard-Datenbank-Tabelle
#24537
Service inspection
#24538
loginscreen.png in POS entfernen
#24548
Konfigurierbare Ausnahme-Listen in EditAttributedComponent
#24552
Grid: Deselektion mit Ctrl-Click
#24561
Automatischer Textumbruch bei langen Zeilen für den Code Editor
#24567
TL-Script Ausdruck um ein dynamisches Attribut auszuwerten
#24569
LabelProvider by expression
#24570
Main-Properties für MetaAttribute Tabelle
#24580
Anpassung der Grid-Layouts im Element-Modul
#24581
ShowSystemEnvironment.jsp: Alphabetische Sortierung.
#24584
Harte Icon-Referenz in grid.xml entfernen
#24588
Nutzung der Labels von Fachobjekten in Messages
#24590
BPE: Task-Übergang-Fehlertext und Bedingung vereinheitlichen
#24656
Anzeige der "_self" Spalte in FormEditor-Tabelle
#24672
Anzeige eines statischen HTML im Formular-Editor
#24673
"Standard" Links in WYSIWYG Editor aktivieren
#24692
Migration: Versions-Downgrade ermöglichen
#24697
Directory (LDAP) Account Sync without explicit group access
#24703
Scripting: ModelNamingScheme für die Selektion von Selectables
#24715
Umgang mit großen Dateimengen bei Uploads durch file drops
#24716
FileDropHandler: Fehlermeldungen verbessern
#24718
Verbesserung des Abschluß einer Aufgabe
#24744
Dynamische Dialogtitel
#24745
Fehlende JSP Atribut "wholeLine" für basic:fieldset
#24747
Macro als GUI-Element im Formular-Editor
#24755
Feature-Sets in StructuredTextConfigService einführen
#24756
Typisierte Konfiguration: Kein Fehler beim Zugriff auf nicht gesetzte mandatory Properties
#24758
ResKey: Optionaler key for literale `ResKey`s, besseres XML-Format
#24765
com.top_logic.layout.form.template.model.Template für HTML code
#24768
FormEditor-Dialog in zu einem programmatischen Dialog machen
#24803
Bessere Positionierung von Administrationskomponenten
#24813
Anzeige von verstecken Attributen in Form-Editor
#24816
MediaQueryControl soll LayoutControlAdapter sein
#24853
Anzahl Zeilen dynamisch dem Inhalt des Code Editors anpassen
#24856
Enhanced API for TypedAnnotatable
#24869
Angabe einer Begründung wenn Zeilen nicht entfernt werden können
#24873
Typisierte Konfiguration: Short-Cut-Format für item-wertige Properties für Serialisierung verwenden
#24884
Font Awesome auf Version 5.13.0 aktualisieren
#24895
Fokussieren von Tabellen
#24902
PropertyEditor für TLFormDefinition
#24906
FormBuilder für einen Typ unter Verwendung der impliziten FormDefinition
#24913
Formulare von Obertypen als Template zum erweitern anbieten
#24916
Buttons um das Formular zurücksetzen zu können
#24925
checkAll an FormContainer bereitstellen
#24928
Aufzeichnen aller Aktionen im Dialog unterbinden können
#24932
Layout zurück ins Dateisystem speichern
#24982
Assertion auf den Fehlertext eines FormField's
#24999
Deploy-Aspekte wie "normale" Web-Apps behandeln
#25012
Teminplan im Kacheldemo anzeigen
#25013
WindowComponent am MainLayout des Openers registrieren
#25027
Scripting von Erstellung neuer Sichten
#25039
Anzeige der Messages einer Exception im Info-Service
#25040
Besseres Fehlerverhalten falls Layout-Konfiguration invalide ist
#25041
Deklarative Konfiguration sollen programmatische erweitern
#25044
Unterscheidung von aktiven und disabled Buttons im "modern" Header
#25055
BinaryDataFactory: BinaryData aus InputStream und Namen erzeugen
#25067
Anzeige vom Typ Info ohne Icon und Header im Info-Service
#25081
DefaultProvider über Ausdruck
#25083
Spezielle Gruppe "Weitere Attribute" im Form-Editor
Kleinigkeit
#23964
Abstrakte Basisklasse für ControlProvider für FormMember
#23979
TableData: getOwner() in die API aufnehmen
#24195
ConfigurationItem für internationalisierte Texte ohne Beschreibung
#24197
TL-Sync: Kafka bootstrap servers über Java-Property setzten
#24209
Von Javascript geladene Hover-Klassen durch Hover-Pseudo-Klassen ersetzen
#24282
Typisierte Konfiguration: Utility zum parsen mit custom Root-Tag
#24286
Utility um Maven-Dependencies in ein TL-Modul zu integrieren
#24313
Assertion für Selektion in TreeTableComponent
#24340
Standard-Encoding von Dateien im Projekt festlegen
#24485
Dump-JSP in die Standard-Wartungsseiten übernehmen
#24504
Statische SQL Statements entfernen, stattdessen dynamisch über den DBHelper routen
#24575
Wrapper-Generierung für mehrere Module
#24613
Service-Methode für Erstellung einer SortConfig
#24750
TL-Script Macros: Dynamischen Inhalt in geschützten Attributen erlauben (SafeHTML)

Fehlerbehebung

Top-Thema
#24984
Fehlerhafte AssociationCache-Aktualisierung im Commit
Wichtig
#24380
Konfigurierter Resourceprovider wird für historische Objekte nicht gefunden
#24452
Mögliche Endlosschleife im AbstractKBCache
#24695
Struktureditor: Unterschiedliche Zeilenhöhe Flex vs Fix
#24721
Baumtabelle rendert Checkboxen für alle Knoten
#24854
Fehlerhafte Dialog-Name im POSDelegateStructureHTMLTree
#24977
Benutzer kann keine Bookmarklinks mehr erzeugen
Detail
#23952
Mandatory Attribute können nicht (temporär) auf null gesetzt werden
#23955
Reihenfolge der Buttons in *SelectorContext nicht konsistent zum Rest
#23997
Session-Service loggt nur die Adresse der Apache-Fassade
#24152
Renderingfehler beim Burger-Menü
#24169
Entfernung unnötiger Inline-Styles
#24241
Fehlende ThemeVariablen ergänzen
#24302
RiskItemFactory: Auf typisierte Konfiguation umstellen
#24346
Typisierte Konfiguration: U.u. Falsche "Outer"-Referenzauflösung
#24359
Zeitabhängige Test in Project-Demo
#24397
Die Callback-URL-Konfiguration der Pac4jConfigFactory dient nicht als Fallback für die Client-Konfiguration
#24412
Tooltips von nicht ausführbaren Kommandos im Burger Menü werden nicht angezeigt
#24490
Fehlende Berechtigung für neue Workflow-Version
#24505
Speichern von Script-Templates im Script-Recorder nicht möglich
#24514
TLScript Codecompletion Plugin funktioniert nicht im Internet Explorer
#24551
GUI-Inspector Dialog öffnet sich nicht mehr bei Buttons
#24553
Tabellentextfilter zählen leere Einträge
#24558
Fehlerhafter Export/Import von ScriptRecorderTemplates
#24619
Migration: Modell-Update löscht u.U. Attribute wenn sich ihr Typ ändert
#24644
Upload einer Dokumentversion per Drag & Drop ohne Sperre nicht möglich
#24648
TL-Script-Editor: Code-Block in der Beschreibung einer Vervollständigung nicht in einer Zeile im IE
#24669
Font Awesome fehlt in der Tabelle der Drittanbieterbibliotheken
#24677
Unerwünschter Margin in der Gantt-Page-Leiste
#24680
Tree-Table: Selektion geht beim Zuklappen verloren
#24684
Reihenfolge jsDiagram / Themes Modern im CP tauschen
#24696
Formular der erweiterten Suche zu Breit
#24698
Unerwünschter Zeilenumbruch bei Darstellung einer URL
#24704
Inaktiver Create Button einer Grid ist zu hell im Sidebar-Theme
#24759
Log-Konfiguration in der Anwendung wechseln nicht mehr möglich
#24764
LabelProvider für BinaryData Objekte
#24769
Weitere Fehler in reaktiven Formularen
#24775
FileDropHandler: waitPane verschwindet manchmal nicht
#24785
Maxmiert Eigenschaft bei Dialogen geht verloren
#24862
Fehlerhafte Filterung in Baumtabellen bei nicht existierenden Attributen
#24872
Aktualisierungsproblem Unternehmen-Detailsicht
#24901
Warnungen im Log zu Layout Dateien
#24917
An Attributen konfigurierten `config-type` für ColumnConfiguration nutzen
#24939
Check-Changed bei Selektion im BPMN-Diagramm
#24950
Label-Spalte in Token-Tabelle existiert nicht
#24959
Webfolder wird zu klein gerendert
#24965
Committee-Tests schlagen fehl, wenn sie zu bestimmten Uhrzeiten ausgeführt werden
#24974
TopLogicServlet must not redirect to login in case of errors
#24987
Fehlerhaftes Update von KBCache's
#24988
Neue Dokumentbeschreibung wird nicht in anderen WebFolder Sichten angezeigt
#25005
Doppelter Button in der Sidebar
#25007
Änderungen des editierten BPMN-Diagrammes können verloren gehen
#25009
Falsches Model-Update beim Wechsel in den Bearbeiten-Modus
#25010
BPE Prozess Editor speichert Einstellung "Automatisch" für Verzweigungen nicht richtig
#25014
ModuleLayout löst Workspace Verzeichnis nicht richtig auf
#25028
Dialoge externer Fenster werden im Hauptfenster angezeigt
#25048
ThemeVariablen des Layouts werden nicht richtig aufgelöst
#25056
Zu viele Buttons im Sidebar-Layout
#25059
NullPointer beim Drag'n'Drop von selektierter ApplicationAction
#25061
ReplayHistory findet sein Control nicht bei schnellem PageReload
Kleinigkeit
#24647
Unnötiger Import in SubtypesProvider

Administration

Detail
#25036
Optimierung Arbeitsspeicher Virtuelle Maschinen
Verbesserung (Nutzer-sichtbar)

Top-Thema

#23471

Kontextmenü

Code-MigrationContextMenu

In Applikationen soll generell ein Kontext-Menü zur Verfügung stehen, in dem einerseits gewisse Standard-Kommandos (Bearbeiten, Löschen, ...) immer erscheinen, andererseits aber auch bereits existierende applikationsspezifische Funktionalitäten angeboten werden, die für das aktuell selektierte Objekt verfügbar sind - entweder global in der Applikation, oder spezifisch in einzelnen Views.

Der Anwendungsentwickler soll in der Lage sein, zu entscheiden, welcher der Einträge für ein spezifisches Objekt enabled/disabled sind (per Code, beispielsweise in Abhängigkeit eines Attributwertes des Objekts). Der enabled/disabled-Status muss der selbe sein, wie für das entsprechende Kommando in der Toolbar, Button-Zeile oder dem Burger-Menü.

User-Interface

Das Kontext-Menü soll einerseits per rechter Maustaste, andererseits auch auf anderem Weg für Touch-Geräte aufrufbar sein.

Funktionalitäten

Standard-Funktionalitäten sollen immer in Kontext-Menü erscheinen, müssen aber in der Applikation View-spezifisch disabled werden können (z.B. Löschen, Bearbeiten).

Weitere Funktionalitäten sollen von den Applikationen typ-spezifisch hinzugefügt werden können, und sollen dann in allen Views der Anwendung für Objekte dieses Typs zur Verfügung stehen (z.B. "Umbenennen", "Versenden (Mail)").

Weitere Funktionalitäten sollen von Applikationen typ- und view-spezifisch hinzugefügt werden können, und sollen dann in der jeweiligen View der Anwendung für Objekte dieses Typs zur Verfügung stehen.

Konfigurierbarkeit

Es soll für den Anwendungsentwickler möglich sein, existierende Kommands in Burger-Menü, Button-Zeile, Toolbar in das Kontextmenü hereinzukonfigurieren.

Der Anwendungsentwickler muss generell in der Lage sein, zu entscheiden, welcher der Einträge für ein spezifisches Objekt enabled/disabled werden sollen (per Code, beispielsweise in Abhängigkeit eines Attributwertes des Objekts). Der enabled/disabled-Status muss immer der selbe sein, wie für das entsprechende Kommando in der Icon-Leiste oder im Burger-Menü.

Umsetzung

Siehe TL/ContextMenu

Code-Migration

  • Kommandos, die ein Icon haben, bisher in der Toolbar angezeigt wurden und jetzt auch im Kontext-Menü auftauchen müssen überprüft werden, ob sie auf beiden Hintergründen funktionieren. Möglicherweise muss stattdessen ein Icon-Font-Icon genutzt werden, dass seine Fordergundfarbe anpassen kann. Dies wurde für die Edit/Save/Cancel-Icons gemacht.
  • Alle Methoden in BoundChecker müssen das zu prüfende Objekt als Argument erhalten und dürfen nicht implizit das aktuelle Modell (z.B. der Komponente mit einberechnen)
    • BoundChecker.hideReason(Object)
    • getCurrentObject(BoundCommandGroup, Object)
  • Methoden an BoundChecker welche kein aktuelles Objekt übergeben bekommen, können nur noch an BoundCheckerComponent aufgerufen werden und dürfen nicht in die Berechtigungsprüfung von Kommandos eingehen (nur noch in Anzeige-Prüfung z.B. nach Tab-Wechsel)
    • allow(BoundCommandGroup)
    • allow(BoundCommand)
  • Kommandos, die das aktuelle Komponenten-Modell nicht benötigen (z.B. "Refresh") müssen null() als target Konfiguration erhalten, damit sie nicht in das Kontext-Menü von Elementen übergeordneter Komponenten aufgenommen werden. Diese Konfiguration kann entweder über die Einstellung target="null()" bei der Konfiguration des Kommandos erfolgen oder als Default-Annotation bei der Kommando-Implementierung:
#!java 
public class InvalidateCommand extends AJAXCommandHandler {

   public interface Config extends AJAXCommandHandler.Config {
      @Override
      @FormattedDefault(TARGET_NULL)
      ModelSpec getTarget();
   }

   ...
}
  • Dialog-Öffner, welche die Option targetComponent="..." verwenden, müssen zusätzlich als Konfiguration target="model(self())" erhalten. Da die meisten Dialoge ihr Modell nicht explizit beim Öffnen gesetzt bekommen, sondern das Modell "hinterrücks" von ihrem dialogParent() erhalten, hat sich die Default-Einstellung für target von OpenModalDialogCommandHandler von model(self()) zu null() geändert. Dies bewirkt, dass solche Dialogöffner, die nicht mit einem anderen Modell als dem aktuell in der Parent-Komponente gesetzten funktionieren, nicht in das Kontext-Menü von übergeordneten Komponenten aufgenommen werden, z.B:
#!patch
Index: webapp/WEB-INF/layouts/history/historyDialog.xml
===================================================================
--- webapp/WEB-INF/layouts/history/historyDialog.xml   (revision 278883)
+++ webapp/WEB-INF/layouts/history/historyDialog.xml   (working copy)
@@ -43,6 +43,7 @@
        clique="history"
        group="${openerCommandGroup}"
        resourceKey="${defaultI18n}"
+       target="model(self())"
        targetComponent="${namePrefix}Table"
     >${executability}</open-handler>
  </dialogInfo>
  • Wird ein Dialog nicht mehr angezeigt, oder hat der Öffener die falsche Ausführbarkeit, so kann das am geänderten Default für target des OpenModalDialogCommandHandler liegen. Das ist der Fall, wenn am Open-Handler z.B. eine Executability-Rule konfiguriert wurde, die sich auf das Target-Modell des Händlers bezieht, obwohl der geöffnete Dialog gar nicht mit dem Target-Modell des Handlers arbeitet, sonder sich sein Modell "hinterrücks" von seinem Dialog-Parent besorgt. In diesem Fall muss der Dialog so umgestellt werden, dass sein Modell über targetComponent="..." am Open-Handler gesetzt wird und die Konfiguration target wie im letzten Punkt beschreiben gesetzt wird, z.B:
#!patch
Index: webapp/WEB-INF/layouts/com.top_logic.contact/admin/orgUnits/EditOrgUnit_shared.xml
===================================================================
--- webapp/WEB-INF/layouts/com.top_logic.contact/admin/orgUnits/EditOrgUnit_shared.xml   (revision 278881)
+++ webapp/WEB-INF/layouts/com.top_logic.contact/admin/orgUnits/EditOrgUnit_shared.xml   (working copy)
@@ -56,17 +56,23 @@
     <include name="/element/createStructuredElement.xml"
        detailComponent="${createComponent}"
        jSPNewPage="${createJSP}"
+       model="null()"
        namePrefix="${namePrefix}OrgUnit"
     >
        <inject>
           <dialogInfo
-             defaultI18n="layouts.contact.EditOrgUnit_Shared.newOrgUnit"
-             executability="CreateElementRule"
              height="250"
-             openerClique="create"
-             openerCommandGroup="Create"
              width="450"
-          />
+          >
+             <open-handler id="displayDialog_${namePrefix}OrgUnitnewElementDialog"
+                clique="create"
+                executability="CreateElementRule"
+                group="Create"
+                resourceKey="layouts.contact.EditOrgUnit_Shared.newOrgUnit"
+                target="model(self())"
+                targetComponent="${namePrefix}OrgUnitnewElementDialog"
+             />
+          </dialogInfo>
        </inject>
     </include>
  </dialogs>

Offene Punkte

  • Kontext-Menü für Tree-Komponents und Tree-Controls
  • Kontext-Menü für Table-Komponents und Table-Controls
  • Kontext-Menü für Tree-Table-Komponents
  • Kontext-Menü für alle Komponenten-Hintergründe
  • Kontext-Menü für inline dargestellte Objekte ("Resource-Renderer")
  • Kontext-Menü für Charts
    • Nicht in diesem Ticket.
  • Typ-spezifische Kontext-Menü-Einträge
  • Resource-Provider liefert Kontext-Menü?
    • Nein: Es gibt ein zusätzliches Interface ContextMenuCommandsProvider, mit dem für ein Objekt Kontext-Menü-Kommandos zur Verfügung gestellt werden können. Eine konfigurierte Variante davon ist der LabelProviderService.
  • Form-Gruppen zuklappen über Kontextmenü
    • Nein: Zu viel Kontext-Menü-Fläche reserviert für zu wenig Funktionalität.
  • Kontext-Menü für Formularfelder
  • Überschrift für Kontext-Menüs
  • Das Kontext-Menu öffnet sich direkt an der Maus-Position, unabhängig davon, ob das geamte Menü an dieser Position auch dargestellt werden kann. Stattdessen muss das Menu so dargestellt werden, dass es auch auf den Bildschirm passt - so wie z.B. die Filter-Popups.
    • Siehe #24641.

Review

  • Wenn ein Kontext-Menü bereits offen ist und man macht auf ein anderes Element einen Rechtsklick, sollte das erste Kontext-Menü geschlossen und ein neues geöffnet werden. Bisher bleibt das Kontext-Menü offen und es geht zusätzlich das Browser-Kontext-Menü auf. Das ist für mich verwirrend. Weil ich das meistens mache, wenn ich mich verklickt habe und auf einem anderen Element das Kontext-Menü aufmachen möchte.
    • Wenn man bei geöffnetm Kontext-Menü auf dem Hintergrund jetzt den Kontext-Menü-Click ausführt, wird das ursprüngliche Kontext-Menü geschlossen statt das Browser-Kontext-Menü zu öffnen. Leider kann man in dieser Situation nicht das Kontext-Menü des neuen Ziels direkt öffnen, da der Klick dieses Ziel nicht trifft sondern eine durchsichtige Pane die über dem kompletten Fenster liegt.
  • Wenn man auf ein Objekt mit langem Namen klickt, wird das Kontext-Menü so breit wie der Name. In manchen Anwendungen hat der Kunde aber sehr lange Namen für seine Fachobjekte. Daher sollte die Breite des Kontext-Menüs begrenzt werden.
    • Der Titel wird nie breiter als der Inhalt des Menüs.
  • Die Breite des Kontext-Menüs verhält sich seltsam: Beim Klick auf das Root-Objekt im Demo-Typen-Baum bricht der Text "Knoten anlegen" um. Vermutlich weil das Kontext-Menü zu schmal ist. Aber wenn ich die I18N-Keys anzeigen lasse, wird es sehr viel breiter angezeigt, ohne Text umzubrechen.
    • Menü-Eintäge brechen nicht mehr um.
  • Wenn man mit dem Kontext-Menü den Gui-Inspector öffnet und etwas außerhalb des Kontext-Menüs klickt, wird der Cursor zum Warte-Cursor. Erst nach einer Weile merkt man, dass nichts passiert und dass der Warte-Cursor immer außerhalb des Kontext-Menüs angezeigt wird. Das ist irritierend, betrifft aber andererseits auch nur uns. Kann man da trotzdem noch etwas verbessern? Zum Beispiel dass das Inspizieren dort auch funktioniert. Oder das der Cursor beim Inspizieren außerhalb des Kontext-Menüs sich auf "nicht möglich" ändert.
    • Das ist nicht anders als bei bisherigen Burger-Menüs auch. Der Cursor kann nicht kontext-sensitiv sein, weil während der Inspektion eine Pane über dem gesammten Inhalt liegt.
  • In der Grid kann ich im Kontext-Menü jeder Zeile in den Bearbeiten-Modus wechseln. Aber Abbrechen, Speichern usw. kann ich dort nicht machen. Das gibt es nur, wenn ich in den Tabellen-Header klicke. Das wirkt inkonsistent. Kannst du das noch einbauen?
    • In der Grid kann man zwar alle Zeilen über das Kontext-Menü bearbeiten, aber man kann natürlich nur die eine aktuell bearbeitete speichern/übernehmen/abbrechen - das ist der Unterschied. Es ist jetzt genau so eingebaut, dass man speichern/übernehmen/abbrechen nur im Kontext-Menü des gerade bearbeitetn Objektes/der bearbeitetn Zeile sieht. Das gilt nicht nur für die Grid sondern auch für Bäume mit Detail-Sicht (zumindest dann, wenn "Bearbeiten" im Kontext-Menü des Baumes auftaucht, also z.B. in Strukturen:Aspektvererbung).
  • In den Demo Tabellen-Sichten "Frozen", "Konfigurierte Sidebar" und "Baumbasierte Tabelle" kann ich das Kontext-Menü der Komponente nicht öffnen. Ich kann nur das für einzelne Zeilen öffnen. Ist das Absicht?
    • Das Kontext-Menü für diese Sichten hat keine Einträge. Die Tabellen-Konfigurationskommandos tauchen nicht im Kontext-Menü auf. Könnte man sich sicher auch wünschen, ist aber technisch schwierig.
  • In den Toolbars kann ich das Kontext-Menü für deren Komponenten nicht öffnen.
    • Ja, technisch schwierig.
  • Wenn man die Kontext-Menü-Provider mit dem Typ der Komponente parametrisiert, müssen die konkreten Ableitungen die Komponente nicht jedes mal casten.
    • Wenn man das täte (com.top_logic.layout.basic.contextmenu.component.ContextMenuFactory parametrisieren), dann könnte man die Methode nicht mehr aufrufen (ohne einen unchecked Cast).
  • In ComponentContextMenuFactory.Provider.createButtons(...) werden einer Liste weitere Objekte hinzugefügt. Diese Liste kommt aus super.createButtons(...). Das Problem: super gibt keine Garantien, ob die Liste mutable oder auch nur resizable ist. Die Liste wird dort mittels createProviderButtons(...) erzeugt. Das ruft wiederum toButtons(...) auf. Und das verwendet Collectors.toList(...). Und das sagt: "There are no guarantees on the type, **mutability**, serializability, or thread-safety of the List returned; if more control over the returned List is required, use toCollection(Supplier)." In der von mir verwendeten Java-Version wird dort ArrayList::new verwendet, wodurch es funktioniert. Aber mit Listen die von woanders kommen, sollte man generell vorsichtig sein.
    • Ack.
  • TypeBasedContextMenuFactory.Provider._component kannst du final machen.
    • Ok.
  • TypeBasedContextMenuFactory.Config: Bei den Properties fehlen die Konstanten für deren @Name.
    • Done.
  • ContextMenuCommandsProvider: Dieses Interface hat zwei Methoden: hasContextMenuCommands und getContextCommands. Für die erste lässt sich eine triviale Default-Implementierung angeben: !getContextCommands(...).isEmpty(). Dann wäre es ein Functional-Interface und könnte per Lambda-Ausdruck implementiert werden. Bisher benötigt man dafür immer eine neue Klasse. Selbst wenn die anonym ist, sind das viel mehr Zeilen als ein Lambda-Ausdruck. Und dort wo eine Optimierung möglich ist, kann weiterhin diese Methode implementiert werden.
    • Das Interface hat genau deswegen zwei Methoden, weil die eine extrem häufig gerufen wird und daher schell sein muss und die andere teuer sein kann. Daher ist die triviale Default-Implementierung kontraproduktiv. Das steht auch so (vielleicht zu freundlich) in der Dokumentation: "Can be used for optimizing the decision, whether a context menu should be offered."
  • ConfiguredContextMenuCommandsProvider: Die Instanzvariablen kannst du final machen. Für das Property override fehlt die @Name Annotation. Für entries fehlt eine Konstante für den Wert der @Name Annotation.
    • Done.
  • GridContextMenuFactory.Provider.acceptComponentCommand(...) Die Methode ist überschrieben, ruft aber nur super auf.
    • Removed.
  • GridTableConfig: Im JavaDoc steht: "TabConfig with defaults for GridComponent." Du meintest bestimmt TableConfig statt TabConfig.
  • Es gibt jetzt zwei Klassen TestLabelProviderService. Beide wurden in diesem Jahr eingeführt. Eine unter #24380 in com.top_logic.element. Und eine unter #24501 in com.top_logic.
    • Das ist Absicht, weil man Modell-Verweise nur in tl-element testen kann.
  • Folgende Instanzvariablen kannst du final machen:
    • ContextCommandsControl._contextMenu und _titleProvider
    • ContextMenuControl._contextMenu
    • AbstractMenuContents._contents
    • Done.

Test

Bäume

Tabellen

Grids

Komponenten-Kommandos

Inline-Objekte

Formularfelder
  • Für Form-Fields, Technisches Demo:Layout-Framework#1:Formulare:Form Controls (inline) das Feld textInputWithContextMenu hat ein Kontext-Menü, das vordefinierte Werte in das Feld einfügt.
  • Get Started
  • Github
  • Discord
  • Das Unternehmen hinter TopLogic
  • Softwareentwicklung heute
  • Kontakt

© Copyright – Business Operation Systems GmbH

  • top-logic.com
  • Nutzungsbedingungen
  • Impressum
  • Rechtlicher Hinweis
  • Datenschutz
  • EN
  • Login