Big Table — DataTable com 50 colunas

O Big Table é o DataTable configurado como tela de relatório: 85 linhas × 50 colunas fake, baseadas na exportação fiscal EXPORT_20261007_093013. Os dados são crus (números, datas ISO, códigos como texto); a formatação em moeda e data acontece só em render.

Por onde começar: quem analisa os dados vai em Como usar a tabela; quem programa (com ou sem LLM) vai em Para quem implementa; a demonstração completa está logo abaixo, em Visão completa. Use o menu no topo para pular entre as seções.

Como usar a tabela

Para quem analisa os dados. Tudo é feito com cliques na própria tabela; nada altera o dado original, só a forma de olhar.

Quero…Como faço
Ver o total por filial, depois por CFOP, depois por parceiroClique em Loc. neg. → CFOP → Parceiro no painel de protótipo e use os botões 1 · 2 · 3 · Itens na barra da tabela: 1 = total por filial, 2 = por CFOP, 3 = por parceiro, Itens = as notas.
Agrupar por colunas que eu escolherSegure Ctrl e clique nos títulos das colunas (ou Shift para um intervalo) e clique em Agrupar. A ordem dos cliques é a hierarquia.
Abrir ou fechar um grupoClique na seta ▼/▶ da linha do grupo. Abrir um grupo não abre os grupos de dentro dele.
Somar valoresClique no título da coluna → seção Totais (soma, contagem, média, mínimo, máximo). Em colunas de dinheiro o valor aparece como R$.
FiltrarClique no funil do título e marque os valores. As opções de uma coluna respeitam os filtros das outras.
Esconder ou mostrar colunasClique no olho do título, ou na engrenagem ⚙ da barra para ver a lista completa.
Mudar a ordem das colunasArraste o título, ou selecione colunas e use ◀ ▶.
Mudar a largura de uma colunaArraste a borda direita do título (como no Excel). Duplo clique volta à largura original.
OrdenarClique no título → Ordenar.
Levar para o ExcelBotão de download na barra: exporta a tabela inteira, com todas as colunas, ignorando filtros.
Exemplo: apuração fiscal por filial (como no SAP GUI / SPED)
  1. Clique em SPED: 11SP por CST ICMS: a tabela filtra a filial 11SP e agrupa por CST ICMS, com os totais de moeda ligados.
  2. Leia o Valor contábil de cada CST na linha do grupo (recolhido) ou na linha de total.
  3. Para ver quais parceiros compraram: clique em Loc. neg. → CFOP → Parceiro e abra o CFOP desejado.
  4. Use Destacar… para pintar e pôr em negrito as colunas de interesse.

Variantes (visões salvas)

Como no SAP GUI: monte a tabela do seu jeito, dê um nome e volte a ela quando quiser. Nesta fase o contrato e a validação já existem; o botão “Variantes” na barra e a gravação no banco virão em seguida.

Para quem usa
  • Uma variante guarda como você olha a tabela: ordem e largura das colunas, colunas escondidas, filtros, ordenação, agrupamento, totais e cores/negrito.
  • Ela não guarda os dados (sempre aparecem os atuais) nem quais grupos estavam abertos.
  • Você escolhe o nome (ex.: “Apuração por filial”) e pode ter várias.
  • Se uma coluna deixar de existir, ela some da variante e você é avisado; o resto continua funcionando. Colunas novas aparecem no fim.
  • Quem pode ver a variante, usá-la como padrão ou compartilhá-la com todos (global) é decidido pela plataforma, conforme o seu nível de acesso.
Para quem implementa
  • O componente não grava nada: a variante é um JSON simples (DataTableView) que a tela salva e carrega.
  • sanitizeView(json, columns) valida e ajusta o JSON às colunas atuais. Nunca lança erro e é idempotente.
  • Padrão e global são da plataforma: o JSON só tem name; quem é dono, quem enxerga e qual é a padrão ficam na tabela do banco.
  • Todo estado de visão novo precisa ser controlável por prop e serializável (sem Set, função ou JSX).

Formato (JSON)

{
  "version": 1,
  "name": "Apuração por filial",
  "columnOrder": ["businessPlace", "cfop", "partnerName", "valorContabil"],
  "hiddenColumns": ["uf"],
  "columnWidths": { "partnerName": 240 },
  "columnFilters": [{ "key": "businessPlace", "values": ["11SP"] }],
  "sort": { "key": "valorContabil", "direction": "desc" },
  "groupByColumns": ["businessPlace", "cfop", "partnerName"],
  "groupDetailPlacement": "below",
  "columnAggregations": { "valorContabil": { "fn": "sum", "decimals": 2, "scope": "all", "showGrandTotal": true } },
  "columnStyles": [{ "keys": ["businessPlace", "cfop"], "tone": "brand", "bold": true }]
}

Só version e name são obrigatórios; campo ausente = “não mexer”. Fora da variante: dados, grupos abertos/fechados e seleção de colunas.

Salvar e abrir

import { sanitizeView, type DataTableView } from '@solutio/design-system';

// 1) Salvar: a tela monta o JSON a partir do estado que já controla e envia ao backend.
const variante: DataTableView = { version: 1, name: 'Apuração por filial', columnOrder, hiddenColumns, groupByColumns };
await api.salvarVariante(usuarioId, telaId, variante);

// 2) Abrir: ao carregar do banco, SEMPRE passe por sanitizeView com as colunas ATUAIS da tela.
const { view, removedColumns, notes } = sanitizeView(jsonDoBanco, columns);
// view.*          -> aplique em setOrder / setHidden / setLevels / setFilters ...
// removedColumns  -> colunas que não existem mais (já removidas da variante); avise o usuário
// notes           -> regras que ajustaram a variante (ex.: coluna agrupada não pode ficar oculta)

O que sanitizeView garante

SituaçãoResultado
Coluna citada que não existe maisRemovida de ordem, ocultas, larguras, filtros, ordenação, agrupamento, totais e estilos; listada em removedColumns.
Coluna nova (a variante não conhece)Entra no fim da ordem.
Coluna que não pode ser ocultada (hideable: false) ou que está agrupadaContinua visível; aviso em notes.
Coluna com groupable: false ou filterable: falseIgnorada no agrupamento / no filtro; aviso em notes.
Total com função não permitida ao tipo da colunaIgnorado (ex.: soma de texto); aviso em notes.
Largura menor que o mínimo, número inválido, valor de lista desconhecidoAjustada ao mínimo (48 px) ou ignorada.
Entrada que não é uma variante (null, texto, lista…)Variante vazia chamada “Variante”, sem lançar erro.
Variante de versão mais novaCampos desconhecidos ignorados; aviso em notes.

Para quem implementa

Passo a passo para montar uma tela de relatório com o DataTable, à mão ou com ajuda de um LLM. A receita completa está no pacote (docs/recipes/datatable-report-screen.md).

1. Código mínimo

'use client';
import { DataTable, type Column } from '@solutio/design-system';

