@itwin/tree-widget-react 3.0.0-dev.6 → 3.0.1

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 (141) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/README.md +358 -240
  3. package/lib/cjs/components/trees/categories-tree/CategoriesTree.d.ts +6 -13
  4. package/lib/cjs/components/trees/categories-tree/CategoriesTree.js +2 -1
  5. package/lib/cjs/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  6. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.d.ts +20 -1
  7. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.js +20 -2
  8. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  9. package/lib/cjs/components/trees/categories-tree/CategoriesTreeComponent.d.ts +7 -8
  10. package/lib/cjs/components/trees/categories-tree/CategoriesTreeComponent.js +2 -2
  11. package/lib/cjs/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  12. package/lib/cjs/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +2 -2
  13. package/lib/cjs/components/trees/categories-tree/CategoriesTreeDefinition.js +6 -3
  14. package/lib/cjs/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  15. package/lib/cjs/components/trees/categories-tree/UseCategoriesTree.d.ts +7 -10
  16. package/lib/cjs/components/trees/categories-tree/UseCategoriesTree.js +30 -3
  17. package/lib/cjs/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  18. package/lib/cjs/components/trees/common/UseHierarchiesLocalization.d.ts +3 -3
  19. package/lib/cjs/components/trees/common/UseHierarchiesLocalization.js.map +1 -1
  20. package/lib/cjs/components/trees/common/UseHierarchyVisibility.d.ts +20 -0
  21. package/lib/cjs/components/trees/common/UseHierarchyVisibility.js +11 -1
  22. package/lib/cjs/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  23. package/lib/cjs/components/trees/common/UseIModelChangeListener.js +1 -1
  24. package/lib/cjs/components/trees/common/UseIModelChangeListener.js.map +1 -1
  25. package/lib/cjs/components/trees/common/Utils.d.ts +3 -0
  26. package/lib/cjs/components/trees/common/Utils.js +1 -0
  27. package/lib/cjs/components/trees/common/Utils.js.map +1 -1
  28. package/lib/cjs/components/trees/common/components/Tree.d.ts +8 -21
  29. package/lib/cjs/components/trees/common/components/Tree.js +5 -4
  30. package/lib/cjs/components/trees/common/components/Tree.js.map +1 -1
  31. package/lib/cjs/components/trees/common/components/TreeNodeRenderer.d.ts +2 -5
  32. package/lib/cjs/components/trees/common/components/TreeNodeRenderer.js.map +1 -1
  33. package/lib/cjs/components/trees/common/components/TreeRenderer.d.ts +3 -10
  34. package/lib/cjs/components/trees/common/components/TreeRenderer.js +2 -2
  35. package/lib/cjs/components/trees/common/components/TreeRenderer.js.map +1 -1
  36. package/lib/cjs/components/trees/common/components/TreeRenderer.scss +0 -8
  37. package/lib/cjs/components/trees/common/components/VisibilityTree.d.ts +7 -17
  38. package/lib/cjs/components/trees/common/components/VisibilityTree.js.map +1 -1
  39. package/lib/cjs/components/trees/common/components/VisibilityTreeRenderer.d.ts +4 -5
  40. package/lib/cjs/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  41. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +3 -8
  42. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  43. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +3 -3
  44. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  45. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +8 -5
  46. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  47. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -8
  48. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  49. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +3 -3
  50. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  51. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +2 -1
  52. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +17 -14
  53. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  54. package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +6 -12
  55. package/lib/cjs/components/trees/models-tree/ModelsTree.js +9 -2
  56. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  57. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.d.ts +24 -3
  58. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js +23 -3
  59. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  60. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +10 -11
  61. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +2 -2
  62. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  63. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.d.ts +5 -2
  64. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js +13 -10
  65. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  66. package/lib/cjs/components/trees/models-tree/UseModelsTree.d.ts +10 -13
  67. package/lib/cjs/components/trees/models-tree/UseModelsTree.js +42 -3
  68. package/lib/cjs/components/trees/models-tree/UseModelsTree.js.map +1 -1
  69. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +21 -45
  70. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +12 -35
  71. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  72. package/lib/esm/components/trees/categories-tree/CategoriesTree.d.ts +6 -13
  73. package/lib/esm/components/trees/categories-tree/CategoriesTree.js +2 -1
  74. package/lib/esm/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  75. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.d.ts +20 -1
  76. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.js +21 -3
  77. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  78. package/lib/esm/components/trees/categories-tree/CategoriesTreeComponent.d.ts +7 -8
  79. package/lib/esm/components/trees/categories-tree/CategoriesTreeComponent.js +2 -2
  80. package/lib/esm/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  81. package/lib/esm/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +2 -2
  82. package/lib/esm/components/trees/categories-tree/CategoriesTreeDefinition.js +7 -4
  83. package/lib/esm/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  84. package/lib/esm/components/trees/categories-tree/UseCategoriesTree.d.ts +7 -10
  85. package/lib/esm/components/trees/categories-tree/UseCategoriesTree.js +30 -3
  86. package/lib/esm/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  87. package/lib/esm/components/trees/common/UseHierarchiesLocalization.d.ts +3 -3
  88. package/lib/esm/components/trees/common/UseHierarchiesLocalization.js.map +1 -1
  89. package/lib/esm/components/trees/common/UseHierarchyVisibility.d.ts +20 -0
  90. package/lib/esm/components/trees/common/UseHierarchyVisibility.js +10 -1
  91. package/lib/esm/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  92. package/lib/esm/components/trees/common/UseIModelChangeListener.js +1 -1
  93. package/lib/esm/components/trees/common/UseIModelChangeListener.js.map +1 -1
  94. package/lib/esm/components/trees/common/Utils.d.ts +3 -0
  95. package/lib/esm/components/trees/common/Utils.js +1 -0
  96. package/lib/esm/components/trees/common/Utils.js.map +1 -1
  97. package/lib/esm/components/trees/common/components/Tree.d.ts +8 -21
  98. package/lib/esm/components/trees/common/components/Tree.js +7 -6
  99. package/lib/esm/components/trees/common/components/Tree.js.map +1 -1
  100. package/lib/esm/components/trees/common/components/TreeNodeRenderer.d.ts +2 -5
  101. package/lib/esm/components/trees/common/components/TreeNodeRenderer.js.map +1 -1
  102. package/lib/esm/components/trees/common/components/TreeRenderer.d.ts +3 -10
  103. package/lib/esm/components/trees/common/components/TreeRenderer.js +2 -2
  104. package/lib/esm/components/trees/common/components/TreeRenderer.js.map +1 -1
  105. package/lib/esm/components/trees/common/components/TreeRenderer.scss +0 -8
  106. package/lib/esm/components/trees/common/components/VisibilityTree.d.ts +7 -17
  107. package/lib/esm/components/trees/common/components/VisibilityTree.js.map +1 -1
  108. package/lib/esm/components/trees/common/components/VisibilityTreeRenderer.d.ts +4 -5
  109. package/lib/esm/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  110. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +3 -8
  111. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  112. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +3 -3
  113. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  114. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +9 -6
  115. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  116. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -8
  117. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  118. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +3 -3
  119. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  120. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +2 -1
  121. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +18 -15
  122. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  123. package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +6 -12
  124. package/lib/esm/components/trees/models-tree/ModelsTree.js +9 -2
  125. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  126. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.d.ts +24 -3
  127. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js +23 -3
  128. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  129. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +10 -11
  130. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +2 -2
  131. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  132. package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.d.ts +5 -2
  133. package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.js +14 -11
  134. package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  135. package/lib/esm/components/trees/models-tree/UseModelsTree.d.ts +10 -13
  136. package/lib/esm/components/trees/models-tree/UseModelsTree.js +43 -4
  137. package/lib/esm/components/trees/models-tree/UseModelsTree.js.map +1 -1
  138. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +21 -45
  139. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +13 -36
  140. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  141. package/package.json +34 -32
@@ -1,30 +1,30 @@
1
+ import type { GroupingHierarchyNode } from "@itwin/presentation-hierarchies";
2
+ import type { HierarchyVisibilityHandler, HierarchyVisibilityHandlerOverridableMethod, VisibilityStatus } from "../../common/UseHierarchyVisibility";
1
3
  import type { ModelsTreeIdsCache } from "./ModelsTreeIdsCache";
2
4
  import type { Id64Arg, Id64Array, Id64String } from "@itwin/core-bentley";
3
- import type { GroupingHierarchyNode } from "@itwin/presentation-hierarchies";
4
5
  import type { Viewport } from "@itwin/core-frontend";
5
- import type { HierarchyVisibilityHandler, VisibilityStatus } from "../../common/UseHierarchyVisibility";
6
6
  import type { ECClassHierarchyInspector } from "@itwin/presentation-shared";
7
7
  /** @beta */
