---
name: woltz-react-rich-domain
description: React hooks and components for @woltz/rich-domain. Use when building frontend UIs with DataTable, Kanban, Timeline, or Criteria-based filtering.
---
# @woltz/react-rich-domain
React integration for @woltz/rich-domain with hooks, components, and React Query integration.
## Installation
```bash
npm install @woltz/react-rich-domain @tanstack/react-query
```
## Quick Start
### 1. Setup QueryClient
```typescript
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
const queryClient = new QueryClient();
function App() {
return (
);
}
```
### 2. Create a Data Table
```typescript
import { useCriteriaTable, DataTableCriteria } from "@woltz/react-rich-domain";
import { ColumnDef } from "@tanstack/react-table";
interface User {
id: string;
name: string;
email: string;
status: "active" | "inactive";
}
const columns: ColumnDef[] = [
{ accessorKey: "name", header: "Name" },
{ accessorKey: "email", header: "Email" },
{ accessorKey: "status", header: "Status" },
];
export function UserTable() {
const { table, filterProps, searchProps } = useCriteriaTable({
columns,
queryKey: ["users"],
queryFn: async (criteria) => {
const res = await fetch("/api/users?" + criteria.toQueryString());
return res.json();
},
filterFields: [
{
field: "status",
type: "string",
fieldLabel: "Status",
options: [
{ label: "Active", value: "active" },
{ label: "Inactive", value: "inactive" },
],
},
],
});
return (
);
}
```
### 3. Create a Kanban Board
```typescript
import { useCriteriaKanban, DataKanbanCriteria } from "@woltz/react-rich-domain";
interface Task {
id: string;
title: string;
status: "todo" | "doing" | "done";
}
const columns = [
{ id: "todo", title: "To Do", criteria: (c) => c.where("status", "equals", "todo") },
{ id: "doing", title: "In Progress", criteria: (c) => c.where("status", "equals", "doing") },
{ id: "done", title: "Done", criteria: (c) => c.where("status", "equals", "done") },
];
export function TaskBoard() {
const kanban = useCriteriaKanban("tasks", fetchTasks, {
columns,
getItemId: (task) => task.id,
groupField: "status",
onCardMove: async ({ cardId, toColumn }) => {
await updateTask(cardId, { status: toColumn.id });
},
});
return (
{task.title}
}
showItemCount
/>
);
}
```
## Available Hooks
| Hook | Purpose |
| -------------------------- | ----------------------------------------- |
| `useCriteria` | Manage filter, sort, pagination state |
| `useCriteriaQuery` | Criteria + React Query for paginated data |
| `useCriteriaInfiniteQuery` | Infinite scroll with Criteria |
| `useCriteriaTable` | TanStack Table + Criteria integration |
| `useCriteriaKanban` | Kanban board with drag-and-drop |
| `useCriteriaTimeline` | Timeline view with date grouping |
## Available Components
| Component | Purpose |
| ---------------------- | ---------------------------------------- |
| `DataTableCriteria` | Full-featured data table with filtering |
| `DataKanbanCriteria` | Kanban board with drag-and-drop |
| `DataTimelineCriteria` | Timeline view with grouped items |
| `DataViewToolbar` | Search, filter, export toolbar |
| `Filter` | Standalone filter dropdown UI |
| `Sorting` | Sorting UI with drag-and-drop reordering |
## References
For detailed documentation:
- [Hooks](./references/hooks.md) - useCriteria, useCriteriaQuery, useCriteriaTable, useCriteriaKanban, useCriteriaTimeline
- [Components](./references/components.md) - DataTableCriteria, DataKanbanCriteria, DataTimelineCriteria
- [Filter Component](./references/filter-component.md) - Standalone filter UI with operators by type
- [Sorting Component](./references/sorting-component.md) - Sorting UI with drag-and-drop reordering
- [Filtering](./references/filtering.md) - Filter fields, operators, and programmatic management
- [State Persistence](./references/state-persistence.md) - URL sync and localStorage
**Load references based on context - don't read all at once.**