Option levels
Check which configuration options take effect at the grid, column, and cell level.
Overview
You can write any option at any level. Handsontable resolves configuration through a prototype
chain, so putting an option inside columns never throws an error.
Whether the option does anything is a different question. Each option is read at one specific level, and that read decides where the option takes effect:
- An option read from the grid settings ignores column and cell values.
- An option read from a column ignores cell values.
- An option read from a cell responds to every level.
The matrix below answers that for every built-in option, so you don’t have to guess.
How to read the matrix
Each option lists the levels it takes effect at:
| Level | Set it with |
|---|---|
| Grid | The top-level settings object |
columns | The columns option |
cells | The cells function |
cell | The cell option |
Two facts explain most of the matrix:
- There is no row level. Handsontable has no
rowsoption and no row-level layer. You configure a row through thecellsfunction, matching on the row coordinate - see Set row options. - Plugin options are grid level. Every plugin reads its own setting from the grid settings, so
you cannot switch a plugin on for one column or one cell. Some plugins still read per-cell
options once they are on -
commentsis turned on for the grid, then a comment is attached to a single cell. A few plugins go further and let you override their sub-options per column, which is whycolumnSortingandmultiColumnSortingare marked forcolumnstoo. You still turn them on for the whole grid; check the Notes column before assuming a plugin can be enabled per column.
Options matrix
Search for an option by name, or filter the list down to a single level.
| Option | Grid | columns | cells | cell | Category | Notes |
|---|---|---|---|---|---|---|
activeHeaderClassName | Yes | No | No | No | Core | |
allowEmpty | Yes | Yes | Yes | Yes | Core | |
allowHtml | Yes | Yes | Yes | Yes | Core | |
allowInsertColumn | Yes | No | No | No | Core | |
allowInsertRow | Yes | No | No | No | Core | |
allowInvalid | Yes | Yes | Yes | Yes | Core | |
allowRemoveColumn | Yes | No | No | No | Core | |
allowRemoveRow | Yes | No | No | No | Core | |
ariaTags | Yes | No | No | No | Core | The switch is grid level. A per-cell value only changes that cell’s ARIA attributes. |
autoColumnSize | Yes | No | No | No | AutoColumnSize | |
autoLink | Yes | Yes | Yes | Yes | AutoLink | The plugin toggle is grid level. A column or cell false opts out, and a column or cell object overrides target, schemes, strict, inline, and className for those cells. |
autoRowHeaderSize | Yes | No | No | No | AutoRowHeaderSize | |
autoRowSize | Yes | No | No | No | AutoRowSize | |
autoWrapCol | Yes | No | No | No | Core | |
autoWrapRow | Yes | No | No | No | Core | |
bindRowsWithHeaders | Yes | No | No | No | BindRowsWithHeaders | |
cell | Yes | No | No | No | Core | |
cells | Yes | No | No | No | Core | A grid-level function that is called for every cell. |
checkedTemplate | Yes | Yes | Yes | Yes | Core | |
className | Yes | Yes | Yes | Yes | Core | |
colHeaders | Yes | No | No | No | Core | |
collapsibleColumns | Yes | No | No | No | CollapsibleColumns | |
colorScheme | Yes | No | No | No | Core | |
columnHeaderHeight | Yes | No | No | No | Core | |
columns | Yes | No | No | No | Core | |
columnSorting | Yes | Yes | No | No | ColumnSorting | Turn the plugin on at the grid level. Inside columns you can override its sub-options for one column, such as indicator and headerAction, but not enable sorting there. sortFixedRows is the exception: it is grid-level only, because the frozen rows belong to the whole table. Read from the raw columns setting, like title. |
columnSummary | Yes | No | No | No | ColumnSummary | |
colWidths | Yes | No | No | No | Core | |
commentedCellClassName | Yes | Yes | Yes | Yes | Core | |
comments | Yes | No | No | No | Comments | |
contextMenu | Yes | No | No | No | ContextMenu | |
copyable | Yes | Yes | Yes | Yes | Core | |
copyPaste | Yes | No | No | No | CopyPaste | |
currentColClassName | Yes | No | No | No | Core | |
currentHeaderClassName | Yes | No | No | No | Core | |
currentRowClassName | Yes | No | No | No | Core | |
customBorders | Yes | No | No | No | CustomBorders | |
customBordersProgressive | Yes | No | No | No | CustomBorders | |
data | Yes | Yes | No | No | Core | Sets the data set at the grid level and the column’s data property inside columns. |
dataDotNotation | Yes | No | No | No | Core | |
dataProvider | Yes | No | No | No | Core | |
dataSchema | Yes | No | No | No | Core | |
dateFormat | Yes | Yes | Yes | Yes | Core | |
dateTimeFormat | Yes | Yes | Yes | Yes | Core | |
defaultDate | Yes | Yes | Yes | Yes | Core | |
density | Yes | No | No | No | Core | |
dialog | Yes | No | No | No | Dialog | |
disableVisualSelection | Yes | Yes | Yes | Yes | Core | Row and column headers read the grid-level value only, and so does the check that gates dragging a selection with moveCells. |
dragToScroll | Yes | No | No | No | DragToScroll | |
dropdownMenu | Yes | No | No | No | DropdownMenu | |
editor | Yes | Yes | Yes | Yes | Core | |
emptyDataState | Yes | No | No | No | EmptyDataState | |
emptyValue | Yes | Yes | Yes | Yes | Core | |
enterBeginsEditing | Yes | No | No | No | Core | |
enterCommits | Yes | Yes | Yes | Yes | Core | |
enterMoves | Yes | No | No | No | Core | |
exportFile | Yes | No | No | No | ExportFile | |
fillHandle | Yes | No | No | No | Core | |
filter | Yes | Yes | Yes | Yes | Core | |
filteringCaseSensitive | Yes | Yes | Yes | Yes | Core | |
filters | Yes | Yes | No | No | Filters | Turn the plugin on at the grid level. Inside columns, only false has an effect: it hides the filter controls in that column’s dropdown menu, and the API still filters the column. The sub-options searchMode and filterFixedRows are grid-level only. |
filterSelectedItems | Yes | Yes | Yes | Yes | Core | |
filterValueComparator | Yes | Yes | No | No | Filters | Orders a column’s “Filter by value” list, which is built once per column. The comparator is read from the first listed row’s cell meta, so a cells or cell value is not a reliable way to set it. Set it at the grid level or inside columns. |
fixedColumnsLeft | Yes | No | No | No | Core | |
fixedColumnsStart | Yes | No | No | No | Core | |
fixedRowsBottom | Yes | No | No | No | Core | |
fixedRowsTop | Yes | No | No | No | Core | |
formulas | Yes | No | No | No | Formulas | |
fragmentSelection | Yes | No | No | No | Core | |
hashLength | Yes | Yes | Yes | Yes | Core | |
hashRevealDelay | Yes | Yes | Yes | Yes | Core | |
hashSymbol | Yes | Yes | Yes | Yes | Core | |
headerClassName | Yes | Yes | No | No | Core | Applies to column headers, so it stops at the column level. |
height | Yes | No | No | No | Core | |
hiddenColumns | Yes | No | No | No | HiddenColumns | |
hiddenRows | Yes | No | No | No | HiddenRows | |
imeFastEdit | Yes | No | No | No | Core | |
importFile | Yes | No | No | No | ImportFile | |
initialState | Yes | No | No | No | Core | |
injectCoreCss | Yes | No | No | No | Core | |
invalidCellClassName | Yes | Yes | Yes | Yes | Core | |
isEmptyCol | Yes | No | No | No | Core | |
isEmptyRow | Yes | No | No | No | Core | |
label | Yes | Yes | Yes | Yes | Core | |
language | Yes | No | No | No | Core | |
layout | Yes | No | No | No | Core | |
layoutDirection | Yes | No | No | No | Core | |
licenseKey | Yes | No | No | No | Core | |
loading | Yes | No | No | No | Loading | |
locale | Yes | Yes | Yes | Yes | Core | |
manualColumnFreeze | Yes | No | No | No | ManualColumnFreeze | |
manualColumnMove | Yes | No | No | No | ManualColumnMove | |
manualColumnResize | Yes | No | No | No | ManualColumnResize | |
manualRowMove | Yes | No | No | No | ManualRowMove | |
manualRowResize | Yes | No | No | No | ManualRowResize | |
maxCols | Yes | No | No | No | Core | |
maxRows | Yes | No | No | No | Core | |
maxSelections | Yes | Yes | Yes | Yes | Core | |
mergeCells | Yes | No | No | No | MergeCells | |
minCols | Yes | No | No | No | Core | |
minRowHeights | Yes | No | No | No | Core | |
minRows | Yes | No | No | No | Core | |
minSpareCols | Yes | No | No | No | Core | |
minSpareRows | Yes | No | No | No | Core | |
moveCells | Yes | No | No | No | Core | |
multiColumnSorting | Yes | Yes | No | No | MultiColumnSorting | Turn the plugin on at the grid level. Inside columns you can override its sub-options for one column, such as indicator and headerAction, but not enable sorting there. sortFixedRows is the exception: it is grid-level only, because the frozen rows belong to the whole table. Read from the raw columns setting, like title. |
navigableHeaders | Yes | No | No | No | Core | |
nestedHeaders | Yes | No | No | No | NestedHeaders | |
nestedRows | Yes | No | No | No | NestedRows | |
notification | Yes | No | No | No | Notification | |
noWordWrapClassName | Yes | Yes | Yes | Yes | Core | |
numericFormat | Yes | Yes | Yes | Yes | Core | |
observeDOMVisibility | Yes | No | No | No | Core | |
outsideClickDeselects | Yes | No | No | No | Core | |
pagination | Yes | No | No | No | Pagination | |
parsePastedValue | Yes | Yes | Yes | Yes | CopyPaste | |
placeholder | Yes | Yes | Yes | Yes | Core | |
placeholderCellClassName | Yes | Yes | Yes | Yes | Core | |
preserveNumericLiteral | Yes | Yes | Yes | Yes | Core | |
preserveTextValue | Yes | Yes | Yes | Yes | Formulas | |
preventOverflow | Yes | No | No | No | Core | |
readOnly | Yes | Yes | Yes | Yes | Core | |
readOnlyCellClassName | Yes | Yes | Yes | Yes | Core | |
renderAllColumns | Yes | No | No | No | Core | |
renderAllRows | Yes | No | No | No | Core | |
renderer | Yes | Yes | Yes | Yes | Core | |
renderMode | Yes | Yes | Yes | Yes | Core | |
rowHeaders | Yes | No | No | No | Core | |
rowHeaderWidth | Yes | No | No | No | Core | |
rowHeights | Yes | No | No | No | Core | |
sanitizer | Yes | No | No | No | Core | |
search | Yes | Yes | Yes | Yes | Search | The plugin toggle is grid level. queryMethod and callback resolve per cell. |
searchInput | Yes | Yes | Yes | Yes | Core | |
selectionHandles | Yes | No | No | No | Core | |
selectionMode | Yes | No | No | No | Core | |
selectOptions | Yes | Yes | Yes | Yes | Core | |
sheetsBar | Yes | No | No | No | SheetsBar | |
skipColumnOnPaste | Yes | Yes | Yes | Yes | Core | |
skipRowOnPaste | Yes | Yes | Yes | Yes | Core | |
sortByRelevance | Yes | Yes | Yes | Yes | Core | |
source | Yes | Yes | Yes | Yes | Core | |
sourceDataValidator | Yes | Yes | Yes | Yes | Core | |
sourceDataWarningMessage | Yes | Yes | Yes | Yes | Core | |
sourceSortFunction | Yes | Yes | Yes | Yes | Core | |
startCols | Yes | No | No | No | Core | |
startRows | Yes | No | No | No | Core | |
stretchH | Yes | No | No | No | Core | |
strict | Yes | Yes | Yes | Yes | Core | |
tableClassName | Yes | No | No | No | Core | |
tabMoves | Yes | No | No | No | Core | |
tabNavigation | Yes | No | No | No | Core | |
textEllipsis | Yes | Yes | Yes | Yes | Core | |
textExtractor | Yes | No | No | No | Core | |
theme | Yes | No | No | No | Core | |
themeName | Yes | No | No | No | Core | |
timeFormat | Yes | Yes | Yes | Yes | Core | |
title | No | Yes | No | No | Core | Read from the raw columns setting rather than the meta chain, so a cells function cannot set it. |
trimDropdown | Yes | Yes | Yes | Yes | Core | |
trimRows | Yes | No | No | No | TrimRows | |
trimWhitespace | Yes | Yes | Yes | Yes | Core | |
type | Yes | Yes | Yes | Yes | Core | |
uncheckedTemplate | Yes | Yes | Yes | Yes | Core | |
undo | Yes | No | No | No | UndoRedo | |
validator | Yes | Yes | Yes | Yes | Core | |
valueFormatter | Yes | Yes | Yes | Yes | Core | |
valueGetter | Yes | Yes | Yes | Yes | Core | |
valueParser | Yes | Yes | Yes | Yes | Core | |
valueSetter | Yes | Yes | Yes | Yes | Core | |
viewportColumnRenderingOffset | Yes | No | No | No | Core | |
viewportColumnRenderingThreshold | Yes | No | No | No | Core | |
viewportRowRenderingOffset | Yes | No | No | No | Core | |
viewportRowRenderingThreshold | Yes | No | No | No | Core | |
visibleRows | Yes | Yes | Yes | Yes | Core | |
width | Yes | Yes | Yes | Yes | Core | Sets the grid width at the grid level and the column width inside columns. Only row 0 is read, so a cells or cell value must target row 0. |
wordWrap | Yes | Yes | Yes | Yes | Core |
Options that change meaning by level
Two options mean different things depending on where you set them. Handsontable clears them on the column layer on purpose, so the grid value never leaks into a column.
| Option | At the grid level | Inside columns |
|---|---|---|
width | The width of the whole grid | The width of that column |
data | The grid’s data set | The property that feeds that column |
width has one more catch. Handsontable reads the column width from
row 0 only. So a cells function changes a column’s width only when it
returns width for row 0, and a cell entry has to name row 0.
Options that behave differently per level
For these options a single mark would mislead you:
ariaTags- the switch is grid level. A per-cell value only changes that cell’s ARIA attributes.search- the plugin toggle is grid level, butqueryMethodandcallbackresolve per cell.disableVisualSelection- cells respond to every level, but row and column headers read the grid-level value only.