Current version: v0.5.2
Features are grouped into milestones. Each milestone is independently releasable.
Group rows by one or more columns with a drag-panel UI, nested groups, and expand/collapse.
-
groupable?: boolean— grid-level, enables drag panel and grouping UI; defaultfalse -
group?: { order: string[] }— initial grouping state;orderis an array of column IDs -
groupable?: booleanonGridColumn— opt a column out of the drag panel (defaulttruewhen gridgroupableis on)
- Rendered above the grid when
groupable: true - Each chip shows: column label + sort direction toggle (idle/asc/desc) + × remove button
- Chips are draggable to reorder grouping priority
- Columns can be dragged from the header into the panel to add a group level
- Multi-level nesting — each entry in
orderadds one nesting level with increased indentation - Group header row shows: chevron + group value + row count e.g.
Dog (43) - Expand/collapse per row (chevron toggle); groups default to expanded
-
groupBy(columnIds)/clearGroups()GridApi methods
- Per-chip sort direction toggle sorts leaf rows within that group level
- Regular column header sort still works on leaf rows within groups
-
onBeforeGroupChange/onGroupChangeevents
Allow fully custom React components as cell editors, not just the built-in input types.
-
editTemplatecolumn prop —(value, row, col, onChange, onCommit) => ReactNode - Editor lifecycle: focus management, commit on blur/Enter, cancel on Escape
- Works alongside existing
editorTypevalues —editTemplatetakes precedence when set
Pin arbitrary rows by ID to the top or bottom of the grid, keeping them visible while the rest of the data scrolls.
-
pinnedTopRows?: string[]— row IDs to pin at the top; rows are removed from the scrollable area -
pinnedBottomRows?: string[]— row IDs to pin at the bottom; rows are removed from the scrollable area
- Pinned rows scroll horizontally in sync with the grid body
- Pinned rows support inline editing when
editable: true - Per-row height via
$heightalready works; pinned rows respect it - Pinned rows interact correctly with frozen left/right columns (corner cells rendered separately)
- Selection, CSS overrides, and tooltips work the same as regular rows
-
onBeforePin/onAfterPin— called whenpinnedTopRowsorpinnedBottomRowschanges
Multi-row drag via a dedicated handle column, with ghost preview and group-row drag support.
-
dragItem: "row"+ newdragHandle: truegrid prop — renders a⋮⋮(six-dot) handle as the leftmost column on every row - Drag only initiates from the handle icon; clicking the row body does not start a drag
- Handle column has no header label, fixed narrow width, non-resizable, non-sortable
- When multiple rows are selected, dragging any of their handles drags all selected rows together
- Origin rows appear ghosted/semi-transparent during drag
- Drag preview shows a stacked multi-row card with a move cursor (↕)
- Group header rows are also draggable via their handle — moves the entire group
- Drop indicator line shown between rows at the insertion point
- Rows can only be dropped within their own group — cross-group drops are disabled
- Group header rows can only be reordered at the same nesting level — cannot be dropped inside another group
- Cross-grid drag — drop rows from one grid instance into another
- Touch drag support
-
onBeforeRowDrag/onAfterRowDrop/onDragStart/onDragEnd
Track cell edit history and expose undo/redo for data-entry workflows.
- History module — tracks cell value changes automatically
-
undo()/redo()/clearHistory()API methods -
onBeforeUndo/onAfterUndo/onBeforeRedo/onAfterRedoevents
Expand rows inline to show nested content: sub-grids, forms, custom React components.
-
subRowprop — callback returningReactNodefor expanded content -
subRowConfig—expanded,preserve,toggleIcon,height,padding,css,fullWidth -
expand(rowId)/collapse(rowId)/expandAll()/collapseAll()API methods -
onBeforeExpand/onAfterExpand/onBeforeCollapse/onAfterCollapseevents
Spreadsheet-style range and block selection with copy/paste.
- Range selection — rectangular multi-cell selection via Shift+click or Shift+arrow
- Block selection — block-based cell selection module
- Clipboard — copy/paste cell data (
onBeforeCopy,onAfterCopy,onBeforePaste,onAfterPaste)
Filling in missing imperative API methods and events for programmatic control.
-
textareaeditor type -
scrollTo(rowId, colId)API method -
editCell(rowId, colId)/editEnd(save?)API methods -
isColumnHidden(colId)API method -
hideRow/showRow/isRowHiddenAPI methods -
adjustColumnWidth,getCellRect,paintAPI methods -
getSummary,getHeaderFilterAPI methods - Cell mouse events:
onCellMouseDown,onCellMouseOver,onCellRightClick - Filter lifecycle events:
onBeforeFilter,onFilterChange - Column visibility events:
onBeforeColumnHide,onAfterColumnHide,onBeforeColumnShow,onAfterColumnShow - Row visibility events:
onBeforeRowHide,onAfterRowHide,onBeforeRowShow,onAfterRowShow - Keyboard events:
onBeforeKeyDown,onAfterKeyDown -
autoEmptyRowprop (auto-append empty row for data entry)
Column-level data formatting and richer filter configuration.
-
dateFormat— per-column date display format -
numberMask— prefix, suffix, decimal places, thousands separator -
patternMask— input mask (e.g. phone, postal code) -
eventHandlers— attach event listeners to HTML elements in cells -
dateFilter— calendar-based filter in column headers -
customFilter— per-column custom filter logic callback -
filterConfig— placeholder, icons, multiselection options per filter -
footerPosition: "bottom"— anchor footer to container bottom -
getSummary()— read aggregated footer values programmatically - Dynamic span API:
addSpan(),removeSpan(),getSpan()
Group related columns under a shared header label, with toggle to collapse the group into a narrow strip.
- Nested
columnstree — group objects carry aheaderlabel and achildren: GridColumn[]array; leaf nodes are the existing data columns -
collapsed?: booleanon group columns — initial collapsed state - Groups can be nested (e.g. "Main client info" > "User" > "First Name" / "Last Name")
- Group header cells span their children's widths (
colspanequivalent) - Each group cell shows a
›/‹toggle button to expand/collapse - When collapsed, child columns are hidden and replaced by a single narrow strip showing the group label rotated vertically
- Multi-level groups collapse independently — collapsing a child group does not collapse the parent
- Collapsed state can be controlled via prop or toggled interactively
- Resize and reorder are disabled on group header cells; they still work on leaf columns
- Frozen left/right columns that belong to a group collapse correctly within their fixed panel
-
onBeforeCollapse/onAfterCollapse/onBeforeExpand/onAfterExpandevents -
collapseColumn(groupId)/expandColumn(groupId)GridApi methods
Allow grids to display built-in UI text in any language via a locale prop, with an optional LocaleProvider for app-wide configuration.
-
localeprop onGrid— accepts a partial locale object; missing keys fall back to the built-in English defaults - Built-in strings to localize: group column header (
"Group"), group row count wrapper (e.g."(43)"), expand/collapse aria-labels, filter input placeholder
-
<LocaleProvider locale={...}>context — allGridinstances inside inherit the locale without needing a per-grid prop - Per-grid
localeprop overrides the context for that instance - Export
type GridLocaleso users can type their locale objects
-
enLocale— English (default, built-in) -
frLocale— French -
deLocale— German -
esLocale— Spanish
- PDF export (
pdf(filename?)API method) - PNG export (
png(filename?)API method) - Final API surface review and documentation pass