SlickGrid agrupación multinivel con selección de nivel de grupo

10

estado actual de la cuadrícula

He implementado una cuadrícula pulida con un modelo de selección personalizado, así como un complemento de selección de casilla de verificación personalizado. También agregué casillas de verificación de nivel de grupo para permitir alternar la selección en el nivel superior. Uno de mis requisitos es que las agrupaciones contraídas todavía se pueden seleccionar a través de cualquier casilla de verificación de agrupación de nivel primario.

Mi obstáculo parece ser que no puedo entender cómo seleccionar filas que actualmente no están visibles en el grupo. La grilla pulida mantiene el conjunto de elementos visualmente seleccionados, mientras que la vista de datos de cuadrículas mantiene el conjunto completo de elementos seleccionados, visibles o no. Sin embargo, no puedo entender cómo canalizar los datos al hacer clic en la casilla de verificación de grupo de una fila contraída.

Estoy configurando mi grilla así:

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

Lista de complementos personalizados, demasiado largos para incluirlos aquí. Específicamente, si observa la línea 57de slick.checkboxselectionmodel:

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

groupRowIndex nunca se resuelve para filas ocultas, por lo que nunca se selecciona. Intenté expandir el grupo cuando hice clic, luego resolví las filas, lo que funciona, pero cuando el grupo se contrae después, se seleccionan las filas incorrectas en la cuadrícula.

Cualquier ayuda sería muy apreciada!

algunas notas:

Julien
fuente
2
ofreceré una generosa recompensa lo antes posible
Julien
1
Hay un problema abierto # 165 para esto, y creo que lo que ayudaría es que usted o cualquier otra persona simplemente proporcionen una solución a ese problema en el tenedor de 6pac. Este es un proyecto de código abierto con contribuciones de la comunidad, por lo que cualquier contribución ayuda a mejorar esta biblioteca a lo largo de los años.
ghiscoding

Respuestas:

1

gist a complementos actualizados

Una solución funcional que estoy seguro podría poner a cualquiera que busque un comportamiento similar en el camino correcto, sin embargo, no estoy seguro de qué tan bien funcionaría cualquiera de estos complementos de forma independiente. uno de mis requisitos era permitir solo la selección de filas mediante la casilla de verificación de filas.

Un problema (que estoy seguro de que se mejora fácilmente) es que la casilla de verificación de nivel de grupo aún debe definirse en el operador de formato de grupo

La solución principal a mi problema era expandir todos los grupos contraídos al hacer selecciones / deselecciones a nivel de grupo, realizar cualquier rutina de selección / deselección, luego contraer cualquier grupo previamente expandido

EDITAR:

Esto falla cuando la cuadrícula tiene grandes cantidades de datos (10k filas). Reapertura con una recompensa.

Parece el golpe de rendimiento de tener que expandirse y colapsar tantos grupos causan problemas.

Julien
fuente
1
@AmerllicA esta respuesta fue prematura y no funciona con grandes conjuntos de datos
Julien
1
@AmerllicA No solo no es ético agradar esto por alguna recompensa, sino que en realidad el OP comenzó la recompensa después de que se publicó esta respuesta y eso es porque el OP no tenía los resultados que quería con esta respuesta. Por lo tanto, deja de rogar de esta manera por la recompensa que no has ganado y, en su lugar, intenta ayudar a OP con su problema si tienes tiempo para encontrar una solución buena / mejor.
Christos Lytras
@ChristosLytras, eliminaré mi comentario de inmediato, gracias por la pista.
AmerllicA
@ChristosLytras pensó lo mismo, no podría haberlo dicho mejor
Islam Elshobokshy