@itwin/presentation-hierarchies-react 2.0.0-alpha.62 → 2.0.0-alpha.63
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 +67 -0
- package/README.md +62 -37
- package/lib/presentation-hierarchies-react/UseTree.js +1 -1
- package/lib/presentation-hierarchies-react/UseTree.js.map +1 -1
- package/lib/presentation-hierarchies-react/Utils.js.map +1 -1
- package/lib/presentation-hierarchies-react/internal/TreeModel.js.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js +53 -46
- package/lib/presentation-hierarchies-react/stratakit/ErrorItemRenderer.js.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.js +5 -4
- package/lib/presentation-hierarchies-react/stratakit/RootErrorRenderer.js.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts +4 -2
- package/lib/presentation-hierarchies-react/stratakit/TreeAction.d.ts.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/TreeAction.js +37 -13
- package/lib/presentation-hierarchies-react/stratakit/TreeAction.js.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts +1 -0
- package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenameAction.d.ts.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.d.ts.map +1 -1
- package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js +152 -140
- package/lib/presentation-hierarchies-react/stratakit/TreeNodeRenderer.js.map +1 -1
- package/package.json +41 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @itwin/presentation-hierarchies-react
|
|
2
2
|
|
|
3
|
+
## 2.0.0-alpha.63
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- [#1425](https://github.com/iTwin/presentation/pull/1425): Moved the package to use `@mui/material` and `@stratakit/mui`.
|
|
8
|
+
|
|
9
|
+
**Breaking:** Removed `@stratakit/foundations`, `@stratakit/icons` optional peer dependencies. Added `@mui/material` and `@stratakit/mui` as optional peer dependencies.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#1325](https://github.com/iTwin/presentation/pull/1325): Add accessible name for tree context menu.
|
|
14
|
+
- Updated dependencies:
|
|
15
|
+
- @itwin/presentation-shared@2.0.0-alpha.11
|
|
16
|
+
- @itwin/presentation-hierarchies@2.0.0-alpha.16
|
|
17
|
+
- @itwin/unified-selection@1.8.1-alpha.0
|
|
18
|
+
|
|
3
19
|
## 2.0.0-alpha.62
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -971,6 +987,57 @@
|
|
|
971
987
|
|
|
972
988
|
- [#847](https://github.com/iTwin/presentation/pull/847): Moving tree rendering components to a new design systems.
|
|
973
989
|
|
|
990
|
+
## 1.11.1
|
|
991
|
+
|
|
992
|
+
### Patch Changes
|
|
993
|
+
|
|
994
|
+
- [#1390](https://github.com/iTwin/presentation/pull/1390): Update `@itwin/core-*` dependencies to `^5.10.0`.
|
|
995
|
+
- Updated dependencies:
|
|
996
|
+
- @itwin/presentation-hierarchies@1.7.16
|
|
997
|
+
- @itwin/presentation-shared@1.2.16
|
|
998
|
+
- @itwin/unified-selection@1.7.6
|
|
999
|
+
|
|
1000
|
+
## 1.11.0
|
|
1001
|
+
|
|
1002
|
+
### Minor Changes
|
|
1003
|
+
|
|
1004
|
+
- [#1387](https://github.com/iTwin/presentation/pull/1387): Added support for React version 19
|
|
1005
|
+
|
|
1006
|
+
### Patch Changes
|
|
1007
|
+
|
|
1008
|
+
- Updated dependencies:
|
|
1009
|
+
- @itwin/presentation-shared@1.2.15
|
|
1010
|
+
|
|
1011
|
+
## 1.10.4
|
|
1012
|
+
|
|
1013
|
+
### Patch Changes
|
|
1014
|
+
|
|
1015
|
+
- [#1358](https://github.com/iTwin/presentation/pull/1358): Bump dependencies.
|
|
1016
|
+
- Updated dependencies:
|
|
1017
|
+
- @itwin/presentation-hierarchies@1.7.15
|
|
1018
|
+
- @itwin/presentation-shared@1.2.14
|
|
1019
|
+
- @itwin/unified-selection@1.7.5
|
|
1020
|
+
|
|
1021
|
+
## 1.10.3
|
|
1022
|
+
|
|
1023
|
+
### Patch Changes
|
|
1024
|
+
|
|
1025
|
+
- [#1338](https://github.com/iTwin/presentation/pull/1338): Bump iTwin.js core dependencies to `^5.9.1`.
|
|
1026
|
+
- Updated dependencies:
|
|
1027
|
+
- @itwin/unified-selection@1.7.3
|
|
1028
|
+
- @itwin/presentation-hierarchies@1.7.14
|
|
1029
|
+
- @itwin/presentation-shared@1.2.13
|
|
1030
|
+
|
|
1031
|
+
## 1.10.2
|
|
1032
|
+
|
|
1033
|
+
### Patch Changes
|
|
1034
|
+
|
|
1035
|
+
- [#1313](https://github.com/iTwin/presentation/pull/1313): Bump dependencies.
|
|
1036
|
+
- Updated dependencies:
|
|
1037
|
+
- @itwin/presentation-shared@1.2.12
|
|
1038
|
+
- @itwin/unified-selection@1.7.1
|
|
1039
|
+
- @itwin/presentation-hierarchies@1.7.13
|
|
1040
|
+
|
|
974
1041
|
## 1.10.1
|
|
975
1042
|
|
|
976
1043
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -60,6 +60,9 @@ The hook takes 2 required properties:
|
|
|
60
60
|
|
|
61
61
|
- `imodelAccess` provides access to iModel's data and metadata, required to build the hierarchy. Generally, `@itwin/presentation-core-interop` and `@itwin/presentation-shared` packages are used to create this object:
|
|
62
62
|
|
|
63
|
+
<!-- [[include: [Presentation.HierarchiesReact.iModelAccess.Imports, Presentation.HierarchiesReact.iModelAccess], tsx]] -->
|
|
64
|
+
<!-- BEGIN EXTRACTION -->
|
|
65
|
+
|
|
63
66
|
```tsx
|
|
64
67
|
import { IModelConnection } from "@itwin/core-frontend";
|
|
65
68
|
import { createCachingECClassHierarchyInspector } from "@itwin/presentation-shared";
|
|
@@ -80,6 +83,8 @@ The hook takes 2 required properties:
|
|
|
80
83
|
}
|
|
81
84
|
```
|
|
82
85
|
|
|
86
|
+
<!-- END EXTRACTION -->
|
|
87
|
+
|
|
83
88
|
- `getHierarchyDefinition` is a factory function that creates a hierarchy definition, describing the hierarchy the tree component will render. The `@itwin/presentation-hierarchies` package describes the concept of hierarchy definitions [in more detail](https://github.com/iTwin/presentation/blob/master/packages/hierarchies/learning/imodel/HierarchyDefinition.md).
|
|
84
89
|
|
|
85
90
|
#### `useIModelUnifiedSelectionTree` props
|
|
@@ -99,16 +104,21 @@ The component renders a virtualized tree using the `Tree` component from `@strat
|
|
|
99
104
|
|
|
100
105
|
## Full example
|
|
101
106
|
|
|
107
|
+
<!-- [[include: [Presentation.HierarchiesReact.iModelAccess.Imports, Presentation.HierarchiesReact.SelectionStorage.Imports, Presentation.HierarchiesReact.CustomTreeExample.Imports, Presentation.HierarchiesReact.iModelAccess, Presentation.HierarchiesReact.SelectionStorage, Presentation.HierarchiesReact.CustomTreeExample], tsx]] -->
|
|
108
|
+
<!-- BEGIN EXTRACTION -->
|
|
109
|
+
|
|
102
110
|
```tsx
|
|
103
111
|
import { IModelConnection } from "@itwin/core-frontend";
|
|
104
|
-
import { createCachingECClassHierarchyInspector
|
|
112
|
+
import { createCachingECClassHierarchyInspector } from "@itwin/presentation-shared";
|
|
105
113
|
import { createECSchemaProvider, createECSqlQueryExecutor, createIModelKey } from "@itwin/presentation-core-interop";
|
|
106
|
-
import { createLimitingECSqlQueryExecutor
|
|
114
|
+
import { createLimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
|
|
107
115
|
|
|
108
|
-
import { useIModelUnifiedSelectionTree } from "@itwin/presentation-hierarchies-react";
|
|
109
|
-
import { StrataKitTreeRenderer, StrataKitRootErrorRenderer } from "@itwin/presentation-hierarchies-react/stratakit";
|
|
110
116
|
import { createStorage, SelectionStorage } from "@itwin/unified-selection";
|
|
117
|
+
|
|
111
118
|
import { useEffect, useState } from "react";
|
|
119
|
+
import { Props } from "@itwin/presentation-shared";
|
|
120
|
+
import { useIModelUnifiedSelectionTree } from "@itwin/presentation-hierarchies-react";
|
|
121
|
+
import { StrataKitRootErrorRenderer, StrataKitTreeRenderer } from "@itwin/presentation-hierarchies-react/stratakit";
|
|
112
122
|
|
|
113
123
|
function createIModelAccess(imodel: IModelConnection) {
|
|
114
124
|
const schemaProvider = createECSchemaProvider(imodel.schemaContext);
|
|
@@ -143,24 +153,18 @@ function MyTreeComponent({ imodel }: { imodel: IModelConnection }) {
|
|
|
143
153
|
type IModelAccess = Props<typeof useIModelUnifiedSelectionTree>["imodelAccess"];
|
|
144
154
|
|
|
145
155
|
// The hierarchy definition describes the hierarchy using ECSQL queries; here it just returns all `BisCore.PhysicalModel` instances
|
|
146
|
-
function getHierarchyDefinition(
|
|
156
|
+
function getHierarchyDefinition(): HierarchyDefinition {
|
|
147
157
|
return {
|
|
148
|
-
|
|
149
|
-
defineHierarchyLevel: async ({ instanceLabelSelectClauseFactory, nodeSelectClauseFactory }) => [
|
|
158
|
+
defineHierarchyLevel: async ({ createSelectClause }) => [
|
|
150
159
|
{
|
|
151
160
|
fullClassName: "BisCore.PhysicalModel",
|
|
152
161
|
query: {
|
|
153
162
|
ecsql: `
|
|
154
163
|
SELECT
|
|
155
|
-
${await
|
|
164
|
+
${await createSelectClause({
|
|
156
165
|
ecClassId: { selector: "this.ECClassId" },
|
|
157
166
|
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
158
|
-
nodeLabel: {
|
|
159
|
-
selector: await instanceLabelSelectClauseFactory.createSelectClause({
|
|
160
|
-
classAlias: "this",
|
|
161
|
-
className: "BisCore.PhysicalModel",
|
|
162
|
-
}),
|
|
163
|
-
},
|
|
167
|
+
nodeLabel: { of: { classAlias: "this", className: "BisCore.PhysicalModel" } },
|
|
164
168
|
hasChildren: false,
|
|
165
169
|
})}
|
|
166
170
|
FROM BisCore.PhysicalModel this
|
|
@@ -189,13 +193,10 @@ function MyTreeComponentInternal({
|
|
|
189
193
|
// supply the hierarchy definition
|
|
190
194
|
getHierarchyDefinition,
|
|
191
195
|
});
|
|
192
|
-
|
|
193
196
|
if (treeProps.rootErrorRendererProps) {
|
|
194
|
-
// render error component if tree fails to load
|
|
195
197
|
return <StrataKitRootErrorRenderer {...treeProps.rootErrorRendererProps} />;
|
|
196
198
|
}
|
|
197
|
-
|
|
198
|
-
if (treeProps.isReloading || treeProps.treeRendererProps === undefined) {
|
|
199
|
+
if (!treeProps.treeRendererProps || treeProps.isReloading) {
|
|
199
200
|
return "Loading...";
|
|
200
201
|
}
|
|
201
202
|
|
|
@@ -203,25 +204,54 @@ function MyTreeComponentInternal({
|
|
|
203
204
|
}
|
|
204
205
|
```
|
|
205
206
|
|
|
207
|
+
<!-- END EXTRACTION -->
|
|
208
|
+
|
|
206
209
|
## Localization
|
|
207
210
|
|
|
208
|
-
This package delivers a locale JSON file with English strings that follows the [`i18next JSON format`](https://www.i18next.com/misc/json-format). To enable localization, register `LOCALIZATION_NAMESPACES` during initialization and wrap components in `LocalizationContextProvider
|
|
211
|
+
This package delivers a locale JSON file with English strings that follows the [`i18next JSON format`](https://www.i18next.com/misc/json-format). To enable localization, register `LOCALIZATION_NAMESPACES` during initialization and wrap components in `LocalizationContextProvider`.
|
|
212
|
+
|
|
213
|
+
Import the localization and tree APIs:
|
|
214
|
+
|
|
215
|
+
<!-- [[include: [Presentation.HierarchiesReact.Localization.Tree.Imports, Presentation.HierarchiesReact.Localization.TreeRenderer.Imports], tsx]] -->
|
|
216
|
+
<!-- BEGIN EXTRACTION -->
|
|
209
217
|
|
|
210
218
|
```tsx
|
|
211
219
|
import {
|
|
212
|
-
LocalizationContextProvider,
|
|
213
220
|
LOCALIZATION_NAMESPACES,
|
|
214
|
-
|
|
221
|
+
LocalizationContextProvider,
|
|
222
|
+
useIModelTree,
|
|
215
223
|
} from "@itwin/presentation-hierarchies-react";
|
|
216
|
-
import { StrataKitTreeRenderer } from "@itwin/presentation-hierarchies-react/stratakit";
|
|
217
224
|
|
|
218
|
-
|
|
225
|
+
import { StrataKitRootErrorRenderer, StrataKitTreeRenderer } from "@itwin/presentation-hierarchies-react/stratakit";
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
<!-- END EXTRACTION -->
|
|
229
|
+
|
|
230
|
+
Register the localization namespaces with your localization provider during application initialization:
|
|
231
|
+
|
|
232
|
+
<!-- [[include: Presentation.HierarchiesReact.Localization.RegisterNamespaces, tsx]] -->
|
|
233
|
+
<!-- BEGIN EXTRACTION -->
|
|
234
|
+
|
|
235
|
+
```tsx
|
|
236
|
+
// Register the localization namespaces delivered by the package with your localization provider
|
|
237
|
+
// (e.g. `IModelApp.localization`) during application initialization.
|
|
219
238
|
for (const namespace of LOCALIZATION_NAMESPACES) {
|
|
220
239
|
await localization.registerNamespace(namespace);
|
|
221
240
|
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
<!-- END EXTRACTION -->
|
|
244
|
+
|
|
245
|
+
Wrap the tree components with `LocalizationContextProvider`:
|
|
246
|
+
|
|
247
|
+
<!-- [[include: Presentation.HierarchiesReact.Localization.Tree, tsx]] -->
|
|
248
|
+
<!-- BEGIN EXTRACTION -->
|
|
222
249
|
|
|
223
|
-
|
|
224
|
-
|
|
250
|
+
```tsx
|
|
251
|
+
// Wrap the tree components with `LocalizationContextProvider`, passing the same localization provider
|
|
252
|
+
// used to register the namespaces. The provider resolves the package's localized strings at runtime.
|
|
253
|
+
type IModelAccess = Props<typeof useIModelTree>["imodelAccess"];
|
|
254
|
+
function LocalizedTree({ imodelAccess }: { imodelAccess: IModelAccess }) {
|
|
225
255
|
return (
|
|
226
256
|
<LocalizationContextProvider localization={localization}>
|
|
227
257
|
<MyTreeComponent imodelAccess={imodelAccess} />
|
|
@@ -230,22 +260,17 @@ function Tree() {
|
|
|
230
260
|
}
|
|
231
261
|
|
|
232
262
|
function MyTreeComponent({ imodelAccess }: { imodelAccess: IModelAccess }) {
|
|
233
|
-
const treeProps =
|
|
234
|
-
sourceName: "MyTreeComponent",
|
|
235
|
-
imodelAccess,
|
|
236
|
-
getHierarchyDefinition,
|
|
237
|
-
});
|
|
238
|
-
|
|
263
|
+
const treeProps = useIModelTree({ imodelAccess, getHierarchyDefinition });
|
|
239
264
|
if (treeProps.rootErrorRendererProps) {
|
|
240
|
-
return <
|
|
265
|
+
return <StrataKitRootErrorRenderer {...treeProps.rootErrorRendererProps} />;
|
|
241
266
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
return <div>Loading...</div>;
|
|
267
|
+
if (!treeProps.treeRendererProps || treeProps.isReloading) {
|
|
268
|
+
return "Loading";
|
|
245
269
|
}
|
|
246
|
-
|
|
247
|
-
return <StrataKitTreeRenderer {...treeProps.treeRendererProps} treeLabel="My Tree" />;
|
|
270
|
+
return <StrataKitTreeRenderer {...treeProps.treeRendererProps} treeLabel="Localized tree" />;
|
|
248
271
|
}
|
|
249
272
|
```
|
|
250
273
|
|
|
274
|
+
<!-- END EXTRACTION -->
|
|
275
|
+
|
|
251
276
|
`LocalizationContextProvider` accepts a `localization` prop — an object with a `getLocalizedString(key: string): string` method. It is designed to work with the `Localization` interface from `@itwin/core-common`, but a custom implementation can be used as well by providing an object with a custom `getLocalizedString` function. The provider uses it internally to resolve translation keys prefixed with localization namespace.
|
|
@@ -139,7 +139,7 @@ function useTreeInternal({ getHierarchyProvider, getSearchPaths, onPerformanceMe
|
|
|
139
139
|
rootNodes: model.parentChildMap.get(void 0) !== void 0 ? generateTreeStructure(void 0, model, getTreeNodeErrorsRef.current) : void 0
|
|
140
140
|
});
|
|
141
141
|
}, (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration), (props) => onHierarchyLimitExceededRef.current?.(props), (props_0) => onHierarchyLoadErrorRef.current?.(props_0)));
|
|
142
|
-
const currentFormatter = useRef();
|
|
142
|
+
const currentFormatter = useRef(void 0);
|
|
143
143
|
const [hierarchyProvider, setHierarchyProvider] = useState();
|
|
144
144
|
useEffect(() => {
|
|
145
145
|
const provider = getHierarchyProvider();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseTree.js","names":["useCallback","useEffect","useMemo","useRef","useState","HierarchyNode","TreeActions","TreeModel","useUnifiedTreeSelection","safeDispose","useLatest","GenericInstanceFilter","HierarchyProvider","HierarchySearchTree","IPrimitiveValueFormatter","TreeModelHierarchyNode","TreeModelRootNode","UseUnifiedTreeSelectionProps","RootErrorRendererProps","TreeRendererProps","ErrorInfo","TreeNode","SelectionChangeType","useTree","props","$","_c","t0","useTreeInternal","rest","getTreeModelNode","_","t1","useUnifiedSelectionTree","createSelectableForGenericNode","selectionStorage","sourceName","t2","selectionProps","rootErrorRendererProps","undefined","treeRendererProps","rootNodes","t3","t4","UseTreeProps","getHierarchyProvider","getSearchPaths","abortSignal","AbortSignal","Promise","onPerformanceMeasured","action","duration","onHierarchyLimitExceeded","parentId","filter","limit","onHierarchyLoadError","type","error","getTreeNodeErrors","node","UseTreeResult","isReloading","getNode","nodeId","setFormatter","formatter","RendererProps","TreeState","model","Array","state","setState","idToNode","Map","parentChildMap","rootNode","id","nodeData","onPerformanceMeasuredRef","onHierarchyLimitExceededRef","onHierarchyLoadErrorRef","getTreeNodeErrorsRef","actions","get","generateTreeStructure","current","actionType","currentFormatter","hierarchyProvider","setHierarchyProvider","provider","removeHierarchyChangedListener","hierarchyChanged","addListener","hierarchyChangeArgs","shouldDiscardState","searchChange","newSearch","reloadTree","reset","isSearching","setIsSearching","disposed","controller","AbortController","setHierarchySearch","paths","signal","abort","createTreeNode","expandNode","isExpanded","options","selectNodes","nodeIds","changeType","isNodeSelected","getHierarchyLevelDetails","hierarchyNode","isGroupingNode","getInstanceKeysIterator","getNodeInstanceKeys","parentNode","instanceFilter","hierarchyLevelSizeLimit","setInstanceFilter","sizeLimit","hierarchyLimit","setSizeLimit","value","setHierarchyLimit","renderProps","isLoading","parentNodeId","currentChildren","map","childId","modelNode","allErrors","children","label","isFilterable","supportsFiltering","isFiltered","errors"],"sources":["../../src/presentation-hierarchies-react/UseTree.ts"],"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 { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport { TreeModel } from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { useLatest } from \"./Utils.js\";\n\nimport type { GenericInstanceFilter, HierarchyProvider, HierarchySearchTree } from \"@itwin/presentation-hierarchies\";\nimport type { IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./internal/TreeModel.js\";\nimport type { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport type { RootErrorRendererProps, TreeRendererProps } from \"./Renderers.js\";\nimport type { ErrorInfo, TreeNode } from \"./TreeNode.js\";\nimport type { SelectionChangeType } from \"./UseSelectionHandler.js\";\n\n/**\n * A React hook that creates state for a tree component.\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useUnifiedSelectionTree`\n * @see `useIModelTree`\n * @public\n */\nexport function useTree(props: UseTreeProps): UseTreeResult {\n const { getTreeModelNode: _, ...rest } = useTreeInternal(props);\n return rest;\n}\n\n/**\n * A React hook that creates state for a tree component, that is integrated with unified selection\n * through the given selection storage (previously the storage was provided through the, now\n * deprecated, `UnifiedSelectionProvider`).\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useTree`\n * @see `useIModelUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useUnifiedSelectionTree({\n sourceName,\n selectionStorage,\n createSelectableForGenericNode,\n ...props\n}: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { getTreeModelNode, ...rest } = useTreeInternal(props);\n const selectionProps = useUnifiedTreeSelection({\n sourceName,\n selectionStorage,\n getTreeModelNode,\n createSelectableForGenericNode,\n });\n if (rest.rootErrorRendererProps === undefined && rest.treeRendererProps?.rootNodes) {\n return { ...rest, treeRendererProps: { ...rest.treeRendererProps, ...selectionProps } };\n }\n return rest;\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to search nodes. */\n getSearchPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchySearchTree[] | undefined>;\n /**\n * Callback that is called just after a certain action is finished.\n * Can be used for performance tracking.\n */\n onPerformanceMeasured?: (action: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void;\n /** Action to perform when hierarchy level contains more items that the specified limit. */\n onHierarchyLimitExceeded?: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void;\n /** Action to perform when an error occurs while loading hierarchy. */\n onHierarchyLoadError?: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void;\n /**\n * Callback to set custom TreeNode errors.\n * Errors returned from this callback are combined with internal errors when populating `TreeNode.errors`.\n */\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[];\n}\n\n/** @public */\nexport type UseTreeResult = {\n /**\n * Specifies whether tree is reloading or not. It is set to `false` when initial tree load is in progress to check if\n * or tree is reloading.\n */\n isReloading: boolean;\n /**\n * Get a tree node by id\n */\n getNode: (nodeId: string) => TreeNode | undefined;\n /**\n * Sets a formatter for the primitive values that are displayed in the hierarchy.\n */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n} & RendererProps;\n\n/**.\n * @alpha\n */\ntype RendererProps =\n | {\n /**\n * An object containing information used to render root error handling UI.\n * Use in combination with `RootErrorRenderer` or your custom implementation.\n * Defined when root nodes fail to load.\n */\n rootErrorRendererProps: RootErrorRendererProps;\n }\n | {\n /** Is undefined when rootNodes were successfully loaded or are in initial loading process. */\n rootErrorRendererProps: undefined;\n /**\n * An object containing information used to render tree.\n * Use with `TreeRenderer` or your custom implementation.\n * Is undefined on initial loading process.\n */\n treeRendererProps?: TreeRendererProps;\n };\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<TreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getSearchPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n getTreeNodeErrors,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined;\n} {\n const [state, setState] = useState<TreeState>({\n model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },\n rootNodes: undefined,\n });\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);\n const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);\n const getTreeNodeErrorsRef = useLatest(getTreeNodeErrors);\n\n const [actions] = useState<TreeActions>(\n () =>\n new TreeActions(\n (model) => {\n const rootNodes =\n model.parentChildMap.get(undefined) !== undefined\n ? generateTreeStructure(undefined, model, getTreeNodeErrorsRef.current)\n : undefined;\n setState({ model, rootNodes });\n },\n (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration),\n (props) => onHierarchyLimitExceededRef.current?.(props),\n (props) => onHierarchyLoadErrorRef.current?.(props),\n ),\n );\n const currentFormatter = useRef<IPrimitiveValueFormatter>();\n\n const [hierarchyProvider, setHierarchyProvider] = useState<HierarchyProvider | undefined>();\n useEffect(() => {\n const provider = getHierarchyProvider();\n provider.setFormatter(currentFormatter.current);\n const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {\n const shouldDiscardState = hierarchyChangeArgs.searchChange?.newSearch !== undefined;\n actions.reloadTree({ state: shouldDiscardState ? \"discard\" : \"keep\" });\n });\n actions.setHierarchyProvider(provider);\n setHierarchyProvider(provider);\n return () => {\n removeHierarchyChangedListener();\n actions.reset();\n safeDispose(provider);\n };\n }, [actions, getHierarchyProvider]);\n\n const [isSearching, setIsSearching] = useState(false);\n useEffect(() => {\n let disposed = false as boolean;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getSearchPaths) {\n hierarchyProvider.setHierarchySearch(undefined);\n // reload tree in case hierarchy provider does not use hierarchy search to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n let paths: HierarchySearchTree[] | undefined;\n try {\n paths = await getSearchPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchySearch(paths ? { paths } : undefined);\n setIsSearching(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getSearchPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): TreeNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || node.id === undefined) {\n return undefined;\n }\n return createTreeNode(node, state.model, getTreeNodeErrorsRef.current);\n },\n [actions, getTreeNodeErrorsRef, state.model],\n );\n\n const expandNode = useCallback<TreeRendererProps[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<TreeRendererProps[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<TreeRendererProps[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<TreeRendererProps[\"isNodeSelected\"]>(\n (nodeId: string) => TreeModel.isNodeSelected(state.model, nodeId),\n [state],\n );\n\n const setFormatter = useCallback<UseTreeResult[\"setFormatter\"]>(\n (formatter: IPrimitiveValueFormatter | undefined) => {\n currentFormatter.current = formatter;\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<TreeRendererProps[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !node) {\n return undefined;\n }\n const hierarchyNode = node.nodeData;\n if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {\n return undefined;\n }\n\n return {\n hierarchyNode,\n getInstanceKeysIterator: (props) =>\n hierarchyProvider.getNodeInstanceKeys({\n parentNode: hierarchyNode,\n instanceFilter: props?.instanceFilter,\n hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,\n }),\n instanceFilter: node.instanceFilter,\n setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),\n sizeLimit: node.hierarchyLimit,\n setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),\n };\n },\n [actions, hierarchyProvider],\n );\n\n const renderProps: RendererProps = useMemo(() => {\n if (state.model.rootNode.error) {\n return { rootErrorRendererProps: { error: state.model.rootNode.error, reloadTree, getHierarchyLevelDetails } };\n }\n return {\n rootErrorRendererProps: undefined,\n treeRendererProps: state.rootNodes\n ? { rootNodes: state.rootNodes, expandNode, selectNodes, isNodeSelected, reloadTree, getHierarchyLevelDetails }\n : undefined,\n };\n }, [\n expandNode,\n getHierarchyLevelDetails,\n isNodeSelected,\n reloadTree,\n selectNodes,\n state.model.rootNode.error,\n state.rootNodes,\n ]);\n\n return {\n ...renderProps,\n isReloading: !!state.model.rootNode.isLoading || isSearching,\n getTreeModelNode,\n getNode,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(\n parentNodeId: string | undefined,\n model: TreeModel,\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[],\n): Array<TreeNode> | undefined {\n const currentChildren = model.parentChildMap.get(parentNodeId);\n if (!currentChildren) {\n return undefined;\n }\n\n return currentChildren\n .map((childId) => model.idToNode.get(childId))\n .filter((node): node is TreeModelHierarchyNode => !!node)\n .map<TreeNode>((node) => {\n return createTreeNode(node, model, getTreeNodeErrors);\n });\n}\n\nfunction createTreeNode(\n modelNode: TreeModelHierarchyNode,\n model: TreeModel,\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[],\n): TreeNode {\n const allErrors = [\n // internal errors\n ...(modelNode.error ? [modelNode.error] : []),\n // external errors\n ...(getTreeNodeErrors?.(modelNode.nodeData) ?? []),\n ];\n\n let children: Array<TreeNode> | undefined;\n return {\n id: modelNode.id,\n label: modelNode.label,\n nodeData: modelNode.nodeData,\n isLoading: !!modelNode.isLoading,\n isExpanded: !!modelNode.isExpanded,\n isFilterable:\n !HierarchyNode.isGroupingNode(modelNode.nodeData) && !!modelNode.nodeData.supportsFiltering && modelNode.children,\n isFiltered: !!modelNode.instanceFilter,\n errors: allErrors,\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model, getTreeNodeErrors);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiCA,SAAOuB,QAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACoC,MAAAC,KAAAC,gBAAgBJ,MAAM;CAAA,IAAAK;AAAA,KAAAJ,EAAA,OAAAE,IAAA;EAA/D,MAAA,EAAAG,kBAAAC,GAAA,GAAAC,OAAyCL;AAAzCE,SAAAG;AAAgEP,IAAA,KAAAE;AAAAF,IAAA,KAAAI;OAAAA,QAAAJ,EAAA;AAAA,QACzDI;;;;;;;;;;;;;;;;;AAkBT,SAAOI,wBAAAN,IAAA;CAAA,MAAAF,IAAAC,EAAA,GAAA;CAAA,IAAAQ;CAAA,IAAAV;CAAA,IAAAW;CAAA,IAAAC;AAAA,KAAAX,EAAA,OAAAE,IAAA;AAAiC,GAAA,CAAAS,YAAAD,kBAAAD,mCAAAV,SAAAG;AAKMF,IAAA,KAAAE;AAAAF,IAAA,KAAAS;AAAAT,IAAA,KAAAD;AAAAC,IAAA,KAAAU;AAAAV,IAAA,KAAAW;QAAA;AAAAF,mCAAAT,EAAA;AAAAD,UAAAC,EAAA;AAAAU,qBAAAV,EAAA;AAAAW,eAAAX,EAAA;;CACN,MAAAO,KAAAJ,gBAAgBJ,MAAM;CAAA,IAAAM;CAAA,IAAAD;AAAA,KAAAJ,EAAA,OAAAO,IAAA;AAA5D,GAAA,CAAAF,qBAAAD,QAAsCG;AAAuBP,IAAA,KAAAO;AAAAP,IAAA,KAAAK;AAAAL,IAAA,KAAAI;QAAA;AAAAC,qBAAAL,EAAA;AAAAI,SAAAJ,EAAA;;CAAA,IAAAY;AAAA,KAAAZ,EAAA,OAAAS,kCAAAT,EAAA,OAAAK,oBAAAL,EAAA,QAAAU,oBAAAV,EAAA,QAAAW,YAAA;AACdC,OAAA;GAAAD;GAAAD;GAAAL;GAAAI;GAK9C;AAAAT,IAAA,KAAAS;AAAAT,IAAA,KAAAK;AAAAL,IAAA,MAAAU;AAAAV,IAAA,MAAAW;AAAAX,IAAA,MAAAY;OAAAA,MAAAZ,EAAA;CALD,MAAAa,iBAAuB9B,wBAAwB6B,GAK7C;AACF,KAAIR,KAAIU,2BAA4BC,KAAAA,KAAaX,KAAIY,mBAA6BC,WAAA;EAAA,IAAAC;AAAA,MAAAlB,EAAA,QAAAI,KAAAY,qBAAAhB,EAAA,QAAAa,gBAAA;AAC3CK,QAAA;IAAA,GAAKd,KAAIY;IAAkB,GAAKH;IAAgB;AAAAb,KAAA,MAAAI,KAAAY;AAAAhB,KAAA,MAAAa;AAAAb,KAAA,MAAAkB;QAAAA,MAAAlB,EAAA;EAAA,IAAAmB;AAAA,MAAAnB,EAAA,QAAAI,QAAAJ,EAAA,QAAAkB,IAAA;AAA9EC,QAAA;IAAA,GAAKf;IAAIY,mBAAqBE;IAAkD;AAAAlB,KAAA,MAAAI;AAAAJ,KAAA,MAAAkB;AAAAlB,KAAA,MAAAmB;QAAAA,MAAAnB,EAAA;AAAA,SAAhFmB;;AACR,QACMf;;AA0ET,SAASD,gBAAgB,EACvBkB,sBACAC,gBACAI,uBACAG,0BACAI,sBACAG,qBAGA;CACA,MAAM,CAACY,OAAOC,YAAYtE,SAAoB;EAC5CmE,OAAO;GAAEI,0BAAU,IAAIC,KAAK;GAAEC,gCAAgB,IAAID,KAAK;GAAEE,UAAU;IAAEC,IAAIvC,KAAAA;IAAWwC,UAAUxC,KAAAA;IAAU;GAAG;EAC3GE,WAAWF,KAAAA;EACZ,CAAC;CACF,MAAMyC,2BAA2BvE,UAAUyC,sBAAsB;CACjE,MAAM+B,8BAA8BxE,UAAU4C,yBAAyB;CACvE,MAAM6B,0BAA0BzE,UAAUgD,qBAAqB;CAC/D,MAAM0B,uBAAuB1E,UAAUmD,kBAAkB;CAEzD,MAAM,CAACwB,WAAWjF,eAEd,IAAIE,aACDiE,UAAU;AAKTG,WAAS;GAAEH;GAAO7B,WAHhB6B,MAAMM,eAAeS,IAAI9C,KAAAA,EAAU,KAAKA,KAAAA,IACpC+C,sBAAsB/C,KAAAA,GAAW+B,OAAOa,qBAAqBI,QAAQ,GACrEhD,KAAAA;GACuB,CAAC;KAE/BiD,YAAYpC,aAAa4B,yBAAyBO,UAAUC,YAAYpC,SAAS,GACjF7B,UAAU0D,4BAA4BM,UAAUhE,MAAM,GACtDA,YAAU2D,wBAAwBK,UAAUhE,QAC/C,CACJ,CAAC;CACD,MAAMkE,mBAAmBvF,QAAkC;CAE3D,MAAM,CAACwF,mBAAmBC,wBAAwBxF,UAAyC;AAC3FH,iBAAgB;EACd,MAAM4F,WAAW/C,sBAAsB;AACvC+C,WAAS1B,aAAauB,iBAAiBF,QAAQ;EAC/C,MAAMM,iCAAiCD,SAASE,iBAAiBC,aAAaC,wBAAwB;GACpG,MAAMC,qBAAqBD,oBAAoBE,cAAcC,cAAc5D,KAAAA;AAC3E6C,WAAQgB,WAAW,EAAE5B,OAAOyB,qBAAqB,YAAY,QAAQ,CAAC;IACtE;AACFb,UAAQO,qBAAqBC,SAAS;AACtCD,uBAAqBC,SAAS;AAC9B,eAAa;AACXC,mCAAgC;AAChCT,WAAQiB,OAAO;AACf7F,eAAYoF,SAAS;;IAEtB,CAACR,SAASvC,qBAAqB,CAAC;CAEnC,MAAM,CAACyD,aAAaC,kBAAkBpG,SAAS,MAAM;AACrDH,iBAAgB;EACd,IAAIwG,WAAW;EACf,MAAMC,aAAa,IAAIC,iBAAiB;AACxC,GAAM,YAAY;AAChB,OAAI,CAAChB,kBACH;AAGF,OAAI,CAAC5C,gBAAgB;AACnB4C,sBAAkBiB,mBAAmBpE,KAAAA,EAAU;AAE/C6C,YAAQgB,WAAW,EAAE5B,OAAO,QAAQ,CAAC;AACrC+B,mBAAe,MAAM;AACrB;;AAGFA,kBAAe,KAAK;GACpB,IAAIK;AACJ,OAAI;AACFA,YAAQ,MAAM9D,eAAe,EAAEC,aAAa0D,WAAWI,QAAQ,CAAC;WAC1D,WACE;AACR,QAAI,CAACL,UAAU;AACbd,uBAAkBiB,mBAAmBC,QAAQ,EAAEA,OAAO,GAAGrE,KAAAA,EAAU;AACnEgE,oBAAe,MAAM;;;MAGvB;AACJ,eAAa;AACXE,cAAWK,OAAO;AAClBN,cAAW;;IAEZ;EAACd;EAAmB5C;EAAgBsC;EAAQ,CAAC;CAEhD,MAAMvD,mBAAmB9B,aACtBkE,WAAmB;AAClB,SAAOmB,QAAQpB,QAAQC,OAAO;IAEhC,CAACmB,QACH,CAAC;CAED,MAAMpB,UAAUjE,aACbkE,aAAyC;EACxC,MAAMJ,OAAOuB,QAAQpB,QAAQC,SAAO;AACpC,MAAI,CAACJ,QAAQA,KAAKiB,OAAOvC,KAAAA,EACvB;AAEF,SAAOwE,eAAelD,MAAMW,MAAMF,OAAOa,qBAAqBI,QAAQ;IAExE;EAACH;EAASD;EAAsBX,MAAMF;EACxC,CAAC;CAED,MAAM0C,aAAajH,aAChBkE,UAAgBgD,eAAwB;AACvC7B,UAAQ4B,WAAW/C,UAAQgD,WAAW;IAExC,CAAC7B,QACH,CAAC;CAED,MAAMgB,aAAarG,aAChBmH,YAAY;AACX9B,UAAQgB,WAAWc,QAAQ;IAE7B,CAAC9B,QACH,CAAC;CAED,MAAM+B,cAAcpH,aACjBqH,SAAwBC,eAAoC;AAC3DjC,UAAQ+B,YAAYC,SAASC,WAAW;IAE1C,CAACjC,QACH,CAAC;CAED,MAAMkC,iBAAiBvH,aACpBkE,aAAmB3D,UAAUgH,eAAe9C,MAAMF,OAAOL,SAAO,EACjE,CAACO,MACH,CAAC;CAED,MAAMN,eAAenE,aAClBoE,cAAoD;AACnDsB,mBAAiBF,UAAUpB;AAC3B,MAAI,CAACuB,kBACH;AAGFA,oBAAkBxB,aAAaC,UAAU;IAE3C,CAACuB,kBACH,CAAC;CAED,MAAM6B,2BAA2BxH,aAC9BkE,aAAW;EACV,MAAMJ,SAAOuB,QAAQpB,QAAQC,SAAO;AACpC,MAAI,CAACyB,qBAAqB,CAAC7B,OACzB;EAEF,MAAM2D,gBAAgB3D,OAAKkB;AAC3B,MAAIyC,iBAAiBpH,cAAcqH,eAAeD,cAAc,CAC9D;AAGF,SAAO;GACLA;GACAE,0BAA0BnG,YACxBmE,kBAAkBiC,oBAAoB;IACpCC,YAAYJ;IACZK,gBAAgBtG,SAAOsG;IACvBC,yBAAyBvG,SAAOuG;IACjC,CAAC;GACJD,gBAAgBhE,OAAKgE;GACrBE,oBAAoBxE,WAAW6B,QAAQ2C,kBAAkB9D,UAAQV,OAAO;GACxEyE,WAAWnE,OAAKoE;GAChBC,eAAeC,UAAU/C,QAAQgD,kBAAkBnE,UAAQkE,MAAK;GACjE;IAEH,CAAC/C,SAASM,kBACZ,CAAC;AAsBD,QAAO;EACL,GArBiCzF,cAAc;AAC/C,OAAIuE,MAAMF,MAAMO,SAASlB,MACvB,QAAO,EAAErB,wBAAwB;IAAEqB,OAAOa,MAAMF,MAAMO,SAASlB;IAAOyC;IAAYmB;IAAyB,EAAG;AAEhH,UAAO;IACLjF,wBAAwBC,KAAAA;IACxBC,mBAAmBgC,MAAM/B,YACrB;KAAEA,WAAW+B,MAAM/B;KAAWuE;KAAYG;KAAaG;KAAgBlB;KAAYmB;KAA0B,GAC7GhF,KAAAA;IACL;KACA;GACDyE;GACAO;GACAD;GACAlB;GACAe;GACA3C,MAAMF,MAAMO,SAASlB;GACrBa,MAAM/B;GACP,CAAC;EAIAsB,aAAa,CAAC,CAACS,MAAMF,MAAMO,SAASyD,aAAahC;EACjDzE;EACAmC;EACAE;EACD;;AAGH,SAASoB,sBACPiD,cACAjE,OACAV,mBAC6B;CAC7B,MAAM4E,kBAAkBlE,MAAMM,eAAeS,IAAIkD,aAAa;AAC9D,KAAI,CAACC,gBACH;AAGF,QAAOA,gBACJC,KAAKC,YAAYpE,MAAMI,SAASW,IAAIqD,QAAQ,CAAC,CAC7CnF,QAAQM,SAAyC,CAAC,CAACA,KAAK,CACxD4E,KAAe5E,SAAS;AACvB,SAAOkD,eAAelD,MAAMS,OAAOV,kBAAkB;GACrD;;AAGN,SAASmD,eACP4B,WACArE,OACAV,mBACU;CACV,MAAMgF,YAAY,CAEhB,GAAID,UAAUhF,QAAQ,CAACgF,UAAUhF,MAAM,GAAG,EAAE,EAE5C,GAAIC,oBAAoB+E,UAAU5D,SAAS,IAAI,EAAE,CAClD;CAED,IAAI8D;AACJ,QAAO;EACL/D,IAAI6D,UAAU7D;EACdgE,OAAOH,UAAUG;EACjB/D,UAAU4D,UAAU5D;EACpBuD,WAAW,CAAC,CAACK,UAAUL;EACvBrB,YAAY,CAAC,CAAC0B,UAAU1B;EACxB8B,cACE,CAAC3I,cAAcqH,eAAekB,UAAU5D,SAAS,IAAI,CAAC,CAAC4D,UAAU5D,SAASiE,qBAAqBL,UAAUE;EAC3GI,YAAY,CAAC,CAACN,UAAUd;EACxBqB,QAAQN;EACR,IAAIC,WAAW;AACb,OAAI,CAACA,SACHA,YAAWvD,sBAAsBqD,UAAU7D,IAAIR,OAAOV,kBAAkB;AAE1E,UAAOiF,WAAWA,WAAWF,UAAUE,aAAa,OAAO,OAAO,EAAE;;EAEvE"}
|
|
1
|
+
{"version":3,"file":"UseTree.js","names":["useCallback","useEffect","useMemo","useRef","useState","HierarchyNode","TreeActions","TreeModel","useUnifiedTreeSelection","safeDispose","useLatest","GenericInstanceFilter","HierarchyProvider","HierarchySearchTree","IPrimitiveValueFormatter","TreeModelHierarchyNode","TreeModelRootNode","UseUnifiedTreeSelectionProps","RootErrorRendererProps","TreeRendererProps","ErrorInfo","TreeNode","SelectionChangeType","useTree","props","$","_c","t0","useTreeInternal","rest","getTreeModelNode","_","t1","useUnifiedSelectionTree","createSelectableForGenericNode","selectionStorage","sourceName","t2","selectionProps","rootErrorRendererProps","undefined","treeRendererProps","rootNodes","t3","t4","UseTreeProps","getHierarchyProvider","getSearchPaths","abortSignal","AbortSignal","Promise","onPerformanceMeasured","action","duration","onHierarchyLimitExceeded","parentId","filter","limit","onHierarchyLoadError","type","error","getTreeNodeErrors","node","UseTreeResult","isReloading","getNode","nodeId","setFormatter","formatter","RendererProps","TreeState","model","Array","state","setState","idToNode","Map","parentChildMap","rootNode","id","nodeData","onPerformanceMeasuredRef","onHierarchyLimitExceededRef","onHierarchyLoadErrorRef","getTreeNodeErrorsRef","actions","get","generateTreeStructure","current","actionType","currentFormatter","hierarchyProvider","setHierarchyProvider","provider","removeHierarchyChangedListener","hierarchyChanged","addListener","hierarchyChangeArgs","shouldDiscardState","searchChange","newSearch","reloadTree","reset","isSearching","setIsSearching","disposed","controller","AbortController","setHierarchySearch","paths","signal","abort","createTreeNode","expandNode","isExpanded","options","selectNodes","nodeIds","changeType","isNodeSelected","getHierarchyLevelDetails","hierarchyNode","isGroupingNode","getInstanceKeysIterator","getNodeInstanceKeys","parentNode","instanceFilter","hierarchyLevelSizeLimit","setInstanceFilter","sizeLimit","hierarchyLimit","setSizeLimit","value","setHierarchyLimit","renderProps","isLoading","parentNodeId","currentChildren","map","childId","modelNode","allErrors","children","label","isFilterable","supportsFiltering","isFiltered","errors"],"sources":["../../src/presentation-hierarchies-react/UseTree.ts"],"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 { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { TreeActions } from \"./internal/TreeActions.js\";\nimport { TreeModel } from \"./internal/TreeModel.js\";\nimport { useUnifiedTreeSelection } from \"./internal/UseUnifiedSelection.js\";\nimport { safeDispose } from \"./internal/Utils.js\";\nimport { useLatest } from \"./Utils.js\";\n\nimport type { GenericInstanceFilter, HierarchyProvider, HierarchySearchTree } from \"@itwin/presentation-hierarchies\";\nimport type { IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport type { TreeModelHierarchyNode, TreeModelRootNode } from \"./internal/TreeModel.js\";\nimport type { UseUnifiedTreeSelectionProps } from \"./internal/UseUnifiedSelection.js\";\nimport type { RootErrorRendererProps, TreeRendererProps } from \"./Renderers.js\";\nimport type { ErrorInfo, TreeNode } from \"./TreeNode.js\";\nimport type { SelectionChangeType } from \"./UseSelectionHandler.js\";\n\n/**\n * A React hook that creates state for a tree component.\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useUnifiedSelectionTree`\n * @see `useIModelTree`\n * @public\n */\nexport function useTree(props: UseTreeProps): UseTreeResult {\n const { getTreeModelNode: _, ...rest } = useTreeInternal(props);\n return rest;\n}\n\n/**\n * A React hook that creates state for a tree component, that is integrated with unified selection\n * through the given selection storage (previously the storage was provided through the, now\n * deprecated, `UnifiedSelectionProvider`).\n *\n * The hook uses `@itwin/presentation-hierarchies` package to load the hierarchy data and returns a\n * component-agnostic result which may be used to render the hierarchy using any UI framework.\n *\n * See `README.md` for an example\n *\n * @see `useTree`\n * @see `useIModelUnifiedSelectionTree`\n * @see `UnifiedSelectionProvider`\n * @public\n */\nexport function useUnifiedSelectionTree({\n sourceName,\n selectionStorage,\n createSelectableForGenericNode,\n ...props\n}: UseTreeProps & UseUnifiedTreeSelectionProps): UseTreeResult {\n const { getTreeModelNode, ...rest } = useTreeInternal(props);\n const selectionProps = useUnifiedTreeSelection({\n sourceName,\n selectionStorage,\n getTreeModelNode,\n createSelectableForGenericNode,\n });\n if (rest.rootErrorRendererProps === undefined && rest.treeRendererProps?.rootNodes) {\n return { ...rest, treeRendererProps: { ...rest.treeRendererProps, ...selectionProps } };\n }\n return rest;\n}\n\n/** @public */\nexport interface UseTreeProps {\n /** Provides the hierarchy provider for the tree. */\n getHierarchyProvider: () => HierarchyProvider;\n /** Provides paths to search nodes. */\n getSearchPaths?: ({ abortSignal }: { abortSignal: AbortSignal }) => Promise<HierarchySearchTree[] | undefined>;\n /**\n * Callback that is called just after a certain action is finished.\n * Can be used for performance tracking.\n */\n onPerformanceMeasured?: (action: \"initial-load\" | \"hierarchy-level-load\" | \"reload\", duration: number) => void;\n /** Action to perform when hierarchy level contains more items that the specified limit. */\n onHierarchyLimitExceeded?: (props: {\n parentId?: string;\n filter?: GenericInstanceFilter;\n limit?: number | \"unbounded\";\n }) => void;\n /** Action to perform when an error occurs while loading hierarchy. */\n onHierarchyLoadError?: (props: { parentId?: string; type: \"timeout\" | \"unknown\"; error: unknown }) => void;\n /**\n * Callback to set custom TreeNode errors.\n * Errors returned from this callback are combined with internal errors when populating `TreeNode.errors`.\n */\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[];\n}\n\n/** @public */\nexport type UseTreeResult = {\n /**\n * Specifies whether tree is reloading or not. It is set to `false` when initial tree load is in progress to check if\n * or tree is reloading.\n */\n isReloading: boolean;\n /**\n * Get a tree node by id\n */\n getNode: (nodeId: string) => TreeNode | undefined;\n /**\n * Sets a formatter for the primitive values that are displayed in the hierarchy.\n */\n setFormatter: (formatter: IPrimitiveValueFormatter | undefined) => void;\n} & RendererProps;\n\n/**.\n * @alpha\n */\ntype RendererProps =\n | {\n /**\n * An object containing information used to render root error handling UI.\n * Use in combination with `RootErrorRenderer` or your custom implementation.\n * Defined when root nodes fail to load.\n */\n rootErrorRendererProps: RootErrorRendererProps;\n }\n | {\n /** Is undefined when rootNodes were successfully loaded or are in initial loading process. */\n rootErrorRendererProps: undefined;\n /**\n * An object containing information used to render tree.\n * Use with `TreeRenderer` or your custom implementation.\n * Is undefined on initial loading process.\n */\n treeRendererProps?: TreeRendererProps;\n };\n\ninterface TreeState {\n model: TreeModel;\n rootNodes: Array<TreeNode> | undefined;\n}\n\nfunction useTreeInternal({\n getHierarchyProvider,\n getSearchPaths,\n onPerformanceMeasured,\n onHierarchyLimitExceeded,\n onHierarchyLoadError,\n getTreeNodeErrors,\n}: UseTreeProps): UseTreeResult & {\n getTreeModelNode: (nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined;\n} {\n const [state, setState] = useState<TreeState>({\n model: { idToNode: new Map(), parentChildMap: new Map(), rootNode: { id: undefined, nodeData: undefined } },\n rootNodes: undefined,\n });\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onHierarchyLimitExceededRef = useLatest(onHierarchyLimitExceeded);\n const onHierarchyLoadErrorRef = useLatest(onHierarchyLoadError);\n const getTreeNodeErrorsRef = useLatest(getTreeNodeErrors);\n\n const [actions] = useState<TreeActions>(\n // eslint-disable-next-line react-hooks/refs\n () =>\n new TreeActions(\n (model) => {\n const rootNodes =\n model.parentChildMap.get(undefined) !== undefined\n ? generateTreeStructure(undefined, model, getTreeNodeErrorsRef.current)\n : undefined;\n setState({ model, rootNodes });\n },\n (actionType, duration) => onPerformanceMeasuredRef.current?.(actionType, duration),\n (props) => onHierarchyLimitExceededRef.current?.(props),\n (props) => onHierarchyLoadErrorRef.current?.(props),\n ),\n );\n const currentFormatter = useRef<IPrimitiveValueFormatter | undefined>(undefined);\n\n const [hierarchyProvider, setHierarchyProvider] = useState<HierarchyProvider | undefined>();\n useEffect(() => {\n const provider = getHierarchyProvider();\n provider.setFormatter(currentFormatter.current);\n const removeHierarchyChangedListener = provider.hierarchyChanged.addListener((hierarchyChangeArgs) => {\n const shouldDiscardState = hierarchyChangeArgs.searchChange?.newSearch !== undefined;\n actions.reloadTree({ state: shouldDiscardState ? \"discard\" : \"keep\" });\n });\n actions.setHierarchyProvider(provider);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setHierarchyProvider(provider);\n return () => {\n removeHierarchyChangedListener();\n actions.reset();\n safeDispose(provider);\n };\n }, [actions, getHierarchyProvider]);\n\n const [isSearching, setIsSearching] = useState(false);\n useEffect(() => {\n let disposed = false as boolean;\n const controller = new AbortController();\n void (async () => {\n if (!hierarchyProvider) {\n return;\n }\n\n if (!getSearchPaths) {\n hierarchyProvider.setHierarchySearch(undefined);\n // reload tree in case hierarchy provider does not use hierarchy search to load initial nodes\n actions.reloadTree({ state: \"keep\" });\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n let paths: HierarchySearchTree[] | undefined;\n try {\n paths = await getSearchPaths({ abortSignal: controller.signal });\n } catch {\n } finally {\n if (!disposed) {\n hierarchyProvider.setHierarchySearch(paths ? { paths } : undefined);\n setIsSearching(false);\n }\n }\n })();\n return () => {\n controller.abort();\n disposed = true;\n };\n }, [hierarchyProvider, getSearchPaths, actions]);\n\n const getTreeModelNode = useCallback<(nodeId: string) => TreeModelRootNode | TreeModelHierarchyNode | undefined>(\n (nodeId: string) => {\n return actions.getNode(nodeId);\n },\n [actions],\n );\n\n const getNode = useCallback(\n (nodeId: string): TreeNode | undefined => {\n const node = actions.getNode(nodeId);\n if (!node || node.id === undefined) {\n return undefined;\n }\n return createTreeNode(node, state.model, getTreeNodeErrorsRef.current);\n },\n [actions, getTreeNodeErrorsRef, state.model],\n );\n\n const expandNode = useCallback<TreeRendererProps[\"expandNode\"]>(\n (nodeId: string, isExpanded: boolean) => {\n actions.expandNode(nodeId, isExpanded);\n },\n [actions],\n );\n\n const reloadTree = useCallback<TreeRendererProps[\"reloadTree\"]>(\n (options) => {\n actions.reloadTree(options);\n },\n [actions],\n );\n\n const selectNodes = useCallback<TreeRendererProps[\"selectNodes\"]>(\n (nodeIds: Array<string>, changeType: SelectionChangeType) => {\n actions.selectNodes(nodeIds, changeType);\n },\n [actions],\n );\n\n const isNodeSelected = useCallback<TreeRendererProps[\"isNodeSelected\"]>(\n (nodeId: string) => TreeModel.isNodeSelected(state.model, nodeId),\n [state],\n );\n\n const setFormatter = useCallback<UseTreeResult[\"setFormatter\"]>(\n (formatter: IPrimitiveValueFormatter | undefined) => {\n currentFormatter.current = formatter;\n if (!hierarchyProvider) {\n return;\n }\n\n hierarchyProvider.setFormatter(formatter);\n },\n [hierarchyProvider],\n );\n\n const getHierarchyLevelDetails = useCallback<TreeRendererProps[\"getHierarchyLevelDetails\"]>(\n (nodeId) => {\n const node = actions.getNode(nodeId);\n if (!hierarchyProvider || !node) {\n return undefined;\n }\n const hierarchyNode = node.nodeData;\n if (hierarchyNode && HierarchyNode.isGroupingNode(hierarchyNode)) {\n return undefined;\n }\n\n return {\n hierarchyNode,\n getInstanceKeysIterator: (props) =>\n hierarchyProvider.getNodeInstanceKeys({\n parentNode: hierarchyNode,\n instanceFilter: props?.instanceFilter,\n hierarchyLevelSizeLimit: props?.hierarchyLevelSizeLimit,\n }),\n instanceFilter: node.instanceFilter,\n setInstanceFilter: (filter) => actions.setInstanceFilter(nodeId, filter),\n sizeLimit: node.hierarchyLimit,\n setSizeLimit: (value) => actions.setHierarchyLimit(nodeId, value),\n };\n },\n [actions, hierarchyProvider],\n );\n\n const renderProps: RendererProps = useMemo(() => {\n if (state.model.rootNode.error) {\n return { rootErrorRendererProps: { error: state.model.rootNode.error, reloadTree, getHierarchyLevelDetails } };\n }\n return {\n rootErrorRendererProps: undefined,\n treeRendererProps: state.rootNodes\n ? { rootNodes: state.rootNodes, expandNode, selectNodes, isNodeSelected, reloadTree, getHierarchyLevelDetails }\n : undefined,\n };\n }, [\n expandNode,\n getHierarchyLevelDetails,\n isNodeSelected,\n reloadTree,\n selectNodes,\n state.model.rootNode.error,\n state.rootNodes,\n ]);\n\n return {\n ...renderProps,\n isReloading: !!state.model.rootNode.isLoading || isSearching,\n getTreeModelNode,\n getNode,\n setFormatter,\n };\n}\n\nfunction generateTreeStructure(\n parentNodeId: string | undefined,\n model: TreeModel,\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[],\n): Array<TreeNode> | undefined {\n const currentChildren = model.parentChildMap.get(parentNodeId);\n if (!currentChildren) {\n return undefined;\n }\n\n return currentChildren\n .map((childId) => model.idToNode.get(childId))\n .filter((node): node is TreeModelHierarchyNode => !!node)\n .map<TreeNode>((node) => {\n return createTreeNode(node, model, getTreeNodeErrors);\n });\n}\n\nfunction createTreeNode(\n modelNode: TreeModelHierarchyNode,\n model: TreeModel,\n getTreeNodeErrors?: (node: HierarchyNode) => ErrorInfo[],\n): TreeNode {\n const allErrors = [\n // internal errors\n ...(modelNode.error ? [modelNode.error] : []),\n // external errors\n ...(getTreeNodeErrors?.(modelNode.nodeData) ?? []),\n ];\n\n let children: Array<TreeNode> | undefined;\n return {\n id: modelNode.id,\n label: modelNode.label,\n nodeData: modelNode.nodeData,\n isLoading: !!modelNode.isLoading,\n isExpanded: !!modelNode.isExpanded,\n isFilterable:\n !HierarchyNode.isGroupingNode(modelNode.nodeData) && !!modelNode.nodeData.supportsFiltering && modelNode.children,\n isFiltered: !!modelNode.instanceFilter,\n errors: allErrors,\n get children() {\n if (!children) {\n children = generateTreeStructure(modelNode.id, model, getTreeNodeErrors);\n }\n return children ? children : modelNode.children === true ? true : [];\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utils.js","names":["useCallback","useInsertionEffect","useRef","LegacyRef","
|
|
1
|
+
{"version":3,"file":"Utils.js","names":["useCallback","useInsertionEffect","useRef","LegacyRef","Ref","useLatest","value","$","_c","ref","t0","t1","current","useEvent","callback","latestCallback","args","useMergedRefs","refs","ReadonlyArray","T","instance","forEach"],"sources":["../../src/presentation-hierarchies-react/Utils.ts"],"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 { useCallback, useInsertionEffect, useRef } from \"react\";\n\nimport type { LegacyRef, Ref } from \"react\";\n\n/** @internal */\nexport function useLatest<T>(value: T) {\n const ref = useRef(value);\n\n useInsertionEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n\n/* c8 ignore start */\n/** @internal */\nexport function useEvent<TCallback extends (...args: any[]) => void>(callback: TCallback) {\n const latestCallback = useLatest(callback);\n\n return useCallback(\n (...args: Parameters<TCallback>) => {\n latestCallback.current(...args);\n },\n [latestCallback],\n );\n}\n/* c8 ignore end */\n\n/* c8 ignore start */\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport function useMergedRefs<T>(...refs: ReadonlyArray<Ref<T> | LegacyRef<T> | undefined | null>) {\n return useCallback(\n (instance: T | null) => {\n refs.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(instance);\n } else if (ref) {\n ref.current = instance;\n }\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps, react-hooks/use-memo\n [...refs],\n );\n}\n/* c8 ignore end */\n"],"mappings":";;;;AAUA,SAAOK,UAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACL,MAAAC,MAAYP,OAAOI,MAAM;CAAC,IAAAI;CAAA,IAAAC;AAAA,KAAAJ,EAAA,OAAAD,OAAA;AAEPI,aAAA;AACjBD,OAAGG,UAAWN;;AACbK,OAAA,CAACL,MAAM;AAAAC,IAAA,KAAAD;AAAAC,IAAA,KAAAG;AAAAH,IAAA,KAAAI;QAAA;AAAAD,OAAAH,EAAA;AAAAI,OAAAJ,EAAA;;AAFVN,oBAAmBS,IAEhBC,GAAQ;AAAA,QAEJF;;;;AAKT,SAAOI,SAAAC,UAAA;CAAA,MAAAP,IAAAC,EAAA,EAAA;CACL,MAAAO,iBAAuBV,UAAUS,SAAS;CAAC,IAAAJ;AAAA,KAAAH,EAAA,OAAAQ,gBAAA;AAGzCL,QAAA,GAAAC,OAAA;GAAC,MAAAK,OAAAL;AACCI,kBAAcH,QAAQ,GAAII,KAAK;;AAChCT,IAAA,KAAAQ;AAAAR,IAAA,KAAAG;OAAAA,MAAAH,EAAA;AAAA,QAHIG;;;;;AAYT,SAAgBO,cAAiB,GAAGC,MAA+D;AACjG,QAAOlB,aACJqB,aAAuB;AACtBH,OAAKI,SAASb,QAAQ;AACpB,OAAI,OAAOA,QAAQ,WACjBA,KAAIY,SAAS;YACJZ,IACTA,KAAIG,UAAUS;IAEhB;IAEJ,CAAC,GAAGH,KACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeModel.js","names":["GenericInstanceFilter","HierarchyNode","ErrorInfo","SelectionChangeType","TreeModelRootNode","id","nodeData","hierarchyLimit","instanceFilter","isLoading","error","TreeModelHierarchyNode","label","children","isExpanded","isSelected","TreeModel","parentChildMap","Map","idToNode","rootNode","expandNode","model","nodeId","node","get","type","removeSubTree","addHierarchyPart","rootId","hierarchyPart","parentId","set","parentNode","undefined","clearNodeError","currentChildren","delete","childId","childNode","setHierarchyLimit","limit","updateForReload","setInstanceFilter","filter","selectNodes","nodeIds","Array","changeType","find","modelNode","isNodeSelected","currentNode","getNode","setIsLoading","update"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeModel.ts"],"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 type { GenericInstanceFilter, HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { 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 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(\n model: TreeModel,\n nodeId: string,\n isExpanded: boolean,\n ): \"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 === \"ChildrenLoad\") {\n node.isLoading = true;\n // remove subtree if there `ChildrenLoad` 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 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(\n model: TreeModel,\n nodeId: string | undefined,\n limit?: number | \"unbounded\",\n ): boolean {\n return updateForReload(model, nodeId, (node) => {\n node.hierarchyLimit = limit;\n });\n }\n\n export function setInstanceFilter(\n model: TreeModel,\n nodeId: string | undefined,\n filter?: GenericInstanceFilter,\n ): 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(\n model: TreeModel,\n nodeId: string | undefined,\n ): 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 if (!modelNode) {\n return;\n }\n modelNode.isLoading = isLoading;\n }\n}\n\nfunction updateForReload(\n model: TreeModel,\n nodeId: string | undefined,\n update: (node: TreeModelHierarchyNode | TreeModelRootNode) => void,\n) {\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 const node = !parentId ? model.rootNode : model.idToNode.get(parentId);\n if (node) {\n node.error = undefined;\n }\n}\n"],"mappings":";AAyCO,IAAA;;CACE,SAASqB,WACdC,OACAC,QACAT,YAC4C;EAC5C,MAAMU,OAAOF,MAAMH,SAASM,IAAIF,OAAO;AACvC,MAAI,CAACC,KACH,QAAO;AAGTA,OAAKV,aAAaA;AAClB,MAAI,CAACA,WACH,QAAO;AAGT,MAAIU,KAAKd,OAAOgB,SAAS,gBAAgB;AACvCF,QAAKf,YAAY;AAEjBO,aAAUW,cAAcL,OAAOC,OAAO;AACtC,UAAO;;AAGT,MAAI,CAACC,KAAKX,SACR,QAAO;AAIT,MAAI,CADaS,MAAML,eAAeQ,IAAID,KAAKnB,
|
|
1
|
+
{"version":3,"file":"TreeModel.js","names":["GenericInstanceFilter","HierarchyNode","ErrorInfo","SelectionChangeType","TreeModelRootNode","id","nodeData","hierarchyLimit","instanceFilter","isLoading","error","TreeModelHierarchyNode","label","children","isExpanded","isSelected","TreeModel","parentChildMap","Map","idToNode","rootNode","expandNode","model","nodeId","node","get","type","removeSubTree","addHierarchyPart","rootId","hierarchyPart","parentId","set","parentNode","undefined","clearNodeError","currentChildren","delete","childId","childNode","setHierarchyLimit","limit","updateForReload","setInstanceFilter","filter","selectNodes","nodeIds","Array","changeType","find","modelNode","isNodeSelected","currentNode","getNode","setIsLoading","update"],"sources":["../../../src/presentation-hierarchies-react/internal/TreeModel.ts"],"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 type { GenericInstanceFilter, HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { ErrorInfo } from \"../TreeNode.js\";\nimport type { 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 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(\n model: TreeModel,\n nodeId: string,\n isExpanded: boolean,\n ): \"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 === \"ChildrenLoad\") {\n node.isLoading = true;\n // remove subtree if there `ChildrenLoad` 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 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(\n model: TreeModel,\n nodeId: string | undefined,\n limit?: number | \"unbounded\",\n ): boolean {\n return updateForReload(model, nodeId, (node) => {\n node.hierarchyLimit = limit;\n });\n }\n\n export function setInstanceFilter(\n model: TreeModel,\n nodeId: string | undefined,\n filter?: GenericInstanceFilter,\n ): 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(\n model: TreeModel,\n nodeId: string | undefined,\n ): 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 if (!modelNode) {\n return;\n }\n modelNode.isLoading = isLoading;\n }\n}\n\nfunction updateForReload(\n model: TreeModel,\n nodeId: string | undefined,\n update: (node: TreeModelHierarchyNode | TreeModelRootNode) => void,\n) {\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 const node = !parentId ? model.rootNode : model.idToNode.get(parentId);\n if (node) {\n node.error = undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { MAX_LIMIT_OVERRIDE } from "../internal/Utils.js";
|
|
|
2
2
|
import { useTranslation } from "../LocalizationContext.js";
|
|
3
3
|
import { c } from "react-compiler-runtime";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { Link, Typography } from "@mui/material";
|
|
5
6
|
import { unstable_ErrorRegion } from "@stratakit/structures";
|
|
6
|
-
import { Anchor, Text } from "@stratakit/bricks";
|
|
7
7
|
//#region src/presentation-hierarchies-react/stratakit/ErrorItemRenderer.tsx
|
|
8
8
|
/**
|
|
9
9
|
* Renders StrataKit `<ErrorRegion.Item />` for all supported error types:
|
|
@@ -309,11 +309,12 @@ function ErrorItemContainer(t0) {
|
|
|
309
309
|
}
|
|
310
310
|
function _temp4(t0) {
|
|
311
311
|
const { label, action } = t0;
|
|
312
|
-
return /* @__PURE__ */ jsx(
|
|
313
|
-
variant: "
|
|
314
|
-
|
|
312
|
+
return /* @__PURE__ */ jsx(Typography, {
|
|
313
|
+
variant: "caption",
|
|
314
|
+
render: /* @__PURE__ */ jsx("div", {}),
|
|
315
|
+
children: /* @__PURE__ */ jsx(Link, {
|
|
316
|
+
render: /* @__PURE__ */ jsx("button", { type: "button" }),
|
|
315
317
|
onClick: action,
|
|
316
|
-
render: /* @__PURE__ */ jsx("button", {}),
|
|
317
318
|
children: label
|
|
318
319
|
})
|
|
319
320
|
}, label);
|
|
@@ -323,57 +324,63 @@ function _temp3(t0) {
|
|
|
323
324
|
return condition();
|
|
324
325
|
}
|
|
325
326
|
function MessageWithLink(t0) {
|
|
326
|
-
const $ = c(
|
|
327
|
+
const $ = c(13);
|
|
327
328
|
const { linkLabel, scrollToElement, message } = t0;
|
|
329
|
+
let firstPart;
|
|
328
330
|
let t1;
|
|
329
331
|
if ($[0] !== message) {
|
|
330
|
-
|
|
332
|
+
const splitMessage = message.split("{{node}}", 2);
|
|
333
|
+
firstPart = splitMessage[0].trimEnd();
|
|
334
|
+
t1 = splitMessage[1]?.trimStart();
|
|
331
335
|
$[0] = message;
|
|
332
|
-
$[1] =
|
|
333
|
-
|
|
334
|
-
|
|
336
|
+
$[1] = firstPart;
|
|
337
|
+
$[2] = t1;
|
|
338
|
+
} else {
|
|
339
|
+
firstPart = $[1];
|
|
340
|
+
t1 = $[2];
|
|
341
|
+
}
|
|
342
|
+
const secondPart = t1;
|
|
335
343
|
let t2;
|
|
336
|
-
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
337
|
-
t2 = {
|
|
338
|
-
display: "flex",
|
|
339
|
-
whiteSpace: "pre",
|
|
340
|
-
flexWrap: "wrap"
|
|
341
|
-
};
|
|
342
|
-
$[2] = t2;
|
|
343
|
-
} else t2 = $[2];
|
|
344
|
-
let t3;
|
|
345
344
|
if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
|
|
346
|
-
|
|
347
|
-
$[3] =
|
|
348
|
-
} else
|
|
345
|
+
t2 = /* @__PURE__ */ jsx("button", { type: "button" });
|
|
346
|
+
$[3] = t2;
|
|
347
|
+
} else t2 = $[3];
|
|
348
|
+
let t3;
|
|
349
|
+
if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
|
|
350
|
+
t3 = { verticalAlign: "baseline" };
|
|
351
|
+
$[4] = t3;
|
|
352
|
+
} else t3 = $[4];
|
|
349
353
|
let t4;
|
|
350
|
-
if ($[
|
|
351
|
-
t4 = /* @__PURE__ */ jsx(
|
|
354
|
+
if ($[5] !== linkLabel || $[6] !== scrollToElement) {
|
|
355
|
+
t4 = /* @__PURE__ */ jsx(Link, {
|
|
356
|
+
render: t2,
|
|
352
357
|
onClick: scrollToElement,
|
|
353
|
-
|
|
358
|
+
variant: "caption",
|
|
359
|
+
style: t3,
|
|
354
360
|
children: linkLabel
|
|
355
361
|
});
|
|
356
|
-
$[
|
|
357
|
-
$[
|
|
358
|
-
$[
|
|
359
|
-
} else t4 = $[
|
|
360
|
-
const t5 =
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
});
|
|
371
|
-
$[
|
|
372
|
-
$[
|
|
373
|
-
$[
|
|
374
|
-
$[
|
|
375
|
-
|
|
376
|
-
|
|
362
|
+
$[5] = linkLabel;
|
|
363
|
+
$[6] = scrollToElement;
|
|
364
|
+
$[7] = t4;
|
|
365
|
+
} else t4 = $[7];
|
|
366
|
+
const t5 = secondPart ? " " : "";
|
|
367
|
+
const t6 = secondPart ? secondPart : null;
|
|
368
|
+
let t7;
|
|
369
|
+
if ($[8] !== firstPart || $[9] !== t4 || $[10] !== t5 || $[11] !== t6) {
|
|
370
|
+
t7 = /* @__PURE__ */ jsxs("div", { children: [
|
|
371
|
+
firstPart,
|
|
372
|
+
" ",
|
|
373
|
+
t4,
|
|
374
|
+
t5,
|
|
375
|
+
t6
|
|
376
|
+
] });
|
|
377
|
+
$[8] = firstPart;
|
|
378
|
+
$[9] = t4;
|
|
379
|
+
$[10] = t5;
|
|
380
|
+
$[11] = t6;
|
|
381
|
+
$[12] = t7;
|
|
382
|
+
} else t7 = $[12];
|
|
383
|
+
return t7;
|
|
377
384
|
}
|
|
378
385
|
//#endregion
|
|
379
386
|
export { ErrorItemRenderer };
|