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