const columns: Column<Nota>[] = [
  { key: 'businessPlace', label: 'Loc. negócios', width: '130px' },
  { key: 'cfop',          label: 'CFOP',          width: '110px' },
  { key: 'partnerName',   label: 'Nome Parceiro', width: '220px' },
  { key: 'valorContabil', label: 'Valor contábil', dataType: 'currency', width: '190px' },
];

<DataTable
  title="Apuração fiscal" columns={columns} rows={notas} rowKey={(r) => r.id}
  density="compact" horizontalScroll resizableColumns
  selectableColumns filterableColumns columnVisibilityControl
  groupByColumns={levels} onGroupByColumnsChange={setLevels}
  collapsibleGroups groupLevelControl
  aggregatable initialTotals="currency" exportable
/>

2. Props por recurso

RecursoProps principaisObservação
Colunas e dadoscolumns, rows, rowKey, Column.dataTypeDados crus; formatar só em render. Moeda = dataType "currency".
LarguraresizableColumns, columnWidths, defaultColumnWidths, onColumnWidthsChangeArrastar a borda; duplo clique restaura. O mínimo protege o ícone do funil.
Seleção e ordemselectableColumns, columnOrder, onColumnOrderChange, reorderableColumnsCtrl/Shift+clique; ◀ ▶ movem 1 posição por clique.
OcultarcolumnVisibilityControl, hiddenColumns, Column.hideableBloqueia ocultar coluna agrupada, com total ativo ou hideable=false.
FiltrofilterableColumns, columnFilters, onColumnFiltersChangeOpções dependentes. O .xlsx ignora filtros (exporta tudo).
AgrupamentogroupByColumns, onGroupByColumnsChange, groupDetailPlacement, Column.groupableA ordem é a hierarquia. "above" = estilo SAP (detalhe, grupo, total).
Níveis e gruposcollapsibleGroups, groupLevelControl, collapsedGroups, onCollapsedGroupsChangeBotões 1·2·3·Itens e "Agrupar" pela seleção. Chave de colapso = groupPathKey.
Totaisaggregatable, initialTotals, columnAggregations, Column.aggregationsCálculo exato (BigInt); nunca aproximado. Erro explícito para valor inválido.
Cor e negritoColumn.tone, Column.bold, columnStylesTons: neutral, brand, success, warning, error. A coluna vence o grupo. Só visual.
Exportarexportable, exportFileName, getExportRows, Column.exportValueTodas as linhas e colunas, valores crus; sem totais.
Barra e navegaçãotoolbarActions, onNavigate, pagination, pageSizeCom agrupamento a paginação é desligada (grupos completos).

3. Armadilhas comuns

4. Prompt pronto para um LLM

Copie, preencha o caso de uso no final e cole no seu assistente.
Implemente uma tela de relatório com o DataTable do @solutio/design-system (Yarn; nunca npm/pnpm/bun).

Leia ANTES: packages/design-system/docs/recipes/datatable-report-screen.md (receita) e o exemplo vivo
apps/docs/app/_components/BigTableReport.tsx. Não invente props: confira os tipos em DataTableProps/Column.

Regras:
1. 'use client' no componente de tela. rows chega por prop; o DataTable não busca dados.
2. Dados CRUS em rows: números como number, datas ISO (AAAA-MM-DD), códigos como texto (preserva zeros à esquerda).
   Formate só em Column.render. Dinheiro: Column.dataType = 'currency' (sem render).
3. Declare Column.dataType ('number' | 'currency' | 'text' | 'date'); nunca dependa de inferência.
4. Recursos são opt-in: horizontalScroll, resizableColumns, selectableColumns, columnVisibilityControl,
   filterableColumns, groupByColumns + collapsibleGroups + groupLevelControl, aggregatable/initialTotals, exportable.
5. Estado controlado quando a tela precisa reagir: columnOrder, columnFilters, groupByColumns, collapsedGroups.
   Ordene rows por groupByColumns no consumidor para a ordem ficar previsível.
6. Totais usam aggregateValues (decimal exato). NUNCA some com reduce/toFixed.
7. Cor/negrito: Column.tone/Column.bold ou columnStyles=[{ keys, tone, bold }] (só tokens; não use hex).
8. Só tokens --sol-* para qualquer estilo. Sem dark mode.
9. Escreva testes (Vitest + Testing Library) para os comportamentos criados.

Caso de uso a atender: <descreva a tela: colunas, hierarquia de agrupamento, totais, filtros>.

5. Onde olhar

ArquivoPara quê
packages/design-system/docs/recipes/datatable-report-screen.mdReceita completa (publicada junto do pacote).
apps/docs/app/_components/BigTableReport.tsxExemplo vivo com todos os recursos ligados (esta página).
apps/docs/app/_data/bigtable-mock.tsMassa fake: 50 colunas × 85 linhas, dados crus.
packages/design-system/src/components/DataTable.tsxTipos e TSDoc de cada prop (fonte de verdade).
openspec/specs/design-system-components/spec.mdContrato de comportamento por componente.

Visão completa — todas as funcionalidades

Visão completa — DataTable com 100% dos recursos
Todas as capacidades do DataTable ligadas ao mesmo tempo, com 50 colunas e 85 linhas: rolagem horizontal, reordenar colunas (arrastar e “Posição”), seleção de colunas (Ctrl/Shift+clique) com ◀ ▶, ocultar (⚙ e botão no cabeçalho), filtro por coluna com opções dependentes, ordenar, agrupar em N níveis (detalhe abaixo ou acima, recolher grupos), totais (dialog + totais iniciais) com coluna de moeda R$, exportação .xlsx, ações na barra, abrir detalhes e paginação “Mais”. Os controles acima da tabela são de protótipo.

Ctrl/Shift+clique seleciona colunas (◀ ▶ movem) · arraste um título ou use “Posição” · funil filtra · olho oculta · clique no título → ordenar, agrupar, totais · arraste a borda do cabeçalho para ajustar a largura · role para a direita

