@itwin/tree-widget-react 4.0.0-alpha.6 → 4.0.0-alpha.8

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 (206) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/README.md +2 -1
  3. package/lib/esm/tree-widget-react/TreeWidget.d.ts +6 -1
  4. package/lib/esm/tree-widget-react/TreeWidget.js +19 -2
  5. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  6. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.d.ts +6 -0
  7. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js +22 -23
  8. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.js.map +1 -1
  9. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +1 -1
  10. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
  11. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js +1 -1
  12. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js.map +1 -1
  13. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.d.ts +1 -1
  14. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +4 -4
  15. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
  16. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +2 -0
  17. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.css +1 -0
  18. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.d.ts +12 -4
  19. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js +13 -9
  20. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js.map +1 -1
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +2 -2
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +2 -2
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +9 -2
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +53 -7
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +1 -1
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  30. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +17 -3
  31. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +561 -161
  32. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  33. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +6 -2
  34. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +46 -117
  35. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  36. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +30 -15
  37. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +188 -38
  38. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  39. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +18 -3
  40. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +30 -3
  41. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -1
  42. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.d.ts +24 -0
  43. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +701 -0
  44. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -0
  45. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.d.ts +39 -0
  46. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js +221 -0
  47. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js.map +1 -0
  48. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.d.ts +25 -0
  49. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js +133 -0
  50. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js.map +1 -0
  51. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseIdsCache.d.ts +8 -0
  52. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseIdsCache.js +48 -0
  53. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseIdsCache.js.map +1 -0
  54. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +5 -17
  55. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +5 -62
  56. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  57. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +2 -2
  58. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +11 -5
  59. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  60. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +1 -0
  61. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +13 -11
  62. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +1 -1
  63. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
  64. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
  65. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
  66. package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +38 -23
  67. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +65 -47
  68. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  69. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.d.ts +1 -1
  70. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +4 -4
  71. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
  72. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
  73. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
  74. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
  75. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
  76. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +1 -0
  77. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +2 -1
  79. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +3 -3
  80. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +15 -6
  81. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  82. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.d.ts +6 -4
  83. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +20 -25
  84. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
  85. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +1 -1
  86. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js +10 -4
  87. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js.map +1 -1
  88. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +1 -0
  89. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +7 -3
  90. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
  91. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +1 -1
  92. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
  93. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +1 -1
  94. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js +12 -11
  95. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  96. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +44 -0
  97. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/AlwaysAndNeverDrawnElementInfo.js +81 -31
  98. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
  99. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +33 -0
  100. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +37 -0
  101. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
  102. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +16 -0
  103. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +72 -0
  104. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
  105. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
  106. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +9 -2
  107. package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
  108. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +4 -8
  109. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.js → internal/Tooltip.js} +4 -10
  110. package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
  111. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
  112. package/lib/esm/tree-widget-react/components/{tree-header/SearchBox.css → trees/common/internal/Types.js} +2 -4
  113. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
  114. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveViewport.js.map +1 -0
  115. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +1 -0
  116. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
  117. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
  118. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -0
  119. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +4 -3
  120. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
  121. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
  122. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
  123. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
  124. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +47 -0
  125. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +101 -0
  126. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
  127. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
  128. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/VisibilityChangeEventListener.js +17 -9
  129. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
  130. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +63 -0
  131. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +210 -0
  132. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
  133. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +2 -2
  134. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +8 -8
  135. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  136. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -1
  137. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  138. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +1 -0
  139. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +1 -0
  140. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  141. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +4 -2
  142. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +22 -18
  143. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  144. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  145. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js +1 -1
  146. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  147. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -0
  148. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +39 -38
  149. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  150. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +5 -5
  151. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +25 -24
  152. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  153. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +2 -2
  154. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +2 -2
  155. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  156. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +15 -11
  157. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  158. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  159. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +1 -1
  160. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  161. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +7 -2
  162. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +73 -70
  163. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  164. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +36 -202
  165. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  166. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -9
  167. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +4 -6
  168. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
  169. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -5
  170. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +54 -104
  171. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  172. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -26
  173. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +80 -359
  174. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  175. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.d.ts +27 -0
  176. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js +170 -0
  177. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +1 -0
  178. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseIdsCache.d.ts +8 -0
  179. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseIdsCache.js +47 -0
  180. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseIdsCache.js.map +1 -0
  181. package/lib/public/locales/en/TreeWidget.json +13 -59
  182. package/package.json +19 -20
  183. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +0 -37
  184. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +0 -214
  185. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +0 -1
  186. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +0 -7
  187. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js +0 -11
  188. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +0 -1
  189. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
  190. package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
  191. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
  192. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
  193. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
  194. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
  195. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
  196. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
  197. package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
  198. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
  199. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
  200. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
  201. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
  202. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
  203. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
  204. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
  205. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.d.ts → internal/UseActiveViewport.d.ts} +0 -0
  206. /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 } 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,116 +119,85 @@ 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
