@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,19 +2,23 @@
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 { bufferCount, defer, from, lastValueFrom, map, merge, mergeAll, mergeMap, reduce, switchMap } from "rxjs";
5
+ import { bufferCount, defaultIfEmpty, defer, firstValueFrom, forkJoin, from, fromEvent, identity, lastValueFrom, map, merge, mergeAll, mergeMap, reduce, switchMap, takeUntil, toArray, } from "rxjs";
6
+ import { Guid } from "@itwin/core-bentley";
6
7
  import { IModel } from "@itwin/core-common";
7
- import { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, NodeSelectClauseColumnNames, ProcessedHierarchyNode, } from "@itwin/presentation-hierarchies";
8
+ import { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, HierarchyFilteringPath, NodeSelectClauseColumnNames, ProcessedHierarchyNode, } from "@itwin/presentation-hierarchies";
8
9
  import { createBisInstanceLabelSelectClauseFactory, ECSql } from "@itwin/presentation-shared";
9
- import { collect } from "../common/Rxjs.js";
10
+ import { CLASS_NAME_Element, CLASS_NAME_GeometricElement3d, CLASS_NAME_GeometricModel3d, CLASS_NAME_InformationPartitionElement, CLASS_NAME_ISubModeledElement, CLASS_NAME_Model, CLASS_NAME_SpatialCategory, CLASS_NAME_Subject, } from "../common/internal/ClassNameDefinitions.js";
11
+ import { collect } from "../common/internal/Rxjs.js";
12
+ import { createIdsSelector, getOptimalBatchSize, groupingNodeHasFilterTargets, parseIdsSelectorResult, releaseMainThreadOnItemsCount, } from "../common/internal/Utils.js";
10
13
  import { FilterLimitExceededError } from "../common/TreeErrors.js";
11
- import { createIdsSelector, parseIdsSelectorResult } from "../common/Utils.js";
12
- import { releaseMainThreadOnItemsCount } from "./Utils.js";
13
14
  const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
15
+ /** @internal */
14
16
  export const defaultHierarchyConfiguration = {
15
17
  elementClassGrouping: "enable",
16
- elementClassSpecification: "BisCore.GeometricElement3d",
18
+ elementClassSpecification: CLASS_NAME_GeometricElement3d,
17
19
  showEmptyModels: false,
20
+ hideRootSubject: false,
21
+ hierarchyLevelFiltering: "enable",
18
22
  };
19
23
  // eslint-disable-next-line @typescript-eslint/no-redeclare
20
24
  export var ModelsTreeInstanceKeyPathsProps;
@@ -24,54 +28,68 @@ export var ModelsTreeInstanceKeyPathsProps;
24
28
  }
25
29
  ModelsTreeInstanceKeyPathsProps.isLabelProps = isLabelProps;
26
30
  })(ModelsTreeInstanceKeyPathsProps || (ModelsTreeInstanceKeyPathsProps = {}));
31
+ /** @internal */
27
32
  export class ModelsTreeDefinition {
33
+ #impl;
34
+ #idsCache;
35
+ #hierarchyConfig;
36
+ #selectQueryFactory;
37
+ #nodeLabelSelectClauseFactory;
38
+ #queryExecutor;
39
+ #isSupported;
40
+ static #componentName = "ModelsTreeDefinition";
41
+ #componentId;
28
42
  constructor(props) {
29
- this._impl = createPredicateBasedHierarchyDefinition({
43
+ this.#impl = createPredicateBasedHierarchyDefinition({
30
44
  classHierarchyInspector: props.imodelAccess,
31
45
  hierarchy: {
32
- rootNodes: async (requestProps) => this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: [IModel.rootSubjectId] }),
46
+ rootNodes: async (requestProps) => this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this.#hierarchyConfig.hideRootSubject ? [IModel.rootSubjectId] : [] }),
33
47
  childNodes: [
34
48
  {
35
- parentInstancesNodePredicate: "BisCore.Subject",
49
+ parentInstancesNodePredicate: CLASS_NAME_Subject,
36
50
  definitions: async (requestProps) => this.createSubjectChildrenQuery(requestProps),
37
51
  },
38
52
  {
39
- parentInstancesNodePredicate: "BisCore.ISubModeledElement",
53
+ parentInstancesNodePredicate: CLASS_NAME_ISubModeledElement,
40
54
  definitions: async (requestProps) => this.createISubModeledElementChildrenQuery(requestProps),
41
55
  },
42
56
  {
43
- parentInstancesNodePredicate: "BisCore.GeometricModel3d",
57
+ parentInstancesNodePredicate: CLASS_NAME_GeometricModel3d,
44
58
  definitions: async (requestProps) => this.createGeometricModel3dChildrenQuery(requestProps),
45
59
  },
46
60
  {
47
- parentInstancesNodePredicate: "BisCore.SpatialCategory",
61
+ parentInstancesNodePredicate: CLASS_NAME_SpatialCategory,
48
62
  definitions: async (requestProps) => this.createSpatialCategoryChildrenQuery(requestProps),
49
63
  },
50
64
  {
51
- parentInstancesNodePredicate: "BisCore.GeometricElement3d",
65
+ parentInstancesNodePredicate: CLASS_NAME_GeometricElement3d,
52
66
  definitions: async (requestProps) => this.createGeometricElement3dChildrenQuery(requestProps),
53
67
  },
54
68
  ],
55
69
  },
56
70
  });
