@itwin/tree-widget-react 2.3.0 → 3.0.0-dev.0

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 (245) hide show
  1. package/CHANGELOG.md +10 -2
  2. package/lib/cjs/TreeWidget.d.ts +2 -3
  3. package/lib/cjs/TreeWidget.js.map +1 -1
  4. package/lib/cjs/components/tree-header/TreeHeader.js +11 -3
  5. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -1
  6. package/lib/cjs/components/trees/CategoriesVisibilityUtils.d.ts +1 -1
  7. package/lib/cjs/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  8. package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +1 -1
  9. package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
  10. package/lib/cjs/components/trees/category-tree/CategoriesTreeButtons.d.ts +28 -0
  11. package/lib/cjs/components/trees/category-tree/CategoriesTreeButtons.js +38 -0
  12. package/lib/cjs/components/trees/category-tree/CategoriesTreeButtons.js.map +1 -0
  13. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.d.ts +2 -17
  14. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js +7 -26
  15. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  16. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.d.ts +1 -8
  17. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  18. package/lib/cjs/components/trees/index.d.ts +3 -0
  19. package/lib/cjs/components/trees/index.js +1 -0
  20. package/lib/cjs/components/trees/index.js.map +1 -1
  21. package/lib/cjs/components/trees/models-tree/ModelsTree.js +2 -3
  22. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  23. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.d.ts +33 -0
  24. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js +86 -0
  25. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js.map +1 -0
  26. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +2 -24
  27. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +24 -76
  28. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  29. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.d.ts +1 -0
  30. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js +13 -3
  31. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  32. package/lib/cjs/components/trees/models-tree/Utils.d.ts +2 -2
  33. package/lib/cjs/components/trees/models-tree/Utils.js.map +1 -1
  34. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTree.d.ts +20 -0
  35. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTree.js +61 -0
  36. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTree.js.map +1 -0
  37. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeComponent.d.ts +16 -0
  38. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeComponent.js +43 -0
  39. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeComponent.js.map +1 -0
  40. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeDefinition.d.ts +23 -0
  41. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js +180 -0
  42. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js.map +1 -0
  43. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.d.ts +36 -0
  44. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js +94 -0
  45. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js.map +1 -0
  46. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContext.d.ts +13 -0
  47. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContext.js +16 -0
  48. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContext.js.map +1 -0
  49. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContextProvider.d.ts +8 -0
  50. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContextProvider.js +47 -0
  51. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContextProvider.js.map +1 -0
  52. package/lib/cjs/components/trees/stateless/common/UseHierarchiesLocalization.d.ts +8 -0
  53. package/lib/cjs/components/trees/stateless/common/UseHierarchiesLocalization.js +33 -0
  54. package/lib/cjs/components/trees/stateless/common/UseHierarchiesLocalization.js.map +1 -0
  55. package/lib/cjs/components/trees/stateless/common/UseHierarchyFiltering.d.ts +16 -0
  56. package/lib/cjs/components/trees/stateless/common/UseHierarchyFiltering.js +139 -0
  57. package/lib/cjs/components/trees/stateless/common/UseHierarchyFiltering.js.map +1 -0
  58. package/lib/cjs/components/trees/stateless/common/UseHierarchyVisibility.d.ts +21 -0
  59. package/lib/cjs/components/trees/stateless/common/UseHierarchyVisibility.js +82 -0
  60. package/lib/cjs/components/trees/stateless/common/UseHierarchyVisibility.js.map +1 -0
  61. package/lib/cjs/components/trees/stateless/common/UseMultiCheckboxHandler.d.ts +13 -0
  62. package/lib/cjs/components/trees/stateless/common/UseMultiCheckboxHandler.js +34 -0
  63. package/lib/cjs/components/trees/stateless/common/UseMultiCheckboxHandler.js.map +1 -0
  64. package/lib/cjs/components/trees/stateless/common/Utils.d.ts +3 -0
  65. package/lib/cjs/components/trees/stateless/common/Utils.js +23 -0
  66. package/lib/cjs/components/trees/stateless/common/Utils.js.map +1 -0
  67. package/lib/cjs/components/trees/stateless/common/components/Delayed.d.ts +6 -0
  68. package/lib/cjs/components/trees/stateless/common/components/Delayed.js +31 -0
  69. package/lib/cjs/components/trees/stateless/common/components/Delayed.js.map +1 -0
  70. package/lib/cjs/components/trees/stateless/common/components/FilterableTree.d.ts +23 -0
  71. package/lib/cjs/components/trees/stateless/common/components/FilterableTree.js +66 -0
  72. package/lib/cjs/components/trees/stateless/common/components/FilterableTree.js.map +1 -0
  73. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.d.ts +5 -0
  74. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.js +16 -0
  75. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.js.map +1 -0
  76. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.scss +21 -0
  77. package/lib/cjs/components/trees/stateless/common/components/VisibilityTree.d.ts +26 -0
  78. package/lib/cjs/components/trees/stateless/common/components/VisibilityTree.js +68 -0
  79. package/lib/cjs/components/trees/stateless/common/components/VisibilityTree.js.map +1 -0
  80. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.d.ts +12 -0
  81. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js +24 -0
  82. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js.map +1 -0
  83. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.d.ts +10 -0
  84. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js +20 -0
  85. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js.map +1 -0
  86. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.d.ts +16 -0
  87. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.js +23 -0
  88. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.js.map +1 -0
  89. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.scss +41 -0
  90. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTree.d.ts +13 -0
  91. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js +40 -0
  92. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js.map +1 -0
  93. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.d.ts +14 -0
  94. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js +25 -0
  95. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -0
  96. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +20 -0
  97. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js +244 -0
  98. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -0
  99. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTree.d.ts +13 -0
  100. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTree.js +48 -0
  101. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTree.js.map +1 -0
  102. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.d.ts +14 -0
  103. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js +25 -0
  104. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js.map +1 -0
  105. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.d.ts +25 -0
  106. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js +639 -0
  107. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -0
  108. package/lib/cjs/components/trees/stateless/index.d.ts +5 -0
  109. package/lib/cjs/components/trees/stateless/index.js +16 -0
  110. package/lib/cjs/components/trees/stateless/index.js.map +1 -0
  111. package/lib/cjs/components/trees/stateless/models-tree/ModelsTree.d.ts +16 -0
  112. package/lib/cjs/components/trees/stateless/models-tree/ModelsTree.js +77 -0
  113. package/lib/cjs/components/trees/stateless/models-tree/ModelsTree.js.map +1 -0
  114. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeComponent.d.ts +17 -0
  115. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeComponent.js +55 -0
  116. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeComponent.js.map +1 -0
  117. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeDefinition.d.ts +35 -0
  118. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeDefinition.js +856 -0
  119. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeDefinition.js.map +1 -0
  120. package/lib/cjs/components/trees/stateless/models-tree/ModelsVisibilityHandler.d.ts +48 -0
  121. package/lib/cjs/components/trees/stateless/models-tree/ModelsVisibilityHandler.js +470 -0
  122. package/lib/cjs/components/trees/stateless/models-tree/ModelsVisibilityHandler.js.map +1 -0
  123. package/lib/esm/TreeWidget.d.ts +2 -3
  124. package/lib/esm/TreeWidget.js.map +1 -1
  125. package/lib/esm/components/tree-header/TreeHeader.js +11 -3
  126. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -1
  127. package/lib/esm/components/trees/CategoriesVisibilityUtils.d.ts +1 -1
  128. package/lib/esm/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  129. package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +1 -1
  130. package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
  131. package/lib/esm/components/trees/category-tree/CategoriesTreeButtons.d.ts +28 -0
  132. package/lib/esm/components/trees/category-tree/CategoriesTreeButtons.js +32 -0
  133. package/lib/esm/components/trees/category-tree/CategoriesTreeButtons.js.map +1 -0
  134. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.d.ts +2 -17
  135. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js +2 -21
  136. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  137. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.d.ts +1 -8
  138. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  139. package/lib/esm/components/trees/index.d.ts +3 -0
  140. package/lib/esm/components/trees/index.js +1 -0
  141. package/lib/esm/components/trees/index.js.map +1 -1
  142. package/lib/esm/components/trees/models-tree/ModelsTree.js +2 -3
  143. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  144. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.d.ts +33 -0
  145. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js +77 -0
  146. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js.map +1 -0
  147. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +2 -24
  148. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +20 -72
  149. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  150. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.d.ts +1 -0
  151. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js +13 -3
  152. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  153. package/lib/esm/components/trees/models-tree/Utils.d.ts +2 -2
  154. package/lib/esm/components/trees/models-tree/Utils.js.map +1 -1
  155. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTree.d.ts +20 -0
  156. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTree.js +57 -0
  157. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTree.js.map +1 -0
  158. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeComponent.d.ts +16 -0
  159. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeComponent.js +39 -0
  160. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeComponent.js.map +1 -0
  161. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeDefinition.d.ts +23 -0
  162. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js +176 -0
  163. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js.map +1 -0
  164. package/lib/esm/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.d.ts +36 -0
  165. package/lib/esm/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js +90 -0
  166. package/lib/esm/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js.map +1 -0
  167. package/lib/esm/components/trees/stateless/common/FocusedInstancesContext.d.ts +13 -0
  168. package/lib/esm/components/trees/stateless/common/FocusedInstancesContext.js +12 -0
  169. package/lib/esm/components/trees/stateless/common/FocusedInstancesContext.js.map +1 -0
  170. package/lib/esm/components/trees/stateless/common/FocusedInstancesContextProvider.d.ts +8 -0
  171. package/lib/esm/components/trees/stateless/common/FocusedInstancesContextProvider.js +43 -0
  172. package/lib/esm/components/trees/stateless/common/FocusedInstancesContextProvider.js.map +1 -0
  173. package/lib/esm/components/trees/stateless/common/UseHierarchiesLocalization.d.ts +8 -0
  174. package/lib/esm/components/trees/stateless/common/UseHierarchiesLocalization.js +29 -0
  175. package/lib/esm/components/trees/stateless/common/UseHierarchiesLocalization.js.map +1 -0
  176. package/lib/esm/components/trees/stateless/common/UseHierarchyFiltering.d.ts +16 -0
  177. package/lib/esm/components/trees/stateless/common/UseHierarchyFiltering.js +135 -0
  178. package/lib/esm/components/trees/stateless/common/UseHierarchyFiltering.js.map +1 -0
  179. package/lib/esm/components/trees/stateless/common/UseHierarchyVisibility.d.ts +21 -0
  180. package/lib/esm/components/trees/stateless/common/UseHierarchyVisibility.js +78 -0
  181. package/lib/esm/components/trees/stateless/common/UseHierarchyVisibility.js.map +1 -0
  182. package/lib/esm/components/trees/stateless/common/UseMultiCheckboxHandler.d.ts +13 -0
  183. package/lib/esm/components/trees/stateless/common/UseMultiCheckboxHandler.js +30 -0
  184. package/lib/esm/components/trees/stateless/common/UseMultiCheckboxHandler.js.map +1 -0
  185. package/lib/esm/components/trees/stateless/common/Utils.d.ts +3 -0
  186. package/lib/esm/components/trees/stateless/common/Utils.js +19 -0
  187. package/lib/esm/components/trees/stateless/common/Utils.js.map +1 -0
  188. package/lib/esm/components/trees/stateless/common/components/Delayed.d.ts +6 -0
  189. package/lib/esm/components/trees/stateless/common/components/Delayed.js +27 -0
  190. package/lib/esm/components/trees/stateless/common/components/Delayed.js.map +1 -0
  191. package/lib/esm/components/trees/stateless/common/components/FilterableTree.d.ts +23 -0
  192. package/lib/esm/components/trees/stateless/common/components/FilterableTree.js +62 -0
  193. package/lib/esm/components/trees/stateless/common/components/FilterableTree.js.map +1 -0
  194. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.d.ts +5 -0
  195. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.js +12 -0
  196. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.js.map +1 -0
  197. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.scss +21 -0
  198. package/lib/esm/components/trees/stateless/common/components/VisibilityTree.d.ts +26 -0
  199. package/lib/esm/components/trees/stateless/common/components/VisibilityTree.js +64 -0
  200. package/lib/esm/components/trees/stateless/common/components/VisibilityTree.js.map +1 -0
  201. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.d.ts +12 -0
  202. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js +20 -0
  203. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js.map +1 -0
  204. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.d.ts +10 -0
  205. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js +13 -0
  206. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js.map +1 -0
  207. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.d.ts +16 -0
  208. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.js +19 -0
  209. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.js.map +1 -0
  210. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.scss +41 -0
  211. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTree.d.ts +13 -0
  212. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js +36 -0
  213. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js.map +1 -0
  214. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.d.ts +14 -0
  215. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js +21 -0
  216. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -0
  217. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +20 -0
  218. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js +240 -0
  219. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -0
  220. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTree.d.ts +13 -0
  221. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTree.js +44 -0
  222. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTree.js.map +1 -0
  223. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.d.ts +14 -0
  224. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js +21 -0
  225. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js.map +1 -0
  226. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.d.ts +25 -0
  227. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js +635 -0
  228. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -0
  229. package/lib/esm/components/trees/stateless/index.d.ts +5 -0
  230. package/lib/esm/components/trees/stateless/index.js +9 -0
  231. package/lib/esm/components/trees/stateless/index.js.map +1 -0
  232. package/lib/esm/components/trees/stateless/models-tree/ModelsTree.d.ts +16 -0
  233. package/lib/esm/components/trees/stateless/models-tree/ModelsTree.js +73 -0
  234. package/lib/esm/components/trees/stateless/models-tree/ModelsTree.js.map +1 -0
  235. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeComponent.d.ts +17 -0
  236. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeComponent.js +51 -0
  237. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeComponent.js.map +1 -0
  238. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeDefinition.d.ts +35 -0
  239. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeDefinition.js +852 -0
  240. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeDefinition.js.map +1 -0
  241. package/lib/esm/components/trees/stateless/models-tree/ModelsVisibilityHandler.d.ts +48 -0
  242. package/lib/esm/components/trees/stateless/models-tree/ModelsVisibilityHandler.js +466 -0
  243. package/lib/esm/components/trees/stateless/models-tree/ModelsVisibilityHandler.js.map +1 -0
  244. package/lib/public/locales/en/TreeWidget.json +21 -0
  245. package/package.json +7 -1
