Star 历史趋势
数据来源: GitHub API · 生成自 Stargazers.cn
README.md

data-table-filters

Data tables for React and shadcn/ui: faceted filters, sorting, infinite scroll, and a row detail sheet. Installed as source with the shadcn CLI, so the code is yours to change.

Data Table with Infinite Scroll

One createTableSchema definition drives the columns, the filter controls, the row sheet, the Drizzle route handler, and the MCP tool schema. When the rows live in Postgres, filtering, faceted counts, and cursor pagination run in SQL. Built for the openstatus dashboard and used there in production.

Visit data-table.openstatus.dev to learn more. Read the Docs for full documentation.

Install

Registry install — the Quick Start below is installed into a fresh Next.js app on each shadcn library, Base UI and Radix, and typechecked nightly against the latest shadcn CLI.

Prerequisite. Works on either shadcn library: the CLI default, Base UI (npx shadcn@latest init -d), or Radix (npx shadcn@latest init -b radix -p nova). CI installs into both and typechecks them on every registry change and nightly.

One command installs the core block and the schema system:

npx shadcn@latest add @data-table-filters/data-table @data-table-filters/data-table-schema

Then render a table from any array of objects — columns, filters, and cell renderers are inferred:

import { DataTableAuto } from "@/components/data-table/data-table-auto";

const data = [
  {
    name: "Alice",
    role: "admin",
    rating: 5,
    created_at: "2026-01-15T10:00:00Z",
  },
  { name: "Bob", role: "user", rating: 3, created_at: "2026-02-20T14:30:00Z" },
];

export default function Page() {
  return <DataTableAuto data={data} />;
}

Starting from nothing? One command creates the Next.js app, initializes shadcn, and installs a working example with every block it needs (add -b radix before -p nova for Radix). Run cd data-table-app && npm run dev and open localhost:3000/example:

npx shadcn@latest init @data-table-filters/data-table-example-infinite --name data-table-app --template next -p nova

From create-next-app to a green next build this takes about 30 seconds on a clean machine. See the Quick Start for the full walkthrough, and add any block below as you need it.

BlockInstallWhat it adds
data-table@data-table-filters/data-tableCore: table engine, store, 4 filter types, memory adapter
data-table-filter-command@data-table-filters/data-table-filter-commandCommand palette with history + keyboard shortcuts
data-table-cell@data-table-filters/data-table-cell12 cell renderers (text, code, number, bar, heatmap, gauge, badge, boolean, star, status-code, level-indicator, timestamp)
data-table-sheet@data-table-filters/data-table-sheetRow detail side panel
data-table-nuqs@data-table-filters/data-table-nuqsnuqs URL state adapter
data-table-zustand@data-table-filters/data-table-zustandzustand state adapter
data-table-schema@data-table-filters/data-table-schemaDeclarative schema system with col.* factories
data-table-drizzle@data-table-filters/data-table-drizzleDrizzle ORM server-side helpers
data-table-query@data-table-filters/data-table-queryReact Query infinite query integration
data-table-filter-command-ai@data-table-filters/data-table-filter-command-aiAI-powered natural language → filter inference
data-table-mcp@data-table-filters/data-table-mcpMCP server endpoint for AI agents
data-table-actions@data-table-filters/data-table-actionsRow and bulk actions rendered from server metadata
data-table-remote@data-table-filters/data-table-remoteHeadless table that renders from an API endpoint's manifest
data-table-chart@data-table-filters/data-table-chartTimeline chart over the table: stacked buckets per level, drag to zoom the time filter
data-table-example-infinite@data-table-filters/data-table-example-infiniteReady-to-run /example route: schema, mock API, infinite table with URL state

Blocks install by name from the shadcn registry directory; the JSON form https://data-table.openstatus.dev/r/<block>.json works too.

For AI Agents

Install the plugin in Claude Code:

