@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
|
@@ -13,40 +13,40 @@ import { createVisibilityStatus } from "../Tooltip.js";
|
|
|
13
13
|
import { createVisibilityChangeEventListener } from "../VisibilityChangeEventListener.js";
|
|
14
14
|
/** @internal */
|
|
15
15
|
export function useCachedVisibility(props) {
|
|
16
|
-
const [
|
|
17
|
-
const { activeView, getCache,
|
|
16
|
+
const [searchPaths, setSearchPaths] = useState(undefined);
|
|
17
|
+
const { activeView, getCache, createSearchResultsTree, createTreeSpecificVisibilityHandler, componentId } = props;
|
|
18
18
|
const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState(() => createVisibilityHandlerFactory({
|
|
19
19
|
activeView,
|
|
20
20
|
getCache,
|
|
21
|
-
|
|
21
|
+
createSearchResultsTree,
|
|
22
22
|
createTreeSpecificVisibilityHandler,
|
|
23
|
-
|
|
23
|
+
searchPaths,
|
|
24
24
|
componentId,
|
|
25
25
|
}));
|
|
26
26
|
useEffect(() => {
|
|
27
27
|
setVisibilityHandlerFactory(() => createVisibilityHandlerFactory({
|
|
28
28
|
activeView,
|
|
29
29
|
getCache,
|
|
30
|
-
|
|
30
|
+
createSearchResultsTree,
|
|
31
31
|
createTreeSpecificVisibilityHandler,
|
|
32
|
-
|
|
32
|
+
searchPaths,
|
|
33
33
|
componentId,
|
|
34
34
|
}));
|
|
35
|
-
}, [activeView, getCache,
|
|
35
|
+
}, [activeView, getCache, searchPaths, createSearchResultsTree, createTreeSpecificVisibilityHandler, componentId]);
|
|
36
36
|
return {
|
|
37
37
|
visibilityHandlerFactory,
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
onSearchPathsChanged: useCallback((paths) => setSearchPaths(paths), []),
|
|
39
|
+
searchPaths,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
function createVisibilityHandlerFactory(props) {
|
|
43
|
-
const { activeView,
|
|
43
|
+
const { activeView, createSearchResultsTree, createTreeSpecificVisibilityHandler, getCache, searchPaths, componentId } = props;
|
|
44
44
|
return ({ imodelAccess }) => new HierarchyVisibilityHandlerImpl({
|
|
45
45
|
componentId,
|
|
46
46
|
viewport: activeView,
|
|
47
|
-
|
|
48
|
-
if (
|
|
49
|
-
return
|
|
47
|
+
getSearchResultsTree: () => {
|
|
48
|
+
if (searchPaths) {
|
|
49
|
+
return createSearchResultsTree({ imodelAccess, searchPaths, getCache });
|
|
50
50
|
}
|
|
51
51
|
return undefined;
|
|
52
52
|
},
|
|
@@ -72,7 +72,7 @@ export class HierarchyVisibilityHandlerImpl {
|
|
|
72
72
|
#alwaysAndNeverDrawnElements;
|
|
73
73
|
#treeSpecificVisibilityHandler;
|
|
74
74
|
#changeRequest = new Subject();
|
|
75
|
-
#
|
|
75
|
+
#searchResultsTree;
|
|
76
76
|
constructor(props) {
|
|
77
77
|
this.#props = props;
|
|
78
78
|
this.#eventListener = createVisibilityChangeEventListener({
|
|
@@ -86,7 +86,7 @@ export class HierarchyVisibilityHandlerImpl {
|
|
|
86
86
|
});
|
|
87
87
|
this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo({ viewport: this.#props.viewport, componentId: props.componentId });
|
|
88
88
|
this.#treeSpecificVisibilityHandler = this.#props.getTreeSpecificVisibilityHandler(this.#alwaysAndNeverDrawnElements, new HierarchyVisibilityOverrideHandler(this));
|
|
89
|
-
this.#
|
|
89
|
+
this.#searchResultsTree = this.#props.getSearchResultsTree();
|
|
90
90
|
}
|
|
91
91
|
get onVisibilityChange() {
|
|
92
92
|
return this.#eventListener.onVisibilityChange;
|
|
@@ -126,44 +126,44 @@ export class HierarchyVisibilityHandlerImpl {
|
|
|
126
126
|
}
|
|
127
127
|
getVisibilityStatusInternal(node) {
|
|
128
128
|
if (HierarchyNode.isClassGroupingNode(node)) {
|
|
129
|
-
if (node.extendedData?.
|
|
130
|
-
return this.
|
|
129
|
+
if (node.extendedData?.hasDirectNonSearchTargets && !node.extendedData?.hasSearchTargetAncestor) {
|
|
130
|
+
return this.getSearchResultsNodeVisibility({ node });
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
|
-
if (HierarchyNode.isInstancesNode(node) && node.
|
|
134
|
-
return this.
|
|
133
|
+
if (HierarchyNode.isInstancesNode(node) && node.search?.childrenTargetPaths?.length && !node.search.isSearchTarget) {
|
|
134
|
+
return this.getSearchResultsNodeVisibility({ node });
|
|
135
135
|
}
|
|
136
136
|
return this.#treeSpecificVisibilityHandler.getVisibilityStatus(node);
|
|
137
137
|
}
|
|
138
138
|
changeVisibilityStatusInternal(node, on) {
|
|
139
139
|
if (HierarchyNode.isClassGroupingNode(node)) {
|
|
140
|
-
if (node.extendedData?.
|
|
141
|
-
return this.
|
|
140
|
+
if (node.extendedData?.hasDirectNonSearchTargets && !node.extendedData?.hasSearchTargetAncestor) {
|
|
141
|
+
return this.changeSearchResultsNodeVisibility({ node, on });
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
|
-
if (HierarchyNode.isInstancesNode(node) && node.
|
|
145
|
-
return this.
|
|
144
|
+
if (HierarchyNode.isInstancesNode(node) && node.search?.childrenTargetPaths?.length && !node.search.isSearchTarget) {
|
|
145
|
+
return this.changeSearchResultsNodeVisibility({ node, on });
|
|
146
146
|
}
|
|
147
147
|
return this.#treeSpecificVisibilityHandler.changeVisibilityStatus(node, on);
|
|
148
148
|
}
|
|
149
|
-
|
|
150
|
-
return this.
|
|
149
|
+
getSearchResultsNodeVisibility(props) {
|
|
150
|
+
return this.getSearchResultsTreeTargets(props).pipe(mergeMap((targets) => {
|
|
151
151
|
if (!targets) {
|
|
152
152
|
return EMPTY;
|
|
153
153
|
}
|
|
154
|
-
return this.#treeSpecificVisibilityHandler.
|
|
154
|
+
return this.#treeSpecificVisibilityHandler.getSearchTargetsVisibilityStatus(targets);
|
|
155
155
|
}));
|
|
156
156
|
}
|
|
157
|
-
|
|
158
|
-
assert(this.#
|
|
159
|
-
return from(this.#
|
|
157
|
+
getSearchResultsTreeTargets({ node, }) {
|
|
158
|
+
assert(this.#searchResultsTree !== undefined);
|
|
159
|
+
return from(this.#searchResultsTree).pipe(map((searchResultsTree) => searchResultsTree.getSearchTargets(node)));
|
|
160
160
|
}
|
|
161
|
-
|
|
162
|
-
return this.
|
|
161
|
+
changeSearchResultsNodeVisibility({ on, node, }) {
|
|
162
|
+
return this.getSearchResultsTreeTargets({ node }).pipe(mergeMap((targets) => {
|
|
163
163
|
if (!targets) {
|
|
164
164
|
return EMPTY;
|
|
165
165
|
}
|
|
166
|
-
return this.#treeSpecificVisibilityHandler.
|
|
166
|
+
return this.#treeSpecificVisibilityHandler.changeSearchTargetsVisibilityStatus(targets, on);
|
|
167
167
|
}));
|
|
168
168
|
}
|
|
169
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseCachedVisibility.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.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 { useCallback, useEffect, useState } from \"react\";\nimport { defaultIfEmpty, EMPTY, filter, firstValueFrom, from, fromEventPattern, map, mergeMap, Subject, takeUntil, tap } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { HierarchyNode, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { HierarchyVisibilityOverrideHandler } from \"../../UseHierarchyVisibility.js\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"../AlwaysAndNeverDrawnElementInfo.js\";\nimport { toVoidPromise } from \"../Rxjs.js\";\nimport { createVisibilityStatus } from \"../Tooltip.js\";\nimport { createVisibilityChangeEventListener } from \"../VisibilityChangeEventListener.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString } from \"@itwin/core-bentley\";\nimport type { ClassGroupingNodeKey, HierarchyFilteringPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { VisibilityTreeProps } from \"../../components/VisibilityTree.js\";\nimport type { TreeWidgetViewport } from \"../../TreeWidgetViewport.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../UseHierarchyVisibility.js\";\nimport type { FilteredTree } from \"../visibility/BaseFilteredTree.js\";\nimport type { TreeSpecificVisibilityHandler } from \"../visibility/BaseVisibilityHelper.js\";\nimport type { IVisibilityChangeEventListener } from \"../VisibilityChangeEventListener.js\";\n\n/** @internal */\nexport interface CreateFilteredTreeProps<TCache> {\n getCache: () => TCache;\n imodelAccess: ECClassHierarchyInspector;\n filteringPaths: HierarchyFilteringPath[];\n}\n\n/** @internal */\nexport interface CreateTreeSpecificVisibilityHandlerProps<TCache> {\n info: AlwaysAndNeverDrawnElementInfo;\n getCache: () => TCache;\n viewport: TreeWidgetViewport;\n overrideHandler: HierarchyVisibilityOverrideHandler;\n}\n\n/** @internal */\nexport interface UseCachedVisibilityProps<TCache, TFilterTargets> {\n componentId: GuidString;\n activeView: TreeWidgetViewport;\n getCache: () => TCache;\n createFilteredTree: (props: CreateFilteredTreeProps<TCache>) => Promise<FilteredTree<TFilterTargets>>;\n createTreeSpecificVisibilityHandler: (props: CreateTreeSpecificVisibilityHandlerProps<TCache>) => TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;\n}\n\n/** @internal */\nexport function useCachedVisibility<TCache, TFilterTargets>(props: UseCachedVisibilityProps<TCache, TFilterTargets>) {\n const [filteredPaths, setFilteredPaths] = useState<HierarchyFilteringPath[] | undefined>(undefined);\n const { activeView, getCache, createFilteredTree, createTreeSpecificVisibilityHandler, componentId } = props;\n\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState<VisibilityTreeProps[\"visibilityHandlerFactory\"]>(() =>\n createVisibilityHandlerFactory({\n activeView,\n getCache,\n createFilteredTree,\n createTreeSpecificVisibilityHandler,\n filteringPaths: filteredPaths,\n componentId,\n }),\n );\n\n useEffect(() => {\n setVisibilityHandlerFactory(() =>\n createVisibilityHandlerFactory({\n activeView,\n getCache,\n createFilteredTree,\n createTreeSpecificVisibilityHandler,\n filteringPaths: filteredPaths,\n componentId,\n }),\n );\n }, [activeView, getCache, filteredPaths, createFilteredTree, createTreeSpecificVisibilityHandler, componentId]);\n\n return {\n visibilityHandlerFactory,\n onFilteredPathsChanged: useCallback((paths: HierarchyFilteringPath[] | undefined) => setFilteredPaths(paths), []),\n filteredPaths,\n };\n}\n\nfunction createVisibilityHandlerFactory<TCache, TFilterTargets>(\n props: UseCachedVisibilityProps<TCache, TFilterTargets> & {\n filteringPaths: HierarchyFilteringPath[] | undefined;\n },\n): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n const { activeView, createFilteredTree, createTreeSpecificVisibilityHandler, getCache, filteringPaths, componentId } = props;\n return ({ imodelAccess }) =>\n new HierarchyVisibilityHandlerImpl<TFilterTargets>({\n componentId,\n viewport: activeView,\n getFilteredTree: (): Promise<FilteredTree<TFilterTargets>> | undefined => {\n if (filteringPaths) {\n return createFilteredTree({ imodelAccess, filteringPaths, getCache });\n }\n return undefined;\n },\n getTreeSpecificVisibilityHandler: (info, overrideHandler) =>\n createTreeSpecificVisibilityHandler({\n info,\n getCache,\n viewport: activeView,\n overrideHandler,\n }),\n });\n}\n\n/** @internal */\nexport interface HierarchyVisibilityHandlerImplProps<TFilterTargets> {\n viewport: TreeWidgetViewport;\n getTreeSpecificVisibilityHandler: (\n info: AlwaysAndNeverDrawnElementInfo,\n overrideHandler: HierarchyVisibilityOverrideHandler,\n ) => TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;\n getFilteredTree: () => Promise<FilteredTree<TFilterTargets>> | undefined;\n componentId?: GuidString;\n}\n\n/**\n * Class that handles visibility of hierarchy nodes in a tree.\n *\n * - It provides methods to get and change visibility status of nodes.\n * - Also handles filtered tree nodes visibility.\n * - Listens to visibility change events and updates visibility status accordingly.\n * @internal\n */\nexport class HierarchyVisibilityHandlerImpl<TFilterTargets> implements HierarchyVisibilityHandler, Disposable {\n readonly #props: HierarchyVisibilityHandlerImplProps<TFilterTargets>;\n readonly #eventListener: IVisibilityChangeEventListener;\n readonly #alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n #treeSpecificVisibilityHandler: TreeSpecificVisibilityHandler<TFilterTargets> & Disposable;\n #changeRequest = new Subject<{ key: HierarchyNodeKey; depth: number }>();\n #filteredTree: Promise<FilteredTree<TFilterTargets>> | undefined;\n\n constructor(props: HierarchyVisibilityHandlerImplProps<TFilterTargets>) {\n this.#props = props;\n this.#eventListener = createVisibilityChangeEventListener({\n viewport: this.#props.viewport,\n listeners: {\n models: true,\n categories: true,\n elements: true,\n displayStyle: true,\n },\n });\n this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo({ viewport: this.#props.viewport, componentId: props.componentId });\n this.#treeSpecificVisibilityHandler = this.#props.getTreeSpecificVisibilityHandler(\n this.#alwaysAndNeverDrawnElements,\n new HierarchyVisibilityOverrideHandler(this),\n );\n this.#filteredTree = this.#props.getFilteredTree();\n }\n\n public get onVisibilityChange() {\n return this.#eventListener.onVisibilityChange;\n }\n\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n return firstValueFrom(\n this.getVisibilityStatusInternal(node).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n // unsubscribe if visibility changes\n takeUntil(\n fromEventPattern(\n (handler) => {\n this.#eventListener.onVisibilityChange.addListener(handler);\n },\n (handler) => {\n this.#eventListener.onVisibilityChange.removeListener(handler);\n },\n ),\n ),\n defaultIfEmpty(createVisibilityStatus(\"hidden\")),\n ),\n );\n }\n\n public async changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void> {\n // notify about new change request\n this.#changeRequest.next({ key: node.key, depth: node.parentKeys.length });\n\n const changeObservable = this.changeVisibilityStatusInternal(node, shouldDisplay).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n tap({\n subscribe: () => {\n this.#eventListener.suppressChangeEvents();\n this.#alwaysAndNeverDrawnElements.suppressChangeEvents();\n },\n finalize: () => {\n this.#eventListener.resumeChangeEvents();\n this.#alwaysAndNeverDrawnElements.resumeChangeEvents();\n },\n }),\n );\n\n return toVoidPromise(changeObservable);\n }\n\n public [Symbol.dispose]() {\n this.#eventListener[Symbol.dispose]();\n this.#alwaysAndNeverDrawnElements[Symbol.dispose]();\n this.#treeSpecificVisibilityHandler[Symbol.dispose]();\n }\n\n private getVisibilityStatusInternal(node: HierarchyNode) {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.extendedData?.hasFilterTargetAncestor) {\n return this.getFilteredNodeVisibility({ node });\n }\n }\n\n if (HierarchyNode.isInstancesNode(node) && node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.getFilteredNodeVisibility({ node });\n }\n return this.#treeSpecificVisibilityHandler.getVisibilityStatus(node);\n }\n\n private changeVisibilityStatusInternal(node: HierarchyNode, on: boolean): Observable<void> {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonFilteredTargets && !node.extendedData?.hasFilterTargetAncestor) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n }\n if (HierarchyNode.isInstancesNode(node) && node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.changeFilteredNodeVisibility({ node, on });\n }\n return this.#treeSpecificVisibilityHandler.changeVisibilityStatus(node, on);\n }\n\n private getFilteredNodeVisibility(props: {\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }) {\n return this.getFilteredTreeTargets(props).pipe(\n mergeMap((targets) => {\n if (!targets) {\n return EMPTY;\n }\n return this.#treeSpecificVisibilityHandler.getFilterTargetsVisibilityStatus(targets);\n }),\n );\n }\n\n private getFilteredTreeTargets({\n node,\n }: {\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }): Observable<TFilterTargets | undefined> {\n assert(this.#filteredTree !== undefined);\n return from(this.#filteredTree).pipe(map((filteredTree) => filteredTree.getFilterTargets(node)));\n }\n\n private changeFilteredNodeVisibility({\n on,\n node,\n }: {\n on: boolean;\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }) {\n return this.getFilteredTreeTargets({ node }).pipe(\n mergeMap((targets) => {\n if (!targets) {\n return EMPTY;\n }\n return this.#treeSpecificVisibilityHandler.changeFilterTargetsVisibilityStatus(targets, on);\n }),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"UseCachedVisibility.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.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 { useCallback, useEffect, useState } from \"react\";\nimport { defaultIfEmpty, EMPTY, filter, firstValueFrom, from, fromEventPattern, map, mergeMap, Subject, takeUntil, tap } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { HierarchyNode, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { HierarchyVisibilityOverrideHandler } from \"../../UseHierarchyVisibility.js\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"../AlwaysAndNeverDrawnElementInfo.js\";\nimport { toVoidPromise } from \"../Rxjs.js\";\nimport { createVisibilityStatus } from \"../Tooltip.js\";\nimport { createVisibilityChangeEventListener } from \"../VisibilityChangeEventListener.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString } from \"@itwin/core-bentley\";\nimport type { ClassGroupingNodeKey, HierarchySearchPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { VisibilityTreeProps } from \"../../components/VisibilityTree.js\";\nimport type { TreeWidgetViewport } from \"../../TreeWidgetViewport.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../UseHierarchyVisibility.js\";\nimport type { SearchResultsTree } from \"../visibility/BaseSearchResultsTree.js\";\nimport type { TreeSpecificVisibilityHandler } from \"../visibility/BaseVisibilityHelper.js\";\nimport type { IVisibilityChangeEventListener } from \"../VisibilityChangeEventListener.js\";\n\n/** @internal */\nexport interface CreateSearchResultsTreeProps<TCache> {\n getCache: () => TCache;\n imodelAccess: ECClassHierarchyInspector;\n searchPaths: HierarchySearchPath[];\n}\n\n/** @internal */\nexport interface CreateTreeSpecificVisibilityHandlerProps<TCache> {\n info: AlwaysAndNeverDrawnElementInfo;\n getCache: () => TCache;\n viewport: TreeWidgetViewport;\n overrideHandler: HierarchyVisibilityOverrideHandler;\n}\n\n/** @internal */\nexport interface UseCachedVisibilityProps<TCache, TSearchTargets> {\n componentId: GuidString;\n activeView: TreeWidgetViewport;\n getCache: () => TCache;\n createSearchResultsTree: (props: CreateSearchResultsTreeProps<TCache>) => Promise<SearchResultsTree<TSearchTargets>>;\n createTreeSpecificVisibilityHandler: (props: CreateTreeSpecificVisibilityHandlerProps<TCache>) => TreeSpecificVisibilityHandler<TSearchTargets> & Disposable;\n}\n\n/** @internal */\nexport function useCachedVisibility<TCache, TSearchTargets>(props: UseCachedVisibilityProps<TCache, TSearchTargets>) {\n const [searchPaths, setSearchPaths] = useState<HierarchySearchPath[] | undefined>(undefined);\n const { activeView, getCache, createSearchResultsTree, createTreeSpecificVisibilityHandler, componentId } = props;\n\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState<VisibilityTreeProps[\"visibilityHandlerFactory\"]>(() =>\n createVisibilityHandlerFactory({\n activeView,\n getCache,\n createSearchResultsTree,\n createTreeSpecificVisibilityHandler,\n searchPaths,\n componentId,\n }),\n );\n\n useEffect(() => {\n setVisibilityHandlerFactory(() =>\n createVisibilityHandlerFactory({\n activeView,\n getCache,\n createSearchResultsTree,\n createTreeSpecificVisibilityHandler,\n searchPaths,\n componentId,\n }),\n );\n }, [activeView, getCache, searchPaths, createSearchResultsTree, createTreeSpecificVisibilityHandler, componentId]);\n\n return {\n visibilityHandlerFactory,\n onSearchPathsChanged: useCallback((paths: HierarchySearchPath[] | undefined) => setSearchPaths(paths), []),\n searchPaths,\n };\n}\n\nfunction createVisibilityHandlerFactory<TCache, TSearchTargets>(\n props: UseCachedVisibilityProps<TCache, TSearchTargets> & {\n searchPaths: HierarchySearchPath[] | undefined;\n },\n): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n const { activeView, createSearchResultsTree, createTreeSpecificVisibilityHandler, getCache, searchPaths, componentId } = props;\n return ({ imodelAccess }) =>\n new HierarchyVisibilityHandlerImpl<TSearchTargets>({\n componentId,\n viewport: activeView,\n getSearchResultsTree: (): Promise<SearchResultsTree<TSearchTargets>> | undefined => {\n if (searchPaths) {\n return createSearchResultsTree({ imodelAccess, searchPaths, getCache });\n }\n return undefined;\n },\n getTreeSpecificVisibilityHandler: (info, overrideHandler) =>\n createTreeSpecificVisibilityHandler({\n info,\n getCache,\n viewport: activeView,\n overrideHandler,\n }),\n });\n}\n\n/** @internal */\nexport interface HierarchyVisibilityHandlerImplProps<TSearchTargets> {\n viewport: TreeWidgetViewport;\n getTreeSpecificVisibilityHandler: (\n info: AlwaysAndNeverDrawnElementInfo,\n overrideHandler: HierarchyVisibilityOverrideHandler,\n ) => TreeSpecificVisibilityHandler<TSearchTargets> & Disposable;\n getSearchResultsTree: () => Promise<SearchResultsTree<TSearchTargets>> | undefined;\n componentId?: GuidString;\n}\n\n/**\n * Class that handles visibility of hierarchy nodes in a tree.\n *\n * - It provides methods to get and change visibility status of nodes.\n * - Also handles filtered tree nodes visibility.\n * - Listens to visibility change events and updates visibility status accordingly.\n * @internal\n */\nexport class HierarchyVisibilityHandlerImpl<TSearchTargets> implements HierarchyVisibilityHandler, Disposable {\n readonly #props: HierarchyVisibilityHandlerImplProps<TSearchTargets>;\n readonly #eventListener: IVisibilityChangeEventListener;\n readonly #alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n #treeSpecificVisibilityHandler: TreeSpecificVisibilityHandler<TSearchTargets> & Disposable;\n #changeRequest = new Subject<{ key: HierarchyNodeKey; depth: number }>();\n #searchResultsTree: Promise<SearchResultsTree<TSearchTargets>> | undefined;\n\n constructor(props: HierarchyVisibilityHandlerImplProps<TSearchTargets>) {\n this.#props = props;\n this.#eventListener = createVisibilityChangeEventListener({\n viewport: this.#props.viewport,\n listeners: {\n models: true,\n categories: true,\n elements: true,\n displayStyle: true,\n },\n });\n this.#alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo({ viewport: this.#props.viewport, componentId: props.componentId });\n this.#treeSpecificVisibilityHandler = this.#props.getTreeSpecificVisibilityHandler(\n this.#alwaysAndNeverDrawnElements,\n new HierarchyVisibilityOverrideHandler(this),\n );\n this.#searchResultsTree = this.#props.getSearchResultsTree();\n }\n\n public get onVisibilityChange() {\n return this.#eventListener.onVisibilityChange;\n }\n\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n return firstValueFrom(\n this.getVisibilityStatusInternal(node).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n // unsubscribe if visibility changes\n takeUntil(\n fromEventPattern(\n (handler) => {\n this.#eventListener.onVisibilityChange.addListener(handler);\n },\n (handler) => {\n this.#eventListener.onVisibilityChange.removeListener(handler);\n },\n ),\n ),\n defaultIfEmpty(createVisibilityStatus(\"hidden\")),\n ),\n );\n }\n\n public async changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void> {\n // notify about new change request\n this.#changeRequest.next({ key: node.key, depth: node.parentKeys.length });\n\n const changeObservable = this.changeVisibilityStatusInternal(node, shouldDisplay).pipe(\n // unsubscribe from the observable if the change request for this node is received\n takeUntil(this.#changeRequest.pipe(filter(({ key, depth }) => depth === node.parentKeys.length && HierarchyNodeKey.equals(node.key, key)))),\n tap({\n subscribe: () => {\n this.#eventListener.suppressChangeEvents();\n this.#alwaysAndNeverDrawnElements.suppressChangeEvents();\n },\n finalize: () => {\n this.#eventListener.resumeChangeEvents();\n this.#alwaysAndNeverDrawnElements.resumeChangeEvents();\n },\n }),\n );\n\n return toVoidPromise(changeObservable);\n }\n\n public [Symbol.dispose]() {\n this.#eventListener[Symbol.dispose]();\n this.#alwaysAndNeverDrawnElements[Symbol.dispose]();\n this.#treeSpecificVisibilityHandler[Symbol.dispose]();\n }\n\n private getVisibilityStatusInternal(node: HierarchyNode) {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonSearchTargets && !node.extendedData?.hasSearchTargetAncestor) {\n return this.getSearchResultsNodeVisibility({ node });\n }\n }\n\n if (HierarchyNode.isInstancesNode(node) && node.search?.childrenTargetPaths?.length && !node.search.isSearchTarget) {\n return this.getSearchResultsNodeVisibility({ node });\n }\n return this.#treeSpecificVisibilityHandler.getVisibilityStatus(node);\n }\n\n private changeVisibilityStatusInternal(node: HierarchyNode, on: boolean): Observable<void> {\n if (HierarchyNode.isClassGroupingNode(node)) {\n if (node.extendedData?.hasDirectNonSearchTargets && !node.extendedData?.hasSearchTargetAncestor) {\n return this.changeSearchResultsNodeVisibility({ node, on });\n }\n }\n if (HierarchyNode.isInstancesNode(node) && node.search?.childrenTargetPaths?.length && !node.search.isSearchTarget) {\n return this.changeSearchResultsNodeVisibility({ node, on });\n }\n return this.#treeSpecificVisibilityHandler.changeVisibilityStatus(node, on);\n }\n\n private getSearchResultsNodeVisibility(props: {\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }) {\n return this.getSearchResultsTreeTargets(props).pipe(\n mergeMap((targets) => {\n if (!targets) {\n return EMPTY;\n }\n return this.#treeSpecificVisibilityHandler.getSearchTargetsVisibilityStatus(targets);\n }),\n );\n }\n\n private getSearchResultsTreeTargets({\n node,\n }: {\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }): Observable<TSearchTargets | undefined> {\n assert(this.#searchResultsTree !== undefined);\n return from(this.#searchResultsTree).pipe(map((searchResultsTree) => searchResultsTree.getSearchTargets(node)));\n }\n\n private changeSearchResultsNodeVisibility({\n on,\n node,\n }: {\n on: boolean;\n node: HierarchyNode & {\n key: ClassGroupingNodeKey | InstancesNodeKey;\n };\n }) {\n return this.getSearchResultsTreeTargets({ node }).pipe(\n mergeMap((targets) => {\n if (!targets) {\n return EMPTY;\n }\n return this.#treeSpecificVisibilityHandler.changeSearchTargetsVisibilityStatus(targets, on);\n }),\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { HierarchyNode, HierarchySearchPath } from "@itwin/presentation-hierarchies";
|
|
2
|
+
import type { Id64String } from "@itwin/core-bentley";
|
|
3
|
+
import type { ClassGroupingNodeKey, InstancesNodeKey } from "@itwin/presentation-hierarchies";
|
|
4
|
+
import type { InstanceKey } from "@itwin/presentation-shared";
|
|
5
|
+
/** @internal */
|
|
6
|
+
export type SearchResultsTreeNodeChildren<TSearchResultsTreeNode> = Map<Id64String, TSearchResultsTreeNode>;
|
|
7
|
+
/**
|
|
8
|
+
* A generic interface for a search results tree root node.
|
|
9
|
+
*
|
|
10
|
+
* It differs from `BaseSearchResultsTreeNode` in that it only contains children details and nothing else.
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export interface SearchResultsTreeRootNode<TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>> {
|
|
14
|
+
children: SearchResultsTreeNodeChildren<TSearchResultsTreeNode>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A generic interface for a search results tree node.
|
|
18
|
+
*
|
|
19
|
+
* It represents every node in a search results tree structure.
|
|
20
|
+
* @internal
|
|
21
|
+
* */
|
|
22
|
+
export interface BaseSearchResultsTreeNode<TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>> {
|
|
23
|
+
type: string;
|
|
24
|
+
id: Id64String;
|
|
25
|
+
children?: SearchResultsTreeNodeChildren<TSearchResultsTreeNode>;
|
|
26
|
+
isSearchTarget: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Class that provides methods to handle search results nodes in a tree structure.
|
|
30
|
+
*
|
|
31
|
+
* It provides two methods that can be shared across different search results trees:
|
|
32
|
+
* - `processSearchResultsNodes` - processes search results nodes and returns a function to get search targets for a node.
|
|
33
|
+
* - `accept` - accepts a new node and adds it to the tree structure.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
36
|
+
export declare abstract class SearchResultsNodesHandler<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>> {
|
|
37
|
+
readonly root: SearchResultsTreeRootNode<TSearchResultsTreeNode>;
|
|
38
|
+
readonly searchResultsNodesArr: TSearchResultsTreeNode[];
|
|
39
|
+
/** Returns search results tree node type based on its' className */
|
|
40
|
+
abstract getType(className: string): Promise<TSearchResultsTreeNode["type"]>;
|
|
41
|
+
/** Converts nodes to search targets */
|
|
42
|
+
abstract convertNodesToSearchTargets(searchResultsNodes: TSearchResultsTreeNode[], processedSearchResultsNodes: TProcessedSearchResultsNodes): TSearchTargets | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Processes search results nodes.
|
|
45
|
+
*
|
|
46
|
+
* Nodes are created using search paths, and some information is not present in the search paths.
|
|
47
|
+
* Because of this, some nodes may need to be processed to get additional information.
|
|
48
|
+
*
|
|
49
|
+
* E.g. Retrieving categoryId of elements can't be done using search paths.
|
|
50
|
+
*/
|
|
51
|
+
abstract getProcessedSearchResultsNodes(): Promise<TProcessedSearchResultsNodes>;
|
|
52
|
+
/** Creates search results nodes */
|
|
53
|
+
abstract createSearchResultsTreeNode(props: {
|
|
54
|
+
type: TSearchResultsTreeNode["type"];
|
|
55
|
+
id: Id64String;
|
|
56
|
+
isSearchTarget: boolean;
|
|
57
|
+
parent: TSearchResultsTreeNode | SearchResultsTreeRootNode<TSearchResultsTreeNode>;
|
|
58
|
+
}): TSearchResultsTreeNode;
|
|
59
|
+
processSearchResultsNodes(): Promise<{
|
|
60
|
+
getNodeSearchTargets: (node: HierarchyNode & {
|
|
61
|
+
key: ClassGroupingNodeKey | InstancesNodeKey;
|
|
62
|
+
}) => TSearchTargets | undefined;
|
|
63
|
+
}>;
|
|
64
|
+
/** Takes a new node and adds it to the tree structure. */
|
|
65
|
+
accept(props: {
|
|
66
|
+
instanceKey: InstanceKey;
|
|
67
|
+
parentNode: TSearchResultsTreeNode | SearchResultsTreeRootNode<TSearchResultsTreeNode>;
|
|
68
|
+
isSearchTarget: boolean;
|
|
69
|
+
}): Promise<TSearchResultsTreeNode>;
|
|
70
|
+
/** Takes a specific node and gets all search targets related to it. */
|
|
71
|
+
private getNodeSearchTargets;
|
|
72
|
+
/** Finds search results nodes that match the given keys. */
|
|
73
|
+
private findMatchingSearchResultsNodes;
|
|
74
|
+
}
|
|
75
|
+
/** @internal */
|
|
76
|
+
export interface SearchResultsTree<TSearchTargets> {
|
|
77
|
+
getSearchTargets: (node: HierarchyNode & {
|
|
78
|
+
key: ClassGroupingNodeKey | InstancesNodeKey;
|
|
79
|
+
}) => TSearchTargets | undefined;
|
|
80
|
+
}
|
|
81
|
+
/** @internal */
|
|
82
|
+
export interface CreateSearchResultsTreeProps<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>> {
|
|
83
|
+
searchResultsNodesHandler: SearchResultsNodesHandler<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode>;
|
|
84
|
+
searchPaths: HierarchySearchPath[];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Function iterates over search paths and uses `searchResultsNodesHandler` to create a search results tree.
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
export declare function createSearchResultsTree<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>>(props: CreateSearchResultsTreeProps<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode>): Promise<SearchResultsTree<TSearchTargets>>;
|
|
91
|
+
//# sourceMappingURL=BaseSearchResultsTree.d.ts.map
|
|
@@ -0,0 +1,112 @@
|
|
|
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 { Id64 } from "@itwin/core-bentley";
|
|
6
|
+
import { HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey, HierarchySearchPath } from "@itwin/presentation-hierarchies";
|
|
7
|
+
/**
|
|
8
|
+
* Class that provides methods to handle search results nodes in a tree structure.
|
|
9
|
+
*
|
|
10
|
+
* It provides two methods that can be shared across different search results trees:
|
|
11
|
+
* - `processSearchResultsNodes` - processes search results nodes and returns a function to get search targets for a node.
|
|
12
|
+
* - `accept` - accepts a new node and adds it to the tree structure.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export class SearchResultsNodesHandler {
|
|
16
|
+
root = {
|
|
17
|
+
children: new Map(),
|
|
18
|
+
};
|
|
19
|
+
searchResultsNodesArr = new Array();
|
|
20
|
+
async processSearchResultsNodes() {
|
|
21
|
+
const processedSearchResultsNodes = await this.getProcessedSearchResultsNodes();
|
|
22
|
+
return {
|
|
23
|
+
getNodeSearchTargets: (node) => this.getNodeSearchTargets(node, processedSearchResultsNodes),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/** Takes a new node and adds it to the tree structure. */
|
|
27
|
+
async accept(props) {
|
|
28
|
+
const { instanceKey, parentNode, isSearchTarget } = props;
|
|
29
|
+
const type = await this.getType(instanceKey.className);
|
|
30
|
+
const newNode = this.createSearchResultsTreeNode({
|
|
31
|
+
type,
|
|
32
|
+
id: instanceKey.id,
|
|
33
|
+
isSearchTarget,
|
|
34
|
+
parent: parentNode,
|
|
35
|
+
});
|
|
36
|
+
(parentNode.children ??= new Map()).set(instanceKey.id, newNode);
|
|
37
|
+
this.searchResultsNodesArr.push(newNode);
|
|
38
|
+
return newNode;
|
|
39
|
+
}
|
|
40
|
+
/** Takes a specific node and gets all search targets related to it. */
|
|
41
|
+
getNodeSearchTargets(node, processedSearchResultsNodes) {
|
|
42
|
+
let lookupParents = [this.root];
|
|
43
|
+
// find the search results parent nodes of the `node`
|
|
44
|
+
for (const parentKey of node.parentKeys) {
|
|
45
|
+
if (!HierarchyNodeKey.isInstances(parentKey)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// tree node might be merged from multiple instances. As search results tree stores only one instance per node, we need to find all matching nodes
|
|
49
|
+
// and use them when checking for matching node in one level deeper.
|
|
50
|
+
const parentNodes = this.findMatchingSearchResultsNodes(lookupParents, parentKey.instanceKeys.map((key) => key.id));
|
|
51
|
+
if (parentNodes.length === 0) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
lookupParents = parentNodes;
|
|
55
|
+
}
|
|
56
|
+
const ids = HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map(({ id }) => id) : node.groupedInstanceKeys.map(({ id }) => id);
|
|
57
|
+
// find search results nodes that match the `node`
|
|
58
|
+
const searchResultsNodes = this.findMatchingSearchResultsNodes(lookupParents, ids);
|
|
59
|
+
if (searchResultsNodes.length === 0) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return this.convertNodesToSearchTargets(searchResultsNodes, processedSearchResultsNodes);
|
|
63
|
+
}
|
|
64
|
+
/** Finds search results nodes that match the given keys. */
|
|
65
|
+
findMatchingSearchResultsNodes(lookupParents, ids) {
|
|
66
|
+
return lookupParents.flatMap((lookup) => {
|
|
67
|
+
const childrenArray = Array();
|
|
68
|
+
for (const id of Id64.iterable(ids)) {
|
|
69
|
+
const node = lookup.children?.get(id);
|
|
70
|
+
if (node) {
|
|
71
|
+
childrenArray.push(node);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return childrenArray;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Function iterates over search paths and uses `searchResultsNodesHandler` to create a search results tree.
|
|
80
|
+
* @internal
|
|
81
|
+
*/
|
|
82
|
+
export async function createSearchResultsTree(props) {
|
|
83
|
+
const { searchPaths, searchResultsNodesHandler } = props;
|
|
84
|
+
for (const searchPath of searchPaths) {
|
|
85
|
+
const normalizedPath = HierarchySearchPath.normalize(searchPath).path;
|
|
86
|
+
let parentNode = searchResultsNodesHandler.root;
|
|
87
|
+
for (let i = 0; i < normalizedPath.length; ++i) {
|
|
88
|
+
if ("type" in parentNode && "isSearchTarget" in parentNode && parentNode.isSearchTarget) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
const identifier = normalizedPath[i];
|
|
92
|
+
if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
const currentNode = parentNode.children?.get(identifier.id);
|
|
96
|
+
if (currentNode !== undefined) {
|
|
97
|
+
parentNode = currentNode;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
parentNode = await searchResultsNodesHandler.accept({
|
|
101
|
+
instanceKey: identifier,
|
|
102
|
+
parentNode,
|
|
103
|
+
isSearchTarget: i === normalizedPath.length - 1,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const processedSearchResultsNodes = await searchResultsNodesHandler.processSearchResultsNodes();
|
|
108
|
+
return {
|
|
109
|
+
getSearchTargets: (node) => processedSearchResultsNodes.getNodeSearchTargets(node),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=BaseSearchResultsTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseSearchResultsTree.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.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 { Id64 } from \"@itwin/core-bentley\";\nimport { HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey, HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\n\nimport type { Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport type { ClassGroupingNodeKey, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\n\n/** @internal */\nexport type SearchResultsTreeNodeChildren<TSearchResultsTreeNode> = Map<Id64String, TSearchResultsTreeNode>;\n\n/**\n * A generic interface for a search results tree root node.\n *\n * It differs from `BaseSearchResultsTreeNode` in that it only contains children details and nothing else.\n * @internal\n */\nexport interface SearchResultsTreeRootNode<TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>> {\n children: SearchResultsTreeNodeChildren<TSearchResultsTreeNode>;\n}\n\n/**\n * A generic interface for a search results tree node.\n *\n * It represents every node in a search results tree structure.\n * @internal\n * */\nexport interface BaseSearchResultsTreeNode<TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>> {\n type: string;\n id: Id64String;\n children?: SearchResultsTreeNodeChildren<TSearchResultsTreeNode>;\n isSearchTarget: boolean;\n}\n\n/**\n * Class that provides methods to handle search results nodes in a tree structure.\n *\n * It provides two methods that can be shared across different search results trees:\n * - `processSearchResultsNodes` - processes search results nodes and returns a function to get search targets for a node.\n * - `accept` - accepts a new node and adds it to the tree structure.\n * @internal\n */\nexport abstract class SearchResultsNodesHandler<\n TProcessedSearchResultsNodes,\n TSearchTargets,\n TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>,\n> {\n public readonly root: SearchResultsTreeRootNode<TSearchResultsTreeNode> = {\n children: new Map(),\n };\n public readonly searchResultsNodesArr = new Array<TSearchResultsTreeNode>();\n\n /** Returns search results tree node type based on its' className */\n public abstract getType(className: string): Promise<TSearchResultsTreeNode[\"type\"]>;\n /** Converts nodes to search targets */\n public abstract convertNodesToSearchTargets(\n searchResultsNodes: TSearchResultsTreeNode[],\n processedSearchResultsNodes: TProcessedSearchResultsNodes,\n ): TSearchTargets | undefined;\n /**\n * Processes search results nodes.\n *\n * Nodes are created using search paths, and some information is not present in the search paths.\n * Because of this, some nodes may need to be processed to get additional information.\n *\n * E.g. Retrieving categoryId of elements can't be done using search paths.\n */\n public abstract getProcessedSearchResultsNodes(): Promise<TProcessedSearchResultsNodes>;\n /** Creates search results nodes */\n public abstract createSearchResultsTreeNode(props: {\n type: TSearchResultsTreeNode[\"type\"];\n id: Id64String;\n isSearchTarget: boolean;\n parent: TSearchResultsTreeNode | SearchResultsTreeRootNode<TSearchResultsTreeNode>;\n }): TSearchResultsTreeNode;\n\n public async processSearchResultsNodes(): Promise<{\n getNodeSearchTargets: (node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey }) => TSearchTargets | undefined;\n }> {\n const processedSearchResultsNodes = await this.getProcessedSearchResultsNodes();\n return {\n getNodeSearchTargets: (node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey }) =>\n this.getNodeSearchTargets(node, processedSearchResultsNodes),\n };\n }\n\n /** Takes a new node and adds it to the tree structure. */\n public async accept(props: {\n instanceKey: InstanceKey;\n parentNode: TSearchResultsTreeNode | SearchResultsTreeRootNode<TSearchResultsTreeNode>;\n isSearchTarget: boolean;\n }): Promise<TSearchResultsTreeNode> {\n const { instanceKey, parentNode, isSearchTarget } = props;\n const type = await this.getType(instanceKey.className);\n\n const newNode = this.createSearchResultsTreeNode({\n type,\n id: instanceKey.id,\n isSearchTarget,\n parent: parentNode,\n });\n (parentNode.children ??= new Map()).set(instanceKey.id, newNode);\n this.searchResultsNodesArr.push(newNode);\n return newNode;\n }\n\n /** Takes a specific node and gets all search targets related to it. */\n private getNodeSearchTargets(\n node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey },\n processedSearchResultsNodes: TProcessedSearchResultsNodes,\n ): TSearchTargets | undefined {\n let lookupParents: Array<SearchResultsTreeRootNode<TSearchResultsTreeNode> | TSearchResultsTreeNode> = [this.root];\n\n // find the search results parent nodes of the `node`\n for (const parentKey of node.parentKeys) {\n if (!HierarchyNodeKey.isInstances(parentKey)) {\n continue;\n }\n\n // tree node might be merged from multiple instances. As search results tree stores only one instance per node, we need to find all matching nodes\n // and use them when checking for matching node in one level deeper.\n const parentNodes = this.findMatchingSearchResultsNodes(\n lookupParents,\n parentKey.instanceKeys.map((key) => key.id),\n );\n if (parentNodes.length === 0) {\n return undefined;\n }\n lookupParents = parentNodes;\n }\n\n const ids = HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map(({ id }) => id) : node.groupedInstanceKeys.map(({ id }) => id);\n // find search results nodes that match the `node`\n const searchResultsNodes = this.findMatchingSearchResultsNodes(lookupParents, ids);\n if (searchResultsNodes.length === 0) {\n return undefined;\n }\n\n return this.convertNodesToSearchTargets(searchResultsNodes, processedSearchResultsNodes);\n }\n\n /** Finds search results nodes that match the given keys. */\n private findMatchingSearchResultsNodes(lookupParents: Array<SearchResultsTreeRootNode<TSearchResultsTreeNode> | TSearchResultsTreeNode>, ids: Id64Arg) {\n return lookupParents.flatMap((lookup) => {\n const childrenArray = Array<TSearchResultsTreeNode>();\n for (const id of Id64.iterable(ids)) {\n const node = lookup.children?.get(id);\n if (node) {\n childrenArray.push(node);\n }\n }\n return childrenArray;\n });\n }\n}\n\n/** @internal */\nexport interface SearchResultsTree<TSearchTargets> {\n getSearchTargets: (node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey }) => TSearchTargets | undefined;\n}\n\n/** @internal */\nexport interface CreateSearchResultsTreeProps<\n TProcessedSearchResultsNodes,\n TSearchTargets,\n TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>,\n> {\n searchResultsNodesHandler: SearchResultsNodesHandler<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode>;\n searchPaths: HierarchySearchPath[];\n}\n\n/**\n * Function iterates over search paths and uses `searchResultsNodesHandler` to create a search results tree.\n * @internal\n */\nexport async function createSearchResultsTree<\n TProcessedSearchResultsNodes,\n TSearchTargets,\n TSearchResultsTreeNode extends BaseSearchResultsTreeNode<TSearchResultsTreeNode>,\n>(props: CreateSearchResultsTreeProps<TProcessedSearchResultsNodes, TSearchTargets, TSearchResultsTreeNode>): Promise<SearchResultsTree<TSearchTargets>> {\n const { searchPaths, searchResultsNodesHandler } = props;\n\n for (const searchPath of searchPaths) {\n const normalizedPath = HierarchySearchPath.normalize(searchPath).path;\n\n let parentNode: SearchResultsTreeRootNode<TSearchResultsTreeNode> | TSearchResultsTreeNode = searchResultsNodesHandler.root;\n for (let i = 0; i < normalizedPath.length; ++i) {\n if (\"type\" in parentNode && \"isSearchTarget\" in parentNode && parentNode.isSearchTarget) {\n break;\n }\n\n const identifier = normalizedPath[i];\n\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {\n break;\n }\n\n const currentNode: TSearchResultsTreeNode | undefined = parentNode.children?.get(identifier.id);\n if (currentNode !== undefined) {\n parentNode = currentNode;\n continue;\n }\n parentNode = await searchResultsNodesHandler.accept({\n instanceKey: identifier,\n parentNode,\n isSearchTarget: i === normalizedPath.length - 1,\n });\n }\n }\n const processedSearchResultsNodes = await searchResultsNodesHandler.processSearchResultsNodes();\n return {\n getSearchTargets: (node: HierarchyNode & { key: ClassGroupingNodeKey | InstancesNodeKey }) => processedSearchResultsNodes.getNodeSearchTargets(node),\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Observable } from "rxjs";
|
|
2
|
-
import type { Id64Arg, Id64Set, Id64String } from "@itwin/core-bentley";
|
|
2
|
+
import type { Id64Arg, Id64Array, Id64Set, Id64String } from "@itwin/core-bentley";
|
|
3
3
|
import type { HierarchyNode } from "@itwin/presentation-hierarchies";
|
|
4
4
|
import type { TreeWidgetViewport } from "../../TreeWidgetViewport.js";
|
|
5
5
|
import type { HierarchyVisibilityHandlerOverridableMethod, HierarchyVisibilityOverrideHandler, VisibilityStatus } from "../../UseHierarchyVisibility.js";
|
|
@@ -46,11 +46,8 @@ export interface BaseIdsCache {
|
|
|
46
46
|
categoryId: Id64String;
|
|
47
47
|
}) => Observable<number>;
|
|
48
48
|
getSubCategories: (props: {
|
|
49
|
-
|
|
50
|
-
}) => Observable<
|
|
51
|
-
id: Id64String;
|
|
52
|
-
subCategories: Id64Arg | undefined;
|
|
53
|
-
}>;
|
|
49
|
+
categoryId: Id64String;
|
|
50
|
+
}) => Observable<Id64Array>;
|
|
54
51
|
getModels: (props: {
|
|
55
52
|
categoryIds: Id64Arg;
|
|
56
53
|
}) => Observable<{
|
|
@@ -83,11 +80,11 @@ export interface BaseIdsCache {
|
|
|
83
80
|
* Interface for a tree visibility handler that provides methods to get and change visibility status of hierarchy nodes.
|
|
84
81
|
* @internal
|
|
85
82
|
*/
|
|
86
|
-
export interface TreeSpecificVisibilityHandler<
|
|
83
|
+
export interface TreeSpecificVisibilityHandler<TSearchTargets> {
|
|
87
84
|
getVisibilityStatus: (node: HierarchyNode) => Observable<VisibilityStatus>;
|
|
88
85
|
changeVisibilityStatus: (node: HierarchyNode, on: boolean) => Observable<void>;
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
getSearchTargetsVisibilityStatus: (targets: TSearchTargets) => Observable<VisibilityStatus>;
|
|
87
|
+
changeSearchTargetsVisibilityStatus: (targets: TSearchTargets, on: boolean) => Observable<void>;
|
|
91
88
|
}
|
|
92
89
|
/** @internal */
|
|
93
90
|
export interface BaseVisibilityHelperProps {
|
|
@@ -151,7 +148,6 @@ export declare class BaseVisibilityHelper implements Disposable {
|
|
|
151
148
|
getSubCategoriesVisibilityStatus(props: {
|
|
152
149
|
subCategoryIds: Id64Arg;
|
|
153
150
|
categoryId: Id64String;
|
|
154
|
-
modelId?: Id64String;
|
|
155
151
|
}): Observable<VisibilityStatus>;
|
|
156
152
|
/**
|
|
157
153
|
* Gets visibility status of categories.
|
|
@@ -2,10 +2,10 @@
|
|
|
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 { concat, concatAll, defaultIfEmpty, defer, EMPTY, filter, forkJoin, from, identity, map, merge, mergeMap, of, reduce, shareReplay, startWith, Subject, take, takeLast, takeUntil, tap, } from "rxjs";
|
|
5
|
+
import { concat, concatAll, defaultIfEmpty, defer, EMPTY, filter, forkJoin, from, identity, map, merge, mergeAll, mergeMap, of, reduce, shareReplay, startWith, Subject, take, takeLast, takeUntil, tap, } from "rxjs";
|
|
6
6
|
import { assert, Id64 } from "@itwin/core-bentley";
|
|
7
7
|
import { createVisibilityStatus } from "../Tooltip.js";
|
|
8
|
-
import { getSetFromId64Arg, releaseMainThreadOnItemsCount, setDifference, setIntersection } from "../Utils.js";
|
|
8
|
+
import { fromWithRelease, getSetFromId64Arg, releaseMainThreadOnItemsCount, setDifference, setIntersection } from "../Utils.js";
|
|
9
9
|
import { changeElementStateNoChildrenOperator, enableCategoryDisplay, getVisibilityFromAlwaysAndNeverDrawnElementsImpl, mergeVisibilityStatuses, } from "../VisibilityUtils.js";
|
|
10
10
|
/**
|
|
11
11
|
* Base class for visibility status getters and modifiers.
|
|
@@ -132,7 +132,7 @@ export class BaseVisibilityHelper {
|
|
|
132
132
|
* - Sub-categories visibility in the viewport.
|
|
133
133
|
*/
|
|
134
134
|
getSubCategoriesVisibilityStatus(props) {
|
|
135
|
-
return
|
|
135
|
+
return this.#props.baseIdsCache.getModels({ categoryIds: props.categoryId }).pipe(map(({ models }) => {
|
|
136
136
|
let visibility = "unknown";
|
|
137
137
|
let nonDefaultModelDisplayStatesCount = 0;
|
|
138
138
|
for (const modelId of Id64.iterable(models ?? [])) {
|
|
@@ -197,9 +197,10 @@ export class BaseVisibilityHelper {
|
|
|
197
197
|
if (!isSupportedInView) {
|
|
198
198
|
return of(createVisibilityStatus("disabled"));
|
|
199
199
|
}
|
|
200
|
-
|
|
200
|
+
const categoryModelsObs = modelIdFromProps
|
|
201
201
|
? from(Id64.iterable(categoryIds)).pipe(map((categoryId) => ({ id: categoryId, models: modelIdFromProps })))
|
|
202
|
-
: this.#props.baseIdsCache.getModels({ categoryIds })
|
|
202
|
+
: this.#props.baseIdsCache.getModels({ categoryIds });
|
|
203
|
+
return (Id64.sizeOf(categoryIds) > 100 ? categoryModelsObs.pipe(releaseMainThreadOnItemsCount(100)) : categoryModelsObs).pipe(mergeMap(({ id, models }) => {
|
|
203
204
|
if (!this.#props.viewport.isAlwaysDrawnExclusive) {
|
|
204
205
|
return of({ id, models });
|
|
205
206
|
}
|
|
@@ -253,12 +254,14 @@ export class BaseVisibilityHelper {
|
|
|
253
254
|
})))
|
|
254
255
|
: EMPTY,
|
|
255
256
|
// We need to check subCategories as well
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
257
|
+
!modelIdFromProps
|
|
258
|
+
? this.#props.baseIdsCache.getSubCategories({ categoryId }).pipe(mergeMap((subCategoryIds) => {
|
|
259
|
+
if (subCategoryIds.length > 0) {
|
|
260
|
+
return this.getSubCategoriesVisibilityStatus({ categoryId, subCategoryIds });
|
|
261
|
+
}
|
|
262
|
+
return EMPTY;
|
|
263
|
+
}))
|
|
264
|
+
: EMPTY).pipe(defaultIfEmpty(createVisibilityStatus(!this.#props.viewport.isAlwaysDrawnExclusive && this.#props.viewport.viewsCategory(categoryId) ? "visible" : "hidden")));
|
|
262
265
|
}), mergeVisibilityStatuses);
|
|
263
266
|
});
|
|
264
267
|
return this.#props.overrideHandler
|
|
@@ -311,7 +314,7 @@ export class BaseVisibilityHelper {
|
|
|
311
314
|
}
|
|
312
315
|
// TODO: check child elements that are subModels
|
|
313
316
|
if (!this.#props.viewport.viewsModel(modelId)) {
|
|
314
|
-
return
|
|
317
|
+
return fromWithRelease({ source: elementIds, releaseOnCount: 100 }).pipe(mergeMap((elementId) => this.#props.baseIdsCache.hasSubModel(elementId).pipe(mergeMap((isSubModel) => {
|
|
315
318
|
if (isSubModel) {
|
|
316
319
|
return this.getModelsVisibilityStatus({
|
|
317
320
|
modelIds: elementId,
|
|
@@ -370,7 +373,7 @@ export class BaseVisibilityHelper {
|
|
|
370
373
|
}));
|
|
371
374
|
}
|
|
372
375
|
const { modelId, categoryIds } = props.queryProps;
|
|
373
|
-
return
|
|
376
|
+
return fromWithRelease({ source: categoryIds, releaseOnCount: 100 }).pipe(mergeMap((categoryId) => {
|
|
374
377
|
return forkJoin({
|
|
375
378
|
categoryId: of(categoryId),
|
|
376
379
|
totalCount: this.#props.baseIdsCache.getElementsCount({ modelId, categoryId }),
|
|
@@ -502,7 +505,16 @@ export class BaseVisibilityHelper {
|
|
|
502
505
|
categoryIds,
|
|
503
506
|
override: on ? "show" : "hide",
|
|
504
507
|
}))
|
|
505
|
-
:
|
|
508
|
+
: merge(
|
|
509
|
+
// In case of turning categories on, need to change sub-categories separately as enableCategoryDisplay
|
|
510
|
+
// takes a long time to get sub-categories for each category
|
|
511
|
+
on
|
|
512
|
+
? fromWithRelease({ source: categoryIds, releaseOnCount: 200 }).pipe(mergeMap((categoryId) => this.#props.baseIdsCache.getSubCategories({ categoryId })), mergeAll(), releaseMainThreadOnItemsCount(200), map((subCategoryId) => {
|
|
513
|
+
if (!this.#props.viewport.viewsSubCategory(subCategoryId)) {
|
|
514
|
+
this.#props.viewport.changeSubCategoryDisplay({ subCategoryId, display: true });
|
|
515
|
+
}
|
|
516
|
+
}))
|
|
517
|
+
: EMPTY, from(enableCategoryDisplay(viewport, categoryIds, on, false)), modelIdsObservable.pipe(map(([modelId, modelCategories]) => {
|
|
506
518
|
viewport.setPerModelCategoryOverride({ modelIds: modelId, categoryIds: modelCategories, override: "none" });
|
|
507
519
|
}))),
|
|
508
520
|
// If categories visibility needs to be turned on, we need to turn on models without turning on unrelated elements or categories for that model
|
|
@@ -558,7 +570,7 @@ export class BaseVisibilityHelper {
|
|
|
558
570
|
return this.queueElementsVisibilityChange(elementIds, on, isDisplayedByDefault);
|
|
559
571
|
}),
|
|
560
572
|
// Change visibility of elements that are models
|
|
561
|
-
|
|
573
|
+
fromWithRelease({ source: elementIds, releaseOnCount: 100 }).pipe(mergeMap((elementId) => this.#props.baseIdsCache.hasSubModel(elementId).pipe(mergeMap((isSubModel) => {
|
|
562
574
|
if (isSubModel) {
|
|
563
575
|
return this.changeModelsVisibilityStatus({ modelIds: elementId, on });
|
|
564
576
|
}
|