@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,202 +2,777 @@
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 { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition } from "@itwin/presentation-hierarchies";
5
+ import { bufferCount, defaultIfEmpty, defer, EMPTY, firstValueFrom, forkJoin, from, fromEvent, identity, lastValueFrom, map, merge, mergeMap, of, reduce, takeUntil, toArray, } from "rxjs";
6
+ import { assert, Guid } from "@itwin/core-bentley";
7
+ import { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, ProcessedHierarchyNode } from "@itwin/presentation-hierarchies";
6
8
  import { createBisInstanceLabelSelectClauseFactory, ECSql } from "@itwin/presentation-shared";
9
+ import { CLASS_NAME_DefinitionContainer, CLASS_NAME_InformationPartitionElement, CLASS_NAME_ISubModeledElement, CLASS_NAME_Model, CLASS_NAME_SubCategory, } from "../common/internal/ClassNameDefinitions.js";
10
+ import { createIdsSelector, getClassesByView, getDistinctMapValues, getOptimalBatchSize, groupingNodeHasFilterTargets, parseIdsSelectorResult, releaseMainThreadOnItemsCount, } from "../common/internal/Utils.js";
7
11
  import { FilterLimitExceededError } from "../common/TreeErrors.js";
8
12
  const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
13
+ /** @internal */
14
+ export const defaultHierarchyConfiguration = {
15
+ hideSubCategories: false,
16
+ showElements: false,
17
+ showEmptyCategories: false,
18
+ };
19
+ /** @internal */
9
20
  export class CategoriesTreeDefinition {
21
+ #impl;
22
+ #selectQueryFactory;
23
+ #nodeLabelSelectClauseFactory;
24
+ #idsCache;
25
+ #hierarchyConfig;
26
+ #iModelAccess;
27
+ #categoryClass;
28
+ #categoryElementClass;
29
+ #categoryModelClass;
30
+ static #componentName = "CategoriesTreeDefinition";
10
31
  constructor(props) {
11
- this._impl = createPredicateBasedHierarchyDefinition({
12
- classHierarchyInspector: props.imodelAccess,
13
- hierarchy: {
14
- rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition({ ...requestProps, viewType: props.viewType }),
15
- childNodes: [
16
- {
17
- parentInstancesNodePredicate: "BisCore.Category",
18
- definitions: async (requestProps) => this.createSubcategoryQuery(requestProps),
19
- },
20
- ],
21
- },
22
- });
23
- this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
24
- this._selectQueryFactory = createNodesQueryClauseFactory({
32
+ this.#iModelAccess = props.imodelAccess;
33
+ this.#idsCache = props.idsCache;
34
+ this.#nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
35
+ this.#selectQueryFactory = createNodesQueryClauseFactory({
25
36
  imodelAccess: props.imodelAccess,
26
- instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,
37
+ instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,
27
38
  });
39
+ this.#hierarchyConfig = props.hierarchyConfig;
40
+ const { categoryClass, elementClass, modelClass } = getClassesByView(props.viewType);
41
+ this.#categoryClass = categoryClass;
42
+ this.#categoryElementClass = elementClass;
43
+ this.#categoryModelClass = modelClass;
44
+ }
45
+ async postProcessNode(node) {
46
+ if (ProcessedHierarchyNode.isGroupingNode(node)) {
47
+ const modelElementsMap = new Map();
48
+ node.children.forEach((child) => {
49
+ let modelEntry = modelElementsMap.get(child.extendedData?.modelId);
50
+ if (!modelEntry) {
51
+ modelEntry = new Set();
52
+ modelElementsMap.set(child.extendedData?.modelId, modelEntry);
53
+ }
54
+ assert(child.key.type === "instances");
55
+ for (const { id } of child.key.instanceKeys) {
56
+ modelEntry.add(id);
57
+ }
58
+ });
59
+ const { hasFilterTargetAncestor, hasDirectNonFilteredTargets } = groupingNodeHasFilterTargets(node.children);
60
+ return {
61
+ ...node,
62
+ label: node.label,
63
+ extendedData: {
64
+ ...node.extendedData,
65
+ // add `categoryId` from the first grouped element
66
+ categoryId: node.children[0].extendedData?.categoryId,
67
+ modelElementsMap,
68
+ ...(hasDirectNonFilteredTargets ? { hasDirectNonFilteredTargets } : {}),
69
+ ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : {}),
70
+ // `imageId` is assigned to instance nodes at query time, but grouping ones need to
71
+ // be handled during post-processing
72
+ imageId: "icon-ec-class",
73
+ },
74
+ };
75
+ }
76
+ return node;
77
+ }
78
+ async getHierarchyDefinition() {
79
+ this.#impl ??= (async () => {
80
+ const isDefinitionContainerSupported = await firstValueFrom(this.#idsCache.getIsDefinitionContainerSupported());
81
+ return createPredicateBasedHierarchyDefinition({
82
+ classHierarchyInspector: this.#iModelAccess,
83
+ hierarchy: {
84
+ rootNodes: async (requestProps) => this.createDefinitionContainersAndCategoriesQuery(requestProps),
85
+ childNodes: [
86
+ ...(this.#hierarchyConfig.showElements
87
+ ? [
88
+ {
89
+ parentInstancesNodePredicate: this.#categoryElementClass,
90
+ definitions: async (requestProps) => this.createElementChildrenQuery(requestProps),
91
+ },
92
+ {
93
+ parentInstancesNodePredicate: CLASS_NAME_ISubModeledElement,
94
+ definitions: async (requestProps) => this.createISubModeledElementChildrenQuery(requestProps),
95
+ },
96
+ {
97
+ parentInstancesNodePredicate: this.#categoryModelClass,
98
+ definitions: async (requestProps) => this.createGeometricModel3dChildrenQuery(requestProps),
99
+ },
100
+ ]
101
+ : []),
102
+ ...(this.#hierarchyConfig.hideSubCategories && !this.#hierarchyConfig.showElements
103
+ ? []
104
+ : [
105
+ {
106
+ parentInstancesNodePredicate: this.#categoryClass,
107
+ definitions: async (requestProps) => this.createCategoryChildrenQuery(requestProps),
108
+ },
109
+ ]),
110
+ ...(isDefinitionContainerSupported
111
+ ? [
112
+ {
113
+ parentInstancesNodePredicate: CLASS_NAME_DefinitionContainer,
114
+ definitions: async (requestProps) => this.createDefinitionContainersAndCategoriesQuery(requestProps),
115
+ },
116
+ ]
117
+ : []),
118
+ ],
119
+ },
120
+ });
121
+ })();
122
+ return this.#impl;
28
123
  }
