Documentation

@kanunilabs/datagrid-enterprise


@kanunilabs/datagrid-enterprise / CreateGridConfig

Interface: CreateGridConfig<TRow>

Extends

  • Omit<DataGridCoreConfig<TRow>, "columns">

Extended by

Type Parameters

TRow

TRow = GridRowData

Properties

alignedGrids?

optional alignedGrids?: string

Grids naming the same group keep their column layout and horizontal scroll in step — a scrolling body with a totals strip below it. Sort, filter, selection and vertical scroll deliberately do NOT travel. (Aligns with other VANILLA grids; the React registry is separate.)


announcements?

optional announcements?: boolean

A polite live region reporting row count, sort and selection to screen readers. Default true.

Sorting and filtering are otherwise visual-only events: the rows change under a screen-reader user with nothing said. The text is built from the resolved dictionary, so it is announced in the grid's language.


asyncTransactionWait?

optional asyncTransactionWait?: number

Milliseconds applyTransactionAsync waits before applying a batch (gap analysis P3.6). Default 50 — about three frames.

Raise it for a feed that ticks faster than the eye can follow; the grid then repaints less often and each pass carries more. Lower it only if the grid must visibly track something else on screen tick for tick.

Inherited from

Omit.asyncTransactionWait


autoColumns?

optional autoColumns?: boolean | InferColumnsOptions

Tunes the columns derived from the data when columns is omitted: sampleSize, include, exclude, humanizeHeaders, defaults. false turns the derivation off and leaves the grid with no columns.


autoSizeStrategy?

optional autoSizeStrategy?: "none" | "fitGrid" | "fitCells"

Column widths on startup. 'none' (default) keeps the declared widths.

'fitGrid' divides the grid's width among the columns and RE-RUNS on every grid resize, taking the current widths as its proportions — so a column the user dragged wider stays proportionally wider.

'fitCells' measures what the first rows actually rendered and runs ONCE: before the first paint there is nothing to measure. It can overflow the grid; that is the point of asking for content-width columns.


cellMenu?

optional cellMenu?: boolean | CellMenuOptions

Right-click menu with Copy / Copy with headers. Default true.


columns

columns: VanillaColumnDef<TRow>[]


dark?

optional dark?: boolean


dataSource

dataSource: TRow[] | DataSource<TRow>

Inherited from

Omit.dataSource


debugMode?

optional debugMode?: boolean

Console diagnostics for integration mistakes (duplicate keys, unknown columns…).

Inherited from

Omit.debugMode


defaultColumnDef?

optional defaultColumnDef?: Partial<GridColumnDef<TRow>>

Inherited from

Omit.defaultColumnDef


density?

optional density?: GridDensity


emptyText?

optional emptyText?: string

Text of the empty-state overlay. Defaults to the locale dictionary.


enterpriseEdition?

optional enterpriseEdition?: boolean

The edition flag, set by the Enterprise wrapper — the React prop of the same name. It gates what the CONTROLLER agrees to do (styled exports, master-detail…); without it the masterDetail config is stripped, the way the React Community renderer strips it.


filterDebounce?

optional filterDebounce?: number

ms before typed filter text reaches the engine. Same default as React: 0 for local data (the pipeline is the debounce), 200 for remote.


filterIconMode?

optional filterIconMode?: "hover" | "always"

When the header's funnel icon is visible: 'hover' (default) reveals it on hover or keyboard focus, 'always' pins it. An ACTIVE filter stays visible in both modes — it is the only sign that rows are being withheld.


filterPanel?

optional filterPanel?: boolean | "always"

The strip under the grid that says, in words, what is being filtered — with an × to drop it and a checkbox to suspend it without losing it.

'always' keeps the strip on screen with no filter applied, so the control does not appear and disappear under the pointer.


filterPanelLabels?

optional filterPanelLabels?: DescribeFilterOptions

Wording for the filter panel's sentence — operator captions, the list separator, and maxListValues (how long an in list gets before it collapses to "N values").

Defaults come from the grid's LOCALE; what you pass overrides key by key, so an app can rename one operator without restating the other thirteen.


filterRow?

optional filterRow?: boolean

Per-column text inputs under the header.


focusedRow?

optional focusedRow?: boolean

Highlight the row that holds focus. Default false — the React default.


focusedRowKey?

optional focusedRowKey?: RowKey | null

Focus this row when the grid is built — the React focusedRowKey prop.

