@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
41 lines (40 loc) • 1.83 kB
JavaScript
import { useGroupTree } from "./use-group-tree/use-group-tree.js";
import { useFlattenedGroups } from "./use-flattened-groups.js";
import { useFlattenedPiece } from "./use-flattened-piece.js";
import { useAggregationFn, useFiltered, useFilterFn, useGroupFn, useSorted, useSortFn, } from "@1771technologies/lytenyte-core/internal";
import { useMemo, useRef } from "react";
const groupIdFallback = (p) => p.map((x) => (x == null ? "_null_" : x)).join("->");
export function useFlattenedData(props, [leafsTop, leafs, leafsBot, pinMap], { expandedFn }) {
const filterFn = useFilterFn(props.filter);
const sortFn = useSortFn(props.sort);
const groupFn = useGroupFn(props.group);
const aggFn = useAggregationFn(props.aggregate, props.aggregateFns);
const filtered = useFiltered(leafs, filterFn);
const [sorted, centerMap] = useSorted(leafs, sortFn, filtered);
const leafIds = useMemo(() => new Map([...centerMap, ...pinMap]), [centerMap, pinMap]);
const leafIdsRef = useRef(leafIds);
leafIdsRef.current = leafIds;
const tree = useGroupTree(leafs, sorted, groupFn, props.groupIdFn ?? groupIdFallback, props.rowGroupCollapseBehavior ?? "no-collapse", props.labelFilter, props.having, aggFn);
const [groupFlat, maxDepth] = useFlattenedGroups(tree, aggFn, leafs, sorted, sortFn, expandedFn, props.rowGroupSuppressLeafExpansion ?? false);
const { flatten, rowByIdRef, rowByIndexRef, rowIdToRowIndexRef } = useFlattenedPiece({
leafsTop,
leafsCenter: leafs,
leafsBot,
groupFlat,
centerIndices: sorted,
});
return {
tree,
maxDepth,
flatten,
rowByIdRef,
rowByIndexRef,
rowIdToRowIndexRef,
leafIdsRef,
leafsTop,
leafs,
leafsBot,
sorted,
groupFn,
};
}