- observables.push(this.getSubjectNodeVisibilityStatus({ subjectIds: [...subjects], ignoreTooltip: true }));
125
+ observables.push(this.getSubjectNodeVisibilityStatus({ subjectIds: [...subjects] }));
118
126
  }
119
127
  if (models?.size) {
120
- observables.push(from(models).pipe(mergeMap((modelId) => this.getModelVisibilityStatus({ modelId, ignoreTooltip: true }))));
128
+ observables.push(from(models).pipe(mergeMap((modelId) => this.getModelVisibilityStatus({ modelId }))));
121
129
  }
122
130
  if (categories?.size) {
123
131
  observables.push(from(categories).pipe(mergeMap((key) => {
124
132
  const { modelId, categoryId } = parseCategoryKey(key);
125
- return this.getCategoryDisplayStatus({ modelId, categoryId, ignoreTooltip: true });
133
+ return this.getCategoryDisplayStatus({ modelId, categoryId });
126
134
  })));
127
135
  }
128
136
  if (elements?.size) {
129
137
  observables.push(from(elements).pipe(releaseMainThreadOnItemsCount(50), mergeMap(([categoryKey, elementIds]) => {
130
138
  const { modelId, categoryId } = parseCategoryKey(categoryKey);
131
- return from(elementIds).pipe(releaseMainThreadOnItemsCount(1000), mergeMap((elementId) => this.getElementDisplayStatus({ modelId, categoryId, elementId, ignoreTooltip: true })));
139
+ return from(elementIds).pipe(releaseMainThreadOnItemsCount(1000), mergeMap((elementId) => this.getElementDisplayStatus({ modelId, categoryId, elementId })));
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);
139
144
  }
140
- getSubjectNodeVisibilityStatus({ subjectIds, ignoreTooltip }) {
145
+ getSubjectNodeVisibilityStatus({ subjectIds }) {
141
146
  const result = defer(() => {
142
147
  if (!this._props.viewport.view.isSpatialView()) {
143
- return of(createVisibilityStatus("disabled", getTooltipOptions("modelsTree.subject.nonSpatialView", ignoreTooltip)));
148
+ return of(createVisibilityStatus("disabled"));
144
149
  }
145
- return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(concatAll(), distinct(), mergeMap((modelId) => this.getModelVisibilityStatus({ modelId, ignoreTooltip: true })), map((x) => x.state), getVisibilityStatusFromTreeNodeChildren({
146
- visible: "modelsTree.subject.allModelsVisible",
147
- hidden: "modelsTree.subject.allModelsHidden",
148
- partial: "modelsTree.subject.someModelsHidden",
149
- }, ignoreTooltip));
150
+ return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(concatAll(), distinct(), mergeMap((modelId) => this.getModelVisibilityStatus({ modelId })), mergeVisibilityStatuses);
150
151
  });
151
152
  return createVisibilityHandlerResult(this, { ids: subjectIds }, result, this._props.overrides?.getSubjectNodeVisibility);
152
153
  }
153
- getModelVisibilityStatus({ modelId, ignoreTooltip }) {
154
+ getModelVisibilityStatus({ modelId }) {
154
155
  const result = defer(() => {
155
156
  const viewport = this._props.viewport;
156
157
  if (!viewport.view.isSpatialView()) {
157
- return of(createVisibilityStatus("disabled", getTooltipOptions("modelsTree.model.nonSpatialView", ignoreTooltip)));
158
+ return of(createVisibilityStatus("disabled"));
158
159
  }
159
160
  if (!viewport.view.viewsModel(modelId)) {
160
- return from(this._idsCache.getModelCategories(modelId)).pipe(mergeMap((categoryIds) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), this.getSubModeledElementsVisibilityStatus({
161
- ignoreTooltips: ignoreTooltip,
162
- haveSubModel: "yes",
163
- tooltips: { visible: undefined, hidden: "modelsTree.model.hiddenThroughModelSelector", partial: "modelsTree.model.someSubModelsVisible" },
161
+ return from(this._idsCache.getModelCategoryIds(modelId)).pipe(mergeMap((categoryIds) => from(this._idsCache.getCategoriesModeledElements(modelId, categoryIds))), getSubModeledElementsVisibilityStatus({
164
162
  parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
163
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
165
164
  }));
166
165
  }
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));
170
- }));
166
+ return from(this._idsCache.getModelCategoryIds(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.getCategoryDisplayStatus({ modelId, categoryId })), mergeVisibilityStatuses);
171
167
  });
172
168
  return createVisibilityHandlerResult(this, { id: modelId }, result, this._props.overrides?.getModelDisplayStatus);
173
169
  }
174
- getDefaultCategoryVisibilityStatus({ modelId, categoryId, ignoreTooltip, }) {
170
+ getDefaultCategoryVisibilityStatus({ modelId, categoryId }) {
175
171
  const viewport = this._props.viewport;
176
172
  if (!viewport.view.viewsModel(modelId)) {
177
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.category.hiddenThroughModel", ignoreTooltip));
173
+ return createVisibilityStatus("hidden");
178
174
  }
179
175
  switch (this._props.viewport.perModelCategoryVisibility.getOverride(modelId, categoryId)) {
180
176
  case PerModelCategoryVisibility.Override.Show:
181
- return createVisibilityStatus("visible", getTooltipOptions("modelsTree.category.displayedThroughPerModelOverride", ignoreTooltip));
177
+ return createVisibilityStatus("visible");
182
178
  case PerModelCategoryVisibility.Override.Hide:
183
- return createVisibilityStatus("hidden", getTooltipOptions("modelsTree.category.hiddenThroughPerModelOverride", ignoreTooltip));
179
+ return createVisibilityStatus("hidden");
184
180
  }
185
- const isVisible = viewport.view.viewsCategory(categoryId);
186
- return isVisible
187
- ? createVisibilityStatus("visible", getTooltipOptions("modelsTree.category.displayedThroughCategorySelector", ignoreTooltip))
188
- : createVisibilityStatus("hidden", getTooltipOptions("modelsTree.category.hiddenThroughCategorySelector", ignoreTooltip));
181
+ return createVisibilityStatus(viewport.view.viewsCategory(categoryId) ? "visible" : "hidden");
189
182
  }
190
- getCategoryDisplayStatus({ ignoreTooltip, ...props }) {
183
+ getCategoryDisplayStatus(props) {
191
184
  const result = defer(() => {
192
185
  if (!this._props.viewport.view.viewsModel(props.modelId)) {
193
- return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(this.getSubModeledElementsVisibilityStatus({
194
- ignoreTooltips: ignoreTooltip,
186
+ return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(getSubModeledElementsVisibilityStatus({
195
187
  parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
196
- tooltips: {
197
- visible: undefined,
198
- hidden: "modelsTree.category.hiddenThroughModel",
199
- partial: "modelsTree.category.someElementsOrSubModelsHidden",
200
- },
201
- haveSubModel: "yes",
188
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
202
189
  }));
203
190
  }
204
191
  return this.getVisibilityFromAlwaysAndNeverDrawnElements({
205
- queryProps: props,
206
- tooltips: {
207
- allElementsInAlwaysDrawnList: "modelsTree.category.allElementsVisible",
208
- allElementsInNeverDrawnList: "modelsTree.category.allElementsHidden",
209
- elementsInBothAlwaysAndNeverDrawn: "modelsTree.category.someElementsAreHidden",
210
- noElementsInExclusiveAlwaysDrawnList: "modelsTree.category.allElementsHidden",
192
+ queryProps: {
193
+ categoryIds: [props.categoryId],
194
+ modelId: props.modelId,
211
195
  },
212
196
  defaultStatus: () => this.getDefaultCategoryVisibilityStatus(props),
213
- ignoreTooltip,
214
197
  }).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
215
- return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(this.getSubModeledElementsVisibilityStatus({
216
- tooltips: {
217
- visible: undefined,
218
- hidden: "modelsTree.category.allElementsAndSubModelsHidden",
219
- partial: "modelsTree.category.someElementsOrSubModelsHidden",
220
- },
221
- haveSubModel: "yes",
198
+ return from(this._idsCache.getCategoriesModeledElements(props.modelId, [props.categoryId])).pipe(getSubModeledElementsVisibilityStatus({
222
199
  parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,
223
- ignoreTooltips: ignoreTooltip,
200
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
224
201
  }));
225
202
  }));
226
203
  });
@@ -231,97 +208,33 @@ class ModelsTreeVisibilityHandlerImpl {
231
208
  const info = this.getGroupingNodeInfo(node);
232
209
  const { modelId, categoryId, elementIds } = info;
233
210
  if (!this._props.viewport.view.viewsModel(modelId)) {
234
- return of([...elementIds]).pipe(this.getSubModeledElementsVisibilityStatus({
235
- tooltips: {
236
- visible: undefined,
237
- hidden: undefined,
238
- partial: "modelsTree.groupingNode.someElementsOrSubModelsHidden",
239
- },
211
+ return of([...elementIds]).pipe(filterSubModeledElementIds({ doesSubModelExist: async (id) => this._idsCache.hasSubModel(id) }), getSubModeledElementsVisibilityStatus({
240
212
  parentNodeVisibilityStatus: createVisibilityStatus("hidden"),
241
- haveSubModel: "unknown",
213
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
242
214
  }));
243
215
  }
244
216
  return this.getVisibilityFromAlwaysAndNeverDrawnElements({
245
217
  elements: elementIds,
246
- defaultStatus: () => {
247
- const status = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true });
248
- return createVisibilityStatus(status.state, getTooltipOptions(`modelsTree.groupingNode.${status.state}ThroughCategory`));
249
- },
250
- tooltips: {
251
- allElementsInAlwaysDrawnList: "modelsTree.groupingNode.allElementsVisible",
252
- allElementsInNeverDrawnList: "modelsTree.groupingNode.allElementsHidden",
253
- elementsInBothAlwaysAndNeverDrawn: "modelsTree.groupingNode.someElementsAreHidden",
254
- noElementsInExclusiveAlwaysDrawnList: "modelsTree.groupingNode.allElementsHidden",
255
- },
218
+ defaultStatus: () => this.getDefaultCategoryVisibilityStatus({ categoryId, modelId }),
256
219
  }).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
257
- return of([...elementIds]).pipe(this.getSubModeledElementsVisibilityStatus({
258
- tooltips: {
259
- visible: undefined,
260
- hidden: "modelsTree.groupingNode.allElementsAndSubModelsHidden",
261
- partial: "modelsTree.groupingNode.someElementsOrSubModelsHidden",
262
- },
220
+ return of([...elementIds]).pipe(filterSubModeledElementIds({ doesSubModelExist: async (id) => this._idsCache.hasSubModel(id) }), getSubModeledElementsVisibilityStatus({
263
221
  parentNodeVisibilityStatus: visibilityStatusAlwaysAndNeverDraw,
264
- haveSubModel: "unknown",
222
+ getModelVisibilityStatus: (modelProps) => this.getModelVisibilityStatus(modelProps),
265
223
  }));
266
224
  }));
267
225
  });
268
226
  return createVisibilityHandlerResult(this, { node }, result, this._props.overrides?.getElementGroupingNodeDisplayStatus);
269
227
  }
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
- getElementDisplayStatus({ ignoreTooltip, ...props }) {
228
+ getElementDisplayStatus(props) {
319
229
  const result = defer(() => {
320
230
  const viewport = this._props.viewport;
321
231
  const { elementId, modelId, categoryId } = props;
322
232
  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)));
233
+ const elementStatus = getElementOverriddenVisibility({
234
+ elementId,
235
+ viewport,
236
+ });
237
+ return from(this._idsCache.hasSubModel(elementId)).pipe(mergeMap((hasSubModel) => (hasSubModel ? this.getModelVisibilityStatus({ modelId: elementId }) : of(undefined))), map((subModelVisibilityStatus) => getElementVisibility(viewsModel, elementStatus, this.getDefaultCategoryVisibilityStatus({ categoryId, modelId }), subModelVisibilityStatus)));
325
238
  });
326
239
  return createVisibilityHandlerResult(this, props, result, this._props.overrides?.getElementDisplayStatus);
327
240
  }
@@ -369,7 +282,7 @@ class ModelsTreeVisibilityHandlerImpl {
369
282
  return filteredTree ? filteredTree.getVisibilityChangeTargets(node) : {};
370
283
  }
371
284
  changeFilteredNodeVisibility({ on, ...props }) {
372
- return from(this.getVisibilityChangeTargets(props)).pipe(mergeMap(({ subjects, models, categories, elements }) => {
285
+ return from(this.getVisibilityChangeTargets(props)).pipe(mergeMap(({ subjectIds: subjects, modelIds: models, categories, elements }) => {
373
286
  const observables = new Array();
374
287
  if (subjects?.size) {
375
288
  observables.push(this.changeSubjectNodeState([...subjects], on));
@@ -392,14 +305,14 @@ class ModelsTreeVisibilityHandlerImpl {
392
305
  return merge(...observables);
393
306
  }));
394
307
  }
395
- changeSubjectNodeState(ids, on) {
308
+ changeSubjectNodeState(subjectIds, on) {
396
309
  const result = defer(() => {
397
310
  if (!this._props.viewport.view.isSpatialView()) {
398
311
  return EMPTY;
399
312
  }
400
- return from(this._idsCache.getSubjectModelIds(ids)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));
313
+ return from(this._idsCache.getSubjectModelIds(subjectIds)).pipe(mergeMap((modelIds) => this.changeModelState({ ids: modelIds, on })));
401
314
  });
402
- return createVisibilityHandlerResult(this, { ids, on }, result, this._props.overrides?.changeSubjectNodeState);
315
+ return createVisibilityHandlerResult(this, { ids: subjectIds, on }, result, this._props.overrides?.changeSubjectNodeState);
403
316
  }
404
317
  changeModelState(props) {
405
318
  const { ids, on } = props;
@@ -414,13 +327,13 @@ class ModelsTreeVisibilityHandlerImpl {
414
327
  const idsObs = from(Id64.iterable(ids));
415
328
  if (!on) {
416
329
  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 })));
330
+ 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
331
  }
419
332
  return concat(defer(() => {
420
333
  viewport.perModelCategoryVisibility.clearOverrides(ids);
421
334
  return from(viewport.addViewedModels(ids));
422
335
  }), idsObs.pipe(mergeMap((modelId) => {
423
- return from(this._idsCache.getModelCategories(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })));
336
+ return from(this._idsCache.getModelCategoryIds(modelId)).pipe(concatAll(), mergeMap((categoryId) => this.changeCategoryState({ categoryId, modelId, on: true })));
424
337
  })));
425
338
  });
426
339
  return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeModelState);
@@ -428,8 +341,8 @@ class ModelsTreeVisibilityHandlerImpl {
428
341
  showModelWithoutAnyCategoriesOrElements(modelId) {
429
342
  const viewport = this._props.viewport;
430
343
  return forkJoin({
431
- categories: this._idsCache.getModelCategories(modelId),
432
- alwaysDrawnElements: this.getAlwaysDrawnElements({ modelId }),
344
+ categories: this._idsCache.getModelCategoryIds(modelId),
345
+ alwaysDrawnElements: this._alwaysAndNeverDrawnElements.getAlwaysDrawnElements({ modelId }),
433
346
  }).pipe(mergeMap(async ({ categories, alwaysDrawnElements }) => {
434
347
  const alwaysDrawn = this._props.viewport.alwaysDrawn;
435
348
  if (alwaysDrawn && alwaysDrawnElements) {
@@ -462,7 +375,7 @@ class ModelsTreeVisibilityHandlerImpl {
462
375
  const { modelId, categoryId, on } = props;
463
376
  return concat(props.on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY, defer(() => {
464
377
  this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on);
465
- return this.clearAlwaysAndNeverDrawnElements(props);
378
+ return this._alwaysAndNeverDrawnElements.clearAlwaysAndNeverDrawnElements({ categoryIds: [props.categoryId], modelId: props.modelId });
466
379
  }), from(this._idsCache.getCategoriesModeledElements(modelId, [categoryId])).pipe(mergeMap((modeledElementIds) => this.changeModelState({ ids: modeledElementIds, on }))));
467
380
  });
468
381
  return createVisibilityHandlerResult(this, props, result, this._props.overrides?.changeCategoryState);
@@ -472,7 +385,7 @@ class ModelsTreeVisibilityHandlerImpl {
472
385
  const { modelId, categoryId, elementIds, on } = props;
473
386
  const viewport = this._props.viewport;
474
387
  return concat(on && !viewport.view.viewsModel(modelId) ? this.showModelWithoutAnyCategoriesOrElements(modelId) : EMPTY, defer(() => {
475
- const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId, ignoreTooltip: true });
388
+ const categoryVisibility = this.getDefaultCategoryVisibilityStatus({ categoryId, modelId });
476
389
  const isDisplayedByDefault = categoryVisibility.state === "visible";
477
390
  return this.queueElementsVisibilityChange(elementIds, on, isDisplayedByDefault);
478
391
  }), from(elementIds).pipe(mergeMap(async (elementId) => ({ elementId, isSubModel: await this._idsCache.hasSubModel(elementId) })), filter(({ isSubModel }) => isSubModel), map(({ elementId }) => elementId), toArray(), mergeMap((subModelIds) => this.changeModelState({ ids: subModelIds, on }))));
@@ -500,7 +413,7 @@ class ModelsTreeVisibilityHandlerImpl {
500
413
  const changeFinished = finishedSubject.pipe(startWith(false), shareReplay(1), filter((finished) => finished));
501
414
  const changeObservable = from(elementIds).pipe(
502
415
  // 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({
416
+ takeUntil(changeFinished), changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault, viewport: this._props.viewport }), tap({
504
417
  next: () => {
505
418
  // notify that visibility change is finished
506
419
  finishedSubject.next(true);
@@ -516,118 +429,40 @@ class ModelsTreeVisibilityHandlerImpl {
516
429
  },
517
430
  }), map(() => undefined));
518
431
  }
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
- getVisibilityFromAlwaysAndNeverDrawnElements({ ignoreTooltip, ...props }) {
432
+ getVisibilityFromAlwaysAndNeverDrawnElements(props) {
579
433
  const viewport = this._props.viewport;
580
434
  if (viewport.isAlwaysDrawnExclusive) {
581
435
  if (!viewport?.alwaysDrawn?.size) {
582
- return of(createVisibilityStatus("hidden", getTooltipOptions(props.tooltips.noElementsInExclusiveAlwaysDrawnList, ignoreTooltip)));
436
+ return of(createVisibilityStatus("hidden"));
583
437
  }
584
438
  }
585
439
  else if (!viewport?.neverDrawn?.size && !viewport?.alwaysDrawn?.size) {
586
440
  return of(props.defaultStatus());
587
441
  }
588
442
  if ("elements" in props) {
589
- return of(this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
443
+ return of(getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
590
444
  ...props,
591
445
  alwaysDrawn: viewport.alwaysDrawn?.size ? setIntersection(props.elements, viewport.alwaysDrawn) : undefined,
592
446
  neverDrawn: viewport.neverDrawn?.size ? setIntersection(props.elements, viewport.neverDrawn) : undefined,
593
447
  totalCount: props.elements.size,
594
- ignoreTooltip,
448
+ viewport,
595
449
  }));
596
450
  }
597
- const { modelId, categoryId } = props.queryProps;
598
- const totalCount = categoryId ? this._idsCache.getCategoryElementsCount(modelId, categoryId) : this._idsCache.getModelElementCount(modelId);
451
+ const { modelId, categoryIds } = props.queryProps;
452
+ assert(modelId !== undefined);
453
+ const totalCount = this._idsCache.getCategoryElementsCount(modelId, categoryIds[0]);
599
454
  return forkJoin({
600
455
  totalCount,
601
- alwaysDrawn: this.getAlwaysDrawnElements(props.queryProps),
602
- neverDrawn: this.getNeverDrawnElements(props.queryProps),
456
+ alwaysDrawn: this._alwaysAndNeverDrawnElements.getAlwaysDrawnElements(props.queryProps),
457
+ neverDrawn: this._alwaysAndNeverDrawnElements.getNeverDrawnElements(props.queryProps),
603
458
  }).pipe(map((state) => {
604
- return this.getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
459
+ return getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
605
460
  ...props,
606
461
  ...state,
607
- ignoreTooltip,
462
+ viewport,
608
463
  });
609
464
  }));
610
465
  }
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
466
  getGroupingNodeInfo(node) {
632
467
  const modelId = ModelsTreeNode.getModelId(node);
633
468
  const categoryId = ModelsTreeNode.getCategoryId(node);
@@ -635,119 +470,5 @@ class ModelsTreeVisibilityHandlerImpl {
635
470
  const elementIds = new Set(node.groupedInstanceKeys.map((key) => key.id));
636
471
  return { modelId, categoryId, elementIds };
637
472
  }
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
473
  }
753
474
  //# sourceMappingURL=ModelsTreeVisibilityHandler.js.map