React re-applies it whenever the prop changes; a vanilla config is read once, so this is the STARTING focus and later moves go through grid.controller.focusRow(key). Said plainly because a silently one-shot prop is exactly the kind of thing that costs an afternoon.


optional footer?: boolean

Totals row pinned to the bottom edge. Values come from summaries.


footerMenu?

optional footerMenu?: boolean

Clicking a footer cell opens the aggregation picker — No total / Count / Sum / Average / Min / Max, filtered to what the column's data type supports, so a text column is never offered a Sum (Number() over names totals 0, and a 0 in a footer is indistinguishable from a real zero). Default true; false makes the footer read-only.

With it on, a cell holding no total shows a faint dot — otherwise the only affordance is an empty rectangle nobody thinks to click.


footerPosition?

optional footerPosition?: "top" | "bottom"

Where the totals row sits: 'bottom' (default) or 'top', directly under the header — the React footerPosition prop. Community, like the totals themselves.


getCellClassName?

optional getCellClassName?: (ctx) => string | undefined

Extra classes for a body cell (pending edit, range, fill preview…).

Parameters

ctx

CellSlotContext<TRow>

Returns

string | undefined


getRowHeight?

optional getRowHeight?: (node, index) => number | undefined

Per-row height, in px. Return undefined for the standard height.

OPT-IN, and deliberately so: supplying it means the grid asks about every row in the view on every projection, which on a million rows is a million calls per filter keystroke. Leave it off and row geometry stays one multiplication — see RowHeightIndex. Detail panels and the edit form do NOT need this; they carry their own height.

For heights that depend on how text wraps, prefer autoHeight on the column: the adapter measures what it rendered instead of asking the app to predict it.

Parameters

node

RowNode<TRow>

index

number

Returns

number | undefined

Inherited from

Omit.getRowHeight


gridId

gridId: string

Inherited from

Omit.gridId


grouping?

optional grouping?: GroupingConfig

Inherited from

Omit.grouping


headerFilter?

optional headerFilter?: boolean

Funnel buttons opening the distinct-value checkbox popup.


headerMenu?

optional headerMenu?: boolean | ((context, defaults) => GridMenuItem<HeaderMenuContext>[])

Right-click menu on column headers — the React headerMenu prop, DOM-flavoured. true/omitted shows the default items (sort, group, pin, hide, best fit…); false turns it off; a function receives the context and the defaults and returns the finished list, so an app can reorder, drop or append without rebuilding what the grid provides.


highlightSearch?

optional highlightSearch?: boolean

Wrap search matches in <mark> inside the cell. Default true — the React highlightSearch prop. Applied to the FINISHED text (after the lookup, the formatter and the date format), because that is what the reader searched.


loadingOverlay?

optional loadingOverlay?: number | boolean

The busy overlay. true (default) shows it after 300 ms of continuous FOREGROUND work; a number sets that delay; false turns it off entirely.

The delay is not decoration. Every filter keystroke re-runs the pipeline, and a pass that finishes in 20 ms would raise and drop the overlay faster than anyone can read it — a strobe. Background passes (a streamed transaction batch, a block fetch caused by scrolling) never raise it at all: the user did not ask for them and is not waiting on them.

controller.showLoadingOverlay() is an explicit decision rather than a flicker to absorb, so it appears at once, delay skipped.


loadingText?

optional loadingText?: string

Label of the busy overlay. Defaults to the locale dictionary.


locale?

optional locale?: string