Apuração fiscal (85)
1000
12/03/2026
1101/AA
PETROSUL DISTRIBUIDORA SA
55
SP
R$ 136,53
R$ 12.287,26
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 12.287,26
R$ 12.287,26
0
0,00
R$ 2.211,71
R$ 0,00
R$ 0,00
R$ 2.211,71
00
R$ 10.075,55
R$ 166,25
R$ 0,00
R$ 0,00
R$ 166,25
50
0,00
0
R$ 10.075,55
R$ 765,74
R$ 0,00
R$ 0,00
R$ 765,74
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1010
28/01/2026
1102/AA
ATLANTICO QUIMICA SA
55
SP
R$ 33,11
R$ 9.205,23
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 9.205,23
R$ 9.205,23
0
0,00
R$ 1.656,94
R$ 0,00
R$ 0,00
R$ 1.656,94
00
R$ 7.548,29
R$ 124,55
R$ 0,00
R$ 0,00
R$ 124,55
50
0,00
0
R$ 7.548,29
R$ 573,67
R$ 0,00
R$ 0,00
R$ 573,67
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
12SP
18/01/2026
2101/AA
RDP ENERGIA LTDA
55
ES
R$ 465,51
R$ 16.758,23
R$ 0,00
R$ 167,58
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 16.925,81
R$ 16.758,23
0
0,00
R$ 3.016,48
R$ 0,00
R$ 0,00
R$ 3.016,48
00
R$ 13.741,75
R$ 226,74
R$ 0,00
R$ 0,00
R$ 226,74
50
0,00
0
R$ 13.741,75
R$ 1.044,37
R$ 0,00
R$ 0,00
R$ 1.044,37
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1014
22/03/2026
5102/AA
PETROSUL DISTRIBUIDORA SA
55
SP
R$ 179,32
R$ 22.953,07
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 22.953,07
R$ 22.953,07
0
0,00
R$ 4.131,55
R$ 0,00
R$ 0,00
R$ 4.131,55
00
R$ 18.821,52
R$ 310,56
R$ 0,00
R$ 0,00
R$ 310,56
50
0,00
0
R$ 18.821,52
R$ 1.430,44
R$ 0,00
R$ 0,00
R$ 1.430,44
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
12SP
14/02/2026
1302/AA
MEGABOX SHOP LTDA
62
SP
R$ 52,16
R$ 12.623,80
R$ 252,48
R$ 0,00
R$ 0,00
R$ 0,00
R$ 63,12
R$ 0,00
R$ 12.434,44
R$ 0,00
0
0,00
R$ 0,00
R$ 0,00
R$ 12.371,32
R$ 0,00
90
R$ 12.371,32
R$ 204,13
R$ 0,00
R$ 0,00
R$ 204,13
50
0,00
0
R$ 12.371,32
R$ 940,22
R$ 0,00
R$ 0,00
R$ 940,22
50
0,00
0
R$ 12.371,32
R$ 111,34
R$ 0,00
R$ 0,00
R$ 12.371,32
R$ 12,37
R$ 0,00
R$ 0,00
12SP
12/03/2026
1916/AA
PETROSUL DISTRIBUIDORA SA
55
SP
R$ 457,95
R$ 78.310,06
R$ 0,00
R$ 783,10
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 79.093,16
R$ 0,00
0
0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
40
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 78.310,06
R$ 704,79
R$ 0,00
R$ 0,00
R$ 78.310,06
R$ 78,31
R$ 0,00
R$ 0,00
11SP
05/03/2026
2916/AA
VIBRA ENERGIA SA
55
ES
R$ 538,04
R$ 47.347,15
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 236,74
R$ 0,00
R$ 47.583,89
R$ 0,00
0
0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
40
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 47.347,15
R$ 426,12
R$ 0,00
R$ 0,00
R$ 47.347,15
R$ 47,35
R$ 0,00
R$ 0,00
1010
16/01/2026
2662/AA
NORTE LOGISTICA EIRELI
55
SC
R$ 323,03
R$ 70.742,72
R$ 0,00
R$ 707,43
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 71.450,15
R$ 70.742,72
320
L
1,17
R$ 374,40
R$ 0,00
R$ 0,00
R$ 374,40
53
R$ 70.368,32
R$ 79,23
R$ 0,00
R$ 0,00
R$ 79,23
50
26,41
3
M3
R$ 70.368,32
R$ 364,77
R$ 0,00
R$ 0,00
R$ 364,77
50
121,59
3
M3
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
11SP
26/02/2026
1101/AA
PETROSUL DISTRIBUIDORA SA
55
SP
R$ 137,93
R$ 34.206,30
R$ 684,13
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 33.522,17
R$ 20.113,30
0
0,00
R$ 3.620,39
R$ 0,00
R$ 13.408,87
R$ 3.620,39
20
R$ 16.492,91
R$ 272,13
R$ 0,00
R$ 0,00
R$ 272,13
50
0,00
0
R$ 16.492,91
R$ 1.253,46
R$ 0,00
R$ 0,00
R$ 1.253,46
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1010
11/02/2026
1102/AA
ATLANTICO QUIMICA SA
55
SP
R$ 16,86
R$ 2.663,26
R$ 53,27
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 2.609,99
R$ 1.565,99
0
0,00
R$ 281,88
R$ 0,00
R$ 1.044,00
R$ 281,88
20
R$ 1.284,11
R$ 21,19
R$ 0,00
R$ 0,00
R$ 21,19
50
0,00
0
R$ 1.284,11
R$ 97,59
R$ 0,00
R$ 0,00
R$ 97,59
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1010
13/01/2026
2101/AA
TECNO OIL IND. E COM. LTDA.
55
SC
R$ 352,96
R$ 89.299,91
R$ 0,00
R$ 893,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 90.192,91
R$ 53.579,95
0
0,00
R$ 9.644,39
R$ 0,00
R$ 35.719,96
R$ 9.644,39
20
R$ 43.935,56
R$ 724,94
R$ 0,00
R$ 0,00
R$ 724,94
50
0,00
0
R$ 43.935,56
R$ 3.339,10
R$ 0,00
R$ 0,00
R$ 3.339,10
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
11SP
11/01/2026
5102/AA
ATLANTICO QUIMICA SA
55
SP
R$ 61,75
R$ 14.079,76
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 14.079,76
R$ 8.447,86
0
0,00
R$ 1.520,61
R$ 0,00
R$ 5.631,90
R$ 1.520,61
20
R$ 6.927,25
R$ 114,30
R$ 0,00
R$ 0,00
R$ 114,30
50
0,00
0
R$ 6.927,25
R$ 526,47
R$ 0,00
R$ 0,00
R$ 526,47
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1000
19/03/2026
1302/AA
ATLANTICO QUIMICA SA
62
SP
R$ 102,65
R$ 15.500,48
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 15.500,48
R$ 0,00
0
0,00
R$ 0,00
R$ 0,00
R$ 15.500,48
R$ 0,00
51
R$ 15.500,48
R$ 255,76
R$ 0,00
R$ 0,00
R$ 255,76
50
0,00
0
R$ 15.500,48
R$ 1.178,04
R$ 0,00
R$ 0,00
R$ 1.178,04
50
0,00
0
R$ 15.500,48
R$ 139,50
R$ 0,00
R$ 0,00
R$ 15.500,48
R$ 15,50
R$ 0,00
R$ 0,00
1000
19/03/2026
1916/AA
TECNO OIL IND. E COM. LTDA.
55
SP
R$ 501,79
R$ 9.032,22
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 9.032,22
R$ 0,00
0
0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
41
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 9.032,22
R$ 81,29
R$ 0,00
R$ 0,00
R$ 9.032,22
R$ 9,03
R$ 0,00
R$ 0,00
1014
23/02/2026
2916/AA
TECNO OIL IND. E COM. LTDA.
55
PR
R$ 773,53
R$ 181.780,72
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 908,90
R$ 0,00
R$ 182.689,62
R$ 0,00
0
0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
41
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
70
0,00
0
R$ 181.780,72
R$ 1.636,03
R$ 0,00
R$ 0,00
R$ 181.780,72
R$ 181,78
R$ 0,00
R$ 0,00
12SP
13/01/2026
2662/AA
NORTE LOGISTICA EIRELI
55
PR
R$ 477,17
R$ 55.829,13
R$ 0,00
R$ 558,29
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 56.387,42
R$ 55.829,13
887
L
1,17
R$ 1.037,79
R$ 0,00
R$ 0,00
R$ 1.037,79
02
R$ 54.791,34
R$ 66,03
R$ 0,00
R$ 0,00
R$ 66,03
50
26,41
2,5
M3
R$ 54.791,34
R$ 303,98
R$ 0,00
R$ 0,00
R$ 303,98
50
121,59
2,5
M3
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
11SP
28/03/2026
1101/AA
PETROSUL DISTRIBUIDORA SA
55
SP
R$ 55,51
R$ 11.823,56
R$ 0,00
R$ 118,24
R$ 0,00
R$ 35,47
R$ 0,00
R$ 0,00
R$ 11.977,27
R$ 11.823,56
0
0,00
R$ 2.128,24
R$ 0,00
R$ 0,00
R$ 2.128,24
10
R$ 9.695,32
R$ 159,97
R$ 0,00
R$ 0,00
R$ 159,97
50
0,00
0
R$ 9.695,32
R$ 736,84
R$ 0,00
R$ 0,00
R$ 736,84
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1010
09/03/2026
1102/AA
ATLANTICO QUIMICA SA
55
SP
R$ 94,98
R$ 18.520,56
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 18.520,56
R$ 18.520,56
0
0,00
R$ 3.333,70
R$ 0,00
R$ 0,00
R$ 3.333,70
10
R$ 15.186,86
R$ 250,58
R$ 0,00
R$ 0,00
R$ 250,58
50
0,00
0
R$ 15.186,86
R$ 1.154,20
R$ 0,00
R$ 0,00
R$ 1.154,20
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1010
14/02/2026
2101/AA
TECNO OIL IND. E COM. LTDA.
55
PR
R$ 1.807,77
R$ 65.079,76
R$ 0,00
R$ 650,80
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 65.730,56
R$ 65.079,76
0
0,00
R$ 11.714,36
R$ 0,00
R$ 0,00
R$ 11.714,36
10
R$ 53.365,40
R$ 880,53
R$ 0,00
R$ 0,00
R$ 880,53
50
0,00
0
R$ 53.365,40
R$ 4.055,77
R$ 0,00
R$ 0,00
R$ 4.055,77
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
1010
12/03/2026
5102/AA
RDP ENERGIA LTDA
55
SP
R$ 868,05
R$ 61.631,58
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 308,16
R$ 0,00
R$ 61.939,74
R$ 61.631,58
0
0,00
R$ 11.093,68
R$ 0,00
R$ 0,00
R$ 11.093,68
10
R$ 50.537,90
R$ 833,88
R$ 0,00
R$ 0,00
R$ 833,88
50
0,00
0
R$ 50.537,90
R$ 3.840,88
R$ 0,00
R$ 0,00
R$ 3.840,88
50
0,00
0
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
R$ 0,00
<DataTable
  title="Apuração fiscal"
  columns={ALL_COLUMNS}                 // 50 colunas, width em px; dinheiro = dataType: "currency"
  rows={rowsOrdenadasPeloConsumidor}
  rowKey={bigTableRowKey}
  density="compact"
  horizontalScroll
  columnOrder={order} onColumnOrderChange={setOrder}      // reordenar
  selectableColumns                                       // Ctrl/Shift+clique, ◀ ▶
  columnVisibilityControl                                 // ⚙ + botão ocultar no cabeçalho
  filterableColumns columnFilters={filters} onColumnFiltersChange={setFilters}
  onSortChange={(key, direction) => setSort({ key, direction })} sortBy={sort?.key} sortDirection={sort?.direction}
  groupByColumns={levels} onGroupByColumnsChange={setLevels}   // N níveis (ordem de clique)
  groupLevelControl                                       // botões de nível 1·2·3·Itens + Agrupar
  resizableColumns columnStyles={[{ keys: ["cfop"], tone: "brand", bold: true }]}
  groupDetailPlacement="below"                            // ou "above" (SAP GUI)
  collapsibleGroups collapsedGroups={collapsed} onCollapsedGroupsChange={setCollapsed}
  aggregatable initialTotals="none"                       // ou "currency" | ["value", "impostoIcms"]
  toolbarActions={actions} exportable exportFileName="apuracao-fiscal"
  onNavigate={abrirDetalhes}
  pagination pageSize={20}
