@itwin/presentation-hierarchies-react 0.8.2 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @itwin/presentation-hierarchies-react
2
2
 
3
+ ## 1.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#734](https://github.com/iTwin/presentation/pull/734): Fixed `onHierarchyLimitExceeded` callback of [tree state hooks](./README.md#tree-state-hooks) being called with incorrect `limit` value.
8
+ - Updated dependencies:
9
+ - @itwin/unified-selection@1.0.1
10
+ - @itwin/presentation-hierarchies@1.1.0
11
+
12
+ ## 1.0.0
13
+
14
+ ### Major Changes
15
+
16
+ - [#727](https://github.com/iTwin/presentation/pull/727): 1.0 release.
17
+
18
+ The APIs are now considered stable and ready for production use.
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies:
23
+ - @itwin/presentation-hierarchies@1.0.0
24
+ - @itwin/presentation-shared@1.0.0
25
+ - @itwin/unified-selection@1.0.0
26
+
3
27
  ## 0.8.2
4
28
 
5
29
  ### Patch Changes
@@ -35,7 +35,7 @@ class TreeLoader {
35
35
  parentId: parent.id,
36
36
  };
37
37
  if (isRowsLimitError(err)) {
38
- this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: hierarchyLevelSizeLimit });
38
+ this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });
39
39
  return (0, rxjs_1.of)([{ ...nodeProps, type: "ResultSetTooLarge", resultSetSizeLimit: err.limit }]);
40
40
  }
41
41
  this._onHierarchyLoadError({ parentId: parent.id, type: isTimeoutError(err) ? "timeout" : "unknown" });
