handsontable
Version:
Handsontable is a JavaScript Spreadsheet Component available for React, Angular and Vue.
1,349 lines (1,200 loc) • 106 kB
TypeScript
import { PikadayOptions } from 'pikaday';
/**
* @internal
* Omit properties K from T
*/
type Omit<T, K extends keyof T> = Pick<T, ({ [P in keyof T]: P } & { [P in K]: never } & { [x: string]: never, [x: number]: never })[keyof T]>;
// type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; // TS >= 2.8
declare namespace _Handsontable {
class Core {
constructor(element: Element, options: Handsontable.GridSettings);
addHook<K extends keyof Handsontable.Hooks.Events>(key: K, callback: Handsontable.Hooks.Events[K] | Handsontable.Hooks.Events[K][]): void;
addHookOnce<K extends keyof Handsontable.Hooks.Events>(key: K, callback: Handsontable.Hooks.Events[K] | Handsontable.Hooks.Events[K][]): void;
alter(action: 'insert_row' | 'insert_col' | 'remove_row' | 'remove_col', index?: number | Array<[number, number]>, amount?: number, source?: string, keepEmptyRows?: boolean): void;
clear(): void;
clearUndo(): void;
columnIndexMapper: Handsontable.RecordTranslation.IndexMapper;
colOffset(): number;
colToProp(col: number): string | number;
container: HTMLElement;
countCols(): number;
countEmptyCols(ending?: boolean): number;
countEmptyRows(ending?: boolean): number;
countRenderedCols(): number;
countRenderedRows(): number;
countRows(): number;
countSourceCols(): number;
countSourceRows(): number;
countVisibleCols(): number;
countVisibleRows(): number;
deselectCell(): void;
destroy(): void;
destroyEditor(revertOriginal?: boolean, prepareEditorIfNeeded?: boolean): void;
emptySelectedCells(): void;
batch(wrappedOperations: () => void): void;
forceFullRender: boolean;
getActiveEditor<T extends Handsontable._editors.Base>(): T | undefined;
getCell(row: number, col: number, topmost?: boolean): HTMLTableCellElement | null;
getCellEditor<T extends Handsontable._editors.Base>(row: number, col: number): T;
getCellEditor<T extends Handsontable._editors.Base>(cellMeta: Handsontable.CellMeta): T;
getCellMeta(row: number, col: number): Handsontable.CellProperties;
getCellMetaAtRow(row: number): Handsontable.CellProperties[];
getCellRenderer(row: number, col: number): Handsontable.renderers.Base;
getCellRenderer(cellMeta: Handsontable.CellMeta): Handsontable.renderers.Base;
getCellsMeta(): Handsontable.CellProperties[];
getCellValidator(row: number, col: number): Handsontable.validators.Base | RegExp | undefined;
getCellValidator(cellMeta: Handsontable.CellMeta): Handsontable.validators.Base | RegExp | undefined;
getColHeader(): (number | string)[];
getColHeader(col: number): number | string;
getColWidth(col: number): number;
getCoords(elem: Element | null): Handsontable.wot.CellCoords;
getCopyableData(row: number, column: number): string;
getCopyableText(startRow: number, startCol: number, endRow: number, endCol: number): string;
getData(row?: number, column?: number, row2?: number, column2?: number): Handsontable.CellValue[];
getDataAtCell(row: number, column: number): Handsontable.CellValue;
getDataAtCol(column: number): Handsontable.CellValue[];
getDataAtProp(prop: string | number): Handsontable.CellValue[];
getDataAtRow(row: number): Handsontable.CellValue[];
getDataAtRowProp(row: number, prop: string): Handsontable.CellValue;
getDataType(rowFrom: number, columnFrom: number, rowTo: number, columnTo: number): Handsontable.CellType | 'mixed';
getInstance(): Handsontable;
getPlugin<T extends keyof Handsontable.PluginsCollection>(pluginName: T): Handsontable.PluginsCollection[T];
getRowHeader(): (string | number)[];
getRowHeader(row: number): string | number;
getRowHeight(row: number): number;
getSchema(): Handsontable.RowObject;
getSelected(): Array<[number, number, number, number]> | undefined;
getSelectedLast(): number[] | undefined;
getSelectedRange(): Handsontable.wot.CellRange[] | undefined;
getSelectedRangeLast(): Handsontable.wot.CellRange | undefined;
getSettings(): Handsontable.GridSettings;
getSourceData(row?: number, column?: number, row2?: number, column2?: number): Handsontable.CellValue[][] | Handsontable.RowObject[];
getSourceDataArray(row?: number, column?: number, row2?: number, ccolumn2?: number): Handsontable.CellValue[][];
getSourceDataAtCell(row: number, column: number): Handsontable.CellValue;
getSourceDataAtCol(column: number): Handsontable.CellValue[];
getSourceDataAtRow(row: number): Handsontable.CellValue[] | Handsontable.RowObject;
getTranslatedPhrase(dictionaryKey: string, extraArguments: any): string | null;
getValue(): Handsontable.CellValue;
hasColHeaders(): boolean;
hasHook(key: keyof Handsontable.Hooks.Events): boolean;
hasRowHeaders(): boolean;
init(): () => void;
isColumnModificationAllowed(): boolean;
isDestroyed: boolean
isEmptyCol(col: number): boolean;
isEmptyRow(row: number): boolean;
isListening(): boolean;
isRedoAvailable(): boolean;
isUndoAvailable(): boolean;
listen(): void;
loadData(data: Handsontable.CellValue[][] | Handsontable.RowObject[]): void;
populateFromArray(row: number, col: number, input: Handsontable.CellValue[][], endRow?: number, endCol?: number, source?: string, method?: 'shift_down' | 'shift_right' | 'overwrite', direction?: 'left' | 'right' | 'up' | 'down', deltas?: any[]): void;
propToCol(prop: string | number): number;
redo(): void;
refreshDimensions(): void;
removeCellMeta(row: number, col: number, key: string): void;
removeCellMeta(row: number, col: number, key: keyof Handsontable.CellMeta): void;
removeHook<K extends keyof Handsontable.Hooks.Events>(key: K, callback: Handsontable.Hooks.Events[K]): void;
render(): void;
renderCall: boolean;
rootDocument: Document;
rootElement: HTMLElement;
rootWindow: Window;
rowIndexMapper: Handsontable.RecordTranslation.IndexMapper;
rowOffset(): number;
runHooks(key: keyof Handsontable.Hooks.Events, p1?: any, p2?: any, p3?: any, p4?: any, p5?: any, p6?: any): any;
// Requires TS 3.0:
// runHooks<K extends keyof Handsontable.Events>(key: K, ...params: Parameters<Handsontable.Events[K]>): ReturnType<Handsontable.Events[K]>;
scrollViewportTo(row?: number, column?: number, snapToBottom?: boolean, snapToRight?: boolean, considerHiddenIndexes?: boolean): boolean;
selectAll(): void;
selectCell(row: number, col: number, endRow?: number, endCol?: number, scrollToCell?: boolean, changeListener?: boolean): boolean;
selectCellByProp(row: number, prop: string, endRow?: number, endProp?: string, scrollToCell?: boolean): boolean;
selectCells(coords: Array<[number, number | string, number, number | string]> | Array<Handsontable.wot.CellRange>, scrollToCell?: boolean, changeListener?: boolean): boolean;
selectColumns(startColumn: number | string, endColumn?: number | string): boolean;
selectRows(startRow: number, endRow?: number): boolean;
setCellMeta(row: number, col: number, key: string, val: any): void;
setCellMeta<K extends keyof Handsontable.CellMeta>(row: number, col: number, key: K, val: Handsontable.CellMeta[K]): void;
setCellMetaObject<T extends Handsontable.CellMeta>(row: number, col: number, prop: T): void;
setDataAtCell(row: number, col: string | number, value: Handsontable.CellValue, source?: string): void;
setDataAtCell(changes: Array<[number, string | number, Handsontable.CellValue]>, source?: string): void;
setDataAtRowProp(row: number, prop: string, value: Handsontable.CellValue, source?: string): void;
setDataAtRowProp(changes: Array<[number, string | number, Handsontable.CellValue]>, source?: string): void;
setSourceDataAtCell(row: number, column: number | string, value: Handsontable.CellValue, source?: string): void;
setSourceDataAtCell(changes: [number, string | number, Handsontable.CellValue][]): void;
spliceCol(col: number, index: number, amount: number, ...elements: Handsontable.CellValue[]): void;
spliceRow(row: number, index: number, amount: number, ...elements: Handsontable.CellValue[]): void;
table: HTMLTableElement;
toHTML(): string;
toPhysicalColumn(column: number): number;
toPhysicalRow(row: number): number;
toVisualColumn(column: number): number;
toVisualRow(row: number): number;
toTableElement(): HTMLTableElement;
undo(): void;
undoRedo: Handsontable.UndoRedo;
unlisten(): void;
updateSettings(settings: Handsontable.GridSettings, init?: boolean): void;
validateCell(value: any, cellProperties: Handsontable.CellProperties, callback: (valid: boolean) => void, source: string): void;
validateCells(callback?: (valid: boolean) => void): void;
validateColumns(columns: number[], callback?: (valid: boolean) => void): void;
validateRows(rows: number[], callback?: (valid: boolean) => void): void;
}
}
declare namespace Handsontable {
// These types represent default known values, but users can extend with their own, leading to the need for assertions.
// Using type arguments (ex `GridSettings<CellValue, CellType, SourceData>`) would solve this and provide very strict
// type-checking, but adds a lot of noise for no benefit in the most common use cases.
/**
* A cell value, which can be anything to support custom cell data types, but by default is `string | number | boolean | undefined`.
*/
type CellValue = any;
/**
* A cell change represented by `[row, column, prevValue, nextValue]`.
*/
type CellChange = [number, string | number, CellValue, CellValue];
/**
* A row object, one of the two ways to supply data to the table, the alternative being an array of values.
* Row objects can have any data assigned to them, not just column data, and can define a `__children` array for nested rows.
*/
type RowObject = { [prop: string]: any };
/**
* A single row of source data, which can be represented as an array of values, or an object with key/value pairs.
*/
type SourceRowData = RowObject | CellValue[];
/**
* The default sources for which the table triggers hooks.
*/
type ChangeSource = 'auto' | 'edit' | 'loadData' | 'populateFromArray' | 'spliceCol' | 'spliceRow' | 'timeValidate' | 'dateValidate' | 'validateCells' | 'Autofill.fill' | 'ContextMenu.clearColumns' | 'ContextMenu.columnLeft' | 'ContextMenu.columnRight' | 'ContextMenu.removeColumn' | 'ContextMenu.removeRow' | 'ContextMenu.rowAbove' | 'ContextMenu.rowBelow' | 'CopyPaste.paste' | 'ObserveChanges.change' | 'UndoRedo.redo' | 'UndoRedo.undo' | 'ColumnSummary.set' | 'ColumnSummary.reset';
/**
* The default cell type aliases the table has built-in.
*/
type CellType = 'autocomplete' | 'checkbox' | 'date' | 'dropdown' | 'handsontable' | 'numeric' | 'password' | 'text' | 'time';
/**
* The default editor aliases the table has built-in.
*/
type EditorType = 'autocomplete' | 'checkbox' | 'date' | 'dropdown' | 'handsontable' | 'mobile' | 'password' | 'select' | 'text';
/**
* The default renderer aliases the table has built-in.
*/
type RendererType = 'autocomplete' | 'checkbox' | 'html' | 'numeric' | 'password' | 'text';
/**
* The default validator aliases the table has built-in.
*/
type ValidatorType = 'autocomplete' | 'date' | 'numeric' | 'time';
namespace wot {
interface CellCoords {
col: number;
row: number;
}
interface CellRange {
highlight: CellCoords;
from: CellCoords;
to: CellCoords;
}
type OverlayType = 'top' | 'bottom' | 'left' | 'top_left_corner' | 'bottom_left_corner';
}
namespace cellTypes {
interface Autocomplete {
editor: typeof _editors.Autocomplete;
renderer: renderers.Autocomplete;
validator: validators.Autocomplete;
}
interface Checkbox {
editor: typeof _editors.Checkbox;
renderer: renderers.Checkbox;
}
interface Date {
editor: typeof _editors.Date;
renderer: renderers.Autocomplete;
validator: validators.Date
}
interface Dropdown {
editor: typeof _editors.Dropdown;
renderer: renderers.Autocomplete;
validator: validators.Autocomplete;
}
interface Handsontable {
editor: typeof _editors.Handsontable;
renderer: renderers.Autocomplete;
}
interface Numeric {
dataType: string;
editor: typeof _editors.Numeric;
renderer: renderers.Numeric;
validator: validators.Numeric;
}
interface Password {
copyable: boolean;
editor: typeof _editors.Password;
renderer: renderers.Password;
}
interface Text {
editor: typeof _editors.Text;
renderer: renderers.Text;
}
interface Time {
editor: typeof _editors.Text;
renderer: renderers.Text;
validator: validators.Time;
}
}
/**
* The "_editor" namespace is named to avoid circular reference conflict with "Handsontable.editors" namespace.
* The other namespaces (renderers, validators, etc) don't need this because they don't expose values (classes), just types (interfaces).
* Note that TS will think it can use the values defined here, ex `new Handsontable._editors.Base()` compiles, but this is wrong.
* TODO: This would be better solved by moving all types outside the exported namespaces. (Separate type definition from type publication.)
*/
namespace _editors {
type EditorState =
'STATE_VIRGIN' | // before editing
'STATE_EDITING' |
'STATE_WAITING' | // waiting for async validation
'STATE_FINISHED';
abstract class Base {
hot: _Handsontable.Core;
instance: _Handsontable.Core;
row: number;
col: number;
prop: string | number;
TD: HTMLTableCellElement;
originalValue: any;
cellProperties: CellProperties;
state: EditorState;
constructor(hotInstance: _Handsontable.Core, row: number, col: number, prop: string | number, TD: HTMLTableCellElement, cellProperties: CellProperties)
beginEditing(initialValue?: any, event?: Event): void;
cancelChanges(): void;
checkEditorSection(): 'top-left-corner' | 'top' | 'bottom-left-corner' | 'bottom' | 'left' | '';
abstract close(): void;
discardEditor(validationResult?: boolean): void;
enableFullEditMode(): void;
extend<T extends _editors.Base>(): T;
finishEditing(restoreOriginalValue?: boolean, ctrlDown?: boolean, callback?: () => void): void;
abstract focus(): void;
getEditedCell(): HTMLTableCellElement | null;
getEditedCellsZIndex(): string;
abstract getValue(): any;
init(): void;
isInFullEditMode(): boolean;
isOpened(): boolean;
isWaiting(): boolean;
abstract open(event?: Event): void;
prepare(row: number, col: number, prop: string | number, TD: HTMLTableCellElement, originalValue: any, cellProperties: CellProperties): void;
saveValue(val?: any, ctrlDown?: boolean): void;
abstract setValue(newValue?: any): void;
}
class Checkbox extends Base {
close(): void;
focus(): void;
getValue(): any;
open(): void;
setValue(newValue?: any): void;
}
class Mobile extends Base {
close(): void;
focus(): void;
getValue(): any;
open(): void;
setValue(newValue?: any): void;
hideCellPointer(): void;
onBeforeKeyDown(event?: KeyboardEvent): void;
prepareAndSave(): void;
scrollToView(): void;
updateEditorData(): void;
updateEditorPosition(x?: number, y?: number): void;
valueChanged(): boolean;
}
class Select extends Base {
close(): void;
focus(): void;
getValue(): any;
open(): void;
setValue(newValue?: any): void;
prepareOptions(optionsToPrepare?: RowObject | CellValue[]): void;
refreshDimensions(): void;
refreshValue(): void;
registerHooks(): void;
}
class Text extends Base {
close(): void;
focus(): void;
getValue(): any;
open(): void;
setValue(newValue?: any): void;
bindEvents(): void;
createElements(): void;
destroy(): void;
hideEditableElement(): void;
showEditableElement(): void;
refreshDimensions(force?: boolean): void;
refreshValue(): void;
TEXTAREA: HTMLInputElement;
TEXTAREA_PARENT: HTMLElement;
textareaStyle: CSSStyleDeclaration;
}
class Date extends Text {
destroyElements(): void;
getDatePickerConfig(): PikadayOptions;
hideDatepicker(): void;
open(event?: Event): void;
showDatepicker(event?: Event): void;
}
class Handsontable extends Text {
assignHooks(): void;
}
class Numeric extends Text { }
class Password extends Text { }
class Autocomplete extends Handsontable {
allowKeyEventPropagation(keyCode?: number): boolean;
flipDropdown(dropdownHeight?: number): void;
flipDropdownIfNeeded(): void;
getDropdownHeight(): number;
highlightBestMatchingChoice(index?: number): void;
limitDropdownIfNeeded(spaceAvailable?: number, dropdownHeight?: number): void;
queryChoices(query?: string): void;
sortByRelevance(value?: CellValue, choices?: CellValue[], caseSensitive?: boolean): any[];
setDropdownHeight(height?: number): void;
updateChoicesList(choices?: CellValue[]): void;
unflipDropdown(): void;
updateDropdownHeight(): void;
}
class Dropdown extends Autocomplete { }
}
namespace plugins {
// utils for Filters
namespace FiltersPlugin {
type OperationType = 'conjunction' | 'disjunction';
type ConditionName = 'begins_with' | 'between' | 'by_value' | 'contains' | 'empty' | 'ends_with' | 'eq' | 'gt' |
'gte' | 'lt' | 'lte' | 'not_between' | 'not_contains' | 'not_empty' | 'neq';
type ColumnConditions = {
column: number;
conditions: Handsontable.plugins.FiltersPlugin.ConditionId[];
operation: Handsontable.plugins.FiltersPlugin.OperationType;
}
interface ConditionId {
args: any[];
name?: ConditionName;
command?: {
key: ConditionName;
}
}
interface Condition {
name: ConditionName;
args: any[];
func: (dataRow: CellValue, values: any[]) => boolean;
}
interface CellLikeData {
meta: {
row: number;
col: number;
visualCol: number;
visualRow: number;
type: string;
instance: _Handsontable.Core;
dateFormat?: string;
};
value: string;
}
interface BaseComponent {
hot: _Handsontable.Core;
id: string;
hidden: boolean;
stateId: string;
state: RecordTranslation.IndexMap;
elements: any[];
restoreState(): void;
setState(state: any): void;
saveState(physicalColumn: number): void;
getState(): any;
destroy(): boolean;
hide(): void;
isHidden(): boolean;
reset(): void;
show(): void;
}
interface ActionBarComponent extends BaseComponent {
getMenuItemDescriptor(): object;
accept(): void;
cancel(): void;
}
interface ConditionComponent extends BaseComponent {
getInputElement(index?: number): InputUI;
getInputElements(): InputUI[];
getMenuItemDescriptor(): object;
getSelectElement(): SelectUI;
getState(): object;
setState(value: object): void;
updateState(stateInfo: object): void;
}
interface ValueComponent extends BaseComponent {
getMenuItemDescriptor(): object;
getMultipleSelectElement(): MultipleSelectUI;
getState(): object;
setState(value: object): void;
updateState(stateInfo: object): void;
}
interface BaseUI {
buildState: boolean;
eventManager: EventManager;
hot: _Handsontable.Core;
options: object;
build(): void;
destroy(): void;
element(): Element;
focus(): void;
getValue(): any;
hide(): void;
isBuilt(): boolean;
reset(): void;
setValue(value: any): any;
show(): void;
update(): void;
}
interface InputUI extends BaseUI { }
interface MultipleSelectUI extends BaseUI {
clearAllUI: BaseUI;
items: any[];
itemsBox: _Handsontable.Core;
searchInput: InputUI;
selectAllUI: BaseUI;
getItems(): void;
getValue(): any[];
isSelectedAllValues(): boolean;
setItems(items: any[]): void;
}
interface SelectUI extends BaseUI {
menu: Menu | void;
items: any[];
setItems(items: any[]): void;
openOptions(): void;
closeOptions(): void;
}
interface ConditionCollection {
hot: _Handsontable.Core;
isMapRegistrable: boolean;
filteringStates: RecordTranslation.IndexMap;
addCondition(column: number, conditionDefinition: ConditionId, operation?: OperationType, position?: number): void;
clean(): void;
destroy(): void;
exportAllConditions(): ConditionId[];
getConditions(column: number): Condition[];
getFilteredColumns(): number[];
getColumnStackPosition(column: number): number | void;
getOperation(column: number): void | OperationType;
hasConditions(column: number, name: string): boolean;
isEmpty(): boolean;
isMatch(value: CellLikeData, column: number): boolean;
isMatchInConditions(conditions: Condition[], value: CellLikeData, operationType?: OperationType): boolean;
importAllConditions(conditions: ConditionId[]): void;
removeConditions(column: number): void;
}
interface ConditionUpdateObserver {
hot: _Handsontable.Core;
changes: number[];
columnDataFactory: (column: number) => object[];
conditionCollection: ConditionCollection;
grouping: boolean;
latestEditedColumnPosition: number;
latestOrderStack: number[];
destroy(): void;
flush(): void;
groupChanges(): void;
updateStatesAtColumn(column: number, conditionArgsChange: object): void;
}
}
interface BindStrategy {
klass: () => void;
strategy: string | void;
clearMap(): void;
createMap(length: number): void;
createRow(params: any): void;
destroy(): void;
removeRow(params: any): void;
setStrategy(name: string): void;
translate(params: any): void;
}
interface CommandExecutor {
hot: _Handsontable.Core;
commands: object;
commonCallback: (() => void) | void;
registerCommand(name: string, commandDescriptor: object): void;
setCommonCallback(callback: () => void): void;
execute(commandName: string, ...params: any[]): void;
}
interface Cursor {
cellHeight: number;
cellWidth: number;
left: number;
leftRelative: number;
rootWindow: Window;
scrollLeft: number;
scrollTop: number;
top: number;
topRelative: number;
type: string;
fitsAbove(element: HTMLElement): boolean;
fitsBelow(element: HTMLElement, viewportHeight?: number): boolean;
fitsOnLeft(element: HTMLElement): boolean;
fitsOnRight(element: HTMLElement, viewportHeight?: number): boolean;
getSourceType(object: any): string;
}
interface Endpoints {
plugin: plugins.ColumnSummary;
hot: _Handsontable.Core;
endpoints: Endpoint[];
settings: object | (() => void);
settingsType: string;
currentEndpoint: object | void;
assignSetting(settings: object, endpoint: object, name: string, defaultValue: any): void;
getAllEndpoints(): any[];
getEndpoint(index: number): object;
parseSettings(settings: any[]): void;
refreshAllEndpoints(init: boolean): void;
refreshChangedEndpoints(changes: any[]): void;
refreshEndpoint(endpoint: object): void;
resetAllEndpoints(endpoints: any[], useOffset?: boolean): void;
resetEndpointValue(endpoint: object, useOffset?: boolean): void;
setEndpointValue(endpoint: object, source: string, render?: boolean): void;
}
interface Endpoint {
destinationRow: number;
destinationColumn: number;
forceNumeric: boolean;
reversedRowCoords: boolean;
suppressDataTypeErrors: boolean;
readOnly: boolean;
roundFloat: boolean;
ranges: number[][];
sourceColumn: number;
type: 'sum' | 'min' | 'max' | 'count' | 'average' | 'custom';
result: number;
customFunction: ((this: ColumnSummary, endpoint: Endpoint) => number) | null;
}
interface EventManager {
context?: object;
addEventListener(element: Element, eventName: string, callback: (event: Event) => void): () => void;
removeEventListener(element: Element, eventName: string, callback: (event: Event) => void): void;
clearEvents(): void;
clear(): void;
destroy(): void;
fireEvent(element: Element, eventName: string): void;
extendEvent(context: object, event: Event): any;
}
interface GhostTable {
columns: number[];
container: HTMLElement | null;
hot: _Handsontable.Core;
injected: boolean;
rows: object[];
samples: object | null;
settings: object;
addRow(row: number, samples: object): void;
addColumn(column: number, samples: object): void;
addColumnHeadersRow(samples: object): void;
clean(): void;
createCol(column: number): DocumentFragment;
createColElement(column: number): HTMLElement;
createColGroupsCol(): DocumentFragment;
createColumnHeadersRow(): DocumentFragment;
createContainer(className?: string): object;
createRow(row: number): DocumentFragment;
createTable(className?: string): object;
getHeights(callback: (row: number, height: number) => void): void;
getWidths(callback: (row: number, height: number) => void): void;
getSettings(): object | void;
getSetting(name: string): boolean | void;
injectTable(parent?: HTMLElement | void): void;
isHorizontal(): boolean;
isVertical(): boolean;
removeTable(): void;
setSettings(settings: GridSettings): void;
setSetting(name: string, value: any): void;
}
interface ItemsFactory {
defaultOrderPattern: any[] | void;
hot: _Handsontable.Core;
predefinedItems: object;
getItems(pattern?: any[] | object | boolean): any[];
setPredefinedItems(predefinedItems: any[]): void;
}
interface Menu {
container: HTMLElement;
eventManager: EventManager;
hot: _Handsontable.Core;
hotMenu: _Handsontable.Core;
hotSubMenus: object;
keyEvent: boolean;
menuItems: any[] | null;
offset: object;
options: object;
origOutsideClickDeselects: boolean | (() => void);
parentMenu: Menu | null;
close(closeParent?: boolean): void;
closeSubMenu(row: number): void;
closeAllSubMenus(): void;
destroy(): void;
executeCommand(event: Event): void;
isOpened(): boolean;
isSubMenu(): boolean;
open(): void;
openSubMenu(row: number): Menu | boolean;
setMenuItems(menuItems: any[]): void;
setOffset(area: string, offset?: number): void;
selectLastCell(): void;
selectFirstCell(): void;
selectPrevCell(row: number, col: number): void;
selectNextCell(row: number, col: number): void;
setPosition(coords: Event | object): void;
setPositionAboveCursor(cursor: Cursor): void;
setPositionBelowCursor(cursor: Cursor): void;
setPositionOnLeftOfCursor(cursor: Cursor): void;
setPositionOnRightOfCursor(cursor: Cursor): void;
}
interface SamplesGenerator {
allowDuplicates: boolean | null;
customSampleCount: boolean | null;
dataFactory: () => void;
samples: object | null;
generateColumnSamples(colRange: object, rowRange: object): object;
generateRowSamples(rowRange: object | number, colRange: object): object;
generateSamples(type: string, range: object, specifierRange: object | number): object;
generateSample(type: string, range: object, specifierValue: number): object
getSampleCount(): number;
setAllowDuplicates(allowDuplicates: boolean): void;
setSampleCount(sampleCount: number): void;
}
class Base {
pluginName: string;
pluginsInitializedCallback: any[];
isPluginsReady: boolean;
enabled: boolean;
initialized: boolean;
hot: _Handsontable.Core;
constructor(hotInstance?: _Handsontable.Core)
addHook(name: string, callback: (...args: any[]) => any): void;
callOnPluginsReady(callback: () => void): void;
clearHooks(): void;
destroy(): void;
isEnabled(): boolean;
disablePlugin(): void;
enablePlugin(): void;
updatePlugin(): void;
init(): void;
removeHooks(name: string): void;
}
interface Base {
new(hotInstance?: _Handsontable.Core): Base;
}
interface AutoColumnSize extends Base {
firstCalculation: boolean;
ghostTable: GhostTable;
inProgress: boolean;
measuredRows: number;
samplesGenerator: SamplesGenerator;
calculateAllColumnsWidth(rowRange?: number | object): void;
calculateColumnsWidth(colRange?: number | object, rowRange?: number | object, force?: boolean): void;
calculateVisibleColumnsWidth(): void;
clearCache(columns?: any[]): void;
findColumnsWhereHeaderWasChanged(): any[];
getColumnWidth(col: number, defaultWidth?: number, keepMinimum?: boolean): number;
getFirstVisibleColumn(): number;
getLastVisibleColumn(): number;
getSyncCalculationLimit(): number;
isNeedRecalculate(): boolean;
recalculateAllColumnsWidth(): void;
}
interface AutoRowSize extends Base {
firstCalculation: boolean;
heights: any[];
ghostTable: GhostTable;
inProgress: boolean;
measuredColumns: number;
sampleGenerator: SamplesGenerator;
calculateAllRowsHeight(colRange?: number | object): void;
calculateRowsHeight(rowRange?: number | object, colRange?: number | object, force?: boolean): void;
clearCache(): void;
clearCacheByRange(range: number | object): void;
findColumnsWhereHeaderWasChanged(): any[];
getColumnHeaderHeight(): number | void;
getFirstVisibleRow(): number;
getLastVisibleRow(): number;
getRowHeight(col: number, defaultHeight?: number): number;
getSyncCalculationLimit(): number;
isNeedRecalculate(): boolean;
recalculateAllRowsHeight(): void;
}
interface Autofill extends Base {
addingStarted: boolean;
autoInsertRow: boolean;
directions: string[];
eventManager: EventManager;
handleDraggedCells: number;
mouseDownOnCellCorner: boolean;
mouseDragOutside: boolean;
}
interface BindRowsWithHeaders extends Base {
bindStrategy: BindStrategy;
removeRows: any[];
}
interface CollapsibleColumns extends Base {
buttonEnabledList: Map<number, Set<number>>;
collapsableCoordsList: Map<number, Set<number>>;
collapsedColumns: number[];
collapsedSections: Map<number, any[]>;
columnHeaderLevelCount: number;
eventManager: EventManager;
hiddenColumnsPlugin: object;
nestedHeadersPlugin: object;
settings: boolean | any[];
checkDependencies(): void;
collapseAll(): void;
collapseSection(coords: object): void;
expandAll(): void;
expandSection(coords: object): void;
generateIndicator(col: number, TH: HTMLElement): HTMLElement;
markSectionAs(state: string, row: number, column: number, recursive: boolean): void;
meetsDependencies(): boolean;
parseSettings(): void;
toggleAllCollapsibleSections(action: string): void;
toggleCollapsibleSection(coords: Array<object>, action: string): void;
}
interface ColumnSorting extends Base {
clearSort(): void;
destroy(): void;
getSortConfig(column: number): void | columnSorting.Config
getSortConfig(): Array<columnSorting.Config>
isSorted(): boolean;
setSortConfig(sortConfig?: columnSorting.Config | Array<columnSorting.Config>): void;
sort(sortConfig?: columnSorting.Config): void;
}
interface ColumnSummary extends Base {
endpoints: Endpoints | void;
calculate(endpoint: Endpoints): void;
calculateAverage(endpoint: Endpoints): number;
calculateMinMax(endpoint: Endpoints, type: string): number;
calculateSum(endpoint: Endpoints): void;
countEmpty(rowRange: any[], col: number): number;
countEntries(endpoint: Endpoints): number;
getCellValue(row: number, col: number): string;
getPartialMinMax(rowRange: any[], col: number, type: string): number;
getPartialSum(rowRange: any[], col: number): number;
}
type CommentsRangeObject = {
from: wot.CellCoords;
to?: wot.CellCoords;
}
interface Comments extends Base {
contextMenuEvent: boolean;
displayDelay: number;
editor: CommentEditor;
eventManager: EventManager;
mouseDown: boolean;
range: CommentsRangeObject;
timer: any;
clearRange(): void;
getComment(): string;
getCommentAtCell(row: number, column: number): string | undefined;
getCommentMeta(row: number, column: number, property: string): any;
hide(): void;
refreshEditor(force?: boolean): void;
removeComment(forceRender?: boolean): void;
removeCommentAtCell(row: number, col: number, forceRender?: boolean): void;
setComment(value: string): void;
setCommentAtCell(row: number, col: number, value: string): void;
setRange(range: CommentsRangeObject): void;
show(): boolean;
showAtCell(row: number, col: number): boolean;
targetIsCellWithComment(event: Event): boolean;
targetIsCommentTextArea(event: Event): boolean;
updateCommentMeta(row: number, column: number, metaObject: object): void;
}
interface CommentEditor {
editor: HTMLElement;
editorStyle: CSSStyleDeclaration;
hidden: boolean;
rootDocument: Document;
setPosition(x: number, y: number): void;
setSize(width: number, height: number): void;
resetSize(): void;
setReadOnlyState(state: boolean): void;
show(): void;
hide(): void;
isVisible(): boolean;
setValue(value?: string): void;
getValue(): string;
isFocused(): boolean;
focus(): void;
createEditor(): HTMLElement;
getInputElement(): HTMLElement;
destroy(): void;
}
interface ContextMenu extends Base {
DEFAULT_ITEMS: contextMenu.PredefinedMenuItemKey[];
SEPARATOR: SeparatorObject;
eventManager: EventManager;
commandExecutor: CommandExecutor;
itemsFactory: ItemsFactory | void;
menu: Menu | void;
close(): void;
executeCommand(commandName: string, ...params: any[]): void;
open(event: Event): void;
}
interface FocusableWrapper {
eventManager: EventManager;
listenersCount: WeakSet<HTMLElement>;
mainElement: HTMLElement;
rootDocument: Document;
useSecondaryElement(): void;
setFocusableElement(element: HTMLElement): void;
getFocusableElement(): HTMLElement;
focus(): void;
}
type PasteModeType = 'overwrite' | 'shift_down' | 'shift_right';
type RangeType = { startRow: number, startCol: number, endRow: number, endCol: number };
interface CopyPaste extends Base {
columnsLimit: number;
copyableRanges: any[];
focusableElement: FocusableWrapper;
pasteMode: PasteModeType;
rowsLimit: number;
uiContainer: HTMLElement;
copy(): void;
cut(): void;
getRangedCopyableData(ranges: RangeType[]): string;
getRangedData(ranges: RangeType[]): any[];
paste(pastableText?: string, pastableHtml?: string): void;
setCopyableText(): void;
}
interface CustomBorders extends Base {
savedBorderSettings: any[];
setBorders(selection: Range[] | Array<[number, number, number, number]>, borderObject: object): void;
getBorders(selection: Range[] | Array<[number, number, number, number]>): Array<[object]>;
clearBorders(selection: Range[] | Array<[number, number, number, number]>): void;
}
interface DragToScroll extends Base {
boundaries: object | void;
callback: (() => void) | void;
check(x: number, y: number): void;
setBoundaries(boundaries: object): void;
setCallback(callback: () => void): void;
}
type SeparatorObject = {
name: string;
}
interface DropdownMenu extends Base {
eventManager: EventManager;
commandExecutor: CommandExecutor;
itemsFactory: ItemsFactory | void;
menu: Menu | void;
SEPARATOR: SeparatorObject
close(): void;
executeCommand(commandName: string, ...params: any[]): void;
open(event: Event): void;
}
interface ExportFile extends Base {
downloadFile(format: string, options: object): void;
exportAsString(format: string, options?: object): string;
exportAsBlob(format: string, options?: object): Blob;
}
interface Filters extends Base {
actionBarComponent: FiltersPlugin.ActionBarComponent | void;
dropdownMenuPlugin: DropdownMenu | void;
eventManager: EventManager;
conditionComponent: FiltersPlugin.ConditionComponent | void;
conditionCollection: FiltersPlugin.ConditionCollection | void;
conditionUpdateObserver: FiltersPlugin.ConditionUpdateObserver | void;
lastSelectedColumn?: number | void;
trimRowsPlugin: TrimRows | void;
valueComponent: FiltersPlugin.ValueComponent | void;
addCondition(column: number, name: string, args: any[], operationId?: FiltersPlugin.OperationType): void;
clearColumnSelection(): void;
clearConditions(column?: number | void): void;
getDataMapAtColumn(column: number): FiltersPlugin.CellLikeData[];
getSelectedColumn(): number | void;
filter(): void;
removeConditions(column: number): void;
}
interface DataProvider {
changes: object;
hot: _Handsontable.Core;
clearChanges(): void;
collectChanges(row: number, column: number, value: any): void;
destroy(): void;
getDataAtCell(row: number, column: number): any;
getDataByRange(row1: number, column1: number, row2: number, column2: number): any[];
getRawDataAtCell(row: number, column: number): any;
getRawDataByRange(row1: number, column1: number, row2: number, column2: number): any[];
getSourceDataByRange(row1: number, column1: number, row2: number, column2: number): any[];
getSourceDataAtCell(row: number, column: number): any;
isInDataRange(row: number, column: number): boolean;
updateSourceData(row: number, column: number, value: any): void;
}
interface AlterManager {
sheet: Sheet;
hot: _Handsontable.Core;
dataProvider: DataProvider;
matrix: Matrix;
prepareAlter(action: string, args: any): void;
triggerAlter(action: string, args: any): void;
destroy(): void;
}
interface Matrix {
data: any[];
cellReferences: any[];
getCellAt(row: number, column: number): CellValue | void;
getOutOfDateCells(): any[];
add(cellValue: CellValue | object): void;
remove(cellValue: CellValue | object | any[]): void;
getDependencies(cellCoord: object): void;
registerCellRef(cellReference: CellReference | object): void;
removeCellRefsAtRange(start: object, end: object): any[];
reset(): void;
}
interface BaseCell {
columnAbsolute: boolean;
columnOffset: number;
rowAbsolute: boolean;
rowOffset: number;
isEqual(cell: BaseCell): boolean;
toString(): string;
translateTo(rowOffset: number, columnOffset: number): void;
}
interface CellReference extends BaseCell { }
interface CellValue extends BaseCell {
error: string | void;
precedents: any[];
state: string;
value: any;
addPrecedent(cellReference: CellReference): void;
clearPrecedents(): void;
getError(): string | void;
getPrecedents(): any[];
getValue(): any;
hasError(): boolean;
hasPrecedent(cellReference: CellReference): boolean;
hasPrecedents(): boolean;
isState(state: number): boolean;
removePrecedent(cellReference: CellReference): void;
setError(error: string): void;
setState(state: number): void;
setValue(value: any): void;
}
type Parser = {};
interface Sheet {
alterManager: AlterManager
dataProvider: DataProvider;
hot: _Handsontable.Core;
matrix: Matrix;
parser: Parser;
applyChanges(row: number, column: number, newValue: any): void;
destroy(): void;
getCellAt(row: number, column: number): CellValue | void;
getCellDependencies(row: number, column: number): any[];
getVariable(name: string): any;
parseExpression(cellValue: CellValue | object, formula: string): void;
recalculate(): void;
recalculateFull(): void;
recalculateOptimized(): void;
setVariable(name: string, value: any): void;
}
interface Stack {
items: any[];
isEmpty(): boolean;
peek(): any;
pop(): any;
push(items: any): void;
size(): number;
}
interface UndoRedoSnapshot {
sheet: Sheet;
stack: Stack;
destroy(): void;
restore(): void;
save(axis: string, index: number, amount: number): void;
}
namespace UndoRedoAction {
type Change = {
actionType: 'change';
changes: CellChange[];
selected: [number, number][]
};
type InsertRow = {
actionType: 'insert_row';
amount: number;
index: number;
}
type RemoveRow = {
actionType: 'remove_row';
index: number;
data: CellValue[][];
}
type InsertCol = {
actionType: 'insert_col';
amount: number;
index: number;
}
type RemoveCol = {
actionType: 'remove_col';
amount: number;
columnPositions: number[];
index: number;
indexes: number[];
headers: string[];
data: CellValue[][];
}
type Filter = {
actionType: 'filter';
conditionsStack: FiltersPlugin.ColumnConditions[];
}
}
type UndoRedoAction = UndoRedoAction.Change | UndoRedoAction.InsertRow | UndoRedoAction.RemoveRow | UndoRedoAction.InsertCol | UndoRedoAction.RemoveCol | UndoRedoAction.Filter;
interface Formulas extends Base {
dataProvider: DataProvider;
eventManager: EventManager;
sheet: Sheet;
undoRedoSnapshot: UndoRedoSnapshot;
getCellValue(row: number, column: number): any;
getVariable(name: string): any;
hasComputedCellValue(row: number, column: number): boolean;
recalculate(): void;
recalculateFull(): void;
recalculateOptimized(): void;
setVariable(name: string, value: any): void;
}
interface HeaderTooltips extends Base {
settings: boolean | object;
parseSettings(): void;
}
interface HiddenColumns extends Base {
isHidden(column: number): boolean;
hideColumn(column: number): void;
hideColumns(columns: number[]): void;
showColumn(column: number): void;
showColumns(columns: number[]): void;
getHiddenColumns(): number[];
isValidConfig(hiddenColumns: number[]): boolean;
}
interface HiddenRows extends Base {
isHidden(row: number): boolean;
hideRow(row: number): void;
hideRows(rows: number[]): void;
showRow(row: number): void;
showRows(rows: number[]): void;
getHiddenRows(): number[];
isValidConfig(hiddenRows: number[]): boolean;
}
interface ManualColumnFreeze extends Base {
freezeColumn(column: number): void;
unfreezeColumn(column: number): void;
}
interface MultiColumnSorting extends Base {
clearSort(): void;
destroy(): void;
getSortConfig(column: number): void | columnSorting.Config;
getSortConfig(): Array<columnSorting.Config>;
isSorted(): boolean;
setSortConfig(sortConfig?: columnSorting.Config | Array<columnSorting.Config>): void;
sort(sortConfig?: columnSorting.Config | Array<columnSorting.Config>): void;
}
namespace moveUI {
interface BaseUI {
hot: _Handsontable.Core;
state: number;
appendTo(wrapper: HTMLElement): void;
build(): void;
destroy(): void;
getOffset(): object;
getPosition(): object;
getSize(): object;
isAppended(): boolean;
isBuilt(): boolean;
setOffset(top: number, left: number): void;
setPosition(top: number, left: number): void;
setSize(width: number, height: number): void;
}
interface BacklightUI extends BaseUI { }
interface GuidelineUI extends BaseUI { }
}
interface MergeCells extends Base {
mergedCellsCollection: MergeCellsPlugin.MergedCellsCollection;
autofillCalculations: MergeCellsPlugin.AutofillCalculations;
selectionCalculations: MergeCellsPlugin.SelectionCalculations;
clearCollections(): void;
mergeSelection(cellRange: wot.CellRange): void;
merge(startRow: number, startColumn: number, endRow: number, endColumn: number): void;
unmerge(startRow: number, startColumn: number, endRow: number, endColumn: number): void;
}
namespace MergeCellsPlugin {
interface AutofillCalculations {
plugin: MergeCells;
mergedCellsCollection: MergeCellsPlugin.MergedCellsCollection;
currentFillData: object;
correctSelectionAreaSize(selectionArea: number[]): void;
getDirection(selectionArea: number[], finalArea: number[]): string;
snapDragArea(baseArea: number[], dragArea: number[], dragDirection: string, foundMergedCells: MergeCellsPlugin.MergedCellCoords[]): number[];
recreateAfterDataPopulation(changes: any[]): void;
dragAreaOverlapsCollections(baseArea: number[], fullArea: number[], direction: string): boolean;
}
interface SelectionCalculations {
snapDelta(delta: object, selectionRange: wot.CellRange, mergedCell: MergeCellsPlugin.MergedCellCoords): void;
getUpdatedSelectionRange(oldSelectionRange: wot.CellRange, delta: object): wot.CellRange;
}
interface MergedCellCoords {
row: number;
col: number;
rowspan: number;
colspan: number;
removed: boolean;
normalize(hotInstance: _Handsontable.Core): void;
includes(row: number, column: number): boolean;
includesHorizontally(column: number): boolean;
includesVertically(row: number): boolean;
shift(shiftVector: number[], indexOfChange: number): boolean;
isFarther(mergedCell: MergeCellsPlugin.MergedCellCoords, direction: string): boolean | void;
getLastRow(): number;
getLastColumn(): number;
getRange(): wot.CellRange;
}
interface MergedCellsCollection {
plugin: MergeCells;
mergedCells: MergeCellsPlugin.MergedCellCoords[];
hot: _Handsontable.Core;
get(row: number, column: number): MergeCellsPlugin.MergedCellCoords | boolean;
getByRange(range: wot.CellRange | object): MergeCellsPlugin.MergedCellCoords | boolean;
getWithinRange(range: wot.CellRange | object, countPartials: boolean): MergeCellsPlugin.MergedCellCoords[] | boolean;
add(mergedCellInfo: object): MergeCellsPlugin.MergedCellCoords | boolean;
remove(row: number, column: number): MergeCellsPlugin.MergedCellCoords | boolean;
clear(): void;
isOverlapping(mergedCell: MergeCellsPlugin.MergedCellCoords): boolean;
isFirstRenderableMergedCell(row: number, column: number): boolean;
shiftCollections(direction: string, index: number, count: number): void;
}
}
interface ManualColumnMove extends Base {
backlight: moveUI.BacklightUI;
eventManager: EventManager;
guideline: moveUI.GuidelineUI;
moveColumn(column: number, finalIndex: number): boolean;
moveColumns(columns: number[], finalIndex: number): boolean;
dragColumn(column: number, dropIndex: number): boolean;
dragColumns(columns: number[], dropIndex: number): boolean;
isMovePossible(columns: number[], finalIndex: number): boolean;
}
interface ManualColumnResize extends Base {
autoresizeTimeout: (() => void) | void;
currentCol: number | void;
currentTH: HTMLElement | void;
currentWidth: number | void;
dblclick: number;
eventManager: EventManager;
guide: HTMLElement;
handle: HTMLElement;
manualColumnWidths: any[];
newSize: number | void;
pressed: _Handsontable.Core | void;
selectedCols: any[];
startOffset: number | void;
startWidth: number | void;
startY: number | void;
checkIfColumnHeader(element: HTMLElement): boolean;
clearManualSize(column: number): void;
getClosestTHParent(element: HTMLEle