29
124
  async defineHierarchyLevel(props) {
30
- return this._impl.defineHierarchyLevel(props);
125
+ return (await this.getHierarchyDefinition()).defineHierarchyLevel(props);
31
126
  }
32
- async createRootHierarchyLevelDefinition(props) {
33
- const { categoryClass, categoryElementClass } = getClassesByView(props.viewType);
34
- const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
35
- filter: props.instanceFilter,
36
- contentClass: { fullName: categoryClass, alias: "this" },
127
+ async createISubModeledElementChildrenQuery({ parentNodeInstanceIds: elementIds, }) {
128
+ // note: we do not apply hierarchy level filtering on this hierarchy level, because it's always
129
+ // hidden - the filter will get applied on the child hierarchy levels
130
+ return [
131
+ {
132
+ fullClassName: this.#categoryModelClass,
133
+ query: {
134
+ ecsql: `
135
+ SELECT
136
+ ${await this.#selectQueryFactory.createSelectClause({
137
+ ecClassId: { selector: "this.ECClassId" },
138
+ ecInstanceId: { selector: "this.ECInstanceId" },
139
+ nodeLabel: "", // doesn't matter - the node is always hidden
140
+ hideNodeInHierarchy: true,
141
+ hasChildren: true,
142
+ extendedData: {
143
+ isModel: true,
144
+ },
145
+ })}
146
+ FROM ${this.#categoryModelClass} this
147
+ WHERE
148
+ this.ModeledElement.Id IN (${elementIds.map(() => "?").join(",")})
149
+ AND NOT this.IsPrivate
150
+ AND this.ECInstanceId IN (SELECT Model.Id FROM ${this.#categoryElementClass})
151
+ `,
152
+ bindings: [...elementIds.map((id) => ({ type: "id", value: id }))],
153
+ },
154
+ },
155
+ ];
156
+ }
157
+ async createGeometricModel3dChildrenQuery({ parentNodeInstanceIds: modelIds, instanceFilter, }) {
158
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
159
+ filter: instanceFilter,
160
+ contentClass: { fullName: this.#categoryClass, alias: "this" },
37
161
  });
38
162
  return [
39
163
  {
40
- fullClassName: categoryClass,
164
+ fullClassName: this.#categoryClass,
165
+ query: {
166
+ ecsql: `
167
+ SELECT
168
+ ${await this.#selectQueryFactory.createSelectClause({
169
+ ecClassId: { selector: "this.ECClassId" },
170
+ ecInstanceId: { selector: "this.ECInstanceId" },
171
+ nodeLabel: {
172
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
173
+ classAlias: "this",
174
+ className: this.#categoryClass,
175
+ }),
176
+ },
177
+ grouping: { byLabel: { action: "merge", groupId: "category" } },
178
+ hasChildren: true,
179
+ extendedData: {
180
+ imageId: "icon-layers",
181
+ isCategory: true,
182
+ modelIds: { selector: createIdsSelector(modelIds) },
183
+ isCategoryOfSubModel: true,
184
+ },
185
+ supportsFiltering: true,
186
+ })}
187
+ FROM ${instanceFilterClauses.from} this
188
+ ${instanceFilterClauses.joins}
189
+ WHERE
190
+ EXISTS (
191
+ SELECT 1
192
+ FROM ${this.#categoryElementClass} element
193
+ WHERE
194
+ element.Model.Id IN (${modelIds.join(",")})
195
+ AND element.Category.Id = +this.ECInstanceId
196
+ AND element.Parent.Id IS NULL
197
+ )
198
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
199
+ `,
200
+ },
201
+ },
202
+ ];
203
+ }
204
+ async createDefinitionContainersAndCategoriesQuery(props) {
205
+ const { parentNodeInstanceIds, instanceFilter } = props;
206
+ const { definitionContainers, categories } = await firstValueFrom(parentNodeInstanceIds === undefined
207
+ ? this.#idsCache.getRootDefinitionContainersAndCategories({ includeEmpty: this.#hierarchyConfig.showEmptyCategories })
208
+ : this.#idsCache.getDirectChildDefinitionContainersAndCategories({
209
+ parentDefinitionContainerIds: parentNodeInstanceIds,
210
+ includeEmpty: this.#hierarchyConfig.showEmptyCategories,
211
+ }));
212
+ const hierarchyDefinition = new Array();
213
+ if (categories.length > 0) {
214
+ hierarchyDefinition.push(...(await this.createCategoriesQuery({ categories, instanceFilter })));
215
+ }
216
+ if (definitionContainers.length > 0) {
217
+ hierarchyDefinition.push(...(await this.createDefinitionContainersQuery({ definitionContainerIds: definitionContainers, instanceFilter })));
218
+ }
219
+ return hierarchyDefinition;
220
+ }
221
+ async createDefinitionContainersQuery({ definitionContainerIds, instanceFilter, }) {
222
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
223
+ filter: instanceFilter,
224
+ contentClass: { fullName: CLASS_NAME_DefinitionContainer, alias: "this" },
225
+ });
226
+ return [
227
+ {
228
+ fullClassName: CLASS_NAME_DefinitionContainer,
41
229
  query: {
42
230
  ecsql: `
43
231
  SELECT
44
- ${await this._selectQueryFactory.createSelectClause({
232
+ ${await this.#selectQueryFactory.createSelectClause({
45
233
  ecClassId: { selector: ECSql.createRawPropertyValueSelector("this", "ECClassId") },
46
234
  ecInstanceId: { selector: "this.ECInstanceId" },
47
235
  nodeLabel: {
48
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
236
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
49
237
  classAlias: "this",
50
- className: categoryClass,
238
+ className: CLASS_NAME_DefinitionContainer,
51
239
  }),
52
240
  },
53
- hasChildren: {
54
- selector: `
55
- IFNULL((
56
- SELECT 1
57
- FROM (
58
- SELECT COUNT(1) AS ChildCount
59
- FROM BisCore.SubCategory sc
60
- WHERE sc.Parent.Id = this.ECInstanceId
61
- )
62
- WHERE ChildCount > 1
63
- ), 0)
64
- `,
241
+ extendedData: {
242
+ isDefinitionContainer: true,
243
+ imageId: "icon-definition-container",
244
+ },
245
+ hasChildren: true,
246
+ supportsFiltering: true,
247
+ })}
248
+ FROM
249
+ ${instanceFilterClauses.from} this
250
+ ${instanceFilterClauses.joins}
251
+ WHERE
252
+ this.ECInstanceId IN (${definitionContainerIds.join(", ")})
253
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
254
+ `,
255
+ },
256
+ },
257
+ ];
258
+ }
259
+ async createCategoriesQuery({ categories, instanceFilter, }) {
260
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
261
+ filter: instanceFilter,
262
+ contentClass: { fullName: this.#categoryClass, alias: "this" },
263
+ });
264
+ const categoriesWithMultipleSubCategories = categories
265
+ .filter((categoryInfo) => categoryInfo.subCategoryChildCount > 1)
266
+ .map((categoryInfo) => categoryInfo.id);
267
+ const hasChildrenSelector = () => {
268
+ const conditions = new Array();
269
+ if (!this.#hierarchyConfig.hideSubCategories && categoriesWithMultipleSubCategories.length > 0) {
270
+ conditions.push(`this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(",")})`);
271
+ }
272
+ if (this.#hierarchyConfig.showElements) {
273
+ conditions.push(`
274
+ this.ECInstanceId IN (
275
+ SELECT e.Category.Id
276
+ FROM ${this.#categoryElementClass} e
277
+ WHERE
278
+ e.Parent.Id IS NULL
279
+ AND e.ECInstanceId NOT IN (SELECT m.ECInstanceId FROM ${this.#categoryModelClass} m)
280
+ )`);
281
+ }
282
+ return conditions.length > 0
283
+ ? {
284
+ selector: `IIF(${conditions.join(" OR ")}, 1, 0)`,
285
+ }
286
+ : false;
287
+ };
288
+ return [
289
+ {
290
+ fullClassName: this.#categoryClass,
291
+ query: {
292
+ ecsql: `
293
+ SELECT
294
+ ${await this.#selectQueryFactory.createSelectClause({
295
+ ecClassId: { selector: ECSql.createRawPropertyValueSelector("this", "ECClassId") },
296
+ ecInstanceId: { selector: "this.ECInstanceId" },
297
+ nodeLabel: {
298
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
299
+ classAlias: "this",
300
+ className: this.#categoryClass,
301
+ }),
65
302
  },
303
+ hasChildren: hasChildrenSelector(),
66
304
  extendedData: {
67
305
  description: { selector: "this.Description" },
306
+ isCategory: true,
307
+ imageId: "icon-layers",
308
+ hasSubCategories: categoriesWithMultipleSubCategories.length > 0
309
+ ? { selector: `IIF(this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(",")}), true, false) ` }
310
+ : false,
68
311
  },
69
312
  supportsFiltering: true,
70
313
  })}
71
- FROM ${instanceFilterClauses.from} this
72
- ${instanceFilterClauses.joins}
73
- JOIN BisCore.Model m ON m.ECInstanceId = this.Model.Id
314
+ FROM
315
+ ${instanceFilterClauses.from} this
316
+ ${instanceFilterClauses.joins}
74
317
  WHERE
75
- NOT this.IsPrivate
76
- AND (NOT m.IsPrivate OR m.ECClassId IS (BisCore.DictionaryModel))
77
- AND EXISTS (SELECT 1 FROM ${categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId)
318
+ this.ECInstanceId IN (${categories.map((category) => category.id).join(", ")})
78
319
  ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
79
320
  `,
80
321
  },
