UNPKG

react-konva-grid

Version:

Declarative React Canvas Grid primitive for Data table, Pivot table, Excel Worksheets

238 lines (237 loc) 6.36 kB
import React, { Key } from "react"; import { Stage } from "react-konva/lib/ReactKonvaCore"; import { ShapeConfig } from "konva/types/Shape"; import { StageConfig } from "konva/types/Stage"; export interface GridProps { /** * Width of the grid */ width?: number; /** * Height of the grid */ height?: number; /** * No of columns in the grid */ columnCount: number; /** * No of rows in the grid */ rowCount: number; /** * Should return height of a row at an index */ rowHeight?: ItemSizer; /** * Should return width of a column at an index */ columnWidth?: ItemSizer; /** * Size of the scrollbar. Default is 13 */ scrollbarSize?: number; /** * Helps in lazy grid width calculation */ estimatedColumnWidth?: number; /** * Helps in lazy grid height calculation */ estimatedRowHeight?: number; /** * Called when user scrolls the grid */ onScroll?: ({ scrollLeft, scrollTop }: ScrollCoords) => void; /** * Show scrollbars on the left and right of the grid */ showScrollbar?: boolean; /** * Currently active cell */ activeCell?: CellInterface; /** * Background of selection */ selectionBackgroundColor?: string; /** * Border color of selected area */ selectionBorderColor?: string; /** * Stroke width of the selection */ selectionStrokeWidth?: number; /** * Active Cell Stroke width */ activeCellStrokeWidth?: number; /** * Array of selected cell areas */ selections?: SelectionArea[]; /** * Array of merged cells */ mergedCells?: AreaProps[]; /** * Number of frozen rows */ frozenRows?: number; /** * Number of frozen columns */ frozenColumns?: number; /** * Snap to row and column when scrolling */ snap?: boolean; /** * Show shadow as you scroll for frozen rows and columns */ showFrozenShadow?: boolean; /** * Shadow settings */ shadowSettings?: ShapeConfig; /** * Scroll throttle wait timeout */ scrollThrottleTimeout?: number; /** * Cell styles for border */ borderStyles?: StylingProps; /** * Cell renderer. Must be a Konva Component eg: Group, Rect etc */ itemRenderer?: (props: RendererProps) => React.ReactNode; /** * Allow users to customize selected cells design */ selectionRenderer?: (props: SelectionProps) => React.ReactNode; /** * Fired when scroll viewport changes */ onViewChange?: (view: ViewPortProps) => void; /** * Called right before a row is being rendered. * Will be called for frozen cells and merged cells */ onBeforeRenderRow?: (rowIndex: number) => void; /** * Custom grid overlays */ children?: (props: ScrollCoords) => React.ReactNode; /** * Allows users to Wrap stage children in Top level Context */ wrapper?: (children: React.ReactNode) => React.ReactNode; /** * Props that can be injected to Konva stage */ stageProps?: Omit<StageConfig, "container">; } export declare type RefAttribute = { ref?: React.MutableRefObject<GridRef>; }; export declare type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>; export interface SelectionProps extends ShapeConfig { } export declare type ScrollCoords = { scrollTop: number; scrollLeft: number; }; export declare type OptionalScrollCoords = { scrollTop?: number; scrollLeft?: number; }; export interface ScrollState extends ScrollCoords { isScrolling: boolean; } export declare type RenderComponent = React.FC<RendererProps>; export interface CellPosition extends Pick<ShapeConfig, "x" | "y" | "width" | "height"> { } export interface RendererProps extends CellInterface, CellPosition, ShapeConfig { key: Key; } export declare type ItemSizer = (index: number) => number; export interface SelectionArea { bounds: AreaProps; inProgress?: boolean; } export interface AreaProps { top: number; bottom: number; left: number; right: number; } export interface CellInterface { rowIndex: number; columnIndex: number; } export interface OptionalCellInterface { rowIndex?: number; columnIndex?: number; } export interface ViewPortProps { rowStartIndex: number; rowStopIndex: number; columnStartIndex: number; columnStopIndex: number; } export interface InstanceInterface { columnMetadataMap: CellMetaDataMap; rowMetadataMap: CellMetaDataMap; lastMeasuredColumnIndex: number; lastMeasuredRowIndex: number; estimatedRowHeight: number; estimatedColumnWidth: number; recalcColumnIndexes: number[]; recalcRowIndexes: number[]; } export declare type CellMetaDataMap = Record<number, CellMetaData>; export declare type CellMetaData = { offset: number; size: number; }; export interface SnapRowProps { rowStartIndex: number; rowCount: number; deltaY: number; } export interface SnapColumnProps { columnStartIndex: number; columnCount: number; deltaX: number; frozenColumns: number; } export declare type GridRef = { scrollTo: (scrollPosition: ScrollCoords) => void; stage: typeof Stage | null; container: HTMLDivElement | null; resetAfterIndices: (coords: CellInterface, shouldForceUpdate?: boolean) => void; getScrollPosition: () => ScrollCoords; isMergedCell: (coords: CellInterface) => boolean; getCellBounds: (coords: CellInterface) => AreaProps; getCellCoordsFromOffset: (x: number, y: number) => CellInterface; getCellOffsetFromCoords: (coords: CellInterface) => CellPosition; scrollToItem: (coords: OptionalCellInterface) => void; focus: () => void; resizeColumns: (indexes: number[]) => void; resizeRows: (indexes: number[]) => void; getViewPort: () => ViewPortProps; }; export declare type MergedCellMap = Map<string, AreaProps>; export declare type StylingProps = AreaStyle[]; export interface AreaStyle { bounds: AreaProps; style: ShapeConfig; } /** * Grid component using React Konva * @param props */ declare const Grid: React.FC<GridProps & RefAttribute>; export default Grid;