@@ -1 +1 @@
1
- {"version":3,"file":"TreeLoader.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { catchError, expand, from, map, mergeMap, Observable, of, toArray } from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider, RowsLimitExceededError } from \"@itwin/presentation-hierarchies\";\nimport { isTreeModelHierarchyNode, TreeModelHierarchyNode, TreeModelInfoNode, TreeModelNode, TreeModelRootNode } from \"./TreeModel\";\nimport { createNodeId } from \"./Utils\";\n\n/** @internal */\nexport interface LoadedTreePart {\n parentId: string | undefined;\n loadedNodes: TreeModelNode[];\n}\n\n/** @internal */\nexport interface HierarchyLevelOptions {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n}\n\n/** @internal */\nexport interface LoadNodesOptions {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;\n shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n ignoreCache?: boolean;\n}\n\n/** @internal */\nexport interface ITreeLoader {\n loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;\n}\n\n/** @internal */\nexport class TreeLoader implements ITreeLoader {\n private _treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n\n constructor(\n private _hierarchyProvider: HierarchyProvider,\n private _onHierarchyLimitExceeded: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\" }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? /* istanbul ignore next */ createNodeId;\n }\n\n private loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache }: Omit<LoadNodesOptions, \"shouldLoadChildren\">) {\n const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);\n const infoNodeIdBase = `${parent.id ?? \"<root>\"}`;\n const treeModelNodesFactory = createTreeModelNodesFactory({ buildNode, treeNodeIdFactory: this._treeNodeIdFactory });\n return from(\n this._hierarchyProvider.getNodes({\n parentNode: parent.nodeData,\n hierarchyLevelSizeLimit,\n instanceFilter,\n ignoreCache,\n }),\n ).pipe(\n toArray(),\n catchError((err) => {\n const nodeProps = {\n id: `${infoNodeIdBase}-${err.message}`,\n parentId: parent.id,\n };\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: hierarchyLevelSizeLimit });\n return of([{ ...nodeProps, type: \"ResultSetTooLarge\" as const, resultSetSizeLimit: err.limit }]);\n }\n this._onHierarchyLoadError({ parentId: parent.id, type: isTimeoutError(err) ? \"timeout\" : \"unknown\" });\n return of([{ ...nodeProps, type: \"Unknown\" as const, message: \"Failed to create hierarchy level\" }]);\n }),\n map(\n (childNodes): LoadedTreePart => ({\n parentId: parent.id,\n loadedNodes:\n instanceFilter && childNodes.length === 0\n ? [\n {\n id: `${infoNodeIdBase}-no-filter-matches`,\n parentId: parent.id,\n type: \"NoFilterMatches\" as const,\n },\n ]\n : childNodes.map(treeModelNodesFactory),\n }),\n ),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n from(loadedPart.loadedNodes.filter((node): node is TreeModelHierarchyNode => isTreeModelHierarchyNode(node) && shouldLoadChildren(node))).pipe(\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n ),\n ),\n );\n }\n}\n\nfunction createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory,\n}: {\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n}): (node: TreeModelInfoNode | HierarchyNode) => TreeModelNode {\n return (node: TreeModelInfoNode | HierarchyNode) => {\n if (!isHierarchyNode(node)) {\n return node;\n }\n\n const modelNode: TreeModelHierarchyNode = {\n id: treeNodeIdFactory(node),\n children: node.children,\n label: node.label,\n nodeData: node,\n };\n return buildNode ? buildNode(modelNode) : modelNode;\n };\n}\n\nfunction isHierarchyNode(node: TreeModelInfoNode | HierarchyNode): node is HierarchyNode {\n return \"key\" in node && node.key !== undefined;\n}\n\nfunction isRowsLimitError(error: Error): error is RowsLimitExceededError {\n const asRowsError = error as RowsLimitExceededError;\n return asRowsError.limit !== undefined && asRowsError.message.includes(\"Query rows limit of\");\n}\n\nfunction isTimeoutError(error: Error) {\n return error.message.includes(\"query too long to execute or server is too busy\");\n}\n"]}
1
+ {"version":3,"file":"TreeLoader.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { catchError, expand, from, map, mergeMap, Observable, of, toArray } from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider, RowsLimitExceededError } from \"@itwin/presentation-hierarchies\";\nimport { isTreeModelHierarchyNode, TreeModelHierarchyNode, TreeModelInfoNode, TreeModelNode, TreeModelRootNode } from \"./TreeModel\";\nimport { createNodeId } from \"./Utils\";\n\n/** @internal */\nexport interface LoadedTreePart {\n parentId: string | undefined;\n loadedNodes: TreeModelNode[];\n}\n\n/** @internal */\nexport interface HierarchyLevelOptions {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n}\n\n/** @internal */\nexport interface LoadNodesOptions {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;\n shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n ignoreCache?: boolean;\n}\n\n/** @internal */\nexport interface ITreeLoader {\n loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;\n}\n\n/** @internal */\nexport class TreeLoader implements ITreeLoader {\n private _treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n\n constructor(\n private _hierarchyProvider: HierarchyProvider,\n private _onHierarchyLimitExceeded: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\" }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? /* istanbul ignore next */ createNodeId;\n }\n\n private loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache }: Omit<LoadNodesOptions, \"shouldLoadChildren\">) {\n const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);\n const infoNodeIdBase = `${parent.id ?? \"<root>\"}`;\n const treeModelNodesFactory = createTreeModelNodesFactory({ buildNode, treeNodeIdFactory: this._treeNodeIdFactory });\n return from(\n this._hierarchyProvider.getNodes({\n parentNode: parent.nodeData,\n hierarchyLevelSizeLimit,\n instanceFilter,\n ignoreCache,\n }),\n ).pipe(\n toArray(),\n catchError((err) => {\n const nodeProps = {\n id: `${infoNodeIdBase}-${err.message}`,\n parentId: parent.id,\n };\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });\n return of([{ ...nodeProps, type: \"ResultSetTooLarge\" as const, resultSetSizeLimit: err.limit }]);\n }\n this._onHierarchyLoadError({ parentId: parent.id, type: isTimeoutError(err) ? \"timeout\" : \"unknown\" });\n return of([{ ...nodeProps, type: \"Unknown\" as const, message: \"Failed to create hierarchy level\" }]);\n }),\n map(\n (childNodes): LoadedTreePart => ({\n parentId: parent.id,\n loadedNodes:\n instanceFilter && childNodes.length === 0\n ? [\n {\n id: `${infoNodeIdBase}-no-filter-matches`,\n parentId: parent.id,\n type: \"NoFilterMatches\" as const,\n },\n ]\n : childNodes.map(treeModelNodesFactory),\n }),\n ),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n from(loadedPart.loadedNodes.filter((node): node is TreeModelHierarchyNode => isTreeModelHierarchyNode(node) && shouldLoadChildren(node))).pipe(\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n ),\n ),\n );\n }\n}\n\nfunction createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory,\n}: {\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n}): (node: TreeModelInfoNode | HierarchyNode) => TreeModelNode {\n return (node: TreeModelInfoNode | HierarchyNode) => {\n if (!isHierarchyNode(node)) {\n return node;\n }\n\n const modelNode: TreeModelHierarchyNode = {\n id: treeNodeIdFactory(node),\n children: node.children,\n label: node.label,\n nodeData: node,\n };\n return buildNode ? buildNode(modelNode) : modelNode;\n };\n}\n\nfunction isHierarchyNode(node: TreeModelInfoNode | HierarchyNode): node is HierarchyNode {\n return \"key\" in node && node.key !== undefined;\n}\n\nfunction isRowsLimitError(error: Error): error is RowsLimitExceededError {\n const asRowsError = error as RowsLimitExceededError;\n return asRowsError.limit !== undefined && asRowsError.message.includes(\"Query rows limit of\");\n}\n\nfunction isTimeoutError(error: Error) {\n return error.message.includes(\"query too long to execute or server is too busy\");\n}\n"]}
@@ -32,7 +32,7 @@ export class TreeLoader {
32
32
  parentId: parent.id,
33
33
  };