57
- this._idsCache = props.idsCache;
58
- this._queryExecutor = props.imodelAccess;
59
- this._hierarchyConfig = props.hierarchyConfig;
60
- this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
61
- this._selectQueryFactory = createNodesQueryClauseFactory({
71
+ this.#componentId = props.componentId ?? Guid.createValue();
72
+ this.#idsCache = props.idsCache;
73
+ this.#queryExecutor = props.imodelAccess;
74
+ this.#hierarchyConfig = props.hierarchyConfig;
75
+ this.#nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
76
+ this.#selectQueryFactory = createNodesQueryClauseFactory({
62
77
  imodelAccess: props.imodelAccess,
63
- instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,
78
+ instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,
64
79
  });
65
80
  }
66
81
  async postProcessNode(node) {
67
82
  if (ProcessedHierarchyNode.isGroupingNode(node)) {
83
+ const { hasFilterTargetAncestor, hasDirectNonFilteredTargets } = groupingNodeHasFilterTargets(node.children);
68
84
  return {
69
85
  ...node,
70
- label: this._hierarchyConfig.elementClassGrouping === "enableWithCounts" ? `${node.label} (${node.children.length})` : node.label,
86
+ label: this.#hierarchyConfig.elementClassGrouping === "enableWithCounts" ? `${node.label} (${node.children.length})` : node.label,
71
87
  extendedData: {
72
88
  ...node.extendedData,
73
89
  // add `modelId` and `categoryId` from the first grouped element
74
90
  ...node.children[0].extendedData,
91
+ ...(hasDirectNonFilteredTargets ? { hasDirectNonFilteredTargets } : {}),
92
+ ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : {}),
75
93
  // `imageId` is assigned to instance nodes at query time, but grouping ones need to
76
94
  // be handled during post-processing
77
95
  imageId: "icon-ec-class",
@@ -81,53 +99,56 @@ export class ModelsTreeDefinition {
81
99
  return node;
82
100
  }
83
101
  async defineHierarchyLevel(props) {
84
- if (this._isSupported === undefined) {
85
- this._isSupported = this.isSupported();
102
+ if (this.#isSupported === undefined) {
103
+ this.#isSupported = this.isSupported();
86
104
  }
87
- if ((await this._isSupported) === false) {
105
+ if ((await this.#isSupported) === false) {
88
106
  return [];
89
107
  }
90
- return this._impl.defineHierarchyLevel(props);
108
+ return this.#impl.defineHierarchyLevel(props);
91
109
  }
92
- async createSubjectChildrenQuery({ parentNodeInstanceIds: subjectIds, instanceFilter, }) {
110
+ async createSubjectChildrenQuery({ parentNodeInstanceIds: parentSubjectIds, instanceFilter, }) {
93
111
  const [subjectFilterClauses, modelFilterClauses] = await Promise.all([
94
- this._selectQueryFactory.createFilterClauses({
112
+ this.#selectQueryFactory.createFilterClauses({
95
113
  filter: instanceFilter,
96
- contentClass: { fullName: "BisCore.Subject", alias: "this" },
114
+ contentClass: { fullName: CLASS_NAME_Subject, alias: "this" },
97
115
  }),
98
- this._selectQueryFactory.createFilterClauses({
116
+ this.#selectQueryFactory.createFilterClauses({
99
117
  filter: instanceFilter,
100
- contentClass: { fullName: "BisCore.GeometricModel3d", alias: "this" },
118
+ contentClass: { fullName: CLASS_NAME_GeometricModel3d, alias: "this" },
101
119
  }),
102
120
  ]);
103
- const [childSubjectIds, childModelIds] = await Promise.all([
104
- this._idsCache.getChildSubjectIds(subjectIds),
105
- this._idsCache.getChildSubjectModelIds(subjectIds),
106
- ]);
121
+ const { childSubjectIds, childModelIds } = parentSubjectIds.length
122
+ ? await firstValueFrom(forkJoin({
123
+ childSubjectIds: this.#idsCache.getChildSubjectIds(parentSubjectIds),
124
+ childModelIds: this.#idsCache.getChildSubjectModelIds(parentSubjectIds),
125
+ }))
126
+ : { childSubjectIds: [IModel.rootSubjectId], childModelIds: [] };
107
127
  const defs = new Array();
108
128
  childSubjectIds.length &&
109
129
  defs.push({
110
- fullClassName: "BisCore.Subject",
130
+ fullClassName: CLASS_NAME_Subject,
111
131
  query: {
112
132
  ecsql: `
113
133
  SELECT
114
- ${await this._selectQueryFactory.createSelectClause({
134
+ ${await this.#selectQueryFactory.createSelectClause({
115
135
  ecClassId: { selector: "this.ECClassId" },
116
136
  ecInstanceId: { selector: "this.ECInstanceId" },
117
137
  nodeLabel: {
118
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
138
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
119
139
  classAlias: "this",
120
- className: "BisCore.Subject",
140
+ className: CLASS_NAME_Subject,
121
141
  }),
122
142
  },
123
143
  hideIfNoChildren: true,
124
144
  hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },
125
145
  grouping: { byLabel: { action: "merge", groupId: "subject" } },
126
146
  extendedData: {
127
- imageId: "icon-folder",
147
+ imageId: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, 'icon-imodel-hollow-2', 'icon-folder')` },
128
148
  isSubject: true,
129
149
  },
130
- supportsFiltering: true,
150
+ autoExpand: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, true, false)` },
151
+ supportsFiltering: this.supportsFiltering(),
131
152
  })}
132
153
  FROM ${subjectFilterClauses.from} this
133
154
  ${subjectFilterClauses.joins}
@@ -136,26 +157,26 @@ export class ModelsTreeDefinition {
136
157
  ${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : ""}
137
158
  `,
138
159
  bindings: [
139
- { type: "idset", value: await this._idsCache.getParentSubjectIds() },
160
+ { type: "idset", value: await firstValueFrom(this.#idsCache.getParentSubjectIds()) },
140
161
  ...childSubjectIds.map((id) => ({ type: "id", value: id })),
141
162
  ],
142
163
  },
143
164
  });
144
165
  childModelIds.length &&
145
166
  defs.push({
146
- fullClassName: "BisCore.GeometricModel3d",
167
+ fullClassName: CLASS_NAME_GeometricModel3d,
147
168
  query: {
148
169
  ecsql: `
149
170
  SELECT model.ECInstanceId AS ECInstanceId, model.*
150
171
  FROM (
151
172
  SELECT
152
- ${await this._selectQueryFactory.createSelectClause({
173
+ ${await this.#selectQueryFactory.createSelectClause({
153
174
  ecClassId: { selector: "m.ECClassId" },
154
175
  ecInstanceId: { selector: "m.ECInstanceId" },
155
176
  nodeLabel: {
156
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
177
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
157
178
  classAlias: "partition",
158
- className: "BisCore.InformationPartitionElement",
179
+ className: CLASS_NAME_InformationPartitionElement,
159
180
  }),
160
181
  },
161
182
  hideNodeInHierarchy: {
@@ -169,12 +190,12 @@ export class ModelsTreeDefinition {
169
190
  END
170
191
  `,
171
192
  },
172
- hasChildren: this._hierarchyConfig.showEmptyModels
193
+ hasChildren: this.#hierarchyConfig.showEmptyModels
173
194
  ? {
174
195
  selector: `
175
196
  IFNULL((
176
197
  SELECT 1
177
- FROM ${this._hierarchyConfig.elementClassSpecification} e
198
+ FROM ${this.#hierarchyConfig.elementClassSpecification} e
178
199
  WHERE e.Model.Id = m.ECInstanceId
179
200
  LIMIT 1
180
201
  ), 0)
@@ -185,10 +206,10 @@ export class ModelsTreeDefinition {
185
206
  imageId: "icon-model",
186
207
  isModel: true,
187
208
  },
188
- supportsFiltering: true,
209
+ supportsFiltering: this.supportsFiltering(),
189
210
  })}
190
- FROM Bis.GeometricModel3d m
191
- JOIN bis.InformationPartitionElement [partition] ON [partition].ECInstanceId = m.ModeledElement.Id
211
+ FROM ${CLASS_NAME_GeometricModel3d} m
212
+ JOIN ${CLASS_NAME_InformationPartitionElement} [partition] ON [partition].ECInstanceId = m.ModeledElement.Id
192
213
  WHERE
193
214
  m.ECInstanceId IN (${childModelIds.map(() => "?").join(",")})
194
215
  ) model
@@ -206,21 +227,21 @@ export class ModelsTreeDefinition {
206
227
  // hidden - the filter will get applied on the child hierarchy levels
207
228
  return [
208
229
  {
209
- fullClassName: "BisCore.GeometricModel3d",
230
+ fullClassName: CLASS_NAME_GeometricModel3d,
210
231
  query: {
211
232
  ecsql: `
212
233
  SELECT
213
- ${await this._selectQueryFactory.createSelectClause({
234
+ ${await this.#selectQueryFactory.createSelectClause({
214
235
  ecClassId: { selector: "this.ECClassId" },
215
236
  ecInstanceId: { selector: "this.ECInstanceId" },
216
- nodeLabel: "",
237
+ nodeLabel: "", // doesn't matter - the node is always hidden
217
238
  hideNodeInHierarchy: true,
218
239
  })}
219
- FROM BisCore.GeometricModel3d this
240
+ FROM ${CLASS_NAME_GeometricModel3d} this
220
241
  WHERE
221
242
  this.ModeledElement.Id IN (${elementIds.map(() => "?").join(",")})
222
243
  AND NOT this.IsPrivate
223
- AND this.ECInstanceId IN (SELECT Model.Id FROM ${this._hierarchyConfig.elementClassSpecification})
244
+ AND this.ECInstanceId IN (SELECT Model.Id FROM ${this.#hierarchyConfig.elementClassSpecification})
224
245
  `,
225
246
  bindings: [...elementIds.map((id) => ({ type: "id", value: id }))],
226
247
  },
@@ -228,23 +249,23 @@ export class ModelsTreeDefinition {
228
249
  ];
229
250
  }
230
251
  async createGeometricModel3dChildrenQuery({ parentNodeInstanceIds: modelIds, instanceFilter, }) {
231
- const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
252
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
232
253
  filter: instanceFilter,
233
- contentClass: { fullName: "BisCore.SpatialCategory", alias: "this" },
254
+ contentClass: { fullName: CLASS_NAME_SpatialCategory, alias: "this" },
234
255
  });
235
256
  return [
236
257
  {
237
- fullClassName: "BisCore.SpatialCategory",
258
+ fullClassName: CLASS_NAME_SpatialCategory,
238
259
  query: {
239
260
  ecsql: `
240
261
  SELECT
241
- ${await this._selectQueryFactory.createSelectClause({
262
+ ${await this.#selectQueryFactory.createSelectClause({
242
263
  ecClassId: { selector: "this.ECClassId" },
243
264
  ecInstanceId: { selector: "this.ECInstanceId" },
244
265
  nodeLabel: {
245
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
266
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
246
267
  classAlias: "this",
247
- className: "BisCore.SpatialCategory",
268
+ className: CLASS_NAME_SpatialCategory,
248
269
  }),
249
270
  },
250
271
  grouping: { byLabel: { action: "merge", groupId: "category" } },
@@ -254,14 +275,14 @@ export class ModelsTreeDefinition {
254
275
  isCategory: true,
255
276
  modelIds: { selector: createIdsSelector(modelIds) },
256
277
  },
257
- supportsFiltering: true,
278
+ supportsFiltering: this.supportsFiltering(),
258
279
  })}
259
280
  FROM ${instanceFilterClauses.from} this
260
281
  ${instanceFilterClauses.joins}
261
282
  WHERE
262
283
  EXISTS (
263
284
  SELECT 1
264
- FROM ${this._hierarchyConfig.elementClassSpecification} element
285
+ FROM ${this.#hierarchyConfig.elementClassSpecification} element
265
286
  WHERE
266
287
  element.Model.Id IN (${modelIds.map(() => "?").join(",")})
267
288
  AND element.Category.Id = +this.ECInstanceId
@@ -279,40 +300,43 @@ export class ModelsTreeDefinition {
279
300
  if (modelIds.length === 0) {
280
301
  throw new Error(`Invalid category node "${parentNode.label}" - missing model information.`);
281
302
  }
282
- const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
303
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
283
304
  filter: instanceFilter,
284
- contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: "this" },
305
+ contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: "this" },
285
306
  });
307
+ const modeledElements = await firstValueFrom(from(modelIds).pipe(mergeMap((modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)), reduce((acc, foundModeledElements) => {
308
+ return acc.concat(foundModeledElements);
309
+ }, new Array())));
286
310
  return [
287
311
  {
288
- fullClassName: this._hierarchyConfig.elementClassSpecification,
312
+ fullClassName: this.#hierarchyConfig.elementClassSpecification,
289
313
  query: {
290
314
  ecsql: `
291
315
  SELECT
292
- ${await this._selectQueryFactory.createSelectClause({
316
+ ${await this.#selectQueryFactory.createSelectClause({
293
317
  ecClassId: { selector: "this.ECClassId" },
294
318
  ecInstanceId: { selector: "this.ECInstanceId" },
295
319
  nodeLabel: {
296
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
320
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
297
321
  classAlias: "this",
298
- className: this._hierarchyConfig.elementClassSpecification,
322
+ className: this.#hierarchyConfig.elementClassSpecification,
299
323
  }),
300
324
  },
301
325
  grouping: {
302
- byClass: this._hierarchyConfig.elementClassGrouping !== "disable",
326
+ byClass: this.#hierarchyConfig.elementClassGrouping !== "disable",
303
327
  },
304
328
  hasChildren: {
305
329
  selector: `
306
- IFNULL((
307
- SELECT 1
308
- FROM (
309
- SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}
310
- UNION ALL
311
- SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d
312
- )
313
- WHERE ParentId = this.ECInstanceId
314
- LIMIT 1
315
- ), 0)
330
+ IIF(
331
+ ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(",")})` : `FALSE`},
332
+ 1,
333
+ IFNULL((
334
+ SELECT 1
335
+ FROM ${this.#hierarchyConfig.elementClassSpecification} ce
336
+ WHERE ce.Parent.Id = this.ECInstanceId
337
+ LIMIT 1
338
+ ), 0)
339
+ )
316
340
  `,
317
341
  },
318
342
  extendedData: {
@@ -320,7 +344,7 @@ export class ModelsTreeDefinition {
320
344
  categoryId: { selector: "IdToHex(this.Category.Id)" },
321
345
  imageId: "icon-item",
322
346
  },
323
- supportsFiltering: true,
347
+ supportsFiltering: this.supportsFiltering(),
324
348
  })}
325
349
  FROM ${instanceFilterClauses.from} this
326
350
  ${instanceFilterClauses.joins}
@@ -336,38 +360,35 @@ export class ModelsTreeDefinition {
336
360
  ];
337
361
  }
338
362
  async createGeometricElement3dChildrenQuery({ parentNodeInstanceIds: elementIds, instanceFilter, }) {
339
- const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
363
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
340
364
  filter: instanceFilter,
341
- contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: "this" },
365
+ contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: "this" },
342
366
  });
343
367
  return [
344
368
  {
345
- fullClassName: this._hierarchyConfig.elementClassSpecification,
369
+ fullClassName: this.#hierarchyConfig.elementClassSpecification,
346
370
  query: {
347
371
  ecsql: `
348
372
  SELECT
349
- ${await this._selectQueryFactory.createSelectClause({
373
+ ${await this.#selectQueryFactory.createSelectClause({
350
374
  ecClassId: { selector: "this.ECClassId" },
351
375
  ecInstanceId: { selector: "this.ECInstanceId" },
352
376
  nodeLabel: {
353
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
377
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
354
378
  classAlias: "this",
355
- className: this._hierarchyConfig.elementClassSpecification,
379
+ className: this.#hierarchyConfig.elementClassSpecification,
356
380
  }),
357
381
  },
358
382
  grouping: {
359
- byClass: this._hierarchyConfig.elementClassGrouping !== "disable",
383
+ byClass: this.#hierarchyConfig.elementClassGrouping !== "disable",
360
384
  },
361
385
  hasChildren: {
362
386
  selector: `
363
387
  IFNULL((
364
388
  SELECT 1
365
- FROM (
366
- SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}
367
- UNION ALL
368
- SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d
369
- )
370
- WHERE ParentId = this.ECInstanceId
389
+ FROM ${this.#hierarchyConfig.elementClassSpecification} ce
390
+ JOIN ${CLASS_NAME_Model} m ON ce.Model.Id = m.ECInstanceId
391
+ WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)
371
392
  LIMIT 1
372
393
  ), 0)
373
394
  `,
@@ -377,7 +398,7 @@ export class ModelsTreeDefinition {
377
398
  categoryId: { selector: "IdToHex(this.Category.Id)" },
378
399
  imageId: "icon-item",
379
400
  },
380
- supportsFiltering: true,
401
+ supportsFiltering: this.supportsFiltering(),
381
402
  })}
382
403
  FROM ${instanceFilterClauses.from} this
383
404
  ${instanceFilterClauses.joins}
@@ -391,16 +412,22 @@ export class ModelsTreeDefinition {
391
412
  ];
392
413
  }
393
414
  static async createInstanceKeyPaths(props) {
394
- if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {
395
- const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
396
- return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });
397
- }
398
- return createInstanceKeyPathsFromTargetItems(props);
415
+ return lastValueFrom(defer(() => {
416
+ const componentInfo = { componentId: props.componentId ?? Guid.createValue(), componentName: this.#componentName };
417
+ if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {
418
+ const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
419
+ return createInstanceKeyPathsFromInstanceLabelObs({ ...props, ...componentInfo, labelsFactory });
420
+ }
421
+ return createInstanceKeyPathsFromTargetItemsObs({ ...props, ...componentInfo });
422
+ }).pipe(props.abortSignal ? takeUntil(fromEvent(props.abortSignal, "abort")) : identity, defaultIfEmpty([])));
423
+ }
424
+ supportsFiltering() {
425
+ return this.#hierarchyConfig.hierarchyLevelFiltering === "enable";
399
426
  }
400
427
  async isSupported() {
401
- const [schemaName, className] = this._hierarchyConfig.elementClassSpecification.split(/[\.:]/);
428
+ const [schemaName, className] = this.#hierarchyConfig.elementClassSpecification.split(/[\.:]/);
402
429
  if (!schemaName || !className) {
403
- throw new Error(`Provided class specification ${this._hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`);
430
+ throw new Error(`Provided class specification ${this.#hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`);
404
431
  }
405
432
  const query = {
406
433
  ecsql: `
@@ -414,13 +441,16 @@ export class ModelsTreeDefinition {
414
441
  { type: "string", value: className },
415
442
  ],
416
443
  };
417
- for await (const _row of this._queryExecutor.createQueryReader(query)) {
444
+ for await (const _row of this.#queryExecutor.createQueryReader(query, {
445
+ restartToken: `${ModelsTreeDefinition.#componentName}/${this.#componentId}/is-class-supported`,
446
+ })) {
418
447
  return true;
419
448
  }
420
449
  return false;
421
450
  }
422
451
  }
423
- function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, targetItems) {
452
+ function createGeometricElementInstanceKeyPaths(props) {
453
+ const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess } = props;
424
454
  const elementIds = targetItems.filter((info) => typeof info === "string");
425
455
  const groupInfos = targetItems.filter((info) => typeof info !== "string");
426
456
  const separator = ";";
@@ -455,8 +485,8 @@ function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarch
455
485
  )
456
486
 
457
487
  FROM InstanceElementsWithClassGroupingNodes e
458
- LEFT JOIN bis.GeometricModel3d m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)
459
- LEFT JOIN bis.SpatialCategory c ON (e.ParentId IS NULL AND c.ECInstanceId = e.CategoryId)
488
+ LEFT JOIN ${CLASS_NAME_GeometricModel3d} m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)
489
+ LEFT JOIN ${CLASS_NAME_SpatialCategory} c ON (e.ParentId IS NULL AND c.ECInstanceId = e.CategoryId)
460
490
 
461
491
  UNION ALL
462
492
 
@@ -471,8 +501,8 @@ function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarch
471
501
  )
472
502
  FROM ModelsCategoriesElementsHierarchy ce
473
503
  JOIN ${hierarchyConfig.elementClassSpecification} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)
