@kanunilabs/datagrid-enterprise
@kanunilabs/datagrid-enterprise / CreateEnterpriseGridConfig
Interface: CreateEnterpriseGridConfig<TRow>
Extends
CreateGridConfig<TRow>
Type Parameters
TRow
TRow = GridRowData
Properties
alignedGrids?
optionalalignedGrids?: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
announcements?
optionalannouncements?: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?
optionalasyncTransactionWait?: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?
optionalautoColumns?: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
autoSizeStrategy?
optionalautoSizeStrategy?:"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?
optionalcellMenu?:boolean|CellMenuOptions
Right-click menu with Copy / Copy with headers. Default true.
Inherited from
charting?
optionalcharting?: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
dark?
optionaldark?:boolean
Inherited from
dataSource
dataSource:
TRow[] |DataSource<TRow>
Inherited from
debugMode?
optionaldebugMode?:boolean
Console diagnostics for integration mistakes (duplicate keys, unknown columns…).
Inherited from
defaultColumnDef?
optionaldefaultColumnDef?:Partial<GridColumnDef<TRow>>
Inherited from
CreateGridConfig.defaultColumnDef
density?
optionaldensity?:GridDensity
Inherited from
editing?
optionalediting?: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?
optionalemptyText?:string
Text of the empty-state overlay. Defaults to the locale dictionary.
Inherited from
enterpriseEdition?
optionalenterpriseEdition?: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?
optionalfilterBuilder?: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?
optionalfilterDebounce?: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?
optionalfilterIconMode?:"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?
optionalfilterPanel?: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
filterPanelLabels?
optionalfilterPanelLabels?: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?
optionalfilterRow?:boolean
Per-column text inputs under the header.
Inherited from
focusedRow?
optionalfocusedRow?:boolean
Highlight the row that holds focus. Default false — the React default.
Inherited from
focusedRowKey?
optionalfocusedRowKey?: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
footer?
optionalfooter?:boolean
Totals row pinned to the bottom edge. Values come from summaries.
Inherited from
footerMenu?
optionalfooterMenu?: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
footerPosition?
optionalfooterPosition?:"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?
optionalgetCellClassName?: (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?
optionalgetRowHeight?: (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
gridId
gridId:
string
Inherited from
grouping?
optionalgrouping?:GroupingConfig
Inherited from
headerFilter?
optionalheaderFilter?:boolean
Funnel buttons opening the distinct-value checkbox popup.
Inherited from
headerMenu?
optionalheaderMenu?: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
highlightSearch?
optionalhighlightSearch?: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?
optionallicenseKey?:string
licenseOptions?
optionallicenseOptions?:SetLicenseOptions
loadingOverlay?
optionalloadingOverlay?: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?
optionalloadingText?:string
Label of the busy overlay. Defaults to the locale dictionary.
Inherited from
locale?
optionallocale?:string
Dictionary locale (core's twelve). Default 'en'.
Inherited from
masterDetail?
optionalmasterDetail?:MasterDetailConfig
Expandable detail panels under rows. Enterprise (P9).
Inherited from
messages?
optionalmessages?: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
notes?
optionalnotes?: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
onCellDoubleClick?
optionalonCellDoubleClick?: (ctx) =>void
Parameters
ctx
CellSlotContext<TRow>
Returns
void
Inherited from
CreateGridConfig.onCellDoubleClick
onCellPointerDown?
optionalonCellPointerDown?: (ctx,event) =>void
Parameters
ctx
CellSlotContext<TRow>
event
MouseEvent
Returns
void
Inherited from
CreateGridConfig.onCellPointerDown
onCellPointerEnter?
optionalonCellPointerEnter?: (ctx,event) =>void
Parameters
ctx
CellSlotContext<TRow>
event
MouseEvent
Returns
void
Inherited from
CreateGridConfig.onCellPointerEnter
onFocusedRowChanged?
optionalonFocusedRowChanged?: (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?
optionalonImport?: (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?
optionalonOpenFilterBuilder?: () =>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?
optionalonRowActivate?: (node) =>void
Fired on Enter / double-click over the focused row.
Parameters
node
RowNode<TRow>
Returns
void
Inherited from
CreateGridConfig.onRowActivate
onRowClick?
optionalonRowClick?: (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
pagination?
optionalpagination?:PaginationConfig
Inherited from
palette?
optionalpalette?:GridPalette
Inherited from
pinnedBottomRows?
optionalpinnedBottomRows?: readonlyTRow[]
Rows fixed below the scrolling body.
Inherited from
CreateGridConfig.pinnedBottomRows
pinnedTopRows?
optionalpinnedTopRows?: readonlyTRow[]
Rows fixed above the scrolling body. Adapter chrome, like React's.
Inherited from
CreateGridConfig.pinnedTopRows
printLayout?
optionalprintLayout?: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
remote?
optionalremote?:RemoteConfig
Tuning for a remote DataSource (ignored for array data).
Inherited from
renderCellContent?
optionalrenderCellContent?: (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?
optionalrenderDetail?: (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
renderEditForm?
optionalrenderEditForm?: (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?
optionalrenderOverlay?: () =>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?
optionalrenderRow?: (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
reorderable?
optionalreorderable?:boolean
Drag a header onto another to reorder. Default true.
Inherited from
resizable?
optionalresizable?:boolean
Drag the trailing edge of a header to resize. Default true.
Inherited from
rowDrag?
optionalrowDrag?: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
rowHeight?
optionalrowHeight?:number
The STANDARD row height in px. Default 28.
Inherited from
rowKey
rowKey:
RowKeyResolver<TRow>
REQUIRED: stable row identity — selection, editing and live updates hang off it.
Inherited from
rowMenu?
optionalrowMenu?: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
rowNumbers?
optionalrowNumbers?:boolean
Leading 1-based row-number column. Adapter chrome; core never sees it.
Inherited from
scrolling?
optionalscrolling?:ScrollingConfig
Virtual (default) or infinite scrolling.
Inherited from
searchDebounce?
optionalsearchDebounce?:number
Search box debounce, ms. React's default.
Inherited from
CreateGridConfig.searchDebounce
selection?
optionalselection?:SelectionConfig
Inherited from
showRowCount?
optionalshowRowCount?: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
sideBar?
optionalsideBar?: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?
optionalsortable?: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
sorting?
optionalsorting?:SortingConfig
Inherited from
stateStoring?
optionalstateStoring?:StateStoringConfig
Persist and restore the view (sort, filters, widths…). Core's service.
Inherited from
statusBar?
optionalstatusBar?: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?
optionalstriped?:boolean
Zebra rows. Default TRUE — the React renderer's default.
Inherited from
styledExport?
optionalstyledExport?: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?
optionalsummaries?:SummaryDef<TRow>[]
Footer totals over the filtered rows.
Inherited from
theme?
optionaltheme?:GridTheme
Inherited from
toolbar?
optionaltoolbar?:boolean
Quick-search + CSV export bar above the grid.
Inherited from
toolbarColumnChooser?
optionaltoolbarColumnChooser?:boolean
"Columns" button in the toolbar opening the visibility chooser.
Inherited from
CreateGridConfig.toolbarColumnChooser
toolbarExcel?
optionaltoolbarExcel?: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
toolbarItemsAfter?
optionaltoolbarItemsAfter?:HTMLElement[]
Extra toolbar buttons, appended after the grid's own — the React
toolbarItemsAfter prop, DOM-flavoured. Ignored without toolbar.
Inherited from
CreateGridConfig.toolbarItemsAfter
toolbarItemsBefore?
optionaltoolbarItemsBefore?:HTMLElement[]
Extra toolbar buttons, BEFORE the grid's own — React's toolbarItemsBefore.
Inherited from
CreateGridConfig.toolbarItemsBefore
toolbarPdf?
optionaltoolbarPdf?:boolean
PDF entry on the export menu — Enterprise, same gate as toolbarExcel.
Inherited from
tooltip?
optionaltooltip?: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
tree?
optionaltree?: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
virtualization?
optionalvirtualization?:VirtualizationConfig
Inherited from
CreateGridConfig.virtualization
worker?
optionalworker?:WorkerConfig