/>
Entrada: DataTableProps<BigTableRow> — horizontalScroll, columnOrder/onColumnOrderChange, selectableColumns, columnVisibilityControl, filterableColumns/columnFilters/onColumnFiltersChange, onSortChange/sortBy/sortDirection, groupByColumns/onGroupByColumnsChange, groupDetailPlacement, collapsibleGroups, aggregatable/initialTotals, toolbarActions, exportable, onNavigate, pagination/pageSize; Column<BigTableRow> — dataType: 'currency', hideable, groupableSaída: onColumnOrderChange(order), onSelectedColumnsChange(keys), onHiddenColumnsChange(hidden), onColumnFiltersChange(filters), onSortChange(key, direction), onGroupByColumnsChange(levels), onCollapsedGroupsChange(set), onClick() das ações, download .xlsxMock: BIGTABLE_ROWS (85 linhas) / BIGTABLE_COLUMN_DEFS (50 colunas)

Reordenação de colunas

Reordenação de colunas — DataTable
Arraste o título de uma coluna para frente ou para trás; ou clique no título e use a seção “Posição” do DataTableFeatureDialog (alternativa por teclado).
Notas fiscais (12)
1000
12/03/2026
1101/AA
SP
R$ 12.287,26
R$ 2.211,71
1010
28/01/2026
1102/AA
SP
R$ 9.205,23
R$ 1.656,94
12SP
18/01/2026
2101/AA
ES
R$ 16.758,23
R$ 3.016,48
1014
22/03/2026
5102/AA
SP
R$ 22.953,07
R$ 4.131,55
12SP
14/02/2026
1302/AA
SP
R$ 12.623,80
R$ 0,00
12SP
12/03/2026
1916/AA
SP
R$ 78.310,06
R$ 0,00
11SP
05/03/2026
2916/AA
ES
R$ 47.347,15
R$ 0,00
1010
16/01/2026
2662/AA
SC
R$ 70.742,72
R$ 374,40
11SP
26/02/2026
1101/AA
SP
R$ 34.206,30
R$ 3.620,39
1010
11/02/2026
1102/AA
SP
R$ 2.663,26
R$ 281,88
1010
13/01/2026
2101/AA
SC
R$ 89.299,91
R$ 9.644,39
11SP
11/01/2026
5102/AA
SP
R$ 14.079,76
R$ 1.520,61
<DataTable
  title="Notas fiscais"
  columns={columns}
  rows={rows}
  rowKey={(r) => r.id}
  reorderableColumns        // modo não controlado: o DataTable guarda a ordem
  onColumnOrderChange={(order) => salvarPreferencia(order)} // opcional
