@itwin/presentation-hierarchies
Version:
A package for creating hierarchies based on data in iTwin.js iModels.
44 lines • 2.59 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.mergeProviders = mergeProviders;
require("./internal/DisposePolyfill.js");
const rxjs_1 = require("rxjs");
const core_bentley_1 = require("@itwin/core-bentley");
const Common_js_1 = require("./internal/Common.js");
const EachValueFrom_js_1 = require("./internal/EachValueFrom.js");
const Sorting_js_1 = require("./internal/operators/Sorting.js");
/**
* Creates a single, merged, hierarchy provider from multiple given providers.
* @public
*/
function mergeProviders({ providers }) {
const hierarchyChanged = new core_bentley_1.BeEvent();
providers.forEach((p) => {
p.hierarchyChanged.addListener(() => hierarchyChanged.raiseEvent());
});
const dispose = () => {
hierarchyChanged.clear();
providers.forEach((p) => (0, Common_js_1.safeDispose)(p));
};
return {
hierarchyChanged,
getNodes: (props) => (0, EachValueFrom_js_1.eachValueFrom)((0, rxjs_1.from)(providers).pipe((0, rxjs_1.mergeMap)((provider) => (0, rxjs_1.from)(provider.getNodes(props)).pipe((0, rxjs_1.mergeMap)((node) => {
if (node.children) {
return (0, rxjs_1.of)(node);
}
// each provider only considers its own data when determining node's children - in case it says
// the node has no children, we have to check against the other providers too
return (0, rxjs_1.from)(providers).pipe((0, rxjs_1.filter)((p) => p !== provider), (0, rxjs_1.mergeMap)((p) => p.getNodes({ parentNode: node })), (0, rxjs_1.map)(() => true), (0, rxjs_1.first)(undefined, false), (0, rxjs_1.map)((hasChildren) => ({ ...node, children: hasChildren })));
}))), Sorting_js_1.sortNodesByLabelOperator)),
getNodeInstanceKeys: (props) => (0, EachValueFrom_js_1.eachValueFrom)((0, rxjs_1.from)(providers).pipe((0, rxjs_1.mergeMap)((p) => p.getNodeInstanceKeys(props)))),
setFormatter: (formatter) => providers.forEach((p) => p.setFormatter(formatter)),
setHierarchyFilter: (props) => providers.forEach((p) => p.setHierarchyFilter(props)),
[Symbol.dispose]: dispose,
dispose,
};
}
//# sourceMappingURL=HierarchyProvider.js.map