@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
animateRows?
optionalanimateRows?:boolean
Rows glide to their new place when a sort, a filter, a grouping or a data change reorders them (G-CORE-04), instead of jumping. Rows that come into view fade in. Off by default; off as well whenever the system asks for reduced motion.
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
ariaLabel?
optionalariaLabel?:string
The grid's accessible name: what a screen reader says when focus enters
it ("Orders, grid"). Without it the grid is named by gridId, which is
an identifier rather than words — give every grid on a page its own,
in the page's language. Read by both renderers.
Inherited from
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
calculatedColumns?
optionalcalculatedColumns?:boolean
Let the end user add calculated columns (G-CORE-01): "Add calculated
column…" on the column menu, Edit / Remove on the ones they added. Off by
default — the React calculatedColumns prop. A formula in the column
definitions works either way.
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.
clipboard?
optionalclipboard?:GridClipboardHooks<TRow>
Clipboard callbacks (G-CLIP-01): what a copy writes and what a paste
reads, for every copy in the grid — the selected rows, a cell range, a
cut, "Copy with headers". processCellForClipboard /
processHeaderForClipboard change the copied text, processDataFromClipboard
rewrites (or refuses, with null) the pasted table,
processCellFromClipboard the value one pasted cell writes, and
sendToClipboard takes the finished text instead of the system clipboard.
columnRenaming?
optionalcolumnRenaming?:boolean| ((columnId) =>boolean)
Let the user rename columns in the grid (G-CORE-06): "Rename column" in
the header menu, or F2 on a focused header, turns the header into a name
box — Enter keeps the name, Escape the old one, an empty box goes back to
the defined name. The name is part of the column state, so a saved layout
keeps it; columnRenamed reports each one. A function decides per
column. The grid's own columns are never offered. Default false.
columns
columns:
VanillaColumnDef<TRow>[]
Inherited from
columnSelection?
optionalcolumnSelection?:boolean
Select a whole column from its header (G-SEL-02). A click on a header
selects every row of that column as a range — copy, cut, the statistics
and charting all take it; Shift+click widens it to the columns in between,
Ctrl+click (⌘ on a Mac) adds another, and Ctrl+Space selects the focused
cell's column. Needs range selection (editing.range). Default false.
The header click no longer sorts while this is on — sort from the column menu, or focus the header and press Enter.
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
find?
optionalfind?:boolean
Find without filtering (P-FIND-01): Ctrl/⌘+F inside the grid opens a find
bar above it; matches are marked, no row is hidden, Enter / Shift+Enter
(or F3) step through them and Escape closes the bar on the current one.
From code: controller.setFindText(), findNext(), findPrevious().
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
getHeaderClassName?
optionalgetHeaderClassName?: (columnId) =>string|undefined
Extra class names per header cell, re-read on every paint (a selected column).
Parameters
columnId
string
Returns
string | undefined
Inherited from
CreateGridConfig.getHeaderClassName
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<TRow>
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
onHeaderClick?
optionalonHeaderClick?: (columnId,event) =>boolean
A click on a column header, asked before it sorts; return true to take it (the header then does not sort). Column selection uses it (G-SEL-02).
Parameters
columnId
string
event
MouseEvent
Returns
boolean
Inherited from
CreateGridConfig.onHeaderClick
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?:GridPaletteName
A classic palette, one of the 36 packaged colour schemes (with
@kanunilabs/datagrid/themes/<id>.css loaded after styles.css), or your
own scheme's name from the Theme Builder.
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
renderHeaderLabel?
optionalrenderHeaderLabel?: (columnId) =>Node|undefined
Replace a header's label when the header is built (a rename box). Undefined = the label.
Parameters
columnId
string
Returns
Node | undefined
Inherited from
CreateGridConfig.renderHeaderLabel
renderOverlay?
optionalrenderOverlay?: () =>Node|null
An absolutely-positioned layer over the viewport — 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
rowPinning?
optionalrowPinning?:boolean|RowPinningOptions<TRow>
Let the user pin rows from the row menu (G-CORE-05). true offers "Pin row
to top" / "Pin row to bottom" on every data row; isRowPinnable narrows
that. See pinRow() for what a pinned row is.
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<TRow>
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<TRow>
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. panels also takes the app's own panels —
{ id, label, render(host, controller) } (G-UI-02) — and
openSideBarPanel(id) on the returned API opens a tab from code.
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<TRow>
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?:GridThemeName
A packaged theme, or YOUR OWN theme's name: theme: 'acme' puts
kanuni-datagrid-theme-acme on the grid, the Enterprise wrapper and every
popup, so tokens declared under that class reach all of them. A custom
theme has no row-height preset — set rowHeight or density with it.
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;interactive?:boolean;showOnTruncation?:boolean;trigger?:"hover"|"focus"|"both"; }
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 — the one spelling a developer reaches for
to turn the feature off did nothing at all (audit J2, 2026-08-25).
Union Members
boolean
Type Literal
{ delay?: number; enabled?: boolean; interactive?: boolean; showOnTruncation?: boolean; trigger?: "hover" | "focus" | "both"; }
delay?
optionaldelay?:number
enabled?
optionalenabled?:boolean
interactive?
optionalinteractive?:boolean
Let the pointer move onto the tooltip, to select its text or click a link in it.
showOnTruncation?
optionalshowOnTruncation?:boolean
trigger?
optionaltrigger?:"hover"|"focus"|"both"
What opens a cell's tooltip (P-TOOL-01): 'hover' (default), 'focus'
(the cell taking keyboard focus — arrowing onto it, or tapping it on
a touch screen) or 'both'. A focus tooltip is tied to its cell with
aria-describedby; Escape closes it.
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
viewportDatasource?
optionalviewportDatasource?:ViewportDatasource<TRow>
A server that PUSHES the rows on screen (G-ROW-02, Enterprise): the grid
says which rows are visible, the source sends them — and every change to
them — whenever it likes, the way a price feed works. Takes the place of
dataSource (pass [] there). The source owns the order: the grid's sort,
filter and search reach it through setQuery. Rows cannot be grouped, and
an export holds the rows on screen. See ViewportDatasource.
Inherited from
CreateGridConfig.viewportDatasource
virtualization?
optionalvirtualization?:VirtualizationConfig
Inherited from
CreateGridConfig.virtualization
worker?
optionalworker?:WorkerConfig