/>

// Controlado: <DataTable columnOrder={order} onColumnOrderChange={setOrder} ... />
Entrada: DataTableProps<T> — reorderableColumns?: boolean, columnOrder?: string[], onColumnOrderChange?: (order: string[]) => void; DataTableFeatureDialogProps — position?, totalColumns?, onMoveColumn?Saída: onColumnOrderChange(order: string[]) — ordem COMPLETA com todas as chaves de columnsMock: BIGTABLE_ROWS (12 primeiras linhas) / BIGTABLE_COLUMN_DEFS (6 colunas)

Barra de ações

Barra de ações — toolbarActions
Ações declarativas na barra superior: cada item vira um Button (type=button) com variant, disabled e loading; convivem com actions, Criar e Atualizar.

Última ação disparada: —

Notas fiscais (12)
Business Place
Posting date
CFOP
UF
Value
IMPOSTO ICMS
1000
12/03/2026
1101/AA
SP
R$ 12.287,26
R$ 2.211,71
1010
28/01/2026
1102/AA
SP
R$ 9.205,23
R$ 1.656,94
12SP
18/01/2026
2101/AA
ES
R$ 16.758,23
R$ 3.016,48
1014
22/03/2026
5102/AA
SP
R$ 22.953,07
R$ 4.131,55
12SP
14/02/2026
1302/AA
SP
R$ 12.623,80
R$ 0,00
12SP
12/03/2026
1916/AA
SP
R$ 78.310,06
R$ 0,00
11SP
05/03/2026
2916/AA
ES
R$ 47.347,15
R$ 0,00
1010
16/01/2026
2662/AA
SC
R$ 70.742,72
R$ 374,40
11SP
26/02/2026
1101/AA
SP
R$ 34.206,30
R$ 3.620,39
1010
11/02/2026
1102/AA
SP
R$ 2.663,26
R$ 281,88
1010
13/01/2026
2101/AA
SC
R$ 89.299,91
R$ 9.644,39
11SP
11/01/2026
5102/AA
SP
R$ 14.079,76
R$ 1.520,61
<DataTable
  title="Notas fiscais"
  columns={columns}
  rows={rows}
  rowKey={(r) => r.id}
  toolbarActions={[
    { key: 'aprovar', label: 'Aprovar lote', variant: 'emphasized', onClick: aprovar },
    { key: 'conferir', label: 'Marcar como conferido', onClick: conferir, disabled: !temSelecao },
  ]}
/>
Entrada: DataTableProps<T> — toolbarActions?: DataTableToolbarAction[] ({ key, label, variant?: ButtonVariant, onClick, disabled?, loading? })Saída: onClick: () => void (de cada ação)Mock: BIGTABLE_ROWS (12 primeiras linhas) / BIGTABLE_COLUMN_DEFS (6 colunas)

Exportar .xlsx

Exportar .xlsx — DataTable
O botão “Exportar .xlsx” baixa todas as linhas (ignora a paginação), na ordem atual das colunas, com valores crus; exportValue converte a data ISO em data do Excel.
Notas fiscais (12)
1000
12/03/2026
1101/AA
SP
R$ 12.287,26
R$ 2.211,71
1010
28/01/2026
1102/AA
SP
R$ 9.205,23
R$ 1.656,94
12SP
18/01/2026
2101/AA
ES
R$ 16.758,23
R$ 3.016,48
1014
22/03/2026
5102/AA
SP
R$ 22.953,07
R$ 4.131,55
12SP
14/02/2026
1302/AA
SP
R$ 12.623,80
R$ 0,00
<DataTable
  title="Notas fiscais"
  columns={[
    { key: 'postingDate', label: 'Posting date', exportValue: (r) => new Date(`${r.postingDate}T00:00:00`) },
    { key: 'value', label: 'Value', render: (r) => brl.format(r.value) }, // exporta o número cru
  ]}
  rows={rows}
  rowKey={(r) => r.id}
  exportable
  exportFileName="notas-fiscais"
  pagination
  pageSize={5}
/>

// Relatório paginado no servidor: getExportRows={() => api.buscarTudo(filtros)}
Entrada: DataTableProps<T> — exportable?: boolean, exportFileName?: string, exportSheetName?: string, getExportRows?: () => T[] | Promise<T[]>; Column<T> — exportValue?: (row: T) => string | number | boolean | Date | nullSaída: download de <exportFileName>.xlsx (uma aba, cabeçalho em negrito, números/datas/texto tipados)Mock: BIGTABLE_ROWS (12 primeiras linhas) / BIGTABLE_COLUMN_DEFS (6 colunas)

Funcionalidades estilo SAP GUI

