@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
34 lines (33 loc) • 1.71 kB
JavaScript
import { computePathTable, getMaxHeaderDepth, getVisibleColumns, getVisibleColumnsWithGroups, makeColumnGroupMetadata, partitionColumnsByPinState, } from "@1771technologies/lytenyte-shared";
export function makeColumnView({ columns, base, groupExpansions, groupJoinDelimiter, groupExpansionDefault, }) {
const lookup = new Map(columns.map((c) => [c.id, c]));
const columnsNotHidden = getVisibleColumns(columns, base);
const groupMetadata = makeColumnGroupMetadata(columnsNotHidden, groupJoinDelimiter);
const visible = getVisibleColumnsWithGroups(columnsNotHidden, groupMetadata, groupExpansions, groupExpansionDefault);
const { start, center, end } = partitionColumnsByPinState(visible);
const seenMap = {};
const maxDepth = getMaxHeaderDepth(visible);
const endOffset = start.length + center.length;
const startTable = computePathTable(start, maxDepth, seenMap, groupJoinDelimiter, 0).table;
const centerTable = computePathTable(center, maxDepth, seenMap, groupJoinDelimiter, start.length).table;
const endTable = computePathTable(end, maxDepth, seenMap, groupJoinDelimiter, endOffset).table;
const combinedView = [];
for (let i = 0; i <= maxDepth; i++) {
const row = [];
row.push(...(startTable[i] ?? []));
row.push(...(centerTable[i] ?? []));
row.push(...(endTable[i] ?? []));
combinedView.push(row);
}
return {
meta: groupMetadata,
maxRow: maxDepth + 1,
maxCol: visible.length,
combinedView,
visibleColumns: [...start, ...center, ...end],
lookup,
startCount: start.length,
endCount: end.length,
centerCount: center.length,
};
}