@itwin/tree-widget-react 4.0.0-alpha.2 → 4.0.0-alpha.20

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 (309) hide show
  1. package/CHANGELOG.md +281 -1
  2. package/README.md +190 -63
  3. package/lib/esm/tree-widget-react/TreeWidget.d.ts +7 -4
  4. package/lib/esm/tree-widget-react/TreeWidget.js +32 -12
  5. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  6. package/lib/esm/tree-widget-react/components/TreeWidgetComponentImpl.d.ts +7 -1
  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 +4 -3
  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 +4 -3
  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 +6 -6
  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 +3 -2
  17. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.d.ts +4 -4
  18. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.js +1 -1
  19. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.js.map +1 -1
  20. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.css +1 -0
  21. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.d.ts +12 -5
  22. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js +13 -9
  23. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js.map +1 -1
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +3 -3
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +3 -2
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +11 -7
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +64 -14
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  30. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +8 -6
  31. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +4 -4
  32. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  33. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +41 -8
  34. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +700 -125
  35. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  36. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +18 -7
  37. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +124 -83
  38. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  39. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +70 -0
  40. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +504 -0
  41. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -0
  42. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +41 -0
  43. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +50 -0
  44. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -0
  45. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.d.ts +27 -0
  46. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js +136 -0
  47. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseFilteredPaths.js.map +1 -0
  48. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.d.ts +54 -0
  49. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +291 -0
  50. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -0
  51. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.d.ts +64 -0
  52. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js +94 -0
  53. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js.map +1 -0
  54. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.d.ts +36 -0
  55. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.js +219 -0
  56. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/FilteredTree.js.map +1 -0
  57. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +12 -0
  58. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +19 -0
  59. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -0
  60. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +30 -0
  61. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +47 -0
  62. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -0
  63. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.d.ts +45 -0
  64. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +569 -0
  65. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -0
  66. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.d.ts +6 -0
  67. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.js +33 -0
  68. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.js.map +1 -0
  69. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +24 -0
  70. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +115 -0
  71. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -0
  72. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.d.ts +44 -0
  73. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js +61 -0
  74. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js.map +1 -0
  75. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +50 -0
  76. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +364 -0
  77. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -0
  78. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.d.ts +19 -0
  79. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js +32 -0
  80. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js.map +1 -0
  81. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.d.ts +20 -0
  82. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js +53 -0
  83. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js.map +1 -0
  84. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.d.ts +37 -0
  85. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +177 -0
  86. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -0
  87. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.d.ts +55 -0
  88. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.js +53 -0
  89. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.js.map +1 -0
  90. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.d.ts +32 -0
  91. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js +168 -0
  92. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/FilteredTree.js.map +1 -0
  93. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +11 -23
  94. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +22 -76
  95. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  96. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.d.ts +28 -4
  97. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js +73 -2
  98. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.js.map +1 -1
  99. package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js +1 -0
  100. package/lib/esm/tree-widget-react/components/trees/common/TreeErrors.js.map +1 -1
  101. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.d.ts +186 -0
  102. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js +79 -0
  103. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js.map +1 -0
  104. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +15 -7
  105. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +33 -22
  106. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  107. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
  108. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
  109. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
  110. package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +45 -23
  111. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +110 -44
  112. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  113. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.d.ts +2 -3
  114. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +4 -5
  115. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
  116. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
  117. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
  118. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
  119. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.css +25 -0
  120. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.d.ts +27 -0
  121. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js +47 -0
  122. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js.map +1 -0
  123. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
  124. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +4 -3
  125. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
  126. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.css +16 -0
  127. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.d.ts +7 -0
  128. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js +19 -0
  129. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js.map +1 -0
  130. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +11 -0
  131. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +9 -12
  132. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +55 -38
  133. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  134. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.css +2 -1
  135. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.d.ts +24 -8
  136. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +41 -25
  137. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
  138. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +6 -1
  139. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js +13 -4
  140. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js.map +1 -1
  141. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +6 -5
  142. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +7 -7
  143. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
  144. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.d.ts +5 -5
  145. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +10 -6
  146. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
  147. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +5 -3
  148. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js +17 -15
  149. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  150. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +74 -0
  151. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js +207 -0
  152. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
  153. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +43 -0
  154. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +47 -0
  155. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
  156. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +12 -0
  157. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +112 -0
  158. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
  159. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
  160. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +10 -2
  161. package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
  162. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +4 -8
  163. package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js +18 -0
  164. package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
  165. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
  166. package/lib/esm/tree-widget-react/components/{tree-header/SearchBox.css → trees/common/internal/Types.js} +2 -4
  167. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
  168. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveTreeWidgetViewport.d.ts +6 -0
  169. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveTreeWidgetViewport.js +24 -0
  170. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveTreeWidgetViewport.js.map +1 -0
  171. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +3 -2
  172. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
  173. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
  174. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -1
  175. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +5 -4
  176. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
  177. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.d.ts +17 -0
  178. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js +32 -0
  179. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js.map +1 -0
  180. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
  181. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
  182. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
  183. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +70 -0
  184. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +172 -0
  185. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
  186. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
  187. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js +60 -0
  188. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
  189. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +39 -0
  190. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +160 -0
  191. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
  192. package/lib/esm/tree-widget-react/components/trees/common/internal/useGuid.d.ts +3 -0
  193. package/lib/esm/tree-widget-react/components/trees/common/internal/useGuid.js +12 -0
  194. package/lib/esm/tree-widget-react/components/trees/common/internal/useGuid.js.map +1 -0
  195. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.d.ts +68 -0
  196. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js +170 -0
  197. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js.map +1 -0
  198. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +20 -0
  199. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +46 -0
  200. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -0
  201. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.d.ts +91 -0
  202. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js +112 -0
  203. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseFilteredTree.js.map +1 -0
  204. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.d.ts +236 -0
  205. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js +600 -0
  206. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js.map +1 -0
  207. package/lib/esm/tree-widget-react/components/trees/common/useGuid.d.ts +2 -0
  208. package/lib/esm/tree-widget-react/components/trees/common/useGuid.js +11 -0
  209. package/lib/esm/tree-widget-react/components/trees/common/useGuid.js.map +1 -0
  210. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +7 -2
  211. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +29 -20
  212. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  213. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +2 -6
  214. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +2 -2
  215. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  216. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +5 -6
  217. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +36 -21
  218. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  219. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +9 -2
  220. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +48 -36
  221. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  222. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +2 -6
  223. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js +2 -2
  224. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  225. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -4
  226. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +80 -74
  227. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  228. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +7 -10
  229. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +45 -36
  230. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  231. package/lib/esm/tree-widget-react/components/trees/index.d.ts +16 -5
  232. package/lib/esm/tree-widget-react/components/trees/index.js +16 -4
  233. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  234. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +3 -3
  235. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +3 -2
  236. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  237. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.d.ts +3 -3
  238. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +34 -24
  239. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  240. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +14 -7
  241. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +11 -7
  242. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  243. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +24 -20
  244. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +193 -154
  245. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  246. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +60 -10
  247. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +97 -238
  248. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  249. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +22 -25
  250. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +280 -298
  251. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  252. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.d.ts +1 -1
  253. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.js.map +1 -1
  254. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.d.ts +41 -0
  255. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js +253 -0
  256. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +1 -0
  257. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.d.ts +27 -0
  258. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.js +148 -0
  259. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/FilteredTree.js.map +1 -0
  260. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.d.ts +76 -0
  261. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +269 -0
  262. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -0
  263. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.d.ts +53 -0
  264. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.js +71 -0
  265. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.js.map +1 -0
  266. package/lib/esm/tree-widget-react-internal.d.ts +12 -0
  267. package/lib/esm/tree-widget-react-internal.js +18 -0
  268. package/lib/esm/tree-widget-react-internal.js.map +1 -0
  269. package/lib/public/locales/en/TreeWidget.json +41 -54
  270. package/package.json +76 -79
  271. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.d.ts +0 -28
  272. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js +0 -87
  273. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +0 -1
  274. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.d.ts +0 -7
  275. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js +0 -66
  276. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContextProvider.js.map +0 -1
  277. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
  278. package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js +0 -24
  279. package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
  280. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.d.ts +0 -7
  281. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js +0 -21
  282. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
  283. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
  284. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
  285. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
  286. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
  287. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
  288. package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
  289. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +0 -20
  290. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +0 -127
  291. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +0 -1
  292. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTreeContent.d.ts +0 -7
  293. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTreeContent.js +0 -12
  294. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTreeContent.js.map +0 -1
  295. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
  296. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
  297. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
  298. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
  299. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +0 -138
  300. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
  301. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +0 -25
  302. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +0 -173
  303. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +0 -1
  304. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -106
  305. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +0 -663
  306. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +0 -1
  307. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
  308. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js +0 -48
  309. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
