UNPKG

@tanstack/table-core

Version:

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

146 lines (141 loc) 6.5 kB
/** * table-core * * Copyright (c) TanStack * * This source code is licensed under the MIT license found in the * LICENSE.md file in the root directory of this source tree. * * @license MIT */ 'use strict'; var utils = require('../utils.js'); // const getDefaultRowPinningState = () => ({ top: [], bottom: [] }); const RowPinning = { getInitialState: state => { return { rowPinning: getDefaultRowPinningState(), ...state }; }, getDefaultOptions: table => { return { onRowPinningChange: utils.makeStateUpdater('rowPinning', table) }; }, createRow: (row, table) => { row.pin = (position, includeLeafRows, includeParentRows) => { const leafRowIds = includeLeafRows ? row.getLeafRows().map(_ref => { let { id } = _ref; return id; }) : []; const parentRowIds = includeParentRows ? row.getParentRows().map(_ref2 => { let { id } = _ref2; return id; }) : []; const rowIds = new Set([...parentRowIds, row.id, ...leafRowIds]); table.setRowPinning(old => { var _old$top3, _old$bottom3; if (position === 'bottom') { var _old$top, _old$bottom; return { top: ((_old$top = old == null ? void 0 : old.top) != null ? _old$top : []).filter(d => !(rowIds != null && rowIds.has(d))), bottom: [...((_old$bottom = old == null ? void 0 : old.bottom) != null ? _old$bottom : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)] }; } if (position === 'top') { var _old$top2, _old$bottom2; return { top: [...((_old$top2 = old == null ? void 0 : old.top) != null ? _old$top2 : []).filter(d => !(rowIds != null && rowIds.has(d))), ...Array.from(rowIds)], bottom: ((_old$bottom2 = old == null ? void 0 : old.bottom) != null ? _old$bottom2 : []).filter(d => !(rowIds != null && rowIds.has(d))) }; } return { top: ((_old$top3 = old == null ? void 0 : old.top) != null ? _old$top3 : []).filter(d => !(rowIds != null && rowIds.has(d))), bottom: ((_old$bottom3 = old == null ? void 0 : old.bottom) != null ? _old$bottom3 : []).filter(d => !(rowIds != null && rowIds.has(d))) }; }); }; row.getCanPin = () => { var _ref3; const { enableRowPinning, enablePinning } = table.options; if (typeof enableRowPinning === 'function') { return enableRowPinning(row); } return (_ref3 = enableRowPinning != null ? enableRowPinning : enablePinning) != null ? _ref3 : true; }; row.getIsPinned = () => { const rowIds = [row.id]; const { top, bottom } = table.getState().rowPinning; const isTop = rowIds.some(d => top == null ? void 0 : top.includes(d)); const isBottom = rowIds.some(d => bottom == null ? void 0 : bottom.includes(d)); return isTop ? 'top' : isBottom ? 'bottom' : false; }; row.getPinnedIndex = () => { var _ref4, _visiblePinnedRowIds$; const position = row.getIsPinned(); if (!position) return -1; const visiblePinnedRowIds = (_ref4 = position === 'top' ? table.getTopRows() : table.getBottomRows()) == null ? void 0 : _ref4.map(_ref5 => { let { id } = _ref5; return id; }); return (_visiblePinnedRowIds$ = visiblePinnedRowIds == null ? void 0 : visiblePinnedRowIds.indexOf(row.id)) != null ? _visiblePinnedRowIds$ : -1; }; }, createTable: table => { table.setRowPinning = updater => table.options.onRowPinningChange == null ? void 0 : table.options.onRowPinningChange(updater); table.resetRowPinning = defaultState => { var _table$initialState$r, _table$initialState; return table.setRowPinning(defaultState ? getDefaultRowPinningState() : (_table$initialState$r = (_table$initialState = table.initialState) == null ? void 0 : _table$initialState.rowPinning) != null ? _table$initialState$r : getDefaultRowPinningState()); }; table.getIsSomeRowsPinned = position => { var _pinningState$positio; const pinningState = table.getState().rowPinning; if (!position) { var _pinningState$top, _pinningState$bottom; return Boolean(((_pinningState$top = pinningState.top) == null ? void 0 : _pinningState$top.length) || ((_pinningState$bottom = pinningState.bottom) == null ? void 0 : _pinningState$bottom.length)); } return Boolean((_pinningState$positio = pinningState[position]) == null ? void 0 : _pinningState$positio.length); }; table._getPinnedRows = (visibleRows, pinnedRowIds, position) => { var _table$options$keepPi; const rows = ((_table$options$keepPi = table.options.keepPinnedRows) != null ? _table$options$keepPi : true) ? //get all rows that are pinned even if they would not be otherwise visible //account for expanded parent rows, but not pagination or filtering (pinnedRowIds != null ? pinnedRowIds : []).map(rowId => { const row = table.getRow(rowId, true); return row.getIsAllParentsExpanded() ? row : null; }) : //else get only visible rows that are pinned (pinnedRowIds != null ? pinnedRowIds : []).map(rowId => visibleRows.find(row => row.id === rowId)); return rows.filter(Boolean).map(d => ({ ...d, position })); }; table.getTopRows = utils.memo(() => [table.getRowModel().rows, table.getState().rowPinning.top], (allRows, topPinnedRowIds) => table._getPinnedRows(allRows, topPinnedRowIds, 'top'), utils.getMemoOptions(table.options, 'debugRows', 'getTopRows')); table.getBottomRows = utils.memo(() => [table.getRowModel().rows, table.getState().rowPinning.bottom], (allRows, bottomPinnedRowIds) => table._getPinnedRows(allRows, bottomPinnedRowIds, 'bottom'), utils.getMemoOptions(table.options, 'debugRows', 'getBottomRows')); table.getCenterRows = utils.memo(() => [table.getRowModel().rows, table.getState().rowPinning.top, table.getState().rowPinning.bottom], (allRows, top, bottom) => { const topAndBottom = new Set([...(top != null ? top : []), ...(bottom != null ? bottom : [])]); return allRows.filter(d => !topAndBottom.has(d.id)); }, utils.getMemoOptions(table.options, 'debugRows', 'getCenterRows')); } }; exports.RowPinning = RowPinning; //# sourceMappingURL=RowPinning.js.map