81
322
  },
82
323
  ];
83
324
  }
84
- async createSubcategoryQuery({ parentNodeInstanceIds: elementIds, instanceFilter, }) {
85
- const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
325
+ async createCategoryChildrenQuery(props) {
326
+ return (await Promise.all([
327
+ ...(!this.#hierarchyConfig.hideSubCategories && props.parentNode.extendedData?.hasSubCategories ? [this.createSubCategoriesQuery(props)] : []),
328
+ ...(this.#hierarchyConfig.showElements ? [this.createCategoryElementsQuery(props)] : []),
329
+ ])).reduce((acc, levelDefinition) => acc.concat(levelDefinition), new Array());
330
+ }
331
+ async createSubCategoriesQuery({ parentNodeInstanceIds: categoryIds, instanceFilter, }) {
332
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
86
333
  filter: instanceFilter,
87
- contentClass: { fullName: "BisCore.SubCategory", alias: "this" },
334
+ contentClass: { fullName: CLASS_NAME_SubCategory, alias: "this" },
88
335
  });
89
336
  return [
90
337
  {
91
- fullClassName: "BisCore.SubCategory",
338
+ fullClassName: CLASS_NAME_SubCategory,
92
339
  query: {
93
340
  ecsql: `
94
341
  SELECT
95
- ${await this._selectQueryFactory.createSelectClause({
342
+ ${await this.#selectQueryFactory.createSelectClause({
96
343
  ecClassId: { selector: "this.ECClassId" },
97
344
  ecInstanceId: { selector: "this.ECInstanceId" },
98
345
  nodeLabel: {
99
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
346
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
100
347
  classAlias: "this",
101
- className: "BisCore.SubCategory",
348
+ className: CLASS_NAME_SubCategory,
102
349
  }),
103
350
  },
104
351
  extendedData: {
105
352
  categoryId: { selector: "printf('0x%x', this.Parent.Id)" },
353
+ isSubCategory: true,
354
+ imageId: "icon-layers-isolate",
106
355
  },
107
356
  supportsFiltering: false,
108
357
  })}
109
358
  FROM ${instanceFilterClauses.from} this
110
359
  ${instanceFilterClauses.joins}
111
360
  WHERE
112
- NOT this.IsPrivate AND this.Parent.Id IN (${elementIds.map(() => "?").join(",")})
361
+ NOT this.IsPrivate AND this.Parent.Id IN (${categoryIds.join(",")})
362
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
363
+ `,
364
+ },
365
+ },
366
+ ];
367
+ }
368
+ async createCategoryElementsQuery({ parentNodeInstanceIds: categoryIds, instanceFilter, parentNode, }) {
369
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
370
+ filter: instanceFilter,
371
+ contentClass: { fullName: this.#categoryElementClass, alias: "this" },
372
+ });
373
+ const modelIds = parentNode.extendedData?.isCategoryOfSubModel
374
+ ? parseIdsSelectorResult(parentNode.extendedData?.modelIds)
375
+ : [...getDistinctMapValues(await firstValueFrom(this.#idsCache.getCategoriesElementModels(categoryIds)))];
376
+ if (modelIds.length === 0) {
377
+ return [];
378
+ }
379
+ const modeledElements = await firstValueFrom(from(modelIds).pipe(mergeMap((modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)), reduce((acc, foundModeledElements) => {
380
+ return acc.concat(foundModeledElements);
381
+ }, new Array())));
382
+ return [
383
+ {
384
+ fullClassName: this.#categoryElementClass,
385
+ query: {
386
+ ecsql: `
387
+ SELECT
388
+ ${await this.#selectQueryFactory.createSelectClause({
389
+ ecClassId: { selector: "this.ECClassId" },
390
+ ecInstanceId: { selector: "this.ECInstanceId" },
391
+ nodeLabel: {
392
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
393
+ classAlias: "this",
394
+ className: this.#categoryElementClass,
395
+ }),
396
+ },
397
+ hasChildren: {
398
+ selector: `
399
+ IIF(
400
+ ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(",")})` : `FALSE`},
401
+ 1,
402
+ IFNULL((
403
+ SELECT 1
404
+ FROM ${this.#categoryElementClass} ce
405
+ WHERE ce.Parent.Id = this.ECInstanceId
406
+ LIMIT 1
407
+ ), 0)
408
+ )
409
+ `,
410
+ },
411
+ grouping: {
412
+ byClass: true,
413
+ },
414
+ extendedData: {
415
+ modelId: { selector: "IdToHex(this.Model.Id)" },
416
+ categoryId: { selector: "IdToHex(this.Category.Id)" },
417
+ imageId: "icon-item",
418
+ isElement: true,
419
+ },
420
+ supportsFiltering: true,
421
+ })}
422
+ FROM ${instanceFilterClauses.from} this
423
+ ${parentNode.extendedData?.isCategoryOfSubModel ? "" : `JOIN ${CLASS_NAME_InformationPartitionElement} ipe ON ipe.ECInstanceId = this.Model.Id`}
424
+ ${instanceFilterClauses.joins}
425
+ WHERE
426
+ this.Category.Id IN (${categoryIds.join(",")})
427
+ AND this.Model.Id IN (${modelIds.join(",")})
428
+ AND this.Parent.Id IS NULL
429
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
430
+ `,
431
+ },
432
+ },
433
+ ];
434
+ }
435
+ async createElementChildrenQuery({ parentNodeInstanceIds: elementIds, instanceFilter, }) {
436
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
437
+ filter: instanceFilter,
438
+ contentClass: { fullName: this.#categoryElementClass, alias: "this" },
439
+ });
440
+ return [
441
+ {
442
+ fullClassName: this.#categoryElementClass,
443
+ query: {
444
+ ecsql: `
445
+ SELECT
446
+ ${await this.#selectQueryFactory.createSelectClause({
447
+ ecClassId: { selector: "this.ECClassId" },
448
+ ecInstanceId: { selector: "this.ECInstanceId" },
449
+ nodeLabel: {
450
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
451
+ classAlias: "this",
452
+ className: this.#categoryElementClass,
453
+ }),
454
+ },
455
+ hasChildren: {
456
+ selector: `
457
+ IFNULL((
458
+ SELECT 1
459
+ FROM ${this.#categoryElementClass} ce
460
+ JOIN ${CLASS_NAME_Model} m ON ce.Model.Id = m.ECInstanceId
461
+ WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)
462
+ LIMIT 1
463
+ ), 0)
464
+ `,
465
+ },
466
+ grouping: {
467
+ byClass: true,
468
+ },
469
+ extendedData: {
470
+ modelId: { selector: "IdToHex(this.Model.Id)" },
471
+ categoryId: { selector: "IdToHex(this.Category.Id)" },
472
+ imageId: "icon-item",
473
+ isElement: true,
474
+ },
475
+ supportsFiltering: true,
476
+ })}
477
+ FROM ${instanceFilterClauses.from} this
478
+ ${instanceFilterClauses.joins}
479
+ WHERE
480
+ this.Parent.Id IN (${elementIds.join(",")})
113
481
  ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
