Pular para o conteúdo

DataGrid

Tabela de dados com colunas definidas, ordenação, seleção e vazio.

O DataGrid (do HeroUI Pro) mostra dados em colunas fixas: a lista de Pedidos, o extrato de Créditos, as Fontes. No Admin ele vive dentro de um Widget, sem <table> à mão. Para cartões de métricas use Widget; para listas ricas de uma coluna, ListView.

import { DataGrid, type DataGridColumn } from "@rastreio-x/ui";

Padrão

Informe data, columns, getRowId e um aria-label. A coluna com isRowHeader nomeia a linha para o leitor de tela.

Ordenação

allowsSorting na coluna e defaultSortDescriptor (ou sortDescriptor e onSortChange) ligam a ordenação. Use sortFn para ordenar números e datas.

Seleção

selectionMode e showSelectionCheckboxes ligam as caixas por linha. onSelectionChange recebe as chaves selecionadas.

Células próprias

cell desenha a célula. Estado vai em ícone mais texto (Chip), nunca só cor.

Sem dados

renderEmptyState mostra o que fazer quando não há linhas.

No Admin

O padrão é DataGrid dentro de Widget, com o rodapé do painel para a nota de fuso e o "Carregar Mais".

Anatomia

O DataGrid é uma peça só, configurada por props. Cada coluna é um objeto DataGridColumn (id, header, accessorKey ou cell, align, allowsSorting, width, pinned).

Propriedades

Animações

A grade não anima o conteúdo; linhas mudam de fundo no hover, no foco e na seleção. O cabeçalho ordenável troca a seta de direção. Com prefers-reduced-motion, a folha global da fachada reduz as transições a 0,01 ms.

Acessibilidade

  • Tabela do React Aria com papéis grid, row e gridcell; aria-sort marca a coluna ordenada.
  • Teclado: as setas navegam entre células, Home e End vão às pontas da linha, Enter aciona a linha (onRowAction) e Espaço seleciona.
  • Dê sempre aria-label e marque a coluna de identidade com isRowHeader.
  • Evite href por linha: no Admin o link do Pedido fica na primeira célula e a linha abre por onRowAction.
  • Não use onLoadMore automático: rolagem infinita piora o teclado; use o botão "Carregar Mais".

Boas práticas

Faça

DataGrid dentro de Widget, com a coluna de identidade como link e estado em ícone mais texto.

Evite

Tabela HTML artesanal, ordenação ou filtros fora do que a tela precisa, ou rolagem infinita.
  • Colunas fixas e poucas; alinhe números à direita com tabular-nums.
  • No celular, a lista vira cartões (ItemCard); não force a tabela estreita.
  • Mostre o vazio com renderEmptyState, não uma tabela só com cabeçalho.
  • Rolagem horizontal fica dentro do grid (contentClassName="min-w-[36rem]").

Relacionados

  • Widget como contêiner da tabela.
  • EmptyState para o vazio da tabela.
  • Chip para o estado em célula.