Mehrstufige SlickGrid-Gruppierung mit Auswahl auf Gruppenebene

10

aktueller Netzstatus

Ich habe ein Slick-Grid mit einem benutzerdefinierten Auswahlmodell sowie einem benutzerdefinierten Checkbox-Auswahl-Plugin implementiert. Ich habe auch Kontrollkästchen auf Gruppenebene hinzugefügt, um das Umschalten der Auswahl auf der obersten Ebene zu ermöglichen. Eine meiner Anforderungen ist, dass reduzierte Gruppierungen weiterhin über alle Kontrollkästchen für Gruppierungen auf übergeordneter Ebene ausgewählt werden können.

Mein Stolperstein scheint zu sein, dass ich nicht herausfinden kann, wie Zeilen ausgewählt werden sollen, die derzeit in der Gruppe nicht sichtbar sind. Das glatte Raster verwaltet den Satz visuell ausgewählter Elemente, während die Rasterdatenansicht den vollständigen Satz ausgewählter Elemente verwaltet, ob sichtbar oder nicht. Ich kann jedoch nicht herausfinden, wie Daten übertragen werden, wenn ich auf das Kontrollkästchen Gruppe einer reduzierten Zeile klicke.

Ich konfiguriere mein Grid wie folgt:

let checkboxSelectionModel = new Slick.CheckboxSelectionModel();
this.grid.setSelectionModel(checkboxSelectionModel);

this.grid.registerPlugin(new Slick.Data.GroupItemMetadataProvider());

let onSelectedRowIdsChanged = this.dataProvider.syncGridSelection(this.grid, true, true);

onSelectedRowIdsChanged.subscribe(
  function(e: any, args: any)
    {
      //business logic stuff                    
    }
  );

let groupedCheckboxSelector = new Slick.GroupedCheckboxSelectColumn({
  cssClass: "slick-cell-checkboxsel",
  onSelectedRowIdsChangedHandler: onSelectedRowIdsChanged
});

let columns = this.grid.getColumns();
columns.unshift(groupedCheckboxSelector.getColumnDefinition());
this.grid.setColumns(columns);

this.grid.registerPlugin(groupedCheckboxSelector);

Gist , um benutzerdefinierte Plug - In zu lange hier schließen Insbesondere wenn Sie in Zeile sehen 57von slick.checkboxselectionmodel:

$.each(dataItem.rows, function(index, groupRow) {
  var groupRowIndex = _self._grid.getData().getRowById(groupRow.id);
    if (groupRowIndex) {
      selection.push(groupRowIndex);
    }
});

groupRowIndex wird niemals für ausgeblendete Zeilen aufgelöst und wird daher niemals ausgewählt. Ich habe versucht, die Gruppe beim Klicken zu erweitern und dann die Zeilen aufzulösen. Dies funktioniert, aber wenn die Gruppe anschließend reduziert wird, werden die falschen Zeilen im Raster ausgewählt.

Jede Hilfe wäre sehr dankbar!

einige Notizen:

Julien
quelle
2
Ich werde so schnell wie möglich ein fettes Kopfgeld
Julien
1
Es gibt ein offenes Problem Nr. 165 dafür, und ich denke, was helfen würde, ist, dass Sie oder jemand anderes nur eine Lösung für dieses Problem in der 6pac-Gabel bereitstellen. Dies ist ein Open Source-Projekt mit Beiträgen der Community, daher tragen alle Beiträge dazu bei, diese Bibliothek im Laufe der Jahre zu verbessern.
Ghiscoding

Antworten:

1

Kern zu aktualisierten Plugins

Eine funktionale Lösung, von der ich überzeugt bin, dass sie jeden, der ein ähnliches Verhalten sucht, auf den richtigen Weg bringen kann. Ich bin mir jedoch nicht sicher, wie gut eines dieser Plugins unabhängig voneinander funktionieren würde. Eine meiner Anforderungen war es, die Zeilenauswahl nur über das Kontrollkästchen Zeile zuzulassen.

Ein Problem (von dem ich sicher bin, dass es leicht zu verbessern ist) ist, dass das Kontrollkästchen auf Gruppenebene noch in Ihrem Gruppenformatoperator definiert werden muss

Die Hauptlösung für mein Problem bestand darin, alle reduzierten Gruppen zu erweitern, wenn Sie auf Gruppenebene auswählen / die Auswahl aufheben, Routinen zum Auswählen / Deaktivieren ausführen und dann alle zuvor erweiterten Gruppen reduzieren

BEARBEITEN:

Dies schlägt fehl, wenn das Raster große Datenmengen enthält (10.000 Zeilen). Wiedereröffnung mit einem Kopfgeld.

Es sieht so aus, als würde der Leistungseinbruch, so viele Gruppen erweitern und reduzieren zu müssen, Probleme verursachen.

Julien
quelle
1
@AmerllicA Diese Antwort war verfrüht und funktioniert nicht mit großen Datenmengen
Julien
1
@AmerllicA Es ist nicht nur unethisch, dies für ein Kopfgeld zu mögen, sondern tatsächlich hat das OP das Kopfgeld gestartet, nachdem diese Antwort veröffentlicht wurde, und das liegt daran, dass das OP mit dieser Antwort nicht die gewünschten Ergebnisse erzielt hat. Hören Sie also bitte auf, so um Kopfgeld zu betteln, das Sie nicht verdient haben, und versuchen Sie stattdessen, OP bei seinem Problem zu helfen, wenn Sie Zeit haben, eine gute / bessere Lösung zu finden.
Christos Lytras
@ChristosLytras, ich werde meinen Kommentar sofort löschen, danke für den Hinweis.
AmerllicA
@ChristosLytras dachte das Gleiche, hätte es nicht besser sagen können
Islam Elshobokshy