@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
@@ -2,338 +2,350 @@
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 { bufferTime, filter, firstValueFrom, mergeAll, mergeMap, ReplaySubject, Subject } from "rxjs";
6
- import { assert } from "@itwin/core-bentley";
5
+ import { defer, filter, forkJoin, from, map, mergeAll, mergeMap, of, reduce, shareReplay, toArray } from "rxjs";
6
+ import { assert, Guid, Id64 } from "@itwin/core-bentley";
7
7
  import { IModel } from "@itwin/core-common";
8
- import { pushToMap } from "../../common/Utils.js";
8
+ import { CLASS_NAME_GeometricModel3d, CLASS_NAME_InformationPartitionElement, CLASS_NAME_Model, CLASS_NAME_SpatialCategory, CLASS_NAME_Subject, } from "../../common/internal/ClassNameDefinitions.js";
9
+ import { ModelCategoryElementsCountCache } from "../../common/internal/ModelCategoryElementsCountCache.js";
10
+ import { pushToMap } from "../../common/internal/Utils.js";
9
11
  /** @internal */
10
12
  export class ModelsTreeIdsCache {
11
- constructor(_queryExecutor, _hierarchyConfig) {
12
- this._queryExecutor = _queryExecutor;
13
- this._hierarchyConfig = _hierarchyConfig;
14
- this._categoryElementCounts = new ModelCategoryElementsCountCache(async (input) => this.queryCategoryElementCounts(input));
15
- this._modelKeyPaths = new Map();
16
- this._subjectKeyPaths = new Map();
17
- this._categoryKeyPaths = new Map();
13
+ #categoryElementCounts;
14
+ #subjectInfos;
15
+ #parentSubjectIds; // the list should contain a subject id if its node should be shown as having children
16
+ #modelInfos;
17
+ #modelWithCategoryModeledElements;
18
+ #modelKeyPaths;
19
+ #subjectKeyPaths;
20
+ #categoryKeyPaths;
21
+ #queryExecutor;
22
+ #hierarchyConfig;
23
+ #componentId;
24
+ #componentName;
25
+ constructor(queryExecutor, hierarchyConfig, componentId) {
26
+ this.#queryExecutor = queryExecutor;
27
+ this.#hierarchyConfig = hierarchyConfig;
28
+ this.#componentId = componentId ?? Guid.createValue();
29
+ this.#componentName = "ModelsTreeIdsCache";
30
+ this.#categoryElementCounts = new ModelCategoryElementsCountCache(this.#queryExecutor, [this.#hierarchyConfig.elementClassSpecification], this.#componentId);
31
+ this.#modelKeyPaths = new Map();
32
+ this.#subjectKeyPaths = new Map();
33
+ this.#categoryKeyPaths = new Map();
18
34
  }
19
35
  [Symbol.dispose]() {
20
- this._categoryElementCounts[Symbol.dispose]();
36
+ this.#categoryElementCounts[Symbol.dispose]();
21
37
  }
22
- async *querySubjects() {
23
- const subjectsQuery = `
24
- SELECT
25
- s.ECInstanceId id,
26
- s.Parent.Id parentId,
27
- (
28
- SELECT m.ECInstanceId
29
- FROM bis.GeometricModel3d m
30
- WHERE m.ECInstanceId = HexToId(json_extract(s.JsonProperties, '$.Subject.Model.TargetPartition'))
31
- AND NOT m.IsPrivate
32
- AND EXISTS (SELECT 1 FROM ${this._hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)
33
- ) targetPartitionId,
34
- CASE
35
- WHEN (
36
- json_extract(s.JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL
37
- OR json_extract(s.JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'
38
- ) THEN 1
39
- ELSE 0
40
- END hideInHierarchy
41
- FROM bis.Subject s
42
- `;
43
- for await (const row of this._queryExecutor.createQueryReader({ ecsql: subjectsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
44
- yield { id: row.id, parentId: row.parentId, targetPartitionId: row.targetPartitionId, hideInHierarchy: !!row.hideInHierarchy };
45
- }
38
+ querySubjects() {
39
+ return defer(() => {
40
+ const subjectsQuery = `
41
+ SELECT
42
+ s.ECInstanceId id,
43
+ s.Parent.Id parentId,
44
+ (
45
+ SELECT m.ECInstanceId
46
+ FROM ${CLASS_NAME_GeometricModel3d} m
47
+ WHERE m.ECInstanceId = HexToId(json_extract(s.JsonProperties, '$.Subject.Model.TargetPartition'))
48
+ AND NOT m.IsPrivate
49
+ AND EXISTS (SELECT 1 FROM ${this.#hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)
50
+ ) targetPartitionId,
51
+ CASE
52
+ WHEN (
53
+ json_extract(s.JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL
54
+ OR json_extract(s.JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'
55
+ ) THEN 1
56
+ ELSE 0
57
+ END hideInHierarchy
58
+ FROM bis.Subject s
59
+ `;
60
+ return this.#queryExecutor.createQueryReader({ ecsql: subjectsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: `${this.#componentName}/${this.#componentId}/subjects` });
61
+ }).pipe(map((row) => {
62
+ return { id: row.id, parentId: row.parentId, targetPartitionId: row.targetPartitionId, hideInHierarchy: !!row.hideInHierarchy };
63
+ }));
46
64
  }
47
- async *queryModels() {
48
- const modelsQuery = `
49
- SELECT p.ECInstanceId id, p.Parent.Id parentId
50
- FROM bis.InformationPartitionElement p
51
- INNER JOIN bis.GeometricModel3d m ON m.ModeledElement.Id = p.ECInstanceId
52
- WHERE
53
- NOT m.IsPrivate
54
- ${this._hierarchyConfig.showEmptyModels ? "" : `AND EXISTS (SELECT 1 FROM ${this._hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}
55
- `;
56
- for await (const row of this._queryExecutor.createQueryReader({ ecsql: modelsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
57
- yield { id: row.id, parentId: row.parentId };
58
- }
65
+ queryModels() {
66
+ return defer(() => {
67
+ const modelsQuery = `
68
+ SELECT p.ECInstanceId id, p.Parent.Id parentId
69
+ FROM ${CLASS_NAME_InformationPartitionElement} p
70
+ INNER JOIN ${CLASS_NAME_GeometricModel3d} m ON m.ModeledElement.Id = p.ECInstanceId
71
+ WHERE
72
+ NOT m.IsPrivate
73
+ ${this.#hierarchyConfig.showEmptyModels ? "" : `AND EXISTS (SELECT 1 FROM ${this.#hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}
74
+ `;
75
+ return this.#queryExecutor.createQueryReader({ ecsql: modelsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: `${this.#componentName}/${this.#componentId}/models` });
76
+ }).pipe(map((row) => {
77
+ return { id: row.id, parentId: row.parentId };
78
+ }));
59
79
  }
60
- async getSubjectInfos() {
61
- this._subjectInfos ??= (async () => {
62
- const [subjectInfos, targetPartitionSubjects] = await Promise.all([
63
- (async () => {
64
- const result = new Map();
65
- for await (const subject of this.querySubjects()) {
66
- const subjectInfo = {
67
- parentSubject: subject.parentId,
68
- hideInHierarchy: subject.hideInHierarchy,
69
- childSubjects: new Set(),
70
- childModels: new Set(),
71
- };
72
- if (subject.targetPartitionId) {
73
- subjectInfo.childModels.add(subject.targetPartitionId);
74
- }
75
- result.set(subject.id, subjectInfo);
76
- }
77
- return result;
78
- })(),
79
- (async () => {
80
- const result = new Map();
81
- for await (const model of this.queryModels()) {
82
- pushToMap(result, model.id, model.parentId);
80
+ getSubjectInfos() {
81
+ this.#subjectInfos ??= forkJoin({
82
+ subjectInfos: this.querySubjects().pipe(reduce((acc, subject) => {
83
+ const subjectInfo = {
84
+ parentSubjectId: subject.parentId,
85
+ hideInHierarchy: subject.hideInHierarchy,
86
+ childSubjectIds: new Set(),
87
+ childModelIds: new Set(),
88
+ };
89
+ if (subject.targetPartitionId) {
90
+ subjectInfo.childModelIds.add(subject.targetPartitionId);
91
+ }
92
+ acc.set(subject.id, subjectInfo);
93
+ return acc;
94
+ }, new Map()), map((subjectInfos) => {
95
+ for (const [subjectId, { parentSubjectId: parentSubjectId }] of subjectInfos.entries()) {
96
+ if (parentSubjectId) {
97
+ const parentSubjectInfo = subjectInfos.get(parentSubjectId);
98
+ assert(!!parentSubjectInfo);
99
+ parentSubjectInfo.childSubjectIds.add(subjectId);
83
100
  }
84
- return result;
85
- })(),
86
- ]);
87
- for (const [subjectId, { parentSubject: parentSubjectId }] of subjectInfos.entries()) {
88
- if (parentSubjectId) {
89
- const parentSubjectInfo = subjectInfos.get(parentSubjectId);
90
- assert(!!parentSubjectInfo);
91
- parentSubjectInfo.childSubjects.add(subjectId);
92
101
  }
93
- }
102
+ return subjectInfos;
103
+ })),
104
+ targetPartitionSubjects: this.queryModels().pipe(reduce((acc, model) => {
105
+ pushToMap(acc, model.id, model.parentId);
106
+ return acc;
107
+ }, new Map())),
108
+ }).pipe(map(({ subjectInfos, targetPartitionSubjects }) => {
94
109
  for (const [partitionId, subjectIds] of targetPartitionSubjects) {
95
110
  subjectIds.forEach((subjectId) => {
96
111
  const subjectInfo = subjectInfos.get(subjectId);
97
112
  assert(!!subjectInfo);
98
- subjectInfo.childModels.add(partitionId);
113
+ subjectInfo.childModelIds.add(partitionId);
99
114
  });
100
115
  }
101
116
  return subjectInfos;
102
- })();
103
- return this._subjectInfos;
117
+ }), shareReplay());
118
+ return this.#subjectInfos;
104
119
  }
105
120
  /** Returns ECInstanceIDs of Subjects that either have direct Model or at least one child Subject with a Model. */
106
- async getParentSubjectIds() {
107
- this._parentSubjectIds ??= (async () => {
108
- const subjectInfos = await this.getSubjectInfos();
121
+ getParentSubjectIds() {
122
+ this.#parentSubjectIds ??= this.getSubjectInfos().pipe(map((subjectInfos) => {
109
123
  const parentSubjectIds = new Set();
110
124
  subjectInfos.forEach((subjectInfo, subjectId) => {
111
- if (subjectInfo.childModels.size > 0) {
125
+ if (subjectInfo.childModelIds.size > 0) {
112
126
  parentSubjectIds.add(subjectId);
113
- let currParentId = subjectInfo.parentSubject;
127
+ let currParentId = subjectInfo.parentSubjectId;
114
128
  while (currParentId) {
115
129
  parentSubjectIds.add(currParentId);
116
- currParentId = subjectInfos.get(currParentId)?.parentSubject;
130
+ currParentId = subjectInfos.get(currParentId)?.parentSubjectId;
117
131
  }
118
132
  }
119
133
  });
120
134
  return [...parentSubjectIds];
121
- })();
122
- return this._parentSubjectIds;
135
+ }), shareReplay());
136
+ return this.#parentSubjectIds;
123
137
  }
124
138
  /**
125
139
  * Returns child subjects of the specified parent subjects as they're displayed in the hierarchy - taking into
126
140
  * account `hideInHierarchy` flag.
127
141
  */
128
- async getChildSubjectIds(parentSubjectIds) {
129
- const childSubjectIds = new Array();
130
- const subjectInfos = await this.getSubjectInfos();
131
- parentSubjectIds.forEach((subjectId) => {
132
- forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {
133
- if (!childSubjectInfo.hideInHierarchy) {
134
- childSubjectIds.push(childSubjectId);
135
- return "break";
136
- }
137
- return "continue";
138
- });
139
- });
140
- return childSubjectIds;
142
+ getChildSubjectIds(parentSubjectIds) {
143
+ return this.getSubjectInfos().pipe(map((subjectInfos) => {
144
+ const childSubjectIds = new Array();
145
+ for (const subjectId of Id64.iterable(parentSubjectIds)) {
146
+ forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {
147
+ if (!childSubjectInfo.hideInHierarchy) {
148
+ childSubjectIds.push(childSubjectId);
149
+ return "break";
150
+ }
151
+ return "continue";
152
+ });
153
+ }
154
+ return childSubjectIds;
155
+ }));
141
156
  }
142
157
  /** Returns ECInstanceIDs of all Models under specific parent Subjects, including their child Subjects, etc. */
143
- async getSubjectModelIds(subjectIds) {
144
- const subjectInfos = await this.getSubjectInfos();
145
- const subjectStack = [...subjectIds];
146
- const result = new Array();
147
- while (true) {
148
- const subjectId = subjectStack.pop();
149
- if (subjectId === undefined) {
150
- break;
158
+ getSubjectModelIds(subjectIds) {
159
+ return this.getSubjectInfos().pipe(mergeMap((subjectInfos) => {
160
+ const result = new Array();
161
+ const childSubjects = new Array();
162
+ for (const subjectId of Id64.iterable(subjectIds)) {
163
+ const subjectInfo = subjectInfos.get(subjectId);
164
+ if (!subjectInfo) {
165
+ continue;
166
+ }
167
+ result.push(...subjectInfo.childModelIds);
168
+ childSubjects.push(...subjectInfo.childSubjectIds);
151
169
  }
152
- const subjectInfo = subjectInfos.get(subjectId);
153
- if (!subjectInfo) {
154
- continue;
170
+ if (childSubjects.length === 0) {
171
+ return of(result);
155
172
  }
156
- result.push(...subjectInfo.childModels);
157
- subjectStack.push(...subjectInfo.childSubjects);
158
- }
159
- return result;
173
+ return this.getSubjectModelIds(childSubjects).pipe(map((modelsOfChildSubjects) => {
174
+ result.push(...modelsOfChildSubjects);
175
+ return result;
176
+ }));
177
+ }));
160
178
  }
161
179
  /** Returns ECInstanceIDs of Models under specific parent Subjects as they are displayed in the hierarchy. */
162
- async getChildSubjectModelIds(parentSubjectIds) {
163
- const subjectInfos = await this.getSubjectInfos();
164
- const hiddenSubjectIds = new Array();
165
- parentSubjectIds.forEach((subjectId) => {
166
- forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {
167
- if (childSubjectInfo.hideInHierarchy) {
168
- hiddenSubjectIds.push(childSubjectId);
169
- return "continue";
170
- }
171
- return "break";
180
+ getChildSubjectModelIds(parentSubjectIds) {
181
+ return this.getSubjectInfos().pipe(map((subjectInfos) => {
182
+ const hiddenSubjectIds = new Array();
183
+ for (const subjectId of Id64.iterable(parentSubjectIds)) {
184
+ forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {
185
+ if (childSubjectInfo.hideInHierarchy) {
186
+ hiddenSubjectIds.push(childSubjectId);
187
+ return "continue";
188
+ }
189
+ return "break";
190
+ });
191
+ }
192
+ const modelIds = new Array();
193
+ [...parentSubjectIds, ...hiddenSubjectIds].forEach((subjectId) => {
194
+ const subjectInfo = subjectInfos.get(subjectId);
195
+ subjectInfo && modelIds.push(...subjectInfo.childModelIds);
172
196
  });
173
- });
174
- const modelIds = new Array();
175
- [...parentSubjectIds, ...hiddenSubjectIds].forEach((subjectId) => {
176
- const subjectInfo = subjectInfos.get(subjectId);
177
- subjectInfo && modelIds.push(...subjectInfo.childModels);
178
- });
179
- return modelIds;
197
+ return modelIds;
198
+ }));
180
199
  }
181
- async createSubjectInstanceKeysPath(targetSubjectId) {
182
- let entry = this._subjectKeyPaths.get(targetSubjectId);
200
+ createSubjectInstanceKeysPath(targetSubjectId) {
201
+ let entry = this.#subjectKeyPaths.get(targetSubjectId);
183
202
  if (!entry) {
184
- entry = (async () => {
185
- const subjectInfos = await this.getSubjectInfos();
203
+ entry = this.getSubjectInfos().pipe(map((subjectInfos) => {
186
204
  const result = new Array();
187
205
  let currParentId = targetSubjectId;
188
- while (currParentId && currParentId !== IModel.rootSubjectId) {
206
+ while (currParentId) {
207
+ if (this.#hierarchyConfig.hideRootSubject && currParentId === IModel.rootSubjectId) {
208
+ break;
209
+ }
189
210
  const parentInfo = subjectInfos.get(currParentId);
190
211
  if (!parentInfo?.hideInHierarchy) {
191
- result.push({ className: "BisCore.Subject", id: currParentId });
212
+ result.push({ className: CLASS_NAME_Subject, id: currParentId });
192
213
  }
193
- currParentId = parentInfo?.parentSubject;
214
+ currParentId = parentInfo?.parentSubjectId;
194
215
  }
195
216
  return result.reverse();
196
- })();
197
- this._subjectKeyPaths.set(targetSubjectId, entry);
217
+ }), shareReplay());
218
+ this.#subjectKeyPaths.set(targetSubjectId, entry);
198
219
  }
199
220
  return entry;
200
221
  }
201
- async *queryModelElementCounts() {
202
- const query = /* sql */ `
203
- SELECT Model.Id modelId, COUNT(*) elementCount
204
- FROM ${this._hierarchyConfig.elementClassSpecification}
205
- GROUP BY Model.Id
206
- `;
207
- for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
208
- yield { modelId: row.modelId, elementCount: row.elementCount };
209
- }
222
+ queryModelCategories() {
223
+ return defer(() => {
224
+ const query = `
225
+ SELECT
226
+ this.Model.Id modelId,
227
+ this.Category.Id categoryId,
228
+ m.IsPrivate isModelPrivate,
229
+ MAX(IIF(this.Parent.Id IS NULL, 1, 0)) isRootElementCategory
230
+ FROM ${CLASS_NAME_Model} m
231
+ JOIN ${this.#hierarchyConfig.elementClassSpecification} this ON m.ECInstanceId = this.Model.Id
232
+ GROUP BY modelId, categoryId, isModelPrivate
233
+ `;
234
+ return this.#queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: `${this.#componentName}/${this.#componentId}/model-categories` });
235
+ }).pipe(map((row) => {
236
+ return { modelId: row.modelId, categoryId: row.categoryId, isModelPrivate: !!row.isModelPrivate, isRootElementCategory: !!row.isRootElementCategory };
237
+ }));
210
238
  }
211
- async *queryModelCategories() {
212
- const query = /* sql */ `
213
- SELECT Model.Id modelId, Category.Id categoryId
214
- FROM ${this._hierarchyConfig.elementClassSpecification}
215
- WHERE Parent.Id IS NULL
216
- GROUP BY modelId, categoryId
239
+ queryModeledElements() {
240
+ return defer(() => {
241
+ const query = `
242
+ SELECT
243
+ pe.ECInstanceId modeledElementId,
244
+ pe.Category.Id categoryId,
245
+ pe.Model.Id modelId
246
+ FROM ${CLASS_NAME_Model} m
247
+ JOIN ${this.#hierarchyConfig.elementClassSpecification} pe ON pe.ECInstanceId = m.ModeledElement.Id
248
+ WHERE
249
+ m.IsPrivate = false
250
+ AND m.ECInstanceId IN (SELECT Model.Id FROM ${this.#hierarchyConfig.elementClassSpecification})
217
251
  `;
218
- for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
219
- yield { modelId: row.modelId, categoryId: row.categoryId };
220
- }
252
+ return this.#queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: `${this.#componentName}/${this.#componentId}/modeled-elements` });
253
+ }).pipe(map((row) => {
254
+ return { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId };
255
+ }));
221
256
  }
222
- async getModelInfos() {
223
- this._modelInfos ??= (async () => {
224
- const modelInfos = new Map();
225
- await Promise.all([
226
- (async () => {
227
- for await (const { modelId, categoryId } of this.queryModelCategories()) {
228
- const entry = modelInfos.get(modelId);
229
- if (entry) {
230
- entry.categories.add(categoryId);
231
- }
232
- else {
233
- modelInfos.set(modelId, { categories: new Set([categoryId]), elementCount: 0 });
234
- }
235
- }
236
- })(),
237
- (async () => {
238
- for await (const { modelId, elementCount } of this.queryModelElementCounts()) {
239
- const entry = modelInfos.get(modelId);
240
- if (entry) {
241
- entry.elementCount = elementCount;
242
- }
243
- else {
244
- modelInfos.set(modelId, { categories: new Set(), elementCount });
245
- }
246
- }
247
- })(),
248
- ]);
249
- return modelInfos;
250
- })();
251
- return this._modelInfos;
257
+ getModelWithCategoryModeledElements() {
258
+ this.#modelWithCategoryModeledElements ??= this.queryModeledElements().pipe(reduce((acc, { modelId, categoryId, modeledElementId }) => {
259
+ const key = `${modelId}-${categoryId}`;
260
+ const entry = acc.get(key);
261
+ if (entry === undefined) {
262
+ acc.set(key, new Set([modeledElementId]));
263
+ }
264
+ else {
265
+ entry.add(modeledElementId);
266
+ }
267
+ return acc;
268
+ }, new Map()), shareReplay());
269
+ return this.#modelWithCategoryModeledElements;
270
+ }
271
+ getModelInfos() {
272
+ this.#modelInfos ??= this.queryModelCategories().pipe(reduce((acc, { modelId, categoryId, isModelPrivate, isRootElementCategory }) => {
273
+ const entry = acc.get(modelId);
274
+ if (entry) {
275
+ entry.categories.set(categoryId, { isRootElementCategory });
276
+ entry.isModelPrivate = isModelPrivate;
277
+ }
278
+ else {
279
+ acc.set(modelId, { categories: new Map([[categoryId, { isRootElementCategory }]]), isModelPrivate });
280
+ }
281
+ return acc;
282
+ }, new Map()), shareReplay());
283
+ return this.#modelInfos;
252
284
  }
253
- async getModelCategories(modelId) {
254
- const modelInfos = await this.getModelInfos();
255
- const categories = modelInfos.get(modelId)?.categories;
256
- return categories ? [...categories] : [];
285
+ getAllCategories() {
286
+ return this.getModelInfos().pipe(mergeMap((modelInfos) => modelInfos.values()), mergeMap(({ categories }) => categories.keys()), reduce((acc, categoryId) => {
287
+ acc.add(categoryId);
288
+ return acc;
289
+ }, new Set()));
257
290
  }
258
- async getModelElementCount(modelId) {
259
- const modelInfos = await this.getModelInfos();
260
- return modelInfos.get(modelId)?.elementCount ?? 0;
291
+ getModelCategoryIds(modelId) {
292
+ return this.getModelInfos().pipe(mergeMap((modelInfos) => modelInfos.get(modelId)?.categories.keys() ?? []), toArray());
261
293
  }
262
- async createModelInstanceKeyPaths(modelId) {
263
- let entry = this._modelKeyPaths.get(modelId);
264
- if (!entry) {
265
- entry = (async () => {
266
- const result = new Array();
267
- const subjectInfos = (await this.getSubjectInfos()).entries();
268
- for (const [modelSubjectId, subjectInfo] of subjectInfos) {
269
- if (subjectInfo.childModels.has(modelId)) {
270
- const subjectPath = await this.createSubjectInstanceKeysPath(modelSubjectId);
271
- result.push([...subjectPath, { className: "BisCore.GeometricModel3d", id: modelId }]);
272
- }
294
+ hasSubModel(elementId) {
295
+ return this.getModelInfos().pipe(map((modelInfos) => {
296
+ const modeledElementInfo = modelInfos.get(elementId);
297
+ if (!modeledElementInfo) {
298
+ return false;
299
+ }
300
+ return !modeledElementInfo.isModelPrivate;
301
+ }));
302
+ }
303
+ getCategoriesModeledElements(modelId, categoryIds) {
304
+ return this.getModelWithCategoryModeledElements().pipe(mergeMap((modelWithCategoryModeledElements) => from(Id64.iterable(categoryIds)).pipe(reduce((acc, categoryId) => {
305
+ const entry = modelWithCategoryModeledElements.get(`${modelId}-${categoryId}`);
306
+ if (entry !== undefined) {
307
+ acc.push(...entry);
308
+ }
309
+ return acc;
310
+ }, new Array()))));
311
+ }
312
+ getCategoriesElementModels(categoryIds) {
313
+ return this.getModelInfos().pipe(mergeMap((modelInfos) => from(Id64.iterable(categoryIds)).pipe(reduce((acc, categoryId) => {
314
+ const entry = new Array();
315
+ for (const [modelId, { categories }] of modelInfos.entries()) {
316
+ if (categories.has(categoryId)) {
317
+ entry.push(modelId);
273
318
  }
274
- return result;
275
- })();
276
- this._modelKeyPaths.set(modelId, entry);
277
- }
278
- return entry;
319
+ }
320
+ acc.set(categoryId, entry);
321
+ return acc;
322
+ }, new Map()))));
279
323
  }
280
- async queryCategoryElementCounts(input) {
281
- const reader = this._queryExecutor.createQueryReader({
282
- ctes: [
283
- /* sql */ `
284
- CategoryElements(id, modelId, categoryId) AS (
285
- SELECT ECInstanceId, Model.Id, Category.Id
286
- FROM ${this._hierarchyConfig.elementClassSpecification}
287
- WHERE
288
- Parent.Id IS NULL
289
- AND (
290
- ${input.map(({ modelId, categoryId }) => `Model.Id = ${modelId} AND Category.Id = ${categoryId}`).join(" OR ")}
291
- )
292
-
293
- UNION ALL
294
-
295
- SELECT c.ECInstanceId, p.modelId, p.categoryId
296
- FROM ${this._hierarchyConfig.elementClassSpecification} c
297
- JOIN CategoryElements p ON c.Parent.Id = p.id
298
- )
299
- `,
300
- ],
301
- ecsql: `
302
- SELECT modelId, categoryId, COUNT(id) elementsCount
303
- FROM CategoryElements
304
- GROUP BY modelId, categoryId
305
- `,
306
- }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" });
307
- const result = new Array();
308
- for await (const row of reader) {
309
- result.push({ modelId: row.modelId, categoryId: row.categoryId, elementsCount: row.elementsCount });
324
+ createModelInstanceKeyPaths(modelId) {
325
+ let entry = this.#modelKeyPaths.get(modelId);
326
+ if (!entry) {
327
+ entry = this.getSubjectInfos().pipe(mergeMap((subjectInfos) => subjectInfos.entries()), filter(([_, subjectInfo]) => subjectInfo.childModelIds.has(modelId)), mergeMap(([modelSubjectId]) => this.createSubjectInstanceKeysPath(modelSubjectId).pipe(map((path) => [...path, { className: CLASS_NAME_GeometricModel3d, id: modelId }]))), toArray(), shareReplay());
328
+ this.#modelKeyPaths.set(modelId, entry);
310
329
  }
311
- return result;
330
+ return entry;
312
331
  }
313
- async getCategoryElementsCount(modelId, categoryId) {
314
- return this._categoryElementCounts.getCategoryElementsCount(modelId, categoryId);
332
+ getCategoryElementsCount(modelId, categoryId) {
333
+ return this.#categoryElementCounts.getCategoryElementsCount(modelId, categoryId);
315
334
  }
316
- async createCategoryInstanceKeyPaths(categoryId) {
317
- let entry = this._categoryKeyPaths.get(categoryId);
335
+ createCategoryInstanceKeyPaths(categoryId) {
336
+ let entry = this.#categoryKeyPaths.get(categoryId);
318
337
  if (!entry) {
319
- entry = (async () => {
320
- const result = new Set();
321
- const modelInfos = await this.getModelInfos();
322
- modelInfos?.forEach((modelInfo, modelId) => {
323
- if (modelInfo.categories.has(categoryId)) {
324
- result.add(modelId);
325
- }
326
- });
327
- const categoryPaths = new Array();
328
- for (const categoryModelId of [...result]) {
329
- const modelPaths = await this.createModelInstanceKeyPaths(categoryModelId);
330
- for (const modelPath of modelPaths) {
331
- categoryPaths.push([...modelPath, { className: "BisCore.SpatialCategory", id: categoryId }]);
332
- }
338
+ entry = this.getModelInfos().pipe(mergeMap((modelInfos) => modelInfos.entries()), reduce((acc, [modelId, modelInfo]) => {
339
+ const categoryEntry = modelInfo.categories.get(categoryId);
340
+ if (categoryEntry?.isRootElementCategory) {
341
+ acc.add(modelId);
333
342
  }
334
- return categoryPaths;
335
- })();
336
- this._categoryKeyPaths.set(categoryId, entry);
343
+ return acc;
344
+ }, new Set()), mergeMap((categoryModels) => from(categoryModels)), mergeMap((categoryModelId) => this.createModelInstanceKeyPaths(categoryModelId)), mergeAll(), reduce((acc, modelPath) => {
345
+ acc.push([...modelPath, { className: CLASS_NAME_SpatialCategory, id: categoryId }]);
346
+ return acc;
347
+ }, new Array()), shareReplay());
348
+ this.#categoryKeyPaths.set(categoryId, entry);
337
349
  }
338
350
  return entry;
339
351
  }
@@ -341,7 +353,7 @@ export class ModelsTreeIdsCache {
341
353
  function forEachChildSubject(subjectInfos, parentSubject, cb) {
342
354
  const parentSubjectInfo = typeof parentSubject === "string" ? subjectInfos.get(parentSubject) : parentSubject;
343
355
  parentSubjectInfo &&
344
- parentSubjectInfo.childSubjects.forEach((childSubjectId) => {
356
+ parentSubjectInfo.childSubjectIds.forEach((childSubjectId) => {
345
357
  const childSubjectInfo = subjectInfos.get(childSubjectId);
346
358
  if (cb(childSubjectId, childSubjectInfo) === "break") {
347
359
  return;
@@ -349,34 +361,4 @@ function forEachChildSubject(subjectInfos, parentSubject, cb) {
349
361
  forEachChildSubject(subjectInfos, childSubjectInfo, cb);
350
362
  });
351
363
  }
352
- class ModelCategoryElementsCountCache {
353
- constructor(_loader) {
354
- this._loader = _loader;
355
- this._cache = new Map();
356
- this._requestsStream = new Subject();
357
- this._subscription = this._requestsStream
358
- .pipe(bufferTime(20), filter((requests) => requests.length > 0), mergeMap(async (requests) => this._loader(requests)), mergeAll())
359
- .subscribe({
360
- next: ({ modelId, categoryId, elementsCount }) => {
361
- const subject = this._cache.get(`${modelId}${categoryId}`);
362
- assert(!!subject);
363
- subject.next(elementsCount);
364
- },
365
- });
366
- }
367
- [Symbol.dispose]() {
368
- this._subscription.unsubscribe();
369
- }
370
- async getCategoryElementsCount(modelId, categoryId) {
371
- const cacheKey = `${modelId}${categoryId}`;
372
- let result = this._cache.get(cacheKey);
373
- if (result !== undefined) {
374
- return firstValueFrom(result);
375
- }
376
- result = new ReplaySubject(1);
377
- this._cache.set(cacheKey, result);
378
- this._requestsStream.next({ modelId, categoryId });
379
- return firstValueFrom(result);
380
- }
381
- }
382
364
  //# sourceMappingURL=ModelsTreeIdsCache.js.map