@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.
Files changed (68) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +1 -3
  3. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +3 -2
  4. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
  5. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js +2 -2
  6. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js.map +1 -1
  7. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +4 -4
  8. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
  9. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +1 -1
  10. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +6 -6
  11. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +10 -2
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +246 -129
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +69 -20
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +54 -0
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +280 -0
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -0
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +26 -0
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +23 -0
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -0
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/{CategoriesVisibilityHandler.d.ts → internal/CategoriesVisibilityHandler.d.ts} +18 -9
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +214 -0
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -0
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +7 -0
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js +11 -0
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +1 -0
  29. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +0 -4
  30. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +1 -1
  31. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  32. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.d.ts +28 -4
  33. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js +73 -2
  34. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js.map +1 -1
  35. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +1 -1
  36. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +3 -4
  37. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  38. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.css +2 -1
  39. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +6 -6
  40. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
  41. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +9 -9
  42. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  43. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +15 -15
  44. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  45. package/lib/esm/tree-widget-react/components/trees/index.d.ts +1 -0
  46. package/lib/esm/tree-widget-react/components/trees/index.js +1 -0
  47. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  48. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +12 -12
  49. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  50. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +6 -1
  51. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +7 -3
  52. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  53. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +11 -11
  54. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  55. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
  56. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +5 -0
  57. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +45 -0
  58. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  59. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +2 -1
  60. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +128 -38
  61. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  62. package/lib/public/locales/en/TreeWidget.json +15 -4
  63. package/package.json +3 -6
  64. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js +0 -87
  65. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +0 -1
  66. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.d.ts +0 -7
  67. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js +0 -66
  68. 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 of(createVisibilityStatus("hidden", getTooltipOptions("modelsTree.model.hiddenThroughModelSelector", ignoreTooltip)));
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 of(createVisibilityStatus("hidden", getTooltipOptions("modelsTree.category.hiddenThroughModel", ignoreTooltip)));
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(createVisibilityStatus("hidden"));
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
- if (!viewport.view.viewsModel(modelId)) {
244
- return of(createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughModel", ignoreTooltip)));
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 { ids, on } = props;
414
+ const idsObs = from(Id64.iterable(ids));
338
415
  if (!on) {
339
416
  viewport.changeModelDisplay(ids, false);
340
- return EMPTY;
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
- }), (typeof ids === "string" ? of(ids) : from(ids)).pipe(mergeMap((modelId) => {
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
- * Updates visibility of all grouping node's elements.
395
- * @see `changeElementState`
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 = defer(() => {
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) => {