Verbesserung
Wichtig
Detail
Detail
Detail
#27996
Löschen taucht nicht im Kontext-Menü von Multiselektionskomponenten auf
Die Tabellen spezifischen Kontext Menü Einträge werden nicht mehr angezeigt.
Analyse
Beispiel tl:GridComponent: Das Kontext Menü wird von tl:ContextMenuOpener erzeugt. Der verwendet dazu ContentControl.createContextMenu(String). Das ContentControl ist das für die Grid. Und das verwendet ComponentContextMenuFactory.Provider welches von tl:PlainComponentContextMenuFactory erzeugt wurde. Dabei gibt es extra die Ableitung GridContextMenuFactory.Provider. Ursache ist, dass an der Grid die Config Property getComponentControlProvider als Default tl:ControlRepresentableCP hat. Und das hat an der Property getContextMenuFactory nur die PlainComponentContextMenuFactory.
tl:GridContextMenuFactory wird auch extra in der tl:GridTableConfig hinterlegt, einer Ableitung von tl:TableConfig. Darauf greift das tl:TableData und darüber das tl:TableControl zu. Letzteres wird aber vom tl:ContextMenuOpener nie aufgerufen. Der ruft immer wie oben beschrieben ContentControl.createContextMenu(String) statt TableControl.createContextMenu(String) auf.
Ursache ist die HTML Struktur: Damit ein Kontext Menü geöffnet wird, muss das HTML Attribut data-context-menu gesetzt sein. Das ist nur am HTML Tag für die gesamte Komponente gesetzt. Aber es ist seit #27350 ("Tabellen über HTML Templates rendern") nicht mehr an den Tabellen Zeilen (tr Tags) gesetzt. Dadurch wird bei der Suche nach außen im HTML Baum am tr Tag nichts gefunden, sondern erst am Tag für die gesamte Komponente. Und dadurch wird das tl:TableControl und damit auch die tl:GridContextMenuFactory nie aufgerufen.
Test
- Im Demo im Baum ein Objekt mit mehreren Kindern auswählen.
- In der Grid daneben mehrere dieser Kinder selektieren.
- Das Kontext Menü auf einem der selektierten Kinder öffnen.
- Es muss unter anderem einen "Löschen" Knopf geben.
- Der muss genau die selektierten Kinder löschen.
- Wieder mehrere Kinder selektieren.
- Das Kontext Menü auf einem nicht selektierten Kind öffnen.
- Es muss unter anderem einen "Löschen" Knopf geben.
- Der darf nur dieses eine nicht-selektierte Kind löschen.