@tanstack/table-core
Version:
Headless UI for building powerful tables & datagrids for TS/JS.
146 lines (141 loc) • 6.5 kB
JavaScript
/**
* 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
*/
;
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