Agrupamento de vários níveis do SlickGrid com seleção de nível de grupo

10

status atual da grade

Implementei uma grade lisa com um modelo de seleção personalizado e um plug-in de seleção de caixa de seleção personalizada. Também adicionei caixas de seleção no nível do grupo para permitir a seleção no nível superior. Um dos meus requisitos é que os agrupamentos recolhidos ainda possam ser selecionados por qualquer caixa de seleção de agrupamento no nível pai.

Minha pedra de tropeço parece ser que não consigo descobrir como selecionar linhas que não estão atualmente visíveis no grupo. A grade lisa mantém o conjunto de itens selecionados visualmente, enquanto a visualização de dados das grades mantém o conjunto completo de itens selecionados, visíveis ou não. No entanto, não consigo descobrir como inserir dados ao clicar na caixa de seleção do grupo de uma linha recolhida.

Estou configurando minha grade assim:

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 os plug-ins personalizados, muito tempo para incluir aqui Especificamente, se você observar a linha 57de slick.checkboxselectionmodel:

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

groupRowIndex nunca é resolvido para linhas ocultas e, portanto, nunca é selecionado. Tentei expandir o grupo quando clicado e depois resolver as linhas, o que funciona, mas quando o grupo é recolhido posteriormente, as linhas erradas são selecionadas na grade.

Qualquer ajuda seria muito apreciada!

algumas notas:

Julien
fonte
2
vou colocar uma recompensa gorda o mais rápido possível
Julien
11
Há um problema aberto # 165 para isso, e acho que o que ajudaria é que você ou qualquer outra pessoa forneça uma correção para esse problema no fork 6pac. Este é um projeto de código aberto com contribuições da comunidade, portanto, quaisquer contribuições ajudam a melhorar esta biblioteca ao longo dos anos.
ghiscoding

Respostas:

1

lista de plugins atualizados

Uma solução funcional que estou confiante pode colocar qualquer pessoa que procure um comportamento semelhante no caminho certo; no entanto, não tenho certeza de como esses plug-ins funcionariam independentemente. um dos meus requisitos era permitir apenas a seleção de linhas pela caixa de seleção de linhas.

uma dica (que eu tenho certeza que é facilmente aprimorada) é que a caixa de seleção no nível do grupo ainda precisa ser definida no seu operador de formato de grupo

a principal solução para o meu problema foi expandir todos os grupos recolhidos ao fazer seleções / desmarcações em nível de grupo, executar rotinas de seleção / desmarcar e recolher quaisquer grupos expandidos anteriormente

EDITAR:

Isso falha quando a grade possui grandes quantidades de dados (10 mil linhas). Reabertura com uma recompensa.

Parece que o impacto no desempenho de ter que expandir e contrair tantos grupos causa problemas.

Julien
fonte
11
@AmerllicA esta resposta foi prematura e não funciona com grandes conjuntos de dados
Julien
11
@AmerllicA não é apenas antiético agradar dessa forma por alguma recompensa, mas, na verdade, o OP começou a recompensa depois que esta resposta foi publicada e isso é porque o OP não teve os resultados que ele queria com esta resposta. Portanto, pare de implorar dessa forma por uma recompensa que você não ganhou e, em vez disso, tente ajudar o OP com o problema dele, se tiver tempo para encontrar uma solução boa / melhor.
Christos Lytras
@ChristosLytras, vou excluir meu comentário imediatamente, obrigado pela dica.
AmerllicA
@ChristosLytras pensou a mesma coisa, não poderia ter dito melhor
Islam Elshobokshy 21/02