8
- interface GetCategoryStatusProps {
8
+ interface GetCategoryVisibilityStatusProps {
9
9
  categoryId: Id64String;
10
10
  modelId: Id64String;
11
11
  }
12
12
  /** @beta */
13
- interface ChangeCategoryStateProps extends GetCategoryStatusProps {
13
+ interface ChangeCategoryVisibilityStateProps extends GetCategoryVisibilityStatusProps {
14
14
  on: boolean;
15
15
  }
16
16
  /** @beta */
17
- interface GetElementStateProps {
17
+ interface GetGeometricElementVisibilityStatusProps {
18
18
  elementId: Id64String;
19
19
  modelId: Id64String;
20
20
  categoryId: Id64String;
21
21
  }
22
22
  /** @beta */
23
- interface ChangeElementStateProps extends GetElementStateProps {
23
+ interface ChangeGeometricElementDisplayStateProps extends GetGeometricElementVisibilityStatusProps {
24
24
  on: boolean;
25
25
  }
26
26
  /** @beta */
27
- interface ChangeModelStateProps {
27
+ interface ChangeModelVisibilityStateProps {
28
28
  ids: Id64Arg;
29
29
  on: boolean;
30
30
  }
@@ -33,54 +33,36 @@ export declare const MODEL_CLASS_NAME: "BisCore.GeometricModel3d";
33
33
  export declare const CATEGORY_CLASS_NAME: "BisCore.SpatialCategory";
34
34
  export declare const ELEMENT_CLASS_NAME: "BisCore.GeometricElement3d";
35
35
  /**
36
- * Properties for a method of `ModelsTreeVisibilityHandler` that can be overridden.
37
- * @beta
38
- */
39
- type OverridableMethodProps<TFunc> = TFunc extends (props: infer TProps) => infer TResult ? TProps & {
40
- /** A callback that produces the value from the original implementation. */
41
- readonly originalImplementation: () => TResult;
42
- /**
43
- * Reference to the hierarchy based handler.
44
- * @note Calling `getVisibility` or `changeVisibility` of this object invokes the overridden implementation as well.
45
- */
46
- readonly handler: ModelsTreeVisibilityHandler;
47
- } : never;
48
- /**
49
- * Function type for an overridden method of `ModelsTreeVisibilityHandler`.
50
- * @beta
51
- */
52
- type OverridableMethod<TFunc> = TFunc extends (...args: any[]) => infer TResult ? (props: OverridableMethodProps<TFunc>) => TResult : never;
53
- /**
54
- * Functionality of `ModelsTreeVisibilityHandler` that can be overridden.
55
- * Each callback will be provided original implementation and reference to a `HierarchyVisibilityHandler`.
36
+ * Functionality of Models tree visibility handler that can be overridden.
37
+ * Each callback is provided original implementation and reference to a `HierarchyVisibilityHandler`.
56
38
  * @beta
57
39
  */
58
40
  export interface ModelsTreeVisibilityHandlerOverrides {
59
- getSubjectNodeVisibility?: OverridableMethod<(props: {
41
+ getSubjectNodeVisibility?: HierarchyVisibilityHandlerOverridableMethod<(props: {
60
42
  ids: Id64Array;
61
43
  }) => Promise<VisibilityStatus>>;
62
- getModelDisplayStatus?: OverridableMethod<(props: {
44
+ getModelDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: {
63
45
  id: Id64String;
64
46
  }) => Promise<VisibilityStatus>>;
65
- getCategoryDisplayStatus?: OverridableMethod<(props: GetCategoryStatusProps) => Promise<VisibilityStatus>>;
66
- getElementGroupingNodeDisplayStatus?: OverridableMethod<(props: {
47
+ getCategoryDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetCategoryVisibilityStatusProps) => Promise<VisibilityStatus>>;
48
+ getElementGroupingNodeDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: {
67
49
  node: GroupingHierarchyNode;
68
50
  }) => Promise<VisibilityStatus>>;
69
- getElementDisplayStatus?: OverridableMethod<(props: GetElementStateProps) => Promise<VisibilityStatus>>;
70
- changeSubjectNodeState?: OverridableMethod<(props: {
51
+ getElementDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetGeometricElementVisibilityStatusProps) => Promise<VisibilityStatus>>;
52
+ changeSubjectNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: {
71
53
  ids: Id64Array;
72
54
  on: boolean;
73
55
  }) => Promise<void>>;
74
- changeModelState?: OverridableMethod<(props: ChangeModelStateProps) => Promise<void>>;
75
- changeCategoryState?: OverridableMethod<(props: ChangeCategoryStateProps) => Promise<void>>;
76
- changeElementGroupingNodeState?: OverridableMethod<(props: {
56
+ changeModelState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeModelVisibilityStateProps) => Promise<void>>;
57
+ changeCategoryState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeCategoryVisibilityStateProps) => Promise<void>>;
58
+ changeElementGroupingNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: {
77
59
  node: GroupingHierarchyNode;
78
60
  on: boolean;
79
61
  }) => Promise<void>>;
80
- changeElementState?: OverridableMethod<(props: ChangeElementStateProps) => Promise<void>>;
62
+ changeElementState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeGeometricElementDisplayStateProps) => Promise<void>>;
81
63
  }
82
64
  /**
83
- * Properties for `ModelsTreeVisibilityHandler`.
65
+ * Props for `createModelsTreeVisibilityHandler`.
84
66
  * @internal
85
67
  */
86
68
  export interface ModelsTreeVisibilityHandlerProps {
@@ -89,17 +71,11 @@ export interface ModelsTreeVisibilityHandlerProps {
89
71
  imodelAccess: ECClassHierarchyInspector;
90
72
  overrides?: ModelsTreeVisibilityHandlerOverrides;
91
73
  }
92
- /**
93
- * Hierarchy based visibility handler.
94
- * When determining visibility for nodes, it should take into account the visibility of their children.
95
- * @beta
96
- */
97
- export type ModelsTreeVisibilityHandler = HierarchyVisibilityHandler;
98
74
  /**
99
75
  * Creates an instance if `ModelsTreeVisibilityHandler`.
100
76
  * @internal
101
77
  */
102
- export declare function createModelsTreeVisibilityHandler(props: ModelsTreeVisibilityHandlerProps): ModelsTreeVisibilityHandler;
78
+ export declare function createModelsTreeVisibilityHandler(props: ModelsTreeVisibilityHandlerProps): HierarchyVisibilityHandler;
103
79
  /**
104
80
  * Enables display of all given models. Also enables display of all categories and clears always and
105
81
  * never drawn lists in the viewport.
@@ -5,9 +5,10 @@
5
5
  import { concat, concatAll, defer, distinct, EMPTY, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, reduce } from "rxjs";
6
6
  import { assert } from "@itwin/core-bentley";
7
7
  import { PerModelCategoryVisibility } from "@itwin/core-frontend";
8
- import { HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
8
+ import { HierarchyFilteringPath, HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
9
9
  import { toggleAllCategories } from "../../common/CategoriesVisibilityUtils";
10
10
  import { reduceWhile, toVoidPromise } from "../../common/Rxjs";
11
+ import { createVisibilityHandlerResult } from "../../common/UseHierarchyVisibility";
11
12
  import { AlwaysAndNeverDrawnElementInfo } from "./AlwaysAndNeverDrawnElementInfo";
12
13
  import { ModelsTreeNode } from "./ModelsTreeNode";
13
14
  import { createVisibilityStatus } from "./Tooltip";
@@ -136,8 +137,7 @@ class ModelsTreeVisibilityHandlerImpl {
136
137
  partial: "subject.someModelsHidden",
137
138
  }));
138
139
  });
139
- const ovr = this._props.overrides?.getSubjectNodeVisibility;
140
- return ovr ? from(ovr(this.createOverrideProps({ ids: subjectIds }, result))) : result;
140
+ return createVisibilityHandlerResult(this, { ids: subjectIds }, result, this._props.overrides?.getSubjectNodeVisibility);
141
141
  }
142
142
  getModelVisibilityStatus(modelId) {
143
143
  const result = defer(() => {
@@ -153,8 +153,7 @@ class ModelsTreeVisibilityHandlerImpl {
153
153
  return createVisibilityStatus(state, state === "partial" ? "model.someCategoriesHidden" : `model.allCategories${state ? "Visible" : "Hidden"}`);
154
154
  }));
155
155
  });
156
- const ovr = this._props.overrides?.getModelDisplayStatus;
157
- return ovr ? from(ovr(this.createOverrideProps({ id: modelId }, result))) : result;
156
+ return createVisibilityHandlerResult(this, { id: modelId }, result, this._props.overrides?.getModelDisplayStatus);
158
157
  }
159
158
  getDefaultCategoryVisibilityStatus({ modelId, categoryId }) {
160
159
  const viewport = this._props.viewport;
@@ -188,8 +187,7 @@ class ModelsTreeVisibilityHandlerImpl {
188
187
  defaultStatus: () => this.getDefaultCategoryVisibilityStatus(props),
189
188
  });
190
189
  });
191
- const ovr = this._props.overrides?.getCategoryDisplayStatus;
192
- return ovr ? from(ovr(this.createOverrideProps(props, result))) : result;
190
+ return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getCategoryDisplayStatus);
193
191
  }
194
192
  getClassGroupingNodeDisplayStatus(node) {
195
193
  const result = defer(() => {
@@ -212,8 +210,7 @@ class ModelsTreeVisibilityHandlerImpl {
212
210
  },
213
211
  });
214
212
  });
215
- const ovr = this._props.overrides?.getElementGroupingNodeDisplayStatus;
216
- return ovr ? from(ovr(this.createOverrideProps({ node }, result))) : result;
213
+ return createVisibilityHandlerResult(this, { node }, result, this._props.overrides?.getElementGroupingNodeDisplayStatus);
217
214
  }
218
215
  getElementOverriddenVisibility(elementId) {
219
216
  const viewport = this._props.viewport;
@@ -244,8 +241,7 @@ class ModelsTreeVisibilityHandlerImpl {
244
241
  status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });
245
242
  return of(createVisibilityStatus(status.state, status.state === "visible" ? undefined : "element.hiddenThroughCategory"));
246
243
  });
247
- const ovr = this._props.overrides?.getElementDisplayStatus;
248
- return ovr ? from(ovr(this.createOverrideProps(props, result))) : result;
244
+ return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getElementDisplayStatus);
249
245
  }
250
246
  /** Changes visibility of the items represented by the tree node. */
251
247
  changeVisibilityObs(node, on) {
@@ -373,8 +369,7 @@ class ModelsTreeVisibilityHandlerImpl {
373
369
  }
374
370
  return from(this._idsCache.getSubjectModelIds(ids)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));
375
371
  });
376
- const ovr = this._props.overrides?.changeSubjectNodeState;
377
- return ovr ? from(ovr(this.createVoidOverrideProps({ ids, on }, result))) : result;
372
+ return createVisibilityHandlerResult(this, { ids, on }, result, this._props.overrides?.changeSubjectNodeState);
378
373
  }
379
374
  changeModelState(props) {
380
375
  const result = defer(() => {
@@ -395,8 +390,7 @@ class ModelsTreeVisibilityHandlerImpl {
395
390
  return from(this._idsCache.getModelCategories(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })));
396
391
  })));
397
392
  });
398
- const ovr = this._props.overrides?.changeModelState;
399
- return ovr ? from(ovr(this.createVoidOverrideProps(props, result))) : result;
393
+ return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeModelState);
400
394
  }
401
395
  showModelWithoutAnyCategoriesOrElements(modelId) {
402
396
  const viewport = this._props.viewport;
@@ -438,8 +432,7 @@ class ModelsTreeVisibilityHandlerImpl {
438
432
  return this.clearAlwaysAndNeverDrawnElements(props);
439
433
  }));
440
434
  });
441
- const ovr = this._props.overrides?.changeCategoryState;
442
- return ovr ? from(ovr(this.createVoidOverrideProps(props, result))) : result;
435
+ return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeCategoryState);
443
436
  }
