@itwin/presentation-hierarchies-react 2.0.0-alpha.3 → 2.0.0-alpha.30
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 +520 -0
- package/README.md +24 -24
- package/lib/esm/presentation-hierarchies-react/Renderers.d.ts +85 -0
- package/lib/esm/presentation-hierarchies-react/Renderers.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/{itwinui/TreeActionButton.css → Renderers.js} +2 -4
- package/lib/esm/presentation-hierarchies-react/Renderers.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts +14 -29
- package/lib/esm/presentation-hierarchies-react/TreeNode.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/TreeNode.js +1 -7
- package/lib/esm/presentation-hierarchies-react/TreeNode.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/UseIModelTree.d.ts +2 -0
- package/lib/esm/presentation-hierarchies-react/UseIModelTree.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/UseIModelTree.js +1 -1
- package/lib/esm/presentation-hierarchies-react/UseIModelTree.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts +3 -3
- package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js +1 -8
- package/lib/esm/presentation-hierarchies-react/UseSelectionHandler.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/UseTree.d.ts +32 -70
- package/lib/esm/presentation-hierarchies-react/UseTree.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/UseTree.js +48 -49
- package/lib/esm/presentation-hierarchies-react/UseTree.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/Utils.d.ts +5 -0
- package/lib/esm/presentation-hierarchies-react/Utils.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/Utils.js +23 -0
- package/lib/esm/presentation-hierarchies-react/Utils.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts +2 -2
- package/lib/esm/presentation-hierarchies-react/internal/TreeActions.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js +31 -16
- package/lib/esm/presentation-hierarchies-react/internal/TreeActions.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts +24 -6
- package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js +28 -32
- package/lib/esm/presentation-hierarchies-react/internal/TreeLoader.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts +6 -29
- package/lib/esm/presentation-hierarchies-react/internal/TreeModel.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js +31 -27
- package/lib/esm/presentation-hierarchies-react/internal/TreeModel.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts +23 -9
- package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js +16 -29
- package/lib/esm/presentation-hierarchies-react/internal/UseUnifiedSelection.js.map +1 -1
- package/lib/esm/presentation-hierarchies-react/stratakit/FilterAction.d.ts +34 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FilterAction.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FilterAction.js +26 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FilterAction.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.d.ts +58 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.js +74 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/FlatTreeNode.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/{itwinui → stratakit}/LocalizationContext.d.ts +47 -7
- package/lib/esm/presentation-hierarchies-react/stratakit/LocalizationContext.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/{itwinui → stratakit}/LocalizationContext.js +13 -5
- package/lib/esm/presentation-hierarchies-react/stratakit/LocalizationContext.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RenameAction.d.ts +33 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RenameAction.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RenameAction.js +39 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RenameAction.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts +16 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.js +42 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/RootErrorRenderer.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts +43 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js +70 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeErrorRenderer.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts +49 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js +116 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts +40 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.d.ts.map +1 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.js +93 -0
- package/lib/esm/presentation-hierarchies-react/stratakit/TreeRenderer.js.map +1 -0
- package/lib/esm/presentation-hierarchies-react.d.ts +12 -10
- package/lib/esm/presentation-hierarchies-react.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies-react.js +9 -9
- package/lib/esm/presentation-hierarchies-react.js.map +1 -1
- package/package.json +46 -38
- package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.d.ts +0 -15
- package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.js +0 -22
- package/lib/esm/presentation-hierarchies-react/UnifiedSelectionContext.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/LocalizationContext.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/LocalizationContext.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.d.ts +0 -21
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.js +0 -29
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeActionButton.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.d.ts +0 -12
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.js +0 -72
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeErrorRenderer.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.d.ts +0 -12
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.js +0 -10
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeLevelRenderer.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts +0 -45
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js +0 -71
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeNodeRenderer.js.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts +0 -30
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.d.ts.map +0 -1
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js +0 -22
- package/lib/esm/presentation-hierarchies-react/itwinui/TreeRenderer.js.map +0 -1
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { Observable } from "rxjs";
|
|
2
2
|
import { GenericInstanceFilter, HierarchyNode, HierarchyProvider } from "@itwin/presentation-hierarchies";
|
|
3
|
-
import {
|
|
3
|
+
import { ErrorInfo } from "../TreeNode.js";
|
|
4
|
+
import { TreeModelHierarchyNode, TreeModelRootNode } from "./TreeModel.js";
|
|
4
5
|
/** @internal */
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export type LoadedTreePart = {
|
|
7
|
+
parent: TreeModelHierarchyNode | TreeModelRootNode;
|
|
8
|
+
} & ({
|
|
9
|
+
loadedNodes: TreeModelHierarchyNode[];
|
|
10
|
+
} | {
|
|
11
|
+
error: ErrorInfo;
|
|
12
|
+
});
|
|
9
13
|
/** @internal */
|
|
10
14
|
export interface HierarchyLevelOptions {
|
|
11
15
|
instanceFilter?: GenericInstanceFilter;
|
|
@@ -39,6 +43,20 @@ export declare class TreeLoader implements ITreeLoader {
|
|
|
39
43
|
error: unknown;
|
|
40
44
|
}) => void, treeNodeIdFactory?: (node: Pick<HierarchyNode, "key" | "parentKeys">) => string);
|
|
41
45
|
private loadChildren;
|
|
42
|
-
loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions): Observable<LoadedTreePart
|
|
46
|
+
loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions): Observable<LoadedTreePart | {
|
|
47
|
+
parent: TreeModelRootNode | TreeModelHierarchyNode;
|
|
48
|
+
error: {
|
|
49
|
+
id: string;
|
|
50
|
+
type: "ResultSetTooLarge";
|
|
51
|
+
resultSetSizeLimit: number;
|
|
52
|
+
};
|
|
53
|
+
} | {
|
|
54
|
+
parent: TreeModelRootNode | TreeModelHierarchyNode;
|
|
55
|
+
error: {
|
|
56
|
+
id: string;
|
|
57
|
+
type: "Unknown";
|
|
58
|
+
message: string;
|
|
59
|
+
};
|
|
60
|
+
}>;
|
|
43
61
|
}
|
|
44
62
|
//# sourceMappingURL=TreeLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeLoader.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"TreeLoader.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0D,UAAU,EAAe,MAAM,MAAM,CAAC;AACvG,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,iBAAiB,EAA0B,MAAM,iCAAiC,CAAC;AAClI,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG3E,gBAAgB;AAChB,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,sBAAsB,GAAG,iBAAiB,CAAC;CACpD,GAAG,CACA;IACE,WAAW,EAAE,sBAAsB,EAAE,CAAC;CACvC,GACD;IACE,KAAK,EAAE,SAAS,CAAC;CAClB,CACJ,CAAC;AAEF,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,uBAAuB,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAChD;AAED,gBAAgB;AAChB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,sBAAsB,GAAG,iBAAiB,CAAC;IACnD,wBAAwB,EAAE,CAAC,IAAI,EAAE,iBAAiB,GAAG,sBAAsB,KAAK,qBAAqB,CAAC;IACtG,kBAAkB,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAC9D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,sBAAsB,CAAC;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;CAClE;AAED,gBAAgB;AAChB,qBAAa,UAAW,YAAW,WAAW;IAI1C,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,yBAAyB;IACjC,OAAO,CAAC,qBAAqB;IAL/B,OAAO,CAAC,kBAAkB,CAA8D;gBAG9E,kBAAkB,EAAE,iBAAiB,EACrC,yBAAyB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KAAE,KAAK,IAAI,EAC/H,qBAAqB,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,EAClH,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,YAAY,CAAC,KAAK,MAAM;IAKjF,OAAO,CAAC,YAAY;IAuDb,SAAS,CAAC,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,EAAE,gBAAgB;;;;;;;;;;;;;;;CAYtE"}
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { catchError, expand, from, map, mergeMap, of, toArray } from "rxjs";
|
|
6
|
-
import { isTreeModelHierarchyNode } from "./TreeModel.js";
|
|
5
|
+
import { catchError, EMPTY, expand, filter, from, map, mergeMap, of, toArray } from "rxjs";
|
|
7
6
|
import { createNodeId } from "./Utils.js";
|
|
8
7
|
/** @internal */
|
|
9
8
|
export class TreeLoader {
|
|
@@ -26,52 +25,52 @@ export class TreeLoader {
|
|
|
26
25
|
hierarchyLevelSizeLimit,
|
|
27
26
|
instanceFilter,
|
|
28
27
|
ignoreCache,
|
|
29
|
-
})).pipe(toArray(),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
})).pipe(toArray(), map((childNodes) => {
|
|
29
|
+
return instanceFilter && childNodes.length === 0
|
|
30
|
+
? {
|
|
31
|
+
parent,
|
|
32
|
+
error: {
|
|
33
|
+
id: `${infoNodeIdBase}-no-filter-matches`,
|
|
34
|
+
type: "NoFilterMatches",
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
: {
|
|
38
|
+
parent,
|
|
39
|
+
loadedNodes: childNodes.map(treeModelNodesFactory),
|
|
40
|
+
};
|
|
41
|
+
}), catchError((err) => {
|
|
34
42
|
let hierarchyLoadErrorType = "unknown";
|
|
35
43
|
if (err instanceof Error) {
|
|
36
|
-
nodeProps.id = `${infoNodeIdBase}-${err.message}`;
|
|
37
44
|
if (isRowsLimitError(err)) {
|
|
38
45
|
this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });
|
|
39
|
-
return of(
|
|
46
|
+
return of({
|
|
47
|
+
parent,
|
|
48
|
+
error: { id: `${infoNodeIdBase}-${err.message}`, type: "ResultSetTooLarge", resultSetSizeLimit: err.limit },
|
|
49
|
+
});
|
|
40
50
|
}
|
|
41
51
|
if (isTimeoutError(err)) {
|
|
42
52
|
hierarchyLoadErrorType = "timeout";
|
|
43
53
|
}
|
|
44
54
|
}
|
|
45
55
|
this._onHierarchyLoadError({ parentId: parent.id, type: hierarchyLoadErrorType, error: err });
|
|
46
|
-
return of(
|
|
47
|
-
|
|
48
|
-
|
|
56
|
+
return of({
|
|
57
|
+
parent,
|
|
58
|
+
error: {
|
|
59
|
+
id: `${infoNodeIdBase}-Unknown`,
|
|
49
60
|
type: "Unknown",
|
|
50
61
|
message: "Failed to create hierarchy level",
|
|
51
62
|
},
|
|
52
|
-
|
|
53
|
-
})
|
|
54
|
-
parentId: parent.id,
|
|
55
|
-
loadedNodes: instanceFilter && childNodes.length === 0
|
|
56
|
-
? [
|
|
57
|
-
{
|
|
58
|
-
id: `${infoNodeIdBase}-no-filter-matches`,
|
|
59
|
-
parentId: parent.id,
|
|
60
|
-
type: "NoFilterMatches",
|
|
61
|
-
},
|
|
62
|
-
]
|
|
63
|
-
: childNodes.map(treeModelNodesFactory),
|
|
64
|
-
})));
|
|
63
|
+
});
|
|
64
|
+
}));
|
|
65
65
|
}
|
|
66
66
|
loadNodes({ shouldLoadChildren, ...options }) {
|
|
67
|
-
return this.loadChildren(options).pipe(expand((loadedPart) =>
|
|
67
|
+
return this.loadChildren(options).pipe(expand((loadedPart) => "loadedNodes" in loadedPart
|
|
68
|
+
? from(loadedPart.loadedNodes).pipe(filter((node) => shouldLoadChildren(node)), mergeMap((node) => this.loadChildren({ ...options, parent: node })))
|
|
69
|
+
: EMPTY));
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
function createTreeModelNodesFactory({ buildNode, treeNodeIdFactory, }) {
|
|
71
73
|
return (node) => {
|
|
72
|
-
if (!isHierarchyNode(node)) {
|
|
73
|
-
return node;
|
|
74
|
-
}
|
|
75
74
|
const modelNode = {
|
|
76
75
|
id: treeNodeIdFactory(node),
|
|
77
76
|
children: node.children,
|
|
@@ -81,9 +80,6 @@ function createTreeModelNodesFactory({ buildNode, treeNodeIdFactory, }) {
|
|
|
81
80
|
return buildNode ? buildNode(modelNode) : modelNode;
|
|
82
81
|
};
|
|
83
82
|
}
|
|
84
|
-
function isHierarchyNode(node) {
|
|
85
|
-
return "key" in node && node.key !== undefined;
|
|
86
|
-
}
|
|
87
83
|
function isRowsLimitError(error) {
|
|
88
84
|
const asRowsError = error;
|
|
89
85
|
return asRowsError.limit !== undefined && asRowsError.message.includes("Query rows limit of");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeLoader.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeLoader.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAc,EAAE,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
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, EMPTY, expand, filter, from, map, mergeMap, Observable, of, toArray } from \"rxjs\";\nimport { GenericInstanceFilter, HierarchyNode, HierarchyProvider, RowsLimitExceededError } from \"@itwin/presentation-hierarchies\";\nimport { ErrorInfo } from \"../TreeNode.js\";\nimport { TreeModelHierarchyNode, TreeModelRootNode } from \"./TreeModel.js\";\nimport { createNodeId } from \"./Utils.js\";\n\n/** @internal */\nexport type LoadedTreePart = {\n parent: TreeModelHierarchyNode | TreeModelRootNode;\n} & (\n | {\n loadedNodes: TreeModelHierarchyNode[];\n }\n | {\n error: ErrorInfo;\n }\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\"; error: unknown }) => void,\n treeNodeIdFactory?: (node: Pick<HierarchyNode, \"key\" | \"parentKeys\">) => string,\n ) {\n this._treeNodeIdFactory = treeNodeIdFactory ?? /* c8 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 map((childNodes): LoadedTreePart => {\n return instanceFilter && childNodes.length === 0\n ? {\n parent,\n error: {\n id: `${infoNodeIdBase}-no-filter-matches`,\n type: \"NoFilterMatches\" as const,\n },\n }\n : {\n parent,\n loadedNodes: childNodes.map(treeModelNodesFactory),\n };\n }),\n catchError((err) => {\n let hierarchyLoadErrorType: \"unknown\" | \"timeout\" = \"unknown\";\n if (err instanceof Error) {\n if (isRowsLimitError(err)) {\n this._onHierarchyLimitExceeded({ parentId: parent.id, filter: instanceFilter, limit: err.limit });\n return of({\n parent,\n error: { id: `${infoNodeIdBase}-${err.message}`, type: \"ResultSetTooLarge\" as const, resultSetSizeLimit: err.limit },\n });\n }\n if (isTimeoutError(err)) {\n hierarchyLoadErrorType = \"timeout\";\n }\n }\n\n this._onHierarchyLoadError({ parentId: parent.id, type: hierarchyLoadErrorType, error: err });\n return of({\n parent,\n error: {\n id: `${infoNodeIdBase}-Unknown`,\n type: \"Unknown\" as const,\n message: \"Failed to create hierarchy level\",\n },\n });\n }),\n );\n }\n\n public loadNodes({ shouldLoadChildren, ...options }: LoadNodesOptions) {\n return this.loadChildren(options).pipe(\n expand((loadedPart) =>\n \"loadedNodes\" in loadedPart\n ? from(loadedPart.loadedNodes).pipe(\n filter((node) => shouldLoadChildren(node)),\n mergeMap((node) => this.loadChildren({ ...options, parent: node })),\n )\n : EMPTY,\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: HierarchyNode) => TreeModelHierarchyNode {\n return (node: HierarchyNode) => {\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 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,4 +1,5 @@
|
|
|
1
1
|
import { GenericInstanceFilter, HierarchyNode } from "@itwin/presentation-hierarchies";
|
|
2
|
+
import { ErrorInfo } from "../TreeNode.js";
|
|
2
3
|
import { SelectionChangeType } from "../UseSelectionHandler.js";
|
|
3
4
|
/** @internal */
|
|
4
5
|
export interface TreeModelRootNode {
|
|
@@ -7,6 +8,7 @@ export interface TreeModelRootNode {
|
|
|
7
8
|
hierarchyLimit?: number | "unbounded";
|
|
8
9
|
instanceFilter?: GenericInstanceFilter;
|
|
9
10
|
isLoading?: boolean;
|
|
11
|
+
error?: ErrorInfo;
|
|
10
12
|
}
|
|
11
13
|
/** @internal */
|
|
12
14
|
export interface TreeModelHierarchyNode {
|
|
@@ -19,39 +21,14 @@ export interface TreeModelHierarchyNode {
|
|
|
19
21
|
isSelected?: boolean;
|
|
20
22
|
hierarchyLimit?: number | "unbounded";
|
|
21
23
|
instanceFilter?: GenericInstanceFilter;
|
|
24
|
+
error?: ErrorInfo;
|
|
22
25
|
}
|
|
23
26
|
/** @internal */
|
|
24
|
-
export
|
|
25
|
-
id: string;
|
|
26
|
-
parentId: string | undefined;
|
|
27
|
-
type: "Unknown";
|
|
28
|
-
message: string;
|
|
29
|
-
}
|
|
30
|
-
/** @internal */
|
|
31
|
-
export interface TreeModelNoFilterMatchesInfoNode {
|
|
32
|
-
id: string;
|
|
33
|
-
parentId: string | undefined;
|
|
34
|
-
type: "NoFilterMatches";
|
|
35
|
-
}
|
|
36
|
-
/** @internal */
|
|
37
|
-
export interface TreeModelResultSetTooLargeInfoNode {
|
|
38
|
-
id: string;
|
|
39
|
-
parentId: string | undefined;
|
|
40
|
-
type: "ResultSetTooLarge";
|
|
41
|
-
resultSetSizeLimit: number;
|
|
42
|
-
}
|
|
43
|
-
/** @internal */
|
|
44
|
-
export type TreeModelInfoNode = TreeModelGenericInfoNode | TreeModelResultSetTooLargeInfoNode | TreeModelNoFilterMatchesInfoNode;
|
|
45
|
-
/** @internal */
|
|
46
|
-
export type TreeModelNode = TreeModelHierarchyNode | TreeModelInfoNode;
|
|
47
|
-
/** @internal */
|
|
48
|
-
export declare function isTreeModelHierarchyNode(node: TreeModelHierarchyNode | TreeModelInfoNode | TreeModelRootNode): node is TreeModelHierarchyNode;
|
|
49
|
-
/** @internal */
|
|
50
|
-
export declare function isTreeModelInfoNode(node: TreeModelHierarchyNode | TreeModelInfoNode | TreeModelRootNode): node is TreeModelInfoNode;
|
|
27
|
+
export declare function isTreeModelHierarchyNode(node: TreeModelHierarchyNode | ErrorInfo | TreeModelRootNode): node is TreeModelHierarchyNode;
|
|
51
28
|
/** @internal */
|
|
52
29
|
export interface TreeModel {
|
|
53
30
|
parentChildMap: Map<string | undefined, string[]>;
|
|
54
|
-
idToNode: Map<string,
|
|
31
|
+
idToNode: Map<string, TreeModelHierarchyNode>;
|
|
55
32
|
rootNode: TreeModelRootNode;
|
|
56
33
|
}
|
|
57
34
|
/** @internal */
|
|
@@ -64,7 +41,7 @@ export declare namespace TreeModel {
|
|
|
64
41
|
function setInstanceFilter(model: TreeModel, nodeId: string | undefined, filter?: GenericInstanceFilter): boolean;
|
|
65
42
|
function selectNodes(model: TreeModel, nodeIds: Array<string>, changeType: SelectionChangeType): void;
|
|
66
43
|
function isNodeSelected(model: TreeModel, nodeId: string): boolean;
|
|
67
|
-
function getNode(model: TreeModel, nodeId: string | undefined):
|
|
44
|
+
function getNode(model: TreeModel, nodeId: string | undefined): TreeModelHierarchyNode | TreeModelRootNode | undefined;
|
|
68
45
|
function setIsLoading(model: TreeModel, nodeId: string | undefined, isLoading: boolean): void;
|
|
69
46
|
}
|
|
70
47
|
//# sourceMappingURL=TreeModel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeModel.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeModel.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACtC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TreeModel.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeModel.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACtC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,gBAAgB;AAChB,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACtC,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,gBAAgB;AAChB,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,IAAI,sBAAsB,CAErI;AAED,gBAAgB;AAChB,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC9C,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,gBAAgB;AAChB,yBAAiB,SAAS,CAAC;IACzB,SAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,gBAAgB,CA6B5H;IAED,gBAAgB;IAChB,SAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,EAAE,SAAS,GAAG,IAAI,CAkB7G;IAED,SAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAelF;IAED,SAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAIrH;IAED,SAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAOvH;IAED,SAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,mBAAmB,QAcpG;IAED,SAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGxE;IAED,SAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,sBAAsB,GAAG,iBAAiB,GAAG,SAAS,CAK5H;IAED,SAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,QAW5F;CACF"}
|
|
@@ -7,42 +7,38 @@ export function isTreeModelHierarchyNode(node) {
|
|
|
7
7
|
return "nodeData" in node && node.nodeData !== undefined;
|
|
8
8
|
}
|
|
9
9
|
/** @internal */
|
|
10
|
-
export function isTreeModelInfoNode(node) {
|
|
11
|
-
return "type" in node && node.type !== undefined;
|
|
12
|
-
}
|
|
13
|
-
/** @internal */
|
|
14
10
|
export var TreeModel;
|
|
15
11
|
(function (TreeModel) {
|
|
16
12
|
function expandNode(model, nodeId, isExpanded) {
|
|
17
13
|
const node = model.idToNode.get(nodeId);
|
|
18
|
-
if (!node
|
|
14
|
+
if (!node) {
|
|
19
15
|
return "none";
|
|
20
16
|
}
|
|
21
17
|
node.isExpanded = isExpanded;
|
|
22
|
-
if (!isExpanded
|
|
18
|
+
if (!isExpanded) {
|
|
23
19
|
return "none";
|
|
24
20
|
}
|
|
25
|
-
|
|
26
|
-
if (!children) {
|
|
21
|
+
if (node.error?.type === "Unknown") {
|
|
27
22
|
node.isLoading = true;
|
|
28
|
-
|
|
23
|
+
// remove subtree if there `Unknown` error info in order to attempt reloading children
|
|
24
|
+
TreeModel.removeSubTree(model, nodeId);
|
|
25
|
+
return "reloadChildren";
|
|
29
26
|
}
|
|
30
|
-
if (children
|
|
27
|
+
if (!node.children) {
|
|
31
28
|
return "none";
|
|
32
29
|
}
|
|
33
|
-
const
|
|
34
|
-
if (!
|
|
35
|
-
|
|
30
|
+
const children = model.parentChildMap.get(node.id);
|
|
31
|
+
if (!children) {
|
|
32
|
+
node.isLoading = true;
|
|
33
|
+
return "loadChildren";
|
|
36
34
|
}
|
|
37
|
-
|
|
38
|
-
TreeModel.removeSubTree(model, nodeId);
|
|
39
|
-
node.isLoading = true;
|
|
40
|
-
return "reloadChildren";
|
|
35
|
+
return "none";
|
|
41
36
|
}
|
|
42
37
|
TreeModel.expandNode = expandNode;
|
|
43
38
|
/** @internal */
|
|
44
39
|
function addHierarchyPart(model, rootId, hierarchyPart) {
|
|
45
40
|
removeSubTree(model, rootId);
|
|
41
|
+
model.rootNode.error = hierarchyPart.rootNode.error;
|
|
46
42
|
for (const [parentId, children] of hierarchyPart.parentChildMap) {
|
|
47
43
|
model.parentChildMap.set(parentId, children);
|
|
48
44
|
}
|
|
@@ -51,13 +47,14 @@ export var TreeModel;
|
|
|
51
47
|
}
|
|
52
48
|
const parentNode = rootId !== undefined ? model.idToNode.get(rootId) : model.rootNode;
|
|
53
49
|
/* c8 ignore next 3*/
|
|
54
|
-
if (!parentNode
|
|
50
|
+
if (!parentNode) {
|
|
55
51
|
return;
|
|
56
52
|
}
|
|
57
53
|
parentNode.isLoading = false;
|
|
58
54
|
}
|
|
59
55
|
TreeModel.addHierarchyPart = addHierarchyPart;
|
|
60
56
|
function removeSubTree(model, parentId) {
|
|
57
|
+
clearNodeError(model, parentId);
|
|
61
58
|
const currentChildren = model.parentChildMap.get(parentId);
|
|
62
59
|
if (!currentChildren) {
|
|
63
60
|
return;
|
|
@@ -65,7 +62,7 @@ export var TreeModel;
|
|
|
65
62
|
model.parentChildMap.delete(parentId);
|
|
66
63
|
for (const childId of currentChildren) {
|
|
67
64
|
const childNode = model.idToNode.get(childId);
|
|
68
|
-
if (childNode
|
|
65
|
+
if (childNode) {
|
|
69
66
|
removeSubTree(model, childNode.id);
|
|
70
67
|
}
|
|
71
68
|
model.idToNode.delete(childId);
|
|
@@ -80,7 +77,7 @@ export var TreeModel;
|
|
|
80
77
|
TreeModel.setHierarchyLimit = setHierarchyLimit;
|
|
81
78
|
function setInstanceFilter(model, nodeId, filter) {
|
|
82
79
|
return updateForReload(model, nodeId, (node) => {
|
|
83
|
-
if (filter &&
|
|
80
|
+
if (filter && node.id !== undefined) {
|
|
84
81
|
node.isExpanded = true;
|
|
85
82
|
}
|
|
86
83
|
node.instanceFilter = filter;
|
|
@@ -90,16 +87,13 @@ export var TreeModel;
|
|
|
90
87
|
function selectNodes(model, nodeIds, changeType) {
|
|
91
88
|
if (changeType === "replace") {
|
|
92
89
|
for (const [nodeId, node] of model.idToNode) {
|
|
93
|
-
if (!isTreeModelHierarchyNode(node)) {
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
90
|
node.isSelected = !!nodeIds.find((id) => id === nodeId);
|
|
97
91
|
}
|
|
98
92
|
return;
|
|
99
93
|
}
|
|
100
94
|
for (const nodeId of nodeIds) {
|
|
101
95
|
const modelNode = model.idToNode.get(nodeId);
|
|
102
|
-
if (!modelNode
|
|
96
|
+
if (!modelNode) {
|
|
103
97
|
return;
|
|
104
98
|
}
|
|
105
99
|
modelNode.isSelected = changeType === "add";
|
|
@@ -108,7 +102,7 @@ export var TreeModel;
|
|
|
108
102
|
TreeModel.selectNodes = selectNodes;
|
|
109
103
|
function isNodeSelected(model, nodeId) {
|
|
110
104
|
const currentNode = model.idToNode.get(nodeId);
|
|
111
|
-
return !!currentNode &&
|
|
105
|
+
return !!currentNode && !!currentNode.isSelected;
|
|
112
106
|
}
|
|
113
107
|
TreeModel.isNodeSelected = isNodeSelected;
|
|
114
108
|
function getNode(model, nodeId) {
|
|
@@ -125,7 +119,7 @@ export var TreeModel;
|
|
|
125
119
|
}
|
|
126
120
|
const modelNode = model.idToNode.get(nodeId);
|
|
127
121
|
/* c8 ignore next 3*/
|
|
128
|
-
if (!modelNode
|
|
122
|
+
if (!modelNode) {
|
|
129
123
|
return;
|
|
130
124
|
}
|
|
131
125
|
modelNode.isLoading = isLoading;
|
|
@@ -140,7 +134,7 @@ function updateForReload(model, nodeId, update) {
|
|
|
140
134
|
return true;
|
|
141
135
|
}
|
|
142
136
|
const modelNode = model.idToNode.get(nodeId);
|
|
143
|
-
if (!modelNode
|
|
137
|
+
if (!modelNode) {
|
|
144
138
|
return false;
|
|
145
139
|
}
|
|
146
140
|
update(modelNode);
|
|
@@ -150,4 +144,14 @@ function updateForReload(model, nodeId, update) {
|
|
|
150
144
|
}
|
|
151
145
|
return false;
|
|
152
146
|
}
|
|
147
|
+
function clearNodeError(model, parentId) {
|
|
148
|
+
if (!parentId) {
|
|
149
|
+
return (model.rootNode.error = undefined);
|
|
150
|
+
}
|
|
151
|
+
const node = model.idToNode.get(parentId);
|
|
152
|
+
if (!node) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
node.error = undefined;
|
|
156
|
+
}
|
|
153
157
|
//# sourceMappingURL=TreeModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeModel.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeModel.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 { GenericInstanceFilter, HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { SelectionChangeType } from \"../UseSelectionHandler.js\";\n\n/** @internal */\nexport interface TreeModelRootNode {\n id: undefined;\n nodeData: undefined;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n isLoading?: boolean;\n}\n\n/** @internal */\nexport interface TreeModelHierarchyNode {\n id: string;\n nodeData: HierarchyNode;\n label: string;\n children: boolean;\n isLoading?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n}\n\n/** @internal */\nexport interface TreeModelGenericInfoNode {\n id: string;\n parentId: string | undefined;\n type: \"Unknown\";\n message: string;\n}\n\n/** @internal */\nexport interface TreeModelNoFilterMatchesInfoNode {\n id: string;\n parentId: string | undefined;\n type: \"NoFilterMatches\";\n}\n\n/** @internal */\nexport interface TreeModelResultSetTooLargeInfoNode {\n id: string;\n parentId: string | undefined;\n type: \"ResultSetTooLarge\";\n resultSetSizeLimit: number;\n}\n\n/** @internal */\nexport type TreeModelInfoNode = TreeModelGenericInfoNode | TreeModelResultSetTooLargeInfoNode | TreeModelNoFilterMatchesInfoNode;\n\n/** @internal */\nexport type TreeModelNode = TreeModelHierarchyNode | TreeModelInfoNode;\n\n/** @internal */\nexport function isTreeModelHierarchyNode(node: TreeModelHierarchyNode | TreeModelInfoNode | TreeModelRootNode): node is TreeModelHierarchyNode {\n return \"nodeData\" in node && node.nodeData !== undefined;\n}\n\n/** @internal */\nexport function isTreeModelInfoNode(node: TreeModelHierarchyNode | TreeModelInfoNode | TreeModelRootNode): node is TreeModelInfoNode {\n return \"type\" in node && node.type !== undefined;\n}\n\n/** @internal */\nexport interface TreeModel {\n parentChildMap: Map<string | undefined, string[]>;\n idToNode: Map<string, TreeModelNode>;\n rootNode: TreeModelRootNode;\n}\n\n/** @internal */\nexport namespace TreeModel {\n export function expandNode(model: TreeModel, nodeId: string, isExpanded: boolean): \"none\" | \"loadChildren\" | \"reloadChildren\" {\n const node = model.idToNode.get(nodeId);\n if (!node || !isTreeModelHierarchyNode(node)) {\n return \"none\";\n }\n\n node.isExpanded = isExpanded;\n if (!isExpanded || !node.children) {\n return \"none\";\n }\n\n const children = model.parentChildMap.get(node.id);\n if (!children) {\n node.isLoading = true;\n return \"loadChildren\";\n }\n\n if (children.length !== 1) {\n return \"none\";\n }\n\n const firstChild = TreeModel.getNode(model, children[0]);\n if (!firstChild || !isTreeModelInfoNode(firstChild) || firstChild.type !== \"Unknown\") {\n return \"none\";\n }\n\n // remove subtree if there is only one `Unknown` info node in order to attempt reloading children\n TreeModel.removeSubTree(model, nodeId);\n node.isLoading = true;\n return \"reloadChildren\";\n }\n\n /** @internal */\n export function addHierarchyPart(model: TreeModel, rootId: string | undefined, hierarchyPart: TreeModel): void {\n removeSubTree(model, rootId);\n\n for (const [parentId, children] of hierarchyPart.parentChildMap) {\n model.parentChildMap.set(parentId, children);\n }\n\n for (const [nodeId, node] of hierarchyPart.idToNode) {\n model.idToNode.set(nodeId, node);\n }\n\n const parentNode = rootId !== undefined ? model.idToNode.get(rootId) : model.rootNode;\n /* c8 ignore next 3*/\n if (!parentNode || isTreeModelInfoNode(parentNode)) {\n return;\n }\n parentNode.isLoading = false;\n }\n\n export function removeSubTree(model: TreeModel, parentId: string | undefined): void {\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return;\n }\n model.parentChildMap.delete(parentId);\n\n for (const childId of currentChildren) {\n const childNode = model.idToNode.get(childId);\n if (childNode && isTreeModelHierarchyNode(childNode)) {\n removeSubTree(model, childNode.id);\n }\n model.idToNode.delete(childId);\n }\n }\n\n export function setHierarchyLimit(model: TreeModel, nodeId: string | undefined, limit?: number | \"unbounded\"): boolean {\n return updateForReload(model, nodeId, (node) => {\n node.hierarchyLimit = limit;\n });\n }\n\n export function setInstanceFilter(model: TreeModel, nodeId: string | undefined, filter?: GenericInstanceFilter): boolean {\n return updateForReload(model, nodeId, (node) => {\n if (filter && isTreeModelHierarchyNode(node)) {\n node.isExpanded = true;\n }\n node.instanceFilter = filter;\n });\n }\n\n export function selectNodes(model: TreeModel, nodeIds: Array<string>, changeType: SelectionChangeType) {\n if (changeType === \"replace\") {\n for (const [nodeId, node] of model.idToNode) {\n if (!isTreeModelHierarchyNode(node)) {\n continue;\n }\n node.isSelected = !!nodeIds.find((id) => id === nodeId);\n }\n return;\n }\n for (const nodeId of nodeIds) {\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode || !isTreeModelHierarchyNode(modelNode)) {\n return;\n }\n modelNode.isSelected = changeType === \"add\";\n }\n }\n\n export function isNodeSelected(model: TreeModel, nodeId: string): boolean {\n const currentNode = model.idToNode.get(nodeId);\n return !!currentNode && isTreeModelHierarchyNode(currentNode) && !!currentNode.isSelected;\n }\n\n export function getNode(model: TreeModel, nodeId: string | undefined): TreeModelNode | TreeModelRootNode | undefined {\n if (!nodeId) {\n return model.rootNode;\n }\n return model.idToNode.get(nodeId);\n }\n\n export function setIsLoading(model: TreeModel, nodeId: string | undefined, isLoading: boolean) {\n if (nodeId === undefined) {\n model.rootNode.isLoading = isLoading;\n return;\n }\n const modelNode = model.idToNode.get(nodeId);\n /* c8 ignore next 3*/\n if (!modelNode || !isTreeModelHierarchyNode(modelNode)) {\n return;\n }\n modelNode.isLoading = isLoading;\n }\n}\n\nfunction updateForReload(model: TreeModel, nodeId: string | undefined, update: (node: TreeModelHierarchyNode | TreeModelRootNode) => void) {\n TreeModel.removeSubTree(model, nodeId);\n if (nodeId === undefined) {\n update(model.rootNode);\n model.rootNode.isLoading = true;\n return true;\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode || !isTreeModelHierarchyNode(modelNode)) {\n return false;\n }\n\n update(modelNode);\n if (modelNode.isExpanded) {\n modelNode.isLoading = true;\n return true;\n }\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TreeModel.js","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/TreeModel.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 { GenericInstanceFilter, HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { ErrorInfo } from \"../TreeNode.js\";\nimport { SelectionChangeType } from \"../UseSelectionHandler.js\";\n\n/** @internal */\nexport interface TreeModelRootNode {\n id: undefined;\n nodeData: undefined;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n isLoading?: boolean;\n error?: ErrorInfo;\n}\n\n/** @internal */\nexport interface TreeModelHierarchyNode {\n id: string;\n nodeData: HierarchyNode;\n label: string;\n children: boolean;\n isLoading?: boolean;\n isExpanded?: boolean;\n isSelected?: boolean;\n hierarchyLimit?: number | \"unbounded\";\n instanceFilter?: GenericInstanceFilter;\n error?: ErrorInfo;\n}\n\n/** @internal */\nexport function isTreeModelHierarchyNode(node: TreeModelHierarchyNode | ErrorInfo | TreeModelRootNode): node is TreeModelHierarchyNode {\n return \"nodeData\" in node && node.nodeData !== undefined;\n}\n\n/** @internal */\nexport interface TreeModel {\n parentChildMap: Map<string | undefined, string[]>;\n idToNode: Map<string, TreeModelHierarchyNode>;\n rootNode: TreeModelRootNode;\n}\n\n/** @internal */\nexport namespace TreeModel {\n export function expandNode(model: TreeModel, nodeId: string, isExpanded: boolean): \"none\" | \"loadChildren\" | \"reloadChildren\" {\n const node = model.idToNode.get(nodeId);\n if (!node) {\n return \"none\";\n }\n\n node.isExpanded = isExpanded;\n if (!isExpanded) {\n return \"none\";\n }\n\n if (node.error?.type === \"Unknown\") {\n node.isLoading = true;\n // remove subtree if there `Unknown` error info in order to attempt reloading children\n TreeModel.removeSubTree(model, nodeId);\n return \"reloadChildren\";\n }\n\n if (!node.children) {\n return \"none\";\n }\n\n const children = model.parentChildMap.get(node.id);\n if (!children) {\n node.isLoading = true;\n return \"loadChildren\";\n }\n\n return \"none\";\n }\n\n /** @internal */\n export function addHierarchyPart(model: TreeModel, rootId: string | undefined, hierarchyPart: TreeModel): void {\n removeSubTree(model, rootId);\n model.rootNode.error = hierarchyPart.rootNode.error;\n\n for (const [parentId, children] of hierarchyPart.parentChildMap) {\n model.parentChildMap.set(parentId, children);\n }\n\n for (const [nodeId, node] of hierarchyPart.idToNode) {\n model.idToNode.set(nodeId, node);\n }\n\n const parentNode = rootId !== undefined ? model.idToNode.get(rootId) : model.rootNode;\n /* c8 ignore next 3*/\n if (!parentNode) {\n return;\n }\n parentNode.isLoading = false;\n }\n\n export function removeSubTree(model: TreeModel, parentId: string | undefined): void {\n clearNodeError(model, parentId);\n const currentChildren = model.parentChildMap.get(parentId);\n if (!currentChildren) {\n return;\n }\n model.parentChildMap.delete(parentId);\n\n for (const childId of currentChildren) {\n const childNode = model.idToNode.get(childId);\n if (childNode) {\n removeSubTree(model, childNode.id);\n }\n model.idToNode.delete(childId);\n }\n }\n\n export function setHierarchyLimit(model: TreeModel, nodeId: string | undefined, limit?: number | \"unbounded\"): boolean {\n return updateForReload(model, nodeId, (node) => {\n node.hierarchyLimit = limit;\n });\n }\n\n export function setInstanceFilter(model: TreeModel, nodeId: string | undefined, filter?: GenericInstanceFilter): boolean {\n return updateForReload(model, nodeId, (node) => {\n if (filter && node.id !== undefined) {\n node.isExpanded = true;\n }\n node.instanceFilter = filter;\n });\n }\n\n export function selectNodes(model: TreeModel, nodeIds: Array<string>, changeType: SelectionChangeType) {\n if (changeType === \"replace\") {\n for (const [nodeId, node] of model.idToNode) {\n node.isSelected = !!nodeIds.find((id) => id === nodeId);\n }\n return;\n }\n for (const nodeId of nodeIds) {\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return;\n }\n modelNode.isSelected = changeType === \"add\";\n }\n }\n\n export function isNodeSelected(model: TreeModel, nodeId: string): boolean {\n const currentNode = model.idToNode.get(nodeId);\n return !!currentNode && !!currentNode.isSelected;\n }\n\n export function getNode(model: TreeModel, nodeId: string | undefined): TreeModelHierarchyNode | TreeModelRootNode | undefined {\n if (!nodeId) {\n return model.rootNode;\n }\n return model.idToNode.get(nodeId);\n }\n\n export function setIsLoading(model: TreeModel, nodeId: string | undefined, isLoading: boolean) {\n if (nodeId === undefined) {\n model.rootNode.isLoading = isLoading;\n return;\n }\n const modelNode = model.idToNode.get(nodeId);\n /* c8 ignore next 3*/\n if (!modelNode) {\n return;\n }\n modelNode.isLoading = isLoading;\n }\n}\n\nfunction updateForReload(model: TreeModel, nodeId: string | undefined, update: (node: TreeModelHierarchyNode | TreeModelRootNode) => void) {\n TreeModel.removeSubTree(model, nodeId);\n if (nodeId === undefined) {\n update(model.rootNode);\n model.rootNode.isLoading = true;\n return true;\n }\n\n const modelNode = model.idToNode.get(nodeId);\n if (!modelNode) {\n return false;\n }\n\n update(modelNode);\n if (modelNode.isExpanded) {\n modelNode.isLoading = true;\n return true;\n }\n return false;\n}\n\nfunction clearNodeError(model: TreeModel, parentId: string | undefined) {\n if (!parentId) {\n return (model.rootNode.error = undefined);\n }\n const node = model.idToNode.get(parentId);\n if (!node) {\n return;\n }\n node.error = undefined;\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GenericNodeKey, NonGroupingHierarchyNode } from "@itwin/presentation-hierarchies";
|
|
2
|
+
import { Selectable, SelectionStorage } from "@itwin/unified-selection";
|
|
2
3
|
import { SelectionChangeType } from "../UseSelectionHandler.js";
|
|
3
|
-
import {
|
|
4
|
+
import { TreeModelHierarchyNode, TreeModelRootNode } from "./TreeModel.js";
|
|
4
5
|
/** @internal */
|
|
5
6
|
export interface TreeSelectionOptions {
|
|
6
7
|
isNodeSelected: (nodeId: string) => boolean;
|
|
@@ -13,16 +14,29 @@ export interface UseUnifiedTreeSelectionProps {
|
|
|
13
14
|
*/
|
|
14
15
|
sourceName: string;
|
|
15
16
|
/**
|
|
16
|
-
*
|
|
17
|
+
* An optional function that allows customizing the `Selectable` object that gets created for generic hierarchy nodes. When
|
|
18
|
+
* not supplied, the `Selectable` is created using the following signature:
|
|
19
|
+
* ```ts
|
|
20
|
+
* {
|
|
21
|
+
* identifier: treeModelNodeId,
|
|
22
|
+
* data: node,
|
|
23
|
+
* async *loadInstanceKeys() {},
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
17
26
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
|
|
27
|
+
* @param node Hierarchy node to create a selectable for.
|
|
28
|
+
* @param treeModelNodeId ID of the hierarchy node in the internal tree model. This ID uniquely identifies the node in the whole hierarchy, as opposed to `GenericNodeKey.id` contained within the `node`, which may not be unique.
|
|
29
|
+
*/
|
|
30
|
+
createSelectableForGenericNode?: (node: NonGroupingHierarchyNode & {
|
|
31
|
+
key: GenericNodeKey;
|
|
32
|
+
}, treeModelNodeId: string) => Selectable;
|
|
33
|
+
/**
|
|
34
|
+
* Unified selection storage to use for listening, getting and changing active selection.
|
|
21
35
|
*/
|
|
22
|
-
selectionStorage
|
|
36
|
+
selectionStorage: SelectionStorage;
|
|
23
37
|
}
|
|
24
38
|
/** @internal */
|
|
25
|
-
export declare function useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, }: UseUnifiedTreeSelectionProps & {
|
|
26
|
-
getTreeModelNode: (nodeId: string) =>
|
|
39
|
+
export declare function useUnifiedTreeSelection({ sourceName, selectionStorage, getTreeModelNode, createSelectableForGenericNode, }: UseUnifiedTreeSelectionProps & {
|
|
40
|
+
getTreeModelNode: (nodeId: string) => TreeModelHierarchyNode | TreeModelRootNode | undefined;
|
|
27
41
|
}): TreeSelectionOptions;
|
|
28
42
|
//# sourceMappingURL=UseUnifiedSelection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseUnifiedSelection.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/UseUnifiedSelection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UseUnifiedSelection.d.ts","sourceRoot":"","sources":["../../../../src/presentation-hierarchies-react/internal/UseUnifiedSelection.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAmC,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAE5H,OAAO,EAAE,UAAU,EAAe,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE3E,gBAAgB;AAChB,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAChF;AAED,cAAc;AACd,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;;;;OAaG;IACH,8BAA8B,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,GAAG;QAAE,GAAG,EAAE,cAAc,CAAA;KAAE,EAAE,eAAe,EAAE,MAAM,KAAK,UAAU,CAAC;IAEnI;;OAEG;IACH,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,8BAAsE,GACvE,EAAE,4BAA4B,GAAG;IAAE,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,sBAAsB,GAAG,iBAAiB,GAAG,SAAS,CAAA;CAAE,GAAG,oBAAoB,CAiBxJ"}
|