114
482
  `,
115
- bindings: elementIds.map((id) => ({ type: "id", value: id })),
116
483
  },
117
484
  },
118
485
  ];
119
486
  }
120
487
  static async createInstanceKeyPaths(props) {
121
488
  const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
122
- return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });
489
+ return createInstanceKeyPathsFromInstanceLabel({
490
+ ...props,
491
+ labelsFactory,
492
+ componentId: props.componentId ?? Guid.createValue(),
493
+ componentName: this.#componentName,
494
+ });
123
495
  }
124
496
  }
125
- function getClassesByView(viewType) {
126
- return viewType === "2d"
127
- ? { categoryClass: "BisCore.DrawingCategory", categoryElementClass: "BisCore:GeometricElement2d" }
128
- : { categoryClass: "BisCore.SpatialCategory", categoryElementClass: "BisCore:GeometricElement3d" };
129
- }
130
497
  async function createInstanceKeyPathsFromInstanceLabel(props) {
131
- const { categoryClass, categoryElementClass } = getClassesByView(props.viewType);
132
- const adjustedLabel = props.label.replace(/[%_\\]/g, "\\$&");
133
- const reader = props.imodelAccess.createQueryReader({
134
- ctes: [
135
- `RootCategoriesWithLabels(ClassName, ECInstanceId, ChildCount, DisplayLabel) as (
498
+ const { idsCache, abortSignal, label, viewType, labelsFactory, limit, hierarchyConfig, imodelAccess, componentId, componentName } = props;
499
+ const { categoryClass, elementClass } = getClassesByView(viewType);
500
+ const adjustedLabel = label.replace(/[%_\\]/g, "\\$&");
501
+ const CATEGORIES_WITH_LABELS_CTE = "CategoriesWithLabels";
502
+ const ELEMENTS_WITH_LABELS_CTE = "ElementsWithLabels";
503
+ const SUBCATEGORIES_WITH_LABELS_CTE = "SubCategoriesWithLabels";
504
+ const DEFINITION_CONTAINERS_WITH_LABELS_CTE = "DefinitionContainersWithLabels";
505
+ return lastValueFrom(idsCache
506
+ .getAllDefinitionContainersAndCategories({
507
+ includeEmpty: props.hierarchyConfig.showEmptyCategories,
508
+ })
509
+ .pipe(mergeMap(async ({ definitionContainers, categories }) => {
510
+ if (categories.length === 0) {
511
+ return undefined;
512
+ }
513
+ const [categoryLabelSelectClause, subCategoryLabelSelectClause, elementLabelSelectClause, definitionContainerLabelSelectClause] = await Promise.all([categoryClass, CLASS_NAME_SubCategory, elementClass, ...(definitionContainers.length > 0 ? [CLASS_NAME_DefinitionContainer] : [])].map(async (className) => labelsFactory.createSelectClause({ classAlias: "this", className })));
514
+ const ctes = [
515
+ `${CATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ChildCount, DisplayLabel) AS (
516
+ SELECT
517
+ 'c',
518
+ this.ECInstanceId,
519
+ COUNT(sc.ECInstanceId),
520
+ ${categoryLabelSelectClause}
521
+ FROM
522
+ ${categoryClass} this
523
+ JOIN ${CLASS_NAME_SubCategory} sc ON sc.Parent.Id = this.ECInstanceId
524
+ WHERE
525
+ this.ECInstanceId IN (${categories.join(", ")})
526
+ GROUP BY this.ECInstanceId
527
+ )`,
528
+ ...(hierarchyConfig.showElements
529
+ ? [
530
+ `${ELEMENTS_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (
531
+ SELECT
532
+ 'e',
533
+ this.ECInstanceId,
534
+ this.Parent.Id,
535
+ ${elementLabelSelectClause}
536
+ FROM
537
+ ${elementClass} this
538
+ JOIN ${CLASS_NAME_Model} m ON this.Model.Id = m.ECInstanceId
539
+ WHERE
540
+ NOT m.IsPrivate
541
+ AND this.Category.Id IN (${categories.join(", ")})
542
+ )`,
543
+ ]
544
+ : []),
545
+ ...(hierarchyConfig.hideSubCategories
546
+ ? []
547
+ : [
548
+ `${SUBCATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (
549
+ SELECT
550
+ 'sc',
551
+ this.ECInstanceId,
552
+ this.Parent.Id,
553
+ ${subCategoryLabelSelectClause}
554
+ FROM
555
+ ${CLASS_NAME_SubCategory} this
556
+ WHERE
557
+ NOT this.IsPrivate
558
+ AND this.Parent.Id IN (${categories.join(", ")})
559
+ )`,
560
+ ]),
561
+ ...(definitionContainers.length > 0
562
+ ? [
563
+ `${DEFINITION_CONTAINERS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (
564
+ SELECT
565
+ 'dc',
566
+ this.ECInstanceId,
567
+ ${definitionContainerLabelSelectClause}
568
+ FROM
569
+ ${CLASS_NAME_DefinitionContainer} this
570
+ WHERE
571
+ this.ECInstanceId IN (${definitionContainers.join(", ")})
572
+ )`,
573
+ ]
574
+ : []),
575
+ ];
576
+ const ecsql = `
577
+ SELECT * FROM (
136
578
  SELECT
137
- ec_classname(this.ECClassId, 's.c'),
138
- this.ECInstanceId,
139
- COUNT(sc.ECInstanceId),
140
- ${await props.labelsFactory.createSelectClause({
141
- classAlias: "this",
142
- className: categoryClass,
143
- })}
144
- FROM ${categoryClass} this
145
- JOIN BisCore.Model m ON m.ECInstanceId = this.Model.Id
146
- JOIN BisCore.SubCategory sc ON sc.Parent.Id = this.ECInstanceId
579
+ c.ClassName AS ClassName,
580
+ c.ECInstanceId AS ECInstanceId
581
+ FROM
582
+ ${CATEGORIES_WITH_LABELS_CTE} c
147
583
  WHERE
148
- NOT this.IsPrivate
149
- AND (NOT m.IsPrivate OR m.ECClassId IS (BisCore.DictionaryModel))
150
- AND EXISTS (SELECT 1 FROM ${categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId)
151
- GROUP BY this.ECInstanceId
152
- )`,
153
- `SubCategoriesWithLabels(ClassName, ECInstanceId, ParentId, DisplayLabel) as (
154
- SELECT
155
- ec_classname(this.ECClassId, 's.c'),
156
- this.ECInstanceId,
157
- this.Parent.Id,
158
- ${await props.labelsFactory.createSelectClause({
159
- classAlias: "this",
160
- className: "BisCore.SubCategory",
161
- })}
162
- FROM BisCore.SubCategory this
163
- WHERE NOT this.IsPrivate
164
- )`,
165
- ],
166
- ecsql: `
167
- SELECT * FROM (
584
+ c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
585
+ ${hierarchyConfig.showElements
586
+ ? `
587
+ UNION ALL
588
+ SELECT
589
+ e.ClassName AS ClassName,
590
+ e.ECInstanceId AS ECInstanceId
591
+ FROM
592
+ ${ELEMENTS_WITH_LABELS_CTE} e
593
+ WHERE
594
+ e.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
595
+ `
596
+ : ""}
597
+ ${hierarchyConfig.hideSubCategories
598
+ ? ""
599
+ : `
600
+ UNION ALL
601
+ SELECT
602
+ sc.ClassName AS ClassName,
603
+ sc.ECInstanceId AS ECInstanceId
604
+ FROM
605
+ ${CATEGORIES_WITH_LABELS_CTE} c
606
+ JOIN ${SUBCATEGORIES_WITH_LABELS_CTE} sc ON sc.ParentId = c.ECInstanceId
607
+ WHERE
608
+ c.ChildCount > 1
609
+ AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
610
+ `}
611
+ ${definitionContainers.length > 0
612
+ ? `
613
+ UNION ALL
614
+ SELECT
615
+ dc.ClassName AS ClassName,
616
+ dc.ECInstanceId AS ECInstanceId
617
+ FROM
618
+ ${DEFINITION_CONTAINERS_WITH_LABELS_CTE} dc
619
+ WHERE
620
+ dc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
621
+ `
622
+ : ""}
623
+ )
624
+ ${limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : limit !== "unbounded" ? `LIMIT ${limit}` : ""}
625
+ `;
626
+ const bindings = [
627
+ { type: "string", value: adjustedLabel },
628
+ ...(hierarchyConfig.showElements ? [{ type: "string", value: adjustedLabel }] : []),
629
+ ...(hierarchyConfig.hideSubCategories ? [] : [{ type: "string", value: adjustedLabel }]),
630
+ ...(definitionContainers.length > 0 ? [{ type: "string", value: adjustedLabel }] : []),
631
+ ];
632
+ return { ctes, ecsql, bindings };
633
+ }), mergeMap((queryProps) => {
634
+ if (!queryProps) {
635
+ return EMPTY;
636
+ }
637
+ return imodelAccess.createQueryReader(queryProps, { restartToken: `${componentName}/${componentId}/filter-by-label`, limit });
638
+ }), releaseMainThreadOnItemsCount(1000), map((row) => {
639
+ let className;
640
+ switch (row.ClassName) {
641
+ case "c":
642
+ className = categoryClass;
643
+ break;
644
+ case "sc":
645
+ className = CLASS_NAME_SubCategory;
646
+ break;
647
+ case "e":
648
+ className = elementClass;
649
+ break;
650
+ default:
651
+ className = CLASS_NAME_DefinitionContainer;
652
+ break;
653
+ }
654
+ return {
655
+ className,
656
+ id: row.ECInstanceId,
657
+ };
658
+ }), toArray(), mergeMap((targetItems) => createInstanceKeyPathsFromTargetItems({ ...props, targetItems })), toArray(), abortSignal ? takeUntil(fromEvent(abortSignal, "abort")) : identity, defaultIfEmpty([])));
659
+ }
660
+ function createInstanceKeyPathsFromTargetItems({ targetItems, imodelAccess, viewType, hierarchyConfig, idsCache, limit, componentId, componentName, }) {
661
+ if (limit !== "unbounded" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {
662
+ throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);
663
+ }
664
+ const { categoryClass } = getClassesByView(viewType);
665
+ return from(targetItems).pipe(releaseMainThreadOnItemsCount(500), reduce((acc, { id, className }) => {
666
+ if (className === categoryClass) {
667
+ acc.categoryIds.push(id);
668
+ return acc;
669
+ }
670
+ if (className === CLASS_NAME_DefinitionContainer) {
671
+ acc.definitionContainerIds.push(id);
672
+ return acc;
673
+ }
674
+ if (className === CLASS_NAME_SubCategory) {
675
+ if (hierarchyConfig.hideSubCategories) {
676
+ return acc;
677
+ }
678
+ acc.subCategoryIds.push(id);
679
+ return acc;
680
+ }
681
+ if (!hierarchyConfig.showElements) {
682
+ return acc;
683
+ }
684
+ acc.elementIds.push(id);
685
+ return acc;
686
+ }, {
687
+ definitionContainerIds: new Array(),
688
+ categoryIds: new Array(),
689
+ subCategoryIds: new Array(),
690
+ elementIds: new Array(),
691
+ }), mergeMap((ids) => {
692
+ const elementsLength = ids.elementIds.length;
693
+ return merge(from(ids.definitionContainerIds).pipe(mergeMap((id) => idsCache.getInstanceKeyPaths({ definitionContainerId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.categoryIds).pipe(mergeMap((id) => idsCache.getInstanceKeyPaths({ categoryId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.subCategoryIds).pipe(mergeMap((id) => idsCache.getInstanceKeyPaths({ subCategoryId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.elementIds).pipe(bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })), releaseMainThreadOnItemsCount(1), mergeMap((block, chunkIndex) => createGeometricElementInstanceKeyPaths({
694
+ imodelAccess,
695
+ idsCache,
696
+ hierarchyConfig,
697
+ viewType,
698
+ targetItems: block,
699
+ chunkIndex,
700
+ componentId,
701
+ componentName,
702
+ }), 10)));
703
+ }));
704
+ }
705
+ function createGeometricElementInstanceKeyPaths(props) {
706
+ const separator = ";";
707
+ const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess, viewType } = props;
708
+ const { categoryClass, elementClass, modelClass } = getClassesByView(viewType);
709
+ if (targetItems.length === 0 || !hierarchyConfig.showElements) {
710
+ return EMPTY;
711
+ }
712
+ return defer(() => {
713
+ const ctes = [
714
+ `CategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, Path) AS (
168
715
  SELECT
169
- c.ClassName AS CategoryClass,
170
- c.ECInstanceId AS CategoryId,
171
- sc.ClassName AS SubcategoryClass,
172
- sc.ECInstanceId AS SubcategoryId
173
- FROM RootCategoriesWithLabels c
174
- JOIN SubCategoriesWithLabels sc ON sc.ParentId = c.ECInstanceId
175
- WHERE c.ChildCount > 1 AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
716
+ e.ECInstanceId,
717
+ e.Parent.Id,
718
+ e.Model.Id,
719
+ IIF(e.Parent.Id IS NULL,
720
+ 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT),
721
+ 'e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT)
722
+ )
723
+ FROM ${elementClass} e
724
+ LEFT JOIN ${modelClass} m ON (e.Parent.Id IS NULL AND m.ECInstanceId = e.Model.Id)
725
+ LEFT JOIN ${categoryClass} c ON (e.Parent.Id IS NULL AND c.ECInstanceId = e.Category.Id)
726
+ WHERE e.ECInstanceId IN (${targetItems.join(",")})
727
+
176
728
  UNION ALL
729
+
177
730
  SELECT
178
- c.ClassName AS CategoryClass,
179
- c.ECInstanceId AS CategoryId,
180
- CAST(NULL AS TEXT) AS SubcategoryClass,
181
- CAST(NULL AS TEXT) AS SubcategoryId
182
- FROM RootCategoriesWithLabels c
183
- WHERE c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
184
- )
185
- LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}
186
- `,
187
- bindings: [
188
- { type: "string", value: adjustedLabel },
189
- { type: "string", value: adjustedLabel },
190
- ],
191
- }, { restartToken: "tree-widget/categories-tree/filter-by-label-query" });
192
- const paths = [];
193
- for await (const row of reader) {
194
- const path = { path: [{ className: row.CategoryClass, id: row.CategoryId }], options: { autoExpand: true } };
195
- row.SubcategoryId && path.path.push({ className: row.SubcategoryClass, id: row.SubcategoryId });
196
- paths.push(path);
197
- }
198
- if (paths.length > MAX_FILTERING_INSTANCE_KEY_COUNT) {
199
- throw new FilterLimitExceededError(MAX_FILTERING_INSTANCE_KEY_COUNT);
200
- }
201
- return paths;
731
+ pe.ECInstanceId,
732
+ pe.Parent.Id,
733
+ pe.Model.Id,
734
+ IIF(pe.Parent.Id IS NULL,
735
+ 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path,
736
+ 'e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path
737
+ )
738
+ FROM CategoriesElementsHierarchy ce
739
+ JOIN ${elementClass} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)
740
+ LEFT JOIN ${modelClass} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)
741
+ LEFT JOIN ${categoryClass} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)
742
+ )`,
743
+ ];
744
+ const ecsql = `
745
+ SELECT mce.Path
746
+ FROM CategoriesElementsHierarchy mce
747
+ WHERE mce.ParentId IS NULL
748
+ `;
749
+ return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "Indexes", limit: "unbounded", restartToken: `${componentName}/${componentId}/element-paths/${chunkIndex}` });
750
+ }).pipe(releaseMainThreadOnItemsCount(300), map((row) => parseQueryRow(row, separator, elementClass, categoryClass, modelClass)), mergeMap((elementHierarchyPath) => forkJoin({ elementHierarchyPath: of(elementHierarchyPath), pathToCategory: idsCache.getInstanceKeyPaths({ categoryId: elementHierarchyPath[0].id }) })), map(({ elementHierarchyPath, pathToCategory }) => {
751
+ pathToCategory.pop(); // category is already included in the element hierarchy path
752
+ const path = [...pathToCategory, ...elementHierarchyPath];
753
+ return { path, options: { reveal: true } };
754
+ }));
755
+ }
756
+ function parseQueryRow(row, separator, elementClassName, categoryClassName, modelClassName) {
757
+ const rowElements = row[0].split(separator);
758
+ const path = new Array();
759
+ for (let i = 0; i < rowElements.length; i += 2) {
760
+ switch (rowElements[i]) {
761
+ case "e":
762
+ path.push({ className: elementClassName, id: rowElements[i + 1] });
763
+ break;
764
+ case "c":
765
+ path.push({ className: categoryClassName, id: rowElements[i + 1] });
766
+ break;
767
+ case "m":
768
+ // Ignore first model since it isn't in hierarchy
769
+ if (i === 0) {
770
+ break;
771
+ }
772
+ path.push({ className: modelClassName, id: rowElements[i + 1] });
773
+ break;
774
+ }
775
+ }
776
+ return path;
202
777
  }
203
778
  //# sourceMappingURL=CategoriesTreeDefinition.js.map