UNPKG

@itwin/presentation-hierarchies

Version:

A package for creating hierarchies based on data in iTwin.js iModels.

52 lines 2.68 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ import { createMainThreadReleaseOnTimePassedHandler, getClass } from "@itwin/presentation-shared"; import { HierarchyNode } from "../../../HierarchyNode.js"; /** @internal */ export async function createClassGroups(schemaProvider, parentNode, nodes) { const parentNodeClass = parentNode && HierarchyNode.isClassGroupingNode(parentNode) ? parentNode.key.className : undefined; const groupings = { ungrouped: [], grouped: new Map() }; const releaseMainThread = createMainThreadReleaseOnTimePassedHandler(); for (const node of nodes) { await releaseMainThread(); const nodeClassName = node.key.instanceKeys[0].className; if (node.processingParams?.grouping?.byClass && nodeClassName !== parentNodeClass) { let groupingInfo = groupings.grouped.get(nodeClassName); if (!groupingInfo) { const nodeClass = await getClass(schemaProvider, nodeClassName); groupingInfo = { class: nodeClass, groupedNodes: [], }; groupings.grouped.set(nodeClassName, groupingInfo); } groupingInfo.groupedNodes.push(node); continue; } groupings.ungrouped.push(node); } return createGroupingNodes(groupings); } async function createGroupingNodes(groupings) { const groupedNodes = new Array(); const releaseMainThread = createMainThreadReleaseOnTimePassedHandler(); for (const [, entry] of groupings.grouped) { await releaseMainThread(); const groupingNodeKey = { type: "class-grouping", className: entry.class.fullName, }; const groupedNodeParentKeys = entry.groupedNodes[0].parentKeys; groupedNodes.push({ label: entry.class.label ?? entry.class.name, key: groupingNodeKey, parentKeys: groupedNodeParentKeys, groupedInstanceKeys: entry.groupedNodes.flatMap((groupedInstanceNode) => groupedInstanceNode.key.instanceKeys), children: entry.groupedNodes.map((gn) => Object.assign(gn, { parentKeys: [...groupedNodeParentKeys, groupingNodeKey] })), }); } return { grouped: groupedNodes, ungrouped: groupings.ungrouped, groupingType: "class" }; } //# sourceMappingURL=ClassGrouping.js.map