Estilo SAP GUI — seleção, N níveis, filtro, moeda e totais iniciais
Modelo do SAP GUI: Ctrl/Shift+clique seleciona colunas (◀ ▶ movem 1 posição por clique); “Agrupar” em ordem define a hierarquia; detalhe abaixo ou acima; funil de filtro com opções dependentes; coluna de moeda (R$) e totais já na renderização. Os botões do painel são de protótipo.
Apuração por parceiro (120)
1030
5102
VIBRA
07/02/2026
00001000
R$ 458,46
R$ 458,46
R$ 82,52
11
1030
5102
IPIRANGA
17/01/2026
00001001
R$ 7.863,94
R$ 7.863,94
R$ 1.415,51
12
1030
5102
RAIZEN
10/01/2026
00001002
R$ 4.400,45
R$ 4.400,45
R$ 792,08
17
1030
6102
VIBRA
23/01/2026
00001003
R$ 1.787,72
R$ 1.787,72
R$ 321,79
39
1030
6102
SHELL
28/01/2026
00001004
R$ 6.370,67
R$ 6.370,67
R$ 1.146,72
28
2050
5949
SHELL
05/01/2026
00001005
R$ 3.624,44
R$ 3.624,44
R$ 652,40
28
2050
6102
IPIRANGA
13/02/2026
00001006
R$ 1.166,58
R$ 1.166,58
R$ 209,98
20
2050
6102
PETROBRAS
22/03/2026
00001007
R$ 4.317,44
R$ 4.317,44
R$ 777,14
12
2050
6102
ALE
26/01/2026
00001008
R$ 7.278,39
R$ 7.278,39
R$ 1.310,11
40
11SP
5102
VIBRA
24/02/2026
00001009
R$ 6.991,03
R$ 6.991,03
R$ 1.258,39
22
11SP
6652
RAIZEN
21/01/2026
00001010
R$ 5.051,13
R$ 5.051,13
R$ 909,20
25
11SP
6652
PETROBRAS
13/01/2026
00001011
R$ 1.049,26
R$ 1.049,26
R$ 188,87
30
11SP
6655
ALE
20/01/2026
00001012
R$ 595,75
R$ 595,75
R$ 107,24
8
1030
5102
VIBRA
05/02/2026
00001013
R$ 5.642,68
R$ 5.642,68
R$ 1.015,68
39
1030
5102
IPIRANGA
04/02/2026
00001014
R$ 1.820,24
R$ 1.820,24
R$ 327,64
33
1030
5102
RAIZEN
23/02/2026
00001015
R$ 9.096,55
R$ 9.096,55
R$ 1.637,38
38
1030
6102
VIBRA
12/02/2026
00001016
R$ 1.361,03
R$ 1.361,03
R$ 244,99
23
1030
6102
SHELL
10/02/2026
00001017
R$ 412,46
R$ 412,46
R$ 74,24
12
2050
5949
SHELL
13/02/2026
00001018
R$ 8.494,55
R$ 8.494,55
R$ 1.529,02
13
2050
6102
IPIRANGA
27/02/2026
00001019
R$ 2.936,07
R$ 2.936,07
R$ 528,49
3
2050
6102
PETROBRAS
06/02/2026
00001020
R$ 6.273,93
R$ 6.273,93
R$ 1.129,31
37
2050
6102
ALE
09/03/2026
00001021
R$ 9.915,64
R$ 9.915,64
R$ 1.784,82
26
11SP
5102
VIBRA
14/03/2026
00001022
R$ 6.813,75
R$ 6.813,75
R$ 1.226,47
37
11SP
6652
RAIZEN
07/02/2026
00001023
R$ 8.179,76
R$ 8.179,76
R$ 1.472,36
10
11SP
6652
PETROBRAS
16/01/2026
00001024
R$ 5.696,39
R$ 5.696,39
R$ 1.025,35
28
11SP
6655
ALE
08/03/2026
00001025
R$ 4.237,42
R$ 4.237,42
R$ 762,74
31
2050
5949
SHELL
16/02/2026
00001026
R$ 6.019,27
R$ 6.019,27
R$ 1.083,47
26
1030
5102
VIBRA
26/03/2026
00001027
R$ 9.100,43
R$ 9.100,43
R$ 1.638,08
30
2050
6102
IPIRANGA
12/01/2026
00001028
R$ 3.878,42
R$ 3.878,42
R$ 698,12
9
1030
5102
IPIRANGA
11/01/2026
00001029
R$ 7.867,48
R$ 7.867,48
R$ 1.416,15
33
1030
5102
IPIRANGA
09/01/2026
00001030
R$ 5.998,32
R$ 5.998,32
R$ 1.079,70
1
2050
6102
PETROBRAS
25/02/2026
00001031
R$ 5.465,50
R$ 5.465,50
R$ 983,79
36
2050
6102
PETROBRAS
05/03/2026
00001032
R$ 5.533,40
R$ 5.533,40
R$ 996,01
11
11SP
5102
VIBRA
25/02/2026
00001033
R$ 3.306,45
R$ 3.306,45
R$ 595,16
14
1030
6102
VIBRA
13/01/2026
00001034
R$ 7.569,16
R$ 7.569,16
R$ 1.362,45
7
11SP
6652
PETROBRAS
25/01/2026
00001035
R$ 3.338,50
R$ 3.338,50
R$ 600,93
7
1030
5102
IPIRANGA
07/02/2026
00001036
R$ 7.972,37
R$ 7.972,37
R$ 1.435,03
38
1030
5102
RAIZEN
18/02/2026
00001037
R$ 244,98
R$ 244,98
R$ 44,10
20
2050
6102
ALE
17/03/2026
00001038
R$ 3.084,91
R$ 3.084,91
R$ 555,28
24
1030
6102
VIBRA
28/03/2026
00001039
R$ 7.812,71
R$ 7.812,71
R$ 1.406,29
11
1030
5102
VIBRA
16/03/2026
00001040
R$ 2.977,90
R$ 2.977,90
R$ 536,02
3
1030
5102
VIBRA
09/02/2026
00001041
R$ 66,59
R$ 66,59
R$ 11,99
29
11SP
6652
RAIZEN
25/03/2026
00001042
R$ 205,59
R$ 205,59
R$ 37,01
4
2050
6102
IPIRANGA
10/02/2026
00001043
R$ 5.812,90
R$ 5.812,90
R$ 1.046,32
25
1030
5102
IPIRANGA
26/03/2026
00001044
R$ 8.256,54
R$ 8.256,54
R$ 1.486,18
31
1030
6102
SHELL
01/03/2026
00001045
R$ 8.270,47
R$ 8.270,47
R$ 1.488,68
13
2050
6102
ALE
16/01/2026
00001046
R$ 6.714,93
R$ 6.714,93
R$ 1.208,69
4
11SP
6652
PETROBRAS
04/01/2026
00001047
R$ 2.187,39
R$ 2.187,39
R$ 393,73
23
1030
5102
RAIZEN
17/01/2026
00001048
R$ 9.683,36
R$ 9.683,36
R$ 1.743,00
11
1030
6102
SHELL
25/02/2026
00001049
R$ 687,60
R$ 687,60
R$ 123,77
28
1030
6102
SHELL
21/03/2026
00001050
R$ 841,50
R$ 841,50
R$ 151,47
36
1030
6102
VIBRA
08/03/2026
00001051
R$ 1.727,09
R$ 1.727,09
R$ 310,88
27
1030
5102
VIBRA
27/02/2026
00001052
R$ 1.792,46
R$ 1.792,46
R$ 322,64
10
11SP
6652
PETROBRAS
21/02/2026
00001053
R$ 3.484,72
R$ 3.484,72
R$ 627,25
14
1030
5102
IPIRANGA
28/01/2026
00001054
R$ 6.950,40
R$ 6.950,40
R$ 1.251,07
28
1030
5102
IPIRANGA
21/03/2026
00001055
R$ 5.235,09
R$ 5.235,09
R$ 942,32
25
11SP
5102
VIBRA
23/03/2026
00001056
R$ 2.596,13
R$ 2.596,13
R$ 467,30
28
11SP
6652
RAIZEN
02/03/2026
00001057
R$ 8.065,73
R$ 8.065,73
R$ 1.451,83
22
1030
5102
IPIRANGA
25/01/2026
00001058
R$ 9.451,04
R$ 9.451,04
R$ 1.701,19
40
11SP
5102
VIBRA
06/03/2026
00001059
R$ 7.378,79
R$ 7.378,79
R$ 1.328,18
5
11SP
5102
VIBRA
08/01/2026
00001060
R$ 6.984,08
R$ 6.984,08
R$ 1.257,13
9
2050
6102
IPIRANGA
24/03/2026
00001061
R$ 5.687,38
R$ 5.687,38
R$ 1.023,73
17
1030
6102
SHELL
21/02/2026
00001062
R$ 3.515,43
R$ 3.515,43
R$ 632,78
8
2050
6102
ALE
27/01/2026
00001063
R$ 7.854,00
R$ 7.854,00
R$ 1.413,72
22
1030
5102
IPIRANGA
15/02/2026
00001064
R$ 5.988,19
R$ 5.988,19
R$ 1.077,87
26
1030
5102
IPIRANGA
07/01/2026
00001065
R$ 800,35
R$ 800,35
R$ 144,06
34
1030
5102
RAIZEN
02/01/2026
00001066
R$ 9.484,15
R$ 9.484,15
R$ 1.707,15
23
2050
5949
SHELL
12/02/2026
00001067
R$ 5.930,36
R$ 5.930,36
R$ 1.067,46
27
1030
6102
SHELL
08/03/2026
00001068
R$ 3.832,10
R$ 3.832,10
R$ 689,78
6
1030
5102
RAIZEN
05/01/2026
00001069
R$ 7.337,22
R$ 7.337,22
R$ 1.320,70
28
11SP
6652
PETROBRAS
04/03/2026
00001070
R$ 7.355,34
R$ 7.355,34
R$ 1.323,96
11
2050
5949
SHELL
08/03/2026
00001071
R$ 8.487,76
R$ 8.487,76
R$ 1.527,80
36
1030
5102
RAIZEN
18/02/2026
00001072
R$ 1.709,67
R$ 1.709,67
R$ 307,74
21
11SP
5102
VIBRA
06/01/2026
00001073
R$ 3.156,04
R$ 3.156,04
R$ 568,09
23
11SP
6655
ALE
01/03/2026
00001074
R$ 4.123,97
R$ 4.123,97
R$ 742,31
28
1030
5102
VIBRA
08/02/2026
00001075
R$ 3.169,90
R$ 3.169,90
R$ 570,58
40
2050
6102
IPIRANGA
26/02/2026
00001076
R$ 6.710,32
R$ 6.710,32
R$ 1.207,86
24
11SP
5102
VIBRA
15/02/2026
00001077
R$ 2.720,60
R$ 2.720,60
R$ 489,71
14
11SP
6652
RAIZEN
15/02/2026
00001078
R$ 4.046,84
R$ 4.046,84
R$ 728,43
37
11SP
6652
RAIZEN
27/03/2026
00001079
R$ 4.585,32
R$ 4.585,32
R$ 825,36
11
2050
6102
PETROBRAS
06/02/2026
00001080
R$ 3.881,19
R$ 3.881,19
R$ 698,61
9
1030
5102
RAIZEN
15/03/2026
00001081
R$ 1.353,25
R$ 1.353,25
R$ 243,58
22
2050
5949
SHELL
03/02/2026
00001082
R$ 5.074,59
R$ 5.074,59
R$ 913,43
13
1030
6102
VIBRA
20/01/2026
00001083
R$ 4.797,92
R$ 4.797,92
R$ 863,63
19
1030
5102
IPIRANGA
25/02/2026
00001084
R$ 9.200,16
R$ 9.200,16
R$ 1.656,03
1
1030
6102
SHELL
17/01/2026
00001085
R$ 4.394,06
R$ 4.394,06
R$ 790,93
39
11SP
6652
PETROBRAS
10/03/2026
00001086
R$ 4.789,12
R$ 4.789,12
R$ 862,04
7
1030
6102
SHELL
20/02/2026
00001087
R$ 6.276,47
R$ 6.276,47
R$ 1.129,76
10
11SP
5102
VIBRA
13/03/2026
00001088
R$ 8.394,46
R$ 8.394,46
R$ 1.511,00
14
2050
6102
IPIRANGA
19/03/2026
00001089
R$ 5.770,40
R$ 5.770,40
R$ 1.038,67
10
1030
5102
VIBRA
23/01/2026
00001090
R$ 2.342,41
R$ 2.342,41
R$ 421,63
19
2050
5949
SHELL
17/03/2026
00001091
R$ 6.046,93
R$ 6.046,93
R$ 1.088,45
32
11SP
6655
ALE
06/02/2026
00001092
R$ 2.751,57
R$ 2.751,57
R$ 495,28
25
11SP
5102
VIBRA
26/02/2026
00001093
R$ 2.073,27
R$ 2.073,27
R$ 373,19
21
11SP
6655
ALE
28/03/2026
00001094
R$ 4.103,34
R$ 4.103,34
R$ 738,60
35
11SP
5102
VIBRA
22/03/2026
00001095
R$ 9.373,79
R$ 9.373,79
R$ 1.687,28
36
2050
6102
ALE
24/03/2026
00001096
R$ 1.236,60
R$ 1.236,60
R$ 222,59
10
2050
5949
SHELL
13/01/2026
00001097
R$ 62,35
R$ 62,35
R$ 11,22
1
11SP
6652
PETROBRAS
07/01/2026
00001098
R$ 4.289,22
R$ 4.289,22
R$ 772,06
21
11SP
6652
PETROBRAS
11/02/2026
00001099
R$ 1.839,80
R$ 1.839,80
R$ 331,16
29
1030
5102
RAIZEN
16/03/2026
00001100
R$ 5.377,03
R$ 5.377,03
R$ 967,87
20
1030
5102
IPIRANGA
06/03/2026
00001101
R$ 7.868,12
R$ 7.868,12
R$ 1.416,26
14
1030
6102
VIBRA
22/02/2026
00001102
R$ 2.476,45
R$ 2.476,45
R$ 445,76
40
2050
6102
ALE
06/02/2026
00001103
R$ 9.691,93
R$ 9.691,93
R$ 1.744,55
16
11SP
5102
VIBRA
21/01/2026
00001104
R$ 8.082,27
R$ 8.082,27
R$ 1.454,81
28
1030
5102
VIBRA
21/02/2026
00001105
R$ 7.397,01
R$ 7.397,01
R$ 1.331,46
34
2050
6102
PETROBRAS
21/02/2026
00001106
R$ 961,74
R$ 961,74
R$ 173,11
6
11SP
5102
VIBRA
07/01/2026
00001107
R$ 2.370,57
R$ 2.370,57
R$ 426,70
5
1030
6102
VIBRA
03/03/2026
00001108
R$ 5.972,36
R$ 5.972,36
R$ 1.075,02
26
2050
6102
PETROBRAS
22/02/2026
00001109
R$ 1.588,54
R$ 1.588,54
R$ 285,94
13
2050
6102
IPIRANGA
05/03/2026
00001110
R$ 7.440,62
R$ 7.440,62
R$ 1.339,31
13
1030
5102
IPIRANGA
01/01/2026
00001111
R$ 7.872,43
R$ 7.872,43
R$ 1.417,04
37
1030
6102
SHELL
12/02/2026
00001112
R$ 6.462,35
R$ 6.462,35
R$ 1.163,22
30
1030
5102
VIBRA
27/03/2026
00001113
R$ 7.177,87
R$ 7.177,87
R$ 1.292,02
33
11SP
6652
PETROBRAS
25/01/2026
00001114
R$ 5.348,84
R$ 5.348,84
R$ 962,79
21
2050
6102
PETROBRAS
01/01/2026
00001115
R$ 1.555,30
R$ 1.555,30
R$ 279,95
13
11SP
6652
RAIZEN
07/02/2026
00001116
R$ 9.907,73
R$ 9.907,73
R$ 1.783,39
4
2050
5949
SOLO
30/03/2026
00001118
R$ 0,00
1
1030
5102
VIBRA
14/02/2026
00001119
R$ 1.234,56
12,5
R$ 222,22
7
11SP
6655
ALE
05/01/2026
00000120
R$ 0,00
0

