UNPKG

@itwin/presentation-hierarchies-react

Version:

React components based on `@itwin/presentation-hierarchies`

98 lines 4.5 kB
"use strict"; /*--------------------------------------------------------------------------------------------- * 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.TreeLoader = void 0; const rxjs_1 = require("rxjs"); const TreeModel_js_1 = require("./TreeModel.js"); const Utils_js_1 = require("./Utils.js"); /** @internal */ class TreeLoader { _hierarchyProvider; _onHierarchyLimitExceeded; _onHierarchyLoadError; _treeNodeIdFactory; constructor(_hierarchyProvider, _onHierarchyLimitExceeded, _onHierarchyLoadError, treeNodeIdFactory) { this._hierarchyProvider = _hierarchyProvider; this._onHierarchyLimitExceeded = _onHierarchyLimitExceeded; this._onHierarchyLoadError = _onHierarchyLoadError; this._treeNodeIdFactory = treeNodeIdFactory ?? /* c8 ignore next */ Utils_js_1.createNodeId; } loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache }) { const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent); const infoNodeIdBase = `${parent.id ?? "<root>"}`; const treeModelNodesFactory = createTreeModelNodesFactory({ buildNode, treeNodeIdFactory: this._treeNodeIdFactory }); return (0, rxjs_1.from)(this._hierarchyProvider.getNodes({ parentNode: parent.nodeData, hierarchyLevelSizeLimit, instanceFilter, ignoreCache, })).pipe((0, rxjs_1.toArray)(), (0, rxjs_1.catchError)((err) => { const nodeProps = { id: `${infoNodeIdBase}-Unknown`, parentId: parent.id, }; let hierarchyLoadErrorType = "unknown"; if (err instanceof Error) { nodeProps.id = `${infoNodeIdBase}-${err.message}`; if (isRowsLimitError(err)) { this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit }); return (0, rxjs_1.of)([{ ...nodeProps, type: "ResultSetTooLarge", resultSetSizeLimit: err.limit }]); } if (isTimeoutError(err)) { hierarchyLoadErrorType = "timeout"; } } this._onHierarchyLoadError({ parentId: parent.id, type: hierarchyLoadErrorType, error: err }); return (0, rxjs_1.of)([ { ...nodeProps, type: "Unknown", message: "Failed to create hierarchy level", }, ]); }), (0, rxjs_1.map)((childNodes) => ({ parentId: parent.id, loadedNodes: instanceFilter && childNodes.length === 0 ? [ { id: `${infoNodeIdBase}-no-filter-matches`, parentId: parent.id, type: "NoFilterMatches", }, ] : childNodes.map(treeModelNodesFactory), }))); } loadNodes({ shouldLoadChildren, ...options }) { return this.loadChildren(options).pipe((0, rxjs_1.expand)((loadedPart) => (0, rxjs_1.from)(loadedPart.loadedNodes.filter((node) => (0, TreeModel_js_1.isTreeModelHierarchyNode)(node) && shouldLoadChildren(node))).pipe((0, rxjs_1.mergeMap)((node) => this.loadChildren({ ...options, parent: node }))))); } } exports.TreeLoader = TreeLoader; function createTreeModelNodesFactory({ buildNode, treeNodeIdFactory, }) { return (node) => { if (!isHierarchyNode(node)) { return node; } const modelNode = { id: treeNodeIdFactory(node), children: node.children, label: node.label, nodeData: node, }; return buildNode ? buildNode(modelNode) : modelNode; }; } function isHierarchyNode(node) { return "key" in node && node.key !== undefined; } function isRowsLimitError(error) { const asRowsError = error; return asRowsError.limit !== undefined && asRowsError.message.includes("Query rows limit of"); } function isTimeoutError(error) { return error.message.includes("query too long to execute or server is too busy"); } //# sourceMappingURL=TreeLoader.js.map