@itwin/tree-widget-react 4.0.0-alpha.5 → 4.0.0-alpha.7

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 (186) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/README.md +2 -1
  3. package/lib/esm/tree-widget-react/TreeWidget.js +1 -1
  4. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  5. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +1 -1
  6. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
  7. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js +1 -1
  8. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js.map +1 -1
  9. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.d.ts +1 -0
  10. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +3 -2
  11. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +2 -1
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +2 -2
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +3 -2
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +9 -2
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +53 -7
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +1 -1
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +30 -3
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +588 -170
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +15 -4
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +149 -56
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +30 -15
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +192 -38
  30. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  31. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +18 -3
  32. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +30 -3
  33. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -1
  34. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.d.ts +24 -0
  35. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +785 -0
  36. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -0
  37. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.d.ts +39 -0
  38. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js +221 -0
  39. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js.map +1 -0
  40. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +5 -17
  41. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +5 -62
  42. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  43. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +2 -0
  44. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +4 -2
  45. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  46. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +1 -0
  47. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +2 -1
  48. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +1 -1
  49. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
  50. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
  51. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
  52. package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +33 -23
  53. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +60 -47
  54. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  55. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +3 -3
  56. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
  57. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
  58. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
  59. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
  60. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.css +1 -0
  61. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
  62. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +4 -3
  63. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
  64. package/lib/esm/tree-widget-react/components/trees/{categories-tree/internal/ClassNameDefinitions.js → common/components/SkeletonTree.css} +12 -7
  65. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.d.ts +4 -0
  66. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js +16 -0
  67. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js.map +1 -0
  68. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +11 -0
  69. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +1 -0
  70. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +8 -7
  71. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  72. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +3 -3
  73. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
  74. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +1 -0
  75. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +1 -0
  76. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
  77. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
  79. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  80. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +44 -0
  81. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/AlwaysAndNeverDrawnElementInfo.js +81 -31
  82. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
  83. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +33 -0
  84. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +37 -0
  85. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
  86. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +16 -0
  87. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +72 -0
  88. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
  89. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
  90. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +9 -2
  91. package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
  92. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +5 -1
  93. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.js → internal/Tooltip.js} +7 -1
  94. package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
  95. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
  96. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js +6 -0
  97. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
  98. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveViewport.js.map +1 -0
  99. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +1 -0
  100. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
  101. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
  102. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -0
  103. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +4 -3
  104. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
  105. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
  106. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
  107. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
  108. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +47 -0
  109. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +101 -0
  110. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
  111. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
  112. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/VisibilityChangeEventListener.js +17 -9
  113. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
  114. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +82 -0
  115. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +234 -0
  116. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
  117. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +7 -2
  118. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +24 -18
  119. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  120. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -1
  121. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  122. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +1 -0
  123. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +1 -0
  124. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  125. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +9 -2
  126. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +44 -34
  127. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  128. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  129. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  130. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -0
  131. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +39 -38
  132. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  133. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +5 -5
  134. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +25 -24
  135. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  136. package/lib/esm/tree-widget-react/components/trees/index.d.ts +4 -2
  137. package/lib/esm/tree-widget-react/components/trees/index.js +4 -2
  138. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  139. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +2 -2
  140. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +2 -2
  141. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  142. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +15 -11
  143. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  144. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  145. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +1 -1
  146. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  147. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +7 -2
  148. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +73 -70
  149. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  150. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +5 -1
  151. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +73 -49
  152. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  153. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -9
  154. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +4 -6
  155. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
  156. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -5
  157. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +54 -104
  158. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  159. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -26
  160. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +75 -291
  161. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  162. package/lib/public/locales/en/TreeWidget.json +55 -6
  163. package/package.json +17 -18
  164. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +0 -37
  165. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +0 -214
  166. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +0 -1
  167. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +0 -7
  168. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +0 -1
  169. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
  170. package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
  171. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
  172. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
  173. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
  174. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
  175. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
  176. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
  177. package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
  178. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
  179. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
  180. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
  181. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
  182. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
  183. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
  184. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
  185. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.d.ts → internal/UseActiveViewport.d.ts} +0 -0
  186. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.js → internal/UseActiveViewport.js} +0 -0
@@ -2,19 +2,20 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { concat, concatAll, defer, distinct, EMPTY, filter, firstValueFrom, forkJoin, from, fromEventPattern, map, merge, mergeMap, of, reduce, shareReplay, startWith, Subject, take, takeUntil, tap, toArray, } from "rxjs";
5
+ import { concat, concatAll, defaultIfEmpty, defer, distinct, EMPTY, filter, firstValueFrom, forkJoin, from, fromEventPattern, map, merge, mergeMap, of, shareReplay, startWith, Subject, take, takeUntil, tap, toArray, } from "rxjs";
6
6
  import { assert, Id64 } from "@itwin/core-bentley";
