@itwin/presentation-hierarchies-react
Version:
React components based on `@itwin/presentation-hierarchies`
98 lines • 4.5 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.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