@letar/forms

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.

apps/form-develop-app/src/app/data-grid-demo/page.tsx
'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>
  )
}

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

ScenarioComponent
Enter 5-50 new rows (order items)Form.Field.TableEditor
Edit/browse 100+ existing rowsForm.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

PropTypeDefaultDescription
namestringrequiredArray field name
columnsDataGridColumnDef[]requiredColumn definitions
pageSizenumber20Rows per page
rowSelectionbooleanfalseEnable checkbox selection
onRowSave(row, index) => Promise<void>Row-level save callback
virtualizedbooleanfalseVirtual scrolling for 1000+ rows
virtualHeightstring'500px'Container height for virtualized mode
columnResizingbooleanfalseEnable 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 saveonRowSave fires when a cell is edited
  • CSV export — download all data as CSV file

Live Example

Try the interactive example on forms-example.letar.best.

On this page