Files
railwaysystem/RuoYi-Vue/ruoyi-ui/node_modules2/handsontable/pluginHooks.js
T

2766 lines
111 KiB
JavaScript
Raw Normal View History

2026-09-10 15:40:10 +08:00
"use strict";
exports.__esModule = true;
require("core-js/modules/es.array.push.js");
var _array = require("./helpers/array");
var _object = require("./helpers/object");
var _string = require("./helpers/string");
var _console = require("./helpers/console");
var _templateLiteralTag = require("./helpers/templateLiteralTag");
var _function = require("./helpers/function");
/* eslint-disable jsdoc/require-description-complete-sentence */
/**
* @description
*
* ::: only-for javascript
* Handsontable events are the common interface that function in 2 ways: as __callbacks__ and as __hooks__.
* :::
*
* ::: only-for react
* This page lists all the **Handsontable hooks** – callbacks that let you react before or after an action occurs.
*
* Read more on the [Events and hooks](@/guides/getting-started/events-and-hooks.md) page.
* :::
*
* @example
*
* ::: only-for javascript
* ```js
* // using events as callbacks
* ...
* const hot1 = new Handsontable(document.getElementById('example1'), {
* afterChange: function(changes, source) {
* $.ajax({
* url: "save.php',
* data: change
* });
* }
* });
* ...
* ```
* :::
*
* ::: only-for react
* ```jsx
* <HotTable
* afterChange={(changes, source) => {
* fetch('save.php', {
* method: 'POST',
* headers: {
* 'Accept': 'application/json',
* 'Content-Type': 'application/json'
* },
* body: JSON.stringify(changes)
* });
* }}
* />
* :::
*
* ::: only-for javascript
* ```js
* // using events as plugin hooks
* ...
* const hot1 = new Handsontable(document.getElementById('example1'), {
* myPlugin: true
* });
*
* const hot2 = new Handsontable(document.getElementById('example2'), {
* myPlugin: false
* });
*
* // global hook
* Handsontable.hooks.add('afterChange', function() {
* // Fired twice - for hot1 and hot2
* if (this.getSettings().myPlugin) {
* // function body - will only run for hot1
* }
* });
*
* // local hook (has same effect as a callback)
* hot2.addHook('afterChange', function() {
* // function body - will only run in #example2
* });
* ```
* :::
*
* ::: only-for react
* ```jsx
* const hotRef1 = useRef(null);
* const hotRef2 = useRef(null);
*
* // Using events as plugin hooks:
* ...
*
* <HotTable
* ref={hotRef1}
* myPlugin={true}
* });
*
* <HotTable
* ref={hotRef2}
* myPlugin={false}
* });
*
* ...
*
* const hot2 = hotRef2.current.hotInstance;
* // local hook (has same effect as a callback)
* hot2.addHook('afterChange', function() {
* // function body - will only run in #example2
* });
*
* // global hook
* Handsontable.hooks.add('afterChange', function() {
* // Fired twice - for hot1 and hot2
* if (this.getSettings().myPlugin) {
* // function body - will only run for first instance
* }
* });
* :::
* ...
*/ // @TODO: Move plugin description hooks to plugin?
const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-sentence */
/**
* Fired after resetting a cell's meta. This happens when the {@link Core#updateSettings} method is called.
*
* @event Hooks#afterCellMetaReset
*/
'afterCellMetaReset',
/**
* Fired after one or more cells has been changed. The changes are triggered in any situation when the
* value is entered using an editor or changed using API (e.q setDataAtCell).
*
* __Note:__ For performance reasons, the `changes` array is null for `"loadData"` source.
*
* @event Hooks#afterChange
* @param {Array[]} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`. `row` is a visual row index.
* @param {string} [source] String that identifies source of hook call ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @example
* ::: only-for javascript
* ```js
* new Handsontable(element, {
* afterChange: (changes) => {
* changes?.forEach(([row, prop, oldValue, newValue]) => {
* // Some logic...
* });
* }
* })
* ```
* :::
*
* ::: only-for react
* ```jsx
* <HotTable
* afterChange={(changes, source) => {
* changes?.forEach(([row, prop, oldValue, newValue]) => {
* // Some logic...
* });
* }}
* />
* ```
* :::
*/
'afterChange',
/**
* Fired each time user opens {@link ContextMenu} and after setting up the Context Menu's default options. These options are a collection
* which user can select by setting an array of keys or an array of objects in {@link Options#contextMenu} option.
*
* @event Hooks#afterContextMenuDefaultOptions
* @param {Array} predefinedItems An array of objects containing information about the pre-defined Context Menu items.
*/
'afterContextMenuDefaultOptions',
/**
* Fired each time user opens {@link ContextMenu} plugin before setting up the Context Menu's items but after filtering these options by
* user (`contextMenu` option). This hook can by helpful to determine if user use specified menu item or to set up
* one of the menu item to by always visible.
*
* @event Hooks#beforeContextMenuSetItems
* @param {object[]} menuItems An array of objects containing information about to generated Context Menu items.
*/
'beforeContextMenuSetItems',
/**
* Fired by {@link DropdownMenu} plugin after setting up the Dropdown Menu's default options. These options are a
* collection which user can select by setting an array of keys or an array of objects in {@link Options#dropdownMenu}
* option.
*
* @event Hooks#afterDropdownMenuDefaultOptions
* @param {object[]} predefinedItems An array of objects containing information about the pre-defined Context Menu items.
*/
'afterDropdownMenuDefaultOptions',
/**
* Fired by {@link DropdownMenu} plugin before setting up the Dropdown Menu's items but after filtering these options
* by user (`dropdownMenu` option). This hook can by helpful to determine if user use specified menu item or to set
* up one of the menu item to by always visible.
*
* @event Hooks#beforeDropdownMenuSetItems
* @param {object[]} menuItems An array of objects containing information about to generated Dropdown Menu items.
*/
'beforeDropdownMenuSetItems',
/**
* Fired by {@link ContextMenu} plugin after hiding the Context Menu. This hook is fired when {@link Options#contextMenu}
* option is enabled.
*
* @event Hooks#afterContextMenuHide
* @param {object} context The Context Menu plugin instance.
*/
'afterContextMenuHide',
/**
* Fired by {@link ContextMenu} plugin before opening the Context Menu. This hook is fired when {@link Options#contextMenu}
* option is enabled.
*
* @event Hooks#beforeContextMenuShow
* @param {object} context The Context Menu instance.
*/
'beforeContextMenuShow',
/**
* Fired by {@link ContextMenu} plugin after opening the Context Menu. This hook is fired when {@link Options#contextMenu}
* option is enabled.
*
* @event Hooks#afterContextMenuShow
* @param {object} context The Context Menu plugin instance.
*/
'afterContextMenuShow',
/**
* Fired by {@link CopyPaste} plugin after reaching the copy limit while copying data. This hook is fired when
* {@link Options#copyPaste} option is enabled.
*
* @event Hooks#afterCopyLimit
* @param {number} selectedRows Count of selected copyable rows.
* @param {number} selectedColumns Count of selected copyable columns.
* @param {number} copyRowsLimit Current copy rows limit.
* @param {number} copyColumnsLimit Current copy columns limit.
*/
'afterCopyLimit',
/**
* Fired before created a new column.
*
* @event Hooks#beforeCreateCol
* @param {number} index Represents the visual index of first newly created column in the data source array.
* @param {number} amount Number of newly created columns in the data source array.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {*} If `false` then creating columns is cancelled.
* @example
* ::: only-for javascript
* ```js
* // Return `false` to cancel column inserting.
* new Handsontable(element, {
* beforeCreateCol: function(data, coords) {
* return false;
* }
* });
* ```
* :::
*
* ::: only-for react
* ```jsx
* // Return `false` to cancel column inserting.
* <HotTable
* beforeCreateCol={(data, coords) => {
* return false;
* }}
* />
* ```
* :::
*/
'beforeCreateCol',
/**
* Fired after the order of columns has changed.
* This hook is fired by changing column indexes of any type supported by the {@link IndexMapper}.
*
* @event Hooks#afterColumnSequenceChange
* @param {'init'|'remove'|'insert'|'move'|'update'} [source] A string that indicates what caused the change to the order of columns.
*/
'afterColumnSequenceChange',
/**
* Fired after created a new column.
*
* @event Hooks#afterCreateCol
* @param {number} index Represents the visual index of first newly created column in the data source.
* @param {number} amount Number of newly created columns in the data source.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'afterCreateCol',
/**
* Fired before created a new row.
*
* @event Hooks#beforeCreateRow
* @param {number} index Represents the visual index of first newly created row in the data source array.
* @param {number} amount Number of newly created rows in the data source array.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeCreateRow',
/**
* Fired after created a new row.
*
* @event Hooks#afterCreateRow
* @param {number} index Represents the visual index of first newly created row in the data source array.
* @param {number} amount Number of newly created rows in the data source array.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'afterCreateRow',
/**
* Fired after all selected cells are deselected.
*
* @event Hooks#afterDeselect
*/
'afterDeselect',
/**
* Fired after destroying the Handsontable instance.
*
* @event Hooks#afterDestroy
*/
'afterDestroy',
/**
* Hook fired after keydown event is handled.
*
* @event Hooks#afterDocumentKeyDown
* @param {Event} event A native `keydown` event object.
*/
'afterDocumentKeyDown',
/**
* Fired inside the Walkontable's selection `draw` method. Can be used to add additional class names to cells, depending on the current selection.
*
* @event Hooks#afterDrawSelection
* @param {number} currentRow Row index of the currently processed cell.
* @param {number} currentColumn Column index of the currently cell.
* @param {number[]} cornersOfSelection Array of the current selection in a form of `[startRow, startColumn, endRow, endColumn]`.
* @param {number|undefined} layerLevel Number indicating which layer of selection is currently processed.
* @since 0.38.1
* @returns {string|undefined} Can return a `String`, which will act as an additional `className` to be added to the currently processed cell.
*/
'afterDrawSelection',
/**
* Fired inside the Walkontable's `refreshSelections` method. Can be used to remove additional class names from all cells in the table.
*
* @event Hooks#beforeRemoveCellClassNames
* @since 0.38.1
* @returns {string[]|undefined} Can return an `Array` of `String`s. Each of these strings will act like class names to be removed from all the cells in the table.
*/
'beforeRemoveCellClassNames',
/**
* Fired after getting the cell settings.
*
* @event Hooks#afterGetCellMeta
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {object} cellProperties Object containing the cell properties.
*/
'afterGetCellMeta',
/**
* Fired after retrieving information about a column header and appending it to the table header.
*
* @event Hooks#afterGetColHeader
* @param {number} column Visual column index.
* @param {HTMLTableCellElement} TH Header's TH element.
* @param {number} [headerLevel=0] (Since 12.2.0) Header level index. Accepts positive (0 to n)
* and negative (-1 to -n) values. For positive values, 0 points to the
* topmost header. For negative values, -1 points to the bottom-most
* header (the header closest to the cells).
*/
'afterGetColHeader',
/**
* Fired after retrieving information about a row header and appending it to the table header.
*
* @event Hooks#afterGetRowHeader
* @param {number} row Visual row index.
* @param {HTMLTableCellElement} TH Header's TH element.
*/
'afterGetRowHeader',
/**
* Fired after the Handsontable instance is initiated.
*
* @event Hooks#afterInit
*/
'afterInit',
/**
* Fired after Handsontable's [`data`](@/api/options.md#data)
* gets modified by the [`loadData()`](@/api/core.md#loaddata) method
* or the [`updateSettings()`](@/api/core.md#updatesettings) method.
*
* Read more:
* - [Binding to data](@/guides/getting-started/binding-to-data.md)
* - [Saving data](@/guides/getting-started/saving-data.md)
*
* @event Hooks#afterLoadData
* @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data.md#array-of-objects), that contains Handsontable's data
* @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)
* @param {string} source The source of the call
*/
'afterLoadData',
/**
* Fired after the [`updateData()`](@/api/core.md#updatedata) method
* modifies Handsontable's [`data`](@/api/options.md#data).
*
* Read more:
* - [Binding to data](@/guides/getting-started/binding-to-data.md)
* - [Saving data](@/guides/getting-started/saving-data.md)
*
* @event Hooks#afterUpdateData
* @since 11.1.0
* @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data.md#array-of-objects), that contains Handsontable's data
* @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)
* @param {string} source The source of the call
*/
'afterUpdateData',
/**
* Fired after a scroll event, which is identified as a momentum scroll (e.g. On an iPad).
*
* @event Hooks#afterMomentumScroll
*/
'afterMomentumScroll',
/**
* Fired after a `mousedown` event is triggered on the cell corner (the drag handle).
*
* @event Hooks#afterOnCellCornerMouseDown
* @param {Event} event `mousedown` event object.
*/
'afterOnCellCornerMouseDown',
/**
* Fired after a `dblclick` event is triggered on the cell corner (the drag handle).
*
* @event Hooks#afterOnCellCornerDblClick
* @param {Event} event `dblclick` event object.
*/
'afterOnCellCornerDblClick',
/**
* Fired after clicking on a cell or row/column header. In case the row/column header was clicked, the coordinate
* indexes are negative.
*
* For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseDown` called
* with coordinates `{row: 0, col: -1}`.
*
* @event Hooks#afterOnCellMouseDown
* @param {Event} event `mousedown` event object.
* @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.
* @param {HTMLTableCellElement} TD Cell's TD (or TH) element.
*/
'afterOnCellMouseDown',
/**
* Fired after clicking on a cell or row/column header. In case the row/column header was clicked, the coordinate
* indexes are negative.
*
* For example clicking on the row header of cell (0, 0) results with `afterOnCellMouseUp` called
* with coordinates `{row: 0, col: -1}`.
*
* @event Hooks#afterOnCellMouseUp
* @param {Event} event `mouseup` event object.
* @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.
* @param {HTMLTableCellElement} TD Cell's TD (or TH) element.
*/
'afterOnCellMouseUp',
/**
* Fired after clicking right mouse button on a cell or row/column header.
*
* For example clicking on the row header of cell (0, 0) results with `afterOnCellContextMenu` called
* with coordinates `{row: 0, col: -1}`.
*
* @event Hooks#afterOnCellContextMenu
* @since 4.1.0
* @param {Event} event `contextmenu` event object.
* @param {CellCoords} coords Coordinates object containing the visual row and visual column indexes of the clicked cell.
* @param {HTMLTableCellElement} TD Cell's TD (or TH) element.
*/
'afterOnCellContextMenu',
/**
* Fired after hovering a cell or row/column header with the mouse cursor. In case the row/column header was
* hovered, the index is negative.
*
* For example, hovering over the row header of cell (0, 0) results with `afterOnCellMouseOver` called
* with coords `{row: 0, col: -1}`.
*
* @event Hooks#afterOnCellMouseOver
* @param {Event} event `mouseover` event object.
* @param {CellCoords} coords Hovered cell's visual coordinate object.
* @param {HTMLTableCellElement} TD Cell's TD (or TH) element.
*/
'afterOnCellMouseOver',
/**
* Fired after leaving a cell or row/column header with the mouse cursor.
*
* @event Hooks#afterOnCellMouseOut
* @param {Event} event `mouseout` event object.
* @param {CellCoords} coords Leaved cell's visual coordinate object.
* @param {HTMLTableCellElement} TD Cell's TD (or TH) element.
*/
'afterOnCellMouseOut',
/**
* Fired after one or more columns are removed.
*
* @event Hooks#afterRemoveCol
* @param {number} index Visual index of starter column.
* @param {number} amount An amount of removed columns.
* @param {number[]} physicalColumns An array of physical columns removed from the data source.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'afterRemoveCol',
/**
* Fired after one or more rows are removed.
*
* @event Hooks#afterRemoveRow
* @param {number} index Visual index of starter row.
* @param {number} amount An amount of removed rows.
* @param {number[]} physicalRows An array of physical rows removed from the data source.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'afterRemoveRow',
/**
* Fired before starting rendering the cell.
*
* @event Hooks#beforeRenderer
* @param {HTMLTableCellElement} TD Currently rendered cell's TD element.
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {string|number} prop Column property name or a column index, if datasource is an array of arrays.
* @param {*} value Value of the rendered cell.
* @param {object} cellProperties Object containing the cell's properties.
*/
'beforeRenderer',
/**
* Fired after finishing rendering the cell (after the renderer finishes).
*
* @event Hooks#afterRenderer
* @param {HTMLTableCellElement} TD Currently rendered cell's TD element.
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {string|number} prop Column property name or a column index, if datasource is an array of arrays.
* @param {*} value Value of the rendered cell.
* @param {object} cellProperties Object containing the cell's properties.
*/
'afterRenderer',
/**
* Fired after the order of rows has changed.
* This hook is fired by changing row indexes of any type supported by the {@link IndexMapper}.
*
* @event Hooks#afterRowSequenceChange
* @param {'init'|'remove'|'insert'|'move'|'update'} [source] A string that indicates what caused the change to the order of rows.
*/
'afterRowSequenceChange',
/**
* Fired after the horizontal scroll event.
*
* @event Hooks#afterScrollHorizontally
*/
'afterScrollHorizontally',
/**
* Fired after the vertical scroll event.
*
* @event Hooks#afterScrollVertically
*/
'afterScrollVertically',
/**
* Fired after one or more cells are selected (e.g. During mouse move).
*
* @event Hooks#afterSelection
* @param {number} row Selection start visual row index.
* @param {number} column Selection start visual column index.
* @param {number} row2 Selection end visual row index.
* @param {number} column2 Selection end visual column index.
* @param {object} preventScrolling A reference to the observable object with the `value` property.
* Property `preventScrolling.value` expects a boolean value that
* Handsontable uses to control scroll behavior after selection.
* @param {object} preventScrolling Object with `value` property where its value change will be observed.
* @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.
* @example
* ::: only-for javascript
* ```js
* new Handsontable(element, {
* afterSelection: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => {
* // If set to `false` (default): when cell selection is outside the viewport,
* // Handsontable scrolls the viewport to cell selection's end corner.
* // If set to `true`: when cell selection is outside the viewport,
* // Handsontable doesn't scroll to cell selection's end corner.
* preventScrolling.value = true;
* }
* })
* ```
* :::
*
* ::: only-for react
* ```jsx
* <HotTable
* afterSelection={(row, column, row2, column2, preventScrolling, selectionLayerLevel) => {
* // If set to `false` (default): when cell selection is outside the viewport,
* // Handsontable scrolls the viewport to cell selection's end corner.
* // If set to `true`: when cell selection is outside the viewport,
* // Handsontable doesn't scroll to cell selection's end corner.
* preventScrolling.value = true;
* }}
* />
* ```
* :::
*/
'afterSelection',
/**
* Fired after one or more cells are selected.
*
* The `prop` and `prop2` arguments represent the source object property name instead of the column number.
*
* @event Hooks#afterSelectionByProp
* @param {number} row Selection start visual row index.
* @param {string} prop Selection start data source object property name.
* @param {number} row2 Selection end visual row index.
* @param {string} prop2 Selection end data source object property name.
* @param {object} preventScrolling Object with `value` property where its value change will be observed.
* @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.
* @example
* ```js
* ::: only-for javascript
* new Handsontable(element, {
* afterSelectionByProp: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => {
* // setting if prevent scrolling after selection
* preventScrolling.value = true;
* }
* })
* ```
* :::
*
* ::: only-for react
* ```jsx
* <HotTable
* afterSelectionByProp={(row, column, row2, column2, preventScrolling, selectionLayerLevel) => {
* // setting if prevent scrolling after selection
* preventScrolling.value = true;
* }}
* />
* ```
* :::
*/
'afterSelectionByProp',
/**
* Fired after one or more cells are selected (e.g. On mouse up).
*
* @event Hooks#afterSelectionEnd
* @param {number} row Selection start visual row index.
* @param {number} column Selection start visual column index.
* @param {number} row2 Selection end visual row index.
* @param {number} column2 Selection end visual column index.
* @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.
*/
'afterSelectionEnd',
/**
* Fired after one or more cells are selected (e.g. On mouse up).
*
* The `prop` and `prop2` arguments represent the source object property name instead of the column number.
*
* @event Hooks#afterSelectionEndByProp
* @param {number} row Selection start visual row index.
* @param {string} prop Selection start data source object property index.
* @param {number} row2 Selection end visual row index.
* @param {string} prop2 Selection end data source object property index.
* @param {number} selectionLayerLevel The number which indicates what selection layer is currently modified.
*/
'afterSelectionEndByProp',
/**
* Fired after cell meta is changed.
*
* @event Hooks#afterSetCellMeta
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {string} key The updated meta key.
* @param {*} value The updated meta value.
*/
'afterSetCellMeta',
/**
* Fired after cell meta is removed.
*
* @event Hooks#afterRemoveCellMeta
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {string} key The removed meta key.
* @param {*} value Value which was under removed key of cell meta.
*/
'afterRemoveCellMeta',
/**
* Fired after cell data was changed.
*
* @event Hooks#afterSetDataAtCell
* @param {Array} changes An array of changes in format `[[row, column, oldValue, value], ...]`.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'afterSetDataAtCell',
/**
* Fired after cell data was changed.
* Called only when `setDataAtRowProp` was executed.
*
* @event Hooks#afterSetDataAtRowProp
* @param {Array} changes An array of changes in format `[[row, prop, oldValue, value], ...]`.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'afterSetDataAtRowProp',
/**
* Fired after cell source data was changed.
*
* @event Hooks#afterSetSourceDataAtCell
* @since 8.0.0
* @param {Array} changes An array of changes in format `[[row, column, oldValue, value], ...]`.
* @param {string} [source] String that identifies source of hook call.
*/
'afterSetSourceDataAtCell',
/**
* Fired after calling the `updateSettings` method.
*
* @event Hooks#afterUpdateSettings
* @param {object} newSettings New settings object.
*/
'afterUpdateSettings',
/**
* @description
* A plugin hook executed after validator function, only if validator function is defined.
* Validation result is the first parameter. This can be used to determinate if validation passed successfully or not.
*
* __Returning false from the callback will mark the cell as invalid__.
*
* @event Hooks#afterValidate
* @param {boolean} isValid `true` if valid, `false` if not.
* @param {*} value The value in question.
* @param {number} row Visual row index.
* @param {string|number} prop Property name / visual column index.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {undefined | boolean} If `false` the cell will be marked as invalid, `true` otherwise.
*/
'afterValidate',
/**
* Fired before successful change of language (when proper language code was set).
*
* @event Hooks#beforeLanguageChange
* @since 0.35.0
* @param {string} languageCode New language code.
*/
'beforeLanguageChange',
/**
* Fired after successful change of language (when proper language code was set).
*
* @event Hooks#afterLanguageChange
* @since 0.35.0
* @param {string} languageCode New language code.
*/
'afterLanguageChange',
/**
* Fired by {@link Autofill} plugin before populating the data in the autofill feature. This hook is fired when
* {@link Options#fillHandle} option is enabled.
*
* @event Hooks#beforeAutofill
* @param {Array[]} selectionData Data the autofill operation will start from.
* @param {CellRange} sourceRange The range values will be filled from.
* @param {CellRange} targetRange The range new values will be filled into.
* @param {string} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.
*
* @returns {boolean|Array[]} If false, the operation is cancelled. If array of arrays, the returned data
* will be passed into `populateFromArray` instead of the default autofill
* algorithm's result.
*/
'beforeAutofill',
/**
* Fired by {@link Autofill} plugin after populating the data in the autofill feature. This hook is fired when
* {@link Options#fillHandle} option is enabled.
*
* @event Hooks#afterAutofill
* @since 8.0.0
* @param {Array[]} fillData The data that was used to fill the `targetRange`. If `beforeAutofill` was used
* and returned `[[]]`, this will be the same object that was returned from `beforeAutofill`.
* @param {CellRange} sourceRange The range values will be filled from.
* @param {CellRange} targetRange The range new values will be filled into.
* @param {string} direction Declares the direction of the autofill. Possible values: `up`, `down`, `left`, `right`.
*/
'afterAutofill',
/**
* Fired before aligning the cell contents.
*
* @event Hooks#beforeCellAlignment
* @param {object} stateBefore An object with class names defining the cell alignment.
* @param {CellRange[]} range An array of CellRange coordinates where the alignment will be applied.
* @param {string} type Type of the alignment - either `horizontal` or `vertical`.
* @param {string} alignmentClass String defining the alignment class added to the cell.
* Possible values:
* * `htLeft`
* * `htCenter`
* * `htRight`
* * `htJustify`
* * `htTop`
* * `htMiddle`
* * `htBottom`.
*/
'beforeCellAlignment',
/**
* Fired before one or more cells are changed.
*
* Use this hook to silently alter the user's changes before Handsontable re-renders.
*
* To ignore the user's changes, use a nullified array or return `false`.
*
* @event Hooks#beforeChange
* @param {Array[]} changes 2D array containing information about each of the edited cells `[[row, prop, oldVal, newVal], ...]`. `row` is a visual row index.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {undefined | boolean} If `false` all changes were cancelled, `true` otherwise.
* @example
* ::: only-for javascript
* ```js
* // to alter a single change, overwrite the value with `changes[i][3]`
* new Handsontable(element, {
* beforeChange: (changes, source) => {
* // [[row, prop, oldVal, newVal], ...]
* changes[0][3] = 10;
* }
* });
*
* // to ignore a single change, set `changes[i]` to `null`
* // or remove `changes[i]` from the array, by using `changes.splice(i, 1)`
* new Handsontable(element, {
* beforeChange: (changes, source) => {
* // [[row, prop, oldVal, newVal], ...]
* changes[0] = null;
* }
* });
*
* // to ignore all changes, return `false`
* // or set the array's length to 0, by using `changes.length = 0`
* new Handsontable(element, {
* beforeChange: (changes, source) => {
* // [[row, prop, oldVal, newVal], ...]
* return false;
* }
* });
* ```
* :::
*
* ::: only-for react
* ```jsx
* // to alter a single change, overwrite the desired value with `changes[i][3]`
* <HotTable
* beforeChange={(changes, source) => {
* // [[row, prop, oldVal, newVal], ...]
* changes[0][3] = 10;
* }}
* />
*
* // to ignore a single change, set `changes[i]` to `null`
* // or remove `changes[i]` from the array, by using changes.splice(i, 1).
* <HotTable
* beforeChange={(changes, source) => {
* // [[row, prop, oldVal, newVal], ...]
* changes[0] = null;
* }}
* />
*
* // to ignore all changes, return `false`
* // or set the array's length to 0 (`changes.length = 0`)
* <HotTable
* beforeChange={(changes, source) => {
* // [[row, prop, oldVal, newVal], ...]
* return false;
* }}
* />
* ```
* :::
*/
'beforeChange',
/**
* Fired right before rendering the changes.
*
* @event Hooks#beforeChangeRender
* @param {Array[]} changes Array in form of `[row, prop, oldValue, newValue]`.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'beforeChangeRender',
/**
* Fired before drawing the borders.
*
* @event Hooks#beforeDrawBorders
* @param {Array} corners Array specifying the current selection borders.
* @param {string} borderClassName Specifies the border class name.
*/
'beforeDrawBorders',
/**
* Fired before getting cell settings.
*
* @event Hooks#beforeGetCellMeta
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {object} cellProperties Object containing the cell's properties.
*/
'beforeGetCellMeta',
/**
* Fired before cell meta is removed.
*
* @event Hooks#beforeRemoveCellMeta
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {string} key The removed meta key.
* @param {*} value Value which is under removed key of cell meta.
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeRemoveCellMeta',
/**
* Fired before the Handsontable instance is initiated.
*
* @event Hooks#beforeInit
*/
'beforeInit',
/**
* Fired before the Walkontable instance is initiated.
*
* @event Hooks#beforeInitWalkontable
* @param {object} walkontableConfig Walkontable configuration object.
*/
'beforeInitWalkontable',
/**
* Fired before Handsontable's [`data`](@/api/options.md#data)
* gets modified by the [`loadData()`](@/api/core.md#loaddata) method
* or the [`updateSettings()`](@/api/core.md#updatesettings) method.
*
* Read more:
* - [Binding to data](@/guides/getting-started/binding-to-data.md)
* - [Saving data](@/guides/getting-started/saving-data.md)
*
* @event Hooks#beforeLoadData
* @since 8.0.0
* @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data.md#array-of-objects), that contains Handsontable's data
* @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)
* @param {string} source The source of the call
* @returns {Array} The returned array will be used as Handsontable's new dataset.
*/
'beforeLoadData',
/**
* Fired before the [`updateData()`](@/api/core.md#updatedata) method
* modifies Handsontable's [`data`](@/api/options.md#data).
*
* Read more:
* - [Binding to data](@/guides/getting-started/binding-to-data.md)
* - [Saving data](@/guides/getting-started/saving-data.md)
*
* @event Hooks#beforeUpdateData
* @since 11.1.0
* @param {Array} sourceData An [array of arrays](@/guides/getting-started/binding-to-data.md#array-of-arrays), or an [array of objects](@/guides/getting-started/binding-to-data.md#array-of-objects), that contains Handsontable's data
* @param {boolean} initialLoad A flag that indicates whether the data was loaded at Handsontable's initialization (`true`) or later (`false`)
* @param {string} source The source of the call
* @returns {Array} The returned array will be used as Handsontable's new dataset.
*/
'beforeUpdateData',
/**
* Hook fired before keydown event is handled. It can be used to stop default key bindings.
*
* __Note__: To prevent default behavior you need to call `false` in your `beforeKeyDown` handler.
*
* @event Hooks#beforeKeyDown
* @param {Event} event Original DOM event.
*/
'beforeKeyDown',
/**
* Fired after the user clicked a cell, but before all the calculations related with it.
*
* @event Hooks#beforeOnCellMouseDown
* @param {Event} event The `mousedown` event object.
* @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.
* @param {HTMLTableCellElement} TD TD element.
* @param {object} controller An object with properties `row`, `column` and `cell`. Each property contains
* a boolean value that allows or disallows changing the selection for that particular area.
*/
'beforeOnCellMouseDown',
/**
* Fired after the user clicked a cell.
*
* @event Hooks#beforeOnCellMouseUp
* @param {Event} event The `mouseup` event object.
* @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.
* @param {HTMLTableCellElement} TD TD element.
*/
'beforeOnCellMouseUp',
/**
* Fired after the user clicked a cell, but before all the calculations related with it.
*
* @event Hooks#beforeOnCellContextMenu
* @since 4.1.0
* @param {Event} event The `contextmenu` event object.
* @param {CellCoords} coords Cell coords object containing the visual coordinates of the clicked cell.
* @param {HTMLTableCellElement} TD TD element.
*/
'beforeOnCellContextMenu',
/**
* Fired after the user moved cursor over a cell, but before all the calculations related with it.
*
* @event Hooks#beforeOnCellMouseOver
* @param {Event} event The `mouseover` event object.
* @param {CellCoords} coords CellCoords object containing the visual coordinates of the clicked cell.
* @param {HTMLTableCellElement} TD TD element.
* @param {object} controller An object with properties `row`, `column` and `cell`. Each property contains
* a boolean value that allows or disallows changing the selection for that particular area.
*/
'beforeOnCellMouseOver',
/**
* Fired after the user moved cursor out from a cell, but before all the calculations related with it.
*
* @event Hooks#beforeOnCellMouseOut
* @param {Event} event The `mouseout` event object.
* @param {CellCoords} coords CellCoords object containing the visual coordinates of the leaved cell.
* @param {HTMLTableCellElement} TD TD element.
*/
'beforeOnCellMouseOut',
/**
* Fired before one or more columns are about to be removed.
*
* @event Hooks#beforeRemoveCol
* @param {number} index Visual index of starter column.
* @param {number} amount Amount of columns to be removed.
* @param {number[]} physicalColumns An array of physical columns removed from the data source.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeRemoveCol',
/**
* Fired when one or more rows are about to be removed.
*
* @event Hooks#beforeRemoveRow
* @param {number} index Visual index of starter row.
* @param {number} amount Amount of rows to be removed.
* @param {number[]} physicalRows An array of physical rows removed from the data source.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeRemoveRow',
/**
* Fired before Handsontable's view-rendering engine is rendered.
*
* __Note:__ In Handsontable 9.x and earlier, the `beforeViewRender` hook was named `beforeRender`.
*
* @event Hooks#beforeViewRender
* @since 10.0.0
* @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of
* data, or a logic that needs a full Handsontable render cycle.
* If set to `false`, the rendering gets triggered by scrolling or moving the selection.
* @param {object} skipRender Object with `skipRender` property, if it is set to `true ` the next rendering cycle will be skipped.
*/
'beforeViewRender',
/**
* Fired after Handsontable's view-rendering engine is rendered,
* but before redrawing the selection borders and before scroll syncing.
*
* __Note:__ In Handsontable 9.x and earlier, the `afterViewRender` hook was named `afterRender`.
*
* @event Hooks#afterViewRender
* @since 10.0.0
* @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of
* data, or a logic that needs a full Handsontable render cycle.
* If set to `false`, the rendering gets triggered by scrolling or moving the selection.
*/
'afterViewRender',
/**
* Fired before Handsontable's view-rendering engine updates the view.
*
* The `beforeRender` event is fired right after the Handsontable
* business logic is executed and right before the rendering engine starts calling
* the Core logic, renderers, cell meta objects etc. to update the view.
*
* @event Hooks#beforeRender
* @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of
* data, or a logic that needs a full Handsontable render cycle.
* If set to `false`, the rendering gets triggered by scrolling or moving the selection.
*/
'beforeRender',
/**
* Fired after Handsontable's view-rendering engine updates the view.
*
* @event Hooks#afterRender
* @param {boolean} isForced If set to `true`, the rendering gets triggered by a change of settings, a change of
* data, or a logic that needs a full Handsontable render cycle.
* If set to `false`, the rendering gets triggered by scrolling or moving the selection.
*/
'afterRender',
/**
* Fired before cell meta is changed.
*
* @event Hooks#beforeSetCellMeta
* @since 8.0.0
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {string} key The updated meta key.
* @param {*} value The updated meta value.
* @returns {boolean|undefined} If false is returned the action is canceled.
*/
'beforeSetCellMeta',
/**
* Fired before setting range is started but not finished yet.
*
* @event Hooks#beforeSetRangeStartOnly
* @param {CellCoords} coords CellCoords instance.
*/
'beforeSetRangeStartOnly',
/**
* Fired before setting range is started.
*
* @event Hooks#beforeSetRangeStart
* @param {CellCoords} coords CellCoords instance.
*/
'beforeSetRangeStart',
/**
* Fired before setting range is ended.
*
* @event Hooks#beforeSetRangeEnd
* @param {CellCoords} coords CellCoords instance.
*/
'beforeSetRangeEnd',
/**
* Fired before the logic of handling a touch scroll, when user started scrolling on a touch-enabled device.
*
* @event Hooks#beforeTouchScroll
*/
'beforeTouchScroll',
/**
* Fired before cell validation, only if validator function is defined. This can be used to manipulate the value
* of changed cell before it is applied to the validator function.
*
* __Note:__ this will not affect values of changes. This will change value *ONLY* for validation.
*
* @event Hooks#beforeValidate
* @param {*} value Value of the cell.
* @param {number} row Visual row index.
* @param {string|number} prop Property name / column index.
* @param {string} [source] String that identifies source of hook call
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
*/
'beforeValidate',
/**
* Fired before cell value is rendered into the DOM (through renderer function). This can be used to manipulate the
* value which is passed to the renderer without modifying the renderer itself.
*
* @event Hooks#beforeValueRender
* @param {*} value Cell value to render.
* @param {object} cellProperties An object containing the cell properties.
*/
'beforeValueRender',
/**
* Fired after Handsontable instance is constructed (using `new` operator).
*
* @event Hooks#construct
*/
'construct',
/**
* Fired after Handsontable instance is initiated but before table is rendered.
*
* @event Hooks#init
*/
'init',
/**
* Fired when a column header index is about to be modified by a callback function.
*
* @event Hooks#modifyColHeader
* @param {number} column Visual column header index.
*/
'modifyColHeader',
/**
* Fired when a column width is about to be modified by a callback function.
*
* @event Hooks#modifyColWidth
* @param {number} width Current column width.
* @param {number} column Visual column index.
*/
'modifyColWidth',
/**
* Fired when a row header index is about to be modified by a callback function.
*
* @event Hooks#modifyRowHeader
* @param {number} row Visual row header index.
*/
'modifyRowHeader',
/**
* Fired when a row height is about to be modified by a callback function.
*
* @event Hooks#modifyRowHeight
* @param {number} height Row height.
* @param {number} row Visual row index.
*/
'modifyRowHeight',
/**
* Fired when a data was retrieved or modified.
*
* @event Hooks#modifyData
* @param {number} row Physical row index.
* @param {number} column Visual column index.
* @param {object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.
* @param {string} ioMode String which indicates for what operation hook is fired (`get` or `set`).
*/
'modifyData',
/**
* Fired when a data was retrieved or modified from the source data set.
*
* @event Hooks#modifySourceData
* @since 8.0.0
* @param {number} row Physical row index.
* @param {number} column Physical column index or property name.
* @param {object} valueHolder Object which contains original value which can be modified by overwriting `.value` property.
* @param {string} ioMode String which indicates for what operation hook is fired (`get` or `set`).
*/
'modifySourceData',
/**
* Fired when a data was retrieved or modified.
*
* @event Hooks#modifyRowData
* @param {number} row Physical row index.
*/
'modifyRowData',
/**
* Used to modify the cell coordinates when using the `getCell` method, opening editor, getting value from the editor
* and saving values from the closed editor.
*
* @event Hooks#modifyGetCellCoords
* @since 0.36.0
* @param {number} row Visual row index.
* @param {number} column Visual column index.
* @param {boolean} topmost If set to `true`, it returns the TD element from the topmost overlay. For example,
* if the wanted cell is in the range of fixed rows, it will return a TD element
* from the `top` overlay.
* @returns {undefined|number[]}
*/
'modifyGetCellCoords',
/**
* Allows modify the visual row index that is used to retrieve the row header element (TH) before it's
* highlighted (proper CSS class names are added). Modifying the visual row index allows building a custom
* implementation of the nested headers feature or other features that require highlighting other DOM
* elements than that the rendering engine, by default, would have highlighted.
*
* @event Hooks#beforeHighlightingRowHeader
* @since 8.4.0
* @param {number} row Visual row index.
* @param {number} headerLevel Column header level (0 = most distant to the table).
* @param {object} highlightMeta An object that contains additional information about processed selection.
* @returns {number|undefined}
*/
'beforeHighlightingRowHeader',
/**
* Allows modify the visual column index that is used to retrieve the column header element (TH) before it's
* highlighted (proper CSS class names are added). Modifying the visual column index allows building a custom
* implementation of the nested headers feature or other features that require highlighting other DOM
* elements than that the rendering engine, by default, would have highlighted.
*
* @event Hooks#beforeHighlightingColumnHeader
* @since 8.4.0
* @param {number} column Visual column index.
* @param {number} headerLevel Row header level (0 = most distant to the table).
* @param {object} highlightMeta An object that contains additional information about processed selection.
* @returns {number|undefined}
*/
'beforeHighlightingColumnHeader',
/**
* Fired by {@link PersistentState} plugin, after loading value, saved under given key, from browser local storage.
*
* The `persistentStateLoad` hook is fired even when the {@link Options#persistentState} option is disabled.
*
* @event Hooks#persistentStateLoad
* @param {string} key Key.
* @param {object} valuePlaceholder Object containing the loaded value under `valuePlaceholder.value` (if no value have been saved, `value` key will be undefined).
*/
'persistentStateLoad',
/**
* Fired by {@link PersistentState} plugin after resetting data from local storage. If no key is given, all values associated with table will be cleared.
* This hook is fired when {@link Options#persistentState} option is enabled.
*
* @event Hooks#persistentStateReset
* @param {string} [key] Key.
*/
'persistentStateReset',
/**
* Fired by {@link PersistentState} plugin, after saving value under given key in browser local storage.
*
* The `persistentStateSave` hook is fired even when the {@link Options#persistentState} option is disabled.
*
* @event Hooks#persistentStateSave
* @param {string} key Key.
* @param {Mixed} value Value to save.
*/
'persistentStateSave',
/**
* Fired by {@link ColumnSorting} and {@link MultiColumnSorting} plugins before sorting the column. If you return `false` value inside callback for hook, then sorting
* will be not applied by the Handsontable (useful for server-side sorting).
*
* This hook is fired when {@link Options#columnSorting} or {@link Options#multiColumnSorting} option is enabled.
*
* @event Hooks#beforeColumnSort
* @param {Array} currentSortConfig Current sort configuration (for all sorted columns).
* @param {Array} destinationSortConfigs Destination sort configuration (for all sorted columns).
* @returns {boolean | undefined} If `false` the column will not be sorted, `true` otherwise.
*/
'beforeColumnSort',
/**
* Fired by {@link ColumnSorting} and {@link MultiColumnSorting} plugins after sorting the column. This hook is fired when {@link Options#columnSorting}
* or {@link Options#multiColumnSorting} option is enabled.
*
* @event Hooks#afterColumnSort
* @param {Array} currentSortConfig Current sort configuration (for all sorted columns).
* @param {Array} destinationSortConfigs Destination sort configuration (for all sorted columns).
*/
'afterColumnSort',
/**
* Fired by {@link Autofill} plugin after setting range of autofill. This hook is fired when {@link Options#fillHandle}
* option is enabled.
*
* @event Hooks#modifyAutofillRange
* @param {Array} startArea Array of visual coordinates of the starting point for the drag-down operation (`[startRow, startColumn, endRow, endColumn]`).
* @param {Array} entireArea Array of visual coordinates of the entire area of the drag-down operation (`[startRow, startColumn, endRow, endColumn]`).
*/
'modifyAutofillRange',
/**
* Fired to allow modifying the copyable range with a callback function.
*
* @event Hooks#modifyCopyableRange
* @param {Array[]} copyableRanges Array of objects defining copyable cells.
*/
'modifyCopyableRange',
/**
* Fired by {@link CopyPaste} plugin before copying the values to the clipboard and before clearing values of
* the selected cells. This hook is fired when {@link Options#copyPaste} option is enabled.
*
* @event Hooks#beforeCut
* @param {Array[]} data An array of arrays which contains data to cut.
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
* which will be cut out.
* @returns {*} If returns `false` then operation of the cutting out is canceled.
* @example
* ::: only-for javascript
* ```js
* // To disregard a single row, remove it from the array using data.splice(i, 1).
* new Handsontable(element, {
* beforeCut: function(data, coords) {
* // data -> [[1, 2, 3], [4, 5, 6]]
* data.splice(0, 1);
* // data -> [[4, 5, 6]]
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
* }
* });
* // To cancel a cutting action, just return `false`.
* new Handsontable(element, {
* beforeCut: function(data, coords) {
* return false;
* }
* });
* ```
* :::
*
* ::: only-for react
* ```jsx
* // To disregard a single row, remove it from the array using data.splice(i, 1).
* <HotTable
* beforeCut={(data, coords) => {
* // data -> [[1, 2, 3], [4, 5, 6]]
* data.splice(0, 1);
* // data -> [[4, 5, 6]]
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
* }}
* />
* // To cancel a cutting action, just return `false`.
* <HotTable
* beforeCut={(data, coords) => {
* return false;
* }}
* />
* ```
* :::
*/
'beforeCut',
/**
* Fired by {@link CopyPaste} plugin after data was cut out from the table. This hook is fired when
* {@link Options#copyPaste} option is enabled.
*
* @event Hooks#afterCut
* @param {Array[]} data An array of arrays with the cut data.
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
* which was cut out.
*/
'afterCut',
/**
* Fired before values are copied to the clipboard.
*
* @event Hooks#beforeCopy
* @param {Array[]} data An array of arrays which contains data to copied.
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
* which will copied.
* @param {{ columnHeadersCount: number }} copiedHeadersCount (Since 12.3.0) The number of copied column headers.
* @returns {*} If returns `false` then copying is canceled.
*
* @example
* ::: only-for javascript
* ```js
* // To disregard a single row, remove it from array using data.splice(i, 1).
* ...
* new Handsontable(document.getElementById('example'), {
* beforeCopy: (data, coords) => {
* // data -> [[1, 2, 3], [4, 5, 6]]
* data.splice(0, 1);
* // data -> [[4, 5, 6]]
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
* }
* });
* ...
*
* // To cancel copying, return false from the callback.
* ...
* new Handsontable(document.getElementById('example'), {
* beforeCopy: (data, coords) => {
* return false;
* }
* });
* ...
* ```
* :::
*
* ::: only-for react
* ```jsx
* // To disregard a single row, remove it from array using data.splice(i, 1).
* ...
* <HotTable
* beforeCopy={(data, coords) => {
* // data -> [[1, 2, 3], [4, 5, 6]]
* data.splice(0, 1);
* // data -> [[4, 5, 6]]
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
* }}
* />
* ...
*
* // To cancel copying, return false from the callback.
* ...
* <HotTable
* beforeCopy={(data, coords) => {
* return false;
* }}
* />
* ...
* ```
* :::
*/
'beforeCopy',
/**
* Fired by {@link CopyPaste} plugin after data are pasted into table. This hook is fired when {@link Options#copyPaste}
* option is enabled.
*
* @event Hooks#afterCopy
* @param {Array[]} data An array of arrays which contains the copied data.
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
* which was copied.
* @param {{ columnHeadersCount: number }} copiedHeadersCount (Since 12.3.0) The number of copied column headers.
*/
'afterCopy',
/**
* Fired by {@link CopyPaste} plugin before values are pasted into table. This hook is fired when
* {@link Options#copyPaste} option is enabled.
*
* @event Hooks#beforePaste
* @param {Array[]} data An array of arrays which contains data to paste.
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
* that correspond to the previously selected area.
* @returns {*} If returns `false` then pasting is canceled.
* @example
* ```js
* ::: only-for javascript
* // To disregard a single row, remove it from array using data.splice(i, 1).
* new Handsontable(example, {
* beforePaste: (data, coords) => {
* // data -> [[1, 2, 3], [4, 5, 6]]
* data.splice(0, 1);
* // data -> [[4, 5, 6]]
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
* }
* });
* // To cancel pasting, return false from the callback.
* new Handsontable(example, {
* beforePaste: (data, coords) => {
* return false;
* }
* });
* ```
* :::
*
* ::: only-for react
* ```jsx
* // To disregard a single row, remove it from array using data.splice(i, 1).
* <HotTable
* beforePaste={(data, coords) => {
* // data -> [[1, 2, 3], [4, 5, 6]]
* data.splice(0, 1);
* // data -> [[4, 5, 6]]
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
* }}
* />
* // To cancel pasting, return false from the callback.
* <HotTable
* beforePaste={(data, coords) => {
* return false;
* }}
* />
* ```
* :::
*/
'beforePaste',
/**
* Fired by {@link CopyPaste} plugin after values are pasted into table. This hook is fired when
* {@link Options#copyPaste} option is enabled.
*
* @event Hooks#afterPaste
* @param {Array[]} data An array of arrays with the pasted data.
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
* that correspond to the previously selected area.
*/
'afterPaste',
/**
* Fired by the {@link ManualColumnFreeze} plugin, before freezing a column.
*
* @event Hooks#beforeColumnFreeze
* @since 12.1.0
* @param {number} column The visual index of the column that is going to freeze.
* @param {boolean} freezePerformed If `true`: the column is going to freeze. If `false`: the column is not going to freeze (which might happen if the column is already frozen).
* @returns {boolean|undefined} If `false`: the column is not going to freeze, and the `afterColumnFreeze` hook won't fire.
*/
'beforeColumnFreeze',
/**
* Fired by the {@link ManualColumnFreeze} plugin, right after freezing a column.
*
* @event Hooks#afterColumnFreeze
* @since 12.1.0
* @param {number} column The visual index of the frozen column.
* @param {boolean} freezePerformed If `true`: the column got successfully frozen. If `false`: the column didn't get frozen.
*/
'afterColumnFreeze',
/**
* Fired by {@link ManualColumnMove} plugin before change order of the visual indexes. This hook is fired when
* {@link Options#manualColumnMove} option is enabled.
*
* @event Hooks#beforeColumnMove
* @param {Array} movedColumns Array of visual column indexes to be moved.
* @param {number} finalIndex Visual column index, being a start index for the moved columns.
* Points to where the elements will be placed after the moving action.
* To check visualization of final index please take a look at
* [documentation](@/guides/columns/column-moving.md).
* @param {number|undefined} dropIndex Visual column index, being a drop index for the moved columns.
* Points to where we are going to drop the moved elements. To check
* visualization of drop index please take a look at
* [documentation](@/guides/columns/column-moving.md).
* It's `undefined` when `dragColumns` function wasn't called.
* @param {boolean} movePossible Indicates if it's possible to move rows to the desired position.
* @returns {undefined | boolean} If `false` the column will not be moved, `true` otherwise.
*/
'beforeColumnMove',
/**
* Fired by {@link ManualColumnMove} plugin after changing order of the visual indexes.
* This hook is fired when {@link Options#manualColumnMove} option is enabled.
*
* @event Hooks#afterColumnMove
* @param {Array} movedColumns Array of visual column indexes to be moved.
* @param {number} finalIndex Visual column index, being a start index for the moved columns.
* Points to where the elements will be placed after the moving action.
* To check visualization of final index please take a look at
* [documentation](@/guides/columns/column-moving.md).
* @param {number|undefined} dropIndex Visual column index, being a drop index for the moved columns.
* Points to where we are going to drop the moved elements.
* To check visualization of drop index please take a look at
* [documentation](@/guides/columns/column-moving.md).
* It's `undefined` when `dragColumns` function wasn't called.
* @param {boolean} movePossible Indicates if it was possible to move columns to the desired position.
* @param {boolean} orderChanged Indicates if order of columns was changed by move.
*/
'afterColumnMove',
/**
* Fired by the {@link ManualColumnFreeze} plugin, before unfreezing a column.
*
* @event Hooks#beforeColumnUnfreeze
* @since 12.1.0
* @param {number} column The visual index of the column that is going to unfreeze.
* @param {boolean} unfreezePerformed If `true`: the column is going to unfreeze. If `false`: the column is not going to unfreeze (which might happen if the column is already unfrozen).
* @returns {boolean|undefined} If `false`: the column is not going to unfreeze, and the `afterColumnUnfreeze` hook won't fire.
*/
'beforeColumnUnfreeze',
/**
* Fired by the {@link ManualColumnFreeze} plugin, right after unfreezing a column.
*
* @event Hooks#afterColumnUnfreeze
* @since 12.1.0
* @param {number} column The visual index of the unfrozen column.
* @param {boolean} unfreezePerformed If `true`: the column got successfully unfrozen. If `false`: the column didn't get unfrozen.
*/
'afterColumnUnfreeze',
/**
* Fired by {@link ManualRowMove} plugin before changing the order of the visual indexes. This hook is fired when
* {@link Options#manualRowMove} option is enabled.
*
* @event Hooks#beforeRowMove
* @param {Array} movedRows Array of visual row indexes to be moved.
* @param {number} finalIndex Visual row index, being a start index for the moved rows.
* Points to where the elements will be placed after the moving action.
* To check visualization of final index please take a look at
* [documentation](@/guides/rows/row-moving.md).
* @param {number|undefined} dropIndex Visual row index, being a drop index for the moved rows.
* Points to where we are going to drop the moved elements.
* To check visualization of drop index please take a look at
* [documentation](@/guides/rows/row-moving.md).
* It's `undefined` when `dragRows` function wasn't called.
* @param {boolean} movePossible Indicates if it's possible to move rows to the desired position.
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeRowMove',
/**
* Fired by {@link ManualRowMove} plugin after changing the order of the visual indexes.
* This hook is fired when {@link Options#manualRowMove} option is enabled.
*
* @event Hooks#afterRowMove
* @param {Array} movedRows Array of visual row indexes to be moved.
* @param {number} finalIndex Visual row index, being a start index for the moved rows.
* Points to where the elements will be placed after the moving action.
* To check visualization of final index please take a look at
* [documentation](@/guides/rows/row-moving.md).
* @param {number|undefined} dropIndex Visual row index, being a drop index for the moved rows.
* Points to where we are going to drop the moved elements.
* To check visualization of drop index please take a look at
* [documentation](@/guides/rows/row-moving.md).
* It's `undefined` when `dragRows` function wasn't called.
* @param {boolean} movePossible Indicates if it was possible to move rows to the desired position.
* @param {boolean} orderChanged Indicates if order of rows was changed by move.
*/
'afterRowMove',
/**
* Fired by {@link ManualColumnResize} plugin before rendering the table with modified column sizes. This hook is
* fired when {@link Options#manualColumnResize} option is enabled.
*
* @event Hooks#beforeColumnResize
* @param {number} newSize Calculated new column width.
* @param {number} column Visual index of the resized column.
* @param {boolean} isDoubleClick Flag that determines whether there was a double-click.
* @returns {number} Returns a new column size or `undefined`, if column size should be calculated automatically.
*/
'beforeColumnResize',
/**
* Fired by {@link ManualColumnResize} plugin after rendering the table with modified column sizes. This hook is
* fired when {@link Options#manualColumnResize} option is enabled.
*
* @event Hooks#afterColumnResize
* @param {number} newSize Calculated new column width.
* @param {number} column Visual index of the resized column.
* @param {boolean} isDoubleClick Flag that determines whether there was a double-click.
*/
'afterColumnResize',
/**
* Fired by {@link ManualRowResize} plugin before rendering the table with modified row sizes. This hook is
* fired when {@link Options#manualRowResize} option is enabled.
*
* @event Hooks#beforeRowResize
* @param {number} newSize Calculated new row height.
* @param {number} row Visual index of the resized row.
* @param {boolean} isDoubleClick Flag that determines whether there was a double-click.
* @returns {number|undefined} Returns the new row size or `undefined` if row size should be calculated automatically.
*/
'beforeRowResize',
/**
* Fired by {@link ManualRowResize} plugin after rendering the table with modified row sizes. This hook is
* fired when {@link Options#manualRowResize} option is enabled.
*
* @event Hooks#afterRowResize
* @param {number} newSize Calculated new row height.
* @param {number} row Visual index of the resized row.
* @param {boolean} isDoubleClick Flag that determines whether there was a double-click.
*/
'afterRowResize',
/**
* Fired after getting the column header renderers.
*
* @event Hooks#afterGetColumnHeaderRenderers
* @param {Function[]} renderers An array of the column header renderers.
*/
'afterGetColumnHeaderRenderers',
/**
* Fired after getting the row header renderers.
*
* @event Hooks#afterGetRowHeaderRenderers
* @param {Function[]} renderers An array of the row header renderers.
*/
'afterGetRowHeaderRenderers',
/**
* Fired before applying stretched column width to column.
*
* @event Hooks#beforeStretchingColumnWidth
* @param {number} stretchedWidth Calculated width.
* @param {number} column Visual column index.
* @returns {number|undefined} Returns new width which will be applied to the column element.
*/
'beforeStretchingColumnWidth',
/**
* Fired by the [`Filters`](@/api/filters.md) plugin,
* before a [column filter](@/guides/columns/column-filter.md) gets applied.
*
* [`beforeFilter`](#beforefilter) takes one argument (`conditionsStack`), which is an array of objects.
* Each object represents one of your [column filters](@/api/filters.md#addcondition),
* and consists of the following properties:
*
* | Property | Possible values | Description |
* | ------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
* | `column` | Number | A visual index of the column to which the filter will be applied. |
* | `conditions` | Array of objects | Each object represents one condition. For details, see [`addCondition()`](@/api/filters.md#addcondition). |
* | `operation` | `'conjunction'` \| `'disjunction'` \| `'disjunctionWithExtraCondition'` | An operation to perform on your set of `conditions`. For details, see [`addCondition()`](@/api/filters.md#addcondition). |
*
* An example of the format of the `conditionsStack` argument:
*
* ```js
* [
* {
* column: 2,
* conditions: [
* {name: 'begins_with', args: [['S']]}
* ],
* operation: 'conjunction'
* },
* {
* column: 4,
* conditions: [
* {name: 'not_empty', args: []}
* ],
* operation: 'conjunction'
* },
* ]
* ```
*
* To perform server-side filtering (i.e., to not apply filtering to Handsontable's UI),
* set [`beforeFilter`](#beforefilter) to return `false`:
*
* ```js
* new Handsontable(document.getElementById('example'), {
* beforeFilter: (conditionsStack) => {
* return false;
* }
* });
*```
*
* Read more:
* - [Guides: Column filter](@/guides/columns/column-filter.md)
* - [Hooks: `afterFilter`](#afterfilter)
* - [Options: `filters`](@/api/options.md#filters)
* - [Plugins: `Filters`](@/api/filters.md)
* – [Plugin methods: `addCondition()`](@/api/filters.md#addcondition)
*
* @event Hooks#beforeFilter
* @param {object[]} conditionsStack An array of objects with your [column filters](@/api/filters.md#addcondition).
* @returns {boolean} To perform server-side filtering (i.e., to not apply filtering to Handsontable's UI), return `false`.
*/
'beforeFilter',
/**
* Fired by the [`Filters`](@/api/filters.md) plugin,
* after a [column filter](@/guides/columns/column-filter.md) gets applied.
*
* [`afterFilter`](#afterfilter) takes one argument (`conditionsStack`), which is an array of objects.
* Each object represents one of your [column filters](@/api/filters.md#addcondition),
* and consists of the following properties:
*
* | Property | Possible values | Description |
* | ------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
* | `column` | Number | A visual index of the column to which the filter was applied. |
* | `conditions` | Array of objects | Each object represents one condition. For details, see [`addCondition()`](@/api/filters.md#addcondition). |
* | `operation` | `'conjunction'` \| `'disjunction'` \| `'disjunctionWithExtraCondition'` | An operation to perform on your set of `conditions`. For details, see [`addCondition()`](@/api/filters.md#addcondition). |
*
* An example of the format of the `conditionsStack` argument:
*
* ```js
* [
* {
* column: 2,
* conditions: [
* {name: 'begins_with', args: [['S']]}
* ],
* operation: 'conjunction'
* },
* {
* column: 4,
* conditions: [
* {name: 'not_empty', args: []}
* ],
* operation: 'conjunction'
* },
* ]
* ```
*
* Read more:
* - [Guides: Column filter](@/guides/columns/column-filter.md)
* - [Hooks: `beforeFilter`](#beforefilter)
* - [Options: `filters`](@/api/options.md#filters)
* - [Plugins: `Filters`](@/api/filters.md)
* – [Plugin methods: `addCondition()`](@/api/filters.md#addcondition)
*
* @event Hooks#afterFilter
* @param {object[]} conditionsStack An array of objects with your [column filters](@/api/filters.md#addcondition).
*/
'afterFilter',
/**
* Fired by the {@link Formulas} plugin, when any cell value changes.
*
* Returns an array of objects that contains:
* - The addresses (`sheet`, `row`, `col`) and new values (`newValue`) of the changed cells.
* - The addresses and new values of any cells that had to be recalculated (because their formulas depend on the cells that changed).
*
* This hook gets also fired on Handsontable's initialization, returning the addresses and values of all cells.
*
* Read more:
* - [Guides: Formula calculation](@/guides/formulas/formula-calculation.md)
* - [HyperFormula documentation: `valuesUpdated`](https://hyperformula.handsontable.com/api/interfaces/listeners.html#valuesupdated)
*
* @since 9.0.0
* @event Hooks#afterFormulasValuesUpdate
* @param {Array} changes The addresses and new values of all the changed and recalculated cells.
*/
'afterFormulasValuesUpdate',
/**
* Fired when a named expression is added to the Formulas' engine instance.
*
* @since 9.0.0
* @event Hooks#afterNamedExpressionAdded
* @param {string} namedExpressionName The name of the added expression.
* @param {Array} changes The values and location of applied changes.
*/
'afterNamedExpressionAdded',
/**
* Fired when a named expression is removed from the Formulas' engine instance.
*
* @since 9.0.0
* @event Hooks#afterNamedExpressionRemoved
* @param {string} namedExpressionName The name of the removed expression.
* @param {Array} changes The values and location of applied changes.
*/
'afterNamedExpressionRemoved',
/**
* Fired when a new sheet is added to the Formulas' engine instance.
*
* @since 9.0.0
* @event Hooks#afterSheetAdded
* @param {string} addedSheetDisplayName The name of the added sheet.
*/
'afterSheetAdded',
/**
* Fired when a sheet in the Formulas' engine instance is renamed.
*
* @since 9.0.0
* @event Hooks#afterSheetRenamed
* @param {string} oldDisplayName The old name of the sheet.
* @param {string} newDisplayName The new name of the sheet.
*/
'afterSheetRenamed',
/**
* Fired when a sheet is removed from the Formulas' engine instance.
*
* @since 9.0.0
* @event Hooks#afterSheetRemoved
* @param {string} removedSheetDisplayName The removed sheet name.
* @param {Array} changes The values and location of applied changes.
*/
'afterSheetRemoved',
/**
* Fired while retrieving the column header height.
*
* @event Hooks#modifyColumnHeaderHeight
*/
'modifyColumnHeaderHeight',
/**
* Fired while retrieving a column header's value.
*
* @since 12.3.0
* @event Hooks#modifyColumnHeaderValue
* @param {string} value A column header value.
* @param {number} visualColumnIndex A visual column index.
* @param {number} [headerLevel=0] Header level index. Accepts positive (0 to n)
* and negative (-1 to -n) values. For positive values, 0 points to the
* topmost header. For negative values, -1 points to the bottom-most
* header (the header closest to the cells).
* @returns {string} The column header value to be updated.
*/
'modifyColumnHeaderValue',
/**
* Fired by {@link UndoRedo} plugin before the undo action. Contains information about the action that is being undone.
* This hook is fired when {@link Options#undo} option is enabled.
*
* @event Hooks#beforeUndo
* @param {object} action The action object. Contains information about the action being undone. The `actionType`
* property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeUndo',
/**
* Fired by {@link UndoRedo} plugin before changing undo stack.
*
* @event Hooks#beforeUndoStackChange
* @since 8.4.0
* @param {Array} doneActions Stack of actions which may be undone.
* @param {string} [source] String that identifies source of action
* ([list of all available sources](@/guides/getting-started/events-and-hooks.md#definition-for-source-argument)).
* @returns {*|boolean} If false is returned the action of changing undo stack is canceled.
*/
'beforeUndoStackChange',
/**
* Fired by {@link UndoRedo} plugin after the undo action. Contains information about the action that is being undone.
* This hook is fired when {@link Options#undo} option is enabled.
*
* @event Hooks#afterUndo
* @param {object} action The action object. Contains information about the action being undone. The `actionType`
* property of the object specifies the type of the action in a String format. (e.g. `'remove_row'`).
*/
'afterUndo',
/**
* Fired by {@link UndoRedo} plugin after changing undo stack.
*
* @event Hooks#afterUndoStackChange
* @since 8.4.0
* @param {Array} doneActionsBefore Stack of actions which could be undone before performing new action.
* @param {Array} doneActionsAfter Stack of actions which can be undone after performing new action.
*/
'afterUndoStackChange',
/**
* Fired by {@link UndoRedo} plugin before the redo action. Contains information about the action that is being redone.
* This hook is fired when {@link Options#undo} option is enabled.
*
* @event Hooks#beforeRedo
* @param {object} action The action object. Contains information about the action being redone. The `actionType`
* property of the object specifies the type of the action in a String format (e.g. `'remove_row'`).
* @returns {*|boolean} If false is returned the action is canceled.
*/
'beforeRedo',
/**
* Fired by {@link UndoRedo} plugin before changing redo stack.
*
* @event Hooks#beforeRedoStackChange
* @since 8.4.0
* @param {Array} undoneActions Stack of actions which may be redone.
*/
'beforeRedoStackChange',
/**
* Fired by {@link UndoRedo} plugin after the redo action. Contains information about the action that is being redone.
* This hook is fired when {@link Options#undo} option is enabled.
*
* @event Hooks#afterRedo
* @param {object} action The action object. Contains information about the action being redone. The `actionType`
* property of the object specifies the type of the action in a String format (e.g. `'remove_row'`).
*/
'afterRedo',
/**
* Fired by {@link UndoRedo} plugin after changing redo stack.
*
* @event Hooks#afterRedoStackChange
* @since 8.4.0
* @param {Array} undoneActionsBefore Stack of actions which could be redone before performing new action.
* @param {Array} undoneActionsAfter Stack of actions which can be redone after performing new action.
*/
'afterRedoStackChange',
/**
* Fired while retrieving the row header width.
*
* @event Hooks#modifyRowHeaderWidth
* @param {number} rowHeaderWidth Row header width.
*/
'modifyRowHeaderWidth',
/**
* Fired when the start of the selection is being modified (e.g. Moving the selection with the arrow keys).
*
* @event Hooks#modifyTransformStart
* @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.
*/
'modifyTransformStart',
/**
* Fired when the end of the selection is being modified (e.g. Moving the selection with the arrow keys).
*
* @event Hooks#modifyTransformEnd
* @param {CellCoords} delta Cell coords object declaring the delta of the new selection relative to the previous one.
*/
'modifyTransformEnd',
/**
* Fired after the start of the selection is being modified (e.g. Moving the selection with the arrow keys).
*
* @event Hooks#afterModifyTransformStart
* @param {CellCoords} coords Coords of the freshly selected cell.
* @param {number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.
* @param {number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.
*/
'afterModifyTransformStart',
/**
* Fired after the end of the selection is being modified (e.g. Moving the selection with the arrow keys).
*
* @event Hooks#afterModifyTransformEnd
* @param {CellCoords} coords Visual coords of the freshly selected cell.
* @param {number} rowTransformDir `-1` if trying to select a cell with a negative row index. `0` otherwise.
* @param {number} colTransformDir `-1` if trying to select a cell with a negative column index. `0` otherwise.
*/
'afterModifyTransformEnd',
/**
* Fired inside the `viewportRowCalculatorOverride` method. Allows modifying the row calculator parameters.
*
* @event Hooks#afterViewportRowCalculatorOverride
* @param {object} calc The row calculator.
*/
'afterViewportRowCalculatorOverride',
/**
* Fired inside the `viewportColumnCalculatorOverride` method. Allows modifying the row calculator parameters.
*
* @event Hooks#afterViewportColumnCalculatorOverride
* @param {object} calc The row calculator.
*/
'afterViewportColumnCalculatorOverride',
/**
* Fired after initializing all the plugins.
* This hook should be added before Handsontable is initialized.
*
* @event Hooks#afterPluginsInitialized
*
* @example
* ```js
* Handsontable.hooks.add('afterPluginsInitialized', myCallback);
* ```
*/
'afterPluginsInitialized',
/**
* Fired by {@link HiddenRows} plugin before marking the rows as hidden. Fired only if the {@link Options#hiddenRows} option is enabled.
* Returning `false` in the callback will prevent the hiding action from completing.
*
* @event Hooks#beforeHideRows
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.
* @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the hiding action will not be completed.
*/
'beforeHideRows',
/**
* Fired by {@link HiddenRows} plugin after marking the rows as hidden. Fired only if the {@link Options#hiddenRows} option is enabled.
*
* @event Hooks#afterHideRows
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.
* @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.
* @param {boolean} stateChanged `true`, if the action affected any non-hidden rows, `false` otherwise.
*/
'afterHideRows',
/**
* Fired by {@link HiddenRows} plugin before marking the rows as not hidden. Fired only if the {@link Options#hiddenRows} option is enabled.
* Returning `false` in the callback will prevent the row revealing action from completing.
*
* @event Hooks#beforeUnhideRows
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.
* @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the revealing action will not be completed.
*/
'beforeUnhideRows',
/**
* Fired by {@link HiddenRows} plugin after marking the rows as not hidden. Fired only if the {@link Options#hiddenRows} option is enabled.
*
* @event Hooks#afterUnhideRows
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical row indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical row indexes.
* @param {boolean} actionPossible `true`, if provided row indexes are valid, `false` otherwise.
* @param {boolean} stateChanged `true`, if the action affected any hidden rows, `false` otherwise.
*/
'afterUnhideRows',
/**
* Fired by {@link HiddenColumns} plugin before marking the columns as hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.
* Returning `false` in the callback will prevent the hiding action from completing.
*
* @event Hooks#beforeHideColumns
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.
* @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the hiding action will not be completed.
*/
'beforeHideColumns',
/**
* Fired by {@link HiddenColumns} plugin after marking the columns as hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.
*
* @event Hooks#afterHideColumns
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.
* @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.
* @param {boolean} stateChanged `true`, if the action affected any non-hidden columns, `false` otherwise.
*/
'afterHideColumns',
/**
* Fired by {@link HiddenColumns} plugin before marking the columns as not hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.
* Returning `false` in the callback will prevent the column revealing action from completing.
*
* @event Hooks#beforeUnhideColumns
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.
* @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the hiding action will not be completed.
*/
'beforeUnhideColumns',
/**
* Fired by {@link HiddenColumns} plugin after marking the columns as not hidden. Fired only if the {@link Options#hiddenColumns} option is enabled.
*
* @event Hooks#afterUnhideColumns
* @param {Array} currentHideConfig Current hide configuration - a list of hidden physical column indexes.
* @param {Array} destinationHideConfig Destination hide configuration - a list of hidden physical column indexes.
* @param {boolean} actionPossible `true`, if the provided column indexes are valid, `false` otherwise.
* @param {boolean} stateChanged `true`, if the action affected any hidden columns, `false` otherwise.
*/
'afterUnhideColumns',
/**
* Fired by {@link TrimRows} plugin before trimming rows. This hook is fired when {@link Options#trimRows} option is enabled.
*
* @event Hooks#beforeTrimRow
* @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.
* @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.
* @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the trimming action will not be completed.
*/
'beforeTrimRow',
/**
* Fired by {@link TrimRows} plugin after trimming rows. This hook is fired when {@link Options#trimRows} option is enabled.
*
* @event Hooks#afterTrimRow
* @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.
* @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.
* @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.
* @param {boolean} stateChanged `true`, if the action affected any non-trimmed rows, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the trimming action will not be completed.
*/
'afterTrimRow',
/**
* Fired by {@link TrimRows} plugin before untrimming rows. This hook is fired when {@link Options#trimRows} option is enabled.
*
* @event Hooks#beforeUntrimRow
* @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.
* @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.
* @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the untrimming action will not be completed.
*/
'beforeUntrimRow',
/**
* Fired by {@link TrimRows} plugin after untrimming rows. This hook is fired when {@link Options#trimRows} option is enabled.
*
* @event Hooks#afterUntrimRow
* @param {Array} currentTrimConfig Current trim configuration - a list of trimmed physical row indexes.
* @param {Array} destinationTrimConfig Destination trim configuration - a list of trimmed physical row indexes.
* @param {boolean} actionPossible `true`, if all of the row indexes are withing the bounds of the table, `false` otherwise.
* @param {boolean} stateChanged `true`, if the action affected any trimmed rows, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the untrimming action will not be completed.
*/
'afterUntrimRow',
/**
* Fired by {@link DropdownMenu} plugin before opening the dropdown menu. This hook is fired when {@link Options#dropdownMenu}
* option is enabled.
*
* @event Hooks#beforeDropdownMenuShow
* @param {DropdownMenu} dropdownMenu The DropdownMenu instance.
*/
'beforeDropdownMenuShow',
/**
* Fired by {@link DropdownMenu} plugin after opening the Dropdown Menu. This hook is fired when {@link Options#dropdownMenu}
* option is enabled.
*
* @event Hooks#afterDropdownMenuShow
* @param {DropdownMenu} dropdownMenu The DropdownMenu instance.
*/
'afterDropdownMenuShow',
/**
* Fired by {@link DropdownMenu} plugin after hiding the Dropdown Menu. This hook is fired when {@link Options#dropdownMenu}
* option is enabled.
*
* @event Hooks#afterDropdownMenuHide
* @param {DropdownMenu} instance The DropdownMenu instance.
*/
'afterDropdownMenuHide',
/**
* Fired by {@link NestedRows} plugin before adding a children to the NestedRows structure. This hook is fired when
* {@link Options#nestedRows} option is enabled.
*
* @event Hooks#beforeAddChild
* @param {object} parent The parent object.
* @param {object|undefined} element The element added as a child. If `undefined`, a blank child was added.
* @param {number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.
*/
'beforeAddChild',
/**
* Fired by {@link NestedRows} plugin after adding a children to the NestedRows structure. This hook is fired when
* {@link Options#nestedRows} option is enabled.
*
* @event Hooks#afterAddChild
* @param {object} parent The parent object.
* @param {object|undefined} element The element added as a child. If `undefined`, a blank child was added.
* @param {number|undefined} index The index within the parent where the new child was added. If `undefined`, the element was added as the last child.
*/
'afterAddChild',
/**
* Fired by {@link NestedRows} plugin before detaching a child from its parent. This hook is fired when
* {@link Options#nestedRows} option is enabled.
*
* @event Hooks#beforeDetachChild
* @param {object} parent An object representing the parent from which the element is to be detached.
* @param {object} element The detached element.
*/
'beforeDetachChild',
/**
* Fired by {@link NestedRows} plugin after detaching a child from its parent. This hook is fired when
* {@link Options#nestedRows} option is enabled.
*
* @event Hooks#afterDetachChild
* @param {object} parent An object representing the parent from which the element was detached.
* @param {object} element The detached element.
* @param {number} finalElementPosition The final row index of the detached element.
*/
'afterDetachChild',
/**
* Fired after the editor is opened and rendered.
*
* @event Hooks#afterBeginEditing
* @param {number} row Visual row index of the edited cell.
* @param {number} column Visual column index of the edited cell.
*/
'afterBeginEditing',
/**
* Fired by {@link MergeCells} plugin before cell merging. This hook is fired when {@link Options#mergeCells}
* option is enabled.
*
* @event Hooks#beforeMergeCells
* @param {CellRange} cellRange Selection cell range.
* @param {boolean} [auto=false] `true` if called automatically by the plugin.
*/
'beforeMergeCells',
/**
* Fired by {@link MergeCells} plugin after cell merging. This hook is fired when {@link Options#mergeCells}
* option is enabled.
*
* @event Hooks#afterMergeCells
* @param {CellRange} cellRange Selection cell range.
* @param {object} mergeParent The parent collection of the provided cell range.
* @param {boolean} [auto=false] `true` if called automatically by the plugin.
*/
'afterMergeCells',
/**
* Fired by {@link MergeCells} plugin before unmerging the cells. This hook is fired when {@link Options#mergeCells}
* option is enabled.
*
* @event Hooks#beforeUnmergeCells
* @param {CellRange} cellRange Selection cell range.
* @param {boolean} [auto=false] `true` if called automatically by the plugin.
*/
'beforeUnmergeCells',
/**
* Fired by {@link MergeCells} plugin after unmerging the cells. This hook is fired when {@link Options#mergeCells}
* option is enabled.
*
* @event Hooks#afterUnmergeCells
* @param {CellRange} cellRange Selection cell range.
* @param {boolean} [auto=false] `true` if called automatically by the plugin.
*/
'afterUnmergeCells',
/**
* Fired after the table was switched into listening mode. This allows Handsontable to capture keyboard events and
* respond in the right way.
*
* @event Hooks#afterListen
*/
'afterListen',
/**
* Fired after the table was switched off from the listening mode. This makes the Handsontable inert for any
* keyboard events.
*
* @event Hooks#afterUnlisten
*/
'afterUnlisten',
/**
* Fired after the window was resized or the size of the Handsontable root element was changed.
*
* @event Hooks#afterRefreshDimensions
* @param {object} previousDimensions Previous dimensions of the container.
* @param {object} currentDimensions Current dimensions of the container.
* @param {boolean} stateChanged `true`, if the container was re-render, `false` otherwise.
*/
'afterRefreshDimensions',
/**
* Cancellable hook, called after resizing a window or after detecting size change of the
* Handsontable root element, but before redrawing a table.
*
* @event Hooks#beforeRefreshDimensions
* @param {object} previousDimensions Previous dimensions of the container.
* @param {object} currentDimensions Current dimensions of the container.
* @param {boolean} actionPossible `true`, if current and previous dimensions are different, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the refresh action will not be completed.
*/
'beforeRefreshDimensions',
/**
* Fired by {@link CollapsibleColumns} plugin before columns collapse. This hook is fired when {@link Options#collapsibleColumns} option is enabled.
*
* @event Hooks#beforeColumnCollapse
* @since 8.0.0
* @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.
* @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.
* @param {boolean} collapsePossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the collapsing action will not be completed.
*/
'beforeColumnCollapse',
/**
* Fired by {@link CollapsibleColumns} plugin before columns collapse. This hook is fired when {@link Options#collapsibleColumns} option is enabled.
*
* @event Hooks#afterColumnCollapse
* @since 8.0.0
* @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.
* @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.
* @param {boolean} collapsePossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.
* @param {boolean} successfullyCollapsed `true`, if the action affected any non-collapsible column, `false` otherwise.
*/
'afterColumnCollapse',
/**
* Fired by {@link CollapsibleColumns} plugin before columns expand. This hook is fired when {@link Options#collapsibleColumns} option is enabled.
*
* @event Hooks#beforeColumnExpand
* @since 8.0.0
* @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.
* @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.
* @param {boolean} expandPossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.
* @returns {undefined|boolean} If the callback returns `false`, the expanding action will not be completed.
*/
'beforeColumnExpand',
/**
* Fired by {@link CollapsibleColumns} plugin before columns expand. This hook is fired when {@link Options#collapsibleColumns} option is enabled.
*
* @event Hooks#afterColumnExpand
* @since 8.0.0
* @param {Array} currentCollapsedColumns Current collapsible configuration - a list of collapsible physical column indexes.
* @param {Array} destinationCollapsedColumns Destination collapsible configuration - a list of collapsible physical column indexes.
* @param {boolean} expandPossible `true`, if all of the column indexes are withing the bounds of the collapsed sections, `false` otherwise.
* @param {boolean} successfullyExpanded `true`, if the action affected any non-collapsible column, `false` otherwise.
*/
'afterColumnExpand',
/**
* Fired by {@link AutoColumnSize} plugin within SampleGenerator utility.
*
* @event Hooks#modifyAutoColumnSizeSeed
* @since 8.4.0
* @param {string|undefined} seed Seed ID, unique name to categorize samples.
* @param {object} cellProperties Object containing the cell properties.
* @param {*} cellValue Value of the cell.
*/
'modifyAutoColumnSizeSeed'];
/**
* Template warning message for removed hooks.
*
* @type {string}
*/
const REMOVED_MESSAGE = (0, _templateLiteralTag.toSingleLine)`The plugin hook "[hookName]" was removed in Handsontable [removedInVersion].\x20
Please consult release notes https://github.com/handsontable/handsontable/releases/tag/[removedInVersion] to\x20
learn about the migration path.`;
/**
* The list of the hooks which are removed from the API. The warning message is printed out in
* the developer console when the hook is used.
*
* The Map key is represented by hook name and its value points to the Handsontable version
* in which it was removed.
*
* @type {Map<string, string>}
*/
const REMOVED_HOOKS = new Map([['modifyRow', '8.0.0'], ['modifyCol', '8.0.0'], ['unmodifyRow', '8.0.0'], ['unmodifyCol', '8.0.0'], ['skipLengthCache', '8.0.0'], ['hiddenColumn', '8.0.0'], ['hiddenRow', '8.0.0']]);
/* eslint-disable jsdoc/require-description-complete-sentence */
/**
* The list of the hooks which are deprecated. The warning message is printed out in
* the developer console when the hook is used.
*
* The Map key is represented by hook name and its value keeps message which whould be
* printed out when the hook is used.
*
* Usage:
* ```js
* ...
* New Map([
* ['beforeColumnExpand', 'The plugin hook "beforeColumnExpand" is deprecated. Use "beforeColumnExpand2" instead.'],
* ])
* ...
* ```
*
*
* @type {Map<string, string>}
*/
/* eslint-enable jsdoc/require-description-complete-sentence */
const DEPRECATED_HOOKS = new Map([]);
class Hooks {
static getSingleton() {
return getGlobalSingleton();
}
/**
*
*/
constructor() {
this.globalBucket = this.createEmptyBucket();
}
/**
* Returns a new object with empty handlers related to every registered hook name.
*
* @returns {object} The empty bucket object.
*
* @example
* ```js
* Handsontable.hooks.createEmptyBucket();
* // Results:
* {
* ...
* afterCreateCol: [],
* afterCreateRow: [],
* beforeInit: [],
* ...
* }
* ```
*/
createEmptyBucket() {
const bucket = Object.create(null);
// eslint-disable-next-line no-return-assign
(0, _array.arrayEach)(REGISTERED_HOOKS, hook => bucket[hook] = []);
return bucket;
}
/**
* Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket.
*
* @param {object} [context=null] A Handsontable instance.
* @returns {object} Returns a global or Handsontable instance bucket.
*/
getBucket() {
let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (context) {
if (!context.pluginHookBucket) {
context.pluginHookBucket = this.createEmptyBucket();
}
return context.pluginHookBucket;
}
return this.globalBucket;
}
/**
* Adds a listener (globally or locally) to a specified hook name.
* If the `context` parameter is provided, the hook will be added only to the instance it references.
* Otherwise, the callback will be used everytime the hook fires on any Handsontable instance.
* You can provide an array of callback functions as the `callback` argument, this way they will all be fired
* once the hook is triggered.
*
* @see Core#addHook
* @param {string} key Hook name.
* @param {Function|Array} callback Callback function or an array of functions.
* @param {object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.
* @returns {Hooks} Instance of Hooks.
*
* @example
* ```js
* // single callback, added locally
* Handsontable.hooks.add('beforeInit', myCallback, hotInstance);
*
* // single callback, added globally
* Handsontable.hooks.add('beforeInit', myCallback);
*
* // multiple callbacks, added locally
* Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);
*
* // multiple callbacks, added globally
* Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);
* ```
*/
add(key, callback) {
let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (Array.isArray(callback)) {
(0, _array.arrayEach)(callback, c => this.add(key, c, context));
} else {
if (REMOVED_HOOKS.has(key)) {
(0, _console.warn)((0, _string.substitute)(REMOVED_MESSAGE, {
hookName: key,
removedInVersion: REMOVED_HOOKS.get(key)
}));
}
if (DEPRECATED_HOOKS.has(key)) {
(0, _console.warn)(DEPRECATED_HOOKS.get(key));
}
const bucket = this.getBucket(context);
if (typeof bucket[key] === 'undefined') {
this.register(key);
bucket[key] = [];
}
callback.skip = false;
if (bucket[key].indexOf(callback) === -1) {
// only add a hook if it has not already been added (adding the same hook twice is now silently ignored)
let foundInitialHook = false;
if (callback.initialHook) {
(0, _array.arrayEach)(bucket[key], (cb, i) => {
if (cb.initialHook) {
bucket[key][i] = callback;
foundInitialHook = true;
return false;
}
});
}
if (!foundInitialHook) {
bucket[key].push(callback);
}
}
}
return this;
}
/**
* Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.
*
* @see Core#addHookOnce
* @param {string} key Hook/Event name.
* @param {Function|Array} callback Callback function.
* @param {object} [context=null] A Handsontable instance.
*
* @example
* ```js
* Handsontable.hooks.once('beforeInit', myCallback, hotInstance);
* ```
*/
once(key, callback) {
let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (Array.isArray(callback)) {
(0, _array.arrayEach)(callback, c => this.once(key, c, context));
} else {
callback.runOnce = true;
this.add(key, callback, context);
}
}
/**
* Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.
*
* @see Core#removeHook
* @param {string} key Hook/Event name.
* @param {Function} callback Callback function (needs the be the function that was previously added to the hook).
* @param {object} [context=null] Handsontable instance.
* @returns {boolean} Returns `true` if hook was removed, `false` otherwise.
*
* @example
* ```js
* Handsontable.hooks.remove('beforeInit', myCallback);
* ```
*/
remove(key, callback) {
let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
const bucket = this.getBucket(context);
if (typeof bucket[key] !== 'undefined') {
if (bucket[key].indexOf(callback) >= 0) {
callback.skip = true;
return true;
}
}
return false;
}
/**
* Checks whether there are any registered listeners for the provided hook name.
* If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.
*
* @param {string} key Hook name.
* @param {object} [context=null] A Handsontable instance.
* @returns {boolean} `true` for success, `false` otherwise.
*/
has(key) {
let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
const bucket = this.getBucket(context);
return !!(bucket[key] !== void 0 && bucket[key].length);
}
/**
* Runs all local and global callbacks assigned to the hook identified by the `key` parameter.
* It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.
*
* @see Core#runHooks
* @param {object} context Handsontable instance.
* @param {string} key Hook/Event name.
* @param {*} [p1] Parameter to be passed as an argument to the callback function.
* @param {*} [p2] Parameter to be passed as an argument to the callback function.
* @param {*} [p3] Parameter to be passed as an argument to the callback function.
* @param {*} [p4] Parameter to be passed as an argument to the callback function.
* @param {*} [p5] Parameter to be passed as an argument to the callback function.
* @param {*} [p6] Parameter to be passed as an argument to the callback function.
* @returns {*} Either a return value from the last called callback or `p1`.
*
* @example
* ```js
* Handsontable.hooks.run(hot, 'beforeInit');
* ```
*/
run(context, key, p1, p2, p3, p4, p5, p6) {
{
const globalHandlers = this.globalBucket[key];
const length = globalHandlers ? globalHandlers.length : 0;
let index = 0;
if (length) {
// Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.
while (index < length) {
if (!globalHandlers[index] || globalHandlers[index].skip) {
index += 1;
/* eslint-disable no-continue */
continue;
}
const res = (0, _function.fastCall)(globalHandlers[index], context, p1, p2, p3, p4, p5, p6);
if (res !== void 0) {
// eslint-disable-next-line no-param-reassign
p1 = res;
}
if (globalHandlers[index] && globalHandlers[index].runOnce) {
this.remove(key, globalHandlers[index]);
}
index += 1;
}
}
}
{
const localHandlers = this.getBucket(context)[key];
const length = localHandlers ? localHandlers.length : 0;
let index = 0;
if (length) {
// Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.
while (index < length) {
if (!localHandlers[index] || localHandlers[index].skip) {
index += 1;
/* eslint-disable no-continue */
continue;
}
const res = (0, _function.fastCall)(localHandlers[index], context, p1, p2, p3, p4, p5, p6);
if (res !== void 0) {
// eslint-disable-next-line no-param-reassign
p1 = res;
}
if (localHandlers[index] && localHandlers[index].runOnce) {
this.remove(key, localHandlers[index], context);
}
index += 1;
}
}
}
return p1;
}
/**
* Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.
*
* @param {object} [context=null] A Handsontable instance.
* @example
* ```js
* // destroy the global listeners
* Handsontable.hooks.destroy();
*
* // destroy the local listeners
* Handsontable.hooks.destroy(hotInstance);
* ```
*/
destroy() {
let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
// eslint-disable-next-line no-return-assign
(0, _object.objectEach)(this.getBucket(context), (value, key, bucket) => bucket[key].length = 0);
}
/**
* Registers a hook name (adds it to the list of the known hook names). Used by plugins.
* It is not necessary to call register, but if you use it, your plugin hook will be used returned by
* the `getRegistered` method. (which itself is used in the [demo](@/guides/getting-started/events-and-hooks.md)).
*
* @param {string} key The hook name.
*
* @example
* ```js
* Handsontable.hooks.register('myHook');
* ```
*/
register(key) {
if (!this.isRegistered(key)) {
REGISTERED_HOOKS.push(key);
}
}
/**
* Deregisters a hook name (removes it from the list of known hook names).
*
* @param {string} key The hook name.
*
* @example
* ```js
* Handsontable.hooks.deregister('myHook');
* ```
*/
deregister(key) {
if (this.isRegistered(key)) {
REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1);
}
}
/**
* Returns a boolean value depending on if a hook by such name has been removed or deprecated.
*
* @param {string} hookName The hook name to check.
* @returns {boolean} Returns `true` if the provided hook name was marked as deprecated or
* removed from API, `false` otherwise.
* @example
* ```js
* Handsontable.hooks.isDeprecated('skipLengthCache');
*
* // Results:
* true
* ```
*/
isDeprecated(hookName) {
return DEPRECATED_HOOKS.has(hookName) || REMOVED_HOOKS.has(hookName);
}
/**
* Returns a boolean depending on if a hook by such name has been registered.
*
* @param {string} hookName The hook name to check.
* @returns {boolean} `true` for success, `false` otherwise.
* @example
* ```js
* Handsontable.hooks.isRegistered('beforeInit');
*
* // Results:
* true
* ```
*/
isRegistered(hookName) {
return REGISTERED_HOOKS.indexOf(hookName) >= 0;
}
/**
* Returns an array of registered hooks.
*
* @returns {Array} An array of registered hooks.
*
* @example
* ```js
* Handsontable.hooks.getRegistered();
*
* // Results:
* [
* ...
* 'beforeInit',
* 'beforeRender',
* 'beforeSetRangeEnd',
* 'beforeDrawBorders',
* 'beforeChange',
* ...
* ]
* ```
*/
getRegistered() {
return REGISTERED_HOOKS;
}
}
const globalSingleton = new Hooks();
/**
* @returns {Hooks}
*/
function getGlobalSingleton() {
return globalSingleton;
}
var _default = Hooks;
exports.default = _default;