enhancement
major
minor
major
minor
Kontext
In der React-Oberfläche (.view.xml-Ebene) können Tabellen (<table>) und Bäume (<tree>) bisher nur eine einzelne Zeile bzw. einen einzelnen Knoten auswählen. Die zugrunde liegenden React-Controls (TableViewControl, ReactTreeControl) beherrschen die Mehrfachauswahl bereits (Checkbox-Spalte, Strg-/Umschalt-Klick, Strg+A, Bereichsauswahl per Tastatur), es gibt aber keine Möglichkeit, sie in einer View einzuschalten.
Erweiterung
Tabellen und Bäume erhalten ein Attribut selection-mode mit den Werten single (Standard) und multi:
<table selection-mode="multi" selection="selected" types="…"/> <tree selection-mode="multi" selection="selected">…</tree>
Im Modus multi kann der Anwender beliebig viele Zeilen bzw. Knoten auswählen. In der Tabelle erscheint dafür eine Checkbox-Spalte mit "Alle auswählen"; zusätzlich funktionieren Strg-Klick (einzeln hinzufügen/entfernen), Umschalt-Klick (Bereich), Strg+A sowie Umschalt/Strg mit Pfeiltasten. Im Baum wird die Auswahl mit Strg-/Umschalt-Klick, Leertaste und Umschalt+Pfeiltasten erweitert; die Pfeiltasten allein bewegen nur den Cursor.
Der an selection gebundene Kanal enthält wie bisher bei genau einem ausgewählten Objekt dieses Objekt, bei mehreren die Menge der Objekte und bei leerer Auswahl null. Umgekehrt wird bei einer Tabelle im Modus multi ein Mengenwert im Kanal als Auswahl in der Tabelle angezeigt (z. B. wenn mehrere Tabellen denselben Kanal teilen). Ein Kommando, das genau ein Objekt benötigt, bindet an einen abgeleiteten Kanal, etwa sel -> if($sel.size() == 1, $sel.singleElement(), null).
Lösung
- TableElement.Config erhält die Eigenschaft selection-mode (Typ: bestehendes Enum com.top_logic.table.SelectionMode, jetzt ExternallyNamed mit den Namen single/`multi` und dem Default-Provider SelectionMode.SingleDefault), die den initialen TableViewState der Tabelle mit der entsprechenden Selection vorbelegt. Die Auswahl ist nicht Teil der Personalisierung, der konfigurierte Modus bleibt daher erhalten. Auch die editierbare Variante (row-edit, RowSetTableControl) übernimmt den Modus.
- TableSelectionBinding wendet im Modus multi einen Mengenwert des Kanals als Auswahl an (neue Methode TableViewControl.selectRows(Collection)); im Modus single wird ein Mengenwert wie bisher als "keine Auswahl in dieser Tabelle" behandelt. Verschwinden angezeigte ausgewählte Zeilen bei einem Refresh, wird der Kanal auf die verbleibende Auswahl gesetzt.
- TreeElement.Config erhält dieselbe Eigenschaft; im Modus multi wird ein DefaultMultiSelectionModel verwendet. ReactTreeControl.setSelectionMode nimmt statt eines Strings das Enum SelectionMode entgegen. Die neue Klasse TreeSelectionBinding schreibt die Fachobjekte (nicht die Baumknoten) der Auswahl in den Kanal; DesignerTreeElement verwendet sie ebenfalls.
- Demo: Die Tabelle "Attribute" der React-Demo-Anwendung (Löschen wirkt auf alle ausgewählten Objekte, Bearbeiten und das Detailformular auf die Einzelauswahl über einen abgeleiteten Kanal selectedSingle) sowie die Baum-Demo verwenden die Mehrfachauswahl; Dokumentation im Abschnitt "Selecting rows and nodes" in docs/faq/react-view-layer.md.
Nicht Teil dieses Tickets: Die Übernahme eines Kanalwerts in die Auswahl eines Baums (Richtung Kanal → Baum) existiert bisher nicht und wird hier nicht ergänzt.