Documentation

@kanunilabs/datagrid-enterprise


@kanunilabs/datagrid-enterprise / CreateEnterpriseGridConfig

Interface: CreateEnterpriseGridConfig<TRow>

Extends

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.)

Inherited from

CreateGridConfig.alignedGrids


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.

Inherited from

CreateGridConfig.announcements


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

CreateGridConfig.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.

Inherited from

CreateGridConfig.autoColumns


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.

Inherited from

CreateGridConfig.autoSizeStrategy


cellMenu?

optional cellMenu?: boolean | CellMenuOptions

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

Inherited from

CreateGridConfig.cellMenu


charting?

optional charting?: boolean | ChartingOptions

Charting (E5). true adds a "Chart" toolbar button (with toolbar) and a chart submenu on the row menu; the panel docks ABOVE the grid so a filter applied below is watched taking effect. The renderers are our own SVG — no recharts, no optional peer. Off by default, like React's.


columns

columns: VanillaColumnDef<TRow>[]

Inherited from

CreateGridConfig.columns


dark?

optional dark?: boolean

Inherited from

CreateGridConfig.dark


dataSource

dataSource: TRow[] | DataSource<TRow>

Inherited from

CreateGridConfig.dataSource


debugMode?

optional debugMode?: boolean

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

Inherited from

CreateGridConfig.debugMode


defaultColumnDef?

optional defaultColumnDef?: Partial<GridColumnDef<TRow>>

Inherited from

CreateGridConfig.defaultColumnDef


density?

optional density?: GridDensity

Inherited from

CreateGridConfig.density


editing?

optional editing?: EditingOptions<TRow>

Cell / batch editing (E2) — validation, undo/redo, pending styling, the command column and CRUD handlers. The engine is core's; unlicensed use still WORKS, watermarked. Editing UI defaults ON in this wrapper (the React wrapper's editing?.enabled ?? true); pass { enabled: false } to run the Community surface only.


emptyText?

optional emptyText?: string

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

Inherited from

CreateGridConfig.emptyText


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.

Inherited from

CreateGridConfig.enterpriseEdition


filterBuilder?

optional filterBuilder?: boolean

"Filter builder…" on the bar above the grid (E6): a nested AND/OR condition dialog over the core filter AST. While a filter is active the bar names it IN WORDS with a Clear beside it — a user looking at 12 of 100.000 rows needs to know why without reopening the dialog.


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.

Inherited from

CreateGridConfig.filterDebounce


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.

Inherited from

CreateGridConfig.filterIconMode


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.

Inherited from

CreateGridConfig.filterPanel


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.

Inherited from

CreateGridConfig.filterPanelLabels


filterRow?

optional filterRow?: boolean

Per-column text inputs under the header.

Inherited from

CreateGridConfig.filterRow


focusedRow?

optional focusedRow?: boolean

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

Inherited from

CreateGridConfig.focusedRow


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.

Inherited from

CreateGridConfig.focusedRowKey


optional footer?: boolean

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

Inherited from

CreateGridConfig.footer


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.

Inherited from

CreateGridConfig.footerMenu


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.

Inherited from

CreateGridConfig.footerPosition


getCellClassName?

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

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

Parameters

ctx

CellSlotContext<TRow>

Returns

string | undefined

Inherited from

CreateGridConfig.getCellClassName


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

CreateGridConfig.getRowHeight


gridId

gridId: string

Inherited from

CreateGridConfig.gridId


grouping?

optional grouping?: GroupingConfig

Inherited from

CreateGridConfig.grouping


headerFilter?

optional headerFilter?: boolean

Funnel buttons opening the distinct-value checkbox popup.

Inherited from

CreateGridConfig.headerFilter


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.

Inherited from

CreateGridConfig.headerMenu


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.

Inherited from

CreateGridConfig.highlightSearch


licenseKey?

optional licenseKey?: string


licenseOptions?

optional licenseOptions?: SetLicenseOptions


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.

Inherited from

CreateGridConfig.loadingOverlay


loadingText?

optional loadingText?: string

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

Inherited from

CreateGridConfig.loadingText


locale?

optional locale?: string

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

Inherited from

CreateGridConfig.locale


masterDetail?

optional masterDetail?: MasterDetailConfig

Expandable detail panels under rows. Enterprise (P9).

Inherited from

CreateGridConfig.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

CreateGridConfig.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.

Inherited from

CreateGridConfig.notes


onCellDoubleClick?

optional onCellDoubleClick?: (ctx) => void

Parameters

ctx

CellSlotContext<TRow>

Returns

void

Inherited from

CreateGridConfig.onCellDoubleClick


onCellPointerDown?

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

Parameters

ctx

CellSlotContext<TRow>

event

MouseEvent

Returns

void

Inherited from

CreateGridConfig.onCellPointerDown


onCellPointerEnter?

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

Parameters

ctx

CellSlotContext<TRow>

event

MouseEvent

Returns

void

Inherited from

CreateGridConfig.onCellPointerEnter


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

Inherited from

CreateGridConfig.onFocusedRowChanged


onImport?

optional onImport?: (rows) => void

