@itwin/tree-widget-react 4.0.0-alpha.22 → 4.0.0-alpha.24
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/README.md +48 -37
- package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js +1 -1
- package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +5 -4
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +43 -18
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +3 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +14 -13
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +6 -5
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +32 -33
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +31 -46
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/{UseFilteredPaths.d.ts → UseSearchPaths.d.ts} +8 -8
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/{UseFilteredPaths.js → UseSearchPaths.js} +21 -21
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseSearchPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.d.ts +7 -7
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +13 -13
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/{FilteredTree.d.ts → SearchResultsTree.d.ts} +8 -8
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/{FilteredTree.js → SearchResultsTree.js} +62 -62
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/SearchResultsTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +5 -4
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +10 -9
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +6 -5
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +30 -29
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.d.ts +4 -4
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +4 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +41 -5
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.d.ts +20 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/{UseFilteredPaths.js → UseSearchPaths.js} +19 -19
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.d.ts +4 -4
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +8 -8
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/{FilteredTree.d.ts → SearchResultsTree.d.ts} +9 -9
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.js +168 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js +3 -3
- package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +14 -4
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/common/Utils.js +20 -20
- package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.css +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.d.ts +6 -6
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js +11 -11
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +9 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +5 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +4 -4
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js +5 -8
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +4 -3
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js +5 -8
- package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseErrorState.d.ts +15 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseErrorState.js +37 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseErrorState.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +21 -5
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +24 -8
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +1 -6
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +20 -17
- package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.d.ts +18 -18
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js +32 -32
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.d.ts +91 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.js +112 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.d.ts +6 -10
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js +27 -15
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +5 -2
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +5 -2
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +65 -43
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/index.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/index.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +6 -5
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +5 -5
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +15 -14
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +32 -31
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +32 -31
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +41 -5
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.d.ts +41 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/{UseFilteredPaths.js → UseSearchPaths.js} +47 -47
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.d.ts +7 -7
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +13 -13
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/{FilteredTree.d.ts → SearchResultsTree.d.ts} +8 -8
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/{FilteredTree.js → SearchResultsTree.js} +43 -43
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/SearchResultsTree.js.map +1 -0
- package/lib/public/locales/en/TreeWidget.json +13 -13
- package/package.json +7 -7
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.d.ts +0 -20
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js +0 -168
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.d.ts +0 -91
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js +0 -112
- package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.d.ts +0 -41
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.js.map +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { firstValueFrom } from "rxjs";
|
|
6
|
+
import { assert } from "@itwin/core-bentley";
|
|
7
|
+
import { CLASS_NAME_Classification, CLASS_NAME_ClassificationTable, CLASS_NAME_GeometricElement2d } from "../../../common/internal/ClassNameDefinitions.js";
|
|
8
|
+
import { createSearchResultsTree, SearchResultsNodesHandler } from "../../../common/internal/visibility/BaseSearchResultsTree.js";
|
|
9
|
+
/** @internal */
|
|
10
|
+
export async function createClassificationsSearchResultsTree(props) {
|
|
11
|
+
const { imodelAccess, searchPaths, idsCache } = props;
|
|
12
|
+
return createSearchResultsTree({
|
|
13
|
+
searchResultsNodesHandler: new ClassificationsTreeSearchResultsNodesHandler({ idsCache, imodelAccess }),
|
|
14
|
+
searchPaths,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHandler {
|
|
18
|
+
#props;
|
|
19
|
+
constructor(props) {
|
|
20
|
+
super();
|
|
21
|
+
this.#props = props;
|
|
22
|
+
}
|
|
23
|
+
async getProcessedSearchResultsNodes() {
|
|
24
|
+
const searchResultsTemporary2dElements = new Map();
|
|
25
|
+
const searchResultsTemporary3dElements = new Map();
|
|
26
|
+
const result = {
|
|
27
|
+
searchResults2dElements: new Map(),
|
|
28
|
+
searchResults3dElements: new Map(),
|
|
29
|
+
};
|
|
30
|
+
for (const node of this.searchResultsNodesArr) {
|
|
31
|
+
if (node.type === "element2d") {
|
|
32
|
+
searchResultsTemporary2dElements.set(node.id, node);
|
|
33
|
+
}
|
|
34
|
+
else if (node.type === "element3d") {
|
|
35
|
+
searchResultsTemporary3dElements.set(node.id, node);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const searchResultsElementsModels = await firstValueFrom(this.#props.idsCache.getFilteredElementsData({
|
|
39
|
+
element2dIds: [...searchResultsTemporary2dElements.keys()],
|
|
40
|
+
element3dIds: [...searchResultsTemporary3dElements.keys()],
|
|
41
|
+
}));
|
|
42
|
+
searchResultsTemporary2dElements.forEach((element, id) => {
|
|
43
|
+
const entry = searchResultsElementsModels.get(element.id);
|
|
44
|
+
assert(entry !== undefined);
|
|
45
|
+
result.searchResults2dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });
|
|
46
|
+
});
|
|
47
|
+
searchResultsTemporary3dElements.forEach((element, id) => {
|
|
48
|
+
const entry = searchResultsElementsModels.get(element.id);
|
|
49
|
+
assert(entry !== undefined);
|
|
50
|
+
result.searchResults3dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });
|
|
51
|
+
});
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
convertNodesToSearchTargets(searchResultsNodes, processedSearchResultsNodes) {
|
|
55
|
+
const searchTargets = {};
|
|
56
|
+
searchResultsNodes.forEach((searchResultsNode) => this.collectSearchTargets(searchTargets, searchResultsNode, processedSearchResultsNodes));
|
|
57
|
+
return this.convertInternalSearchTargets(searchTargets);
|
|
58
|
+
}
|
|
59
|
+
convertInternalSearchTargets(searchTargets) {
|
|
60
|
+
if (!searchTargets.classificationIds && !searchTargets.classificationIds && !searchTargets.elements2d && !searchTargets.elements3d) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
classificationIds: searchTargets.classificationIds,
|
|
65
|
+
classificationTableIds: searchTargets.classificationIds,
|
|
66
|
+
elements2d: searchTargets.elements2d
|
|
67
|
+
? [...searchTargets.elements2d?.entries()].map(([modelCategoryKey, elements]) => {
|
|
68
|
+
const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);
|
|
69
|
+
return { modelId, categoryId, elements };
|
|
70
|
+
})
|
|
71
|
+
: undefined,
|
|
72
|
+
elements3d: searchTargets.elements3d
|
|
73
|
+
? [...searchTargets.elements3d?.entries()].map(([modelCategoryKey, elements]) => {
|
|
74
|
+
const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);
|
|
75
|
+
return { modelId, categoryId, elements };
|
|
76
|
+
})
|
|
77
|
+
: undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
collectSearchTargets(searchTargets, node, processedSearchResultsNodes) {
|
|
81
|
+
const searchResultsNode = node.type === "element2d"
|
|
82
|
+
? processedSearchResultsNodes.searchResults2dElements.get(node.id)
|
|
83
|
+
: node.type === "element3d"
|
|
84
|
+
? processedSearchResultsNodes.searchResults3dElements.get(node.id)
|
|
85
|
+
: node;
|
|
86
|
+
assert(searchResultsNode !== undefined);
|
|
87
|
+
if (searchResultsNode.isSearchTarget) {
|
|
88
|
+
this.addTarget(searchTargets, searchResultsNode);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (searchResultsNode.type === "element2d" || searchResultsNode.type === "element3d") {
|
|
92
|
+
// need to add parent ids as search target will be an element
|
|
93
|
+
this.addTarget(searchTargets, searchResultsNode);
|
|
94
|
+
}
|
|
95
|
+
if (!node.children) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
for (const child of node.children.values()) {
|
|
99
|
+
this.collectSearchTargets(searchTargets, child, processedSearchResultsNodes);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
addTarget(searchTargets, node) {
|
|
103
|
+
switch (node.type) {
|
|
104
|
+
case "classificationTable":
|
|
105
|
+
(searchTargets.classificationTableIds ??= new Set()).add(node.id);
|
|
106
|
+
return;
|
|
107
|
+
case "classification":
|
|
108
|
+
(searchTargets.classificationIds ??= new Set()).add(node.id);
|
|
109
|
+
return;
|
|
110
|
+
case "element2d":
|
|
111
|
+
const element2dKey = this.createModelCategoryKey(node.modelId, node.categoryId);
|
|
112
|
+
const elements2d = (searchTargets.elements2d ??= new Map()).get(element2dKey);
|
|
113
|
+
if (elements2d) {
|
|
114
|
+
elements2d.set(node.id, { isSearchTarget: node.isSearchTarget });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
searchTargets.elements2d.set(element2dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
case "element3d":
|
|
121
|
+
const element3dKey = this.createModelCategoryKey(node.modelId, node.categoryId);
|
|
122
|
+
const elements3d = (searchTargets.elements3d ??= new Map()).get(element3dKey);
|
|
123
|
+
if (elements3d) {
|
|
124
|
+
elements3d.set(node.id, { isSearchTarget: node.isSearchTarget });
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
searchTargets.elements3d.set(element3dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
createModelCategoryKey(modelId, categoryId) {
|
|
133
|
+
return `${modelId}-${categoryId}`;
|
|
134
|
+
}
|
|
135
|
+
parseModelCategoryKey(key) {
|
|
136
|
+
const [modelId, categoryId] = key.split("-");
|
|
137
|
+
return { modelId, categoryId };
|
|
138
|
+
}
|
|
139
|
+
createSearchResultsTreeNode({ type, id, isSearchTarget, }) {
|
|
140
|
+
if (type === "element2d" || type === "element3d") {
|
|
141
|
+
return {
|
|
142
|
+
id,
|
|
143
|
+
isSearchTarget,
|
|
144
|
+
type,
|
|
145
|
+
modelId: undefined,
|
|
146
|
+
categoryId: undefined,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
id,
|
|
151
|
+
isSearchTarget,
|
|
152
|
+
type,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async getType(className) {
|
|
156
|
+
if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_ClassificationTable)) {
|
|
157
|
+
return "classificationTable";
|
|
158
|
+
}
|
|
159
|
+
if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_Classification)) {
|
|
160
|
+
return "classification";
|
|
161
|
+
}
|
|
162
|
+
if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_GeometricElement2d)) {
|
|
163
|
+
return "element2d";
|
|
164
|
+
}
|
|
165
|
+
return "element3d";
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=SearchResultsTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchResultsTree.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.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 { firstValueFrom } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { CLASS_NAME_Classification, CLASS_NAME_ClassificationTable, CLASS_NAME_GeometricElement2d } from \"../../../common/internal/ClassNameDefinitions.js\";\nimport { createSearchResultsTree, SearchResultsNodesHandler } from \"../../../common/internal/visibility/BaseSearchResultsTree.js\";\n\nimport type { Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { CategoryId, ElementId, ModelId } from \"../../../common/internal/Types.js\";\nimport type { BaseSearchResultsTreeNode, SearchResultsTree, SearchResultsTreeNodeChildren } from \"../../../common/internal/visibility/BaseSearchResultsTree.js\";\nimport type { ClassificationsTreeIdsCache } from \"../ClassificationsTreeIdsCache.js\";\n\ninterface ClassificationTableSearchResultsTreeNode extends BaseSearchResultsTreeNode<ClassificationTableSearchResultsTreeNode> {\n type: \"classificationTable\";\n}\n\ninterface ClassificationSearchResultsTreeNode extends BaseSearchResultsTreeNode<ClassificationSearchResultsTreeNode> {\n type: \"classification\";\n}\n\ninterface Element2dSearchResultsTreeNode extends BaseSearchResultsTreeNode<Element2dSearchResultsTreeNode> {\n type: \"element2d\";\n categoryId: Id64String;\n modelId: Id64String;\n}\n\ninterface Element3dSearchResultsTreeNode extends BaseSearchResultsTreeNode<Element3dSearchResultsTreeNode> {\n type: \"element3d\";\n categoryId: Id64String;\n modelId: Id64String;\n}\n\ntype SearchResultsTreeNode =\n | ClassificationTableSearchResultsTreeNode\n | ClassificationSearchResultsTreeNode\n | Element2dSearchResultsTreeNode\n | Element3dSearchResultsTreeNode;\n\ntype TemporaryElement2dSearchResultsNode = Omit<Element2dSearchResultsTreeNode, \"modelId\" | \"categoryId\" | \"children\"> & {\n modelId: string | undefined;\n categoryId: string | undefined;\n children?: SearchResultsTreeNodeChildren<TemporaryElement2dSearchResultsNode>;\n};\n\ntype TemporaryElement3dSearchResultsNode = Omit<Element3dSearchResultsTreeNode, \"modelId\" | \"categoryId\" | \"children\"> & {\n modelId: string | undefined;\n categoryId: string | undefined;\n children?: SearchResultsTreeNodeChildren<TemporaryElement3dSearchResultsNode>;\n};\n\ntype TemporarySearchResultsTreeNode =\n | ClassificationTableSearchResultsTreeNode\n | ClassificationSearchResultsTreeNode\n | TemporaryElement2dSearchResultsNode\n | TemporaryElement3dSearchResultsNode;\n\n/** @internal */\nexport interface ClassificationsTreeSearchTargets {\n elements2d?: Array<{ modelId: Id64String; categoryId: Id64String; elements: Map<ElementId, { isSearchTarget: boolean }> }>;\n elements3d?: Array<{ modelId: Id64String; categoryId: Id64String; elements: Map<ElementId, { isSearchTarget: boolean }> }>;\n classificationTableIds?: Id64Set;\n classificationIds?: Id64Set;\n}\n\n/** @internal */\nexport async function createClassificationsSearchResultsTree(props: {\n imodelAccess: ECClassHierarchyInspector;\n searchPaths: HierarchySearchPath[];\n idsCache: ClassificationsTreeIdsCache;\n}): Promise<SearchResultsTree<ClassificationsTreeSearchTargets>> {\n const { imodelAccess, searchPaths, idsCache } = props;\n return createSearchResultsTree({\n searchResultsNodesHandler: new ClassificationsTreeSearchResultsNodesHandler({ idsCache, imodelAccess }),\n searchPaths,\n });\n}\n\ninterface SearchTargetsInternal {\n elements2d?: Map<ModelCategoryKey, Map<ElementId, { isSearchTarget: boolean }>>;\n elements3d?: Map<ModelCategoryKey, Map<ElementId, { isSearchTarget: boolean }>>;\n classificationTableIds?: Id64Set;\n classificationIds?: Id64Set;\n}\n\ninterface ClassificationsTreeSearchResultsNodesHandlerProps {\n idsCache: ClassificationsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n}\n\ntype ModelCategoryKey = `${ModelId}-${CategoryId}`;\n\ninterface ProcessedSearchResultsNodes {\n searchResults2dElements: Map<Id64String, Omit<Element2dSearchResultsTreeNode, \"children\">>;\n searchResults3dElements: Map<Id64String, Omit<Element3dSearchResultsTreeNode, \"children\">>;\n}\n\nclass ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHandler<\n ProcessedSearchResultsNodes,\n ClassificationsTreeSearchTargets,\n TemporarySearchResultsTreeNode\n> {\n readonly #props: ClassificationsTreeSearchResultsNodesHandlerProps;\n constructor(props: ClassificationsTreeSearchResultsNodesHandlerProps) {\n super();\n this.#props = props;\n }\n\n public async getProcessedSearchResultsNodes(): Promise<ProcessedSearchResultsNodes> {\n const searchResultsTemporary2dElements = new Map<Id64String, Omit<TemporaryElement2dSearchResultsNode, \"children\">>();\n const searchResultsTemporary3dElements = new Map<Id64String, Omit<TemporaryElement3dSearchResultsNode, \"children\">>();\n const result: ProcessedSearchResultsNodes = {\n searchResults2dElements: new Map(),\n searchResults3dElements: new Map(),\n };\n for (const node of this.searchResultsNodesArr) {\n if (node.type === \"element2d\") {\n searchResultsTemporary2dElements.set(node.id, node);\n } else if (node.type === \"element3d\") {\n searchResultsTemporary3dElements.set(node.id, node);\n }\n }\n\n const searchResultsElementsModels = await firstValueFrom(\n this.#props.idsCache.getFilteredElementsData({\n element2dIds: [...searchResultsTemporary2dElements.keys()],\n element3dIds: [...searchResultsTemporary3dElements.keys()],\n }),\n );\n searchResultsTemporary2dElements.forEach((element, id) => {\n const entry = searchResultsElementsModels.get(element.id);\n assert(entry !== undefined);\n result.searchResults2dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });\n });\n searchResultsTemporary3dElements.forEach((element, id) => {\n const entry = searchResultsElementsModels.get(element.id);\n assert(entry !== undefined);\n result.searchResults3dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });\n });\n return result;\n }\n\n public convertNodesToSearchTargets(\n searchResultsNodes: TemporarySearchResultsTreeNode[],\n processedSearchResultsNodes: ProcessedSearchResultsNodes,\n ): ClassificationsTreeSearchTargets | undefined {\n const searchTargets: SearchTargetsInternal = {};\n\n searchResultsNodes.forEach((searchResultsNode) => this.collectSearchTargets(searchTargets, searchResultsNode, processedSearchResultsNodes));\n\n return this.convertInternalSearchTargets(searchTargets);\n }\n\n private convertInternalSearchTargets(searchTargets: SearchTargetsInternal): ClassificationsTreeSearchTargets | undefined {\n if (!searchTargets.classificationIds && !searchTargets.classificationIds && !searchTargets.elements2d && !searchTargets.elements3d) {\n return undefined;\n }\n\n return {\n classificationIds: searchTargets.classificationIds,\n classificationTableIds: searchTargets.classificationIds,\n elements2d: searchTargets.elements2d\n ? [...searchTargets.elements2d?.entries()].map(([modelCategoryKey, elements]) => {\n const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);\n return { modelId, categoryId, elements };\n })\n : undefined,\n elements3d: searchTargets.elements3d\n ? [...searchTargets.elements3d?.entries()].map(([modelCategoryKey, elements]) => {\n const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);\n return { modelId, categoryId, elements };\n })\n : undefined,\n };\n }\n\n private collectSearchTargets(\n searchTargets: SearchTargetsInternal,\n node: TemporarySearchResultsTreeNode,\n processedSearchResultsNodes: ProcessedSearchResultsNodes,\n ) {\n const searchResultsNode =\n node.type === \"element2d\"\n ? processedSearchResultsNodes.searchResults2dElements.get(node.id)\n : node.type === \"element3d\"\n ? processedSearchResultsNodes.searchResults3dElements.get(node.id)\n : node;\n assert(searchResultsNode !== undefined);\n if (searchResultsNode.isSearchTarget) {\n this.addTarget(searchTargets, searchResultsNode);\n return;\n }\n\n if (searchResultsNode.type === \"element2d\" || searchResultsNode.type === \"element3d\") {\n // need to add parent ids as search target will be an element\n this.addTarget(searchTargets, searchResultsNode);\n }\n\n if (!node.children) {\n return;\n }\n\n for (const child of node.children.values()) {\n this.collectSearchTargets(searchTargets, child, processedSearchResultsNodes);\n }\n }\n\n private addTarget(searchTargets: SearchTargetsInternal, node: SearchResultsTreeNode) {\n switch (node.type) {\n case \"classificationTable\":\n (searchTargets.classificationTableIds ??= new Set()).add(node.id);\n return;\n case \"classification\":\n (searchTargets.classificationIds ??= new Set()).add(node.id);\n return;\n case \"element2d\":\n const element2dKey = this.createModelCategoryKey(node.modelId, node.categoryId);\n const elements2d = (searchTargets.elements2d ??= new Map()).get(element2dKey);\n if (elements2d) {\n elements2d.set(node.id, { isSearchTarget: node.isSearchTarget });\n } else {\n searchTargets.elements2d.set(element2dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));\n }\n return;\n case \"element3d\":\n const element3dKey = this.createModelCategoryKey(node.modelId, node.categoryId);\n const elements3d = (searchTargets.elements3d ??= new Map()).get(element3dKey);\n if (elements3d) {\n elements3d.set(node.id, { isSearchTarget: node.isSearchTarget });\n } else {\n searchTargets.elements3d.set(element3dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));\n }\n return;\n }\n }\n\n private createModelCategoryKey(modelId: Id64String, categoryId: Id64String): ModelCategoryKey {\n return `${modelId}-${categoryId}`;\n }\n\n private parseModelCategoryKey(key: ModelCategoryKey): { modelId: Id64String; categoryId: Id64String } {\n const [modelId, categoryId] = key.split(\"-\");\n return { modelId, categoryId };\n }\n\n public createSearchResultsTreeNode({\n type,\n id,\n isSearchTarget,\n }: {\n type: SearchResultsTreeNode[\"type\"];\n id: Id64String;\n isSearchTarget: boolean;\n }): TemporarySearchResultsTreeNode {\n if (type === \"element2d\" || type === \"element3d\") {\n return {\n id,\n isSearchTarget,\n type,\n modelId: undefined,\n categoryId: undefined,\n };\n }\n return {\n id,\n isSearchTarget,\n type,\n };\n }\n\n public async getType(className: string): Promise<TemporarySearchResultsTreeNode[\"type\"]> {\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_ClassificationTable)) {\n return \"classificationTable\";\n }\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_Classification)) {\n return \"classification\";\n }\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_GeometricElement2d)) {\n return \"element2d\";\n }\n return \"element3d\";\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Error that is thrown when too many matches are found while
|
|
2
|
+
* Error that is thrown when too many matches are found while searching the tree.
|
|
3
3
|
* @beta
|
|
4
4
|
*/
|
|
5
|
-
export declare class
|
|
5
|
+
export declare class SearchLimitExceededError extends Error {
|
|
6
6
|
readonly limit: number;
|
|
7
7
|
constructor(limit: number);
|
|
8
8
|
}
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
/**
|
|
6
|
-
* Error that is thrown when too many matches are found while
|
|
6
|
+
* Error that is thrown when too many matches are found while searching the tree.
|
|
7
7
|
* @beta
|
|
8
8
|
*/
|
|
9
|
-
export class
|
|
9
|
+
export class SearchLimitExceededError extends Error {
|
|
10
10
|
limit;
|
|
11
11
|
constructor(limit) {
|
|
12
|
-
super("Too many
|
|
12
|
+
super("Too many search matches");
|
|
13
13
|
this.limit = limit;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeErrors.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/TreeErrors.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG;;;GAGG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACd;IAAnC,YAAmC,KAAa;QAC9C,KAAK,CAAC,yBAAyB,CAAC,CAAC;QADA,UAAK,GAAL,KAAK,CAAQ;IAEhD,CAAC;CACF","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\n/**\n * Error that is thrown when too many matches are found while
|
|
1
|
+
{"version":3,"file":"TreeErrors.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/TreeErrors.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG;;;GAGG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACd;IAAnC,YAAmC,KAAa;QAC9C,KAAK,CAAC,yBAAyB,CAAC,CAAC;QADA,UAAK,GAAL,KAAK,CAAQ;IAEhD,CAAC;CACF","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\n/**\n * Error that is thrown when too many matches are found while searching the tree.\n * @beta\n */\nexport class SearchLimitExceededError extends Error {\n public constructor(public readonly limit: number) {\n super(\"Too many search matches\");\n }\n}\n"]}
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { useEffect, useRef, useState } from "react";
|
|
6
|
-
import { asyncScheduler, defer, distinct, EMPTY, from, lastValueFrom, mergeMap, observeOn,
|
|
6
|
+
import { asyncScheduler, catchError, defer, distinct, EMPTY, from, lastValueFrom, mergeMap, observeOn, Subject, takeUntil, tap, throttleTime } from "rxjs";
|
|
7
7
|
import { createTooltip } from "./internal/Tooltip.js";
|
|
8
|
+
import { useErrorState } from "./internal/UseErrorState.js";
|
|
8
9
|
import { useTelemetryContext } from "./UseTelemetryContext.js";
|
|
9
10
|
/** @internal */
|
|
10
11
|
export function useHierarchyVisibility({ visibilityHandlerFactory }) {
|
|
@@ -15,6 +16,7 @@ export function useHierarchyVisibility({ visibilityHandlerFactory }) {
|
|
|
15
16
|
triggerRefresh: () => { },
|
|
16
17
|
});
|
|
17
18
|
const { onFeatureUsed } = useTelemetryContext();
|
|
19
|
+
const setErrorState = useErrorState();
|
|
18
20
|
useEffect(() => {
|
|
19
21
|
visibilityStatusMap.current.clear();
|
|
20
22
|
const handler = visibilityHandlerFactory();
|
|
@@ -47,7 +49,10 @@ export function useHierarchyVisibility({ visibilityHandlerFactory }) {
|
|
|
47
49
|
needsRefresh: false,
|
|
48
50
|
});
|
|
49
51
|
},
|
|
50
|
-
}), takeUntil(visibilityChanged),
|
|
52
|
+
}), takeUntil(visibilityChanged), catchError((error) => {
|
|
53
|
+
setErrorState(error);
|
|
54
|
+
return EMPTY;
|
|
55
|
+
}))), throttleTime(100, undefined, { leading: false, trailing: true }))
|
|
51
56
|
.subscribe({
|
|
52
57
|
next: () => {
|
|
53
58
|
triggerCheckboxUpdate();
|
|
@@ -57,7 +62,12 @@ export function useHierarchyVisibility({ visibilityHandlerFactory }) {
|
|
|
57
62
|
onFeatureUsed({ featureId: "visibility-change", reportInteraction: true });
|
|
58
63
|
// visible should become hidden, partial and hidden should become visible TODO: redo for clarity
|
|
59
64
|
const on = visibilityState === "visible" ? false : true;
|
|
60
|
-
void
|
|
65
|
+
void (async () => {
|
|
66
|
+
try {
|
|
67
|
+
await handler.changeVisibility(node.nodeData, on);
|
|
68
|
+
}
|
|
69
|
+
catch { }
|
|
70
|
+
})();
|
|
61
71
|
const entry = visibilityStatusMap.current.get(node.id);
|
|
62
72
|
if (!entry) {
|
|
63
73
|
return;
|
|
@@ -86,7 +96,7 @@ export function useHierarchyVisibility({ visibilityHandlerFactory }) {
|
|
|
86
96
|
removeListener();
|
|
87
97
|
handler[Symbol.dispose]();
|
|
88
98
|
};
|
|
89
|
-
}, [visibilityHandlerFactory, onFeatureUsed]);
|
|
99
|
+
}, [visibilityHandlerFactory, onFeatureUsed, setErrorState]);
|
|
90
100
|
return state;
|
|
91
101
|
}
|
|
92
102
|
function createStateGetter(map, calculateVisibility) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseHierarchyVisibility.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/UseHierarchyVisibility.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 { useEffect, useRef, useState } from \"react\";\nimport {\n asyncScheduler,\n defer,\n distinct,\n EMPTY,\n from,\n lastValueFrom,\n mergeMap,\n observeOn,\n onErrorResumeNextWith,\n Subject,\n takeUntil,\n tap,\n throttleTime,\n} from \"rxjs\";\nimport { createTooltip } from \"./internal/Tooltip.js\";\nimport { useTelemetryContext } from \"./UseTelemetryContext.js\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport type { HierarchyNode, PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { TreeItemVisibilityButtonState, VisibilityContext } from \"./components/TreeNodeVisibilityButton.js\";\n\n/**\n * Data structure that describes instance visibility status.\n * @beta\n */\nexport interface VisibilityStatus {\n /** Instance visibility state. */\n state: \"visible\" | \"partial\" | \"hidden\";\n /** Specifies whether visibility changing is disabled or not. */\n isDisabled?: boolean;\n}\n\n/**\n * Handler that can be used to determine and change visibility of instances represented by tree nodes.\n * @beta\n */\nexport interface HierarchyVisibilityHandler extends Disposable {\n /** Event used to notify tree about visibility changes from outside. */\n readonly onVisibilityChange: BeEvent<() => void>;\n /** Returns current visibility status for tree node. */\n getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> | VisibilityStatus;\n /** Changes visibility of the instance represented by tree node. */\n changeVisibility(node: HierarchyNode, on: boolean): Promise<void>;\n}\n\ninterface UseHierarchyVisibilityProps {\n visibilityHandlerFactory: () => HierarchyVisibilityHandler;\n}\n\n/** @internal */\nexport function useHierarchyVisibility({ visibilityHandlerFactory }: UseHierarchyVisibilityProps): VisibilityContext & { triggerRefresh: () => void } {\n const visibilityStatusMap = useRef(new Map<string, { node: PresentationHierarchyNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>());\n const [state, setState] = useState<VisibilityContext & { triggerRefresh: () => void }>({\n getVisibilityButtonState: () => ({ isLoading: true }),\n onVisibilityButtonClick: () => {},\n triggerRefresh: () => {},\n });\n const { onFeatureUsed } = useTelemetryContext();\n\n useEffect(() => {\n visibilityStatusMap.current.clear();\n const handler = visibilityHandlerFactory();\n\n const visibilityChanged = new Subject<void>();\n const calculate = new Subject<PresentationHierarchyNode>();\n const calculateNodeStatus = (node: PresentationHierarchyNode) => {\n calculate.next(node);\n };\n\n const resetCache = () => {\n visibilityStatusMap.current.forEach((value) => {\n value.needsRefresh = true;\n });\n visibilityChanged.next();\n };\n\n const triggerCheckboxUpdate = () => {\n setState((prev) => ({\n ...prev,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n }));\n };\n\n const subscription = calculate\n .pipe(\n distinct(undefined, visibilityChanged),\n observeOn(asyncScheduler),\n mergeMap((node) =>\n defer(async () => handler.getVisibilityStatus(node.nodeData)).pipe(\n tap({\n next: (status) => {\n visibilityStatusMap.current.set(node.id, {\n node,\n status: {\n ...status,\n tooltip: createTooltip(status.state),\n },\n needsRefresh: false,\n });\n },\n }),\n takeUntil(visibilityChanged),\n onErrorResumeNextWith(EMPTY),\n ),\n ),\n throttleTime(100, undefined, { leading: false, trailing: true }),\n )\n .subscribe({\n next: () => {\n triggerCheckboxUpdate();\n },\n });\n\n const changeVisibility: VisibilityContext[\"onVisibilityButtonClick\"] = (node, visibilityState) => {\n onFeatureUsed({ featureId: \"visibility-change\", reportInteraction: true });\n // visible should become hidden, partial and hidden should become visible TODO: redo for clarity\n const on = visibilityState === \"visible\" ? false : true;\n void handler.changeVisibility(node.nodeData, on);\n const entry = visibilityStatusMap.current.get(node.id);\n if (!entry) {\n return;\n }\n entry.status = {\n ...entry.status,\n state: visibilityState,\n tooltip: createTooltip(\"determining\"),\n };\n triggerCheckboxUpdate();\n };\n\n setState({\n onVisibilityButtonClick: changeVisibility,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n triggerRefresh: () => {\n resetCache();\n triggerCheckboxUpdate();\n },\n });\n\n const removeListener = handler.onVisibilityChange.addListener(() => {\n resetCache();\n triggerCheckboxUpdate();\n });\n\n return () => {\n subscription.unsubscribe();\n removeListener();\n handler[Symbol.dispose]();\n };\n }, [visibilityHandlerFactory, onFeatureUsed]);\n\n return state;\n}\n\nfunction createStateGetter(\n map: MutableRefObject<Map<string, { node: PresentationHierarchyNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>>,\n calculateVisibility: (node: PresentationHierarchyNode) => void,\n): VisibilityContext[\"getVisibilityButtonState\"] {\n return (node) => {\n const entry = map.current.get(node.id);\n if (entry === undefined) {\n calculateVisibility(node);\n return { isLoading: true };\n }\n\n if (entry.needsRefresh) {\n calculateVisibility(node);\n }\n\n return entry.status;\n };\n}\n\n/**\n * Properties for an overridden method of a `HierarchyVisibilityHandler` implementation.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethodProps<TFunc> = TFunc extends (props: infer TProps) => infer TResult\n ? TProps & {\n /** A callback that produces the value from the original implementation. */\n readonly originalImplementation: () => TResult;\n /**\n * Reference to the hierarchy based handler.\n * @note Calling `getVisibility` or `changeVisibility` of this object invokes the overridden implementation as well.\n */\n readonly handler: HierarchyVisibilityHandler;\n }\n : never;\n\n/**\n * Function type for an overridden method of `HierarchyVisibilityHandler`.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethod<TFunc> = TFunc extends (...args: any[]) => infer TResult\n ? (props: HierarchyVisibilityHandlerOverridableMethodProps<TFunc>) => TResult\n : never;\n\n/** @internal */\nexport class HierarchyVisibilityOverrideHandler {\n #baseHandler: HierarchyVisibilityHandler;\n constructor(baseHandler: HierarchyVisibilityHandler) {\n this.#baseHandler = baseHandler;\n }\n public createVisibilityHandlerResult<TResult, TOverrideProps>(props: {\n nonOverriddenResult: Observable<TResult>;\n override: HierarchyVisibilityHandlerOverridableMethod<(props: TOverrideProps) => Promise<TResult>> | undefined;\n overrideProps: TOverrideProps;\n }): Observable<TResult> {\n const { nonOverriddenResult, override, overrideProps } = props;\n return override\n ? from(\n override({\n ...overrideProps,\n originalImplementation: async () => lastValueFrom(nonOverriddenResult, { defaultValue: undefined as TResult }),\n handler: this.#baseHandler,\n }),\n )\n : nonOverriddenResult;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UseHierarchyVisibility.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/UseHierarchyVisibility.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 { useEffect, useRef, useState } from \"react\";\nimport { asyncScheduler, catchError, defer, distinct, EMPTY, from, lastValueFrom, mergeMap, observeOn, Subject, takeUntil, tap, throttleTime } from \"rxjs\";\nimport { createTooltip } from \"./internal/Tooltip.js\";\nimport { useErrorState } from \"./internal/UseErrorState.js\";\nimport { useTelemetryContext } from \"./UseTelemetryContext.js\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport type { HierarchyNode, PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { TreeItemVisibilityButtonState, VisibilityContext } from \"./components/TreeNodeVisibilityButton.js\";\n\n/**\n * Data structure that describes instance visibility status.\n * @beta\n */\nexport interface VisibilityStatus {\n /** Instance visibility state. */\n state: \"visible\" | \"partial\" | \"hidden\";\n /** Specifies whether visibility changing is disabled or not. */\n isDisabled?: boolean;\n}\n\n/**\n * Handler that can be used to determine and change visibility of instances represented by tree nodes.\n * @beta\n */\nexport interface HierarchyVisibilityHandler extends Disposable {\n /** Event used to notify tree about visibility changes from outside. */\n readonly onVisibilityChange: BeEvent<() => void>;\n /** Returns current visibility status for tree node. */\n getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> | VisibilityStatus;\n /** Changes visibility of the instance represented by tree node. */\n changeVisibility(node: HierarchyNode, on: boolean): Promise<void>;\n}\n\ninterface UseHierarchyVisibilityProps {\n visibilityHandlerFactory: () => HierarchyVisibilityHandler;\n}\n\n/** @internal */\nexport function useHierarchyVisibility({ visibilityHandlerFactory }: UseHierarchyVisibilityProps): VisibilityContext & { triggerRefresh: () => void } {\n const visibilityStatusMap = useRef(new Map<string, { node: PresentationHierarchyNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>());\n const [state, setState] = useState<VisibilityContext & { triggerRefresh: () => void }>({\n getVisibilityButtonState: () => ({ isLoading: true }),\n onVisibilityButtonClick: () => {},\n triggerRefresh: () => {},\n });\n const { onFeatureUsed } = useTelemetryContext();\n const setErrorState = useErrorState();\n\n useEffect(() => {\n visibilityStatusMap.current.clear();\n const handler = visibilityHandlerFactory();\n\n const visibilityChanged = new Subject<void>();\n const calculate = new Subject<PresentationHierarchyNode>();\n const calculateNodeStatus = (node: PresentationHierarchyNode) => {\n calculate.next(node);\n };\n\n const resetCache = () => {\n visibilityStatusMap.current.forEach((value) => {\n value.needsRefresh = true;\n });\n visibilityChanged.next();\n };\n\n const triggerCheckboxUpdate = () => {\n setState((prev) => ({\n ...prev,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n }));\n };\n\n const subscription = calculate\n .pipe(\n distinct(undefined, visibilityChanged),\n observeOn(asyncScheduler),\n mergeMap((node) =>\n defer(async () => handler.getVisibilityStatus(node.nodeData)).pipe(\n tap({\n next: (status) => {\n visibilityStatusMap.current.set(node.id, {\n node,\n status: {\n ...status,\n tooltip: createTooltip(status.state),\n },\n needsRefresh: false,\n });\n },\n }),\n takeUntil(visibilityChanged),\n catchError((error) => {\n setErrorState(error);\n return EMPTY;\n }),\n ),\n ),\n throttleTime(100, undefined, { leading: false, trailing: true }),\n )\n .subscribe({\n next: () => {\n triggerCheckboxUpdate();\n },\n });\n\n const changeVisibility: VisibilityContext[\"onVisibilityButtonClick\"] = (node, visibilityState) => {\n onFeatureUsed({ featureId: \"visibility-change\", reportInteraction: true });\n // visible should become hidden, partial and hidden should become visible TODO: redo for clarity\n const on = visibilityState === \"visible\" ? false : true;\n void (async () => {\n try {\n await handler.changeVisibility(node.nodeData, on);\n } catch {}\n })();\n const entry = visibilityStatusMap.current.get(node.id);\n if (!entry) {\n return;\n }\n entry.status = {\n ...entry.status,\n state: visibilityState,\n tooltip: createTooltip(\"determining\"),\n };\n triggerCheckboxUpdate();\n };\n\n setState({\n onVisibilityButtonClick: changeVisibility,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n triggerRefresh: () => {\n resetCache();\n triggerCheckboxUpdate();\n },\n });\n\n const removeListener = handler.onVisibilityChange.addListener(() => {\n resetCache();\n triggerCheckboxUpdate();\n });\n\n return () => {\n subscription.unsubscribe();\n removeListener();\n handler[Symbol.dispose]();\n };\n }, [visibilityHandlerFactory, onFeatureUsed, setErrorState]);\n\n return state;\n}\n\nfunction createStateGetter(\n map: MutableRefObject<Map<string, { node: PresentationHierarchyNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>>,\n calculateVisibility: (node: PresentationHierarchyNode) => void,\n): VisibilityContext[\"getVisibilityButtonState\"] {\n return (node) => {\n const entry = map.current.get(node.id);\n if (entry === undefined) {\n calculateVisibility(node);\n return { isLoading: true };\n }\n\n if (entry.needsRefresh) {\n calculateVisibility(node);\n }\n\n return entry.status;\n };\n}\n\n/**\n * Properties for an overridden method of a `HierarchyVisibilityHandler` implementation.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethodProps<TFunc> = TFunc extends (props: infer TProps) => infer TResult\n ? TProps & {\n /** A callback that produces the value from the original implementation. */\n readonly originalImplementation: () => TResult;\n /**\n * Reference to the hierarchy based handler.\n * @note Calling `getVisibility` or `changeVisibility` of this object invokes the overridden implementation as well.\n */\n readonly handler: HierarchyVisibilityHandler;\n }\n : never;\n\n/**\n * Function type for an overridden method of `HierarchyVisibilityHandler`.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethod<TFunc> = TFunc extends (...args: any[]) => infer TResult\n ? (props: HierarchyVisibilityHandlerOverridableMethodProps<TFunc>) => TResult\n : never;\n\n/** @internal */\nexport class HierarchyVisibilityOverrideHandler {\n #baseHandler: HierarchyVisibilityHandler;\n constructor(baseHandler: HierarchyVisibilityHandler) {\n this.#baseHandler = baseHandler;\n }\n public createVisibilityHandlerResult<TResult, TOverrideProps>(props: {\n nonOverriddenResult: Observable<TResult>;\n override: HierarchyVisibilityHandlerOverridableMethod<(props: TOverrideProps) => Promise<TResult>> | undefined;\n overrideProps: TOverrideProps;\n }): Observable<TResult> {\n const { nonOverriddenResult, override, overrideProps } = props;\n return override\n ? from(\n override({\n ...overrideProps,\n originalImplementation: async () => lastValueFrom(nonOverriddenResult, { defaultValue: undefined as TResult }),\n handler: this.#baseHandler,\n }),\n )\n : nonOverriddenResult;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PropsWithChildren } from "react";
|
|
2
|
-
type TrackedFeatures = "visibility-change" | "hierarchy-level-filtering" | "
|
|
2
|
+
type TrackedFeatures = "visibility-change" | "hierarchy-level-filtering" | "search" | "hierarchy-level-size-limit-hit" | "zoom-to-node" | "error-timeout" | "error-unknown";
|
|
3
3
|
interface TelemetryContext {
|
|
4
4
|
onPerformanceMeasured: (featureId: string, duration: number) => void;
|
|
5
5
|
onFeatureUsed: (props: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseTelemetryContext.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/UseTelemetryContext.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAkBhD,MAAM,gBAAgB,GAAG,aAAa,CAA+B,SAAS,CAAC,CAAC;AAYhF,YAAY;AACZ,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,EACR,qBAAqB,EACrB,aAAa,EACb,mBAAmB,GAC8B;IACjD,MAAM,wBAAwB,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,OAAO,CAAmB,GAAG,EAAE;QAClD,OAAO;YACL,qBAAqB,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC,GAAG,mBAAmB,IAAI,SAAS,EAAE,EAAE,QAAQ,CAAC;YACnI,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;gBAClD,IAAI,iBAAiB,KAAK,KAAK,EAAE,CAAC;oBAChC,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,mBAAmB,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,SAAS,EAAE,CAAC;oBACd,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,mBAAmB,IAAI,SAAS,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEtE,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAAG,QAAQ,GAA6B,CAAC;AAChG,CAAC;AAED,MAAM,mBAAmB,GAAqB;IAC5C,qBAAqB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC/B,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;CACxB,CAAC;AAEF,gBAAgB;AAChB,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,CAAC;AAC7D,CAAC;AAOD,gBAAgB;AAChB,MAAM,UAAU,kBAAkB,CAA2C,EAAE,MAAM,EAAE,SAAS,EAAoC;IAClI,MAAM,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAChD,OAAO,WAAW,CAChB,CAAC,GAAG,IAAI,EAAE,EAAE;QACV,aAAa,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAClB,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CACnC,CAAC;AACJ,CAAC","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 { createContext, useCallback, useContext, useMemo } from \"react\";\nimport { useLatest } from \"./internal/Utils.js\";\n\nimport type { PropsWithChildren } from \"react\";\n\ntype TrackedFeatures =\n | \"visibility-change\"\n | \"hierarchy-level-filtering\"\n | \"
|
|
1
|
+
{"version":3,"file":"UseTelemetryContext.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/UseTelemetryContext.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAkBhD,MAAM,gBAAgB,GAAG,aAAa,CAA+B,SAAS,CAAC,CAAC;AAYhF,YAAY;AACZ,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,EACR,qBAAqB,EACrB,aAAa,EACb,mBAAmB,GAC8B;IACjD,MAAM,wBAAwB,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,OAAO,CAAmB,GAAG,EAAE;QAClD,OAAO;YACL,qBAAqB,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC,GAAG,mBAAmB,IAAI,SAAS,EAAE,EAAE,QAAQ,CAAC;YACnI,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE;gBAClD,IAAI,iBAAiB,KAAK,KAAK,EAAE,CAAC;oBAChC,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,mBAAmB,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,IAAI,SAAS,EAAE,CAAC;oBACd,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,mBAAmB,IAAI,SAAS,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC,EAAE,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEtE,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAAG,QAAQ,GAA6B,CAAC;AAChG,CAAC;AAED,MAAM,mBAAmB,GAAqB;IAC5C,qBAAqB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC/B,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;CACxB,CAAC;AAEF,gBAAgB;AAChB,MAAM,UAAU,mBAAmB;IACjC,OAAO,UAAU,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,CAAC;AAC7D,CAAC;AAOD,gBAAgB;AAChB,MAAM,UAAU,kBAAkB,CAA2C,EAAE,MAAM,EAAE,SAAS,EAAoC;IAClI,MAAM,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAChD,OAAO,WAAW,CAChB,CAAC,GAAG,IAAI,EAAE,EAAE;QACV,aAAa,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAClB,CAAC,EACD,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CACnC,CAAC;AACJ,CAAC","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 { createContext, useCallback, useContext, useMemo } from \"react\";\nimport { useLatest } from \"./internal/Utils.js\";\n\nimport type { PropsWithChildren } from \"react\";\n\ntype TrackedFeatures =\n | \"visibility-change\"\n | \"hierarchy-level-filtering\"\n | \"search\"\n | \"hierarchy-level-size-limit-hit\"\n | \"zoom-to-node\"\n | \"error-timeout\"\n | \"error-unknown\";\n\ninterface TelemetryContext {\n onPerformanceMeasured: (featureId: string, duration: number) => void;\n onFeatureUsed: (props: { featureId?: TrackedFeatures; reportInteraction: boolean }) => void;\n}\n\nconst telemetryContext = createContext<TelemetryContext | undefined>(undefined);\n\n/** @beta */\nexport interface TelemetryContextProviderProps {\n /** Callback that is invoked when performance of tracked feature is measured. */\n onPerformanceMeasured?: (featureId: string, duration: number) => void;\n /** Callback that is invoked when a tracked feature is used. */\n onFeatureUsed?: (featureId: string) => void;\n /** Unique identifier that is appended to feature id to help track which component used that feature. */\n componentIdentifier: string;\n}\n\n/** @beta */\nexport function TelemetryContextProvider({\n children,\n onPerformanceMeasured,\n onFeatureUsed,\n componentIdentifier,\n}: PropsWithChildren<TelemetryContextProviderProps>) {\n const onPerformanceMeasuredRef = useLatest(onPerformanceMeasured);\n const onFeatureUsedRef = useLatest(onFeatureUsed);\n\n const contextValue = useMemo<TelemetryContext>(() => {\n return {\n onPerformanceMeasured: (featureId, duration) => onPerformanceMeasuredRef.current?.(`${componentIdentifier}-${featureId}`, duration),\n onFeatureUsed: ({ featureId, reportInteraction }) => {\n if (reportInteraction !== false) {\n onFeatureUsedRef.current?.(`use-${componentIdentifier}`);\n }\n if (featureId) {\n onFeatureUsedRef.current?.(`${componentIdentifier}-${featureId}`);\n }\n },\n };\n }, [componentIdentifier, onPerformanceMeasuredRef, onFeatureUsedRef]);\n\n return <telemetryContext.Provider value={contextValue}>{children}</telemetryContext.Provider>;\n}\n\nconst defaultContextValue: TelemetryContext = {\n onPerformanceMeasured: () => {},\n onFeatureUsed: () => {},\n};\n\n/** @internal */\nexport function useTelemetryContext() {\n return useContext(telemetryContext) ?? defaultContextValue;\n}\n\ninterface UseReportingActionProps<TAction> {\n action: TAction;\n featureId?: TrackedFeatures;\n}\n\n/** @internal */\nexport function useReportingAction<TAction extends (...args: any[]) => void>({ action, featureId }: UseReportingActionProps<TAction>) {\n const { onFeatureUsed } = useTelemetryContext();\n return useCallback<(...args: Parameters<TAction>) => void>(\n (...args) => {\n onFeatureUsed({ featureId, reportInteraction: true });\n action(...args);\n },\n [action, featureId, onFeatureUsed],\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { HierarchySearchPath } from "@itwin/presentation-hierarchies";
|
|
2
2
|
import type { GuidString, Id64Array } from "@itwin/core-bentley";
|
|
3
3
|
import type { HierarchyNodeIdentifiersPath } from "@itwin/presentation-hierarchies";
|
|
4
4
|
import type { TreeWidgetViewport } from "./TreeWidgetViewport.js";
|
|
@@ -43,7 +43,7 @@ export declare function toggleModels(models: string[], enable: boolean, viewport
|
|
|
43
43
|
*/
|
|
44
44
|
export declare function areAllModelsVisible(models: string[], viewport: TreeWidgetViewport): boolean;
|
|
45
45
|
/** @public */
|
|
46
|
-
export type
|
|
46
|
+
export type NormalizedHierarchySearchPath = ReturnType<(typeof HierarchySearchPath)["normalize"]>;
|
|
47
47
|
/** @internal */
|
|
48
|
-
export declare function
|
|
48
|
+
export declare function joinHierarchySearchPaths(subTreePaths: HierarchyNodeIdentifiersPath[], searchPaths: NormalizedHierarchySearchPath[]): NormalizedHierarchySearchPath[];
|
|
49
49
|
//# sourceMappingURL=Utils.d.ts.map
|
|
@@ -2,7 +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 {
|
|
5
|
+
import { HierarchyNodeIdentifier, HierarchySearchPath } from "@itwin/presentation-hierarchies";
|
|
6
6
|
import { showAllCategories } from "./CategoriesVisibilityUtils.js";
|
|
7
7
|
import { enableCategoryDisplay, loadCategoriesFromViewport } from "./internal/VisibilityUtils.js";
|
|
8
8
|
/**
|
|
@@ -24,9 +24,6 @@ export function hideAllModels(models, viewport) {
|
|
|
24
24
|
*/
|
|
25
25
|
export async function showAll(props) {
|
|
26
26
|
const { models, categories, viewport, componentId } = props;
|
|
27
|
-
viewport.changeModelDisplay({ modelIds: models, display: true });
|
|
28
|
-
viewport.clearNeverDrawn();
|
|
29
|
-
viewport.clearAlwaysDrawn();
|
|
30
27
|
if (categories) {
|
|
31
28
|
await showAllCategories(categories, viewport);
|
|
32
29
|
}
|
|
@@ -38,6 +35,9 @@ export async function showAll(props) {
|
|
|
38
35
|
const ids = categoryInfos.map((categoryInfo) => categoryInfo.categoryId);
|
|
39
36
|
await enableCategoryDisplay(viewport, ids, true);
|
|
40
37
|
}
|
|
38
|
+
viewport.changeModelDisplay({ modelIds: models, display: true });
|
|
39
|
+
viewport.clearNeverDrawn();
|
|
40
|
+
viewport.clearAlwaysDrawn();
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
43
|
* Inverts display of all given models.
|
|
@@ -75,37 +75,37 @@ export function areAllModelsVisible(models, viewport) {
|
|
|
75
75
|
return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;
|
|
76
76
|
}
|
|
77
77
|
/** @internal */
|
|
78
|
-
export function
|
|
78
|
+
export function joinHierarchySearchPaths(subTreePaths, searchPaths) {
|
|
79
79
|
const result = new Array();
|
|
80
|
-
const
|
|
80
|
+
const searchPathsToIncludeIndexes = new Set();
|
|
81
81
|
subTreePaths.forEach((subTreePath) => {
|
|
82
82
|
let options;
|
|
83
83
|
let addSubTreePathToResult = false;
|
|
84
|
-
for (let i = 0; i <
|
|
85
|
-
const
|
|
86
|
-
if (
|
|
84
|
+
for (let i = 0; i < searchPaths.length; ++i) {
|
|
85
|
+
const searchPath = searchPaths[i];
|
|
86
|
+
if (searchPath.path.length === 0) {
|
|
87
87
|
continue;
|
|
88
88
|
}
|
|
89
89
|
for (let j = 0; j < subTreePath.length; ++j) {
|
|
90
90
|
const identifier = subTreePath[j];
|
|
91
|
-
if (
|
|
91
|
+
if (searchPath.path.length <= j || !HierarchyNodeIdentifier.equal(searchPath.path[j], identifier)) {
|
|
92
92
|
break;
|
|
93
93
|
}
|
|
94
|
-
//
|
|
95
|
-
if (
|
|
94
|
+
// search paths that are shorter or equal than subTree paths length don't need to be added to the result
|
|
95
|
+
if (searchPath.path.length === j + 1) {
|
|
96
96
|
addSubTreePathToResult = true;
|
|
97
|
-
// If
|
|
97
|
+
// If search path has reveal set to true, it means that we should expand only to the targeted search node
|
|
98
98
|
// This is done by setting depthInPath
|
|
99
99
|
options =
|
|
100
|
-
|
|
101
|
-
?
|
|
102
|
-
: { reveal: { depthInPath:
|
|
100
|
+
searchPath.options?.reveal !== true
|
|
101
|
+
? HierarchySearchPath.mergeOptions(options, searchPath.options)
|
|
102
|
+
: { reveal: { depthInPath: searchPath.path.length - 1 } };
|
|
103
103
|
break;
|
|
104
104
|
}
|
|
105
|
-
//
|
|
105
|
+
// search paths that are longer than subTree paths need to be added to the result
|
|
106
106
|
if (subTreePath.length === j + 1) {
|
|
107
107
|
addSubTreePathToResult = true;
|
|
108
|
-
|
|
108
|
+
searchPathsToIncludeIndexes.add(i);
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
}
|
|
@@ -116,8 +116,8 @@ export function joinHierarchyFilteringPaths(subTreePaths, filteringPaths) {
|
|
|
116
116
|
});
|
|
117
117
|
}
|
|
118
118
|
});
|
|
119
|
-
for (const index of
|
|
120
|
-
result.push(
|
|
119
|
+
for (const index of searchPathsToIncludeIndexes) {
|
|
120
|
+
result.push(searchPaths[index]);
|
|
121
121
|
}
|
|
122
122
|
return result;
|
|
123
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/Utils.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/Utils.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAMlG;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAK9C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAgB,EAAE,QAA4B;IAC1E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAO7B;IACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC5D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,GAAG,MAAM,0BAA0B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC9E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACzE,MAAM,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,QAAQ,CAAC,eAAe,EAAE,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,QAA4B;IAC7E,MAAM,eAAe,GAAG,IAAI,KAAK,EAAc,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,KAAK,EAAc,CAAC;IAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACzB,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgB,EAAE,MAAe,EAAE,QAA4B;IAC1F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAgB,EAAE,QAA4B;IAChF,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACrF,CAAC;AAKD,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CACtC,YAA4C,EAC5C,WAA4C;IAE5C,MAAM,MAAM,GAAG,IAAI,KAAK,EAAiC,CAAC;IAC1D,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtD,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QACnC,IAAI,OAA+C,CAAC;QACpD,IAAI,sBAAsB,GAAG,KAAK,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;oBAClG,MAAM;gBACR,CAAC;gBAED,wGAAwG;gBACxG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,sBAAsB,GAAG,IAAI,CAAC;oBAC9B,yGAAyG;oBACzG,sCAAsC;oBACtC,OAAO;wBACL,UAAU,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;4BACjC,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;4BAC/D,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;oBAC9D,MAAM;gBACR,CAAC;gBAED,iFAAiF;gBACjF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjC,sBAAsB,GAAG,IAAI,CAAC;oBAC9B,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,sBAAsB,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,WAAW;gBACjB,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,KAAK,IAAI,2BAA2B,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","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 { HierarchyNodeIdentifier, HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport { showAllCategories } from \"./CategoriesVisibilityUtils.js\";\nimport { enableCategoryDisplay, loadCategoriesFromViewport } from \"./internal/VisibilityUtils.js\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, HierarchySearchPathOptions } from \"@itwin/presentation-hierarchies\";\nimport type { TreeWidgetViewport } from \"./TreeWidgetViewport.js\";\n\n/**\n * This is a logging namespace for public log messages that may be interesting to consumers.\n * @internal\n */\nexport const LOGGING_NAMESPACE = \"TreeWidget\";\n\n/** @beta */\nexport type FunctionProps<THook extends (props: any) => any> = Parameters<THook>[0];\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport function hideAllModels(models: string[], viewport: TreeWidgetViewport) {\n viewport.changeModelDisplay({ modelIds: models, display: false });\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n * @public\n */\nexport async function showAll(props: {\n /** ID's of models to enable */\n models: Id64Array;\n /** ID's of categories to enable, if set to undefined, all categories will be enabled */\n categories?: Id64Array;\n viewport: TreeWidgetViewport;\n componentId?: GuidString;\n}) {\n const { models, categories, viewport, componentId } = props;\n if (categories) {\n await showAllCategories(categories, viewport);\n } else {\n const categoryInfos = await loadCategoriesFromViewport(viewport, componentId);\n if (categoryInfos.length === 0) {\n return;\n }\n const ids = categoryInfos.map((categoryInfo) => categoryInfo.categoryId);\n await enableCategoryDisplay(viewport, ids, true);\n }\n viewport.changeModelDisplay({ modelIds: models, display: true });\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport function invertAllModels(models: Id64Array, viewport: TreeWidgetViewport) {\n const notViewedModels = new Array<Id64String>();\n const viewedModels = new Array<Id64String>();\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n viewport.changeModelDisplay({ modelIds: notViewedModels, display: true });\n viewport.changeModelDisplay({ modelIds: viewedModels, display: false });\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport function toggleModels(models: string[], enable: boolean, viewport: TreeWidgetViewport) {\n if (!models) {\n return;\n }\n viewport.changeModelDisplay({ modelIds: models, display: enable });\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: TreeWidgetViewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n\n/** @public */\nexport type NormalizedHierarchySearchPath = ReturnType<(typeof HierarchySearchPath)[\"normalize\"]>;\n\n/** @internal */\nexport function joinHierarchySearchPaths(\n subTreePaths: HierarchyNodeIdentifiersPath[],\n searchPaths: NormalizedHierarchySearchPath[],\n): NormalizedHierarchySearchPath[] {\n const result = new Array<NormalizedHierarchySearchPath>();\n const searchPathsToIncludeIndexes = new Set<number>();\n\n subTreePaths.forEach((subTreePath) => {\n let options: HierarchySearchPathOptions | undefined;\n let addSubTreePathToResult = false;\n\n for (let i = 0; i < searchPaths.length; ++i) {\n const searchPath = searchPaths[i];\n if (searchPath.path.length === 0) {\n continue;\n }\n\n for (let j = 0; j < subTreePath.length; ++j) {\n const identifier = subTreePath[j];\n if (searchPath.path.length <= j || !HierarchyNodeIdentifier.equal(searchPath.path[j], identifier)) {\n break;\n }\n\n // search paths that are shorter or equal than subTree paths length don't need to be added to the result\n if (searchPath.path.length === j + 1) {\n addSubTreePathToResult = true;\n // If search path has reveal set to true, it means that we should expand only to the targeted search node\n // This is done by setting depthInPath\n options =\n searchPath.options?.reveal !== true\n ? HierarchySearchPath.mergeOptions(options, searchPath.options)\n : { reveal: { depthInPath: searchPath.path.length - 1 } };\n break;\n }\n\n // search paths that are longer than subTree paths need to be added to the result\n if (subTreePath.length === j + 1) {\n addSubTreePathToResult = true;\n searchPathsToIncludeIndexes.add(i);\n }\n }\n }\n\n if (addSubTreePathToResult) {\n result.push({\n path: subTreePath,\n options,\n });\n }\n });\n for (const index of searchPathsToIncludeIndexes) {\n result.push(searchPaths[index]);\n }\n return result;\n}\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
|
|
6
|
-
.tw-
|
|
6
|
+
.tw-search-empty-tree-container {
|
|
7
7
|
display: flex;
|
|
8
8
|
flex-direction: column;
|
|
9
9
|
gap: var(--iui-size-s);
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import "./EmptyTree.css";
|
|
2
|
-
interface
|
|
2
|
+
interface SearchEmptyTreeProps {
|
|
3
3
|
base: string;
|
|
4
4
|
}
|
|
5
5
|
/** @internal */
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function TooManySearchMatches({ base }: SearchEmptyTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
7
7
|
/** @internal */
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function NoSearchMatches({ base }: SearchEmptyTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
9
9
|
/** @internal */
|
|
10
|
-
export declare function
|
|
10
|
+
export declare function SearchUnknownError({ base }: SearchEmptyTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
/** @internal */
|
|
12
|
-
export declare function TooManyInstancesFocused({ base }:
|
|
12
|
+
export declare function TooManyInstancesFocused({ base }: SearchEmptyTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
13
13
|
/** @internal */
|
|
14
|
-
export declare function UnknownInstanceFocusError({ base }:
|
|
14
|
+
export declare function UnknownInstanceFocusError({ base }: SearchEmptyTreeProps): import("react/jsx-runtime").JSX.Element;
|
|
15
15
|
interface SubTreeErrorProps {
|
|
16
16
|
base: string;
|
|
17
17
|
error: string;
|