@@ -0,0 +1,600 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { concat, concatAll, defaultIfEmpty, defer, EMPTY, filter, forkJoin, from, identity, map, merge, mergeMap, of, reduce, shareReplay, startWith, Subject, take, takeLast, takeUntil, tap, } from "rxjs";
6
+ import { assert, Id64 } from "@itwin/core-bentley";
7
+ import { createVisibilityStatus } from "../Tooltip.js";
8
+ import { getSetFromId64Arg, releaseMainThreadOnItemsCount, setDifference, setIntersection } from "../Utils.js";
9
+ import { changeElementStateNoChildrenOperator, enableCategoryDisplay, getVisibilityFromAlwaysAndNeverDrawnElementsImpl, mergeVisibilityStatuses, } from "../VisibilityUtils.js";
10
+ /**
11
+ * Base class for visibility status getters and modifiers.
12
+ *
13
+ * It provides methods that help retrieve and change visibility status of models, categories, elements.
14
+ * @internal
15
+ */
16
+ export class BaseVisibilityHelper {
17
+ #props;
18
+ #alwaysAndNeverDrawnElements;
19
+ #elementChangeQueue = new Subject();
20
+ #subscriptions = [];
21
+ constructor(props) {
22
+ this.#props = props;
23
+ this.#alwaysAndNeverDrawnElements = this.#props.alwaysAndNeverDrawnElementInfo;
24
+ this.#subscriptions.push(this.#elementChangeQueue.pipe(concatAll()).subscribe());
25
+ }
26
+ [Symbol.dispose]() {
27
+ this.#subscriptions.forEach((x) => x.unsubscribe());
28
+ }
29
+ /**
30
+ * Removes "always drawn exclusive" mode from the viewport without affecting any visibilities.
31
+ *
32
+ * This is achieved by:
33
+ * - Resets `alwaysDrawn` exclusive flag to `false`;
34
+ * - Turns off all categories;
35
+ * - Clears always drawn list;
36
+ * - Removes all per-model category overrides. */
37
+ removeAlwaysDrawnExclusive() {
38
+ return from(this.#props.baseIdsCache.getAllCategories()).pipe(map(({ drawingCategories, spatialCategories }) => {
39
+ const categoriesToTurnOff = this.#props.viewport.viewType === "2d" ? drawingCategories : spatialCategories;
40
+ if (categoriesToTurnOff) {
41
+ this.#props.viewport.changeCategoryDisplay({ categoryIds: categoriesToTurnOff, display: false, enableAllSubCategories: false });
42
+ }
43
+ this.#props.viewport.clearNeverDrawn();
44
+ this.#props.viewport.clearPerModelCategoryOverrides();
45
+ this.#props.viewport.setAlwaysDrawn({ elementIds: this.#props.viewport.alwaysDrawn ? new Set([...this.#props.viewport.alwaysDrawn]) : new Set() });
46
+ }));
47
+ }
48
+ /**
49
+ * Returns visibility status of models.
50
+ *
51
+ * Determines visibility status by checking:
52
+ * - Models visibility in the viewport;
53
+ * - Models' subModels visibility (if elements' modelId is in the provided modelIds, and element is itself a model, then it is considered a subModel);
54
+ * - Categories visibility in the viewport (if elements' modelId is in the provided modelIds, then its' category gets checked).
55
+ */
56
+ getModelsVisibilityStatus(props) {
57
+ const result = defer(() => {
58
+ const { modelIds, type } = props;
59
+ if ((type === "GeometricModel3d" && this.#props.viewport.viewType !== "3d") || (type === "GeometricModel2d" && this.#props.viewport.viewType !== "2d")) {
60
+ return of(createVisibilityStatus("disabled"));
61
+ }
62
+ return from(Id64.iterable(modelIds)).pipe(mergeMap((modelId) => {
63
+ // For hidden models we only need to check subModels
64
+ if (!this.#props.viewport.viewsModel(modelId)) {
65
+ return this.#props.baseIdsCache.getSubModels({ modelIds: modelId }).pipe(mergeMap(({ subModels }) => {
66
+ if (subModels && Id64.sizeOf(subModels) > 0) {
67
+ return this.getModelsVisibilityStatus({ modelIds: subModels, type }).pipe(map((subModelsVisibilityStatus) => subModelsVisibilityStatus.state !== "hidden" ? createVisibilityStatus("partial") : createVisibilityStatus("hidden")));
68
+ }
69
+ return of(createVisibilityStatus("hidden"));
70
+ }));
71
+ }
72
+ // For visible models we need to check all categories
73
+ return this.#props.baseIdsCache.getCategories({ modelIds: modelId }).pipe(mergeMap(({ drawingCategories, spatialCategories }) => merge(drawingCategories
74
+ ? of(drawingCategories).pipe(mergeMap((categoryIds) => this.getCategoriesVisibilityStatus({ modelId, categoryIds, type: "DrawingCategory" })))
75
+ : EMPTY, spatialCategories
76
+ ? of(spatialCategories).pipe(mergeMap((categoryIds) => this.getCategoriesVisibilityStatus({ modelId, categoryIds, type: "SpatialCategory" })))
77
+ : EMPTY)), defaultIfEmpty(createVisibilityStatus("visible")));
78
+ }), mergeVisibilityStatuses);
79
+ });
80
+ return this.#props.overrideHandler
81
+ ? this.#props.overrideHandler.createVisibilityHandlerResult({
82
+ overrideProps: { modelIds: props.modelIds },
83
+ nonOverriddenResult: result,
84
+ override: this.#props.overrides?.getModelsVisibilityStatus,
85
+ })
86
+ : result;
87
+ }
88
+ /**
89
+ * Gets visibility status of a model's categories, assuming model is visible.
90
+ *
91
+ * Determines visibility status by checking:
92
+ * - Elements in the viewports' always/never drawn lists;
93
+ * - Default categories visibility status in the viewport;
94
+ * - SubModels that are related to the modelId and categoryIds
95
+ */
96
+ getVisibleModelCategoriesVisibilityStatus({ modelId, categoryIds, type, }) {
97
+ return merge(this.getVisibilityFromAlwaysAndNeverDrawnElements({
98
+ queryProps: { modelId, categoryIds },
99
+ defaultStatus: () => this.getVisibleModelCategoriesDirectVisibilityStatus({ modelId, categoryIds }),
100
+ }), this.#props.baseIdsCache.getSubModels({ modelId, categoryIds }).pipe(mergeMap(({ subModels }) => {
101
+ if (subModels && Id64.sizeOf(subModels) > 0) {
102
+ return this.getModelsVisibilityStatus({ modelIds: subModels, type });
103
+ }
104
+ return EMPTY;
105
+ }))).pipe(mergeVisibilityStatuses);
106
+ }
107
+ /** Gets visibility status of sub-categories, assuming category is visible. */
108
+ getVisibleCategorySubCategoriesVisibilityStatus(props) {
109
+ const { subCategoryIds } = props;
110
+ let subCategoryVisibility = "unknown";
111
+ for (const subCategoryId of Id64.iterable(subCategoryIds)) {
112
+ const isSubCategoryVisible = this.#props.viewport.viewsSubCategory(subCategoryId);
113
+ if (isSubCategoryVisible && subCategoryVisibility === "hidden") {
114
+ return createVisibilityStatus("partial");
115
+ }
116
+ if (!isSubCategoryVisible && subCategoryVisibility === "visible") {
117
+ return createVisibilityStatus("partial");
118
+ }
119
+ subCategoryVisibility = isSubCategoryVisible ? "visible" : "hidden";
120
+ }
121
+ // If visibility is unknown, no subCategories were provided,
122
+ // Since category is visible we return visible
123
+ return createVisibilityStatus(subCategoryVisibility === "unknown" ? "visible" : subCategoryVisibility);
124
+ }
125
+ /**
126
+ * Gets visibility status of sub-categories.
127
+ *
128
+ * Determines visibility status by checking:
129
+ * - Models that contain the category visibility;
130
+ * - Per model category visibility overrides;
131
+ * - Category selector visibility in the viewport.
132
+ * - Sub-categories visibility in the viewport.
133
+ */
134
+ getSubCategoriesVisibilityStatus(props) {
135
+ return (props.modelId ? of({ id: props.categoryId, models: props.modelId }) : from(this.#props.baseIdsCache.getModels({ categoryIds: props.categoryId }))).pipe(map(({ models }) => {
136
+ let visibility = "unknown";
137
+ let nonDefaultModelDisplayStatesCount = 0;
138
+ for (const modelId of Id64.iterable(models ?? [])) {
139
+ if (!this.#props.viewport.viewsModel(modelId)) {
140
+ if (visibility === "visible") {
141
+ return createVisibilityStatus("partial");
142
+ }
143
+ visibility = "hidden";
144
+ ++nonDefaultModelDisplayStatesCount;
145
+ continue;
146
+ }
147
+ const override = this.#props.viewport.getPerModelCategoryOverride({ modelId, categoryId: props.categoryId });
148
+ if (override === "show") {
149
+ if (visibility === "hidden") {
150
+ return createVisibilityStatus("partial");
151
+ }
152
+ visibility = "visible";
153
+ ++nonDefaultModelDisplayStatesCount;
154
+ continue;
155
+ }
156
+ if (override === "hide") {
157
+ if (visibility === "visible") {
158
+ return createVisibilityStatus("partial");
159
+ }
160
+ visibility = "hidden";
161
+ ++nonDefaultModelDisplayStatesCount;
162
+ continue;
163
+ }
164
+ }
165
+ if (models && Id64.sizeOf(models) > 0 && nonDefaultModelDisplayStatesCount === Id64.sizeOf(models)) {
166
+ assert(visibility === "visible" || visibility === "hidden");
167
+ return createVisibilityStatus(visibility);
168
+ }
169
+ if (!this.#props.viewport.viewsCategory(props.categoryId)) {
170
+ return createVisibilityStatus(visibility === "visible" ? "partial" : "hidden");
171
+ }
172
+ if (Id64.sizeOf(props.subCategoryIds) === 0) {
173
+ if (visibility === "hidden") {
174
+ return createVisibilityStatus("partial");
175
+ }
176
+ return createVisibilityStatus("visible");
177
+ }
178
+ const subCategoriesVisibility = this.getVisibleCategorySubCategoriesVisibilityStatus({ subCategoryIds: props.subCategoryIds });
179
+ return subCategoriesVisibility.state === visibility || visibility === "unknown" ? subCategoriesVisibility : createVisibilityStatus("partial");
180
+ }), mergeVisibilityStatuses);
181
+ }
182
+ /**
183
+ * Gets visibility status of categories.
184
+ *
185
+ * Determines visibility status by checking:
186
+ * - Categories visibility;
187
+ * - Visibility of models that are related to the categories;
188
+ * - sub-categories visibility.
189
+ */
190
+ getCategoriesVisibilityStatus(props) {
191
+ const result = defer(() => {
192
+ const { categoryIds, modelId: modelIdFromProps, type } = props;
193
+ if (Id64.sizeOf(categoryIds) === 0 || this.#props.viewport.viewType === "other") {
194
+ return EMPTY;
195
+ }
196
+ const isSupportedInView = (this.#props.viewport.viewType === "3d" && type === "SpatialCategory") || (this.#props.viewport.viewType === "2d" && type === "DrawingCategory");
197
+ if (!isSupportedInView) {
198
+ return of(createVisibilityStatus("disabled"));
199
+ }
200
+ return (modelIdFromProps
201
+ ? from(Id64.iterable(categoryIds)).pipe(map((categoryId) => ({ id: categoryId, models: modelIdFromProps })))
202
+ : this.#props.baseIdsCache.getModels({ categoryIds })).pipe(mergeMap(({ id, models }) => {
203
+ if (!this.#props.viewport.isAlwaysDrawnExclusive) {
204
+ return of({ id, models });
205
+ }
206
+ // Ignore categories that don't have root geometric elements in always drawn exclusive mode
207
+ if (!models) {
208
+ return EMPTY;
209
+ }
210
+ return from(Id64.iterable(models)).pipe(mergeMap((modelId) => forkJoin({
211
+ modelId: of(modelId),
212
+ elementCount: this.#props.baseIdsCache.getElementsCount({ modelId, categoryId: id }),
213
+ })), reduce((acc, { modelId, elementCount }) => {
214
+ if (elementCount > 0) {
215
+ acc.models.push(modelId);
216
+ }
217
+ return acc;
218
+ }, { id, models: new Array() }), filter(({ models: modelsWithElements }) => modelsWithElements.length > 0));
219
+ }), map(({ id, models }) => {
220
+ const acc = { categoryId: id, visibleModels: new Array(), hiddenModels: new Array() };
221
+ if (!models) {
222
+ return acc;
223
+ }
224
+ for (const modelId of Id64.iterable(models)) {
225
+ if (this.#props.viewport.viewsModel(modelId)) {
226
+ acc.visibleModels.push(modelId);
227
+ }
228
+ else {
229
+ acc.hiddenModels.push(modelId);
230
+ }
231
+ }
232
+ return acc;
233
+ }), mergeMap(({ categoryId, visibleModels, hiddenModels }) => {
234
+ return merge(
235
+ // For hidden models we only need to check subModels
236
+ hiddenModels.length > 0
237
+ ? this.#props.baseIdsCache.getSubModels({ modelIds: hiddenModels, categoryId }).pipe(mergeMap(({ subModels }) => {
238
+ if (subModels && Id64.sizeOf(subModels) > 0) {
239
+ return this.getModelsVisibilityStatus({
240
+ modelIds: subModels,
241
+ type: this.#props.viewport.viewType === "2d" ? "GeometricModel2d" : "GeometricModel3d",
242
+ }).pipe(map((subModelsVisibilityStatus) => subModelsVisibilityStatus.state !== "hidden" ? createVisibilityStatus("partial") : createVisibilityStatus("hidden")));
243
+ }
244
+ return of(createVisibilityStatus("hidden"));
245
+ }))
246
+ : EMPTY,
247
+ // For visible models we need to check all categories
248
+ visibleModels.length > 0
249
+ ? from(visibleModels).pipe(mergeMap((modelId) => this.getVisibleModelCategoriesVisibilityStatus({
250
+ modelId,
251
+ categoryIds: categoryId,
252
+ type: this.#props.viewport.viewType === "2d" ? "GeometricModel2d" : "GeometricModel3d",
253
+ })))
254
+ : EMPTY,
255
+ // We need to check subCategories as well
256
+ this.#props.baseIdsCache.getSubCategories({ categoryIds: categoryId }).pipe(mergeMap(({ subCategories }) => {
257
+ if (subCategories && Id64.sizeOf(subCategories) > 0) {
258
+ return this.getSubCategoriesVisibilityStatus({ categoryId, modelId: modelIdFromProps, subCategoryIds: subCategories });
259
+ }
260
+ return EMPTY;
261
+ }))).pipe(defaultIfEmpty(createVisibilityStatus(!this.#props.viewport.isAlwaysDrawnExclusive && this.#props.viewport.viewsCategory(categoryId) ? "visible" : "hidden")));
262
+ }), mergeVisibilityStatuses);
263
+ });
264
+ return this.#props.overrideHandler
265
+ ? this.#props.overrideHandler.createVisibilityHandlerResult({
266
+ overrideProps: props,
267
+ nonOverriddenResult: result,
268
+ override: this.#props.overrides?.getCategoriesVisibilityStatus,
269
+ })
270
+ : result;
271
+ }
272
+ /**
273
+ * Gets visibility status of categories, assuming model is visible.
274
+ *
275
+ * Determines visibility status by checking:
276
+ * - Per model category visibility overrides;
277
+ * - Category selector visibility in the viewport.
278
+ */
279
+ getVisibleModelCategoriesDirectVisibilityStatus({ modelId, categoryIds }) {
280
+ const viewport = this.#props.viewport;
281
+ let visibleCount = 0;
282
+ for (const categoryId of Id64.iterable(categoryIds)) {
283
+ const override = this.#props.viewport.getPerModelCategoryOverride({ modelId, categoryId });
284
+ if (override === "show" || (override === "none" && viewport.viewsCategory(categoryId))) {
285
+ ++visibleCount;
286
+ continue;
287
+ }
288
+ if (visibleCount > 0) {
289
+ return createVisibilityStatus("partial");
290
+ }
291
+ }
292
+ return visibleCount > 0 ? createVisibilityStatus("visible") : createVisibilityStatus("hidden");
293
+ }
294
+ /**
295
+ * Gets visibility status of elements.
296
+ *
297
+ * Determines visibility status by checking:
298
+ * - Elements in the viewports' always/never drawn lists;
299
+ * - Related categories and models visibility status;
300
+ * - Sub-models that are related to the specified elements.
301
+ */
302
+ getElementsVisibilityStatus(props) {
303
+ const result = defer(() => {
304
+ const { elementIds, modelId, categoryId, type } = props;
305
+ if (this.#props.viewport.viewType === "other") {
306
+ return EMPTY;
307
+ }
308
+ const isSupportedInView = (this.#props.viewport.viewType === "3d" && type === "GeometricElement3d") || (this.#props.viewport.viewType === "2d" && type === "GeometricElement2d");
309
+ if (!isSupportedInView) {
310
+ return of(createVisibilityStatus("disabled"));
311
+ }
312
+ // TODO: check child elements that are subModels
313
+ if (!this.#props.viewport.viewsModel(modelId)) {
314
+ return from(elementIds).pipe(releaseMainThreadOnItemsCount(100), mergeMap((elementId) => this.#props.baseIdsCache.hasSubModel(elementId).pipe(mergeMap((isSubModel) => {
315
+ if (isSubModel) {
316
+ return this.getModelsVisibilityStatus({
317
+ modelIds: elementId,
318
+ type: this.#props.viewport.viewType === "2d" ? "GeometricModel2d" : "GeometricModel3d",
319
+ }).pipe(map((subModelVisibilityStatus) => subModelVisibilityStatus.state !== "hidden" ? createVisibilityStatus("partial") : createVisibilityStatus("hidden")));
320
+ }
321
+ return of(createVisibilityStatus("hidden"));
322
+ }))), mergeVisibilityStatuses);
323
+ }
324
+ // TODO: check child elements
325
+ // TODO: check child element categories
326
+ // TODO: check child elements that are subModels
327
+ return this.getVisibilityFromAlwaysAndNeverDrawnElements({
328
+ elements: elementIds,
329
+ defaultStatus: () => this.getVisibleModelCategoriesDirectVisibilityStatus({ categoryIds: categoryId, modelId }),
330
+ }).pipe(mergeMap((visibilityStatusAlwaysAndNeverDraw) => {
331
+ return from(Id64.iterable(elementIds)).pipe(mergeMap((elementId) => this.#props.baseIdsCache.hasSubModel(elementId).pipe(mergeMap((isSubModel) => {
332
+ if (isSubModel) {
333
+ return this.getModelsVisibilityStatus({
334
+ modelIds: elementId,
335
+ type: this.#props.viewport.viewType === "2d" ? "GeometricModel2d" : "GeometricModel3d",
336
+ }).pipe(map((subModelVisibilityStatus) => subModelVisibilityStatus.state !== visibilityStatusAlwaysAndNeverDraw.state
337
+ ? createVisibilityStatus("partial")
338
+ : visibilityStatusAlwaysAndNeverDraw));
339
+ }
340
+ return of(visibilityStatusAlwaysAndNeverDraw);
341
+ }))), mergeVisibilityStatuses);
342
+ }));
343
+ });
344
+ return this.#props.overrideHandler
345
+ ? this.#props.overrideHandler.createVisibilityHandlerResult({
346
+ overrideProps: props,
347
+ nonOverriddenResult: result,
348
+ override: this.#props.overrides?.getElementsVisibilityStatus,
349
+ })
350
+ : result;
351
+ }
352
+ /** Gets visibility status of elements based on viewport's always/never drawn elements and related categories and models. */
353
+ getVisibilityFromAlwaysAndNeverDrawnElements(props) {
354
+ const viewport = this.#props.viewport;
355
+ if (viewport.isAlwaysDrawnExclusive) {
356
+ if (!viewport?.alwaysDrawn?.size) {
357
+ return of(createVisibilityStatus("hidden"));
358
+ }
359
+ }
360
+ else if (!viewport?.neverDrawn?.size && !viewport?.alwaysDrawn?.size) {
361
+ return of(props.defaultStatus());
362
+ }
363
+ if ("elements" in props) {
364
+ return of(getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
365
+ ...props,
366
+ alwaysDrawn: viewport.alwaysDrawn?.size ? setIntersection(Id64.iterable(props.elements), viewport.alwaysDrawn) : undefined,
367
+ neverDrawn: viewport.neverDrawn?.size ? setIntersection(Id64.iterable(props.elements), viewport.neverDrawn) : undefined,
368
+ totalCount: Id64.sizeOf(props.elements),
369
+ viewport,
370
+ }));
371
+ }
372
+ const { modelId, categoryIds } = props.queryProps;
373
+ return from(Id64.iterable(categoryIds)).pipe(releaseMainThreadOnItemsCount(100), mergeMap((categoryId) => {
374
+ return forkJoin({
375
+ categoryId: of(categoryId),
376
+ totalCount: this.#props.baseIdsCache.getElementsCount({ modelId, categoryId }),
377
+ alwaysDrawn: this.#alwaysAndNeverDrawnElements.getAlwaysOrNeverDrawnElements({ modelIds: modelId, categoryIds: categoryId, setType: "always" }),
378
+ neverDrawn: this.#alwaysAndNeverDrawnElements.getAlwaysOrNeverDrawnElements({ modelIds: modelId, categoryIds: categoryId, setType: "never" }),
379
+ });
380
+ }),
381
+ // There is a known bug:
382
+ // Categories that don't have root elements will make visibility result incorrect
383
+ // E.g.:
384
+ // - CategoryA
385
+ // - ElementA (CategoryA is visible)
386
+ // - ChildElementB (CategoryB is hidden) ChildElementB is in always drawn list
387
+ // Result will be "partial" because CategoryB will return hidden visibility, even though all elements are visible
388
+ // TODO fix with: https://github.com/iTwin/viewer-components-react/issues/1100
389
+ mergeMap((state) => {
390
+ if (this.#props.viewport.isAlwaysDrawnExclusive && state.totalCount === 0) {
391
+ return EMPTY;
392
+ }
393
+ return of(getVisibilityFromAlwaysAndNeverDrawnElementsImpl({
394
+ ...props,
395
+ ...state,
396
+ viewport,
397
+ defaultStatus: () => props.defaultStatus(state.categoryId),
398
+ }));
399
+ }), defaultIfEmpty(createVisibilityStatus("hidden")), mergeVisibilityStatuses);
400
+ }
401
+ /**
402
+ * Changes visibility status of models.
403
+ *
404
+ * Also, changes visibility status of related categories and sub-models.
405
+ */
406
+ changeModelsVisibilityStatus(props) {
407
+ const result = defer(() => {
408
+ const { modelIds, on } = props;
409
+ if (Id64.sizeOf(modelIds) === 0) {
410
+ return EMPTY;
411
+ }
412
+ const viewport = this.#props.viewport;
413
+ viewport.clearPerModelCategoryOverrides({ modelIds });
414
+ if (!on) {
415
+ viewport.changeModelDisplay({ modelIds, display: false });
416
+ return this.#props.baseIdsCache
417
+ .getSubModels({ modelIds })
418
+ .pipe(mergeMap(({ subModels }) => (subModels ? this.changeModelsVisibilityStatus({ modelIds: subModels, on }) : EMPTY)));
419
+ }
420
+ viewport.changeModelDisplay({ modelIds, display: true });
421
+ return this.#props.baseIdsCache.getCategories({ modelIds }).pipe(mergeMap(({ id, drawingCategories, spatialCategories }) => {
422
+ return merge(drawingCategories ? this.changeCategoriesVisibilityStatus({ categoryIds: drawingCategories, modelId: id, on }) : EMPTY, spatialCategories ? this.changeCategoriesVisibilityStatus({ categoryIds: spatialCategories, modelId: id, on }) : EMPTY);
423
+ }));
424
+ });
425
+ return this.#props.overrideHandler
426
+ ? this.#props.overrideHandler.createVisibilityHandlerResult({
427
+ overrideProps: props,
428
+ nonOverriddenResult: result,
429
+ override: this.#props.overrides?.changeModelsVisibilityStatus,
430
+ })
431
+ : result;
432
+ }
433
+ /** Turns model on and turns off elements with categories related to that model. */
434
+ showModelWithoutAnyCategoriesOrElements(modelId, categoriesToNotOverride) {
435
+ const viewport = this.#props.viewport;
436
+ return forkJoin({
437
+ allModelCategories: this.#props.baseIdsCache.getCategories({ modelIds: modelId }).pipe(reduce((acc, { drawingCategories, spatialCategories }) => {
438
+ for (const category of Id64.iterable(drawingCategories ?? [])) {
439
+ acc.add(category);
440
+ }
441
+ for (const category of Id64.iterable(spatialCategories ?? [])) {
442
+ acc.add(category);
443
+ }
444
+ return acc;
445
+ }, new Set())),
446
+ modelAlwaysDrawnElements: this.#alwaysAndNeverDrawnElements.getAlwaysOrNeverDrawnElements({ modelIds: modelId, setType: "always" }),
447
+ }).pipe(mergeMap(({ allModelCategories, modelAlwaysDrawnElements }) => {
448
+ const alwaysDrawn = this.#props.viewport.alwaysDrawn;
449
+ if (alwaysDrawn && modelAlwaysDrawnElements) {
450
+ viewport.setAlwaysDrawn({ elementIds: setDifference(alwaysDrawn, modelAlwaysDrawnElements) });
451
+ }
452
+ viewport.changeModelDisplay({ modelIds: modelId, display: true });
453
+ return from(Id64.iterable(allModelCategories)).pipe(categoriesToNotOverride ? filter((modelCategory) => !Id64.has(categoriesToNotOverride, modelCategory)) : identity, map((categoryId) => this.changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, false, false)), takeLast(1), defaultIfEmpty(undefined));
454
+ }));
455
+ }
456
+ /** Adds per-model category overrides based on category visibility in category selector. */
457
+ changeCategoryStateInViewportAccordingToModelVisibility(modelId, categoryId, on, changeSubCategories) {
458
+ const viewport = this.#props.viewport;
459
+ const isDisplayedInSelector = viewport.viewsCategory(categoryId);
460
+ const override = on === isDisplayedInSelector ? "none" : on ? "show" : "hide";
461
+ viewport.setPerModelCategoryOverride({ modelIds: modelId, categoryIds: categoryId, override });
462
+ if (override === "none" && on) {
463
+ // we took off the override which means the category is displayed in selector, but
464
+ // doesn't mean all its subcategories are displayed - this call ensures that
465
+ viewport.changeCategoryDisplay({ categoryIds: categoryId, display: true, enableAllSubCategories: changeSubCategories });
466
+ }
467
+ }
468
+ /**
469
+ * Changes categories visibility status.
470
+ *
471
+ * Also:
472
+ * - Turns on models in cases where categories need to be turned on and models are not already on.
473
+ * - Removed related elements from always/never drawn elements.
474
+ * - changes visibility of sub-models that are related to the specified categories.
475
+ */
476
+ changeCategoriesVisibilityStatus(props) {
477
+ const result = defer(() => {
478
+ const { modelId: modelIdFromProps, categoryIds, on } = props;
479
+ const viewport = this.#props.viewport;
480
+ const modelIdsObservable = (modelIdFromProps
481
+ ? of(new Map([[modelIdFromProps, getSetFromId64Arg(categoryIds)]]))
482
+ : this.#props.baseIdsCache.getModels({ categoryIds }).pipe(reduce((acc, { id, models }) => {
483
+ if (!models) {
484
+ return acc;
485
+ }
486
+ for (const modelId of Id64.iterable(models)) {
487
+ let entry = acc.get(modelId);
488
+ if (!entry) {
489
+ entry = new Set();
490
+ acc.set(modelId, entry);
491
+ }
492
+ entry.add(id);
493
+ }
494
+ return acc;
495
+ }, new Map()))).pipe(mergeMap((modelCategoriesMap) => modelCategoriesMap.entries()), shareReplay());
496
+ return concat(
497
+ // If modelId was provided: add override
498
+ // If modelId was not provided: change categoryDisplay and remove categories per model overrides
499
+ modelIdFromProps
500
+ ? of(viewport.setPerModelCategoryOverride({
501
+ modelIds: modelIdFromProps,
502
+ categoryIds,
503
+ override: on ? "show" : "hide",
504
+ }))
505
+ : concat(from(enableCategoryDisplay(viewport, categoryIds, on, on)), modelIdsObservable.pipe(map(([modelId, modelCategories]) => {
506
+ viewport.setPerModelCategoryOverride({ modelIds: modelId, categoryIds: modelCategories, override: "none" });
507
+ }))),
508
+ // If categories visibility needs to be turned on, we need to turn on models without turning on unrelated elements or categories for that model
509
+ on
510
+ ? modelIdsObservable.pipe(mergeMap(([modelId, categories]) => {
511
+ if (!viewport.viewsModel(modelId)) {
512
+ return this.showModelWithoutAnyCategoriesOrElements(modelId, categories);
513
+ }
514
+ return EMPTY;
515
+ }))
516
+ : EMPTY, this.#alwaysAndNeverDrawnElements.clearAlwaysAndNeverDrawnElements({ categoryIds, modelId: modelIdFromProps }), this.#props.baseIdsCache
517
+ .getSubModels({ categoryIds, modelId: modelIdFromProps })
518
+ .pipe(mergeMap(({ subModels }) => (subModels ? this.changeModelsVisibilityStatus({ modelIds: subModels, on }) : EMPTY))));
519
+ });
520
+ return this.#props.overrideHandler
521
+ ? this.#props.overrideHandler.createVisibilityHandlerResult({
522
+ overrideProps: props,
523
+ nonOverriddenResult: result,
524
+ override: this.#props.overrides?.changeCategoriesVisibilityStatus,
525
+ })
526
+ : result;
527
+ }
528
+ /**
529
+ * Changes visibility status of elements by adding them to the viewport's always/never drawn elements.
530
+ *
531
+ * Also, changes visibility status of specified elements that are models.
532
+ */
533
+ changeElementsVisibilityStatus(props) {
534
+ const result = defer(() => {
535
+ const { modelId, categoryId, elementIds, on } = props;
536
+ const viewport = this.#props.viewport;
537
+ // TODO: change child elements
538
+ // TODO: change child element categories
539
+ // TODO: change child subModels
540
+ return concat(
541
+ // Change elements state
542
+ defer(() => {
543
+ if (!viewport.viewsModel(modelId)) {
544
+ if (!on) {
545
+ return this.queueElementsVisibilityChange(elementIds, on, false);
546
+ }
547
+ return this.showModelWithoutAnyCategoriesOrElements(modelId).pipe(mergeMap(() => {
548
+ const defaultVisibility = this.getVisibleModelCategoriesDirectVisibilityStatus({
549
+ categoryIds: categoryId,
550
+ modelId,
551
+ });
552
+ const displayedByDefault = defaultVisibility.state === "visible";
553
+ return this.queueElementsVisibilityChange(elementIds, on, displayedByDefault);
554
+ }));
555
+ }
556
+ const categoryVisibility = this.getVisibleModelCategoriesDirectVisibilityStatus({ categoryIds: categoryId, modelId });
557
+ const isDisplayedByDefault = categoryVisibility.state === "visible";
558
+ return this.queueElementsVisibilityChange(elementIds, on, isDisplayedByDefault);
559
+ }),
560
+ // Change visibility of elements that are models
561
+ from(Id64.iterable(elementIds)).pipe(releaseMainThreadOnItemsCount(100), mergeMap((elementId) => this.#props.baseIdsCache.hasSubModel(elementId).pipe(mergeMap((isSubModel) => {
562
+ if (isSubModel) {
563
+ return this.changeModelsVisibilityStatus({ modelIds: elementId, on });
564
+ }
565
+ return EMPTY;
566
+ })))));
567
+ });
568
+ return this.#props.overrideHandler
569
+ ? this.#props.overrideHandler.createVisibilityHandlerResult({
570
+ overrideProps: props,
571
+ nonOverriddenResult: result,
572
+ override: this.#props.overrides?.changeElementsVisibilityStatus,
573
+ })
574
+ : result;
575
+ }
576
+ /** Queues visibility change for elements. */
577
+ queueElementsVisibilityChange(elementIds, on, visibleByDefault) {
578
+ const finishedSubject = new Subject();
579
+ // observable to track if visibility change is finished/cancelled
580
+ const changeFinished = finishedSubject.pipe(startWith(false), shareReplay(1), filter((finished) => finished));
581
+ const changeObservable = from(Id64.iterable(elementIds)).pipe(
582
+ // check if visibility change is not finished (cancelled) due to change overall change request being cancelled
583
+ takeUntil(changeFinished), changeElementStateNoChildrenOperator({ on, isDisplayedByDefault: visibleByDefault, viewport: this.#props.viewport }), tap({
584
+ next: () => {
585
+ // notify that visibility change is finished
586
+ finishedSubject.next(true);
587
+ },
588
+ }));
589
+ // queue visibility change. `changeObservable` will be subscribed to when other queue changes are finished
590
+ this.#elementChangeQueue.next(changeObservable);
591
+ // return observable that will emit when visibility change is finished
592
+ return changeFinished.pipe(take(1), tap({
593
+ unsubscribe: () => {
594
+ // if this observable is unsubscribed before visibility change is finished, we have to notify that it queued change request is cancelled
595
+ finishedSubject.next(true);
596
+ },
597
+ }), map(() => undefined));
598
+ }
599
+ }
600
+ //# sourceMappingURL=BaseVisibilityHelper.js.map