UNPKG

@tanstack/table-core

Version:

Headless UI for building powerful tables & datagrids for TS/JS.

306 lines 13 kB
import { CellData, RowData, Updater } from "../../types/type-utils.js"; import { CellSelectionBounds, CellSelectionDirection, CellSelectionEdges, CellSelectionRange, CellSelectionState, SelectCellRangeOptions } from "./cellSelectionFeature.types.js"; import { Table } from "../../types/Table.js"; import { Cell } from "../../types/Cell.js"; import { TableFeatures } from "../../types/TableFeatures.js"; //#region src/features/cell-selection/cellSelectionFeature.utils.d.ts /** * Creates the default cell selection state. * * The feature default is an empty selection. Reset APIs use this value when * `defaultState` is `true`. * * @example * ```ts * const selection = getDefaultCellSelectionState() * ``` */ declare function getDefaultCellSelectionState(): CellSelectionState; /** * Routes a cell selection updater through the table's selection change handler. * * @example * ```ts * table_setCellSelection(table, (old) => old.slice(0, -1)) * ``` */ declare function table_setCellSelection<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, updater: Updater<CellSelectionState>): void; /** * Resets `cellSelection` to the configured initial state or feature default. * * With no argument, the reset clones `table.initialState.cellSelection` when it * exists. Passing `true` ignores initial state and resets to an empty selection. * * @example * ```ts * table_resetCellSelection(table, true) * ``` */ declare function table_resetCellSelection<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, defaultState?: boolean): void; /** * Schedules a cell selection reset after `data` changes. * * Ranges are stored as row and column ids, so without this a data swap would * leave a selection pointing at rows that no longer exist, or silently * re-select cells whenever new data reuses ids. The reset runs when * `autoResetAll` or `autoResetCellSelection` allows it, defaulting to on. * * Resetting to `initialState.cellSelection` rather than to empty means the * first row-model computation is a no-op, matching `table_autoResetExpanded`. * * @example * ```ts * table_autoResetCellSelection(table) * ``` */ declare function table_autoResetCellSelection<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): void; /** * Builds a column id to render-order index map. * * Registered by this feature so the lookup stays memoized even when * `columnOrderingFeature` is absent, since that feature's `getColumnIndexes` * static rebuilds all four maps on every call, which would make per-cell reads * O(columns). * * @example * ```ts * const index = table_getCellSelectionColumnIndexes(table)[columnId] * ``` */ declare function table_getCellSelectionColumnIndexes<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Record<string, number>; /** * Resolves the merged-cell rectangles of the rendered rows into selection's * own index space. * * The span index positions rows by their paginated render order while * selection positions them by pre-paginated display order, so each merge is * mapped through `row.getDisplayIndex()`. A merge whose rows do not map to a * contiguous display range is skipped defensively; it then behaves like * unmerged cells instead of corrupting the geometry. * * Returns an empty array when `cellSpanningFeature` is not registered, which * keeps every selection code path identical to the span-unaware behavior. * * @example * ```ts * const merges = table_getCellSelectionMergeBounds(table) * ``` */ declare function table_getCellSelectionMergeBounds<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Array<CellSelectionBounds>; /** * Resolves ordered range operations into disjoint, positive display-order * index rectangles. * * This is the single cache every per-cell read goes through, so index lookups * happen once per invalidation rather than once per cell. A range whose corners * no longer resolve, for example because its anchor row was filtered out, is * omitted rather than clamped, so it contributes nothing while remaining in * state and returns intact when the filter clears. * * @example * ```ts * const bounds = table_getCellSelectionBounds(table) * ``` */ declare function table_getCellSelectionBounds<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Array<CellSelectionBounds>; /** * Checks whether this cell can currently be selected. * * A column def opting out with `enableCellSelection: false` wins over the table * option, matching how the other per-column enable flags resolve. * * @example * ```ts * const canSelect = cell_getCanSelect(cell) * ``` */ declare function cell_getCanSelect<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>): boolean; /** * Checks whether this cell falls inside the final positive selection. * * Deliberately not memoized. Registering this through `assignPrototypeAPIs` * with `memoDeps` would allocate a memo closure and dependency array per cell, * which costs more than the handful of integer comparisons it would save. * * @example * ```ts * const isSelected = cell_getIsSelected(cell) * ``` */ declare function cell_getIsSelected<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>): boolean; /** * Checks whether this cell is the active cell. * * @example * ```ts * const isFocused = cell_getIsFocused(cell) * ``` */ declare function cell_getIsFocused<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>): boolean; /** * Returns `0` for the focused cell and `-1` otherwise, for roving tabindex. * * @example * ```ts * const tabIndex = cell_getTabIndex(cell) * ``` */ declare function cell_getTabIndex<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>): number; /** * Returns which sides of this cell sit on the outer boundary of the selection. * * A side is an edge when the neighbouring cell in that direction is not itself * covered by a range, which is what lets a consumer draw a single outline * around an arbitrary union of rectangles. * * @example * ```ts * const { top, right, bottom, left } = cell_getSelectionEdges(cell) * ``` */ declare function cell_getSelectionEdges<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>): CellSelectionEdges; /** * Returns the active cell, i.e. the anchor of the most recent operation. * * Focus is derived rather than stored: in spreadsheet semantics, dragging from * A1 to C5 leaves the active cell at A1, so the active range's anchor already * is the active cell. * * @example * ```ts * const cell = table_getFocusedCell(table) * ``` */ declare function table_getFocusedCell<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Cell<TFeatures, TData, any> | undefined; /** * Collapses the selection to a single cell at the given coordinates. * * @example * ```ts * table_setFocusedCell(table, '3', 'firstName') * ``` */ declare function table_setFocusedCell<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, rowId: string, columnId: string): void; /** * Selects a rectangle using replace, include, or exclude semantics. * * @example * ```ts * table_selectCellRange(table, range, { mode: 'exclude' }) * ``` */ declare function table_selectCellRange<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, range: CellSelectionRange, opts?: SelectCellRangeOptions): void; /** * Selects every selectable cell in the table as one range. * * @example * ```ts * table_selectAllCells(table) * ``` */ declare function table_selectAllCells<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): void; /** * Moves the selection one step in a direction, collapsing it to a single cell. * * With nothing selected, this selects the first selectable cell so keyboard * navigation has somewhere to start. * * @example * ```ts * table_moveCellSelection(table, 'down') * ``` */ declare function table_moveCellSelection<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, direction: CellSelectionDirection): void; /** * Extends the active range one step in a direction, keeping its anchor fixed. * * @example * ```ts * table_extendCellSelection(table, 'right') * ``` */ declare function table_extendCellSelection<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>, direction: CellSelectionDirection): void; /** * Returns the ids of all selected cells, in row-major order. * * Cells covered by overlapping ranges are returned once, at their first * occurrence. * * @example * ```ts * const ids = table_getSelectedCellIds(table) * ``` */ declare function table_getSelectedCellIds<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Array<string>; /** * Returns each final positive region's values as a row-major grid. * * This is the raw material for clipboard export. Serializing it to text is left * to userland, since the delimiter, the null representation, and whether values * containing delimiters get quoted are all application decisions. * * @example * ```ts * const [firstRange] = table_getSelectedCellRangesData(table) * ``` */ declare function table_getSelectedCellRangesData<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Array<Array<Array<unknown>>>; /** * Returns the number of selected cells. * * Uses rectangle arithmetic over the normalized, disjoint positive regions. * A per-cell `enableCellSelection` predicate requires enumeration. * * @example * ```ts * const count = table_getSelectedCellCount(table) * ``` */ declare function table_getSelectedCellCount<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): number; /** * Returns the ids of all rows intersected by the selection. * * @example * ```ts * const rowIds = table_getCellSelectionRowIds(table) * ``` */ declare function table_getCellSelectionRowIds<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Array<string>; /** * Returns the ids of all columns intersected by the selection. * * @example * ```ts * const columnIds = table_getCellSelectionColumnIds(table) * ``` */ declare function table_getCellSelectionColumnIds<TFeatures extends TableFeatures, TData extends RowData>(table: Table<TFeatures, TData>): Array<string>; /** * Creates a handler that begins a selection at this cell. * * Follows `header_getResizeHandler`: the enable check is resolved once outside * the returned closure and guarded again inside it, the document is injectable * for SSR and cross-document rendering, and the document-level `mouseup` * listener is attached here so a drag released outside the table still ends. * * @example * ```tsx * <td onMouseDown={cell.getSelectionStartHandler()} /> * ``` */ declare function cell_getSelectionStartHandler<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>, _contextDocument?: Document): (e: unknown) => void; /** * Creates a handler that extends the active range to this cell during a drag. * * No rAF coalescing is needed here, unlike the resize handler: `mouseenter` * fires once per cell boundary crossed rather than continuously, and deferring * it by a frame would only delay the highlight. * * @example * ```tsx * <td onMouseEnter={cell.getSelectionExtendHandler()} /> * ``` */ declare function cell_getSelectionExtendHandler<TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData>(cell: Cell<TFeatures, TData, TValue>): (_e: unknown) => void; //#endregion export { cell_getCanSelect, cell_getIsFocused, cell_getIsSelected, cell_getSelectionEdges, cell_getSelectionExtendHandler, cell_getSelectionStartHandler, cell_getTabIndex, getDefaultCellSelectionState, table_autoResetCellSelection, table_extendCellSelection, table_getCellSelectionBounds, table_getCellSelectionColumnIds, table_getCellSelectionColumnIndexes, table_getCellSelectionMergeBounds, table_getCellSelectionRowIds, table_getFocusedCell, table_getSelectedCellCount, table_getSelectedCellIds, table_getSelectedCellRangesData, table_moveCellSelection, table_resetCellSelection, table_selectAllCells, table_selectCellRange, table_setCellSelection, table_setFocusedCell };