@itwin/presentation-hierarchies
Version:
A package for creating hierarchies based on data in iTwin.js iModels.
52 lines • 2.68 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* 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