@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
51 lines (50 loc) • 1.99 kB
JavaScript
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;
}