@itwin/tree-widget-react 3.17.0 → 3.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -2
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +3 -2
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +3 -3
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +22 -21
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +57 -107
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +22 -12
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/common/internal/Utils.d.ts +25 -0
- package/lib/cjs/tree-widget-react/components/trees/common/internal/Utils.js +83 -0
- package/lib/cjs/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +1 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +78 -23
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.d.ts +5 -3
- package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js +5 -14
- package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +5 -4
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +52 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +15 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +134 -3
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +247 -123
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/cjs/tree-widget-react-internal.d.ts +1 -1
- package/lib/cjs/tree-widget-react-internal.js +1 -1
- package/lib/cjs/tree-widget-react-internal.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +3 -2
- 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/internal/CategoriesTreeIdsCache.d.ts +3 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +23 -22
- 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/CategoriesVisibilityHandler.js +59 -109
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +23 -13
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +25 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +74 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +74 -19
- 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/Utils.d.ts +5 -3
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +4 -13
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +4 -3
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +52 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +15 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +133 -2
- 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/ModelsTreeVisibilityHandler.js +230 -106
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react-internal.d.ts +1 -1
- package/lib/esm/tree-widget-react-internal.js +1 -1
- package/lib/esm/tree-widget-react-internal.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,11 +2,13 @@
|
|
|
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 { firstValueFrom } from "rxjs";
|
|
6
|
-
import {
|
|
5
|
+
import { EMPTY, filter, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from "rxjs";
|
|
6
|
+
import { BeEvent, Id64 } from "@itwin/core-bentley";
|
|
7
7
|
import { PerModelCategoryVisibility } from "@itwin/core-frontend";
|
|
8
8
|
import { HierarchyNode } from "@itwin/presentation-hierarchies";
|
|
9
9
|
import { enableCategoryDisplay, enableSubCategoryDisplay } from "../../common/CategoriesVisibilityUtils.js";
|
|
10
|
+
import { mergeVisibilities, releaseMainThreadOnItemsCount } from "../../common/internal/Utils.js";
|
|
11
|
+
import { toVoidPromise } from "../../common/Rxjs.js";
|
|
10
12
|
import { createVisibilityStatus } from "../../common/Tooltip.js";
|
|
11
13
|
import { CategoriesTreeNode } from "./CategoriesTreeNode.js";
|
|
12
14
|
/** @internal */
|
|
@@ -44,13 +46,13 @@ export class CategoriesVisibilityHandler {
|
|
|
44
46
|
if (!node.extendedData?.categoryId) {
|
|
45
47
|
return { state: "hidden", isDisabled: true };
|
|
46
48
|
}
|
|
47
|
-
return createVisibilityStatus(await this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId));
|
|
49
|
+
return createVisibilityStatus(await firstValueFrom(this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId)));
|
|
48
50
|
}
|
|
49
51
|
if (CategoriesTreeNode.isCategoryNode(node)) {
|
|
50
|
-
return createVisibilityStatus(await this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node)));
|
|
52
|
+
return createVisibilityStatus(await firstValueFrom(this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node))));
|
|
51
53
|
}
|
|
52
54
|
if (CategoriesTreeNode.isDefinitionContainerNode(node)) {
|
|
53
|
-
return createVisibilityStatus(await this.getDefinitionContainerVisibility(node));
|
|
55
|
+
return createVisibilityStatus(await firstValueFrom(this.getDefinitionContainerVisibility(node)));
|
|
54
56
|
}
|
|
55
57
|
return { state: "hidden", isDisabled: true };
|
|
56
58
|
}
|
|
@@ -59,133 +61,79 @@ export class CategoriesVisibilityHandler {
|
|
|
59
61
|
return;
|
|
60
62
|
}
|
|
61
63
|
if (CategoriesTreeNode.isCategoryNode(node)) {
|
|
62
|
-
return this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on);
|
|
64
|
+
return toVoidPromise(this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on));
|
|
63
65
|
}
|
|
64
66
|
if (CategoriesTreeNode.isSubCategoryNode(node)) {
|
|
65
|
-
return this.changeSubCategoryVisibility(node, on);
|
|
67
|
+
return toVoidPromise(this.changeSubCategoryVisibility(node, on));
|
|
66
68
|
}
|
|
67
69
|
if (CategoriesTreeNode.isDefinitionContainerNode(node)) {
|
|
68
|
-
return this.changeDefinitionContainerVisibility(node, on);
|
|
70
|
+
return toVoidPromise(this.changeDefinitionContainerVisibility(node, on));
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
for (const modelId of categoryModels) {
|
|
76
|
-
if (!this.#viewport.view.viewsModel(modelId)) {
|
|
77
|
-
if (visibility === "visible") {
|
|
78
|
-
return "partial";
|
|
79
|
-
}
|
|
80
|
-
visibility = "hidden";
|
|
81
|
-
++nonDefaultModelDisplayStatesCount;
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);
|
|
85
|
-
if (override === PerModelCategoryVisibility.Override.Show) {
|
|
86
|
-
if (visibility === "hidden") {
|
|
87
|
-
return "partial";
|
|
88
|
-
}
|
|
89
|
-
visibility = "visible";
|
|
90
|
-
++nonDefaultModelDisplayStatesCount;
|
|
91
|
-
continue;
|
|
73
|
+
getSubCategoriesVisibility(subCategoryIds, parentCategoryId) {
|
|
74
|
+
return this.#idsCache.getCategoriesElementModels(parentCategoryId).pipe(mergeMap((modelMap) => {
|
|
75
|
+
if (modelMap.size === 0) {
|
|
76
|
+
return of({ visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? "visible" : "hidden", isDefault: true });
|
|
92
77
|
}
|
|
93
|
-
|
|
94
|
-
if (
|
|
95
|
-
return "
|
|
78
|
+
return from(modelMap.keys()).pipe(map((modelId) => {
|
|
79
|
+
if (!this.#viewport.view.viewsModel(modelId)) {
|
|
80
|
+
return { visibility: "hidden", isDefault: false };
|
|
96
81
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
82
|
+
const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);
|
|
83
|
+
return override === PerModelCategoryVisibility.Override.Show
|
|
84
|
+
? { visibility: "visible", isDefault: false }
|
|
85
|
+
: override === PerModelCategoryVisibility.Override.Hide
|
|
86
|
+
? { visibility: "hidden", isDefault: false }
|
|
87
|
+
: { visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? "visible" : "hidden", isDefault: true };
|
|
88
|
+
}));
|
|
89
|
+
}), mergeMap(({ visibility, isDefault }) => {
|
|
90
|
+
if (!isDefault || visibility === "hidden" || Id64.sizeOf(subCategoryIds) === 0) {
|
|
91
|
+
return of(visibility);
|
|
100
92
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
assert(visibility === "visible" || visibility === "hidden");
|
|
104
|
-
return visibility;
|
|
105
|
-
}
|
|
106
|
-
if (!this.#viewport.view.viewsCategory(parentCategoryId)) {
|
|
107
|
-
return visibility === "visible" ? "partial" : "hidden";
|
|
108
|
-
}
|
|
109
|
-
if (subCategoryIds.length === 0) {
|
|
110
|
-
if (visibility === "hidden") {
|
|
111
|
-
return "partial";
|
|
112
|
-
}
|
|
113
|
-
return "visible";
|
|
114
|
-
}
|
|
115
|
-
for (const subCategoryId of subCategoryIds) {
|
|
116
|
-
const isSubCategoryVisible = this.#viewport.isSubCategoryVisible(subCategoryId);
|
|
117
|
-
if (isSubCategoryVisible && visibility === "hidden") {
|
|
118
|
-
return "partial";
|
|
119
|
-
}
|
|
120
|
-
if (!isSubCategoryVisible && visibility === "visible") {
|
|
121
|
-
return "partial";
|
|
122
|
-
}
|
|
123
|
-
visibility = isSubCategoryVisible ? "visible" : "hidden";
|
|
124
|
-
}
|
|
125
|
-
assert(visibility === "visible" || visibility === "hidden");
|
|
126
|
-
return visibility;
|
|
93
|
+
return from(Id64.iterable(subCategoryIds)).pipe(releaseMainThreadOnItemsCount(200), map((subCategoryId) => (this.#viewport.isSubCategoryVisible(subCategoryId) ? "visible" : "hidden")));
|
|
94
|
+
}), mergeVisibilities, map((visibility) => (visibility === "empty" ? "hidden" : visibility)));
|
|
127
95
|
}
|
|
128
|
-
|
|
129
|
-
|
|
96
|
+
getDefinitionContainerVisibility(node) {
|
|
97
|
+
return this.#idsCache
|
|
98
|
+
.getAllContainedCategories({
|
|
130
99
|
definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),
|
|
131
100
|
includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,
|
|
132
|
-
})
|
|
133
|
-
|
|
101
|
+
})
|
|
102
|
+
.pipe(mergeMap((categoryIds) => this.getCategoriesVisibility(categoryIds)));
|
|
134
103
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return this.getSubCategoriesVisibility(subCategories, categoryId);
|
|
104
|
+
getCategoriesVisibility(categoryIds) {
|
|
105
|
+
return from(categoryIds).pipe(releaseMainThreadOnItemsCount(50), mergeMap((categoryId) => forkJoin({ subCategoryIds: this.#idsCache.getSubCategories(categoryId), categoryId: of(categoryId) })), mergeMap(({ subCategoryIds, categoryId }) => this.getSubCategoriesVisibility(subCategoryIds, categoryId)), mergeVisibilities, map((visibility) => {
|
|
106
|
+
return visibility === "empty" ? "hidden" : visibility;
|
|
139
107
|
}));
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (subCategoriesVisibility === "hidden" && visibility === "visible") {
|
|
146
|
-
return "partial";
|
|
147
|
-
}
|
|
148
|
-
if (subCategoriesVisibility === "visible" && visibility === "hidden") {
|
|
149
|
-
return "partial";
|
|
108
|
+
}
|
|
109
|
+
enableCategoriesElementModelsVisibility(categoryIds) {
|
|
110
|
+
return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(mergeMap((categoriesModelsMap) => categoriesModelsMap.keys()), filter((modelId) => !this.#viewport.view.viewsModel(modelId)), toArray(), mergeMap(async (hiddenModels) => {
|
|
111
|
+
if (hiddenModels.length > 0) {
|
|
112
|
+
await this.#viewport.addViewedModels(hiddenModels);
|
|
150
113
|
}
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
assert(visibility !== "unknown");
|
|
154
|
-
return visibility;
|
|
155
|
-
}
|
|
156
|
-
async enableCategoriesElementModelsVisibility(categoryIds) {
|
|
157
|
-
const categoriesModelsMap = await firstValueFrom(this.#idsCache.getCategoriesElementModels(categoryIds));
|
|
158
|
-
const modelIds = [...categoriesModelsMap.values()].flat();
|
|
159
|
-
const hiddenModels = modelIds.filter((modelId) => !this.#viewport.view.viewsModel(modelId));
|
|
160
|
-
if (hiddenModels.length > 0) {
|
|
161
|
-
this.#viewport.changeModelDisplay(hiddenModels, true);
|
|
162
|
-
}
|
|
114
|
+
}));
|
|
163
115
|
}
|
|
164
|
-
|
|
116
|
+
changeSubCategoryVisibility(node, on) {
|
|
165
117
|
const parentCategoryId = node.extendedData?.categoryId;
|
|
118
|
+
return merge(
|
|
166
119
|
// make sure parent category and models are enabled
|
|
167
|
-
|
|
168
|
-
await Promise.all([this.enableCategoriesElementModelsVisibility([parentCategoryId]), this.changeCategoryState([parentCategoryId], true, false)]);
|
|
169
|
-
}
|
|
170
|
-
const subCategoryIds = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);
|
|
171
|
-
subCategoryIds.forEach((id) => {
|
|
120
|
+
on && parentCategoryId ? this.enableCategoriesElementModelsVisibility([parentCategoryId]) : EMPTY, on && parentCategoryId ? this.changeCategoryState([parentCategoryId], true, false) : EMPTY, of((() => CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node).forEach((id) => {
|
|
172
121
|
this.changeSubCategoryState(id, on);
|
|
173
|
-
});
|
|
122
|
+
}))()));
|
|
174
123
|
}
|
|
175
|
-
|
|
124
|
+
changeCategoryVisibility(categoryIds, on) {
|
|
125
|
+
return merge(
|
|
176
126
|
// make sure models are enabled
|
|
177
|
-
|
|
178
|
-
await this.enableCategoriesElementModelsVisibility(categoryIds);
|
|
179
|
-
}
|
|
180
|
-
return this.changeCategoryState(categoryIds, on, on);
|
|
127
|
+
on ? this.enableCategoriesElementModelsVisibility(categoryIds) : EMPTY, from(categoryIds).pipe(mergeMap((categoryId) => this.#idsCache.getSubCategories(categoryId)), mergeMap((subCategorySet) => subCategorySet), toArray(), mergeMap((subCategories) => subCategories.length > 0 ? this.changeCategoryState(categoryIds, on, false, subCategories) : this.changeCategoryState(categoryIds, on, on))));
|
|
181
128
|
}
|
|
182
|
-
|
|
129
|
+
changeDefinitionContainerVisibility(node, on) {
|
|
183
130
|
const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);
|
|
184
|
-
|
|
131
|
+
return this.#idsCache
|
|
132
|
+
.getAllContainedCategories({
|
|
185
133
|
definitionContainerIds: definitionContainerId,
|
|
186
134
|
includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,
|
|
187
|
-
})
|
|
188
|
-
|
|
135
|
+
})
|
|
136
|
+
.pipe(mergeMap((childCategories) => this.changeCategoryVisibility([...childCategories], on)));
|
|
189
137
|
}
|
|
190
138
|
onDisplayStyleChanged = () => {
|
|
191
139
|
this.onVisibilityChangeInternal();
|
|
@@ -211,8 +159,10 @@ export class CategoriesVisibilityHandler {
|
|
|
211
159
|
static getInstanceIdsFromHierarchyNode(node) {
|
|
212
160
|
return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];
|
|
213
161
|
}
|
|
214
|
-
|
|
215
|
-
|
|
162
|
+
changeCategoryState(ids, enabled, enableAllSubCategories, subCategories) {
|
|
163
|
+
return merge(from(enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories)), enabled && subCategories
|
|
164
|
+
? from(Id64.iterable(subCategories)).pipe(releaseMainThreadOnItemsCount(100), map((subCategoryId) => this.changeSubCategoryState(subCategoryId, true)))
|
|
165
|
+
: EMPTY);
|
|
216
166
|
}
|
|
217
167
|
changeSubCategoryState(key, enabled) {
|
|
218
168
|
enableSubCategoryDisplay(this.#viewport, key, enabled);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.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, BeEvent } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategoryDisplay, enableSubCategoryDisplay } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\n\nimport type { Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\n\n/** @internal */\nexport interface CategoriesVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class CategoriesVisibilityHandler implements HierarchyVisibilityHandler {\n #pendingVisibilityChange: any;\n #viewport: Viewport;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n\n constructor(props: CategoriesVisibilityHandlerProps) {\n this.#idsCache = props.idsCache;\n this.#viewport = props.viewport;\n this.#viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.addListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.addListener(this.onViewedModelsChanged);\n this.#hierarchyConfig = props.hierarchyConfig;\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this.#viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.removeListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.removeListener(this.onViewedModelsChanged);\n clearTimeout(this.#pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent();\n\n /** Returns visibility status of the tree node. */\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (!node.extendedData?.categoryId) {\n return { state: \"hidden\", isDisabled: true };\n }\n return createVisibilityStatus(\n await this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId),\n );\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return createVisibilityStatus(await this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node)));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return createVisibilityStatus(await this.getDefinitionContainerVisibility(node));\n }\n\n return { state: \"hidden\", isDisabled: true };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on);\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return this.changeSubCategoryVisibility(node, on);\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return this.changeDefinitionContainerVisibility(node, on);\n }\n }\n\n private async getSubCategoriesVisibility(subCategoryIds: Id64Array, parentCategoryId: Id64String): Promise<Visibility> {\n let visibility: \"visible\" | \"hidden\" | \"unknown\" = \"unknown\";\n const categoryModels = [...(await firstValueFrom(this.#idsCache.getCategoriesElementModels([parentCategoryId]))).values()].flat();\n let nonDefaultModelDisplayStatesCount = 0;\n for (const modelId of categoryModels) {\n if (!this.#viewport.view.viewsModel(modelId)) {\n if (visibility === \"visible\") {\n return \"partial\";\n }\n visibility = \"hidden\";\n ++nonDefaultModelDisplayStatesCount;\n continue;\n }\n const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);\n if (override === PerModelCategoryVisibility.Override.Show) {\n if (visibility === \"hidden\") {\n return \"partial\";\n }\n visibility = \"visible\";\n ++nonDefaultModelDisplayStatesCount;\n continue;\n }\n if (override === PerModelCategoryVisibility.Override.Hide) {\n if (visibility === \"visible\") {\n return \"partial\";\n }\n visibility = \"hidden\";\n ++nonDefaultModelDisplayStatesCount;\n continue;\n }\n }\n if (categoryModels.length > 0 && nonDefaultModelDisplayStatesCount === categoryModels.length) {\n assert(visibility === \"visible\" || visibility === \"hidden\");\n return visibility;\n }\n\n if (!this.#viewport.view.viewsCategory(parentCategoryId)) {\n return visibility === \"visible\" ? \"partial\" : \"hidden\";\n }\n\n if (subCategoryIds.length === 0) {\n if (visibility === \"hidden\") {\n return \"partial\";\n }\n return \"visible\";\n }\n\n for (const subCategoryId of subCategoryIds) {\n const isSubCategoryVisible = this.#viewport.isSubCategoryVisible(subCategoryId);\n if (isSubCategoryVisible && visibility === \"hidden\") {\n return \"partial\";\n }\n if (!isSubCategoryVisible && visibility === \"visible\") {\n return \"partial\";\n }\n visibility = isSubCategoryVisible ? \"visible\" : \"hidden\";\n }\n assert(visibility === \"visible\" || visibility === \"hidden\");\n return visibility;\n }\n\n private async getDefinitionContainerVisibility(node: HierarchyNode): Promise<Visibility> {\n const categoryIds = await firstValueFrom(\n this.#idsCache.getAllContainedCategories({\n definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n }),\n );\n return this.getCategoriesVisibility([...categoryIds]);\n }\n\n private async getCategoriesVisibility(categoryIds: Id64Array): Promise<Visibility> {\n const subCategoriesVisibilities = await Promise.all(\n categoryIds.map(async (categoryId) => {\n const subCategories = await firstValueFrom(this.#idsCache.getSubCategories(categoryId));\n return this.getSubCategoriesVisibility(subCategories, categoryId);\n }),\n );\n let visibility: \"visible\" | \"hidden\" | \"unknown\" = \"unknown\";\n\n for (const subCategoriesVisibility of subCategoriesVisibilities) {\n if (subCategoriesVisibility === \"partial\") {\n return \"partial\";\n }\n if (subCategoriesVisibility === \"hidden\" && visibility === \"visible\") {\n return \"partial\";\n }\n if (subCategoriesVisibility === \"visible\" && visibility === \"hidden\") {\n return \"partial\";\n }\n visibility = subCategoriesVisibility;\n }\n assert(visibility !== \"unknown\");\n return visibility;\n }\n\n private async enableCategoriesElementModelsVisibility(categoryIds: Id64Array) {\n const categoriesModelsMap = await firstValueFrom(this.#idsCache.getCategoriesElementModels(categoryIds));\n const modelIds = [...categoriesModelsMap.values()].flat();\n const hiddenModels = modelIds.filter((modelId) => !this.#viewport.view.viewsModel(modelId));\n if (hiddenModels.length > 0) {\n this.#viewport.changeModelDisplay(hiddenModels, true);\n }\n }\n\n private async changeSubCategoryVisibility(node: HierarchyNode, on: boolean) {\n const parentCategoryId = node.extendedData?.categoryId;\n\n // make sure parent category and models are enabled\n if (on && parentCategoryId) {\n await Promise.all([this.enableCategoriesElementModelsVisibility([parentCategoryId]), this.changeCategoryState([parentCategoryId], true, false)]);\n }\n\n const subCategoryIds = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n subCategoryIds.forEach((id) => {\n this.changeSubCategoryState(id, on);\n });\n }\n private async changeCategoryVisibility(categoryIds: Id64Array, on: boolean) {\n // make sure models are enabled\n if (on) {\n await this.enableCategoriesElementModelsVisibility(categoryIds);\n }\n return this.changeCategoryState(categoryIds, on, on);\n }\n\n private async changeDefinitionContainerVisibility(node: HierarchyNode, on: boolean) {\n const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n const childCategories = await firstValueFrom(\n this.#idsCache.getAllContainedCategories({\n definitionContainerIds: definitionContainerId,\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n }),\n );\n return this.changeCategoryVisibility([...childCategories], on);\n }\n\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesPerModelChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedModelsChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this.#pendingVisibilityChange) {\n return;\n }\n\n this.#pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this.#pendingVisibilityChange = undefined;\n }, 0);\n }\n\n private static getInstanceIdsFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];\n }\n\n private async changeCategoryState(ids: string[], enabled: boolean, enableAllSubCategories: boolean) {\n await enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories);\n }\n\n private changeSubCategoryState(key: string, enabled: boolean) {\n enableSubCategoryDisplay(this.#viewport, key, enabled);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.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 { EMPTY, filter, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from \"rxjs\";\nimport { BeEvent, Id64 } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategoryDisplay, enableSubCategoryDisplay } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { mergeVisibilities, releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\n\n/** @internal */\nexport interface CategoriesVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class CategoriesVisibilityHandler implements HierarchyVisibilityHandler {\n #pendingVisibilityChange: any;\n #viewport: Viewport;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n\n constructor(props: CategoriesVisibilityHandlerProps) {\n this.#idsCache = props.idsCache;\n this.#viewport = props.viewport;\n this.#viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.addListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.addListener(this.onViewedModelsChanged);\n this.#hierarchyConfig = props.hierarchyConfig;\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this.#viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.removeListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.removeListener(this.onViewedModelsChanged);\n clearTimeout(this.#pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent();\n\n /** Returns visibility status of the tree node. */\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (!node.extendedData?.categoryId) {\n return { state: \"hidden\", isDisabled: true };\n }\n return createVisibilityStatus(\n await firstValueFrom(this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId)),\n );\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node))));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getDefinitionContainerVisibility(node)));\n }\n\n return { state: \"hidden\", isDisabled: true };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return toVoidPromise(this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on));\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return toVoidPromise(this.changeSubCategoryVisibility(node, on));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return toVoidPromise(this.changeDefinitionContainerVisibility(node, on));\n }\n }\n\n private getSubCategoriesVisibility(subCategoryIds: Id64Arg, parentCategoryId: Id64String): Observable<Visibility> {\n return this.#idsCache.getCategoriesElementModels(parentCategoryId).pipe(\n mergeMap((modelMap): Observable<{ visibility: \"visible\" | \"hidden\"; isDefault: boolean }> => {\n if (modelMap.size === 0) {\n return of({ visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true });\n }\n return from(modelMap.keys()).pipe(\n map((modelId) => {\n if (!this.#viewport.view.viewsModel(modelId)) {\n return { visibility: \"hidden\", isDefault: false };\n }\n const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);\n return override === PerModelCategoryVisibility.Override.Show\n ? { visibility: \"visible\", isDefault: false }\n : override === PerModelCategoryVisibility.Override.Hide\n ? { visibility: \"hidden\", isDefault: false }\n : { visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true };\n }),\n );\n }),\n mergeMap(({ visibility, isDefault }) => {\n if (!isDefault || visibility === \"hidden\" || Id64.sizeOf(subCategoryIds) === 0) {\n return of(visibility);\n }\n return from(Id64.iterable(subCategoryIds)).pipe(\n releaseMainThreadOnItemsCount(200),\n map((subCategoryId) => (this.#viewport.isSubCategoryVisible(subCategoryId) ? \"visible\" : \"hidden\")),\n );\n }),\n mergeVisibilities,\n map((visibility) => (visibility === \"empty\" ? \"hidden\" : visibility)),\n );\n }\n\n private getDefinitionContainerVisibility(node: HierarchyNode): Observable<Visibility> {\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((categoryIds) => this.getCategoriesVisibility(categoryIds)));\n }\n\n private getCategoriesVisibility(categoryIds: Id64Arg): Observable<Visibility> {\n return from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap((categoryId) => forkJoin({ subCategoryIds: this.#idsCache.getSubCategories(categoryId), categoryId: of(categoryId) })),\n mergeMap(({ subCategoryIds, categoryId }) => this.getSubCategoriesVisibility(subCategoryIds, categoryId)),\n mergeVisibilities,\n map((visibility) => {\n return visibility === \"empty\" ? \"hidden\" : visibility;\n }),\n );\n }\n\n private enableCategoriesElementModelsVisibility(categoryIds: Id64Array) {\n return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(\n mergeMap((categoriesModelsMap) => categoriesModelsMap.keys()),\n filter((modelId) => !this.#viewport.view.viewsModel(modelId)),\n toArray(),\n mergeMap(async (hiddenModels) => {\n if (hiddenModels.length > 0) {\n await this.#viewport.addViewedModels(hiddenModels);\n }\n }),\n );\n }\n\n private changeSubCategoryVisibility(node: HierarchyNode, on: boolean) {\n const parentCategoryId = node.extendedData?.categoryId;\n return merge(\n // make sure parent category and models are enabled\n on && parentCategoryId ? this.enableCategoriesElementModelsVisibility([parentCategoryId]) : EMPTY,\n on && parentCategoryId ? this.changeCategoryState([parentCategoryId], true, false) : EMPTY,\n of(\n (() =>\n CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node).forEach((id) => {\n this.changeSubCategoryState(id, on);\n }))(),\n ),\n );\n }\n\n private changeCategoryVisibility(categoryIds: Id64Array, on: boolean) {\n return merge(\n // make sure models are enabled\n on ? this.enableCategoriesElementModelsVisibility(categoryIds) : EMPTY,\n from(categoryIds).pipe(\n mergeMap((categoryId) => this.#idsCache.getSubCategories(categoryId)),\n mergeMap((subCategorySet) => subCategorySet),\n toArray(),\n mergeMap((subCategories) =>\n subCategories.length > 0 ? this.changeCategoryState(categoryIds, on, false, subCategories) : this.changeCategoryState(categoryIds, on, on),\n ),\n ),\n );\n }\n\n private changeDefinitionContainerVisibility(node: HierarchyNode, on: boolean) {\n const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: definitionContainerId,\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((childCategories) => this.changeCategoryVisibility([...childCategories], on)));\n }\n\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesPerModelChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedModelsChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this.#pendingVisibilityChange) {\n return;\n }\n\n this.#pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this.#pendingVisibilityChange = undefined;\n }, 0);\n }\n\n private static getInstanceIdsFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];\n }\n\n private changeCategoryState(ids: Id64Array, enabled: boolean, enableAllSubCategories: boolean, subCategories?: Id64Arg) {\n return merge(\n from(enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories)),\n enabled && subCategories\n ? from(Id64.iterable(subCategories)).pipe(\n releaseMainThreadOnItemsCount(100),\n map((subCategoryId) => this.changeSubCategoryState(subCategoryId, true)),\n )\n : EMPTY,\n );\n }\n\n private changeSubCategoryState(key: string, enabled: boolean) {\n enableSubCategoryDisplay(this.#viewport, key, enabled);\n }\n}\n"]}
|
|
@@ -2,29 +2,39 @@
|
|
|
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 { bufferCount, from, mergeMap } from "rxjs";
|
|
6
|
+
import { Guid, Id64 } from "@itwin/core-bentley";
|
|
6
7
|
import { QueryRowFormat } from "@itwin/core-common";
|
|
7
8
|
import { PerModelCategoryVisibility } from "@itwin/core-frontend";
|
|
9
|
+
import { getOptimalBatchSize, releaseMainThreadOnItemsCount } from "./internal/Utils.js";
|
|
10
|
+
import { toVoidPromise } from "./Rxjs.js";
|
|
8
11
|
/**
|
|
9
12
|
* Changes category display in the viewport.
|
|
10
13
|
* @internal
|
|
11
14
|
*/
|
|
12
15
|
export async function enableCategoryDisplay(viewport, categoryIds, enabled, enableAllSubCategories = true) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const removeOverrides = (bufferedCategories) => {
|
|
17
|
+
const modelsContainingOverrides = [];
|
|
18
|
+
for (const ovr of viewport.perModelCategoryVisibility) {
|
|
19
|
+
if (Id64.has(bufferedCategories, ovr.categoryId)) {
|
|
20
|
+
modelsContainingOverrides.push(ovr.modelId);
|
|
21
|
+
}
|
|
19
22
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
(await viewport.iModel.categories.getCategoryInfo(
|
|
23
|
+
viewport.perModelCategoryVisibility.setOverride(modelsContainingOverrides, bufferedCategories, PerModelCategoryVisibility.Override.None);
|
|
24
|
+
};
|
|
25
|
+
const disableSubCategories = async (bufferedCategories) => {
|
|
26
|
+
// changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.
|
|
27
|
+
(await viewport.iModel.categories.getCategoryInfo(bufferedCategories)).forEach((categoryInfo) => {
|
|
25
28
|
categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));
|
|
26
29
|
});
|
|
27
|
-
}
|
|
30
|
+
};
|
|
31
|
+
return toVoidPromise(from(categoryIds).pipe(releaseMainThreadOnItemsCount(500), bufferCount(getOptimalBatchSize({ totalSize: categoryIds.length, maximumBatchSize: 500 })), mergeMap(async (bufferedCategories) => {
|
|
32
|
+
viewport.changeCategoryDisplay(bufferedCategories, enabled, enableAllSubCategories);
|
|
33
|
+
removeOverrides(bufferedCategories);
|
|
34
|
+
if (!enabled) {
|
|
35
|
+
await disableSubCategories(bufferedCategories);
|
|
36
|
+
}
|
|
37
|
+
})));
|
|
28
38
|
}
|
|
29
39
|
/**
|
|
30
40
|
* Changes subcategory display in the viewport
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesVisibilityUtils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.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 { Guid } from \"@itwin/core-bentley\";\nimport { QueryRowFormat } from \"@itwin/core-common\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\n\n/**\n * Data structure that describes category.\n * @beta\n */\nexport interface CategoryInfo {\n categoryId: string;\n subCategoryIds?: string[];\n}\n\n/**\n * Changes category display in the viewport.\n * @internal\n */\nexport async function enableCategoryDisplay(viewport: Viewport, categoryIds: Id64Array, enabled: boolean, enableAllSubCategories = true) {\n viewport.changeCategoryDisplay(categoryIds, enabled, enableAllSubCategories);\n\n // remove category overrides per model\n const modelsContainingOverrides: string[] = [];\n for (const ovr of viewport.perModelCategoryVisibility) {\n if (categoryIds.findIndex((id) => id === ovr.categoryId) !== -1) {\n modelsContainingOverrides.push(ovr.modelId);\n }\n }\n viewport.perModelCategoryVisibility.setOverride(modelsContainingOverrides, categoryIds, PerModelCategoryVisibility.Override.None);\n\n // changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.\n if (false === enabled) {\n (await viewport.iModel.categories.getCategoryInfo(categoryIds)).forEach((categoryInfo) => {\n categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));\n });\n }\n}\n\n/**\n * Changes subcategory display in the viewport\n * @internal\n */\nexport function enableSubCategoryDisplay(viewport: Viewport, key: string, enabled: boolean) {\n viewport.changeSubCategoryDisplay(key, enabled);\n}\n\n/** @internal */\nexport async function loadCategoriesFromViewport(vp: Viewport, componentId?: GuidString) {\n // Query categories and add them to state\n const selectUsedSpatialCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId from BisCore.SpatialCategory)\";\n const selectUsedDrawingCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement2d WHERE Model.Id=? AND Category.Id IN (SELECT ECInstanceId from BisCore.DrawingCategory)\";\n const ecsql = vp.view.is3d() ? selectUsedSpatialCategoryIds : selectUsedDrawingCategoryIds;\n const ecsql2 = `SELECT ECInstanceId as id FROM ${vp.view.is3d() ? \"BisCore.SpatialCategory\" : \"BisCore.DrawingCategory\"} WHERE ECInstanceId IN (${ecsql})`;\n\n const categories: CategoryInfo[] = [];\n\n const rows = await vp.iModel\n .createQueryReader(ecsql2, undefined, {\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n restartToken: `CategoriesVisibilityUtils/${componentId ?? Guid.createValue()}/categories`,\n })\n .toArray();\n (await vp.iModel.categories.getCategoryInfo(rows.map((row) => row.id))).forEach((val) => {\n categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });\n });\n return categories;\n}\n\n/**\n * Enable display of all given categories.\n * @public\n */\nexport async function showAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, true, true);\n}\n\n/**\n * Disable display of all given categories.\n * @public\n */\nexport async function hideAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, false, true);\n}\n\n/**\n * Invert display of all given categories.\n * Categories are inverted like this:\n * - If category is visible, it will be hidden.\n * - If category is hidden, it will be visible.\n * - If category is partially visible, it will be fully visible.\n * @public\n */\nexport async function invertAllCategories(categories: CategoryInfo[], viewport: Viewport) {\n const categoriesToEnable = new Set<Id64String>();\n const categoriesToDisable = new Set<Id64String>();\n\n for (const category of categories) {\n if (!viewport.view.viewsCategory(category.categoryId)) {\n categoriesToEnable.add(category.categoryId);\n continue;\n }\n // Check if category is in partial state\n if (category.subCategoryIds?.some((subCategory) => !viewport.isSubCategoryVisible(subCategory))) {\n categoriesToEnable.add(category.categoryId);\n } else {\n categoriesToDisable.add(category.categoryId);\n }\n }\n\n // collect per model overrides that need to be inverted\n for (const { categoryId, visible } of viewport.perModelCategoryVisibility) {\n if (!visible && categoriesToDisable.has(categoryId)) {\n categoriesToEnable.add(categoryId);\n categoriesToDisable.delete(categoryId);\n }\n }\n\n await enableCategoryDisplay(viewport, [...categoriesToDisable], false, true);\n\n await enableCategoryDisplay(viewport, [...categoriesToEnable], true, true);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CategoriesVisibilityUtils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.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 { bufferCount, from, mergeMap } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { QueryRowFormat } from \"@itwin/core-common\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { getOptimalBatchSize, releaseMainThreadOnItemsCount } from \"./internal/Utils.js\";\nimport { toVoidPromise } from \"./Rxjs.js\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\n\n/**\n * Data structure that describes category.\n * @beta\n */\nexport interface CategoryInfo {\n categoryId: string;\n subCategoryIds?: string[];\n}\n\n/**\n * Changes category display in the viewport.\n * @internal\n */\nexport async function enableCategoryDisplay(viewport: Viewport, categoryIds: Id64Array, enabled: boolean, enableAllSubCategories = true) {\n const removeOverrides = (bufferedCategories: Id64Array) => {\n const modelsContainingOverrides: string[] = [];\n for (const ovr of viewport.perModelCategoryVisibility) {\n if (Id64.has(bufferedCategories, ovr.categoryId)) {\n modelsContainingOverrides.push(ovr.modelId);\n }\n }\n viewport.perModelCategoryVisibility.setOverride(modelsContainingOverrides, bufferedCategories, PerModelCategoryVisibility.Override.None);\n };\n const disableSubCategories = async (bufferedCategories: Id64Array) => {\n // changeCategoryDisplay only enables subcategories, it does not disabled them. So we must do that ourselves.\n (await viewport.iModel.categories.getCategoryInfo(bufferedCategories)).forEach((categoryInfo) => {\n categoryInfo.subCategories.forEach((value) => enableSubCategoryDisplay(viewport, value.id, false));\n });\n };\n return toVoidPromise(\n from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(500),\n bufferCount(getOptimalBatchSize({ totalSize: categoryIds.length, maximumBatchSize: 500 })),\n mergeMap(async (bufferedCategories) => {\n viewport.changeCategoryDisplay(bufferedCategories, enabled, enableAllSubCategories);\n removeOverrides(bufferedCategories);\n if (!enabled) {\n await disableSubCategories(bufferedCategories);\n }\n }),\n ),\n );\n}\n\n/**\n * Changes subcategory display in the viewport\n * @internal\n */\nexport function enableSubCategoryDisplay(viewport: Viewport, key: string, enabled: boolean) {\n viewport.changeSubCategoryDisplay(key, enabled);\n}\n\n/** @internal */\nexport async function loadCategoriesFromViewport(vp: Viewport, componentId?: GuidString) {\n // Query categories and add them to state\n const selectUsedSpatialCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement3d WHERE Category.Id IN (SELECT ECInstanceId from BisCore.SpatialCategory)\";\n const selectUsedDrawingCategoryIds =\n \"SELECT DISTINCT Category.Id as id from BisCore.GeometricElement2d WHERE Model.Id=? AND Category.Id IN (SELECT ECInstanceId from BisCore.DrawingCategory)\";\n const ecsql = vp.view.is3d() ? selectUsedSpatialCategoryIds : selectUsedDrawingCategoryIds;\n const ecsql2 = `SELECT ECInstanceId as id FROM ${vp.view.is3d() ? \"BisCore.SpatialCategory\" : \"BisCore.DrawingCategory\"} WHERE ECInstanceId IN (${ecsql})`;\n\n const categories: CategoryInfo[] = [];\n\n const rows = await vp.iModel\n .createQueryReader(ecsql2, undefined, {\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n restartToken: `CategoriesVisibilityUtils/${componentId ?? Guid.createValue()}/categories`,\n })\n .toArray();\n (await vp.iModel.categories.getCategoryInfo(rows.map((row) => row.id))).forEach((val) => {\n categories.push({ categoryId: val.id, subCategoryIds: val.subCategories.size ? [...val.subCategories.keys()] : undefined });\n });\n return categories;\n}\n\n/**\n * Enable display of all given categories.\n * @public\n */\nexport async function showAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, true, true);\n}\n\n/**\n * Disable display of all given categories.\n * @public\n */\nexport async function hideAllCategories(categories: string[], viewport: Viewport) {\n await enableCategoryDisplay(viewport, categories, false, true);\n}\n\n/**\n * Invert display of all given categories.\n * Categories are inverted like this:\n * - If category is visible, it will be hidden.\n * - If category is hidden, it will be visible.\n * - If category is partially visible, it will be fully visible.\n * @public\n */\nexport async function invertAllCategories(categories: CategoryInfo[], viewport: Viewport) {\n const categoriesToEnable = new Set<Id64String>();\n const categoriesToDisable = new Set<Id64String>();\n\n for (const category of categories) {\n if (!viewport.view.viewsCategory(category.categoryId)) {\n categoriesToEnable.add(category.categoryId);\n continue;\n }\n // Check if category is in partial state\n if (category.subCategoryIds?.some((subCategory) => !viewport.isSubCategoryVisible(subCategory))) {\n categoriesToEnable.add(category.categoryId);\n } else {\n categoriesToDisable.add(category.categoryId);\n }\n }\n\n // collect per model overrides that need to be inverted\n for (const { categoryId, visible } of viewport.perModelCategoryVisibility) {\n if (!visible && categoriesToDisable.has(categoryId)) {\n categoriesToEnable.add(categoryId);\n categoriesToDisable.delete(categoryId);\n }\n }\n\n await enableCategoryDisplay(viewport, [...categoriesToDisable], false, true);\n\n await enableCategoryDisplay(viewport, [...categoriesToEnable], true, true);\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Observable, OperatorFunction } from "rxjs";
|
|
2
|
+
import type { Visibility } from "../Tooltip.js";
|
|
3
|
+
import type { VisibilityStatus } from "../UseHierarchyVisibility.js";
|
|
4
|
+
/** @internal */
|
|
5
|
+
export declare function setDifference<T>(lhs: Readonly<Iterable<T>>, rhs: ReadonlySet<T>): Set<T>;
|
|
6
|
+
/** @internal */
|
|
7
|
+
export declare function setIntersection<T>(lhs: Readonly<Iterable<T>>, rhs: ReadonlySet<T>): Set<T>;
|
|
8
|
+
/** @internal */
|
|
9
|
+
export declare function mergeVisibilities(obs: Observable<Visibility>): Observable<Visibility | "empty">;
|
|
10
|
+
/** @internal */
|
|
11
|
+
export declare function mergeVisibilityStatuses(tooltipMap?: {
|
|
12
|
+
[key in Visibility]: string | undefined;
|
|
13
|
+
}, ignoreTooltip?: boolean): OperatorFunction<VisibilityStatus, VisibilityStatus>;
|
|
14
|
+
/** @internal */
|
|
15
|
+
export declare function getTooltipOptions(key: string | undefined, ignoreTooltip?: boolean): {
|
|
16
|
+
useTooltip: string | false | undefined;
|
|
17
|
+
};
|
|
18
|
+
/** @internal */
|
|
19
|
+
export declare function releaseMainThreadOnItemsCount<T>(elementCount: number): (obs: Observable<T>) => Observable<T>;
|
|
20
|
+
/** @internal */
|
|
21
|
+
export declare function getOptimalBatchSize({ totalSize, maximumBatchSize }: {
|
|
22
|
+
totalSize: number;
|
|
23
|
+
maximumBatchSize: number;
|
|
24
|
+
}): number;
|
|
25
|
+
//# sourceMappingURL=Utils.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
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 { bufferCount, concatAll, concatMap, delay, map, of } from "rxjs";
|
|
6
|
+
import { reduceWhile } from "../Rxjs.js";
|
|
7
|
+
import { createVisibilityStatus } from "../Tooltip.js";
|
|
8
|
+
/** @internal */
|
|
9
|
+
export function setDifference(lhs, rhs) {
|
|
10
|
+
const result = new Set();
|
|
11
|
+
for (const x of lhs) {
|
|
12
|
+
if (!rhs.has(x)) {
|
|
13
|
+
result.add(x);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
/** @internal */
|
|
19
|
+
export function setIntersection(lhs, rhs) {
|
|
20
|
+
const result = new Set();
|
|
21
|
+
for (const x of lhs) {
|
|
22
|
+
if (rhs.has(x)) {
|
|
23
|
+
result.add(x);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
/** @internal */
|
|
29
|
+
export function mergeVisibilities(obs) {
|
|
30
|
+
return obs.pipe(reduceWhile((x) => x.allVisible || x.allHidden, (acc, val) => {
|
|
31
|
+
acc.allVisible &&= val === "visible";
|
|
32
|
+
acc.allHidden &&= val === "hidden";
|
|
33
|
+
return acc;
|
|
34
|
+
}, { allVisible: true, allHidden: true }), map((x) => {
|
|
35
|
+
if (!x) {
|
|
36
|
+
return "empty";
|
|
37
|
+
}
|
|
38
|
+
return x.allVisible ? "visible" : x.allHidden ? "hidden" : "partial";
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
/** @internal */
|
|
42
|
+
export function mergeVisibilityStatuses(tooltipMap, ignoreTooltip) {
|
|
43
|
+
return (obs) => {
|
|
44
|
+
return obs.pipe(map((visibilityStatus) => visibilityStatus.state), mergeVisibilities, map((visibility) => {
|
|
45
|
+
if (visibility === "empty") {
|
|
46
|
+
visibility = "visible";
|
|
47
|
+
}
|
|
48
|
+
return createVisibilityStatus(visibility, getTooltipOptions(tooltipMap?.[visibility], ignoreTooltip));
|
|
49
|
+
}));
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** @internal */
|
|
53
|
+
export function getTooltipOptions(key, ignoreTooltip) {
|
|
54
|
+
return {
|
|
55
|
+
useTooltip: ignoreTooltip ? false : key,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** @internal */
|
|
59
|
+
export function releaseMainThreadOnItemsCount(elementCount) {
|
|
60
|
+
return (obs) => {
|
|
61
|
+
return obs.pipe(bufferCount(elementCount), concatMap((buff, i) => {
|
|
62
|
+
const out = of(buff);
|
|
63
|
+
if (i === 0 && buff.length < elementCount) {
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
return out.pipe(delay(0));
|
|
67
|
+
}), concatAll());
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** @internal */
|
|
71
|
+
export function getOptimalBatchSize({ totalSize, maximumBatchSize }) {
|
|
72
|
+
return Math.ceil(totalSize / Math.ceil(totalSize / maximumBatchSize));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=Utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/common/internal/Utils.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 { bufferCount, concatAll, concatMap, delay, map, of } from \"rxjs\";\nimport { reduceWhile } from \"../Rxjs.js\";\nimport { createVisibilityStatus } from \"../Tooltip.js\";\n\nimport type { Observable, OperatorFunction } from \"rxjs\";\nimport type { Visibility } from \"../Tooltip.js\";\nimport type { VisibilityStatus } from \"../UseHierarchyVisibility.js\";\n\n/** @internal */\nexport function setDifference<T>(lhs: Readonly<Iterable<T>>, rhs: ReadonlySet<T>): Set<T> {\n const result = new Set<T>();\n for (const x of lhs) {\n if (!rhs.has(x)) {\n result.add(x);\n }\n }\n return result;\n}\n\n/** @internal */\nexport function setIntersection<T>(lhs: Readonly<Iterable<T>>, rhs: ReadonlySet<T>): Set<T> {\n const result = new Set<T>();\n for (const x of lhs) {\n if (rhs.has(x)) {\n result.add(x);\n }\n }\n return result;\n}\n\n/** @internal */\nexport function mergeVisibilities(obs: Observable<Visibility>): Observable<Visibility | \"empty\"> {\n return obs.pipe(\n reduceWhile(\n (x) => x.allVisible || x.allHidden,\n (acc, val) => {\n acc.allVisible &&= val === \"visible\";\n acc.allHidden &&= val === \"hidden\";\n return acc;\n },\n { allVisible: true, allHidden: true },\n ),\n map((x) => {\n if (!x) {\n return \"empty\";\n }\n return x.allVisible ? \"visible\" : x.allHidden ? \"hidden\" : \"partial\";\n }),\n );\n}\n\n/** @internal */\nexport function mergeVisibilityStatuses(\n tooltipMap?: { [key in Visibility]: string | undefined },\n ignoreTooltip?: boolean,\n): OperatorFunction<VisibilityStatus, VisibilityStatus> {\n return (obs) => {\n return obs.pipe(\n map((visibilityStatus) => visibilityStatus.state),\n mergeVisibilities,\n map((visibility) => {\n if (visibility === \"empty\") {\n visibility = \"visible\";\n }\n return createVisibilityStatus(visibility, getTooltipOptions(tooltipMap?.[visibility], ignoreTooltip));\n }),\n );\n };\n}\n\n/** @internal */\nexport function getTooltipOptions(key: string | undefined, ignoreTooltip?: boolean) {\n return {\n useTooltip: ignoreTooltip ? (false as const) : key,\n };\n}\n\n/** @internal */\nexport function releaseMainThreadOnItemsCount<T>(elementCount: number) {\n return (obs: Observable<T>): Observable<T> => {\n return obs.pipe(\n bufferCount(elementCount),\n concatMap((buff, i) => {\n const out = of(buff);\n if (i === 0 && buff.length < elementCount) {\n return out;\n }\n return out.pipe(delay(0));\n }),\n concatAll(),\n );\n };\n}\n\n/** @internal */\nexport function getOptimalBatchSize({ totalSize, maximumBatchSize }: { totalSize: number; maximumBatchSize: number }): number {\n return Math.ceil(totalSize / Math.ceil(totalSize / maximumBatchSize));\n}\n"]}
|
|
@@ -70,6 +70,7 @@ export declare class ModelsTreeDefinition implements HierarchyDefinition {
|
|
|
70
70
|
private createSubjectChildrenQuery;
|
|
71
71
|
private createISubModeledElementChildrenQuery;
|
|
72
72
|
private createGeometricModel3dChildrenQuery;
|
|
73
|
+
private getElementChildrenCountCtes;
|
|
73
74
|
private createSpatialCategoryChildrenQuery;
|
|
74
75
|
private createGeometricElement3dChildrenQuery;
|
|
75
76
|
static createInstanceKeyPaths(props: ModelsTreeInstanceKeyPathsProps): Promise<NormalizedHierarchyFilteringPath[]>;
|