444
437
  /**
445
438
  * Updates visibility of all grouping node's elements.
@@ -456,8 +449,7 @@ class ModelsTreeVisibilityHandlerImpl {
456
449
  return from(elementIds).pipe(this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault }));
457
450
  }));
458
451
  });
459
- const ovr = this._props.overrides?.changeElementGroupingNodeState;
460
- return ovr ? from(ovr(this.createVoidOverrideProps({ node, on }, result))) : result;
452
+ return createVisibilityHandlerResult(this, { node, on }, result, this._props.overrides?.changeElementGroupingNodeState);
461
453
  }
462
454
  /**
463
455
  * Updates visibility of an element and all its child elements by adding them to the always/never drawn list.
@@ -473,8 +465,7 @@ class ModelsTreeVisibilityHandlerImpl {
473
465
  return of(elementId).pipe(this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault }));
474
466
  }));
475
467
  });
476
- const ovr = this._props.overrides?.changeElementState;
477
- return ovr ? from(ovr(this.createVoidOverrideProps(props, result))) : result;
468
+ return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeElementState);
478
469
  }
479
470
  changeElementStateNoChildrenOperator(props) {
480
471
  return (elementIds) => {
@@ -582,20 +573,6 @@ class ModelsTreeVisibilityHandlerImpl {
582
573
  }
583
574
  }));
584
575
  }
585
- createVoidOverrideProps(props, obs) {
586
- return {
587
- ...props,
588
- originalImplementation: async () => toVoidPromise(obs),
589
- handler: this,
590
- };
591
- }
592
- createOverrideProps(props, obs) {
593
- return {
594
- ...props,
595
- originalImplementation: async () => firstValueFrom(obs),
596
- handler: this,
597
- };
598
- }
599
576
  getGroupingNodeInfo(node) {
600
577
  const modelId = ModelsTreeNode.getModelId(node);
601
578
  const categoryId = ModelsTreeNode.getCategoryId(node);
@@ -659,7 +636,7 @@ function setIntersection(lhs, rhs) {
659
636
  return result;
660
637
  }
661
638
  function reduceFilterPaths(filteringPaths) {
662
- let paths = filteringPaths.map((filteringPath) => ("path" in filteringPath ? filteringPath.path : filteringPath));
639
+ let paths = filteringPaths.map((filteringPath) => HierarchyFilteringPath.normalize(filteringPath).path);
663
640
  const sorted = [...paths].sort((a, b) => a.length - b.length);
664
641
  paths = [];
665
642
  for (const path of sorted) {
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../src/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.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 { concat, concatAll, defer, distinct, EMPTY, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, reduce } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { toggleAllCategories } from \"../../common/CategoriesVisibilityUtils\";\nimport { reduceWhile, toVoidPromise } from \"../../common/Rxjs\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"./AlwaysAndNeverDrawnElementInfo\";\nimport { ModelsTreeNode } from \"./ModelsTreeNode\";\nimport { createVisibilityStatus } from \"./Tooltip\";\nimport { createVisibilityChangeEventListener } from \"./VisibilityChangeEventListener\";\n\nimport type { Observable, OperatorFunction } from \"rxjs\";\nimport type { ModelsTreeIdsCache } from \"./ModelsTreeIdsCache\";\nimport type { Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { createHierarchyProvider, GroupingHierarchyNode, HierarchyNodeIdentifiersPath } from \"@itwin/presentation-hierarchies\";\nimport type { AlwaysOrNeverDrawnElementsQueryProps } from \"./AlwaysAndNeverDrawnElementInfo\";\nimport type { IVisibilityChangeEventListener } from \"./VisibilityChangeEventListener\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { NonPartialVisibilityStatus, Visibility } from \"./Tooltip\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\n\ntype HierarchyProviderProps = Parameters<typeof createHierarchyProvider>[0];\ntype HierarchyFilteringPaths = NonNullable<NonNullable<HierarchyProviderProps[\"filtering\"]>[\"paths\"]>;\n\n/** @beta */\ninterface GetCategoryStatusProps {\n categoryId: Id64String;\n modelId: Id64String;\n}\n\n/** @beta */\ninterface ChangeCategoryStateProps extends GetCategoryStatusProps {\n on: boolean;\n}\n\n/** @beta */\ninterface GetElementStateProps {\n elementId: Id64String;\n modelId: Id64String;\n categoryId: Id64String;\n}\n\n/** @beta */\ninterface GetFilteredNodeVisibilityProps {\n parentKeys: HierarchyNodeKey[];\n filterPaths: HierarchyFilteringPaths;\n}\n\n/** @beta */\ninterface ChangeFilteredNodeVisibilityProps extends GetFilteredNodeVisibilityProps {\n on: boolean;\n}\n\n/** @beta */\ninterface ChangeElementStateProps extends GetElementStateProps {\n on: boolean;\n}\n\n/** @beta */\ninterface ChangeModelStateProps {\n ids: Id64Arg;\n on: boolean;\n}\n\nexport const SUBJECT_CLASS_NAME = \"BisCore.Subject\" as const;\nexport const MODEL_CLASS_NAME = \"BisCore.GeometricModel3d\" as const;\nexport const CATEGORY_CLASS_NAME = \"BisCore.SpatialCategory\" as const;\nexport const ELEMENT_CLASS_NAME = \"BisCore.GeometricElement3d\" as const;\n\ntype CategoryKey = `${Id64String}-${Id64String}`;\ntype ElementKey = `${CategoryKey}-${Id64String}`;\n\nfunction createCategoryKey(modelId: string, categoryId: string): CategoryKey {\n return `${modelId}-${categoryId}`;\n}\n\nfunction parseCategoryKey(key: CategoryKey) {\n const [modelId, categoryId] = key.split(\"-\");\n return { modelId, categoryId };\n}\n\nfunction createElementKey(modelId: string, categoryId: string, elementId: string): ElementKey {\n return `${modelId}-${categoryId}-${elementId}`;\n}\n\nfunction parseElementKey(key: ElementKey) {\n const [modelId, categoryId, elementId] = key.split(\"-\");\n return { modelId, categoryId, elementId };\n}\n\ninterface FilterTargets {\n subjects?: Set<Id64String>;\n models?: Set<Id64String>;\n categories?: Set<CategoryKey>;\n elements?: Set<ElementKey>;\n}\n\n/**\n * Properties for a method of `ModelsTreeVisibilityHandler` that can be overridden.\n * @beta\n */\ntype OverridableMethodProps<TFunc> = TFunc extends (props: infer TProps) => infer TResult\n ? TProps & {\n /** A callback that produces the value from the original implementation. */\n readonly originalImplementation: () => TResult;\n /**\n * Reference to the hierarchy based handler.\n * @note Calling `getVisibility` or `changeVisibility` of this object invokes the overridden implementation as well.\n */\n readonly handler: ModelsTreeVisibilityHandler;\n }\n : never;\n\n/**\n * Function type for an overridden method of `ModelsTreeVisibilityHandler`.\n * @beta\n */\ntype OverridableMethod<TFunc> = TFunc extends (...args: any[]) => infer TResult ? (props: OverridableMethodProps<TFunc>) => TResult : never;\n\n/**\n * Functionality of `ModelsTreeVisibilityHandler` that can be overridden.\n * Each callback will be provided original implementation and reference to a `HierarchyVisibilityHandler`.\n * @beta\n */\nexport interface ModelsTreeVisibilityHandlerOverrides {\n getSubjectNodeVisibility?: OverridableMethod<(props: { ids: Id64Array }) => Promise<VisibilityStatus>>;\n getModelDisplayStatus?: OverridableMethod<(props: { id: Id64String }) => Promise<VisibilityStatus>>;\n getCategoryDisplayStatus?: OverridableMethod<(props: GetCategoryStatusProps) => Promise<VisibilityStatus>>;\n getElementGroupingNodeDisplayStatus?: OverridableMethod<(props: { node: GroupingHierarchyNode }) => Promise<VisibilityStatus>>;\n getElementDisplayStatus?: OverridableMethod<(props: GetElementStateProps) => Promise<VisibilityStatus>>;\n\n changeSubjectNodeState?: OverridableMethod<(props: { ids: Id64Array; on: boolean }) => Promise<void>>;\n changeModelState?: OverridableMethod<(props: ChangeModelStateProps) => Promise<void>>;\n changeCategoryState?: OverridableMethod<(props: ChangeCategoryStateProps) => Promise<void>>;\n changeElementGroupingNodeState?: OverridableMethod<(props: { node: GroupingHierarchyNode; on: boolean }) => Promise<void>>;\n changeElementState?: OverridableMethod<(props: ChangeElementStateProps) => Promise<void>>;\n}\n\n/**\n * Properties for `ModelsTreeVisibilityHandler`.\n * @internal\n */\nexport interface ModelsTreeVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: ModelsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n overrides?: ModelsTreeVisibilityHandlerOverrides;\n}\n\n/**\n * Hierarchy based visibility handler.\n * When determining visibility for nodes, it should take into account the visibility of their children.\n * @beta\n */\nexport type ModelsTreeVisibilityHandler = HierarchyVisibilityHandler;\n\n/**\n * Creates an instance if `ModelsTreeVisibilityHandler`.\n * @internal\n */\nexport function createModelsTreeVisibilityHandler(props: ModelsTreeVisibilityHandlerProps): ModelsTreeVisibilityHandler {\n return new ModelsTreeVisibilityHandlerImpl(props);\n}\n\nclass ModelsTreeVisibilityHandlerImpl implements ModelsTreeVisibilityHandler {\n private readonly _eventListener: IVisibilityChangeEventListener;\n private readonly _alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n private readonly _idsCache: ModelsTreeIdsCache;\n\n constructor(private readonly _props: ModelsTreeVisibilityHandlerProps) {\n this._eventListener = createVisibilityChangeEventListener(_props.viewport);\n this._alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(_props.viewport);\n this._idsCache = this._props.idsCache;\n }\n\n // istanbul ignore next\n public get onVisibilityChange() {\n return this._eventListener.onVisibilityChange;\n }\n\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n return firstValueFrom(this.getVisibilityStatusObs(node));\n }\n\n public async changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void> {\n return toVoidPromise(this.changeVisibilityObs(node, shouldDisplay));\n }\n\n public dispose(): void {\n this._eventListener.dispose();\n this._alwaysAndNeverDrawnElements.dispose();\n }\n\n private getVisibilityStatusObs(node: HierarchyNode): Observable<VisibilityStatus> {\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.getFilteredNodeVisibility({\n parentKeys: [...node.parentKeys, node.key],\n filterPaths: node.filtering.filteredChildrenIdentifierPaths,\n });\n }\n\n if (HierarchyNode.isClassGroupingNode(node)) {\n return this.getClassGroupingNodeDisplayStatus(node);\n }\n\n if (!HierarchyNode.isInstancesNode(node)) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n // note: subject nodes may be merged to represent multiple subject instances\n return this.getSubjectNodeVisibilityStatus(node.key.instanceKeys.map((key) => key.id));\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.getModelVisibilityStatus(node.key.instanceKeys[0].id);\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n if (!modelId) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.getCategoryDisplayStatus({\n categoryId: node.key.instanceKeys[0].id,\n modelId,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n if (!categoryId) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n return this.getElementDisplayStatus({\n elementId: node.key.instanceKeys[0].id,\n modelId,\n categoryId,\n });\n }\n\n private getFilteredNodeVisibility({ parentKeys, filterPaths }: GetFilteredNodeVisibilityProps) {\n return from(this.getFilterTargets({ parentKeys, filterPaths })).pipe(\n mergeMap(({ subjects, models, categories, elements }) => {\n const observables = new Array<Observable<VisibilityStatus>>();\n if (subjects?.size) {\n observables.push(this.getSubjectNodeVisibilityStatus([...subjects]));\n }\n\n if (models?.size) {\n observables.push(from(models).pipe(mergeMap((modelId) => this.getModelVisibilityStatus(modelId))));\n }\n\n if (categories?.size) {\n observables.push(\n from(categories).pipe(\n mergeMap((key) => {\n const { modelId, categoryId } = parseCategoryKey(key);\n return this.getCategoryDisplayStatus({ modelId, categoryId });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n observables.push(\n from(elements).pipe(\n mergeMap((key) => {\n const { modelId, categoryId, elementId } = parseElementKey(key);\n return this.getElementDisplayStatus({ modelId, categoryId, elementId });\n }),\n ),\n );\n }\n\n return merge(...observables);\n }),\n map((x) => x.state),\n getVisibilityFromTreeNodeChildren,\n map((x) => {\n assert(x !== \"empty\");\n return createVisibilityStatus(x);\n }),\n );\n }\n\n private getSubjectNodeVisibilityStatus(subjectIds: Id64Array): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this._props.viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", \"subject.nonSpatialView\"));\n }\n\n return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(\n concatAll(),\n distinct(),\n mergeMap((modelId) => this.getModelVisibilityStatus(modelId)),\n map((x) => x.state),\n getVisibilityStatusFromTreeNodeChildren({\n visible: \"subject.allModelsVisible\",\n hidden: \"subject.allModelsHidden\",\n partial: \"subject.someModelsHidden\",\n }),\n );\n });\n\n const ovr = this._props.overrides?.getSubjectNodeVisibility;\n return ovr ? from(ovr(this.createOverrideProps({ ids: subjectIds }, result))) : result;\n }\n\n private getModelVisibilityStatus(modelId: Id64String): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n if (!viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", \"model.nonSpatialView\"));\n }\n\n if (!viewport.view.viewsModel(modelId)) {\n return of(createVisibilityStatus(\"hidden\", \"model.hiddenThroughModelSelector\"));\n }\n\n return from(this._idsCache.getModelCategories(modelId)).pipe(\n concatAll(),\n mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryId })),\n map((x) => x.state),\n getVisibilityFromTreeNodeChildren,\n map((visibilityByCategories) => {\n const state = visibilityByCategories === \"empty\" ? \"visible\" : visibilityByCategories;\n return createVisibilityStatus(state, state === \"partial\" ? \"model.someCategoriesHidden\" : `model.allCategories${state ? \"Visible\" : \"Hidden\"}`);\n }),\n );\n });\n\n const ovr = this._props.overrides?.getModelDisplayStatus;\n return ovr ? from(ovr(this.createOverrideProps({ id: modelId }, result))) : result;\n }\n\n private getDefaultCategoryVisibilityStatus({ modelId, categoryId }: { categoryId: Id64String; modelId: Id64String }): NonPartialVisibilityStatus {\n const viewport = this._props.viewport;\n\n if (!viewport.view.viewsModel(modelId)) {\n return createVisibilityStatus(\"hidden\", \"category.hiddenThroughModel\");\n }\n\n switch (this._props.viewport.perModelCategoryVisibility.getOverride(modelId, categoryId)) {\n case PerModelCategoryVisibility.Override.Show:\n return createVisibilityStatus(\"visible\", \"category.displayedThroughPerModelOverride\");\n case PerModelCategoryVisibility.Override.Hide:\n return createVisibilityStatus(\"hidden\", \"category.hiddenThroughPerModelOverride\");\n }\n\n const isVisible = viewport.view.viewsCategory(categoryId);\n return isVisible\n ? createVisibilityStatus(\"visible\", \"category.displayedThroughCategorySelector\")\n : createVisibilityStatus(\"hidden\", \"category.hiddenThroughCategorySelector\");\n }\n\n private getCategoryDisplayStatus(props: GetCategoryStatusProps): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this._props.viewport.view.viewsModel(props.modelId)) {\n return of(createVisibilityStatus(\"hidden\", \"category.hiddenThroughModel\"));\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n queryProps: props,\n tooltips: {\n allElementsInAlwaysDrawnList: \"category.allElementsVisible\",\n allElementsInNeverDrawnList: \"category.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"category.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"category.allElementsHidden\",\n },\n defaultStatus: () => this.getDefaultCategoryVisibilityStatus(props),\n });\n });\n\n const ovr = this._props.overrides?.getCategoryDisplayStatus;\n return ovr ? from(ovr(this.createOverrideProps(props, result))) : result;\n }\n\n private getClassGroupingNodeDisplayStatus(node: GroupingHierarchyNode): Observable<VisibilityStatus> {\n const result = defer(() => {\n const info = this.getGroupingNodeInfo(node);\n\n const { modelId, categoryId, elementIds } = info;\n if (!this._props.viewport.view.viewsModel(modelId)) {\n return of(createVisibilityStatus(\"hidden\"));\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n elements: elementIds,\n defaultStatus: () => {\n const status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n return createVisibilityStatus(status.state, `groupingNode.${status.state}ThroughCategory`);\n },\n tooltips: {\n allElementsInAlwaysDrawnList: \"groupingNode.allElementsVisible\",\n allElementsInNeverDrawnList: \"groupingNode.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"groupingNode.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"groupingNode.allElementsHidden\",\n },\n });\n });\n\n const ovr = this._props.overrides?.getElementGroupingNodeDisplayStatus;\n return ovr ? from(ovr(this.createOverrideProps({ node }, result))) : result;\n }\n\n private getElementOverriddenVisibility(elementId: string): NonPartialVisibilityStatus | undefined {\n const viewport = this._props.viewport;\n if (viewport.neverDrawn?.has(elementId)) {\n return createVisibilityStatus(\"hidden\", \"element.hiddenThroughNeverDrawnList\");\n }\n\n if (viewport.alwaysDrawn?.size) {\n if (viewport.alwaysDrawn.has(elementId)) {\n return createVisibilityStatus(\"visible\", \"element.displayedThroughAlwaysDrawnList\");\n }\n\n if (viewport.isAlwaysDrawnExclusive) {\n return createVisibilityStatus(\"hidden\", \"element.hiddenDueToOtherElementsExclusivelyAlwaysDrawn\");\n }\n }\n\n return undefined;\n }\n\n private getElementDisplayStatus(props: GetElementStateProps): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n const { elementId, modelId, categoryId } = props;\n\n if (!viewport.view.viewsModel(modelId)) {\n return of(createVisibilityStatus(\"hidden\", \"element.hiddenThroughModel\"));\n }\n\n let status = this.getElementOverriddenVisibility(elementId);\n if (status) {\n return of(status);\n }\n\n status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n return of(createVisibilityStatus(status.state, status.state === \"visible\" ? undefined : \"element.hiddenThroughCategory\"));\n });\n\n const ovr = this._props.overrides?.getElementDisplayStatus;\n return ovr ? from(ovr(this.createOverrideProps(props, result))) : result;\n }\n\n /** Changes visibility of the items represented by the tree node. */\n private changeVisibilityObs(node: HierarchyNode, on: boolean): Observable<void> {\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.changeFilteredNodeVisibility({\n parentKeys: [...node.parentKeys, node.key],\n filterPaths: node.filtering.filteredChildrenIdentifierPaths,\n on,\n });\n }\n\n if (HierarchyNode.isClassGroupingNode(node)) {\n return this.changeElementGroupingNodeState(node, on);\n }\n\n // istanbul ignore if\n if (!HierarchyNode.isInstancesNode(node)) {\n return EMPTY;\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n return this.changeSubjectNodeState(\n node.key.instanceKeys.map((key) => key.id),\n on,\n );\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.changeModelState({ ids: node.key.instanceKeys[0].id, on });\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n // istanbul ignore if\n if (!modelId) {\n return EMPTY;\n }\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.changeCategoryState({\n categoryId: node.key.instanceKeys[0].id,\n modelId,\n on,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n // istanbul ignore if\n if (!categoryId) {\n // istanbul ignore next\n return EMPTY;\n }\n\n return this.changeElementState({\n elementId: node.key.instanceKeys[0].id,\n modelId,\n categoryId,\n on,\n });\n }\n\n private async getFilterTargets({ parentKeys, filterPaths }: GetFilteredNodeVisibilityProps) {\n const filterTargets: FilterTargets = {};\n\n function addFilterTarget(targetType: \"subjects\" | \"models\", value: Id64String): void;\n function addFilterTarget(targetType: \"categories\", value: CategoryKey): void;\n function addFilterTarget(targetType: \"elements\", value: ElementKey): void;\n function addFilterTarget(targetType: keyof FilterTargets, value: string) {\n ((filterTargets as Record<keyof FilterTargets, Set<string>>)[targetType] ??= new Set()).add(value);\n }\n\n const imodelAccess = this._props.imodelAccess;\n\n // Remove all paths such that there are paths to any of the ancestors of the filter target.\n const paths = reduceFilterPaths(filterPaths);\n\n await Promise.all(\n paths.map(async (path) => {\n const target = path[path.length - 1];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(target)) {\n return;\n }\n\n const previousPath = path.slice(0, path.length - 1);\n\n if (await imodelAccess.classDerivesFrom(target.className, SUBJECT_CLASS_NAME)) {\n addFilterTarget(\"subjects\", target.id);\n return;\n }\n\n if (await imodelAccess.classDerivesFrom(target.className, MODEL_CLASS_NAME)) {\n addFilterTarget(\"models\", target.id);\n return;\n }\n\n if (await imodelAccess.classDerivesFrom(target.className, CATEGORY_CLASS_NAME)) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const modelId = await this.findClassIdInFilterPath(previousPath, parentKeys, MODEL_CLASS_NAME);\n addFilterTarget(\"categories\", createCategoryKey(modelId, target.id));\n return;\n }\n\n const [modelId, categoryId] = await Promise.all([\n this.findClassIdInFilterPath(previousPath, parentKeys, MODEL_CLASS_NAME),\n this.findClassIdInFilterPath(previousPath, parentKeys, CATEGORY_CLASS_NAME),\n ]);\n addFilterTarget(\"elements\", createElementKey(modelId, categoryId, target.id));\n\n // Add parent elements to the filter targets as well\n for (let idx = path.length - 1; idx >= 0; --idx) {\n const pathIdentifier = path[idx];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(pathIdentifier)) {\n continue;\n }\n\n if (!(await imodelAccess.classDerivesFrom(pathIdentifier.className, ELEMENT_CLASS_NAME))) {\n break;\n }\n addFilterTarget(\"elements\", createElementKey(modelId, categoryId, pathIdentifier.id));\n }\n }),\n );\n\n return filterTargets;\n }\n\n private changeFilteredNodeVisibility({ on, ...props }: ChangeFilteredNodeVisibilityProps) {\n return from(this.getFilterTargets(props)).pipe(\n mergeMap(({ subjects, models, categories, elements }) => {\n const observables = new Array<Observable<void>>();\n if (subjects?.size) {\n observables.push(this.changeSubjectNodeState([...subjects], on));\n }\n\n if (models?.size) {\n observables.push(this.changeModelState({ ids: models, on }));\n }\n\n if (categories?.size) {\n observables.push(\n from(categories).pipe(\n mergeMap((key) => {\n const { modelId, categoryId } = parseCategoryKey(key);\n return this.changeCategoryState({ modelId, categoryId, on });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n observables.push(\n from(elements).pipe(\n mergeMap((key) => {\n const { modelId, categoryId, elementId } = parseElementKey(key);\n return this.changeElementState({ modelId, categoryId, elementId, on });\n }),\n ),\n );\n }\n\n return merge(...observables);\n }),\n );\n }\n\n private changeSubjectNodeState(ids: Id64Array, on: boolean): Observable<void> {\n const result = defer(() => {\n // istanbul ignore if\n if (!this._props.viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n return from(this._idsCache.getSubjectModelIds(ids)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));\n });\n\n const ovr = this._props.overrides?.changeSubjectNodeState;\n return ovr ? from(ovr(this.createVoidOverrideProps({ ids, on }, result))) : result;\n }\n\n private changeModelState(props: ChangeModelStateProps): Observable<void> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n // istanbul ignore if\n if (!viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n const { ids, on } = props;\n if (!on) {\n viewport.changeModelDisplay(ids, false);\n return EMPTY;\n }\n\n return concat(\n defer(() => {\n viewport.perModelCategoryVisibility.clearOverrides(ids);\n return from(viewport.addViewedModels(ids));\n }),\n (typeof ids === \"string\" ? of(ids) : from(ids)).pipe(\n mergeMap((modelId) => {\n return from(this._idsCache.getModelCategories(modelId)).pipe(\n concatAll(),\n mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })),\n );\n }),\n ),\n );\n });\n const ovr = this._props.overrides?.changeModelState;\n return ovr ? from(ovr(this.createVoidOverrideProps(props, result))) : result;\n }\n\n private showModelWithoutAnyCategoriesOrElements(modelId: Id64String) {\n const viewport = this._props.viewport;\n return forkJoin({\n categories: this._idsCache.getModelCategories(modelId),\n alwaysDrawnElements: this.getAlwaysDrawnElements({ modelId }),\n }).pipe(\n mergeMap(async ({ categories, alwaysDrawnElements }) => {\n const alwaysDrawn = this._props.viewport.alwaysDrawn;\n if (alwaysDrawn && alwaysDrawnElements) {\n viewport.setAlwaysDrawn(setDifference(alwaysDrawn, alwaysDrawnElements));\n }\n categories.forEach((categoryId) => {\n this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false);\n });\n await viewport.addViewedModels(modelId);\n }),\n );\n }\n\n private changeCategoryStateInViewportAccordingToModelVisibility(modelId: string, categoryId: string, on: boolean) {\n const viewport = this._props.viewport;\n const isDisplayedInSelector = viewport.view.viewsCategory(categoryId);\n const override =\n on === isDisplayedInSelector\n ? PerModelCategoryVisibility.Override.None\n : on\n ? PerModelCategoryVisibility.Override.Show\n : PerModelCategoryVisibility.Override.Hide;\n viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, override);\n if (override === PerModelCategoryVisibility.Override.None && on) {\n // we took off the override which means the category is displayed in selector, but\n // doesn't mean all its subcategories are displayed - this call ensures that\n viewport.changeCategoryDisplay(categoryId, true, true);\n }\n }\n\n private changeCategoryState(props: ChangeCategoryStateProps): Observable<void> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n const { modelId, categoryId, on } = props;\n return concat(\n props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on);\n return this.clearAlwaysAndNeverDrawnElements(props);\n }),\n );\n });\n\n const ovr = this._props.overrides?.changeCategoryState;\n return ovr ? from(ovr(this.createVoidOverrideProps(props, result))) : result;\n }\n\n /**\n * Updates visibility of all grouping node's elements.\n * @see `changeElementState`\n */\n private changeElementGroupingNodeState(node: GroupingHierarchyNode, on: boolean): Observable<void> {\n const result = defer(() => {\n const info = this.getGroupingNodeInfo(node);\n\n const { modelId, categoryId, elementIds } = info;\n const viewport = this._props.viewport;\n return concat(\n on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n const isDisplayedByDefault = categoryVisibility.state === \"visible\";\n return from(elementIds).pipe(this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault }));\n }),\n );\n });\n\n const ovr = this._props.overrides?.changeElementGroupingNodeState;\n return ovr ? from(ovr(this.createVoidOverrideProps({ node, on }, result))) : result;\n }\n\n /**\n * Updates visibility of an element and all its child elements by adding them to the always/never drawn list.\n * @note If element is to be enabled and model is hidden, it will be enabled.\n */\n private changeElementState(props: ChangeElementStateProps): Observable<void> {\n const result = defer(() => {\n const { elementId, on, modelId, categoryId } = props;\n const viewport = this._props.viewport;\n return concat(\n props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n const isDisplayedByDefault = categoryVisibility.state === \"visible\";\n return of(elementId).pipe(this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault }));\n }),\n );\n });\n\n const ovr = this._props.overrides?.changeElementState;\n return ovr ? from(ovr(this.createVoidOverrideProps(props, result))) : result;\n }\n\n private changeElementStateNoChildrenOperator(props: { on: boolean; isDisplayedByDefault: boolean }): OperatorFunction<string, void> {\n return (elementIds: Observable<Id64String>) => {\n const { on, isDisplayedByDefault } = props;\n const isAlwaysDrawnExclusive = this._props.viewport.isAlwaysDrawnExclusive;\n return elementIds.pipe(\n reduce(\n (acc, elementId) => {\n if (on) {\n const wasRemoved = acc.neverDrawn.delete(elementId);\n acc.changedNeverDrawn ||= wasRemoved;\n // If exclusive mode is enabled, we must add the element to the always drawn list.\n if ((!isDisplayedByDefault || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {\n acc.alwaysDrawn.add(elementId);\n acc.changedAlwaysDrawn = true;\n }\n } else {\n const wasRemoved = acc.alwaysDrawn.delete(elementId);\n acc.changedAlwaysDrawn ||= wasRemoved;\n // If exclusive mode is not enabled, we have to add the element to the never drawn list.\n if (isDisplayedByDefault && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {\n acc.neverDrawn.add(elementId);\n acc.changedNeverDrawn = true;\n }\n }\n return acc;\n },\n {\n changedNeverDrawn: false,\n changedAlwaysDrawn: false,\n neverDrawn: new Set(this._props.viewport.neverDrawn || []),\n alwaysDrawn: new Set(this._props.viewport.alwaysDrawn || []),\n },\n ),\n map((state) => {\n state.changedNeverDrawn && this._props.viewport.setNeverDrawn(state.neverDrawn);\n state.changedAlwaysDrawn && this._props.viewport.setAlwaysDrawn(state.alwaysDrawn, this._props.viewport.isAlwaysDrawnExclusive);\n }),\n );\n };\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElementsImpl(\n props: {\n alwaysDrawn: Id64Set | undefined;\n neverDrawn: Id64Set | undefined;\n totalCount: number;\n } & GetVisibilityFromAlwaysAndNeverDrawnElementsProps,\n ): VisibilityStatus {\n const { alwaysDrawn, neverDrawn, totalCount } = props;\n\n if (neverDrawn?.size === totalCount) {\n return createVisibilityStatus(\"hidden\", props.tooltips.allElementsInNeverDrawnList);\n }\n\n if (alwaysDrawn?.size === totalCount) {\n return createVisibilityStatus(\"visible\", props.tooltips.allElementsInAlwaysDrawnList);\n }\n\n const viewport = this._props.viewport;\n if (viewport.isAlwaysDrawnExclusive && viewport.alwaysDrawn?.size) {\n return alwaysDrawn?.size\n ? createVisibilityStatus(\"partial\", props.tooltips.elementsInBothAlwaysAndNeverDrawn)\n : createVisibilityStatus(\"hidden\", props.tooltips.noElementsInExclusiveAlwaysDrawnList);\n }\n\n const status = props.defaultStatus();\n if ((status.state === \"visible\" && neverDrawn?.size) || (status.state === \"hidden\" && alwaysDrawn?.size)) {\n return createVisibilityStatus(\"partial\");\n }\n return status;\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElements(\n props: GetVisibilityFromAlwaysAndNeverDrawnElementsProps & ({ elements: Id64Set } | { queryProps: AlwaysOrNeverDrawnElementsQueryProps }),\n ): Observable<VisibilityStatus> {\n const viewport = this._props.viewport;\n if (viewport.isAlwaysDrawnExclusive) {\n if (!viewport?.alwaysDrawn?.size) {\n return of(createVisibilityStatus(\"hidden\", props.tooltips.noElementsInExclusiveAlwaysDrawnList));\n }\n } else if (!viewport?.neverDrawn?.size && !viewport?.alwaysDrawn?.size) {\n return of(props.defaultStatus());\n }\n\n if (\"elements\" in props) {\n return of(\n this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n alwaysDrawn: viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : undefined,\n neverDrawn: viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : undefined,\n totalCount: props.elements.size,\n }),\n );\n }\n\n const { modelId, categoryId } = props.queryProps;\n const totalCount = categoryId ? this._idsCache.getCategoryElementsCount(modelId, categoryId) : this._idsCache.getModelElementCount(modelId);\n return forkJoin({\n totalCount,\n alwaysDrawn: this.getAlwaysDrawnElements(props.queryProps),\n neverDrawn: this.getNeverDrawnElements(props.queryProps),\n }).pipe(\n map((state) => {\n return this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n ...state,\n });\n }),\n );\n }\n\n private getAlwaysDrawnElements(props: AlwaysOrNeverDrawnElementsQueryProps) {\n return this._alwaysAndNeverDrawnElements.getElements({ ...props, setType: \"always\" });\n }\n\n private getNeverDrawnElements(props: AlwaysOrNeverDrawnElementsQueryProps) {\n return this._alwaysAndNeverDrawnElements.getElements({ ...props, setType: \"never\" });\n }\n\n private clearAlwaysAndNeverDrawnElements(props: Omit<AlwaysOrNeverDrawnElementsQueryProps, \"setType\">) {\n return forkJoin({\n alwaysDrawn: this.getAlwaysDrawnElements(props),\n neverDrawn: this.getNeverDrawnElements(props),\n }).pipe(\n map(({ alwaysDrawn, neverDrawn }) => {\n const viewport = this._props.viewport;\n if (viewport.alwaysDrawn?.size && alwaysDrawn.size) {\n viewport.setAlwaysDrawn(setDifference(viewport.alwaysDrawn, alwaysDrawn));\n }\n if (viewport.neverDrawn?.size && neverDrawn.size) {\n viewport.setNeverDrawn(setDifference(viewport.neverDrawn, neverDrawn));\n }\n }),\n );\n }\n\n private createVoidOverrideProps<TProps>(props: TProps, obs: Observable<void>): OverridableMethodProps<(props: TProps) => Promise<void>> {\n return {\n ...props,\n originalImplementation: async () => toVoidPromise(obs),\n handler: this,\n };\n }\n\n private createOverrideProps<TProps, TObservable extends Observable<any>>(\n props: TProps,\n obs: TObservable,\n ): TObservable extends Observable<infer T> ? OverridableMethodProps<(props: TProps) => Promise<T>> : never;\n private createOverrideProps<TProps, TObservable extends Observable<unknown>>(\n props: TProps,\n obs: TObservable,\n ): OverridableMethodProps<(props: TProps) => Promise<unknown>> {\n return {\n ...props,\n originalImplementation: async () => firstValueFrom(obs),\n handler: this,\n };\n }\n\n private getGroupingNodeInfo(node: GroupingHierarchyNode) {\n const modelId = ModelsTreeNode.getModelId(node);\n const categoryId = ModelsTreeNode.getCategoryId(node);\n assert(!!modelId && !!categoryId);\n\n const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));\n return { modelId, categoryId, elementIds };\n }\n\n private async findClassIdInFilterPath(path: HierarchyNodeIdentifiersPath, parentKeys: HierarchyNodeKey[], className: string) {\n function* keysToCheck(): Iterable<InstanceKey> {\n for (let i = path.length - 1; i >= 0; --i) {\n const id = path[i];\n if (HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n yield id;\n }\n }\n\n for (let i = parentKeys.length - 1; i >= 0; --i) {\n const key = parentKeys[i];\n if (HierarchyNodeKey.isInstances(key)) {\n yield* key.instanceKeys;\n }\n }\n }\n\n for (const parentKey of keysToCheck()) {\n if (await this._props.imodelAccess.classDerivesFrom(parentKey.className, className)) {\n return parentKey.id;\n }\n }\n\n assert(false, () => `Cannot find an instance of ${className} in instance keys: ${JSON.stringify([...keysToCheck()], undefined, 2)}`);\n }\n}\n\ninterface GetVisibilityFromAlwaysAndNeverDrawnElementsProps {\n tooltips: {\n allElementsInNeverDrawnList: string;\n allElementsInAlwaysDrawnList: string;\n elementsInBothAlwaysAndNeverDrawn: string;\n noElementsInExclusiveAlwaysDrawnList: string;\n };\n /** Status when always/never lists are empty and exclusive mode is off */\n defaultStatus: () => VisibilityStatus;\n}\n\nfunction getVisibilityFromTreeNodeChildren(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\nfunction getVisibilityStatusFromTreeNodeChildren(tooltipMap: { [key in Visibility]: string | undefined }): OperatorFunction<Visibility, VisibilityStatus> {\n return (obs) => {\n return getVisibilityFromTreeNodeChildren(obs).pipe(\n map((visibility) => {\n if (visibility === \"empty\") {\n visibility = \"visible\";\n }\n\n return createVisibilityStatus(visibility, tooltipMap[visibility]);\n }),\n );\n };\n}\n\nfunction setDifference<T>(lhs: Set<T>, rhs: Set<T>): Set<T> {\n const result = new Set<T>();\n lhs.forEach((x) => !rhs.has(x) && result.add(x));\n return result;\n}\n\nfunction setIntersection<T>(lhs: Set<T>, rhs: Set<T>): Set<T> {\n const result = new Set<T>();\n lhs.forEach((x) => rhs.has(x) && result.add(x));\n return result;\n}\n\nfunction reduceFilterPaths(filteringPaths: HierarchyFilteringPaths) {\n let paths = filteringPaths.map((filteringPath) => (\"path\" in filteringPath ? filteringPath.path : filteringPath));\n const sorted = [...paths].sort((a, b) => a.length - b.length);\n paths = [];\n for (const path of sorted) {\n if (!arraySortedByLengthContainsPrefix(paths, path)) {\n paths.push(path);\n }\n }\n return paths;\n}\n\nfunction arraySortedByLengthContainsPrefix(targetArray: HierarchyNodeIdentifiersPath[], source: HierarchyNodeIdentifiersPath) {\n for (const targetVal of targetArray) {\n if (targetVal.length >= source.length) {\n break;\n }\n\n let isPrefix = true;\n for (let i = 0; i < targetVal.length; ++i) {\n if (!HierarchyNodeIdentifier.equal(targetVal[i], source[i])) {\n isPrefix = false;\n break;\n }\n }\n\n if (isPrefix) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n * @public\n */\nexport async function showAllModels(models: string[], viewport: Viewport) {\n await viewport.addViewedModels(models);\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n await toggleAllCategories(viewport, true);\n}\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport async function hideAllModels(models: string[], viewport: Viewport) {\n viewport.changeModelDisplay(models, false);\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport async function invertAllModels(models: string[], viewport: Viewport) {\n const notViewedModels: string[] = [];\n const viewedModels: string[] = [];\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n await viewport.addViewedModels(notViewedModels);\n viewport.changeModelDisplay(viewedModels, false);\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport async function toggleModels(models: string[], enable: boolean, viewport: Viewport) {\n // istanbul ignore if\n if (!models) {\n return;\n }\n if (enable) {\n viewport.changeModelDisplay(models, false);\n } else {\n await viewport.addViewedModels(models);\n }\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: Viewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../src/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.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 { concat, concatAll, defer, distinct, EMPTY, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, reduce } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyFilteringPath, HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { toggleAllCategories } from \"../../common/CategoriesVisibilityUtils\";\nimport { reduceWhile, toVoidPromise } from \"../../common/Rxjs\";\nimport { createVisibilityHandlerResult } from \"../../common/UseHierarchyVisibility\";\nimport { AlwaysAndNeverDrawnElementInfo } from \"./AlwaysAndNeverDrawnElementInfo\";\nimport { ModelsTreeNode } from \"./ModelsTreeNode\";\nimport { createVisibilityStatus } from \"./Tooltip\";\nimport { createVisibilityChangeEventListener } from \"./VisibilityChangeEventListener\";\n\nimport type { GroupingHierarchyNode, HierarchyNodeIdentifiersPath } from \"@itwin/presentation-hierarchies\";\nimport type { HierarchyVisibilityHandler, HierarchyVisibilityHandlerOverridableMethod, VisibilityStatus } from \"../../common/UseHierarchyVisibility\";\nimport type { Observable, OperatorFunction } from \"rxjs\";\nimport type { ModelsTreeIdsCache } from \"./ModelsTreeIdsCache\";\nimport type { Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { AlwaysOrNeverDrawnElementsQueryProps } from \"./AlwaysAndNeverDrawnElementInfo\";\nimport type { IVisibilityChangeEventListener } from \"./VisibilityChangeEventListener\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { NonPartialVisibilityStatus, Visibility } from \"./Tooltip\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\n\n/** @beta */\ninterface GetCategoryVisibilityStatusProps {\n categoryId: Id64String;\n modelId: Id64String;\n}\n\n/** @beta */\ninterface ChangeCategoryVisibilityStateProps extends GetCategoryVisibilityStatusProps {\n on: boolean;\n}\n\n/** @beta */\ninterface GetGeometricElementVisibilityStatusProps {\n elementId: Id64String;\n modelId: Id64String;\n categoryId: Id64String;\n}\n\n/** @beta */\ninterface ChangeGeometricElementDisplayStateProps extends GetGeometricElementVisibilityStatusProps {\n on: boolean;\n}\n\n/** @beta */\ninterface ChangeModelVisibilityStateProps {\n ids: Id64Arg;\n on: boolean;\n}\n\n/** @beta */\ninterface GetFilteredNodeVisibilityProps {\n parentKeys: HierarchyNodeKey[];\n filterPaths: HierarchyFilteringPath[];\n}\n\n/** @beta */\ninterface ChangeFilteredNodeVisibilityProps extends GetFilteredNodeVisibilityProps {\n on: boolean;\n}\n\nexport const SUBJECT_CLASS_NAME = \"BisCore.Subject\" as const;\nexport const MODEL_CLASS_NAME = \"BisCore.GeometricModel3d\" as const;\nexport const CATEGORY_CLASS_NAME = \"BisCore.SpatialCategory\" as const;\nexport const ELEMENT_CLASS_NAME = \"BisCore.GeometricElement3d\" as const;\n\ntype CategoryKey = `${Id64String}-${Id64String}`;\ntype ElementKey = `${CategoryKey}-${Id64String}`;\n\nfunction createCategoryKey(modelId: string, categoryId: string): CategoryKey {\n return `${modelId}-${categoryId}`;\n}\n\nfunction parseCategoryKey(key: CategoryKey) {\n const [modelId, categoryId] = key.split(\"-\");\n return { modelId, categoryId };\n}\n\nfunction createElementKey(modelId: string, categoryId: string, elementId: string): ElementKey {\n return `${modelId}-${categoryId}-${elementId}`;\n}\n\nfunction parseElementKey(key: ElementKey) {\n const [modelId, categoryId, elementId] = key.split(\"-\");\n return { modelId, categoryId, elementId };\n}\n\ninterface FilterTargets {\n subjects?: Set<Id64String>;\n models?: Set<Id64String>;\n categories?: Set<CategoryKey>;\n elements?: Set<ElementKey>;\n}\n\n/**\n * Functionality of Models tree visibility handler that can be overridden.\n * Each callback is provided original implementation and reference to a `HierarchyVisibilityHandler`.\n * @beta\n */\nexport interface ModelsTreeVisibilityHandlerOverrides {\n getSubjectNodeVisibility?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Array }) => Promise<VisibilityStatus>>;\n getModelDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: { id: Id64String }) => Promise<VisibilityStatus>>;\n getCategoryDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetCategoryVisibilityStatusProps) => Promise<VisibilityStatus>>;\n getElementGroupingNodeDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: { node: GroupingHierarchyNode }) => Promise<VisibilityStatus>>;\n getElementDisplayStatus?: HierarchyVisibilityHandlerOverridableMethod<(props: GetGeometricElementVisibilityStatusProps) => Promise<VisibilityStatus>>;\n\n changeSubjectNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: { ids: Id64Array; on: boolean }) => Promise<void>>;\n changeModelState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeModelVisibilityStateProps) => Promise<void>>;\n changeCategoryState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeCategoryVisibilityStateProps) => Promise<void>>;\n changeElementGroupingNodeState?: HierarchyVisibilityHandlerOverridableMethod<(props: { node: GroupingHierarchyNode; on: boolean }) => Promise<void>>;\n changeElementState?: HierarchyVisibilityHandlerOverridableMethod<(props: ChangeGeometricElementDisplayStateProps) => Promise<void>>;\n}\n\n/**\n * Props for `createModelsTreeVisibilityHandler`.\n * @internal\n */\nexport interface ModelsTreeVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: ModelsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n overrides?: ModelsTreeVisibilityHandlerOverrides;\n}\n\n/**\n * Creates an instance if `ModelsTreeVisibilityHandler`.\n * @internal\n */\nexport function createModelsTreeVisibilityHandler(props: ModelsTreeVisibilityHandlerProps): HierarchyVisibilityHandler {\n return new ModelsTreeVisibilityHandlerImpl(props);\n}\n\nclass ModelsTreeVisibilityHandlerImpl implements HierarchyVisibilityHandler {\n private readonly _eventListener: IVisibilityChangeEventListener;\n private readonly _alwaysAndNeverDrawnElements: AlwaysAndNeverDrawnElementInfo;\n private readonly _idsCache: ModelsTreeIdsCache;\n\n constructor(private readonly _props: ModelsTreeVisibilityHandlerProps) {\n this._eventListener = createVisibilityChangeEventListener(_props.viewport);\n this._alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(_props.viewport);\n this._idsCache = this._props.idsCache;\n }\n\n // istanbul ignore next\n public get onVisibilityChange() {\n return this._eventListener.onVisibilityChange;\n }\n\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n return firstValueFrom(this.getVisibilityStatusObs(node));\n }\n\n public async changeVisibility(node: HierarchyNode, shouldDisplay: boolean): Promise<void> {\n return toVoidPromise(this.changeVisibilityObs(node, shouldDisplay));\n }\n\n public dispose(): void {\n this._eventListener.dispose();\n this._alwaysAndNeverDrawnElements.dispose();\n }\n\n private getVisibilityStatusObs(node: HierarchyNode): Observable<VisibilityStatus> {\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.getFilteredNodeVisibility({\n parentKeys: [...node.parentKeys, node.key],\n filterPaths: node.filtering.filteredChildrenIdentifierPaths,\n });\n }\n\n if (HierarchyNode.isClassGroupingNode(node)) {\n return this.getClassGroupingNodeDisplayStatus(node);\n }\n\n if (!HierarchyNode.isInstancesNode(node)) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n // note: subject nodes may be merged to represent multiple subject instances\n return this.getSubjectNodeVisibilityStatus(node.key.instanceKeys.map((key) => key.id));\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.getModelVisibilityStatus(node.key.instanceKeys[0].id);\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n if (!modelId) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.getCategoryDisplayStatus({\n categoryId: node.key.instanceKeys[0].id,\n modelId,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n if (!categoryId) {\n return of(createVisibilityStatus(\"disabled\"));\n }\n\n return this.getElementDisplayStatus({\n elementId: node.key.instanceKeys[0].id,\n modelId,\n categoryId,\n });\n }\n\n private getFilteredNodeVisibility({ parentKeys, filterPaths }: GetFilteredNodeVisibilityProps) {\n return from(this.getFilterTargets({ parentKeys, filterPaths })).pipe(\n mergeMap(({ subjects, models, categories, elements }) => {\n const observables = new Array<Observable<VisibilityStatus>>();\n if (subjects?.size) {\n observables.push(this.getSubjectNodeVisibilityStatus([...subjects]));\n }\n\n if (models?.size) {\n observables.push(from(models).pipe(mergeMap((modelId) => this.getModelVisibilityStatus(modelId))));\n }\n\n if (categories?.size) {\n observables.push(\n from(categories).pipe(\n mergeMap((key) => {\n const { modelId, categoryId } = parseCategoryKey(key);\n return this.getCategoryDisplayStatus({ modelId, categoryId });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n observables.push(\n from(elements).pipe(\n mergeMap((key) => {\n const { modelId, categoryId, elementId } = parseElementKey(key);\n return this.getElementDisplayStatus({ modelId, categoryId, elementId });\n }),\n ),\n );\n }\n\n return merge(...observables);\n }),\n map((x) => x.state),\n getVisibilityFromTreeNodeChildren,\n map((x) => {\n assert(x !== \"empty\");\n return createVisibilityStatus(x);\n }),\n );\n }\n\n private getSubjectNodeVisibilityStatus(subjectIds: Id64Array): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this._props.viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", \"subject.nonSpatialView\"));\n }\n\n return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(\n concatAll(),\n distinct(),\n mergeMap((modelId) => this.getModelVisibilityStatus(modelId)),\n map((x) => x.state),\n getVisibilityStatusFromTreeNodeChildren({\n visible: \"subject.allModelsVisible\",\n hidden: \"subject.allModelsHidden\",\n partial: \"subject.someModelsHidden\",\n }),\n );\n });\n return createVisibilityHandlerResult(this, { ids: subjectIds }, result, this._props.overrides?.getSubjectNodeVisibility);\n }\n\n private getModelVisibilityStatus(modelId: Id64String): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n if (!viewport.view.isSpatialView()) {\n return of(createVisibilityStatus(\"disabled\", \"model.nonSpatialView\"));\n }\n\n if (!viewport.view.viewsModel(modelId)) {\n return of(createVisibilityStatus(\"hidden\", \"model.hiddenThroughModelSelector\"));\n }\n\n return from(this._idsCache.getModelCategories(modelId)).pipe(\n concatAll(),\n mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryId })),\n map((x) => x.state),\n getVisibilityFromTreeNodeChildren,\n map((visibilityByCategories) => {\n const state = visibilityByCategories === \"empty\" ? \"visible\" : visibilityByCategories;\n return createVisibilityStatus(state, state === \"partial\" ? \"model.someCategoriesHidden\" : `model.allCategories${state ? \"Visible\" : \"Hidden\"}`);\n }),\n );\n });\n return createVisibilityHandlerResult(this, { id: modelId }, result, this._props.overrides?.getModelDisplayStatus);\n }\n\n private getDefaultCategoryVisibilityStatus({ modelId, categoryId }: { categoryId: Id64String; modelId: Id64String }): NonPartialVisibilityStatus {\n const viewport = this._props.viewport;\n\n if (!viewport.view.viewsModel(modelId)) {\n return createVisibilityStatus(\"hidden\", \"category.hiddenThroughModel\");\n }\n\n switch (this._props.viewport.perModelCategoryVisibility.getOverride(modelId, categoryId)) {\n case PerModelCategoryVisibility.Override.Show:\n return createVisibilityStatus(\"visible\", \"category.displayedThroughPerModelOverride\");\n case PerModelCategoryVisibility.Override.Hide:\n return createVisibilityStatus(\"hidden\", \"category.hiddenThroughPerModelOverride\");\n }\n\n const isVisible = viewport.view.viewsCategory(categoryId);\n return isVisible\n ? createVisibilityStatus(\"visible\", \"category.displayedThroughCategorySelector\")\n : createVisibilityStatus(\"hidden\", \"category.hiddenThroughCategorySelector\");\n }\n\n private getCategoryDisplayStatus(props: GetCategoryVisibilityStatusProps): Observable<VisibilityStatus> {\n const result = defer(() => {\n if (!this._props.viewport.view.viewsModel(props.modelId)) {\n return of(createVisibilityStatus(\"hidden\", \"category.hiddenThroughModel\"));\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n queryProps: props,\n tooltips: {\n allElementsInAlwaysDrawnList: \"category.allElementsVisible\",\n allElementsInNeverDrawnList: \"category.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"category.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"category.allElementsHidden\",\n },\n defaultStatus: () => this.getDefaultCategoryVisibilityStatus(props),\n });\n });\n return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getCategoryDisplayStatus);\n }\n\n private getClassGroupingNodeDisplayStatus(node: GroupingHierarchyNode): Observable<VisibilityStatus> {\n const result = defer(() => {\n const info = this.getGroupingNodeInfo(node);\n\n const { modelId, categoryId, elementIds } = info;\n if (!this._props.viewport.view.viewsModel(modelId)) {\n return of(createVisibilityStatus(\"hidden\"));\n }\n\n return this.getVisibilityFromAlwaysAndNeverDrawnElements({\n elements: elementIds,\n defaultStatus: () => {\n const status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n return createVisibilityStatus(status.state, `groupingNode.${status.state}ThroughCategory`);\n },\n tooltips: {\n allElementsInAlwaysDrawnList: \"groupingNode.allElementsVisible\",\n allElementsInNeverDrawnList: \"groupingNode.allElementsHidden\",\n elementsInBothAlwaysAndNeverDrawn: \"groupingNode.someElementsAreHidden\",\n noElementsInExclusiveAlwaysDrawnList: \"groupingNode.allElementsHidden\",\n },\n });\n });\n return createVisibilityHandlerResult(this, { node }, result, this._props.overrides?.getElementGroupingNodeDisplayStatus);\n }\n\n private getElementOverriddenVisibility(elementId: string): NonPartialVisibilityStatus | undefined {\n const viewport = this._props.viewport;\n if (viewport.neverDrawn?.has(elementId)) {\n return createVisibilityStatus(\"hidden\", \"element.hiddenThroughNeverDrawnList\");\n }\n\n if (viewport.alwaysDrawn?.size) {\n if (viewport.alwaysDrawn.has(elementId)) {\n return createVisibilityStatus(\"visible\", \"element.displayedThroughAlwaysDrawnList\");\n }\n\n if (viewport.isAlwaysDrawnExclusive) {\n return createVisibilityStatus(\"hidden\", \"element.hiddenDueToOtherElementsExclusivelyAlwaysDrawn\");\n }\n }\n\n return undefined;\n }\n\n private getElementDisplayStatus(props: GetGeometricElementVisibilityStatusProps): Observable<VisibilityStatus> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n const { elementId, modelId, categoryId } = props;\n\n if (!viewport.view.viewsModel(modelId)) {\n return of(createVisibilityStatus(\"hidden\", \"element.hiddenThroughModel\"));\n }\n\n let status = this.getElementOverriddenVisibility(elementId);\n if (status) {\n return of(status);\n }\n\n status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n return of(createVisibilityStatus(status.state, status.state === \"visible\" ? undefined : \"element.hiddenThroughCategory\"));\n });\n return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getElementDisplayStatus);\n }\n\n /** Changes visibility of the items represented by the tree node. */\n private changeVisibilityObs(node: HierarchyNode, on: boolean): Observable<void> {\n if (node.filtering?.filteredChildrenIdentifierPaths?.length && !node.filtering.isFilterTarget) {\n return this.changeFilteredNodeVisibility({\n parentKeys: [...node.parentKeys, node.key],\n filterPaths: node.filtering.filteredChildrenIdentifierPaths,\n on,\n });\n }\n\n if (HierarchyNode.isClassGroupingNode(node)) {\n return this.changeElementGroupingNodeState(node, on);\n }\n\n // istanbul ignore if\n if (!HierarchyNode.isInstancesNode(node)) {\n return EMPTY;\n }\n\n if (ModelsTreeNode.isSubjectNode(node)) {\n return this.changeSubjectNodeState(\n node.key.instanceKeys.map((key) => key.id),\n on,\n );\n }\n\n if (ModelsTreeNode.isModelNode(node)) {\n return this.changeModelState({ ids: node.key.instanceKeys[0].id, on });\n }\n\n const modelId = ModelsTreeNode.getModelId(node);\n // istanbul ignore if\n if (!modelId) {\n return EMPTY;\n }\n\n if (ModelsTreeNode.isCategoryNode(node)) {\n return this.changeCategoryState({\n categoryId: node.key.instanceKeys[0].id,\n modelId,\n on,\n });\n }\n\n const categoryId = ModelsTreeNode.getCategoryId(node);\n // istanbul ignore if\n if (!categoryId) {\n // istanbul ignore next\n return EMPTY;\n }\n\n return this.changeElementState({\n elementId: node.key.instanceKeys[0].id,\n modelId,\n categoryId,\n on,\n });\n }\n\n private async getFilterTargets({ parentKeys, filterPaths }: GetFilteredNodeVisibilityProps) {\n const filterTargets: FilterTargets = {};\n\n function addFilterTarget(targetType: \"subjects\" | \"models\", value: Id64String): void;\n function addFilterTarget(targetType: \"categories\", value: CategoryKey): void;\n function addFilterTarget(targetType: \"elements\", value: ElementKey): void;\n function addFilterTarget(targetType: keyof FilterTargets, value: string) {\n ((filterTargets as Record<keyof FilterTargets, Set<string>>)[targetType] ??= new Set()).add(value);\n }\n\n const imodelAccess = this._props.imodelAccess;\n\n // Remove all paths such that there are paths to any of the ancestors of the filter target.\n const paths = reduceFilterPaths(filterPaths);\n\n await Promise.all(\n paths.map(async (path) => {\n const target = path[path.length - 1];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(target)) {\n return;\n }\n\n const previousPath = path.slice(0, path.length - 1);\n\n if (await imodelAccess.classDerivesFrom(target.className, SUBJECT_CLASS_NAME)) {\n addFilterTarget(\"subjects\", target.id);\n return;\n }\n\n if (await imodelAccess.classDerivesFrom(target.className, MODEL_CLASS_NAME)) {\n addFilterTarget(\"models\", target.id);\n return;\n }\n\n if (await imodelAccess.classDerivesFrom(target.className, CATEGORY_CLASS_NAME)) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const modelId = await this.findClassIdInFilterPath(previousPath, parentKeys, MODEL_CLASS_NAME);\n addFilterTarget(\"categories\", createCategoryKey(modelId, target.id));\n return;\n }\n\n const [modelId, categoryId] = await Promise.all([\n this.findClassIdInFilterPath(previousPath, parentKeys, MODEL_CLASS_NAME),\n this.findClassIdInFilterPath(previousPath, parentKeys, CATEGORY_CLASS_NAME),\n ]);\n addFilterTarget(\"elements\", createElementKey(modelId, categoryId, target.id));\n\n // Add parent elements to the filter targets as well\n for (let idx = path.length - 1; idx >= 0; --idx) {\n const pathIdentifier = path[idx];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(pathIdentifier)) {\n continue;\n }\n\n if (!(await imodelAccess.classDerivesFrom(pathIdentifier.className, ELEMENT_CLASS_NAME))) {\n break;\n }\n addFilterTarget(\"elements\", createElementKey(modelId, categoryId, pathIdentifier.id));\n }\n }),\n );\n\n return filterTargets;\n }\n\n private changeFilteredNodeVisibility({ on, ...props }: ChangeFilteredNodeVisibilityProps) {\n return from(this.getFilterTargets(props)).pipe(\n mergeMap(({ subjects, models, categories, elements }) => {\n const observables = new Array<Observable<void>>();\n if (subjects?.size) {\n observables.push(this.changeSubjectNodeState([...subjects], on));\n }\n\n if (models?.size) {\n observables.push(this.changeModelState({ ids: models, on }));\n }\n\n if (categories?.size) {\n observables.push(\n from(categories).pipe(\n mergeMap((key) => {\n const { modelId, categoryId } = parseCategoryKey(key);\n return this.changeCategoryState({ modelId, categoryId, on });\n }),\n ),\n );\n }\n\n if (elements?.size) {\n observables.push(\n from(elements).pipe(\n mergeMap((key) => {\n const { modelId, categoryId, elementId } = parseElementKey(key);\n return this.changeElementState({ modelId, categoryId, elementId, on });\n }),\n ),\n );\n }\n\n return merge(...observables);\n }),\n );\n }\n\n private changeSubjectNodeState(ids: Id64Array, on: boolean): Observable<void> {\n const result = defer(() => {\n // istanbul ignore if\n if (!this._props.viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n return from(this._idsCache.getSubjectModelIds(ids)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));\n });\n return createVisibilityHandlerResult(this, { ids, on }, result, this._props.overrides?.changeSubjectNodeState);\n }\n\n private changeModelState(props: ChangeModelVisibilityStateProps): Observable<void> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n // istanbul ignore if\n if (!viewport.view.isSpatialView()) {\n return EMPTY;\n }\n\n const { ids, on } = props;\n if (!on) {\n viewport.changeModelDisplay(ids, false);\n return EMPTY;\n }\n\n return concat(\n defer(() => {\n viewport.perModelCategoryVisibility.clearOverrides(ids);\n return from(viewport.addViewedModels(ids));\n }),\n (typeof ids === \"string\" ? of(ids) : from(ids)).pipe(\n mergeMap((modelId) => {\n return from(this._idsCache.getModelCategories(modelId)).pipe(\n concatAll(),\n mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })),\n );\n }),\n ),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeModelState);\n }\n\n private showModelWithoutAnyCategoriesOrElements(modelId: Id64String) {\n const viewport = this._props.viewport;\n return forkJoin({\n categories: this._idsCache.getModelCategories(modelId),\n alwaysDrawnElements: this.getAlwaysDrawnElements({ modelId }),\n }).pipe(\n mergeMap(async ({ categories, alwaysDrawnElements }) => {\n const alwaysDrawn = this._props.viewport.alwaysDrawn;\n if (alwaysDrawn && alwaysDrawnElements) {\n viewport.setAlwaysDrawn(setDifference(alwaysDrawn, alwaysDrawnElements));\n }\n categories.forEach((categoryId) => {\n this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false);\n });\n await viewport.addViewedModels(modelId);\n }),\n );\n }\n\n private changeCategoryStateInViewportAccordingToModelVisibility(modelId: string, categoryId: string, on: boolean) {\n const viewport = this._props.viewport;\n const isDisplayedInSelector = viewport.view.viewsCategory(categoryId);\n const override =\n on === isDisplayedInSelector\n ? PerModelCategoryVisibility.Override.None\n : on\n ? PerModelCategoryVisibility.Override.Show\n : PerModelCategoryVisibility.Override.Hide;\n viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, override);\n if (override === PerModelCategoryVisibility.Override.None && on) {\n // we took off the override which means the category is displayed in selector, but\n // doesn't mean all its subcategories are displayed - this call ensures that\n viewport.changeCategoryDisplay(categoryId, true, true);\n }\n }\n\n private changeCategoryState(props: ChangeCategoryVisibilityStateProps): Observable<void> {\n const result = defer(() => {\n const viewport = this._props.viewport;\n const { modelId, categoryId, on } = props;\n return concat(\n props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on);\n return this.clearAlwaysAndNeverDrawnElements(props);\n }),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeCategoryState);\n }\n\n /**\n * Updates visibility of all grouping node's elements.\n * @see `changeElementState`\n */\n private changeElementGroupingNodeState(node: GroupingHierarchyNode, on: boolean): Observable<void> {\n const result = defer(() => {\n const info = this.getGroupingNodeInfo(node);\n\n const { modelId, categoryId, elementIds } = info;\n const viewport = this._props.viewport;\n return concat(\n on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n const isDisplayedByDefault = categoryVisibility.state === \"visible\";\n return from(elementIds).pipe(this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault }));\n }),\n );\n });\n return createVisibilityHandlerResult(this, { node, on }, result, this._props.overrides?.changeElementGroupingNodeState);\n }\n\n /**\n * Updates visibility of an element and all its child elements by adding them to the always/never drawn list.\n * @note If element is to be enabled and model is hidden, it will be enabled.\n */\n private changeElementState(props: ChangeGeometricElementDisplayStateProps): Observable<void> {\n const result = defer(() => {\n const { elementId, on, modelId, categoryId } = props;\n const viewport = this._props.viewport;\n return concat(\n props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY,\n defer(() => {\n const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });\n const isDisplayedByDefault = categoryVisibility.state === \"visible\";\n return of(elementId).pipe(this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault }));\n }),\n );\n });\n return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeElementState);\n }\n\n private changeElementStateNoChildrenOperator(props: { on: boolean; isDisplayedByDefault: boolean }): OperatorFunction<string, void> {\n return (elementIds: Observable<Id64String>) => {\n const { on, isDisplayedByDefault } = props;\n const isAlwaysDrawnExclusive = this._props.viewport.isAlwaysDrawnExclusive;\n return elementIds.pipe(\n reduce(\n (acc, elementId) => {\n if (on) {\n const wasRemoved = acc.neverDrawn.delete(elementId);\n acc.changedNeverDrawn ||= wasRemoved;\n // If exclusive mode is enabled, we must add the element to the always drawn list.\n if ((!isDisplayedByDefault || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {\n acc.alwaysDrawn.add(elementId);\n acc.changedAlwaysDrawn = true;\n }\n } else {\n const wasRemoved = acc.alwaysDrawn.delete(elementId);\n acc.changedAlwaysDrawn ||= wasRemoved;\n // If exclusive mode is not enabled, we have to add the element to the never drawn list.\n if (isDisplayedByDefault && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {\n acc.neverDrawn.add(elementId);\n acc.changedNeverDrawn = true;\n }\n }\n return acc;\n },\n {\n changedNeverDrawn: false,\n changedAlwaysDrawn: false,\n neverDrawn: new Set(this._props.viewport.neverDrawn || []),\n alwaysDrawn: new Set(this._props.viewport.alwaysDrawn || []),\n },\n ),\n map((state) => {\n state.changedNeverDrawn && this._props.viewport.setNeverDrawn(state.neverDrawn);\n state.changedAlwaysDrawn && this._props.viewport.setAlwaysDrawn(state.alwaysDrawn, this._props.viewport.isAlwaysDrawnExclusive);\n }),\n );\n };\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElementsImpl(\n props: {\n alwaysDrawn: Id64Set | undefined;\n neverDrawn: Id64Set | undefined;\n totalCount: number;\n } & GetVisibilityFromAlwaysAndNeverDrawnElementsProps,\n ): VisibilityStatus {\n const { alwaysDrawn, neverDrawn, totalCount } = props;\n\n if (neverDrawn?.size === totalCount) {\n return createVisibilityStatus(\"hidden\", props.tooltips.allElementsInNeverDrawnList);\n }\n\n if (alwaysDrawn?.size === totalCount) {\n return createVisibilityStatus(\"visible\", props.tooltips.allElementsInAlwaysDrawnList);\n }\n\n const viewport = this._props.viewport;\n if (viewport.isAlwaysDrawnExclusive && viewport.alwaysDrawn?.size) {\n return alwaysDrawn?.size\n ? createVisibilityStatus(\"partial\", props.tooltips.elementsInBothAlwaysAndNeverDrawn)\n : createVisibilityStatus(\"hidden\", props.tooltips.noElementsInExclusiveAlwaysDrawnList);\n }\n\n const status = props.defaultStatus();\n if ((status.state === \"visible\" && neverDrawn?.size) || (status.state === \"hidden\" && alwaysDrawn?.size)) {\n return createVisibilityStatus(\"partial\");\n }\n return status;\n }\n\n private getVisibilityFromAlwaysAndNeverDrawnElements(\n props: GetVisibilityFromAlwaysAndNeverDrawnElementsProps & ({ elements: Id64Set } | { queryProps: AlwaysOrNeverDrawnElementsQueryProps }),\n ): Observable<VisibilityStatus> {\n const viewport = this._props.viewport;\n if (viewport.isAlwaysDrawnExclusive) {\n if (!viewport?.alwaysDrawn?.size) {\n return of(createVisibilityStatus(\"hidden\", props.tooltips.noElementsInExclusiveAlwaysDrawnList));\n }\n } else if (!viewport?.neverDrawn?.size && !viewport?.alwaysDrawn?.size) {\n return of(props.defaultStatus());\n }\n\n if (\"elements\" in props) {\n return of(\n this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n alwaysDrawn: viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : undefined,\n neverDrawn: viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : undefined,\n totalCount: props.elements.size,\n }),\n );\n }\n\n const { modelId, categoryId } = props.queryProps;\n const totalCount = categoryId ? this._idsCache.getCategoryElementsCount(modelId, categoryId) : this._idsCache.getModelElementCount(modelId);\n return forkJoin({\n totalCount,\n alwaysDrawn: this.getAlwaysDrawnElements(props.queryProps),\n neverDrawn: this.getNeverDrawnElements(props.queryProps),\n }).pipe(\n map((state) => {\n return this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({\n ...props,\n ...state,\n });\n }),\n );\n }\n\n private getAlwaysDrawnElements(props: AlwaysOrNeverDrawnElementsQueryProps) {\n return this._alwaysAndNeverDrawnElements.getElements({ ...props, setType: \"always\" });\n }\n\n private getNeverDrawnElements(props: AlwaysOrNeverDrawnElementsQueryProps) {\n return this._alwaysAndNeverDrawnElements.getElements({ ...props, setType: \"never\" });\n }\n\n private clearAlwaysAndNeverDrawnElements(props: Omit<AlwaysOrNeverDrawnElementsQueryProps, \"setType\">) {\n return forkJoin({\n alwaysDrawn: this.getAlwaysDrawnElements(props),\n neverDrawn: this.getNeverDrawnElements(props),\n }).pipe(\n map(({ alwaysDrawn, neverDrawn }) => {\n const viewport = this._props.viewport;\n if (viewport.alwaysDrawn?.size && alwaysDrawn.size) {\n viewport.setAlwaysDrawn(setDifference(viewport.alwaysDrawn, alwaysDrawn));\n }\n if (viewport.neverDrawn?.size && neverDrawn.size) {\n viewport.setNeverDrawn(setDifference(viewport.neverDrawn, neverDrawn));\n }\n }),\n );\n }\n\n private getGroupingNodeInfo(node: GroupingHierarchyNode) {\n const modelId = ModelsTreeNode.getModelId(node);\n const categoryId = ModelsTreeNode.getCategoryId(node);\n assert(!!modelId && !!categoryId);\n\n const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));\n return { modelId, categoryId, elementIds };\n }\n\n private async findClassIdInFilterPath(path: HierarchyNodeIdentifiersPath, parentKeys: HierarchyNodeKey[], className: string) {\n function* keysToCheck(): Iterable<InstanceKey> {\n for (let i = path.length - 1; i >= 0; --i) {\n const id = path[i];\n if (HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n yield id;\n }\n }\n\n for (let i = parentKeys.length - 1; i >= 0; --i) {\n const key = parentKeys[i];\n if (HierarchyNodeKey.isInstances(key)) {\n yield* key.instanceKeys;\n }\n }\n }\n\n for (const parentKey of keysToCheck()) {\n if (await this._props.imodelAccess.classDerivesFrom(parentKey.className, className)) {\n return parentKey.id;\n }\n }\n\n assert(false, () => `Cannot find an instance of ${className} in instance keys: ${JSON.stringify([...keysToCheck()], undefined, 2)}`);\n }\n}\n\ninterface GetVisibilityFromAlwaysAndNeverDrawnElementsProps {\n tooltips: {\n allElementsInNeverDrawnList: string;\n allElementsInAlwaysDrawnList: string;\n elementsInBothAlwaysAndNeverDrawn: string;\n noElementsInExclusiveAlwaysDrawnList: string;\n };\n /** Status when always/never lists are empty and exclusive mode is off */\n defaultStatus: () => VisibilityStatus;\n}\n\nfunction getVisibilityFromTreeNodeChildren(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\nfunction getVisibilityStatusFromTreeNodeChildren(tooltipMap: { [key in Visibility]: string | undefined }): OperatorFunction<Visibility, VisibilityStatus> {\n return (obs) => {\n return getVisibilityFromTreeNodeChildren(obs).pipe(\n map((visibility) => {\n if (visibility === \"empty\") {\n visibility = \"visible\";\n }\n\n return createVisibilityStatus(visibility, tooltipMap[visibility]);\n }),\n );\n };\n}\n\nfunction setDifference<T>(lhs: Set<T>, rhs: Set<T>): Set<T> {\n const result = new Set<T>();\n lhs.forEach((x) => !rhs.has(x) && result.add(x));\n return result;\n}\n\nfunction setIntersection<T>(lhs: Set<T>, rhs: Set<T>): Set<T> {\n const result = new Set<T>();\n lhs.forEach((x) => rhs.has(x) && result.add(x));\n return result;\n}\n\nfunction reduceFilterPaths(filteringPaths: HierarchyFilteringPath[]) {\n let paths = filteringPaths.map((filteringPath) => HierarchyFilteringPath.normalize(filteringPath).path);\n const sorted = [...paths].sort((a, b) => a.length - b.length);\n paths = [];\n for (const path of sorted) {\n if (!arraySortedByLengthContainsPrefix(paths, path)) {\n paths.push(path);\n }\n }\n return paths;\n}\n\nfunction arraySortedByLengthContainsPrefix(targetArray: HierarchyNodeIdentifiersPath[], source: HierarchyNodeIdentifiersPath) {\n for (const targetVal of targetArray) {\n if (targetVal.length >= source.length) {\n break;\n }\n\n let isPrefix = true;\n for (let i = 0; i < targetVal.length; ++i) {\n if (!HierarchyNodeIdentifier.equal(targetVal[i], source[i])) {\n isPrefix = false;\n break;\n }\n }\n\n if (isPrefix) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n * @public\n */\nexport async function showAllModels(models: string[], viewport: Viewport) {\n await viewport.addViewedModels(models);\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n await toggleAllCategories(viewport, true);\n}\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport async function hideAllModels(models: string[], viewport: Viewport) {\n viewport.changeModelDisplay(models, false);\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport async function invertAllModels(models: string[], viewport: Viewport) {\n const notViewedModels: string[] = [];\n const viewedModels: string[] = [];\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n await viewport.addViewedModels(notViewedModels);\n viewport.changeModelDisplay(viewedModels, false);\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport async function toggleModels(models: string[], enable: boolean, viewport: Viewport) {\n // istanbul ignore if\n if (!models) {\n return;\n }\n if (enable) {\n viewport.changeModelDisplay(models, false);\n } else {\n await viewport.addViewedModels(models);\n }\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: Viewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}