Synchro-TEC / apollo-11

Failure is not an option
http://espresso.synchro.com.br/
MIT License
4 stars 2 forks source link

DataTable on Steroids #6

Closed pffreitas closed 7 years ago

pffreitas commented 7 years ago

Guys...

Alguns projetos tem demandado recursos avançados para exibição de dados tabulares. Dada a característica data centric de nossas aplicações isso é esperado.

Tentei elencar abaixo o que considero "recursos avançados" e gostaria de iniciar uma discussão para tomarmos as decisões necessárias para seguirmos com o desenvolvimento.

Infinite Scroll

A ideia aqui é carregar todos os dados, sem paginação, provendo ao usuário uma experiência de continuidade ao explorar os dados. Ou seja, o usuário pode ir do primeiro ao último registro apenas scrolando a tabela.

Temos que ter cuidado com a implementação pois o carregamento de todos os dados pode ser demorado pensando em um caso de um grid de 30k registros, por exemplo. Uma possível saida seria o uso de streams, websockets e outras técnicas de realtime apps.

Com todos os dados no front, o usuário terá uma resposta mais fluida ao navegar pelos dados e executar operações de filtro e ordenação.

Filtro e Ordenação

Proposta de protótipo do componente de ordenação e filtro

screenshot from 2017-02-14 16-21-58

Agrupamento de Colunas

Proposta de protótipo para agrupamento de colunas

screenshot from 2017-02-14 16-22-22

Agrupamento de Linhas

Proposta de protótipo para agrupamento de linhas

screenshot from 2017-02-14 16-22-35

O que vocês acham? Faz sentido?

marcio commented 7 years ago

Pesquisei bastante sobre o assunto nos últimos dias, encontrei algumas implementações usando React que servem como um ponto de partida, são elas:

O projeto está parado faz um tempo, tem muitas Issues e PR abertos, mas com certeza é uma referência a se considerar, pois é da mesma galera que criou o React.

Projeto até que atual, simples e muito funcional, tem poucas issues abertas e resolve bem o esquema de agrupar os dados.

Esse está parado faz tempo e parece fazer coisas demais, porém é bem completo. Tem muitas issues e PR abertos tbm.

Esse está bem ativo, faz bastante coisa tbm (até d+), talvez tenha tudo o que precisamos, porém o layout e a forma de agrupamento precise evoluir para o nosso cenário.

Projeto parece estar parado, mas resolve de forma bem simples a questão do scroll.

Alguém tem mais referências?

pffreitas commented 7 years ago

Legal essas referências... acho que podem ser muito úteis como base para codificação.

Mas quanto aos 4 tópicos que eu abordei acima, do ponto de vista funcional, faz sentido?

Precisamos decidir quais funcionaldades ele terá inicialmente e como será seu funcionamento.

marcio commented 7 years ago

Proposta de especificações funcionais.

Primeira Versão:

Exemplo imaginário

const meusDados = [
  {
    id:1, 
    name:"John", 
    lastName:"Doe", 
    birthDate:"26/10/1974", 
    hourRate:30, 
    spentTime:82
  },
  {
    id:2, 
    name:"Walter", 
    lastName:"White", 
    birthDate:"28/06/1968", 
    hourRate:50, 
    spentTime:99 
  },
];

function fullNameFormatter(rowData) {
  return `${rowData.name} ${rowData.lastName}`;
}

function totalFormatter(rowData) {
  return rowData.hourRate * spentTime;
}

<PowerTable data='meusDados'>
  <PowerColumn columnTitle='Nome Completo' formatter={fullNameFormatter} />
  <PowerColumn columnTitle='Data de  Nascimento' dataKey='birthDate' noSort />
  <PowerColumn columnTitle='Preço da Hora' dataKey='hourRate' summarized />
  <PowerColumn columnTitle='Horas trabalhadas' dataKey='spentTime' summarized />
  <PowerColumn columnTitle='Total' formatter={totalFormatter} summarized />
</PowerTable>

Resultado

Nome Completo Data de Nascimento Preço da Hora Horas trabalhadas Total
John Doe 26/10/1974 30 82 2460
Walter White 28/06/1968 50 99 4950
80 181 7410

Ideias para versões futuras:

O que acham?

pffreitas commented 7 years ago

Achei da hora! Me parece fazer bastante sentido.

Só fiquei em dúvida quanto ao filtro:

O filtro será apenas um campo de texto, que filtrará todos os termos em todas as colunas

Não tenho muita segurança de que isso funciona bem como filtro para o usuário. Isso me soa mais como busca e não filtro. Acho que devemos considerar filtro como sendo restrições aplicadas em cima de dados estruturados. Ou seja, o usuário conhece qual coluna e qual valor deseja restringir. Ao contrário da busca, onde ele só conhece um termo aproximado, mas não sabe onde esse termo pode ocorrer.

Na minha opinião essa funcionalidade de filtro é crucial para a percepção de valor pelo usuário.

Enxergo esse componente PowerTable como algo específico voltado para "relatórios" de dados tabulares, algo como uma planilha mesmo. No entanto, ainda teremos a tabela mais simples, usada para listagem de objetos CRUD, por exemplo.

marcio commented 7 years ago

Atualizei a proposta para a primeira versão, fechamos assim? Estamos esquecendo de algo mais?

marcio commented 7 years ago

Foi implementado o Power Sheet