Conferência da soma de Valor por nível (tabela, Local e Local/CFOP) sobre as 118 linhas com valor após os filtros: 11 recortes × idênticos à referência independente (centavos inteiros) ✓

<DataTable
  columns={columns}   // Column.dataType: "currency" | "number" | "text" | "date"; groupable?: boolean; filterable?: boolean
  rows={rows}
  rowKey={(r) => r.id}
  selectableColumns                 // Ctrl/Shift+clique, Espaço; ◀ ▶ na barra
  columnVisibilityControl           // ⚙ na barra + botão ocultar no cabeçalho
  filterableColumns                 // funil por coluna (opções dependentes)
  columnFilters={filters}
  onColumnFiltersChange={setFilters}
  groupByColumns={levels}           // ordem de clique = hierarquia (pai → filho)
  onGroupByColumnsChange={setLevels}
  groupDetailPlacement="above"      // "below" (padrão) | "above" (SAP GUI)
  collapsibleGroups
  initialTotals="currency"          // "none" (padrão) | "currency" | ["qtd", "icms"]
/>
Entrada: DataTableProps<T> — selectableColumns, selectedColumns/defaultSelectedColumns/onSelectedColumnsChange, groupByColumns/defaultGroupByColumns/onGroupByColumnsChange, groupDetailPlacement, filterableColumns, columnFilters/defaultColumnFilters/onColumnFiltersChange, initialTotals; Column<T> — groupable, filterable, dataType: 'currency'Saída: onSelectedColumnsChange(keys), onGroupByColumnsChange(levels), onColumnFiltersChange(filters: ColumnFilter[]); onGroupChange continua recebendo só o primeiro nívelMock: SAPGUI_ROWS (120 linhas) — Local neg. → CFOP → Nome Parceiro, com grupo de 1 linha, vazios e dado sujo

