@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
46 lines (45 loc) • 1.92 kB
JavaScript
import { useMemo } from "react";
import { computeField } from "@1771technologies/lytenyte-core/internal";
const pivotAggs = {};
export function usePivotAggFunction(pivotColumns, model, aggs = pivotAggs) {
const measures = model?.measures;
const columns = model?.columns;
const aggFn = useMemo(() => {
if (!measures?.length)
return null;
if (!pivotColumns?.length || !columns?.length)
return (rows) => {
const aggResult = {};
for (const m of measures) {
const id = m.dim.id;
const fn = typeof m.fn === "string" ? aggs[m.fn] : m.fn;
if (!fn) {
console.error(`Measure "${fn}" is not defined.`);
}
aggResult[id] = fn(m.dim.field ?? id, rows);
}
return aggResult;
};
const lookup = Object.fromEntries((measures ?? []).map((x) => [x.dim.id, x]));
return (rows) => {
const aggResult = {};
for (let i = 0; i < pivotColumns.length; i++) {
const column = pivotColumns[i];
const measureId = column.id.split("-->").at(-1);
if (measureId === "ln__noop")
break;
const finalLeafs = rows.filter((x) => computeField(column.field, x));
if (finalLeafs.length) {
const measure = lookup[measureId];
const fn = typeof measure.fn === "string" ? aggs[measure.fn] : measure.fn;
aggResult[column.id] = fn(measure.dim.field ?? measure.dim.id, finalLeafs);
}
else {
aggResult[column.id] = null;
}
}
return aggResult;
};
}, [aggs, columns?.length, measures, pivotColumns]);
return aggFn;
}