@itwin/presentation-hierarchies
Version:
A package for creating hierarchies based on data in iTwin.js iModels.
49 lines • 2.78 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createClassGroups = createClassGroups;
const presentation_shared_1 = require("@itwin/presentation-shared");
const HierarchyNode_js_1 = require("../../../HierarchyNode.js");
/** @internal */
async function createClassGroups(schemaProvider, parentNode, nodes) {
const parentNodeClass = parentNode && HierarchyNode_js_1.HierarchyNode.isClassGroupingNode(parentNode) ? parentNode.key.className : undefined;
const groupings = { ungrouped: [], grouped: new Map() };
const releaseMainThread = (0, presentation_shared_1.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 (0, presentation_shared_1.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 = (0, presentation_shared_1.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