Totais e agregações

Totais e agregações — DataTable
Seção “Totais” no dialog da coluna: função (por tipo de dado), casas decimais, escopo e total geral. Sem agrupamento há uma linha de total; com agrupamento, uma por grupo.
Clique no título de Value → “Totais”: função, casas decimais, interruptor “Somente os registros exibidos” e, com agrupamento, “Exibir total geral”. A paginação mostra 6 de 18 linhas para evidenciar o escopo.
Notas fiscais (18 linhas) (18)
1000
1101/AA
SP
R$ 12.287,26
R$ 2.211,71
1010
1102/AA
SP
R$ 9.205,23
R$ 1.656,94
12SP
2101/AA
ES
R$ 16.758,23
R$ 3.016,48
1014
5102/AA
SP
R$ 22.953,07
R$ 4.131,55
12SP
1302/AA
SP
R$ 12.623,80
R$ 0,00
12SP
1916/AA
SP
R$ 78.310,06
R$ 0,00
Contagem: 18
Soma: R$ 702.963,42
Média: R$ 1.831,00
<DataTable
  columns={[{ key: "value", label: "Value", dataType: "number" }, { key: "cfop", label: "CFOP" }]}
  rows={rows}
  rowKey={(r) => r.id}
  aggregatable
  defaultColumnAggregations={{ value: { fn: 'sum', showGrandTotal: true } }}
  groupBy={groupBy}
  onGroupChange={setGroupBy}
/>
Entrada: DataTableProps<T> — aggregatable, columnAggregations, defaultColumnAggregations, onColumnAggregationsChange; Column<T> — dataType, aggregations, formatAggregateSaída: onColumnAggregationsChange(next: Record<string, ColumnAggregation>)Mock: BIGTABLE_ROWS (18 primeiras linhas) / BIGTABLE_COLUMN_DEFS (5 colunas)
Conferência de totais — DataTable
Prova ao vivo: o total do componente (aggregateValues) comparado com uma referência independente em centavos inteiros, para a tabela inteira e por filial.

Cada célula mostra o total do componente (aggregateValues) e o da referência independente (centavos inteiros). ✓ = idênticos; ✗ = divergência. ✓ 30 de 30 conferem.

ColunaSomaContagemMédiaMínimoMáximo
Value✓ 3872291,21✓ 85✓ 45556,37✓ 1259,33✓ 409945,29
Valor contábil✓ 3890448,06✓ 85✓ 45769,98✓ 1259,33✓ 415274,58
BASE ICMS✓ 1807839,56✓ 85✓ 21268,70✓ 0,00✓ 331779,24
IMPOSTO ICMS✓ 276178,78✓ 85✓ 3249,16✓ 0,00✓ 59720,26
IMPOSTO PIS✓ 31203,58✓ 85✓ 367,10✓ 0,00✓ 6764,10
IMPOSTO CBS✓ 16101,43✓ 85✓ 189,43✓ 0,00✓ 3689,51
const r = aggregateValues(values, { fn: 'sum', dataType: 'number', decimals: 2 });
if (r.ok) r.text; // decimal exato
Entrada: aggregateValues(values: unknown[], options: { fn: AggregateFn; dataType?: DataType; decimals?: number }): AggregateResultSaída: AggregateResult = { ok: true, ... } | { ok: false, error, index }Mock: BIGTABLE_ROWS (85 linhas); referência: _data/totals-reference.ts
aggregateValues — cálculo exato
O motor exportado pelo pacote, isolado: exatidão decimal, arredondamento comercial, vazios e valores inválidos.
EntradaFunçãoResultado (text)
[0,1; 0,2]sum0.30
[1,005] (2 casas)sum1.01
[2,345] (2 casas)sum2.35
[−2,345] (2 casas)sum-2.35
[1; 2; 2]avg1.67
100.000 × 0,01sum1000.00
[1e-7; 1,5e21] (7 casas)sum1500000000000000000000.0000001
[10; null; ""; 20]count2
[10; "12,5"; 3] (texto numérico)sumerro: valor inválido na posição 1: esperado número finito, recebido string ("12,5")
["a"; "b"] (texto, soma)sumerro: a função "sum" não é permitida para colunas do tipo "text"
aggregateValues([0.1, 0.2], { fn: 'sum', dataType: 'number' }); // text '0.30'
Entrada: aggregateValues(values, { fn, dataType?, decimals? })Saída: { ok: true, text, value, count, empty } | { ok: false, error, index }Mock: casos fixos (TotalsExamples.tsx)