import { KeyboardEvent, ReactNode } from 'react'; import { List } from 'immutable'; import { HeaderRowType, UpdateActions } from './enums'; export declare type Omit = Pick>; export declare type SelectedRow = TRow & { isSelected: boolean; }; interface ColumnValue { /** The name of the column. By default it will be displayed in the header cell */ name: string; /** A unique key to distinguish each column */ key: TField; /** Column width. If not specified, it will be determined automatically based on grid width and specified widths of other columns*/ width?: number; hidden?: boolean; cellClass?: string; /** By adding an event object with callbacks for the native react events you can bind events to a specific column. That will not break the default behaviour of the grid and will run only for the specified column */ events?: { [key: string]: undefined | ((e: Event, info: ColumnEventInfo) => void); }; /** Formatter to be used to render the cell content */ formatter?: React.ReactElement | React.ComponentType>; /** Enables cell editing. If set and no editor property specified, then a textinput will be used as the cell editor */ editable?: boolean | ((rowData: TRow) => boolean); /** Enable dragging of a column */ draggable?: boolean; /** Enable filtering of a column */ filterable?: boolean; /** Determines whether column is frozen or not */ frozen?: boolean; /** Enable resizing of a column */ resizable?: boolean; /** Enable sorting of a column */ sortable?: boolean; /** Sets the column sort order to be descending instead of ascending the first time the column is sorted */ sortDescendingFirst?: boolean; /** Editor to be rendered when cell of column is being edited. If set, then the column is automatically set to be editable */ editor?: React.ReactElement | React.ComponentType>; /** Header renderer for each header cell */ headerRenderer?: React.ReactElement | React.ComponentType>; /** Component to be used to filter the data of the column */ filterRenderer?: React.ComponentType>; onCellChange?(rowIdx: number, key: keyof TRow, dependentValues: TDependentValue, event: React.SyntheticEvent): void; getRowMetaData?(rowData: TRow, column: CalculatedColumn): TDependentValue; } export declare type Column = TField extends keyof TRow ? ColumnValue : never; export declare type CalculatedColumn = Column & { idx: number; width: number; left: number; }; export declare type ColumnList = Column[] | List>; export interface ColumnMetrics { columns: CalculatedColumn[]; width: number; totalColumnWidth: number; totalWidth: number; minColumnWidth: number; } export interface RowData { name?: string; get?(key: PropertyKey): unknown; __metaData?: RowGroupMetaData; } export interface CellMetaData { rowKey: keyof TRow; onCellClick(position: Position): void; onCellContextMenu(position: Position): void; onCellDoubleClick(position: Position): void; onDragEnter(overRowIdx: number): void; onCellExpand?(options: SubRowOptions): void; onRowExpandToggle?(e: RowExpandToggleEvent): void; onCellMouseDown?(position: Position): void; onCellMouseEnter?(position: Position): void; onAddSubRow?(): void; onDeleteSubRow?(options: SubRowOptions): void; getCellActions?(column: CalculatedColumn, rowData: TRow): CellActionButton[] | undefined; } export interface Position { idx: number; rowIdx: number; } export interface Range { topLeft: Position; bottomRight: Position; } export interface SelectedRange extends Range { startCell: Position | null; cursorCell: Position | null; isDragging: boolean; } export interface Dimension { width: number; height: number; top: number; left: number; zIndex: number; } export declare type RowGetter = (rowIdx: number) => TRow; export interface Editor extends React.Component { getInputNode(): Element | Text | undefined | null; getValue(): TValue; hasResults?(): boolean; isSelectOpen?(): boolean; validate?(value: unknown): boolean; readonly disableContainerStyles?: boolean; } export interface FormatterProps { rowIdx: number; value: TValue; column: CalculatedColumn; row: TRow; isScrolling: boolean; dependentValues?: TDependentValue; } export interface EditorProps { column: CalculatedColumn; value: TValue; rowMetaData?: TDependentValue; rowData: TRow; height: number; onCommit(args?: { key?: string; }): void; onCommitCancel(): void; onBlur(): void; onOverrideKeyDown(e: KeyboardEvent): void; } export interface HeaderRowProps { column: CalculatedColumn; rowType: HeaderRowType; } export interface CellRendererProps { idx: number; rowIdx: number; height: number; value: TValue; column: CalculatedColumn; rowData: TRow; cellMetaData: CellMetaData; isScrolling: boolean; scrollLeft: number; isRowSelected?: boolean; expandableOptions?: ExpandableOptions; lastFrozenColumnIndex?: number; } export interface RowRendererProps { height: number; columns: CalculatedColumn[]; row: TRow; cellRenderer?: React.ComponentType>; cellMetaData: CellMetaData; isSelected?: boolean; idx: number; extraClasses?: string; subRowDetails?: SubRowDetails; colOverscanStartIdx: number; colOverscanEndIdx: number; isScrolling: boolean; scrollLeft: number; lastFrozenColumnIndex?: number; } export interface FilterRendererProps { column: CalculatedColumn; onChange?(event: AddFilterEvent): void; /** TODO: remove */ getValidFilterValues?(columnKey: keyof TRow): TFilterValue; } export interface SubRowDetails { canExpand: boolean; field: string; expanded: boolean; children: TChildRow[]; treeDepth: number; siblingIndex: number; numberSiblings: number; group?: boolean; } export interface SubRowOptions { rowIdx: number; idx: number; rowData: TRow; expandArgs?: ExpandableOptions; } export interface ExpandableOptions { canExpand: boolean; field: string; expanded: boolean; children: TChildRow[]; treeDepth: number; subRowDetails: SubRowDetails; } interface Action { text: ReactNode; callback(): void; } export interface CellActionButton { icon: ReactNode; actions?: Action[]; callback?(): void; } export interface ColumnEventInfo extends Position { rowId: unknown; column: CalculatedColumn; } export interface CellRenderer { setScrollLeft(scrollLeft: number): void; } export interface RowRenderer { setScrollLeft(scrollLeft: number): void; getRowTop?(): number; getRowHeight?(): number; getDecoratedComponentInstance?(idx: number): { row: RowRenderer & React.Component>; } | undefined; } export interface ScrollPosition { scrollLeft: number; scrollTop: number; } export interface InteractionMasksMetaData { onCheckCellIsEditable?(e: CheckCellIsEditableEvent): boolean; onCellCopyPaste?(e: CellCopyPasteEvent): void; onGridRowsUpdated(cellKey: keyof TRow, toRow1: number, toRow2: number, data: { [key: string]: unknown; }, // FIX ME: Use Pick updateAction: UpdateActions, fromRow?: number): void; onDragHandleDoubleClick(data: Position & { rowData: TRow; }): void; onCellSelected?(position: Position): void; onCellDeSelected?(position: Position): void; onCellRangeSelectionStarted?(selectedRange: SelectedRange): void; onCellRangeSelectionUpdated?(selectedRange: SelectedRange): void; onCellRangeSelectionCompleted?(selectedRange: SelectedRange): void; onCommit(e: CommitEvent): void; } export interface RowGroupMetaData { isGroup: boolean; treeDepth: number; isExpanded: boolean; columnGroupName: string; columnGroupDisplayName: string; getRowRenderer?(props: unknown, rowIdx: number): React.ReactElement; } export declare type RowSelection = { indexes?: number[]; } | { isSelectedKey?: string; } | { keys?: { values: unknown[]; rowKey: string; }; }; export interface HeaderRowData { rowType: HeaderRowType; height: number; filterable?: boolean; onFilterChange?(args: AddFilterEvent): void; } export interface AddFilterEvent { filterTerm: string; column: Column; } export interface CommitEvent { cellKey: keyof TRow; rowIdx: number; updated: TUpdatedValue; key?: string; } export interface RowExpandToggleEvent { rowIdx: number; shouldExpand: boolean; columnGroupName: string; name: string; } export interface GridRowsUpdatedEvent { cellKey: keyof TRow; fromRow: number; toRow: number; fromRowId: unknown; toRowId: unknown; rowIds: unknown[]; updated: TUpdatedValue; action: UpdateActions; fromRowData: TRow; } export interface CellCopyPasteEvent { cellKey: keyof TRow; rowIdx: number; fromRow: number; toRow: number; value: unknown; } export interface CheckCellIsEditableEvent extends Position { row: TRow; column: CalculatedColumn; } export interface RowSelectionParams { rowIdx: number; row: TRow; } export {};