"Import…" on the bar (E6): file/paste → mapping → commit. Receives rows already keyed by grid column id — the grid does NOT mutate the data source itself, because only the app knows whether to append, replace or post them to a server.

Parameters

rows

Record<string, unknown>[]

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

Inherited from

CreateGridConfig.onOpenFilterBuilder


onRowActivate?

optional onRowActivate?: (node) => void

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

Parameters

node

RowNode<TRow>

Returns

void

Inherited from

CreateGridConfig.onRowActivate


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

Inherited from

CreateGridConfig.onRowClick


pagination?

optional pagination?: PaginationConfig

Inherited from

CreateGridConfig.pagination


palette?

optional palette?: GridPalette

Inherited from

CreateGridConfig.palette


pinnedBottomRows?

optional pinnedBottomRows?: readonly TRow[]

Rows fixed below the scrolling body.

Inherited from

CreateGridConfig.pinnedBottomRows


pinnedTopRows?

optional pinnedTopRows?: readonly TRow[]

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

Inherited from

CreateGridConfig.pinnedTopRows


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.

Inherited from

CreateGridConfig.printLayout


remote?

optional remote?: RemoteConfig

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

Inherited from

CreateGridConfig.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

Inherited from

CreateGridConfig.renderCellContent


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

Inherited from

CreateGridConfig.renderDetail


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

Inherited from

CreateGridConfig.renderEditForm


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

Inherited from

CreateGridConfig.renderOverlay


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

Inherited from

CreateGridConfig.renderRow


reorderable?

optional reorderable?: boolean

Drag a header onto another to reorder. Default true.

Inherited from

CreateGridConfig.reorderable


resizable?

optional resizable?: boolean

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

Inherited from

CreateGridConfig.resizable


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).

Inherited from

CreateGridConfig.rowDrag


rowHeight?

optional rowHeight?: number

The STANDARD row height in px. Default 28.

Inherited from

CreateGridConfig.rowHeight


rowKey

rowKey: RowKeyResolver<TRow>

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

Inherited from

CreateGridConfig.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.

Inherited from

CreateGridConfig.rowMenu


rowNumbers?

optional rowNumbers?: boolean

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

Inherited from

CreateGridConfig.rowNumbers


scrolling?

optional scrolling?: ScrollingConfig

Virtual (default) or infinite scrolling.

Inherited from

CreateGridConfig.scrolling


searchDebounce?

optional searchDebounce?: number

Search box debounce, ms. React's default.

Inherited from

CreateGridConfig.searchDebounce


selection?

optional selection?: SelectionConfig

Inherited from

CreateGridConfig.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.

Inherited from

CreateGridConfig.showRowCount


optional sideBar?: boolean | SideBarOptions

Docked side bar on the grid's right edge (E1). true offers both tool panels (Columns, Filters) as a closed tab strip; the object form picks panels and can open one on mount. Everything the panels do goes through the controller, so changes made here and from the header menu, filter row or popup stay in one state.


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.

Inherited from

CreateGridConfig.sortable


sorting?

optional sorting?: SortingConfig

Inherited from

CreateGridConfig.sorting


stateStoring?

optional stateStoring?: StateStoringConfig

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

Inherited from

CreateGridConfig.stateStoring


statusBar?

optional statusBar?: boolean | StatusBarOptions

Docked status bar under the grid (E1). true shows all built-ins: total rows, filtered rows (only while a filter narrows), selected rows (only while any), and — once the range layer lands — the range statistics. The object form picks which, and itemsAfter appends the app's own indicators.


striped?

optional striped?: boolean

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

Inherited from

CreateGridConfig.striped


styledExport?

optional styledExport?: boolean

Excel exports carry the grid's presentation (alignment, number formats, banded rows, outline levels for groups, totals row). Default true — the "styled export AUTOMATIC" the Enterprise edition promises; false falls back to the Community sheet. Applies to the toolbar menu AND to any imperative exportToExcel() the app makes.


summaries?

optional summaries?: SummaryDef<TRow>[]

Footer totals over the filtered rows.

Inherited from

CreateGridConfig.summaries


theme?

optional theme?: GridTheme

Inherited from

CreateGridConfig.theme


toolbar?

optional toolbar?: boolean

Quick-search + CSV export bar above the grid.

Inherited from

CreateGridConfig.toolbar


toolbarColumnChooser?

optional toolbarColumnChooser?: boolean

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

Inherited from

CreateGridConfig.toolbarColumnChooser


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).

Inherited from

CreateGridConfig.toolbarExcel


toolbarItemsAfter?

optional toolbarItemsAfter?: HTMLElement[]

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

Inherited from

CreateGridConfig.toolbarItemsAfter


toolbarItemsBefore?

optional toolbarItemsBefore?: HTMLElement[]

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

Inherited from

CreateGridConfig.toolbarItemsBefore


toolbarPdf?

optional toolbarPdf?: boolean

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

Inherited from

CreateGridConfig.toolbarPdf


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).

Inherited from

CreateGridConfig.tooltip


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

CreateGridConfig.tree


virtualization?

optional virtualization?: VirtualizationConfig

Inherited from

CreateGridConfig.virtualization


worker?

optional worker?: WorkerConfig

Inherited from

CreateGridConfig.worker