/plugin marketplace add openstatushq/data-table-filters
/plugin install data-table-filters@openstatus

Or install the skill with any agent that supports the skills CLI:

npx skills add https://github.com/openstatushq/data-table-filters --skill data-table-filters

Then just say "add a filterable data table" — the skill detects your stack, installs the right blocks, generates a schema, and wires everything up.

Or point any MCP client at the docs and let the agent ask them questions — search_docs, get_doc, list_blocks, get_install_plan:

claude mcp add --transport http data-table-filters https://data-table.openstatus.dev/api/mcp

Machine-readable docs, for agents without the skill:

EndpointWhat it is
/api/mcpThese docs as an MCP server (Streamable HTTP)
/llms.txtIndex: blocks, install recipes, docs links
/llms-full.txtEvery documentation page in one file
/r/index.mdBlock catalog with install commands and dependencies
/docs/<page>.mdAny docs page as raw markdown

Cursor users can copy .cursor/rules/data-table-filters.mdc into their project; AGENTS.md covers every other agent. See the For AI Agents docs page for the full rundown.

Table Schema

Define your entire table — columns, filters, display, sorting, row details — in one place with createTableSchema and col.* factories.

import {
  col,
  createTableSchema,
  type InferTableType,
} from "@/lib/table-schema";

const LEVELS = ["error", "warn", "info", "debug"] as const;

export const tableSchema = createTableSchema({
  level: col.presets.logLevel(LEVELS),
  date: col.presets.timestamp().label("Date").size(200).sheet(),
  latency: col.presets
    .duration("ms")
    .label("Latency")
    .sortable()
    .size(110)
    .sheet(),
  status: col.presets.httpStatus().label("Status").size(60),
  host: col.string().label("Host").size(125).sheet(),
});

export type ColumnSchema = InferTableType<typeof tableSchema.definition>;

Generators produce everything the table components need from a single schema:

const columns = generateColumns<ColumnSchema>(tableSchema.definition);
const filterFields = generateFilterFields<ColumnSchema>(tableSchema.definition);
const sheetFields = generateSheetFields<ColumnSchema>(tableSchema.definition);

Presets cover common patterns: logLevel, httpStatus, httpMethod, duration, timestamp, traceId, pathname.

Examples

  • /default — client-side pagination (nuqs or zustand)
  • /infinite — infinite scroll with server-side filtering, live mode, row details
  • /drizzle — Drizzle ORM + Supabase PostgreSQL with cursor-based pagination, faceted search, and live data via Vercel cron
  • /light — OpenStatus Light Viewer (UI for vercel-edge-ping)
  • /builder — interactive schema builder (paste JSON/CSV, live table preview, export TS)

BYOS (Bring Your Own Store)

A pluggable adapter pattern for filter state management. Three built-in adapters:

  • nuqs — URL-based state (shareable URLs, browser history)
  • zustand — client-side state (existing store integration)
  • memory — ephemeral in-memory state (embedded tables, builder)

Or implement the StoreAdapter interface for a custom solution. See the Docs for details.

Built With

Getting Started

No environment variable required for the default examples. For the Drizzle example, set DATABASE_URL to a PostgreSQL connection string.

pnpm install
pnpm dev

Open http://localhost:3000 with your browser to see the result.

Want more?

If you are looking for specific use-cases or like what we are building and want to hire us, feel free write us to hire@openstatus.dev or book a call via cal.com.

Credits

关于 About

Faceted filters, sorting & infinite scroll for React data tables - shadcn/ui + TanStack Table
cmdkdata-tablenextjsnuqsreactshadcntanstack-react-querytanstack-table

语言 Languages

TypeScript90.5%
MDX6.4%
Python2.3%
CSS0.5%
Shell0.2%
JavaScript0.1%

提交活跃度 Commit Activity

代码提交热力图
过去 52 周的开发活跃度
36
Total Commits
峰值: 11次/周
Less
More

核心贡献者 Contributors