import React from "react"; import { ReactNode, ReactElement } from "react"; /** Grid that has headers on rows and columns. Has virtual, high-performance scrolling. * Handles: * - arrow keys * - click to select * - double-click to edit * - enter to edit * - scrolling * - grid lines * - header highlighting * - cell/header positioning * - rejected editor saving * * Does not handle: * - content rendering * - header rendering * - editor creation * * Row header refers to a sticky vertical band to the left of each row, like in a spreadsheet * * Column header extra is an optional part of the column header to the right of the last column. Used for "+" usually to add a column. * Row header extra is an optional part of the row header below of the last row. Used for "+" usually to add a row. * */ export declare const GridComponent: (props: { /** Width of display of grid */ width: number; /** Height of display of grid */ height: number; /** Number of rows in the grid */ numRows: number; /** Height of each row in grid (excluding header) */ rowHeight: number; /** Widths of columns */ colWidths: number[]; /** Called when columns are resized */ onColWidthsChange?: (colWidths: number[]) => void; /** Height of column headers */ colHeaderHeight: number; /** Width of row headers */ rowHeaderWidth: number; /** Render a single cell. Renderer is responsible for clipping and padding */ renderCell: (props: RenderCellProps) => ReactNode; /** Render a single column header. Renderer is responsible for clipping and padding */ renderColHeader?: (props: RenderColHeaderProps) => ReactNode; /** Render a single row header. Renderer is responsible for clipping and padding */ renderRowHeader?: (props: RenderRowHeaderProps) => ReactNode; /** Cell editor when editing set */ renderCellEditor?: (props: RenderCellEditorProps) => ReactElement; /** Check if a cell can be edited */ canEdit?: (props: { row: number; col: number; }) => Promise | boolean; /** Width of extra region to right of last column header */ colHeaderExtraWidth?: number; /** Render extra region to the right of last column header */ renderColHeaderExtra?: () => ReactNode; /** Height of extra region below last row header */ rowHeaderExtraHeight?: number; /** Render extra region below last row header */ renderRowHeaderExtra?: () => ReactNode; /** Render top left corner (optional) */ renderTopLeft?: () => ReactNode; /** Handle row click. Prevents selection by click if present and returns true */ onRowClick?: (rowIndex: number) => boolean; /** Handle row double click. Not triggered if double click causes editing */ onRowDoubleClick?: (rowIndex: number) => void; /** Optional handler for copying selected cell */ onCopy?: (row: number, col: number) => void; }) => React.JSX.Element; /** Props passed to render a cell */ export interface RenderCellProps { /** Zero-based row number */ row: number; /** Zero-based column number */ col: number; /** Width of cell to be rendered */ width: number; /** Height of cell to be rendered */ height: number; /** True if cell is selected */ selected: boolean; /** Call to start editing cell. Assumes cell is selected because of click */ onStartEdit: () => void; } export interface RenderColHeaderProps { /** Zero-based column number */ col: number; /** Width of header to be rendered */ width: number; /** Height of header to be rendered */ height: number; /** True if cell in column is selected */ selected: boolean; } export interface RenderRowHeaderProps { /** Zero-based row number */ row: number; /** Width of header to be rendered */ width: number; /** Height of header to be rendered */ height: number; /** True if cell in row is selected */ selected: boolean; } /** Will be called to save the current edit. Returns true if successful */ export type SaveEditFunc = () => Promise; export interface RenderCellEditorProps { /** Zero-based row number */ row: number; /** Zero-based column number */ col: number; /** Width of cell to be rendered */ width: number; /** Height of cell to be rendered */ height: number; /** True if saving */ saving: boolean; /** Call to set a optional asynchronous save function. * If it is set, the onEndEdit function will trigger it. * If it returns false, the edit will not be ended. * If it returns true, the edit will be ended. */ setSaveEdit: (saveEditFunc: SaveEditFunc) => void; /** Call to end editing. Returns success. This will trigger * the save edit function if set. */ onEndEdit: () => Promise; } export interface CellRange { colStart: number; colEnd: number; rowStart: number; rowEnd: number; } export interface CellSelection { row: number; col: number; }