@itwin/tree-widget-react 4.0.0-alpha.3 → 4.0.0-alpha.4
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 +34 -1
- package/README.md +1 -3
- package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +3 -2
- package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js +2 -2
- package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +4 -4
- package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +6 -6
- 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/CategoriesTreeDefinition.d.ts +10 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +246 -129
- 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.js +69 -20
- 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 +54 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +280 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +26 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +23 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/{CategoriesVisibilityHandler.d.ts → internal/CategoriesVisibilityHandler.d.ts} +18 -9
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +214 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +7 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js +11 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +0 -4
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.d.ts +28 -4
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js +73 -2
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +3 -4
- 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/TreeNodeVisibilityButton.css +2 -1
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +6 -6
- package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +9 -9
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +15 -15
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/index.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/index.js +1 -0
- package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +12 -12
- 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 +6 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +7 -3
- 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/UseModelsTree.js +11 -11
- 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/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +5 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +45 -0
- 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.d.ts +2 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +128 -38
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/public/locales/en/TreeWidget.json +15 -4
- package/package.json +3 -6
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js +0 -87
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.d.ts +0 -7
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js +0 -66
- package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js.map +0 -1
|
@@ -2,8 +2,8 @@
|
|
|
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, defer, distinct, EMPTY, filter, firstValueFrom, forkJoin, from, fromEventPattern, map, merge, mergeMap, of, reduce, shareReplay, startWith, Subject, take, takeUntil, tap, } from "rxjs";
|
|
6
|
-
import { assert } from "@itwin/core-bentley";
|
|
5
|
+
import { concat, concatAll, defer, distinct, EMPTY, filter, firstValueFrom, forkJoin, from, fromEventPattern, map, merge, mergeMap, of, reduce, shareReplay, startWith, Subject, take, takeUntil, tap, toArray, } from "rxjs";
|
|
6
|
+
import { assert, Id64 } from "@itwin/core-bentley";
|
|
7
7
|
import { PerModelCategoryVisibility } from "@itwin/core-frontend";
|
|
8
8
|
import { HierarchyNode, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
|
|
9
9
|
import { toggleAllCategories } from "../../common/CategoriesVisibilityUtils.js";
|
|
@@ -66,6 +66,9 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
66
66
|
return toVoidPromise(changeObservable);
|
|
67
67
|
}
|
|
68
68
|
dispose() {
|
|
69
|
+
this[Symbol.dispose]();
|
|
70
|
+
}
|
|
71
|
+
[Symbol.dispose]() {
|
|
69
72
|
this._eventListener.dispose();
|
|
70
73
|
this._alwaysAndNeverDrawnElements.dispose();
|
|
71
74
|
this._subscriptions.forEach((x) => x.unsubscribe());
|
|
@@ -154,7 +157,12 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
154
157
|
return of(createVisibilityStatus("disabled", getTooltipOptions("modelsTree.model.nonSpatialView", ignoreTooltip)));
|
|
155
158
|
}
|
|
156
159
|
if (!viewport.view.viewsModel(modelId)) {
|
|
157
|
-
return
|
|
160
|
+
return from(this._idsCache.getModelCategories(modelId)).pipe(mergeMap((categoryIds) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), this.getSubModeledElementsVisibilityStatus({
|
|
161
|
+
ignoreTooltips: ignoreTooltip,
|
|
162
|
+
haveSubModel: "yes",
|
|
163
|
+
tooltips: { visible: undefined, hidden: "modelsTree.model.hiddenThroughModelSelector", partial: "modelsTree.model.someSubModelsVisible" },
|
|
164
|
+
parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
|
|
165
|
+
}));
|
|
158
166
|
}
|
|
159
167
|
return from(this._idsCache.getModelCategories(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryId, ignoreTooltip: true })), map((x) => x.state), getVisibilityFromTreeNodeChildren, map((visibilityByCategories) => {
|
|
160
168
|
const state = visibilityByCategories === "empty" ? "visible" : visibilityByCategories;
|
|
@@ -182,7 +190,16 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
182
190
|
getCategoryDisplayStatus({ ignoreTooltip, ...props }) {
|
|
183
191
|
const result = defer(() => {
|
|
184
192
|
if (!this._props.viewport.view.viewsModel(props.modelId)) {
|
|
185
|
-
return
|
|
193
|
+
return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(this.getSubModeledElementsVisibilityStatus({
|
|
194
|
+
ignoreTooltips: ignoreTooltip,
|
|
195
|
+
parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
|
|
196
|
+
tooltips: {
|
|
197
|
+
visible: undefined,
|
|
198
|
+
hidden: "modelsTree.category.hiddenThroughModel",
|
|
199
|
+
partial: "modelsTree.category.someElementsOrSubModelsHidden",
|
|
200
|
+
},
|
|
201
|
+
haveSubModel: "yes",
|
|
202
|
+
}));
|
|
186
203
|
}
|
|
187
204
|
return this.getVisibilityFromAlwaysAndNeverDrawnElements({
|
|
188
205
|
queryProps: props,
|
|
@@ -194,7 +211,18 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
194
211
|
},
|
|
195
212
|
defaultStatus: () => this.getDefaultCategoryVisibilityStatus(props),
|
|
196
213
|
ignoreTooltip,
|
|
197
|
-
})
|
|
214
|
+
}).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
|
|
215
|
+
return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(this.getSubModeledElementsVisibilityStatus({
|
|
216
|
+
tooltips: {
|
|
217
|
+
visible: undefined,
|
|
218
|
+
hidden: "modelsTree.category.allElementsAndSubModelsHidden",
|
|
219
|
+
partial: "modelsTree.category.someElementsOrSubModelsHidden",
|
|
220
|
+
},
|
|
221
|
+
haveSubModel: "yes",
|
|
222
|
+
parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,
|
|
223
|
+
ignoreTooltips: ignoreTooltip,
|
|
224
|
+
}));
|
|
225
|
+
}));
|
|
198
226
|
});
|
|
199
227
|
return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getCategoryDisplayStatus);
|
|
200
228
|
}
|
|
@@ -203,7 +231,15 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
203
231
|
const info = this.getGroupingNodeInfo(node);
|
|
204
232
|
const { modelId, categoryId, elementIds } = info;
|
|
205
233
|
if (!this._props.viewport.view.viewsModel(modelId)) {
|
|
206
|
-
return of(
|
|
234
|
+
return of([...elementIds]).pipe(this.getSubModeledElementsVisibilityStatus({
|
|
235
|
+
tooltips: {
|
|
236
|
+
visible: undefined,
|
|
237
|
+
hidden: undefined,
|
|
238
|
+
partial: "modelsTree.groupingNode.someElementsOrSubModelsHidden",
|
|
239
|
+
},
|
|
240
|
+
parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
|
|
241
|
+
haveSubModel: "unknown",
|
|
242
|
+
}));
|
|
207
243
|
}
|
|
208
244
|
return this.getVisibilityFromAlwaysAndNeverDrawnElements({
|
|
209
245
|
elements: elementIds,
|
|
@@ -217,7 +253,17 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
217
253
|
elementsInBothAlwaysAndNeverDrawn: "modelsTree.groupingNode.someElementsAreHidden",
|
|
218
254
|
noElementsInExclusiveAlwaysDrawnList: "modelsTree.groupingNode.allElementsHidden",
|
|
219
255
|
},
|
|
220
|
-
})
|
|
256
|
+
}).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
|
|
257
|
+
return of([...elementIds]).pipe(this.getSubModeledElementsVisibilityStatus({
|
|
258
|
+
tooltips: {
|
|
259
|
+
visible: undefined,
|
|
260
|
+
hidden: "modelsTree.groupingNode.allElementsAndSubModelsHidden",
|
|
261
|
+
partial: "modelsTree.groupingNode.someElementsOrSubModelsHidden",
|
|
262
|
+
},
|
|
263
|
+
parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,
|
|
264
|
+
haveSubModel: "unknown",
|
|
265
|
+
}));
|
|
266
|
+
}));
|
|
221
267
|
});
|
|
222
268
|
return createVisibilityHandlerResult(this, { node }, result, this._props.overrides?.getElementGroupingNodeDisplayStatus);
|
|
223
269
|
}
|
|
@@ -236,19 +282,46 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
236
282
|
}
|
|
237
283
|
return undefined;
|
|
238
284
|
}
|
|
285
|
+
getElementVisibility(ignoreTooltip, viewsModel, overridenVisibility, categoryVisibility, subModelVisibilityStatus) {
|
|
286
|
+
if (subModelVisibilityStatus === undefined) {
|
|
287
|
+
if (!viewsModel) {
|
|
288
|
+
return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughModel", ignoreTooltip));
|
|
289
|
+
}
|
|
290
|
+
if (overridenVisibility) {
|
|
291
|
+
return overridenVisibility;
|
|
292
|
+
}
|
|
293
|
+
return createVisibilityStatus(categoryVisibility.state, getTooltipOptions(categoryVisibility.state === "visible" ? undefined : "modelsTree.element.hiddenThroughCategory", ignoreTooltip));
|
|
294
|
+
}
|
|
295
|
+
if (subModelVisibilityStatus.state === "partial") {
|
|
296
|
+
return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.someElementsAreHidden", ignoreTooltip));
|
|
297
|
+
}
|
|
298
|
+
if (subModelVisibilityStatus.state === "visible") {
|
|
299
|
+
if (!viewsModel || overridenVisibility?.state === "hidden" || (categoryVisibility.state === "hidden" && !overridenVisibility)) {
|
|
300
|
+
return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.partialThroughSubModel", ignoreTooltip));
|
|
301
|
+
}
|
|
302
|
+
return createVisibilityStatus("visible", getTooltipOptions(undefined, ignoreTooltip));
|
|
303
|
+
}
|
|
304
|
+
if (!viewsModel) {
|
|
305
|
+
return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughModel", ignoreTooltip));
|
|
306
|
+
}
|
|
307
|
+
if (overridenVisibility) {
|
|
308
|
+
if (overridenVisibility.state === "hidden") {
|
|
309
|
+
return overridenVisibility;
|
|
310
|
+
}
|
|
311
|
+
return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.partialThroughElement", ignoreTooltip));
|
|
312
|
+
}
|
|
313
|
+
if (categoryVisibility.state === "visible") {
|
|
314
|
+
return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.partialThroughCategory", ignoreTooltip));
|
|
315
|
+
}
|
|
316
|
+
return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughCategory", ignoreTooltip));
|
|
317
|
+
}
|
|
239
318
|
getElementDisplayStatus({ ignoreTooltip, ...props }) {
|
|
240
319
|
const result = defer(() => {
|
|
241
320
|
const viewport = this._props.viewport;
|
|
242
321
|
const { elementId, modelId, categoryId } = props;
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
}
|
|
246
|
-
let status = this.getElementOverriddenVisibility(elementId, ignoreTooltip);
|
|
247
|
-
if (status) {
|
|
248
|
-
return of(status);
|
|
249
|
-
}
|
|
250
|
-
status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true });
|
|
251
|
-
return of(createVisibilityStatus(status.state, getTooltipOptions(status.state === "visible" ? undefined : "modelsTree.element.hiddenThroughCategory", ignoreTooltip)));
|
|
322
|
+
const viewsModel = viewport.view.viewsModel(modelId);
|
|
323
|
+
const elementStatus = this.getElementOverriddenVisibility(elementId, ignoreTooltip);
|
|
324
|
+
return from(this._idsCache.hasSubModel(elementId)).pipe(mergeMap((hasSubModel) => (hasSubModel ? this.getModelVisibilityStatus({ modelId: elementId }) : of(undefined))), map((subModelVisibilityStatus) => this.getElementVisibility(ignoreTooltip, viewsModel, elementStatus, this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true }), subModelVisibilityStatus)));
|
|
252
325
|
});
|
|
253
326
|
return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getElementDisplayStatus);
|
|
254
327
|
}
|
|
@@ -329,20 +402,24 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
329
402
|
return createVisibilityHandlerResult(this, { ids, on }, result, this._props.overrides?.changeSubjectNodeState);
|
|
330
403
|
}
|
|
331
404
|
changeModelState(props) {
|
|
405
|
+
const { ids, on } = props;
|
|
406
|
+
if (Id64.sizeOf(ids) === 0) {
|
|
407
|
+
return EMPTY;
|
|
408
|
+
}
|
|
332
409
|
const result = defer(() => {
|
|
333
410
|
const viewport = this._props.viewport;
|
|
334
411
|
if (!viewport.view.isSpatialView()) {
|
|
335
412
|
return EMPTY;
|
|
336
413
|
}
|
|
337
|
-
const
|
|
414
|
+
const idsObs = from(Id64.iterable(ids));
|
|
338
415
|
if (!on) {
|
|
339
416
|
viewport.changeModelDisplay(ids, false);
|
|
340
|
-
return
|
|
417
|
+
return idsObs.pipe(mergeMap(async (modelId) => ({ modelId, categoryIds: await this._idsCache.getModelCategories(modelId) })), mergeMap(({ modelId, categoryIds }) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })));
|
|
341
418
|
}
|
|
342
419
|
return concat(defer(() => {
|
|
343
420
|
viewport.perModelCategoryVisibility.clearOverrides(ids);
|
|
344
421
|
return from(viewport.addViewedModels(ids));
|
|
345
|
-
}),
|
|
422
|
+
}), idsObs.pipe(mergeMap((modelId) => {
|
|
346
423
|
return from(this._idsCache.getModelCategories(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })));
|
|
347
424
|
})));
|
|
348
425
|
});
|
|
@@ -386,25 +463,27 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
386
463
|
return concat(props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY, defer(() => {
|
|
387
464
|
this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on);
|
|
388
465
|
return this.clearAlwaysAndNeverDrawnElements(props);
|
|
389
|
-
}));
|
|
466
|
+
}), from(this._idsCache.getCategoriesModeledElements(modelId, [categoryId])).pipe(mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on }))));
|
|
390
467
|
});
|
|
391
468
|
return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeCategoryState);
|
|
392
469
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
*/
|
|
397
|
-
changeElementGroupingNodeState(node, on) {
|
|
398
|
-
const result = defer(() => {
|
|
399
|
-
const info = this.getGroupingNodeInfo(node);
|
|
400
|
-
const { modelId, categoryId, elementIds } = info;
|
|
470
|
+
doChangeElementsState(props) {
|
|
471
|
+
return defer(() => {
|
|
472
|
+
const { modelId, categoryId, elementIds, on } = props;
|
|
401
473
|
const viewport = this._props.viewport;
|
|
402
474
|
return concat(on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY, defer(() => {
|
|
403
475
|
const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true });
|
|
404
476
|
const isDisplayedByDefault = categoryVisibility.state === "visible";
|
|
405
477
|
return this.queueElementsVisibilityChange(elementIds, on, isDisplayedByDefault);
|
|
406
|
-
}));
|
|
478
|
+
}), from(elementIds).pipe(mergeMap(async (elementId) => ({ elementId, isSubModel: await this._idsCache.hasSubModel(elementId) })), filter(({ isSubModel }) => isSubModel), map(({ elementId }) => elementId), toArray(), mergeMap((subModelIds) => this.changeModelState({ ids: subModelIds, on }))));
|
|
407
479
|
});
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Updates visibility of all grouping node's elements.
|
|
483
|
+
* @see `changeElementState`
|
|
484
|
+
*/
|
|
485
|
+
changeElementGroupingNodeState(node, on) {
|
|
486
|
+
const result = this.doChangeElementsState({ ...this.getGroupingNodeInfo(node), on });
|
|
408
487
|
return createVisibilityHandlerResult(this, { node, on }, result, this._props.overrides?.changeElementGroupingNodeState);
|
|
409
488
|
}
|
|
410
489
|
/**
|
|
@@ -412,15 +491,7 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
412
491
|
* @note If element is to be enabled and model is hidden, it will be enabled.
|
|
413
492
|
*/
|
|
414
493
|
changeElementsState(props) {
|
|
415
|
-
const result =
|
|
416
|
-
const { elementIds, on, modelId, categoryId } = props;
|
|
417
|
-
const viewport = this._props.viewport;
|
|
418
|
-
return concat(props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY, defer(() => {
|
|
419
|
-
const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true });
|
|
420
|
-
const isDisplayedByDefault = categoryVisibility.state === "visible";
|
|
421
|
-
return this.queueElementsVisibilityChange(elementIds, on, isDisplayedByDefault);
|
|
422
|
-
}));
|
|
423
|
-
});
|
|
494
|
+
const result = this.doChangeElementsState(props);
|
|
424
495
|
return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeElementsState);
|
|
425
496
|
}
|
|
426
497
|
queueElementsVisibilityChange(elementIds, on, visibleByDefault) {
|
|
@@ -564,6 +635,25 @@ class ModelsTreeVisibilityHandlerImpl {
|
|
|
564
635
|
const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));
|
|
565
636
|
return { modelId, categoryId, elementIds };
|
|
566
637
|
}
|
|
638
|
+
getSubModeledElementsVisibilityStatus({ parentNodeVisibilityStatus, haveSubModel, tooltips, ignoreTooltips, }) {
|
|
639
|
+
return (obs) => {
|
|
640
|
+
return obs.pipe(
|
|
641
|
+
// ensure we're only looking at elements that have a sub-model
|
|
642
|
+
mergeMap((modeledElementIds) => {
|
|
643
|
+
if (haveSubModel === "yes") {
|
|
644
|
+
return of(modeledElementIds);
|
|
645
|
+
}
|
|
646
|
+
return from(modeledElementIds).pipe(mergeMap(async (elementId) => ({ elementId, hasSubModel: await this._idsCache.hasSubModel(elementId) })), filter(({ hasSubModel }) => hasSubModel), map(({ elementId }) => elementId), toArray());
|
|
647
|
+
}),
|
|
648
|
+
// combine visibility status of sub-models with visibility status of parent node
|
|
649
|
+
mergeMap((modeledElementIds) => {
|
|
650
|
+
if (modeledElementIds.length === 0) {
|
|
651
|
+
return of(parentNodeVisibilityStatus);
|
|
652
|
+
}
|
|
653
|
+
return from(modeledElementIds).pipe(mergeMap((modeledElementId) => this.getModelVisibilityStatus({ modelId: modeledElementId })), startWith(parentNodeVisibilityStatus), map((visibilityStatus) => visibilityStatus.state), getVisibilityStatusFromTreeNodeChildren(tooltips, ignoreTooltips));
|
|
654
|
+
}));
|
|
655
|
+
};
|
|
656
|
+
}
|
|
567
657
|
}
|
|
568
658
|
function getVisibilityFromTreeNodeChildren(obs) {
|
|
569
659
|
return obs.pipe(reduceWhile((x) => x.allVisible || x.allHidden, (acc, val) => {
|