@@ -0,0 +1,852 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { createClassBasedHierarchyDefinition, createNodesQueryClauseFactory, HierarchyNode, NodeSelectClauseColumnNames, } from "@itwin/presentation-hierarchies";
6
+ import { createBisInstanceLabelSelectClauseFactory, ECSql } from "@itwin/presentation-shared";
7
+ // eslint-disable-next-line @typescript-eslint/no-redeclare
8
+ export var ModelsTreeInstanceKeyPathsProps;
9
+ (function (ModelsTreeInstanceKeyPathsProps) {
10
+ function isLabelProps(props) {
11
+ return !!props.label;
12
+ }
13
+ ModelsTreeInstanceKeyPathsProps.isLabelProps = isLabelProps;
14
+ })(ModelsTreeInstanceKeyPathsProps || (ModelsTreeInstanceKeyPathsProps = {}));
15
+ export class ModelsTreeDefinition {
16
+ constructor(props) {
17
+ this._impl = createClassBasedHierarchyDefinition({
18
+ classHierarchyInspector: props.imodelAccess,
19
+ hierarchy: {
20
+ rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition(requestProps),
21
+ childNodes: [
22
+ {
23
+ parentNodeClassName: "BisCore.Subject",
24
+ definitions: async (requestProps) => this.createSubjectChildrenQuery(requestProps),
25
+ },
26
+ {
27
+ parentNodeClassName: "BisCore.ISubModeledElement",
28
+ definitions: async (requestProps) => this.createISubModeledElementChildrenQuery(requestProps),
29
+ },
30
+ {
31
+ parentNodeClassName: "BisCore.GeometricModel3d",
32
+ definitions: async (requestProps) => this.createGeometricModel3dChildrenQuery(requestProps),
33
+ },
34
+ {
35
+ parentNodeClassName: "BisCore.SpatialCategory",
36
+ definitions: async (requestProps) => this.createSpatialCategoryChildrenQuery(requestProps),
37
+ },
38
+ {
39
+ parentNodeClassName: "BisCore.GeometricElement3d",
40
+ definitions: async (requestProps) => this.createGeometricElement3dChildrenQuery(requestProps),
41
+ },
42
+ ],
43
+ },
44
+ });
45
+ this._subjectModelIdsCache = new SubjectModelIdsCache(props.imodelAccess);
46
+ this._selectQueryFactory = createNodesQueryClauseFactory({ imodelAccess: props.imodelAccess });
47
+ this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
48
+ }
49
+ async postProcessNode(node) {
50
+ if (HierarchyNode.isClassGroupingNode(node)) {
51
+ // `imageId` is assigned to instance nodes at query time, but grouping ones need to
52
+ // be handled during post-processing
53
+ // Add `modelId` and `categoryId` from the first grouped element.
54
+ const childExtendedData = node.children[0].extendedData;
55
+ return { ...node, extendedData: { ...node.extendedData, ...childExtendedData, imageId: "icon-ec-class" } };
56
+ }
57
+ return node;
58
+ }
59
+ async defineHierarchyLevel(props) {
60
+ return this._impl.defineHierarchyLevel(props);
61
+ }
62
+ async createRootHierarchyLevelDefinition(props) {
63
+ const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
64
+ filter: props.instanceFilter,
65
+ contentClass: { fullName: "BisCore.Subject", alias: "this" },
66
+ });
67
+ return [
68
+ {
69
+ fullClassName: "BisCore.Subject",
70
+ query: {
71
+ ecsql: `
72
+ SELECT
73
+ ${await this._selectQueryFactory.createSelectClause({
74
+ ecClassId: { selector: ECSql.createRawPropertyValueSelector("this", "ECClassId") },
75
+ ecInstanceId: { selector: "this.ECInstanceId" },
76
+ nodeLabel: {
77
+ selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
78
+ classAlias: "this",
79
+ className: "BisCore.Subject",
80
+ }),
81
+ },
82
+ extendedData: {
83
+ imageId: "icon-imodel-hollow-2",
84
+ isSubject: true,
85
+ },
86
+ autoExpand: true,
87
+ supportsFiltering: true,
88
+ })}
89
+ FROM ${instanceFilterClauses.from} this
90
+ ${instanceFilterClauses.joins}
91
+ WHERE
92
+ this.Parent IS NULL
93
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
94
+ `,
95
+ },
96
+ },
97
+ ];
98
+ }
99
+ async createSubjectChildrenQuery({ parentNodeInstanceIds: subjectIds, instanceFilter, }) {
100
+ const [subjectFilterClauses, modelFilterClauses] = await Promise.all([
101
+ this._selectQueryFactory.createFilterClauses({
102
+ filter: instanceFilter,
103
+ contentClass: { fullName: "BisCore.Subject", alias: "this" },
104
+ }),
105
+ this._selectQueryFactory.createFilterClauses({
106
+ filter: instanceFilter,
107
+ contentClass: { fullName: "BisCore.GeometricModel3d", alias: "this" },
108
+ }),
109
+ ]);
110
+ const [childSubjectIds, childModelIds] = await Promise.all([
111
+ this._subjectModelIdsCache.getChildSubjectIds(subjectIds),
112
+ this._subjectModelIdsCache.getSubjectModelIds(subjectIds),
113
+ ]);
114
+ const defs = new Array();
115
+ childSubjectIds.length &&
116
+ defs.push({
117
+ fullClassName: "BisCore.Subject",
118
+ query: {
119
+ ecsql: `
120
+ SELECT
121
+ ${await this._selectQueryFactory.createSelectClause({
122
+ ecClassId: { selector: "this.ECClassId" },
123
+ ecInstanceId: { selector: "this.ECInstanceId" },
124
+ nodeLabel: {
125
+ selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
126
+ classAlias: "this",
127
+ className: "BisCore.Subject",
128
+ }),
129
+ },
130
+ hideIfNoChildren: true,
131
+ hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },
132
+ grouping: { byLabel: { action: "merge", groupId: "subject" } },
133
+ extendedData: {
134
+ imageId: "icon-folder",
135
+ isSubject: true,
136
+ },
137
+ supportsFiltering: true,
138
+ })}
139
+ FROM ${subjectFilterClauses.from} this
140
+ ${subjectFilterClauses.joins}
141
+ WHERE
142
+ this.ECInstanceId IN (${childSubjectIds.map(() => "?").join(",")})
143
+ ${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : ""}
144
+ `,
145
+ bindings: [
146
+ { type: "idset", value: await this._subjectModelIdsCache.getParentSubjectIds() },
147
+ ...childSubjectIds.map((id) => ({ type: "id", value: id })),
148
+ ],
149
+ },
150
+ });
151
+ childModelIds.length &&
152
+ defs.push({
153
+ fullClassName: "BisCore.GeometricModel3d",
154
+ query: {
155
+ ecsql: `
156
+ SELECT model.ECInstanceId AS ECInstanceId, model.*
157
+ FROM (
158
+ SELECT
159
+ ${await this._selectQueryFactory.createSelectClause({
160
+ ecClassId: { selector: "model.ECClassId" },
161
+ ecInstanceId: { selector: "model.ECInstanceId" },
162
+ nodeLabel: {
163
+ selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
164
+ classAlias: "partition",
165
+ className: "BisCore.InformationPartitionElement",
166
+ }),
167
+ },
168
+ hideNodeInHierarchy: {
169
+ selector: `
170
+ CASE
171
+ WHEN (
172
+ json_extract([partition].JsonProperties, '$.PhysicalPartition.Model.Content') IS NOT NULL
173
+ OR json_extract([partition].JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NOT NULL
174
+ ) THEN 1
175
+ ELSE 0
176
+ END
177
+ `,
178
+ },
179
+ hasChildren: true,
180
+ extendedData: {
181
+ imageId: "icon-model",
182
+ isModel: true,
183
+ },
184
+ supportsFiltering: true,
185
+ })}
186
+ FROM Bis.GeometricModel3d model
187
+ JOIN bis.InformationPartitionElement [partition] ON [partition].ECInstanceId = model.ModeledElement.Id
188
+ WHERE
189
+ model.ECInstanceId IN (${childModelIds.map(() => "?").join(",")})
190
+ ) model
191
+ JOIN ${modelFilterClauses.from} this ON this.ECInstanceId = model.ECInstanceId
192
+ ${modelFilterClauses.joins}
193
+ ${modelFilterClauses.where ? `AND (model.${NodeSelectClauseColumnNames.HideNodeInHierarchy} OR ${modelFilterClauses.where})` : ""}
194
+ `,
195
+ bindings: childModelIds.map((id) => ({ type: "id", value: id })),
196
+ },
197
+ });
198
+ return defs;
199
+ }
200
+ async createISubModeledElementChildrenQuery({ parentNodeInstanceIds: elementIds, }) {
201
+ // note: we do not apply hierarchy level filtering on this hierarchy level, because it's always
202
+ // hidden - the filter will get applied on the child hierarchy levels
203
+ return [
204
+ {
205
+ fullClassName: "BisCore.GeometricModel3d",
206
+ query: {
207
+ ecsql: `
208
+ SELECT
209
+ ${await this._selectQueryFactory.createSelectClause({
210
+ ecClassId: { selector: "this.ECClassId" },
211
+ ecInstanceId: { selector: "this.ECInstanceId" },
212
+ nodeLabel: "",
213
+ hideNodeInHierarchy: true,
214
+ })}
215
+ FROM BisCore.GeometricModel3d this
216
+ WHERE
217
+ this.ModeledElement.Id IN (${elementIds.map(() => "?").join(",")})
218
+ AND NOT this.IsPrivate
219
+ AND this.ECInstanceId IN (SELECT Model.Id FROM bis.GeometricElement3d)
220
+ `,
221
+ bindings: [...elementIds.map((id) => ({ type: "id", value: id }))],
222
+ },
223
+ },
224
+ ];
225
+ }
226
+ async createGeometricModel3dChildrenQuery({ parentNodeInstanceIds: modelIds, instanceFilter, }) {
227
+ function createModelIdsSelector() {
228
+ // Note: `json_array` function only accepts up to 127 arguments and we may have more `modelIds` than that. As a workaround,
229
+ // we're creating an array of arrays
230
+ const slices = new Array();
231
+ for (let sliceStartIndex = 0; sliceStartIndex < modelIds.length; sliceStartIndex += 127) {
232
+ let sliceEndIndex = sliceStartIndex + 127;
233
+ if (sliceEndIndex > modelIds.length) {
234
+ sliceEndIndex = undefined;
235
+ }
236
+ slices.push(modelIds.slice(sliceStartIndex, sliceEndIndex));
237
+ }
238
+ return `json_array(${slices.map((sliceIds) => `json_array(${sliceIds.map((id) => `'${id}'`).join(",")})`).join(",")})`;
239
+ }
240
+ const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
241
+ filter: instanceFilter,
242
+ contentClass: { fullName: "BisCore.SpatialCategory", alias: "this" },
243
+ });
244
+ return [
245
+ {
246
+ fullClassName: "BisCore.SpatialCategory",
247
+ query: {
248
+ ecsql: `
249
+ SELECT
250
+ ${await this._selectQueryFactory.createSelectClause({
251
+ ecClassId: { selector: "this.ECClassId" },
252
+ ecInstanceId: { selector: "this.ECInstanceId" },
253
+ nodeLabel: {
254
+ selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
255
+ classAlias: "this",
256
+ className: "BisCore.SpatialCategory",
257
+ }),
258
+ },
259
+ grouping: { byLabel: { action: "merge", groupId: "category" } },
260
+ hasChildren: true,
261
+ extendedData: {
262
+ imageId: "icon-layers",
263
+ isCategory: true,
264
+ modelIds: { selector: createModelIdsSelector() },
265
+ },
266
+ supportsFiltering: true,
267
+ })}
268
+ FROM ${instanceFilterClauses.from} this
269
+ ${instanceFilterClauses.joins}
270
+ WHERE
271
+ EXISTS (
272
+ SELECT 1
273
+ FROM bis.GeometricElement3d element
274
+ WHERE
275
+ element.Model.Id IN (${modelIds.map(() => "?").join(",")})
276
+ AND element.Category.Id = +this.ECInstanceId
277
+ AND element.Parent IS NULL
278
+ )
279
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
280
+ `,
281
+ bindings: modelIds.map((id) => ({ type: "id", value: id })),
282
+ },
283
+ },
284
+ ];
285
+ }
286
+ async createSpatialCategoryChildrenQuery({ parentNodeInstanceIds: categoryIds, parentNode, instanceFilter, }) {
287
+ const modelIds = parentNode.extendedData && parentNode.extendedData.hasOwnProperty("modelIds") && Array.isArray(parentNode.extendedData.modelIds)
288
+ ? parentNode.extendedData.modelIds.reduce((arr, ids) => [...arr, ...(Array.isArray(ids) ? ids : [ids])], new Array())
289
+ : [];
290
+ if (modelIds.length === 0) {
291
+ throw new Error(`Invalid category node "${parentNode.label}" - missing model information.`);
292
+ }
293
+ const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
294
+ filter: instanceFilter,
295
+ contentClass: { fullName: "BisCore.GeometricElement3d", alias: "this" },
296
+ });
297
+ return [
298
+ {
299
+ fullClassName: "BisCore.GeometricElement3d",
300
+ query: {
301
+ ecsql: `
302
+ SELECT
303
+ ${await this._selectQueryFactory.createSelectClause({
304
+ ecClassId: { selector: "this.ECClassId" },
305
+ ecInstanceId: { selector: "this.ECInstanceId" },
306
+ nodeLabel: {
307
+ selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
308
+ classAlias: "this",
309
+ className: "BisCore.GeometricElement3d",
310
+ }),
311
+ },
312
+ grouping: {
313
+ byClass: true,
314
+ },
315
+ hasChildren: {
316
+ selector: `
317
+ IFNULL((
318
+ SELECT 1
319
+ FROM (
320
+ SELECT Parent.Id ParentId FROM bis.GeometricElement3d
321
+ UNION ALL
322
+ SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d
323
+ )
324
+ WHERE ParentId = this.ECInstanceId
325
+ LIMIT 1
326
+ ), 0)
327
+ `,
328
+ },
329
+ extendedData: {
330
+ modelId: { selector: "printf('0x%x', this.Model.Id)" },
331
+ categoryId: { selector: "printf('0x%x', this.Category.Id)" },
332
+ imageId: "icon-item",
333
+ },
334
+ supportsFiltering: true,
335
+ })}
336
+ FROM ${instanceFilterClauses.from} this
337
+ ${instanceFilterClauses.joins}
338
+ WHERE
339
+ this.Category.Id IN (${categoryIds.map(() => "?").join(",")})
340
+ AND this.Model.Id IN (${modelIds.map(() => "?").join(",")})
341
+ AND this.Parent IS NULL
342
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
343
+ `,
344
+ bindings: [...categoryIds.map((id) => ({ type: "id", value: id })), ...modelIds.map((id) => ({ type: "id", value: id }))],
345
+ },
346
+ },
347
+ ];
348
+ }
349
+ async createGeometricElement3dChildrenQuery({ parentNodeInstanceIds: elementIds, instanceFilter, }) {
350
+ const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
351
+ filter: instanceFilter,
352
+ contentClass: { fullName: "BisCore.GeometricElement3d", alias: "this" },
353
+ });
354
+ return [
355
+ {
356
+ fullClassName: "BisCore.GeometricElement3d",
357
+ query: {
358
+ ecsql: `
359
+ SELECT
360
+ ${await this._selectQueryFactory.createSelectClause({
361
+ ecClassId: { selector: "this.ECClassId" },
362
+ ecInstanceId: { selector: "this.ECInstanceId" },
363
+ nodeLabel: {
364
+ selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
365
+ classAlias: "this",
366
+ className: "BisCore.GeometricElement3d",
367
+ }),
368
+ },
369
+ grouping: {
370
+ byClass: true,
371
+ },
372
+ hasChildren: {
373
+ selector: `
374
+ IFNULL((
375
+ SELECT 1
376
+ FROM (
377
+ SELECT Parent.Id ParentId FROM bis.GeometricElement3d
378
+ UNION ALL
379
+ SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d
380
+ )
381
+ WHERE ParentId = this.ECInstanceId
382
+ LIMIT 1
383
+ ), 0)
384
+ `,
385
+ },
386
+ extendedData: {
387
+ modelId: { selector: "printf('0x%x', this.Model.Id)" },
388
+ categoryId: { selector: "printf('0x%x', this.Category.Id)" },
389
+ imageId: "icon-item",
390
+ },
391
+ supportsFiltering: true,
392
+ })}
393
+ FROM ${instanceFilterClauses.from} this
394
+ ${instanceFilterClauses.joins}
395
+ WHERE
396
+ this.Parent.Id IN (${elementIds.map(() => "?").join(",")})
397
+ ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
398
+ `,
399
+ bindings: elementIds.map((id) => ({ type: "id", value: id })),
400
+ },
401
+ },
402
+ ];
403
+ }
404
+ static async createInstanceKeyPaths(props) {
405
+ if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {
406
+ const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
407
+ return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });
408
+ }
409
+ return createInstanceKeyPathsFromInstanceKeys(props);
410
+ }
411
+ }
412
+ class SubjectModelIdsCache {
413
+ constructor(_queryExecutor) {
414
+ this._queryExecutor = _queryExecutor;
415
+ }
416
+ async *querySubjects() {
417
+ const subjectsQuery = `
418
+ SELECT
419
+ ECInstanceId id,
420
+ Parent.Id parentId,
421
+ json_extract(JsonProperties, '$.Subject.Model.TargetPartition') targetPartitionId,
422
+ CASE
423
+ WHEN (
424
+ json_extract(JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL
425
+ OR json_extract(JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'
426
+ ) THEN 1
427
+ ELSE 0
428
+ END hideInHierarchy
429
+ FROM bis.Subject
430
+ `;
431
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: subjectsQuery }, { rowFormat: "ECSqlPropertyNames" })) {
432
+ yield { id: row.id, parentId: row.parentId, targetPartitionId: row.targetPartitionId, hideInHierarchy: !!row.hideInHierarchy };
433
+ }
434
+ }
435
+ async *queryModels() {
436
+ const modelsQuery = `
437
+ SELECT p.ECInstanceId id, p.Parent.Id parentId
438
+ FROM bis.InformationPartitionElement p
439
+ INNER JOIN bis.GeometricModel3d m ON m.ModeledElement.Id = p.ECInstanceId
440
+ WHERE NOT m.IsPrivate AND EXISTS (SELECT 1 FROM bis.GeometricElement3d WHERE Model.Id = m.ECInstanceId)
441
+ `;
442
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: modelsQuery }, { rowFormat: "ECSqlPropertyNames" })) {
443
+ yield { id: row.id, parentId: row.parentId };
444
+ }
445
+ }
446
+ async initSubjectModels() {
447
+ this._subjectsHierarchy = new Map();
448
+ this._subjectModels = new Map();
449
+ this._subjectInfos = new Map();
450
+ const targetPartitionSubjects = new Map();
451
+ await Promise.all([
452
+ (async () => {
453
+ for await (const subject of this.querySubjects()) {
454
+ this._subjectInfos.set(subject.id, { hideInHierarchy: subject.hideInHierarchy });
455
+ if (subject.parentId) {
456
+ pushToMap(this._subjectsHierarchy, subject.parentId, subject.id);
457
+ }
458
+ if (subject.targetPartitionId) {
459
+ pushToMap(targetPartitionSubjects, subject.targetPartitionId, subject.id);
460
+ }
461
+ }
462
+ })(),
463
+ (async () => {
464
+ for await (const model of this.queryModels()) {
465
+ pushToMap(targetPartitionSubjects, model.id, model.parentId);
466
+ }
467
+ })(),
468
+ ]);
469
+ for (const [partitionId, subjectIds] of targetPartitionSubjects) {
470
+ subjectIds.forEach((subjectId) => {
471
+ pushToMap(this._subjectModels, subjectId, partitionId);
472
+ });
473
+ }
474
+ }
475
+ async initCache() {
476
+ if (!this._init) {
477
+ this._init = this.initSubjectModels();
478
+ }
479
+ return this._init;
480
+ }
481
+ forEachChildSubject(parentSubjectId, cb) {
482
+ const childSubjectIds = this._subjectsHierarchy.get(parentSubjectId);
483
+ childSubjectIds &&
484
+ childSubjectIds.forEach((childSubjectId) => {
485
+ if (cb(childSubjectId) === "break") {
486
+ return;
487
+ }
488
+ this.forEachChildSubject(childSubjectId, cb);
489
+ });
490
+ }
491
+ async getParentSubjectIds() {
492
+ this._parentSubjectIds ??= (async () => {
493
+ await this.initCache();
494
+ const hasChildModels = (subjectId) => {
495
+ if ((this._subjectModels.get(subjectId)?.size ?? 0) > 0) {
496
+ return true;
497
+ }
498
+ const childSubjectIds = this._subjectsHierarchy.get(subjectId);
499
+ return childSubjectIds && [...childSubjectIds].some(hasChildModels);
500
+ };
501
+ const parentSubjectIds = new Set();
502
+ const addIfHasChildren = (subjectId) => {
503
+ if (hasChildModels(subjectId)) {
504
+ parentSubjectIds.add(subjectId);
505
+ }
506
+ };
507
+ this._subjectsHierarchy.forEach((childSubjectIds, parentSubjectId) => {
508
+ addIfHasChildren(parentSubjectId);
509
+ childSubjectIds.forEach(addIfHasChildren);
510
+ });
511
+ return [...parentSubjectIds];
512
+ })();
513
+ return this._parentSubjectIds;
514
+ }
515
+ async getChildSubjectIds(parentSubjectIds) {
516
+ await this.initCache();
517
+ const childSubjectIds = new Array();
518
+ parentSubjectIds.forEach((subjectId) => {
519
+ this.forEachChildSubject(subjectId, (childSubjectId) => {
520
+ const { hideInHierarchy } = this._subjectInfos.get(childSubjectId);
521
+ if (!hideInHierarchy) {
522
+ childSubjectIds.push(childSubjectId);
523
+ return "break";
524
+ }
525
+ return "continue";
526
+ });
527
+ });
528
+ return childSubjectIds;
529
+ }
530
+ async getSubjectModelIds(parentSubjectIds) {
531
+ await this.initCache();
532
+ const hiddenSubjectIds = new Array();
533
+ parentSubjectIds.forEach((subjectId) => {
534
+ this.forEachChildSubject(subjectId, (childSubjectId) => {
535
+ const { hideInHierarchy } = this._subjectInfos.get(childSubjectId);
536
+ if (hideInHierarchy) {
537
+ hiddenSubjectIds.push(childSubjectId);
538
+ return "continue";
539
+ }
540
+ return "break";
541
+ });
542
+ });
543
+ const modelIds = new Array();
544
+ [...parentSubjectIds, ...hiddenSubjectIds].forEach((subjectId) => {
545
+ const subjectModelIds = this._subjectModels.get(subjectId);
546
+ subjectModelIds && modelIds.push(...subjectModelIds);
547
+ });
548
+ return modelIds;
549
+ }
550
+ }
551
+ function pushToMap(map, key, value) {
552
+ let list = map.get(key);
553
+ if (!list) {
554
+ list = new Set();
555
+ map.set(key, list);
556
+ }
557
+ list.add(value);
558
+ }
559
+ function createECInstanceKeySelectClause(props) {
560
+ const classIdSelector = props.classIdSelector ?? `[${props.classIdAlias ?? props.alias}].[ECClassId]`;
561
+ const instanceHexIdSelector = props.instanceHexIdSelector ?? `printf('0x%x', [${props.instanceIdAlias ?? props.alias}].[ECInstanceId])`;
562
+ return `json_object('className', ec_classname(${classIdSelector}, 's.c'), 'id', ${instanceHexIdSelector})`;
563
+ }
564
+ async function createSubjectModelsInstanceKeysPathsCTEs(labelsFactory) {
565
+ return [
566
+ `Models(ECClassId, ECInstanceId, HexId, ModeledElementParentId, Label) AS (
567
+ SELECT
568
+ m.ECClassId,
569
+ m.ECInstanceId,
570
+ printf('0x%x', m.ECInstanceId) HexId,
571
+ p.Parent.Id,
572
+ ${await labelsFactory.createSelectClause({
573
+ classAlias: "p",
574
+ className: "BisCore.Element",
575
+ // eslint-disable-next-line @typescript-eslint/unbound-method
576
+ selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,
577
+ })}
578
+ FROM bis.GeometricModel3d m
579
+ JOIN bis.Element p on p.ECInstanceId = m.ModeledElement.Id
580
+ )`,
581
+ `SubjectsHierarchy(TargetId, TargetLabel, ECClassId, ECInstanceId, ParentId, JsonProperties, Path) AS (
582
+ SELECT
583
+ s.ECInstanceId,
584
+ ${await labelsFactory.createSelectClause({
585
+ classAlias: "s",
586
+ className: "BisCore.Subject",
587
+ // eslint-disable-next-line @typescript-eslint/unbound-method
588
+ selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,
589
+ })},
590
+ s.ECClassId,
591
+ s.ECInstanceId,
592
+ s.Parent.Id,
593
+ s.JsonProperties,
594
+ CASE
595
+ WHEN (
596
+ json_extract(s.JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL
597
+ OR json_extract(s.JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'
598
+ )
599
+ THEN
600
+ json_array()
601
+ ELSE
602
+ json_array(${createECInstanceKeySelectClause({ alias: "s" })})
603
+ END
604
+ FROM bis.Subject s
605
+ UNION ALL
606
+ SELECT
607
+ c.TargetId,
608
+ c.TargetLabel,
609
+ p.ECClassId,
610
+ p.ECInstanceId,
611
+ p.Parent.Id,
612
+ p.JsonProperties,
613
+ CASE
614
+ WHEN (
615
+ json_extract(p.JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL
616
+ OR json_extract(p.JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'
617
+ )
618
+ THEN
619
+ c.Path
620
+ ELSE
621
+ json_insert(c.Path, '$[#]', ${createECInstanceKeySelectClause({ alias: "p" })})
622
+ END
623
+ FROM SubjectsHierarchy c
624
+ JOIN bis.Element p on p.ECInstanceId = c.ParentId
625
+ )`,
626
+ `Subjects(TargetId, TargetLabel, ECClassId, ECInstanceId, JsonProperties, Path) AS (
627
+ SELECT s.TargetId, s.TargetLabel, s.ECClassId, s.ECInstanceId, s.JsonProperties, s.Path
628
+ FROM SubjectsHierarchy s
629
+ WHERE s.ParentId IS NULL
630
+ )`,
631
+ ];
632
+ }
633
+ async function createInstanceKeyPathsCTEs(labelsFactory) {
634
+ return [
635
+ `GeometricElementsHierarchy(TargetId, TargetLabel, ECClassId, ECInstanceId, ParentId, ModelId, CategoryId, Path) AS (
636
+ SELECT
637
+ e.ECInstanceId,
638
+ ${await labelsFactory.createSelectClause({
639
+ classAlias: "e",
640
+ className: "BisCore.GeometricElement3d",
641
+ // eslint-disable-next-line @typescript-eslint/unbound-method
642
+ selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,
643
+ })},
644
+ e.ECClassId,
645
+ e.ECInstanceId,
646
+ e.Parent.Id,
647
+ e.Model.Id,
648
+ e.Category.Id,
649
+ json_array(${createECInstanceKeySelectClause({ alias: "e" })})
650
+ FROM bis.GeometricElement3d e
651
+ UNION ALL
652
+ SELECT
653
+ c.TargetId,
654
+ c.TargetLabel,
655
+ p.ECClassId,
656
+ p.ECInstanceId,
657
+ p.Parent.Id,
658
+ p.Model.Id,
659
+ p.Category.Id,
660
+ json_insert(c.Path, '$[#]', ${createECInstanceKeySelectClause({ alias: "p" })})
661
+ FROM GeometricElementsHierarchy c
662
+ JOIN bis.GeometricElement3d p on p.ECInstanceId = c.ParentId
663
+ )`,
664
+ `GeometricElements(TargetId, TargetLabel, ECClassId, ECInstanceId, ModelId, CategoryId, Path) AS (
665
+ SELECT e.TargetId, e.TargetLabel, e.ECClassId, e.ECInstanceId, e.ModelId, e.CategoryId, e.Path
666
+ FROM GeometricElementsHierarchy e
667
+ WHERE e.ParentId IS NULL
668
+ )`,
669
+ `Categories(ECClassId, ECInstanceId, HexId, Label) AS (
670
+ SELECT
671
+ c.ECClassId,
672
+ c.ECInstanceId,
673
+ printf('0x%x', c.ECInstanceId) HexId,
674
+ ${await labelsFactory.createSelectClause({
675
+ classAlias: "c",
676
+ className: "BisCore.SpatialCategory",
677
+ // eslint-disable-next-line @typescript-eslint/unbound-method
678
+ selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,
679
+ })}
680
+ FROM bis.SpatialCategory c
681
+ )`,
682
+ `ModelsCategoriesElementsHierarchy(TargetElementId, TargetElementLabel, ModelId, ModelHexId, ModelParentId, Path) AS (
683
+ SELECT
684
+ e.TargetId,
685
+ e.TargetLabel,
686
+ m.ECInstanceId,
687
+ m.HexId,
688
+ m.ModeledElementParentId,
689
+ json_insert(
690
+ e.Path,
691
+ '$[#]', ${createECInstanceKeySelectClause({
692
+ classIdAlias: "c",
693
+ instanceHexIdSelector: "c.HexId",
694
+ })},
695
+ '$[#]', ${createECInstanceKeySelectClause({
696
+ classIdAlias: "m",
697
+ instanceHexIdSelector: "m.HexId",
698
+ })}
699
+ )
700
+ FROM GeometricElements e
701
+ JOIN Categories c ON c.ECInstanceId = e.CategoryId
702
+ JOIN Models m ON m.ECInstanceId = e.ModelId
703
+ UNION ALL
704
+ SELECT
705
+ mce.TargetElementId,
706
+ mce.TargetElementLabel,
707
+ m.ECInstanceId,
708
+ m.HexId,
709
+ m.ModeledElementParentId,
710
+ json_insert(
711
+ mce.Path,
712
+ '$[#]', json(e.Path),
713
+ '$[#]', ${createECInstanceKeySelectClause({
714
+ classIdAlias: "c",
715
+ instanceHexIdSelector: "c.HexId",
716
+ })},
717
+ '$[#]', ${createECInstanceKeySelectClause({
718
+ classIdAlias: "m",
719
+ instanceHexIdSelector: "m.HexId",
720
+ })}
721
+ )
722
+ FROM ModelsCategoriesElementsHierarchy mce
723
+ JOIN GeometricElements e on e.TargetId = mce.ModelId
724
+ JOIN Categories c ON c.ECInstanceId = e.CategoryId
725
+ JOIN Models m ON m.ECInstanceId = e.ModelId
726
+ )`,
727
+ ...(await createSubjectModelsInstanceKeysPathsCTEs(labelsFactory)),
728
+ ];
729
+ }
730
+ async function createInstanceKeyPathsFromInstanceKeys(props) {
731
+ const ids = {
732
+ models: new Array(),
733
+ categories: new Array(),
734
+ subjects: new Array(),
735
+ elements: new Array(),
736
+ };
737
+ await Promise.all(props.keys.map(async (key) => {
738
+ if (await props.imodelAccess.classDerivesFrom(key.className, "BisCore.Subject")) {
739
+ ids.subjects.push(key.id);
740
+ }
741
+ else if (await props.imodelAccess.classDerivesFrom(key.className, "BisCore.Model")) {
742
+ ids.models.push(key.id);
743
+ }
744
+ else if (await props.imodelAccess.classDerivesFrom(key.className, "BisCore.SpatialCategory")) {
745
+ ids.categories.push(key.id);
746
+ }
747
+ else {
748
+ ids.elements.push(key.id);
749
+ }
750
+ }));
751
+ const queries = [];
752
+ if (ids.elements.length > 0) {
753
+ queries.push(`
754
+ SELECT json_insert(mce.Path, '$[#]', json(s.Path))
755
+ FROM ModelsCategoriesElementsHierarchy mce
756
+ JOIN Subjects s ON s.TargetId = mce.ModelParentId OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = mce.ModelHexId
757
+ WHERE mce.TargetElementId IN (${ids.elements.map(() => "?").join(",")})
758
+ `);
759
+ }
760
+ if (ids.categories.length > 0) {
761
+ queries.push(`
762
+ SELECT
763
+ json_array(
764
+ ${createECInstanceKeySelectClause({ classIdAlias: "c", instanceHexIdSelector: "c.HexId" })},
765
+ ${createECInstanceKeySelectClause({ classIdAlias: "m", instanceHexIdSelector: "m.HexId" })},
766
+ json(s.Path)
767
+ )
768
+ FROM Categories c,
769
+ Models m
770
+ JOIN Subjects s ON s.TargetId = m.ModeledElementParentId OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = m.HexId
771
+ WHERE
772
+ m.ECInstanceId IN (SELECT e.Model.Id FROM bis.GeometricElement3d e WHERE e.Category.Id = c.ECInstanceId)
773
+ AND c.ECInstanceId IN (${ids.categories.map(() => "?").join(",")})
774
+ `);
775
+ }
776
+ if (ids.models.length > 0) {
777
+ queries.push(`
778
+ SELECT
779
+ json_array(
780
+ ${createECInstanceKeySelectClause({ classIdAlias: "m", instanceHexIdSelector: "m.HexId" })},
781
+ json(s.Path)
782
+ )
783
+ FROM Models m
784
+ JOIN Subjects s ON s.TargetId = m.ModeledElementParentId OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = m.HexId
785
+ WHERE m.ECInstanceId IN (${ids.models.map(() => "?").join(",")})
786
+ `);
787
+ }
788
+ if (ids.subjects.length > 0) {
789
+ queries.push(`
790
+ SELECT s.Path
791
+ FROM Subjects s
792
+ WHERE s.TargetId IN (${ids.subjects.map(() => "?").join(",")})
793
+ `);
794
+ }
795
+ if (queries.length === 0) {
796
+ return [];
797
+ }
798
+ const bindings = [];
799
+ ids.elements.forEach((id) => bindings.push({ type: "id", value: id }));
800
+ ids.categories.forEach((id) => bindings.push({ type: "id", value: id }));
801
+ ids.models.forEach((id) => bindings.push({ type: "id", value: id }));
802
+ ids.subjects.forEach((id) => bindings.push({ type: "id", value: id }));
803
+ const reader = props.imodelAccess.createQueryReader({
804
+ ctes: await createInstanceKeyPathsCTEs({ createSelectClause: async () => "''" }),
805
+ ecsql: queries.join(" UNION ALL "),
806
+ bindings,
807
+ }, { rowFormat: "Indexes", restartToken: "tree-widget/models-tree/filter-by-keys-query" });
808
+ const paths = new Array();
809
+ for await (const row of reader) {
810
+ paths.push(flatten(JSON.parse(row[0])).reverse());
811
+ }
812
+ return paths;
813
+ }
814
+ async function createInstanceKeyPathsFromInstanceLabel(props) {
815
+ const queries = [];
816
+ queries.push(`
817
+ SELECT
818
+ m.Label AS Label,
819
+ json_array(
820
+ ${createECInstanceKeySelectClause({ classIdAlias: "m", instanceHexIdSelector: "m.HexId" })},
821
+ json(s.Path)
822
+ ) AS Path
823
+ FROM Models m
824
+ JOIN Subjects s ON s.TargetId = m.ModeledElementParentId OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = m.HexId
825
+ `);
826
+ queries.push(`
827
+ SELECT s.TargetLabel AS Label, s.Path AS Path
828
+ FROM Subjects s
829
+ `);
830
+ const reader = props.imodelAccess.createQueryReader({
831
+ ctes: await createSubjectModelsInstanceKeysPathsCTEs(props.labelsFactory),
832
+ ecsql: `
833
+ SELECT DISTINCT Path
834
+ FROM (
835
+ ${queries.join(" UNION ALL ")}
836
+ )
837
+ WHERE Label LIKE '%' || ? || '%'
838
+ `,
839
+ bindings: [{ type: "string", value: props.label }],
840
+ }, { rowFormat: "Indexes", restartToken: "tree-widget/models-tree/filter-by-label-query" });
841
+ const paths = new Array();
842
+ for await (const row of reader) {
843
+ paths.push(flatten(JSON.parse(row[0])).reverse());
844
+ }
845
+ return paths;
846
+ }
847
+ function flatten(source) {
848
+ return source.reduce((flat, item) => {
849
+ return [...flat, ...(Array.isArray(item) ? flatten(item) : [item])];
850
+ }, new Array());
851
+ }
852
+ //# sourceMappingURL=ModelsTreeDefinition.js.map