UNPKG

@1771technologies/lytenyte-pro

Version:

Blazingly fast headless React data grid with 100s of features.

51 lines (50 loc) 1.99 kB
import { upperCaseFirstLetter } from "@1771technologies/lytenyte-shared"; export function createColumnPivotsFromPaths(grid, columns, lookup, paths) { const separator = grid.state.columnGroupJoinDelimiter.get(); const cols = paths.map((path) => { const parts = path.split(separator); const measureId = parts.at(-1); const measureCol = lookup.get(measureId); // Pop the last part as this is the aggregation value parts.pop(); const pivots = parts.map((_, index) => { const id = columns[index].field; return lookup.get(id); }); const entries = [...pivots.entries()]; const isTotals = parts.length < columns.length; const label = isTotals ? "Total" : parts.at(-1); const groupPath = isTotals ? [] : parts.map(upperCaseFirstLetter); const { pin: _, ...measureProps } = measureCol ?? {}; const newDefinitions = { ...measureProps, id: path, name: label, groupPath, groupVisibility: "always", field: ({ grid, data }) => { if (!measureCol) return null; if (data.kind === "branch") { return data.data[path]; } if (!path.startsWith("total")) { for (const [index, pivot] of entries) { const key = parts[index]; if (key == null) break; const actual = grid.api.columnField(pivot, data); if (key !== actual) return null; } return grid.api.columnField(measureCol, data); } else { return grid.api.columnField(measureCol, data); } }, }; return newDefinitions; }); return cols; }