Skip to content

DataGrid

Tabla empresarial con tipado estricto, búsqueda con debounce, ordenamiento, selección, paginación client/server, virtualización de filas y layout responsive (tabla o tarjetas).

Arquitectura

CapaResponsabilidad
<DataGrid />Presentación: ensambla toolbar, viewport, resumen y paginación
useDataGridControllerOrquestación: layout, filas visibles, efectos, estilos derivados
useDataGridPipeline de datos: filtrado, orden y selección (headless)
usePagination / useColumnLayout / useVirtualRowsFeatures reutilizables para UIs custom

Importación

tsx
import {
  DataGrid,
  useDataGrid,
  useDataGridController,
  dataGridThemes,
  defaultDataGridMessages,
} from 'glubox';

import type {
  ColumnDef,
  DataGridProps,
  DataGridMessages,
} from 'glubox';

import 'glubox/style.css';

Uso básico

tsx
interface Employee extends Record<string, unknown> {
  id: number;
  name: string;
  email: string;
  department: string;
}

const columns: ColumnDef<Employee>[] = [
  { key: 'name', header: 'Nombre', sortable: true },
  { key: 'email', header: 'Email', sortable: true },
  { key: 'department', header: 'Departamento', sortable: true },
];

const data: Employee[] = [
  { id: 1, name: 'Ana García', email: 'ana@corp.com', department: 'Ventas' },
];

<DataGrid
  data={data}
  columns={columns}
  getRowId={(row) => row.id}
  selectionMode="multiple"
  onSelectionChange={(rows) => console.log(rows)}
/>

Layout: tabla, tarjetas o automático

layoutComportamiento
auto (default)Tabla en contenedores anchos; tarjetas si el ancho del grid ≤ cardBreakpoint (640px)
tableSiempre tabla
cardSiempre tarjetas
tsx
<DataGrid
  layout="auto"
  cardBreakpoint={640}
  renderCardComponent={EmployeeCard}
  onCardSelect={(row) => console.log('activada', row)}
  ...
/>

Con renderCard o renderCardComponent personalizás cada tarjeta. Los datos están en context.row, no en un evento e.data.

Internacionalización

Pasá messages para sobreescribir textos (paginación, resumen, loading). Las props searchPlaceholder y emptyMessage tienen prioridad.

tsx
<DataGrid
  messages={{
  ...defaultDataGridMessages,
  rowsPerPage: 'Rows per page',
  rowCount: (n) => `${n} record${n === 1 ? '' : 's'}`,
  }}
  searchPlaceholder="Search employees..."
  ...
/>

ColumnDef

CampoTipoDescripción
keykeyof TPropiedad del objeto de datos
headerstringTítulo del encabezado
sortablebooleanHabilita orden asc/desc al clic
width / minWidthstring | numberDimensiones de columna
align'left' | 'center' | 'right'Alineación
renderCell(value, row, index) => ReactNodeUI personalizada con tipado estricto
resizable / reorderablebooleanPor columna, si el grid lo permite

Búsqueda

El buscador integrado filtra con debounce (debounceMs, default 300 ms). Por defecto busca en todas las columnas; limitá con searchKeys.

PropDefaultDescripción
showSearchtrueMuestra el buscador
searchPosition'left''left' o 'right'
searchWidthAncho fijo del campo

Selección

selectionModeComportamiento
noneSin selección
singleClic en fila → onRowSelect(row)
multipleCheckboxes por página + onSelectionChange(rows[])

Modo controlado: selectedRowIds + onSelectionChange. El “seleccionar todo” del header afecta solo la página visible.

Hooks headless

useDataGrid

Pipeline de filtrado, orden y selección (sin layout ni paginación):

tsx
const grid = useDataGrid({
  data,
  columns,
  getRowId: (row) => row.id,
  selectionMode: 'multiple',
});

// grid.displayRows, grid.toggleSort, grid.selectedRows

useDataGridController

Equivalente a montar <DataGrid /> sin JSX — devuelve view-model listo para render custom:

tsx
const vm = useDataGridController({
  data,
  columns,
  getRowId: (row) => row.id,
  pagination: true,
});

// vm.rowsToRender, vm.selection.handleToggleRow, vm.paginationState, ...

Virtualización

PropDefaultDescripción
virtualizedtrueHabilita virtualización (solo layout tabla)
virtualThreshold30Mínimo de filas para activarla
rowHeight44Altura fija por fila (px)
overscan5Buffer fuera del viewport
showRowCounttrueContador en barra de resumen

Paginación

PropDefaultDescripción
paginationfalseControles en el pie
paginationMode'client''client' o 'server'
maxRecordsLímite de registros visibles / opciones de pageSize
totalRowCountTotal en modo server

En modo client, al buscar u ordenar la página vuelve a 1. En server, data es solo la página actual y el padre gestiona el fetch.

Columnas: resize y reordenamiento

PropDefault
resizableColumnsfalse
reorderableColumnsfalse
stickyFirstColumntrue

Hook exportado: useColumnLayout.

Temas

tsx
<DataGrid theme="enterprise-dark" ... />
<DataGrid theme={dataGridThemes['modern-light']} ... />

Tipos de eventos

TipoSignatura
DataGridOnRowSelectHandler<T>(row: T) => void
DataGridOnSelectionChangeHandler<T>(selectedRows: T[]) => void
DataGridOnCardSelectHandler<T>(row: T) => void

Ver Tipos de eventos.

MIT License