npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@jzarache/table-react

v1.0.2

Published

Tabla React moderna, tipada, redimensionable, ordenable, filtrable y paginada.

Downloads

87

Readme

@jzarache/table-react

Tabla de datos reutilizable para React y TypeScript. Incluye ordenamiento, filtros, paginación, selección, redimensionamiento, reordenamiento de columnas, acciones por fila y personalización visual.

Demo

https://table-react-jz.vercel.app

Características

  • API genérica y completamente tipada con TypeScript.
  • Ordenamiento ascendente, descendente y sin orden.
  • Filtros por columna en menú o fila visible.
  • Paginación y selector de filas por página.
  • Selección individual y selección de la página visible.
  • Redimensionamiento de columnas con puntero o teclado.
  • Reordenamiento de columnas con arrastre o teclado.
  • Celdas personalizadas mediante componentes React.
  • Columna de acciones ubicable en cualquier posición.
  • Tooltips automáticos para contenido truncado.
  • Encabezado fijo y área de desplazamiento configurable.
  • Temas mediante variables y colores semánticos.
  • Salidas ESM, CommonJS, CSS y declaraciones TypeScript.

Requisitos

  • React 19.
  • React DOM 19.

Instalación

Con pnpm:

pnpm add @jzarache/table-react

Con npm:

npm install @jzarache/table-react

Uso básico

import { DataTable, type DataTableColumn } from "@jzarache/table-react";

type User = {
  id: number;
  name: string;
  email: string;
  status: "Activo" | "Inactivo";
};

const columns: DataTableColumn<User>[] = [
  {
    id: "name",
    header: "Nombre",
    accessor: "name",
    sortable: true,
    filterable: true,
  },
  {
    id: "actions",
    type: "actions",
    header: "Acciones",
    width: 140,
  },
  {
    id: "email",
    header: "Correo",
    accessor: "email",
    filterable: true,
  },
  {
    id: "status",
    header: "Estado",
    accessor: "status",
  },
];

export function UsersTable({ users }: { users: User[] }) {
  return (
    <DataTable
      data={users}
      columns={columns}
      getRowId={(user) => user.id}
      features={{
        sorting: true,
        filtering: true,
        pagination: true,
        resizing: true,
        columnReordering: true,
      }}
      selectable
      stickyHeader
      tableHeight={500}
      actions={[
        {
          id: "edit",
          label: "Editar",
          onClick: (user) => console.log("Editar", user),
        },
      ]}
    />
  );
}

getRowId identifica internamente cada fila, pero no crea una columna visible. Cuando selectable está activo, el checkbox permanece fijo al inicio.

Definición y orden de columnas

El orden del arreglo columns determina el orden visual inicial de la tabla.

Columna de datos

{
  id: "email",
  header: "Correo",
  accessor: "email",
  sortable: true,
  filterable: true,
  width: 240,
  minWidth: 140,
  maxWidth: 400,
}

accessor puede ser una propiedad del registro o una función:

{
  id: "fullName",
  header: "Nombre completo",
  accessor: (user) => `${user.name} ${user.lastName}`,
}

Para renderizar contenido React personalizado usa cell:

{
  id: "status",
  header: "Estado",
  accessor: "status",
  cell: (value, user) => (
    <span data-user-id={user.id}>{String(value)}</span>
  ),
}

Columna de acciones

Declara type: "actions" dentro de columns para colocar las acciones en cualquier posición:

{ id: "actions", type: "actions", header: "Opciones", width: 140 }

Luego proporciona las acciones al componente:

<DataTable
  actions={[
    {
      id: "edit",
      label: "Editar",
      icon: <Pencil size={16} />,
      onClick: (row) => editUser(row),
    },
    {
      id: "delete",
      label: "Eliminar",
      variant: "danger",
      disabled: (row) => row.status === "Inactivo",
      hidden: (row) => !canDelete(row),
      onClick: (row) => deleteUser(row),
    },
  ]}
/>

Si proporcionas actions sin declarar la columna especial, la tabla conserva compatibilidad y agrega las acciones al final.

Número de fila

Puedes agregarlo automáticamente:

<DataTable showRowNumbers />

También puedes controlar su posición desde columns:

{ id: "rowNumber", type: "rowNumber", header: "#", width: 56 }

Reordenamiento de columnas

Actívalo mediante features.columnReordering:

<DataTable features={{ columnReordering: true }} />

El usuario puede arrastrar el asa del encabezado o enfocarla y utilizar las flechas izquierda y derecha.

Para controlar y persistir el orden desde la aplicación:

const [columnOrder, setColumnOrder] = useState([
  "name",
  "actions",
  "email",
  "status",
])

<DataTable
  data={users}
  columns={columns}
  getRowId={(user) => user.id}
  features={{ columnReordering: true }}
  columnOrder={columnOrder}
  onColumnOrderChange={setColumnOrder}
/>

Usa defaultColumnOrder si solo necesitas establecer un orden inicial no controlado. Los IDs nuevos u omitidos se incorporan automáticamente al final.

El checkbox de selección permanece fijo. Para mover acciones o numeración, sus columnas deben estar declaradas explícitamente dentro de columns.

Selección

Uso no controlado:

<DataTable selectable defaultSelectedRowIds={[1, 2]} />

Uso controlado:

const [selectedIds, setSelectedIds] = useState<Array<string | number>>([])

<DataTable
  selectable
  selectedRowIds={selectedIds}
  onSelectionChange={(ids, selectedRows) => {
    setSelectedIds(ids)
    console.log(selectedRows)
  }}
/>

Filtros y ordenamiento personalizados

