enhancement
major
minor
major
minor
major
#29640
TL Views: Gruppen einer gruppierten Tabelle werden nach dem Komparator der Gruppierungsspalte sortiert, nicht in zufälliger Reihenfolge
Kontext
Eine <table> der React-Views (com.top_logic.layout.view) kann nach einer Spalte gruppiert werden (group-by, Kontextmenü der Spaltenüberschrift, Spaltenauswahl). Jede Gruppe wird als aufklappbare Kopfzeile mit ihren Zeilen darunter dargestellt; der Gruppenwert steht in der Kopfzeile in der ersten angezeigten Spalte. Die Gruppierungsspalte selbst ist üblicherweise ausgeblendet, da sie redundant ist.
Problem
Wird eine gruppierte Tabelle nach einer anderen Spalte als der Gruppierungsspalte sortiert, erscheinen die Gruppen in scheinbar zufälliger Reihenfolge; nur innerhalb der Gruppen gilt die gewählte Sortierung. Ursache: Die Gruppierung (ListRowSource) sortiert zuerst alle Zeilen nach der Benutzersortierung und bildet die Gruppen dann in der Reihenfolge ihres ersten Auftretens. Die Gruppierungsspalte besitzt aber einen eigenen Komparator (Column#sort()), der für die Reihenfolge der Gruppen nie herangezogen wird. Insbesondere sortiert ein Klick auf die erste Spalte (die die Gruppenwerte anzeigt) nicht die Gruppen.
Lösung
Die Gruppen werden nach dem Komparator der Gruppierungsspalte geordnet:
- Nach dem Bilden der Gruppen ordnet ListRowSource#groupedRows die Gruppen mit dem Komparator der Gruppierungsspalte (Column#sort()), Gruppen ohne Wert zuletzt.
- Richtung der Gruppenreihenfolge: die Sortierrichtung der Gruppierungsspalte, falls sie selbst sortiert ist; sonst die Sortierrichtung der ersten angezeigten Spalte (die die Gruppenwerte in den Kopfzeilen zeigt); sonst aufsteigend. Ein Klick auf die erste Spalte sortiert damit die Gruppen und die Zeilen innerhalb der Gruppen in einem Zug; eine Sortierung nach einer anderen Spalte lässt die Gruppen aufsteigend.
- Eine Gruppierungsspalte ohne Sortierfähigkeit behält die Reihenfolge des ersten Auftretens.
- Die Reihenfolge innerhalb einer Gruppe bleibt die Benutzersortierung.
Technische Hinweise: Der Gruppen-Komparator ist ColumnLogic#groupComparator(Column, SortSpec) (allgemeiner Helfer neben dem Zeilen-Komparator); er reagiert auf einen Sortiereintrag der Gruppierungsspalte. DefaultTableView#effectiveOrder() leitet daraus die an die RowSource übergebene Sortierung ab: Ist die Tabelle gruppiert, die Gruppierungsspalte sortierbar und nicht selbst sortiert, aber die erste angezeigte Spalte sortiert, wird die Gruppierungsspalte mit deren Richtung vorangestellt. TableViewState#getSort() bleibt die Benutzersortierung (Persistenz, Sortiersymbole). Tests in test.com.top_logic.table.TestGrouping; Dokumentation im Abschnitt „Grouping“ von docs/faq/react-view-layer.md. Mehrspaltige Gruppierung und TreeRowSource (keine Gruppierung) sind nicht betroffen.
Demo: Die Startdaten der React-Demo (Z01_Project.objects.xml) enthalten zwei weitere Mitarbeiter A1 und B1 (ohne Tickets), damit die nach Anfangsbuchstaben gruppierte Tabelle unter „Demos → Tabellenspalten → Dynamische Spalten“ drei Gruppen zeigt. Startdaten werden nur in eine frische Datenbank geladen.