34
34
  if (isRowsLimitError(err)) {
35
- this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: hierarchyLevelSizeLimit });
35
+ this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });
36
36
  return of([{ ...nodeProps, type: "ResultSetTooLarge", resultSetSizeLimit: err.limit }]);
37
37
  }
38
38
  this._onHierarchyLoadError({ parentId: parent.id, type: isTimeoutError(err) ? "timeout" : "unknown" });
@@ -1 +1 @@
1
- {"version":3,"file":"TreeLoader.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { catchError, expand, from, map, mergeMap, Observable, of, toArray } from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider, RowsLimitExceededError } from \"@itwin/presentation-hierarchies\";\nimport { isTreeModelHierarchyNode, TreeModelHierarchyNode, TreeModelInfoNode, TreeModelNode, TreeModelRootNode } from \"./TreeModel\";\nimport { createNodeId } from \"./Utils\";\n\n/** @internal */\nexport interface LoadedTreePart {\n parentId: string | undefined;\n loadedNodes: TreeModelNode[];\n}\n\n/** @internal */\nexport interface HierarchyLevelOptions {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n}\n\n/** @internal */\nexport interface LoadNodesOptions {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;\n shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n ignoreCache?: boolean;\n}\n\n/** @internal */\nexport interface ITreeLoader {\n loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;\n}\n\n/** @internal */\nexport class TreeLoader implements ITreeLoader {\n private _treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n\n constructor(\n private _hierarchyProvider: HierarchyProvider,\n private _onHierarchyLimitExceeded: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\" }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? /* istanbul ignore next */ createNodeId;\n }\n\n private loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache }: Omit<LoadNodesOptions, \"shouldLoadChildren\">) {\n const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);\n const infoNodeIdBase = `${parent.id ?? \"<root>\"}`;\n const treeModelNodesFactory = createTreeModelNodesFactory({ buildNode, treeNodeIdFactory: this._treeNodeIdFactory });\n return from(\n this._hierarchyProvider.getNodes({\n parentNode: parent.nodeData,\n hierarchyLevelSizeLimit,\n instanceFilter,\n ignoreCache,\n }),\n ).pipe(\n toArray(),\n catchError((err) => {\n const nodeProps = {\n id: `${infoNodeIdBase}-${err.message}`,\n parentId: parent.id,\n };\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: hierarchyLevelSizeLimit });\n return of([{ ...nodeProps, type: \"ResultSetTooLarge\" as const, resultSetSizeLimit: err.limit }]);\n }\n this._onHierarchyLoadError({ parentId: parent.id, type: isTimeoutError(err) ? \"timeout\" : \"unknown\" });\n return of([{ ...nodeProps, type: \"Unknown\" as const, message: \"Failed to create hierarchy level\" }]);\n }),\n map(\n (childNodes): LoadedTreePart => ({\n parentId: parent.id,\n loadedNodes:\n instanceFilter && childNodes.length === 0\n ? [\n {\n id: `${infoNodeIdBase}-no-filter-matches`,\n parentId: parent.id,\n type: \"NoFilterMatches\" as const,\n },\n ]\n : childNodes.map(treeModelNodesFactory),\n }),\n ),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n from(loadedPart.loadedNodes.filter((node): node is TreeModelHierarchyNode => isTreeModelHierarchyNode(node) && shouldLoadChildren(node))).pipe(\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n ),\n ),\n );\n }\n}\n\nfunction createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory,\n}: {\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n}): (node: TreeModelInfoNode | HierarchyNode) => TreeModelNode {\n return (node: TreeModelInfoNode | HierarchyNode) => {\n if (!isHierarchyNode(node)) {\n return node;\n }\n\n const modelNode: TreeModelHierarchyNode = {\n id: treeNodeIdFactory(node),\n children: node.children,\n label: node.label,\n nodeData: node,\n };\n return buildNode ? buildNode(modelNode) : modelNode;\n };\n}\n\nfunction isHierarchyNode(node: TreeModelInfoNode | HierarchyNode): node is HierarchyNode {\n return \"key\" in node && node.key !== undefined;\n}\n\nfunction isRowsLimitError(error: Error): error is RowsLimitExceededError {\n const asRowsError = error as RowsLimitExceededError;\n return asRowsError.limit !== undefined && asRowsError.message.includes(\"Query rows limit of\");\n}\n\nfunction isTimeoutError(error: Error) {\n return error.message.includes(\"query too long to execute or server is too busy\");\n}\n"]}
1
+ {"version":3,"file":"TreeLoader.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { catchError, expand, from, map, mergeMap, Observable, of, toArray } from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider, RowsLimitExceededError } from \"@itwin/presentation-hierarchies\";\nimport { isTreeModelHierarchyNode, TreeModelHierarchyNode, TreeModelInfoNode, TreeModelNode, TreeModelRootNode } from \"./TreeModel\";\nimport { createNodeId } from \"./Utils\";\n\n/** @internal */\nexport interface LoadedTreePart {\n parentId: string | undefined;\n loadedNodes: TreeModelNode[];\n}\n\n/** @internal */\nexport interface HierarchyLevelOptions {\n instanceFilter?: GenericInstanceFilter;\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n}\n\n/** @internal */\nexport interface LoadNodesOptions {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n getHierarchyLevelOptions: (node: TreeModelRootNode | TreeModelHierarchyNode) => HierarchyLevelOptions;\n shouldLoadChildren: (node: TreeModelHierarchyNode) => boolean;\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n ignoreCache?: boolean;\n}\n\n/** @internal */\nexport interface ITreeLoader {\n loadNodes(options: LoadNodesOptions): Observable<LoadedTreePart>;\n}\n\n/** @internal */\nexport class TreeLoader implements ITreeLoader {\n private _treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n\n constructor(\n private _hierarchyProvider: HierarchyProvider,\n private _onHierarchyLimitExceeded: (props: { parentId?: string; filter?: GenericInstanceFilter; limit?: number | \"unbounded\" }) => void,\n private _onHierarchyLoadError: (props: { parentId?: string; type: \"timeout\" | \"unknown\" }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? /* istanbul ignore next */ createNodeId;\n }\n\n private loadChildren({ parent, getHierarchyLevelOptions, buildNode, ignoreCache }: Omit<LoadNodesOptions, \"shouldLoadChildren\">) {\n const { instanceFilter, hierarchyLevelSizeLimit } = getHierarchyLevelOptions(parent);\n const infoNodeIdBase = `${parent.id ?? \"<root>\"}`;\n const treeModelNodesFactory = createTreeModelNodesFactory({ buildNode, treeNodeIdFactory: this._treeNodeIdFactory });\n return from(\n this._hierarchyProvider.getNodes({\n parentNode: parent.nodeData,\n hierarchyLevelSizeLimit,\n instanceFilter,\n ignoreCache,\n }),\n ).pipe(\n toArray(),\n catchError((err) => {\n const nodeProps = {\n id: `${infoNodeIdBase}-${err.message}`,\n parentId: parent.id,\n };\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });\n return of([{ ...nodeProps, type: \"ResultSetTooLarge\" as const, resultSetSizeLimit: err.limit }]);\n }\n this._onHierarchyLoadError({ parentId: parent.id, type: isTimeoutError(err) ? \"timeout\" : \"unknown\" });\n return of([{ ...nodeProps, type: \"Unknown\" as const, message: \"Failed to create hierarchy level\" }]);\n }),\n map(\n (childNodes): LoadedTreePart => ({\n parentId: parent.id,\n loadedNodes:\n instanceFilter && childNodes.length === 0\n ? [\n {\n id: `${infoNodeIdBase}-no-filter-matches`,\n parentId: parent.id,\n type: \"NoFilterMatches\" as const,\n },\n ]\n : childNodes.map(treeModelNodesFactory),\n }),\n ),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n from(loadedPart.loadedNodes.filter((node): node is TreeModelHierarchyNode => isTreeModelHierarchyNode(node) && shouldLoadChildren(node))).pipe(\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n ),\n ),\n );\n }\n}\n\nfunction createTreeModelNodesFactory({\n buildNode,\n treeNodeIdFactory,\n}: {\n buildNode?: (node: TreeModelHierarchyNode) => TreeModelHierarchyNode;\n treeNodeIdFactory: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string;\n}): (node: TreeModelInfoNode | HierarchyNode) => TreeModelNode {\n return (node: TreeModelInfoNode | HierarchyNode) => {\n if (!isHierarchyNode(node)) {\n return node;\n }\n\n const modelNode: TreeModelHierarchyNode = {\n id: treeNodeIdFactory(node),\n children: node.children,\n label: node.label,\n nodeData: node,\n };\n return buildNode ? buildNode(modelNode) : modelNode;\n };\n}\n\nfunction isHierarchyNode(node: TreeModelInfoNode | HierarchyNode): node is HierarchyNode {\n return \"key\" in node && node.key !== undefined;\n}\n\nfunction isRowsLimitError(error: Error): error is RowsLimitExceededError {\n const asRowsError = error as RowsLimitExceededError;\n return asRowsError.limit !== undefined && asRowsError.message.includes(\"Query rows limit of\");\n}\n\nfunction isTimeoutError(error: Error) {\n return error.message.includes(\"query too long to execute or server is too busy\");\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/presentation-hierarchies-react",
3
- "version": "0.8.2",
3
+ "version": "1.0.1",
4
4
  "description": "React components based on `@itwin/presentation-hierarchies`",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -38,9 +38,9 @@
38
38
  "immer": "^10.0.4",
39
39
  "react-error-boundary": "^4.0.13",
40
40
  "rxjs": "^7.8.1",
41
- "@itwin/presentation-hierarchies": "^0.7.1",
42
- "@itwin/presentation-shared": "^0.5.0",
43
- "@itwin/unified-selection": "^0.5.1"
41
+ "@itwin/presentation-hierarchies": "^1.1.0",
42
+ "@itwin/presentation-shared": "^1.0.0",
43
+ "@itwin/unified-selection": "^1.0.1"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@itwin/itwinui-react": "^3.0.0",
@@ -97,8 +97,9 @@
97
97
  "clean": "rimraf lib build",
98
98
  "cover": "nyc npm -s test",
99
99
  "lint": "eslint ./src/**/*.{ts,tsx}",
100
- "test": "mocha --enable-source-maps --config ./.mocharc.json \"./lib/cjs/test/**/*.test.js\"",
101
- "test:watch": "npm -s test -- --reporter min --watch-extensions ts,tsx --watch",
100
+ "test": "mocha --enable-source-maps --parallel --config ./.mocharc.json",
101
+ "test:dev": "mocha --enable-source-maps --config ./.mocharc.json",
102
+ "test:watch": "npm run -s test:dev -- --reporter min --watch-extensions ts,tsx --watch",
102
103
  "extract-api": "extract-api --entry=presentation-hierarchies-react --apiReportFolder=./api --apiReportTempFolder=./api/temp --apiSummaryFolder=./api",
103
104
  "check-internal": "node ../../scripts/checkInternal.js --apiSummary ./api/presentation-hierarchies-react.api.md",
104
105
  "update-extractions": "node ../../scripts/updateExtractions.js --targets=./README.md",