{
  id: "salary",
  header: "Salario",
  accessor: "salary",
  filterable: true,
  sortable: true,
  filterFn: (value, filter) => Number(value) >= Number(filter || 0),
  sortFn: (a, b) => a.salary - b.salary,
}

Las propiedades sortable, filterable y resizable de cada columna permiten sobrescribir las funciones globales.

Presentación

<DataTable
  rowHeight={42}
  tableHeight="70vh"
  stickyHeader
  filterMode="menu"
  shape="soft"
  cellTooltips
  highlightActiveCell
/>
  • rowHeight controla el alto de las filas, con un mínimo de 32 px.
  • tableHeight acepta píxeles, cualquier medida CSS o "auto".
  • stickyHeader mantiene la cabecera fuera del área desplazable.
  • filterMode="menu" muestra filtros desplegables compactos.
  • filterMode="row" muestra una fila permanente de filtros.
  • shape="soft" | "square" controla el estilo global de los bordes.
  • cellTooltips muestra tooltips cuando el contenido está truncado.
  • highlightActiveCell resalta la última celda seleccionada.

Temas

<DataTable
  theme={{
    primary: "#7c3aed",
    surface: "#ffffff",
    text: "#1e1b2e",
    border: "#ddd7eb",
  }}
/>

Todos los colores son opcionales. tooltipStyle permite sobrescribir estilos específicos de los tooltips.

Funcionalidades globales

features={{
  sorting: true,
  filtering: true,
  pagination: true,
  resizing: true,
  columnReordering: true,
}}

sorting, filtering, pagination y resizing están activos por defecto. columnReordering debe activarse explícitamente.

API de DataTable

| Propiedad | Tipo | Valor inicial | Descripción | | ----------------------- | ------------------------------- | ----------------------------- | ------------------------------------------------------------ | | data | readonly T[] | Requerida | Registros que mostrará la tabla. | | columns | readonly DataTableColumn<T>[] | Requerida | Definición y orden inicial de las columnas. | | getRowId | (row: T) => string \| number | Requerida | Devuelve un identificador único por fila. | | actions | readonly DataTableAction<T>[] | [] | Acciones disponibles para cada fila. | | features | DataTableFeatures | Funciones principales activas | Activa o desactiva funciones globales. | | pageSize | number | 10 | Cantidad inicial de filas por página. | | pageSizeOptions | readonly number[] | [5, 10, 20, 50] | Opciones del selector de filas. | | emptyMessage | ReactNode | "No hay datos para mostrar" | Contenido mostrado sin resultados. | | className | string | "" | Clase adicional para el contenedor raíz. | | ariaLabel | string | "Tabla de datos" | Nombre accesible de la tabla. | | onRowClick | (row: T) => void | — | Evento al pulsar una fila. | | rowHeight | number | 48 | Alto de cada fila en píxeles. | | tableHeight | number \| string | "auto" | Alto del área desplazable. | | stickyHeader | boolean | false | Mantiene visible el encabezado. | | filterMode | "menu" \| "row" | "menu" | Presentación de los filtros. | | theme | DataTableTheme | Tema predeterminado | Colores semánticos del componente. | | selectable | boolean | false | Activa la selección de filas. | | selectedRowIds | readonly (string \| number)[] | — | Selección controlada. | | defaultSelectedRowIds | readonly (string \| number)[] | [] | Selección inicial no controlada. | | onSelectionChange | (ids, rows) => void | — | Informa cambios de selección. | | showRowNumbers | boolean | false | Agrega numeración automática. | | highlightActiveCell | boolean | false | Resalta la última celda pulsada. | | actionsColumn | DataTableActionsColumn | — | Configuración heredada de la columna automática de acciones. | | cellTooltips | boolean | true | Activa tooltips para contenido truncado. | | shape | "soft" \| "square" | "soft" | Estilo global de los bordes. | | tooltipStyle | CSSProperties | — | Sobrescribe los estilos del tooltip. | | columnOrder | readonly string[] | — | Orden controlado de columnas. | | defaultColumnOrder | readonly string[] | Orden de columns | Orden inicial no controlado. | | onColumnOrderChange | (columnIds: string[]) => void | — | Informa cambios en el orden. |

API de columnas

Una columna de datos admite:

| Propiedad | Descripción | | ------------------- | ------------------------------------------------------ | | id | Identificador único de la columna. | | header | Contenido React del encabezado. | | accessor | Propiedad del registro o función que obtiene el valor. | | cell | Renderizador personalizado de la celda. | | sortable | Activa o desactiva el ordenamiento de esa columna. | | filterable | Activa o desactiva su filtro. | | filterPlaceholder | Texto del campo de filtro. | | filterFn | Comparador personalizado para el filtro. | | sortFn | Comparador personalizado para el ordenamiento. | | resizable | Activa o desactiva su redimensionamiento. | | width | Ancho inicial en píxeles. | | minWidth | Ancho mínimo. | | maxWidth | Ancho máximo. | | align | Alineación left, center o right. | | className | Clase adicional para encabezado y celdas. | | tooltip | Contenido personalizado o false para desactivarlo. |

Las columnas especiales utilizan type: "actions" o type: "rowNumber" y admiten configuración de encabezado, tamaño, alineación, clase y redimensionamiento.

API de acciones

| Propiedad | Tipo | Descripción | | ---------- | ----------------------- | ----------------------------------------- | | id | string | Identificador único de la acción. | | label | string | Nombre accesible y contenido alternativo. | | icon | ReactNode | Icono o contenido visual opcional. | | onClick | (row: T) => void | Función ejecutada con el registro. | | hidden | (row: T) => boolean | Oculta la acción según el registro. | | disabled | (row: T) => boolean | Deshabilita la acción según el registro. | | variant | "default" \| "danger" | Apariencia visual de la acción. |