UNPKG

@1771technologies/lytenyte-pro

Version:

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

46 lines (45 loc) 1.92 kB
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; }