DataGrid
Editable data grid with sorting, filtering, pagination, and inline editing powered by TanStack Table
Full example
The complete sandbox example, read directly from the form-develop-app / form-develop-app-shadcn
source at build time — switch framework/skin to see Form.Field.DataGrid/FieldDataGrid (both
mark it as beta) across implementations. No Vue/Angular equivalent exists yet — those tabs show as
disabled.
'use client'
import { Box, Heading, Text, VStack } from '@chakra-ui/react'
import { Form } from '@letar/forms'
import { useState } from 'react'
import { DemoPageLayout, SubmittedDataPreview } from '../_components'
/** Генерация тестовых данных */
function generateEmployees(count: number) {
const departments = ['Разработка', 'Дизайн', 'Маркетинг', 'Продажи', 'HR']
return Array.from({ length: count }, (_, i) => ({
name: `Сотрудник ${i + 1}`,
email: `employee${i + 1}@company.com`,
department: departments[i % departments.length],
salary: 50000 + Math.floor(Math.random() * 100000),
}))
}
export default function DataGridDemoPage() {
const [submittedData, setSubmittedData] = useState<Record<string, unknown> | null>(null)
return (
<DemoPageLayout
title="Form.Field.DataGrid"
description="Редактируемая таблица данных на TanStack Table: сортировка, фильтры, пагинация, inline editing"
>
<VStack gap={8} align="stretch">
<Box>
<Heading size="md" mb={3}>
100 сотрудников
</Heading>
<Text fontSize="sm" color="fg.muted" mb={4}>
Клик по ячейке → редактирование. Заголовок → сортировка. Фильтры сверху. Пагинация по 10 записей.
</Text>
<Form
debug
initialValue={{ employees: generateEmployees(100) }}
onSubmit={(data) => setSubmittedData(data as Record<string, unknown>)}
>
<Form.Field.DataGrid
name="employees"
label="Сотрудники"
columns={[
{ name: 'name', label: 'Имя', editable: true, filter: 'text' },
{ name: 'email', label: 'Email', editable: true, filter: 'text' },
{ name: 'department', label: 'Отдел', editable: true, filter: 'text' },
{ name: 'salary', label: 'Зарплата', editable: true, align: 'right' },
]}
pageSize={10}
rowSelection
helperText="Клик по ячейке для редактирования, Enter для сохранения"
/>
<Form.Button.Submit>Сохранить все изменения</Form.Button.Submit>
</Form>
</Box>
<SubmittedDataPreview data={submittedData} />
</VStack>
</DemoPageLayout>
)
}'use client'
import { FieldDataGrid } from '@letar/forms-shadcn'
import { DemoForm, DemoPageLayout } from '../_components'
export default function DataGridDemoPage() {
return (
<DemoPageLayout
title="FieldDataGrid (beta)"
description={'Большая таблица на @tanstack/react-table — изолированная песочница со своим array-полем employees. '
+ 'Сортировка (клик по заголовку), текстовый фильтр по имени, инлайн-редактирование (клик по ячейке), '
+ 'выбор строк + bulk-удаление, CSV-экспорт.'}
>
<DemoForm<{ employees: { name: string; department: string; salary: number }[] }>
defaultValues={{
employees: [
{ name: 'Иван Петров', department: 'Разработка', salary: 150000 },
{ name: 'Мария Сидорова', department: 'Дизайн', salary: 120000 },
{ name: 'Пётр Иванов', department: 'Продажи', salary: 90000 },
],
}}
onSubmit={(value) => {
// eslint-disable-next-line no-console
console.log('data-grid submit', value)
}}
>
<FieldDataGrid
name="employees"
label="Сотрудники"
rowSelection
columns={[
{ name: 'name', label: 'Имя', filter: true },
{ name: 'department', label: 'Отдел', filter: true },
{ name: 'salary', label: 'Зарплата', align: 'right' },
]}
/>
</DemoForm>
</DemoPageLayout>
)
}Vue-пример для этого поля появится позже.
Angular-пример для этого поля появится позже.
Overview
Form.Field.DataGrid is for editing large datasets (100+ rows) with sorting, filtering, and pagination. Unlike TableEditor (which is for creating new rows), DataGrid is for editing existing data.
When to Use
| Scenario | Component |
|---|---|
| Enter 5-50 new rows (order items) | Form.Field.TableEditor |
| Edit/browse 100+ existing rows | Form.Field.DataGrid |
Basic Usage
<Form initialValue={{ employees: data }} onSubmit={save}>
<Form.Field.DataGrid
name="employees"
columns={[
{ name: 'name', editable: true, filter: 'text' },
{ name: 'salary', editable: true, align: 'right' },
{ name: 'department', editable: true, filter: 'text' },
]}
pageSize={20}
rowSelection
/>
<Form.Button.Submit>Save</Form.Button.Submit>
</Form>Props
| Prop | Type | Default | Description |
|---|---|---|---|
name | string | required | Array field name |
columns | DataGridColumnDef[] | required | Column definitions |
pageSize | number | 20 | Rows per page |
rowSelection | boolean | false | Enable checkbox selection |
onRowSave | (row, index) => Promise<void> | — | Row-level save callback |
virtualized | boolean | false | Virtual scrolling for 1000+ rows |
virtualHeight | string | '500px' | Container height for virtualized mode |
columnResizing | boolean | false | Enable column resize by dragging |
size | 'sm' | 'md' | 'lg' | 'sm' | Table size |
Column Definition
interface DataGridColumnDef {
name: string
label?: string
editable?: boolean // default: true
filter?: 'text' | 'range' | 'select' | 'date'
align?: 'left' | 'center' | 'right'
width?: string
}Features
- Sorting — click column header to sort (↑ asc, ↓ desc)
- Filtering — text input per column
- Pagination — Previous/Next buttons, page number (disabled when
virtualized) - Virtualization — smooth scrolling for 1000+ rows with
virtualized={true} - Column resizing — drag column borders with
columnResizing={true} - Column reordering — drag column headers to change order
- Inline editing — click cell to edit, Enter to save, Escape to cancel
- Diff highlighting — edited cells are highlighted in yellow
- Row selection — checkbox per row, select all, bulk delete
- Row-level save —
onRowSavefires when a cell is edited - CSV export — download all data as CSV file
Live Example
Try the interactive example on forms-example.letar.best.