Dictionary locale (core's twelve). Default 'en'.

Overrides

Omit.locale


masterDetail?

optional masterDetail?: MasterDetailConfig

Expandable detail panels under rows. Enterprise (P9).

Inherited from

Omit.masterDetail


messages?

optional messages?: Partial<GridDictionary>

Override individual strings without replacing the language.

Merged over the resolved dictionary, so an app can rename "Actions" to its own wording in every language while leaving the other 250 alone.

Inherited from

Omit.messages


notes?

optional notes?: GridNotesConfig<TRow>

Cell notes (P3.3): a marker on noted cells, the note as the hover tooltip, and — with onChange — add/edit/delete on the row menu with an anchored textarea. Enterprise: ignored (reported under debugMode) without enterpriseEdition, the React rule.


onCellDoubleClick?

optional onCellDoubleClick?: (ctx) => void

Parameters

ctx

CellSlotContext<TRow>

Returns

void


onCellPointerDown?

optional onCellPointerDown?: (ctx, event) => void

Parameters

ctx

CellSlotContext<TRow>

event

MouseEvent

Returns

void


onCellPointerEnter?

optional onCellPointerEnter?: (ctx, event) => void

Parameters

ctx

CellSlotContext<TRow>

event

MouseEvent

Returns

void


onFocusedRowChanged?

optional onFocusedRowChanged?: (event) => void

Fired when the focused ROW changes — not on every cell move within it.

Parameters

event
row?

TRow

rowKey

RowKey | null

Returns

void


onOpenFilterBuilder?

optional onOpenFilterBuilder?: () => void

Opens the app's filter builder from the panel's chevron. Without it the chevron is not drawn, because a control that opens nothing is worse than no control — React's rule, and the Enterprise wrapper wires it to its own builder.

Returns

void


onRowActivate?

optional onRowActivate?: (node) => void

Fired on Enter / double-click over the focused row.

Parameters

node

RowNode<TRow>

Returns

void


onRowClick?

optional onRowClick?: (node) => void

Fired on a click anywhere in a row, before the grid's own row event.

Parameters

node

RowNode<TRow>

Returns

void


pagination?

optional pagination?: PaginationConfig

Inherited from

Omit.pagination


palette?

optional palette?: GridPalette


pinnedBottomRows?

optional pinnedBottomRows?: readonly TRow[]

Rows fixed below the scrolling body.


pinnedTopRows?

optional pinnedTopRows?: readonly TRow[]

Rows fixed above the scrolling body. Adapter chrome, like React's.


printLayout?

optional printLayout?: boolean | PrintLayoutOptions

Render EVERY row while the browser prints, so the print engine paginates real content instead of one clipped screenful. true = only while the print dialog is open; an options object can pin it always (report pages) or move the maxRows refusal point.


remote?

optional remote?: RemoteConfig

Tuning for a remote DataSource (ignored for array data).

Inherited from

Omit.remote


renderCellContent?

optional renderCellContent?: (ctx) => string | Node | undefined

Replace a body cell's content. undefined = the default painter runs.

Parameters

ctx

CellSlotContext<TRow>

Returns

string | Node | undefined


renderDetail?

optional renderDetail?: (row) => string | Node

Panel body for a master-detail row. With the engine's masterDetail config present, supplying this turns the leading expander column on — the React renderDetail prop, DOM-typed.

Parameters

row

TRow

Returns

string | Node


renderEditForm?

optional renderEditForm?: (rowKey, row) => string | Node

Body for an in-grid edit form row (mode: 'form'). row is undefined for a record that does not exist yet — the form still opens, because the alternative is pressing "New row" and seeing nothing happen.

Parameters

rowKey

RowKey

row

TRow | undefined

Returns

string | Node


renderOverlay?

optional renderOverlay?: () => Node | null

An absolutely-positioned layer over the viewport {M} the React renderOverlay, DOM-typed. Returns the node to show, or null for none.

Called on every repaint like React's is; returning the SAME node twice leaves it mounted, so a layer that owns focus or an animation is not torn down underneath itself.

Returns

Node | null


renderRow?

optional renderRow?: (context) => string | Node | null | undefined

Replace each DATA row's content. Group headers and detail panels keep their own rendering — a template that had to handle those too would be a template of the whole grid.

The row ELEMENT stays: it carries the height, the aria indices, the zebra and selection classes and the handlers the virtualizer depends on. What the template replaces are the CELLS — including the lead ones, so the row number, the detail expander and the selection checkbox are not drawn while it is on, and in-cell editing and range selection have nothing to attach to. (The drag grip survives: it is not a cell.) React draws exactly the same line.

For per-cell customization that keeps the column layout, use a column's renderCell.

Returning the SAME node you returned last time is how a template says "nothing changed" — the DOM is then left alone, so a focused input inside it keeps its caret.

Parameters

context

RowTemplateContext<TRow>

Returns

string | Node | null | undefined


reorderable?

optional reorderable?: boolean

Drag a header onto another to reorder. Default true.


resizable?

optional resizable?: boolean

Drag the trailing edge of a header to resize. Default true.


rowDrag?

optional rowDrag?: RowDragConfig<TRow>

Drag rows to reorder them, and — with a shared group — between two grids. A grip appears at the start of each row on hover. Reordering the grid's own array only works on an UNSORTED view (the React caveat).


rowHeight?

optional rowHeight?: number

The STANDARD row height in px. Default 28.

Inherited from

Omit.rowHeight


rowKey

rowKey: RowKeyResolver<TRow>

REQUIRED: stable row identity — selection, editing and live updates hang off it.

Inherited from

Omit.rowKey


rowMenu?

optional rowMenu?: GridMenuItem<RowMenuContext<TRow>>[] | ((context) => GridMenuItem<RowMenuContext<TRow>>[])

App-defined right-click menu for data rows — the React rowMenu prop, DOM-flavoured. A function receives the row that was clicked so the items can depend on it. The grid's own entries (Copy…) append BELOW after a separator, so an app's menu keeps the order it wrote.


rowNumbers?

optional rowNumbers?: boolean

Leading 1-based row-number column. Adapter chrome; core never sees it.


scrolling?

optional scrolling?: ScrollingConfig

Virtual (default) or infinite scrolling.

Inherited from

Omit.scrolling


searchDebounce?

optional searchDebounce?: number

Search box debounce, ms. React's default.


selection?

optional selection?: SelectionConfig

Inherited from

Omit.selection


showRowCount?

optional showRowCount?: boolean

Deprecated

Retired 2026-08-15 and inert in BOTH renderers; accepted so existing call sites keep working.

It rendered a strip under the grid whose only content was the row count. The per-column totals it once carried moved into the footer ROW, where each number sits under its own column — leaving a whole bar to say one number, printed a second time whenever the Enterprise status bar was on.

The count lives in the status bar (Enterprise: total, filtered, selected) or in the pager, which shows the total when pagination is on.

Unlike React, this renderer says so once in the console when you set it — a vanilla caller has no editor surfacing the @deprecated tag.


sortable?

optional sortable?: boolean

Sorting for the whole grid. Default true; false turns every header into a plain label. A column can still opt out on its own with sortable: false on its definition — the React prop of the same name.


sorting?

optional sorting?: SortingConfig

Inherited from

Omit.sorting


stateStoring?

optional stateStoring?: StateStoringConfig

Persist and restore the view (sort, filters, widths…). Core's service.


striped?

optional striped?: boolean

Zebra rows. Default TRUE — the React renderer's default.


summaries?

optional summaries?: SummaryDef<TRow>[]

Footer totals over the filtered rows.

Inherited from

Omit.summaries


theme?

optional theme?: GridTheme


toolbar?

optional toolbar?: boolean

Quick-search + CSV export bar above the grid.


toolbarColumnChooser?

optional toolbarColumnChooser?: boolean

"Columns" button in the toolbar opening the visibility chooser.


toolbarExcel?

optional toolbarExcel?: boolean

Excel entries (all rows / selected rows) on the toolbar's export menu. Enterprise: shown only under enterpriseEdition, hidden rather than shown-and-failing — the controller would throw, and a menu entry whose only outcome is an error is worse than no entry (the React rule).


toolbarItemsAfter?

optional toolbarItemsAfter?: HTMLElement[]

Extra toolbar buttons, appended after the grid's own — the React toolbarItemsAfter prop, DOM-flavoured. Ignored without toolbar.


toolbarItemsBefore?

optional toolbarItemsBefore?: HTMLElement[]

Extra toolbar buttons, BEFORE the grid's own — React's toolbarItemsBefore.


toolbarPdf?

optional toolbarPdf?: boolean

PDF entry on the export menu — Enterprise, same gate as toolbarExcel.


tooltip?

optional tooltip?: boolean | { delay?: number; enabled?: boolean; showOnTruncation?: boolean; }

Hover tooltips. false disables everything, the truncation fallback included; the object form is the React GridTooltipConfig.

enabled: false used to be read as "an object, so tooltips are on" and only its delay was honoured {M} the one spelling a developer reaches for to turn the feature off did nothing at all (audit J2, 2026-08-25).


tree?

optional tree?: TreeDataConfig<TRow>

Hierarchical rows (Enterprise, P1.4): each row points at its parent, the grid renders the tree. Mutually exclusive with grouping — tree wins and grouping is ignored (reported under debugMode). Client row model only.

Inherited from

Omit.tree


virtualization?

optional virtualization?: VirtualizationConfig

Inherited from

Omit.virtualization


worker?

optional worker?: WorkerConfig

Inherited from

Omit.worker