474
- LEFT JOIN bis.GeometricModel3d m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)
475
- LEFT JOIN bis.SpatialCategory c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)
504
+ LEFT JOIN ${CLASS_NAME_GeometricModel3d} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)
505
+ LEFT JOIN ${CLASS_NAME_SpatialCategory} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)
476
506
  )`,
477
507
  ];
478
508
  const ecsql = `
@@ -480,21 +510,20 @@ function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarch
480
510
  FROM ModelsCategoriesElementsHierarchy mce
481
511
  WHERE mce.ParentId IS NULL
482
512
  `;
483
- return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "Indexes", limit: "unbounded" });
484
- }).pipe(releaseMainThreadOnItemsCount(300), map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)), mergeMap(({ modelId, elementHierarchyPath, groupingNode }) => from(idsCache.createModelInstanceKeyPaths(modelId)).pipe(mergeAll(), map((modelPath) => {
485
- // We dont want to modify the original path, we create a copy that we can modify
513
+ return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "Indexes", limit: "unbounded", restartToken: `${componentName}/${componentId}/geometric-element-paths/${chunkIndex}` });
514
+ }).pipe(releaseMainThreadOnItemsCount(300), map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)), mergeMap(({ modelId, elementHierarchyPath, groupingNode }) => idsCache.createModelInstanceKeyPaths(modelId).pipe(mergeAll(), map((modelPath) => {
515
+ // We don't want to modify the original path, we create a copy that we can modify
486
516
  const newModelPath = [...modelPath];
487
517
  newModelPath.pop(); // model is already included in the element hierarchy path
488
518
  const path = [...newModelPath, ...elementHierarchyPath];
489
519
  if (!groupingNode) {
490
- return path;
520
+ return { path };
491
521
  }
492
522
  return {
493
523
  path,
494
524
  options: {
495
- autoExpand: {
496
- key: groupingNode.key,
497
- depth: groupingNode.parentKeys.length,
525
+ reveal: {
526
+ depthInHierarchy: groupingNode.parentKeys.length,
498
527
  },
499
528
  },
500
529
  };
@@ -509,10 +538,10 @@ function parseQueryRow(row, groupInfos, separator, elementClassName) {
509
538
  path.push({ className: elementClassName, id: rowElements[i + 1] });
510
539
  break;
511
540
  case "c":
512
- path.push({ className: "BisCore.SpatialCategory", id: rowElements[i + 1] });
541
+ path.push({ className: CLASS_NAME_SpatialCategory, id: rowElements[i + 1] });
513
542
  break;
514
543
  case "m":
515
- path.push({ className: "BisCore.GeometricModel3d", id: rowElements[i + 1] });
544
+ path.push({ className: CLASS_NAME_GeometricModel3d, id: rowElements[i + 1] });
516
545
  break;
517
546
  }
518
547
  }
@@ -522,66 +551,74 @@ function parseQueryRow(row, groupInfos, separator, elementClassName) {
522
551
  groupingNode: row[2] === -1 ? undefined : groupInfos[row[2]].groupingNode,
523
552
  };
524
553
  }
525
- async function createInstanceKeyPathsFromTargetItems({ targetItems, imodelAccess, hierarchyConfig, idsCache, limit, }) {
554
+ function createInstanceKeyPathsFromTargetItemsObs({ targetItems, imodelAccess, hierarchyConfig, idsCache, limit, componentId, componentName, }) {
526
555
  if (limit !== "unbounded" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {
527
556
  throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);
528
557
  }
529
- return lastValueFrom(from(targetItems).pipe(releaseMainThreadOnItemsCount(2000), mergeMap(async (key) => {
558
+ return from(targetItems).pipe(releaseMainThreadOnItemsCount(2000), mergeMap(async (key) => {
530
559
  if ("parent" in key) {
531
560
  return { key, type: 0 };
532
561
  }
533
- if (await imodelAccess.classDerivesFrom(key.className, "BisCore.Subject")) {
562
+ if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_Subject)) {
534
563
  return { key: key.id, type: 1 };
535
564
  }
536
- if (await imodelAccess.classDerivesFrom(key.className, "BisCore.Model")) {
565
+ if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_Model)) {
537
566
  return { key: key.id, type: 2 };
538
567
  }
539
- if (await imodelAccess.classDerivesFrom(key.className, "BisCore.SpatialCategory")) {
568
+ if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_SpatialCategory)) {
540
569
  return { key: key.id, type: 3 };
541
570
  }
542
571
  return { key: key.id, type: 0 };
543
572
  }, 2), reduce((acc, value) => {
544
573
  if (value.type === 1) {
545
- acc.subjects.push(value.key);
574
+ acc.subjectIds.push(value.key);
546
575
  return acc;
547
576
  }
548
577
  if (value.type === 2) {
549
- acc.models.push(value.key);
578
+ acc.modelIds.push(value.key);
550
579
  return acc;
551
580
  }
552
581
  if (value.type === 3) {
553
- acc.categories.push(value.key);
582
+ acc.categoryIds.push(value.key);
554
583
  return acc;
555
584
  }
556
- acc.elements.push(value.key);
585
+ acc.elementIds.push(value.key);
557
586
  return acc;
558
587
  }, {
559
- models: new Array(),
560
- categories: new Array(),
561
- subjects: new Array(),
562
- elements: new Array(),
588
+ modelIds: new Array(),
589
+ categoryIds: new Array(),
590
+ subjectIds: new Array(),
591
+ elementIds: new Array(),
563
592
  }), switchMap(async (ids) => {
564
- const elementsLength = ids.elements.length;
565
- return collect(merge(from(ids.subjects).pipe(mergeMap((id) => from(idsCache.createSubjectInstanceKeysPath(id)))), from(ids.models).pipe(mergeMap((id) => from(idsCache.createModelInstanceKeyPaths(id)).pipe(mergeAll()))), from(ids.categories).pipe(mergeMap((id) => from(idsCache.createCategoryInstanceKeyPaths(id)).pipe(mergeAll()))), from(ids.elements).pipe(bufferCount(Math.ceil(elementsLength / Math.ceil(elementsLength / 5000))), releaseMainThreadOnItemsCount(1), mergeMap((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, block), 10))));
566
- })));
593
+ const elementsLength = ids.elementIds.length;
594
+ return collect(merge(from(ids.subjectIds).pipe(mergeMap((id) => idsCache.createSubjectInstanceKeysPath(id).pipe(map(HierarchyFilteringPath.normalize)))), from(ids.modelIds).pipe(mergeMap((id) => idsCache.createModelInstanceKeyPaths(id).pipe(mergeAll(), map(HierarchyFilteringPath.normalize)))), from(ids.categoryIds).pipe(mergeMap((id) => idsCache.createCategoryInstanceKeyPaths(id).pipe(mergeAll(), map(HierarchyFilteringPath.normalize)))), from(ids.elementIds).pipe(bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })), releaseMainThreadOnItemsCount(1), mergeMap((block, chunkIndex) => createGeometricElementInstanceKeyPaths({
595
+ imodelAccess,
596
+ idsCache,
597
+ hierarchyConfig,
598
+ targetItems: block,
599
+ componentId,
600
+ componentName,
601
+ chunkIndex,
602
+ }), 10))));
603
+ }));
567
604
  }
568
- async function createInstanceKeyPathsFromInstanceLabel(props) {
569
- const elementLabelSelectClause = await props.labelsFactory.createSelectClause({
570
- classAlias: "e",
571
- className: "BisCore.Element",
572
- // eslint-disable-next-line @typescript-eslint/unbound-method
573
- selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,
574
- });
575
- const targetsReader = props.imodelAccess.createQueryReader({
576
- ecsql: `
605
+ function createInstanceKeyPathsFromInstanceLabelObs(props) {
606
+ const { labelsFactory, hierarchyConfig, label, imodelAccess, limit } = props;
607
+ return defer(async () => {
608
+ const elementLabelSelectClause = await labelsFactory.createSelectClause({
609
+ classAlias: "e",
610
+ className: CLASS_NAME_Element,
611
+ selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,
612
+ });
613
+ const ecsql = `
577
614
  SELECT *
578
615
  FROM (
579
616
  SELECT
580
617
  ec_classname(e.ECClassId, 's.c'),
581
618
  e.ECInstanceId,
582
619
  ${elementLabelSelectClause} Label
583
- FROM BisCore.Element e
584
- WHERE e.ECClassId IS (BisCore.Subject, BisCore.SpatialCategory, ${props.hierarchyConfig.elementClassSpecification})
620
+ FROM ${CLASS_NAME_Element} e
621
+ WHERE e.ECClassId IS (${CLASS_NAME_Subject}, ${CLASS_NAME_SpatialCategory}, ${hierarchyConfig.elementClassSpecification})
585
622
 
586
623
  UNION ALL
587
624
 
@@ -589,22 +626,24 @@ async function createInstanceKeyPathsFromInstanceLabel(props) {
589
626
  ec_classname(m.ECClassId, 's.c'),
590
627
  m.ECInstanceId,
591
628
  ${elementLabelSelectClause} Label
592
- FROM BisCore.GeometricModel3d m
593
- JOIN BisCore.Element e ON e.ECInstanceId = m.ModeledElement.Id
629
+ FROM ${CLASS_NAME_GeometricModel3d} m
630
+ JOIN ${CLASS_NAME_Element} e ON e.ECInstanceId = m.ModeledElement.Id
594
631
  WHERE NOT m.IsPrivate
595
- ${props.hierarchyConfig.showEmptyModels ? "" : `AND EXISTS (SELECT 1 FROM ${props.hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}
632
+ ${hierarchyConfig.showEmptyModels ? "" : `AND EXISTS (SELECT 1 FROM ${hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}
596
633
  AND json_extract(e.JsonProperties, '$.PhysicalPartition.Model.Content') IS NULL
597
634
  AND json_extract(e.JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NULL
598
635
  )
599
636
  WHERE Label LIKE '%' || ? || '%' ESCAPE '\\'
600
637
  LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}
601
- `,
602
- bindings: [{ type: "string", value: props.label.replace(/[%_\\]/g, "\\$&") }],
603
- }, { rowFormat: "Indexes", restartToken: "tree-widget/models-tree/filter-by-label-query", limit: props.limit });
604
- const targetKeys = new Array();
605
- for await (const row of targetsReader) {
606
- targetKeys.push({ className: row[0], id: row[1] });
607
- }
608
- return createInstanceKeyPathsFromTargetItems({ ...props, targetItems: targetKeys });
638
+ `;
639
+ const bindings = [{ type: "string", value: label.replace(/[%_\\]/g, "\\$&") }];
640
+ return { ecsql, bindings };
641
+ }).pipe(mergeMap((queryProps) => {
642
+ return imodelAccess.createQueryReader(queryProps, {
643
+ rowFormat: "Indexes",
644
+ restartToken: `${props.componentName}/${props.componentId}/filter-by-label`,
645
+ limit,
646
+ });
647
+ }), map((row) => ({ className: row[0], id: row[1] })), toArray(), mergeMap((targetKeys) => createInstanceKeyPathsFromTargetItemsObs({ ...props, targetItems: targetKeys })));
609
648
  }
610
649
  //# sourceMappingURL=ModelsTreeDefinition.js.map