7
7
  import { PerModelCategoryVisibility } from "@itwin/core-frontend";
8
8
  import { HierarchyNode, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
9
- import { toggleAllCategories } from "../../common/CategoriesVisibilityUtils.js";
10
- import { reduceWhile, toVoidPromise } from "../../common/Rxjs.js";
11
- import { createVisibilityStatus } from "../../common/Tooltip.js";
9
+ import { AlwaysAndNeverDrawnElementInfo } from "../../common/internal/AlwaysAndNeverDrawnElementInfo.js";
10
+ import { GEOMETRIC_ELEMENT_3D_CLASS_NAME } from "../../common/internal/ClassNameDefinitions.js";
11
+ import { toVoidPromise } from "../../common/internal/Rxjs.js";
12
+ import { createVisibilityStatus, getTooltipOptions } from "../../common/internal/Tooltip.js";
13
+ import { releaseMainThreadOnItemsCount, setDifference, setIntersection } from "../../common/internal/Utils.js";
14
+ import { createVisibilityChangeEventListener } from "../../common/internal/VisibilityChangeEventListener.js";
15
+ import { changeElementStateNoChildrenOperator, filterSubModeledElementIds, getElementOverriddenVisibility, getElementVisibility, getSubModeledElementsVisibilityStatus, getVisibilityFromAlwaysAndNeverDrawnElementsImpl, mergeVisibilityStatuses, } from "../../common/internal/VisibilityUtils.js";
12
16
  import { createVisibilityHandlerResult } from "../../common/UseHierarchyVisibility.js";
13
- import { releaseMainThreadOnItemsCount } from "../Utils.js";
14
- import { AlwaysAndNeverDrawnElementInfo } from "./AlwaysAndNeverDrawnElementInfo.js";
15
17
  import { createFilteredTree, parseCategoryKey } from "./FilteredTree.js";
16
18
  import { ModelsTreeNode } from "./ModelsTreeNode.js";
17
- import { createVisibilityChangeEventListener } from "./VisibilityChangeEventListener.js";
18
19
  /**
19
20
  * Creates an instance if `ModelsTreeVisibilityHandler`.
20
21
  * @internal
@@ -28,8 +29,15 @@ class ModelsTreeVisibilityHandlerImpl {
28
29
  this._elementChangeQueue = new Subject();
29
30
  this._subscriptions = [];
30
31
  this._changeRequest = new Subject();
31
- this._eventListener = createVisibilityChangeEventListener(_props.viewport);
32
- this._alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(_props.viewport);
32
+ this._eventListener = createVisibilityChangeEventListener({
33
+ viewport: _props.viewport,
34
+ listeners: {
35
+ models: true,
36
+ categories: true,
37
+ elements: true,
38
+ },
39
+ });
40
+ this._alwaysAndNeverDrawnElements = new AlwaysAndNeverDrawnElementInfo(_props.viewport, GEOMETRIC_ELEMENT_3D_CLASS_NAME);
33
41
  this._idsCache = this._props.idsCache;
34
42
  this._filteredTree = _props.filteredPaths ? createFilteredTree(this._props.imodelAccess, _props.filteredPaths) : undefined;
35
43
  this._subscriptions.push(this._elementChangeQueue.pipe(concatAll()).subscribe());
@@ -46,7 +54,7 @@ class ModelsTreeVisibilityHandlerImpl {
46
54
  this._eventListener.onVisibilityChange.addListener(handler);
47
55
  }, (handler) => {
48
56
  this._eventListener.onVisibilityChange.removeListener(handler);
49
- }))));
57
+ })), defaultIfEmpty(createVisibilityStatus("hidden"))));
50
58
  }
51
59
  async changeVisibility(node, shouldDisplay) {
52
60
  // notify about new change request
@@ -69,8 +77,8 @@ class ModelsTreeVisibilityHandlerImpl {
69
77
  this[Symbol.dispose]();
70
78
  }
71
79
  [Symbol.dispose]() {
72
- this._eventListener.dispose();
73
- this._alwaysAndNeverDrawnElements.dispose();
80
+ this._eventListener[Symbol.dispose]();
81
+ this._alwaysAndNeverDrawnElements[Symbol.dispose]();
74
82
  this._subscriptions.forEach((x) => x.unsubscribe());
75
83
  }
76
84
  getVisibilityStatusObs(node) {
@@ -111,7 +119,7 @@ class ModelsTreeVisibilityHandlerImpl {
111
119
  });
112
120
  }
113
121
  getFilteredNodeVisibility(props) {
114
- return from(this.getVisibilityChangeTargets(props)).pipe(mergeMap(({ subjects, models, categories, elements }) => {
122
+ return from(this.getVisibilityChangeTargets(props)).pipe(mergeMap(({ subjectIds: subjects, modelIds: models, categories, elements }) => {
115
123
  const observables = new Array();
116
124
  if (subjects?.size) {
117
125
  observables.push(this.getSubjectNodeVisibilityStatus({ subjectIds: [...subjects], ignoreTooltip: true }));
@@ -132,17 +140,18 @@ class ModelsTreeVisibilityHandlerImpl {
132
140
  })));
133
141
  }
134
142
  return merge(...observables);
135
- }), map((x) => x.state), getVisibilityFromTreeNodeChildren, map((x) => {
136
- assert(x !== "empty");
137
- return createVisibilityStatus(x);
138
- }));
143
+ }), mergeVisibilityStatuses({
144
+ visible: undefined,
145
+ hidden: undefined,
146
+ partial: undefined,
147
+ }, true));
139
148
  }
140
149
  getSubjectNodeVisibilityStatus({ subjectIds, ignoreTooltip }) {
141
150
  const result = defer(() => {
142
151
  if (!this._props.viewport.view.isSpatialView()) {
143
152
  return of(createVisibilityStatus("disabled", getTooltipOptions("modelsTree.subject.nonSpatialView", ignoreTooltip)));
144
153
  }
145
- return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(concatAll(), distinct(), mergeMap((modelId) => this.getModelVisibilityStatus({ modelId, ignoreTooltip: true })), map((x) => x.state), getVisibilityStatusFromTreeNodeChildren({
154
+ return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(concatAll(), distinct(), mergeMap((modelId) => this.getModelVisibilityStatus({ modelId, ignoreTooltip: true })), mergeVisibilityStatuses({
146
155
  visible: "modelsTree.subject.allModelsVisible",
147
156
  hidden: "modelsTree.subject.allModelsHidden",
148
157
  partial: "modelsTree.subject.someModelsHidden",
@@ -157,16 +166,17 @@ class ModelsTreeVisibilityHandlerImpl {
157
166
  return of(createVisibilityStatus("disabled", getTooltipOptions("modelsTree.model.nonSpatialView", ignoreTooltip)));
158
167
  }
159
168
  if (!viewport.view.viewsModel(modelId)) {
160
- return from(this._idsCache.getModelCategories(modelId)).pipe(mergeMap((categoryIds) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), this.getSubModeledElementsVisibilityStatus({
169
+ return from(this._idsCache.getModelCategoryIds(modelId)).pipe(mergeMap((categoryIds) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), getSubModeledElementsVisibilityStatus({
161
170
  ignoreTooltips: ignoreTooltip,
162
- haveSubModel: "yes",
163
171
  tooltips: { visible: undefined, hidden: "modelsTree.model.hiddenThroughModelSelector", partial: "modelsTree.model.someSubModelsVisible" },
164
172
  parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
173
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
165
174
  }));
166
175
  }
167
- return from(this._idsCache.getModelCategories(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryId, ignoreTooltip: true })), map((x) => x.state), getVisibilityFromTreeNodeChildren, map((visibilityByCategories) => {
168
- const state = visibilityByCategories === "empty" ? "visible" : visibilityByCategories;
169
- return createVisibilityStatus(state, getTooltipOptions(state === "partial" ? "modelsTree.model.someCategoriesHidden" : `modelsTree.model.allCategories${state ? "Visible" : "Hidden"}`, ignoreTooltip));
176
+ return from(this._idsCache.getModelCategoryIds(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryId, ignoreTooltip: true })), mergeVisibilityStatuses({
177
+ visible: "modelsTree.model.allCategoriesVisible",
178
+ hidden: "modelsTree.model.allCategoriesHidden",
179
+ partial: "modelsTree.model.someCategoriesHidden",
170
180
  }));
171
181
  });
172
182
  return createVisibilityHandlerResult(this, { id: modelId }, result, this._props.overrides?.getModelDisplayStatus);
@@ -190,7 +200,7 @@ class ModelsTreeVisibilityHandlerImpl {
190
200
  getCategoryDisplayStatus({ ignoreTooltip, ...props }) {
191
201
  const result = defer(() => {
192
202
  if (!this._props.viewport.view.viewsModel(props.modelId)) {
193
- return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(this.getSubModeledElementsVisibilityStatus({
203
+ return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(getSubModeledElementsVisibilityStatus({
194
204
  ignoreTooltips: ignoreTooltip,
195
205
  parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
196
206
  tooltips: {
@@ -198,11 +208,14 @@ class ModelsTreeVisibilityHandlerImpl {
198
208
  hidden: "modelsTree.category.hiddenThroughModel",
199
209
  partial: "modelsTree.category.someElementsOrSubModelsHidden",
200
210
  },
201
- haveSubModel: "yes",
211
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
202
212
  }));
203
213
  }
204
214
  return this.getVisibilityFromAlwaysAndNeverDrawnElements({
205
- queryProps: props,
215
+ queryProps: {
216
+ categoryIds: [props.categoryId],
217
+ modelId: props.modelId,
218
+ },
206
219
  tooltips: {
207
220
  allElementsInAlwaysDrawnList: "modelsTree.category.allElementsVisible",
208
221
  allElementsInNeverDrawnList: "modelsTree.category.allElementsHidden",
@@ -212,15 +225,15 @@ class ModelsTreeVisibilityHandlerImpl {
212
225
  defaultStatus: () => this.getDefaultCategoryVisibilityStatus(props),
213
226
  ignoreTooltip,
214
227
  }).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
215
- return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(this.getSubModeledElementsVisibilityStatus({
228
+ return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(getSubModeledElementsVisibilityStatus({
216
229
  tooltips: {
217
230
  visible: undefined,
218
231
  hidden: "modelsTree.category.allElementsAndSubModelsHidden",
219
232
  partial: "modelsTree.category.someElementsOrSubModelsHidden",
220
233
  },
221
- haveSubModel: "yes",
222
234
  parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,
223
235
  ignoreTooltips: ignoreTooltip,
236
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
224
237
  }));
225
238
  }));
226
239
  });
@@ -231,14 +244,14 @@ class ModelsTreeVisibilityHandlerImpl {
231
244
  const info = this.getGroupingNodeInfo(node);
232
245
  const { modelId, categoryId, elementIds } = info;
233
246
  if (!this._props.viewport.view.viewsModel(modelId)) {
234
- return of([...elementIds]).pipe(this.getSubModeledElementsVisibilityStatus({
247
+ return of([...elementIds]).pipe(filterSubModeledElementIds({ doesSubModelExist: async (id) => this._idsCache.hasSubModel(id) }), getSubModeledElementsVisibilityStatus({
235
248
  tooltips: {
236
249
  visible: undefined,
237
250
  hidden: undefined,
238
251
  partial: "modelsTree.groupingNode.someElementsOrSubModelsHidden",
239
252
  },
240
253
  parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
241
- haveSubModel: "unknown",
254
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
242
255
  }));
243
256
  }
244
257
  return this.getVisibilityFromAlwaysAndNeverDrawnElements({
@@ -254,74 +267,35 @@ class ModelsTreeVisibilityHandlerImpl {
254
267
  noElementsInExclusiveAlwaysDrawnList: "modelsTree.groupingNode.allElementsHidden",
255
268
  },
256
269
  }).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
257
- return of([...elementIds]).pipe(this.getSubModeledElementsVisibilityStatus({
270
+ return of([...elementIds]).pipe(filterSubModeledElementIds({ doesSubModelExist: async (id) => this._idsCache.hasSubModel(id) }), getSubModeledElementsVisibilityStatus({
258
271
  tooltips: {
259
272
  visible: undefined,
260
273
  hidden: "modelsTree.groupingNode.allElementsAndSubModelsHidden",
261
274
  partial: "modelsTree.groupingNode.someElementsOrSubModelsHidden",
262
275
  },
263
276
  parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,
264
- haveSubModel: "unknown",
277
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
265
278
  }));
266
279
  }));
267
280
  });
268
281
  return createVisibilityHandlerResult(this, { node }, result, this._props.overrides?.getElementGroupingNodeDisplayStatus);
269
282
  }
270
- getElementOverriddenVisibility(elementId, ignoreTooltip) {
271
- const viewport = this._props.viewport;
272
- if (viewport.neverDrawn?.has(elementId)) {
273
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughNeverDrawnList", ignoreTooltip));
274
- }
275
- if (viewport.alwaysDrawn?.size) {
276
- if (viewport.alwaysDrawn.has(elementId)) {
277
- return createVisibilityStatus("visible", getTooltipOptions("modelsTree.element.displayedThroughAlwaysDrawnList", ignoreTooltip));
278
- }
279
- if (viewport.isAlwaysDrawnExclusive) {
280
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenDueToOtherElementsExclusivelyAlwaysDrawn", ignoreTooltip));
281
- }
282
- }
283
- return undefined;
284
- }
285
- getElementVisibility(ignoreTooltip, viewsModel, overridenVisibility, categoryVisibility, subModelVisibilityStatus) {
286
- if (subModelVisibilityStatus === undefined) {
287
- if (!viewsModel) {
288
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughModel", ignoreTooltip));
289
- }
290
- if (overridenVisibility) {
291
- return overridenVisibility;
292
- }
293
- return createVisibilityStatus(categoryVisibility.state, getTooltipOptions(categoryVisibility.state === "visible" ? undefined : "modelsTree.element.hiddenThroughCategory", ignoreTooltip));
294
- }
295
- if (subModelVisibilityStatus.state === "partial") {
296
- return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.someElementsAreHidden", ignoreTooltip));
297
- }
298
- if (subModelVisibilityStatus.state === "visible") {
299
- if (!viewsModel || overridenVisibility?.state === "hidden" || (categoryVisibility.state === "hidden" && !overridenVisibility)) {
300
- return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.partialThroughSubModel", ignoreTooltip));
301
- }
302
- return createVisibilityStatus("visible", getTooltipOptions(undefined, ignoreTooltip));
303
- }
304
- if (!viewsModel) {
305
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughModel", ignoreTooltip));
306
- }
307
- if (overridenVisibility) {
308
- if (overridenVisibility.state === "hidden") {
309
- return overridenVisibility;
310
- }
311
- return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.partialThroughElement", ignoreTooltip));
312
- }
313
- if (categoryVisibility.state === "visible") {
314
- return createVisibilityStatus("partial", getTooltipOptions("modelsTree.element.partialThroughCategory", ignoreTooltip));
315
- }
316
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.element.hiddenThroughCategory", ignoreTooltip));
317
- }
318
283
  getElementDisplayStatus({ ignoreTooltip, ...props }) {
319
284
  const result = defer(() => {
320
285
  const viewport = this._props.viewport;
321
286
  const { elementId, modelId, categoryId } = props;
322
287
  const viewsModel = viewport.view.viewsModel(modelId);
323
- const elementStatus = this.getElementOverriddenVisibility(elementId, ignoreTooltip);
324
- return from(this._idsCache.hasSubModel(elementId)).pipe(mergeMap((hasSubModel) => (hasSubModel ? this.getModelVisibilityStatus({ modelId: elementId }) : of(undefined))), map((subModelVisibilityStatus) => this.getElementVisibility(ignoreTooltip, viewsModel, elementStatus, this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true }), subModelVisibilityStatus)));
288
+ const elementStatus = getElementOverriddenVisibility({
289
+ elementId,
290
+ ignoreTooltip,
291
+ viewport,
292
+ tooltips: {
293
+ visibileThorughAlwaysDrawn: "modelsTree.element.displayedThroughAlwaysDrawnList",
294
+ hiddenThroughAlwaysDrawnExclusive: "modelsTree.element.hiddenDueToOtherElementsExclusivelyAlwaysDrawn",
295
+ hiddenThroughNeverDrawn: "modelsTree.element.hiddenThroughNeverDrawnList",
296
+ },
297
+ });
298
+ return from(this._idsCache.hasSubModel(elementId)).pipe(mergeMap((hasSubModel) => (hasSubModel ? this.getModelVisibilityStatus({ modelId: elementId }) : of(undefined))), map((subModelVisibilityStatus) => getElementVisibility(ignoreTooltip, viewsModel, elementStatus, this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true }), "modelsTree", subModelVisibilityStatus)));
325
299
  });
326
300
  return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getElementDisplayStatus);
327
301
  }
@@ -369,7 +343,7 @@ class ModelsTreeVisibilityHandlerImpl {
369
343
  return filteredTree ? filteredTree.getVisibilityChangeTargets(node) : {};
370
344
  }
371
345
  changeFilteredNodeVisibility({ on, ...props }) {
372
- return from(this.getVisibilityChangeTargets(props)).pipe(mergeMap(({ subjects, models, categories, elements }) => {
346
+ return from(this.getVisibilityChangeTargets(props)).pipe(mergeMap(({ subjectIds: subjects, modelIds: models, categories, elements }) => {
373
347
  const observables = new Array();
374
348
  if (subjects?.size) {
375
349
  observables.push(this.changeSubjectNodeState([...subjects], on));
@@ -392,14 +366,14 @@ class ModelsTreeVisibilityHandlerImpl {
392
366
  return merge(...observables);
393
367
  }));
394
368
  }
395
- changeSubjectNodeState(ids, on) {
369
+ changeSubjectNodeState(subjectIds, on) {
396
370
  const result = defer(() => {
397
371
  if (!this._props.viewport.view.isSpatialView()) {
398
372
  return EMPTY;
399
373
  }
400
- return from(this._idsCache.getSubjectModelIds(ids)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));
374
+ return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));
401
375
  });
402
- return createVisibilityHandlerResult(this, { ids, on }, result, this._props.overrides?.changeSubjectNodeState);
376
+ return createVisibilityHandlerResult(this, { ids: subjectIds, on }, result, this._props.overrides?.changeSubjectNodeState);
403
377
  }
404
378
  changeModelState(props) {
405
379
  const { ids, on } = props;
@@ -414,13 +388,13 @@ class ModelsTreeVisibilityHandlerImpl {
414
388
  const idsObs = from(Id64.iterable(ids));
415
389
  if (!on) {
416
390
  viewport.changeModelDisplay(ids, false);
417
- return idsObs.pipe(mergeMap(async (modelId) => ({ modelId, categoryIds: await this._idsCache.getModelCategories(modelId) })), mergeMap(({ modelId, categoryIds }) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })));
391
+ return idsObs.pipe(mergeMap(async (modelId) => ({ modelId, categoryIds: await this._idsCache.getModelCategoryIds(modelId) })), mergeMap(({ modelId, categoryIds }) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on })));
418
392
  }
419
393
  return concat(defer(() => {
420
394
  viewport.perModelCategoryVisibility.clearOverrides(ids);
421
395
  return from(viewport.addViewedModels(ids));
422
396
  }), idsObs.pipe(mergeMap((modelId) => {
423
- return from(this._idsCache.getModelCategories(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })));
397
+ return from(this._idsCache.getModelCategoryIds(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })));
424
398
  })));
425
399
  });
426
400
  return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeModelState);
@@ -428,8 +402,8 @@ class ModelsTreeVisibilityHandlerImpl {
428
402
  showModelWithoutAnyCategoriesOrElements(modelId) {
429
403
  const viewport = this._props.viewport;
430
404
  return forkJoin({
431
- categories: this._idsCache.getModelCategories(modelId),
432
- alwaysDrawnElements: this.getAlwaysDrawnElements({ modelId }),
405
+ categories: this._idsCache.getModelCategoryIds(modelId),
406
+ alwaysDrawnElements: this._alwaysAndNeverDrawnElements.getAlwaysDrawnElements({ modelId }),
433
407
  }).pipe(mergeMap(async ({ categories, alwaysDrawnElements }) => {
434
408
  const alwaysDrawn = this._props.viewport.alwaysDrawn;
435
409
  if (alwaysDrawn && alwaysDrawnElements) {
@@ -462,7 +436,7 @@ class ModelsTreeVisibilityHandlerImpl {
462
436
  const { modelId, categoryId, on } = props;
463
437
  return concat(props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY, defer(() => {
464
438
  this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on);
465
- return this.clearAlwaysAndNeverDrawnElements(props);
439
+ return this._alwaysAndNeverDrawnElements.clearAlwaysAndNeverDrawnElements({ categoryIds: [props.categoryId], modelId: props.modelId });
466
440
  }), from(this._idsCache.getCategoriesModeledElements(modelId, [categoryId])).pipe(mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on }))));
467
441
  });
468
442
  return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeCategoryState);
@@ -500,7 +474,7 @@ class ModelsTreeVisibilityHandlerImpl {
500
474
  const changeFinished = finishedSubject.pipe(startWith(false), shareReplay(1), filter((finished) => finished));
501
475
  const changeObservable = from(elementIds).pipe(
502
476
  // check if visibility change is not finished (cancelled) due to change overall change request being cancelled
503
- takeUntil(changeFinished), this.changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault }), tap({
477
+ takeUntil(changeFinished), changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault, viewport: this._props.viewport }), tap({
504
478
  next: () => {
505
479
  // notify that visibility change is finished
506
480
  finishedSubject.next(true);
@@ -516,65 +490,6 @@ class ModelsTreeVisibilityHandlerImpl {
516
490
  },
517
491
  }), map(() => undefined));
518
492
  }
519
- changeElementStateNoChildrenOperator(props) {
520
- return (elementIds) => {
521
- const { on, isDisplayedByDefault } = props;
522
- const isAlwaysDrawnExclusive = this._props.viewport.isAlwaysDrawnExclusive;
523
- return elementIds.pipe(releaseMainThreadOnItemsCount(500), reduce((acc, elementId) => {
524
- if (acc.alwaysDrawn === undefined || acc.neverDrawn === undefined) {
525
- acc.alwaysDrawn = new Set(this._props.viewport.alwaysDrawn || []);
526
- acc.neverDrawn = new Set(this._props.viewport.neverDrawn || []);
527
- }
528
- if (on) {
529
- const wasRemoved = acc.neverDrawn.delete(elementId);
530
- acc.changedNeverDrawn ||= wasRemoved;
531
- // If exclusive mode is enabled, we must add the element to the always drawn list.
532
- if ((!isDisplayedByDefault || isAlwaysDrawnExclusive) && !acc.alwaysDrawn.has(elementId)) {
533
- acc.alwaysDrawn.add(elementId);
534
- acc.changedAlwaysDrawn = true;
535
- }
536
- }
537
- else {
538
- const wasRemoved = acc.alwaysDrawn.delete(elementId);
539
- acc.changedAlwaysDrawn ||= wasRemoved;
540
- // If exclusive mode is not enabled, we have to add the element to the never drawn list.
541
- if (isDisplayedByDefault && !isAlwaysDrawnExclusive && !acc.neverDrawn.has(elementId)) {
542
- acc.neverDrawn.add(elementId);
543
- acc.changedNeverDrawn = true;
544
- }
545
- }
546
- return acc;
547
- }, {
548
- changedNeverDrawn: false,
549
- changedAlwaysDrawn: false,
550
- neverDrawn: undefined,
551
- alwaysDrawn: undefined,
552
- }), map((state) => {
553
- state.changedNeverDrawn && state.neverDrawn && this._props.viewport.setNeverDrawn(state.neverDrawn);
554
- state.changedAlwaysDrawn && state.alwaysDrawn && this._props.viewport.setAlwaysDrawn(state.alwaysDrawn, this._props.viewport.isAlwaysDrawnExclusive);
555
- }));
556
- };
557
- }
558
- getVisibilityFromAlwaysAndNeverDrawnElementsImpl(props) {
559
- const { alwaysDrawn, neverDrawn, totalCount, ignoreTooltip } = props;
560
- if (neverDrawn?.size === totalCount) {
561
- return createVisibilityStatus("hidden", getTooltipOptions(props.tooltips.allElementsInNeverDrawnList, ignoreTooltip));
562
- }
563
- if (alwaysDrawn?.size === totalCount) {
564
- return createVisibilityStatus("visible", getTooltipOptions(props.tooltips.allElementsInAlwaysDrawnList, ignoreTooltip));
565
- }
566
- const viewport = this._props.viewport;
567
- if (viewport.isAlwaysDrawnExclusive && viewport.alwaysDrawn?.size) {
568
- return alwaysDrawn?.size
569
- ? createVisibilityStatus("partial", getTooltipOptions(props.tooltips.elementsInBothAlwaysAndNeverDrawn, ignoreTooltip))
570
- : createVisibilityStatus("hidden", getTooltipOptions(props.tooltips.noElementsInExclusiveAlwaysDrawnList, ignoreTooltip));
571
- }
572
- const status = props.defaultStatus();
573
- if ((status.state === "visible" && neverDrawn?.size) || (status.state === "hidden" && alwaysDrawn?.size)) {
574
- return createVisibilityStatus("partial", getTooltipOptions(undefined, ignoreTooltip));
575
- }
576
- return status;
577
- }
578
493
  getVisibilityFromAlwaysAndNeverDrawnElements({ ignoreTooltip, ...props }) {
579
494
  const viewport = this._props.viewport;
580
495
  if (viewport.isAlwaysDrawnExclusive) {
@@ -586,48 +501,31 @@ class ModelsTreeVisibilityHandlerImpl {
586
501
  return of(props.defaultStatus());
587
502
  }
588
503
  if ("elements" in props) {
589
- return of(this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
504
+ return of(getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
590
505
  ...props,
591
506
  alwaysDrawn: viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : undefined,
592
507
  neverDrawn: viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : undefined,
593
508
  totalCount: props.elements.size,
594
509
  ignoreTooltip,
510
+ viewport,
595
511
  }));
596
512
  }
597
- const { modelId, categoryId } = props.queryProps;
598
- const totalCount = categoryId ? this._idsCache.getCategoryElementsCount(modelId, categoryId) : this._idsCache.getModelElementCount(modelId);
513
+ const { modelId, categoryIds } = props.queryProps;
514
+ assert(modelId !== undefined);
515
+ const totalCount = this._idsCache.getCategoryElementsCount(modelId, categoryIds[0]);
599
516
  return forkJoin({
600
517
  totalCount,
601
- alwaysDrawn: this.getAlwaysDrawnElements(props.queryProps),
602
- neverDrawn: this.getNeverDrawnElements(props.queryProps),
518
+ alwaysDrawn: this._alwaysAndNeverDrawnElements.getAlwaysDrawnElements(props.queryProps),
519
+ neverDrawn: this._alwaysAndNeverDrawnElements.getNeverDrawnElements(props.queryProps),
603
520
  }).pipe(map((state) => {
604
- return this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
521
+ return getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
605
522
  ...props,
606
523
  ...state,
524
+ viewport,
607
525
  ignoreTooltip,
608
526
  });
609
527
  }));
610
528
  }
611
- getAlwaysDrawnElements(props) {
612
- return this._alwaysAndNeverDrawnElements.getElements({ ...props, setType: "always" });
613
- }
614
- getNeverDrawnElements(props) {
615
- return this._alwaysAndNeverDrawnElements.getElements({ ...props, setType: "never" });
616
- }
617
- clearAlwaysAndNeverDrawnElements(props) {
618
- return forkJoin({
619
- alwaysDrawn: this.getAlwaysDrawnElements(props),
620
- neverDrawn: this.getNeverDrawnElements(props),
621
- }).pipe(map(({ alwaysDrawn, neverDrawn }) => {
622
- const viewport = this._props.viewport;
623
- if (viewport.alwaysDrawn?.size && alwaysDrawn.size) {
624
- viewport.setAlwaysDrawn(setDifference(viewport.alwaysDrawn, alwaysDrawn));
625
- }
626
- if (viewport.neverDrawn?.size && neverDrawn.size) {
627
- viewport.setNeverDrawn(setDifference(viewport.neverDrawn, neverDrawn));
628
- }
629
- }));
630
- }
631
529
  getGroupingNodeInfo(node) {
632
530
  const modelId = ModelsTreeNode.getModelId(node);
633
531
  const categoryId = ModelsTreeNode.getCategoryId(node);
@@ -635,119 +533,5 @@ class ModelsTreeVisibilityHandlerImpl {
635
533
  const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));
636
534
  return { modelId, categoryId, elementIds };
637
535
  }
638
- getSubModeledElementsVisibilityStatus({ parentNodeVisibilityStatus, haveSubModel, tooltips, ignoreTooltips, }) {
639
- return (obs) => {
640
- return obs.pipe(
641
- // ensure we're only looking at elements that have a sub-model
642
- mergeMap((modeledElementIds) => {
643
- if (haveSubModel === "yes") {
644
- return of(modeledElementIds);
645
- }
646
- return from(modeledElementIds).pipe(mergeMap(async (elementId) => ({ elementId, hasSubModel: await this._idsCache.hasSubModel(elementId) })), filter(({ hasSubModel }) => hasSubModel), map(({ elementId }) => elementId), toArray());
647
- }),
648
- // combine visibility status of sub-models with visibility status of parent node
649
- mergeMap((modeledElementIds) => {
650
- if (modeledElementIds.length === 0) {
651
- return of(parentNodeVisibilityStatus);
652
- }
653
- return from(modeledElementIds).pipe(mergeMap((modeledElementId) => this.getModelVisibilityStatus({ modelId: modeledElementId })), startWith(parentNodeVisibilityStatus), map((visibilityStatus) => visibilityStatus.state), getVisibilityStatusFromTreeNodeChildren(tooltips, ignoreTooltips));
654
- }));
655
- };
656
- }
657
- }
658
- function getVisibilityFromTreeNodeChildren(obs) {
659
- return obs.pipe(reduceWhile((x) => x.allVisible || x.allHidden, (acc, val) => {
660
- acc.allVisible &&= val === "visible";
661
- acc.allHidden &&= val === "hidden";
662
- return acc;
663
- }, { allVisible: true, allHidden: true }), map((x) => {
664
- if (!x) {
665
- return "empty";
666
- }
667
- return x.allVisible ? "visible" : x.allHidden ? "hidden" : "partial";
668
- }));
669
- }
670
- function getVisibilityStatusFromTreeNodeChildren(tooltipMap, ignoreTooltip) {
671
- return (obs) => {
672
- return getVisibilityFromTreeNodeChildren(obs).pipe(map((visibility) => {
673
- if (visibility === "empty") {
674
- visibility = "visible";
675
- }
676
- return createVisibilityStatus(visibility, getTooltipOptions(tooltipMap[visibility], ignoreTooltip));
677
- }));
678
- };
679
- }
680
- function setDifference(lhs, rhs) {
681
- const result = new Set();
682
- lhs.forEach((x) => !rhs.has(x) && result.add(x));
683
- return result;
684
- }
685
- function setIntersection(lhs, rhs) {
686
- const result = new Set();
687
- lhs.forEach((x) => rhs.has(x) && result.add(x));
688
- return result;
689
- }
690
- /**
691
- * Enables display of all given models. Also enables display of all categories and clears always and
692
- * never drawn lists in the viewport.
693
- * @public
694
- */
695
- export async function showAllModels(models, viewport) {
696
- await viewport.addViewedModels(models);
697
- viewport.clearNeverDrawn();
698
- viewport.clearAlwaysDrawn();
699
- await toggleAllCategories(viewport, true);
700
- }
701
- /**
702
- * Disables display of all given models.
703
- * @public
704
- */
705
- export async function hideAllModels(models, viewport) {
706
- viewport.changeModelDisplay(models, false);
707
- }
708
- /**
709
- * Inverts display of all given models.
710
- * @public
711
- */
712
- export async function invertAllModels(models, viewport) {
713
- const notViewedModels = [];
714
- const viewedModels = [];
715
- models.forEach((modelId) => {
716
- if (viewport.viewsModel(modelId)) {
717
- viewedModels.push(modelId);
718
- }
719
- else {
720
- notViewedModels.push(modelId);
721
- }
722
- });
723
- await viewport.addViewedModels(notViewedModels);
724
- viewport.changeModelDisplay(viewedModels, false);
725
- }
726
- /**
727
- * Based on the value of `enable` argument, either enables or disables display of given models.
728
- * @public
729
- */
730
- export async function toggleModels(models, enable, viewport) {
731
- if (!models) {
732
- return;
733
- }
734
- if (enable) {
735
- viewport.changeModelDisplay(models, false);
736
- }
737
- else {
738
- await viewport.addViewedModels(models);
739
- }
740
- }
741
- /**
742
- * Checks if all given models are displayed in given viewport.
743
- * @public
744
- */
745
- export function areAllModelsVisible(models, viewport) {
746
- return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;
747
- }
748
- function getTooltipOptions(key, ignoreTooltip) {
749
- return {
750
- useTooltip: ignoreTooltip ? false : key,
751
- };
752
536
  }
753
537
  //# sourceMappingURL=ModelsTreeVisibilityHandler.js.map