UNPKG

@1771technologies/lytenyte-pro

Version:

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

41 lines (40 loc) 1.83 kB
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, }; }