Regroupement à plusieurs niveaux SlickGrid avec sélection au niveau du groupe


10

état actuel du réseau

J'ai implémenté une grille lisse avec un modèle de sélection personnalisé ainsi qu'un plugin de sélection de case à cocher personnalisé. J'ai également ajouté des cases à cocher au niveau du groupe pour permettre de basculer la sélection au niveau supérieur. L'une de mes exigences est que les regroupements réduits soient toujours sélectionnables via toutes les cases à cocher de regroupement au niveau parent.

Ma pierre d'achoppement semble être que je ne peux pas comprendre comment sélectionner des lignes qui ne sont pas actuellement visibles sur le groupe. La grille lisse conserve l'ensemble des éléments sélectionnés visuellement tandis que la vue des données de la grille conserve l'ensemble complet des éléments sélectionnés, visibles ou non. Cependant, je ne peux pas comprendre comment diriger les données en cliquant sur la case à cocher de groupe d'une ligne réduite.

Je configure ma grille comme suit:

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);

l'essentiel des plugins personnalisés, trop long pour être inclus ici Plus précisément, si vous regardez la ligne 57de slick.checkboxselectionmodel:

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

groupRowIndex n'est jamais résolu pour les lignes masquées et ne sera donc jamais sélectionné. J'ai essayé de développer le groupe lorsque vous cliquez dessus, puis de résoudre les lignes, ce qui fonctionne, mais lorsque le groupe est réduit par la suite, les mauvaises lignes sont sélectionnées dans la grille.

toute aide serait grandement appréciée!

quelques notes:


2
je vais mettre en place une grosse prime dès que possible
Julien

1
Il y a un problème ouvert # 165 pour cela, et je pense que ce qui aiderait c'est que vous ou quelqu'un d'autre fournissiez simplement un correctif à ce problème dans la fourchette 6pac. Il s'agit d'un projet Open Source avec des contributions de la communauté, donc toutes les contributions contribuent à améliorer cette bibliothèque au fil des ans.
ghiscodage

Réponses:


1

l'essentiel des plugins mis à jour

Une solution fonctionnelle qui, j'en suis convaincu, pourrait mettre quiconque cherche un comportement similaire sur la bonne voie, cependant, je ne sais pas dans quelle mesure l'un de ces plugins fonctionnerait indépendamment. l'une de mes exigences était de n'autoriser la sélection des lignes que via la case à cocher des lignes.

un problème (qui, j'en suis sûr, est facilement amélioré) est que la case à cocher au niveau du groupe doit encore être définie dans votre opérateur de format de groupe

la principale solution à mon problème était d'étendre tous les groupes réduits lors des sélections / désélectionnements au niveau du groupe, d'effectuer toutes les routines de sélection / désélection, puis de réduire tous les groupes précédemment développés

ÉDITER:

Cela échoue lorsque la grille contient de grandes quantités de données (10 000 lignes). Réouverture avec une prime.

Il semble que les performances aient dû être développées et réduites, de nombreux groupes provoquent des problèmes.


1
@AmerllicA cette réponse était prématurée et ne fonctionne pas avec de grands ensembles de données
Julien

1
@AmerllicA ce n'est pas seulement contraire à l'éthique de plaire comme ça pour une prime, mais en fait, le PO a commencé la prime après la publication de cette réponse et c'est parce que le PO n'a pas eu les résultats qu'il voulait avec cette réponse. Alors, s'il vous plaît, arrêtez de mendier comme ça pour des primes que vous n'avez pas gagnées et essayez plutôt d'aider OP avec son problème si vous avez le temps de trouver une bonne / meilleure solution.
Christos Lytras

@ChristosLytras, je supprimerai mon commentaire immédiatement, merci pour l'astuce.
AmerllicA

@ChristosLytras pensait la même chose, n'aurait pas pu le dire mieux
Islam Elshobokshy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.