@itwin/tree-widget-react 4.0.0-alpha.25 → 4.0.0-alpha.26

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 (192) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +2 -1
  3. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
  4. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js +1 -1
  5. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.js.map +1 -1
  6. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +4 -1
  7. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +4 -1
  8. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  9. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +1 -0
  10. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +36 -47
  11. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +2 -0
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +4 -1
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +2 -1
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +75 -38
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeNode.d.ts +3 -1
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeNode.js.map +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +4 -2
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +38 -23
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +11 -21
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +16 -168
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNodeInternal.d.ts +65 -0
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNodeInternal.js +22 -0
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNodeInternal.js.map +1 -0
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseSearchPaths.d.ts +2 -2
  30. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseSearchPaths.js +4 -4
  31. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/UseSearchPaths.js.map +1 -1
  32. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.d.ts +6 -10
  33. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +180 -88
  34. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -1
  35. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.d.ts +14 -5
  36. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js +43 -24
  37. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js.map +1 -1
  38. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/SearchResultsTree.d.ts +3 -1
  39. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/SearchResultsTree.js +78 -17
  40. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/SearchResultsTree.js.map +1 -1
  41. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +2 -0
  42. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +4 -1
  43. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -1
  44. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +91 -114
  45. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -1
  46. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.d.ts +2 -2
  47. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeIcon.js.map +1 -1
  48. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeNode.d.ts +1 -3
  49. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeNode.js +2 -4
  50. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeNode.js.map +1 -1
  51. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +13 -1
  52. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +62 -32
  53. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -1
  54. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.d.ts +12 -9
  55. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js +42 -38
  56. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js.map +1 -1
  57. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +15 -38
  58. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +59 -242
  59. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
  60. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNodeInternal.d.ts +29 -0
  61. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNodeInternal.js +19 -0
  62. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNodeInternal.js.map +1 -0
  63. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.d.ts +4 -8
  64. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +154 -78
  65. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -1
  66. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.js +20 -6
  67. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHelper.js.map +1 -1
  68. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.d.ts +6 -10
  69. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.js +104 -63
  70. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.js.map +1 -1
  71. package/lib/esm/tree-widget-react/components/trees/common/SharedTreeContextProvider.d.ts +7 -0
  72. package/lib/esm/tree-widget-react/components/trees/common/SharedTreeContextProvider.js +14 -0
  73. package/lib/esm/tree-widget-react/components/trees/common/SharedTreeContextProvider.js.map +1 -0
  74. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js +1 -1
  75. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js.map +1 -1
  76. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +2 -2
  77. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +2 -2
  79. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  80. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +4 -4
  81. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +1 -1
  82. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  83. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.d.ts +4 -4
  84. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
  85. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js +7 -5
  86. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js.map +1 -1
  87. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +2 -2
  88. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
  89. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js +5 -5
  90. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  91. package/lib/esm/tree-widget-react/components/trees/common/internal/SharedTreeContextProviderInternal.d.ts +20 -0
  92. package/lib/esm/tree-widget-react/components/trees/common/internal/SharedTreeContextProviderInternal.js +44 -0
  93. package/lib/esm/tree-widget-react/components/trees/common/internal/SharedTreeContextProviderInternal.js.map +1 -0
  94. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +4 -0
  95. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -1
  96. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.d.ts +12 -0
  97. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js +2 -1
  98. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js.map +1 -1
  99. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +17 -6
  100. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +58 -29
  101. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -1
  102. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +8 -14
  103. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +22 -26
  104. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -1
  105. package/lib/esm/tree-widget-react/components/trees/common/internal/{AlwaysAndNeverDrawnElementInfo.d.ts → caches/AlwaysAndNeverDrawnElementInfoCache.d.ts} +15 -21
  106. package/lib/esm/tree-widget-react/components/trees/common/internal/{AlwaysAndNeverDrawnElementInfo.js → caches/AlwaysAndNeverDrawnElementInfoCache.js} +40 -38
  107. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/AlwaysAndNeverDrawnElementInfoCache.js.map +1 -0
  108. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/BaseIdsCache.d.ts +68 -0
  109. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/BaseIdsCache.js +148 -0
  110. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/BaseIdsCache.js.map +1 -0
  111. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ElementChildrenCache.d.ts +30 -0
  112. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ElementChildrenCache.js +151 -0
  113. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ElementChildrenCache.js.map +1 -0
  114. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ElementModelCategoriesCache.d.ts +32 -0
  115. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ElementModelCategoriesCache.js +106 -0
  116. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ElementModelCategoriesCache.js.map +1 -0
  117. package/lib/esm/tree-widget-react/components/trees/common/internal/{ModelCategoryElementsCountCache.d.ts → caches/ModelCategoryElementsCountCache.d.ts} +9 -2
  118. package/lib/esm/tree-widget-react/components/trees/common/internal/{ModelCategoryElementsCountCache.js → caches/ModelCategoryElementsCountCache.js} +17 -21
  119. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ModelCategoryElementsCountCache.js.map +1 -0
  120. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ModeledElementsCache.d.ts +27 -0
  121. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ModeledElementsCache.js +106 -0
  122. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/ModeledElementsCache.js.map +1 -0
  123. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/SubCategoriesCache.d.ts +23 -0
  124. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/SubCategoriesCache.js +56 -0
  125. package/lib/esm/tree-widget-react/components/trees/common/internal/caches/SubCategoriesCache.js.map +1 -0
  126. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.d.ts +6 -6
  127. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js +27 -17
  128. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseCachedVisibility.js.map +1 -1
  129. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +7 -13
  130. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +36 -35
  131. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -1
  132. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.d.ts +18 -0
  133. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.js +14 -1
  134. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseSearchResultsTree.js.map +1 -1
  135. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.d.ts +46 -70
  136. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js +229 -361
  137. package/lib/esm/tree-widget-react/components/trees/common/internal/visibility/BaseVisibilityHelper.js.map +1 -1
  138. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +2 -2
  139. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  140. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  141. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +2 -2
  142. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  143. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  144. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +1 -1
  145. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  146. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +32 -19
  147. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  148. package/lib/esm/tree-widget-react/components/trees/index.d.ts +2 -1
  149. package/lib/esm/tree-widget-react/components/trees/index.js +2 -1
  150. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  151. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +4 -1
  152. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +4 -1
  153. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  154. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.d.ts +7 -3
  155. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +36 -35
  156. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  157. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -0
  158. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +3 -1
  159. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  160. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +1 -0
  161. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +56 -26
  162. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  163. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +5 -3
  164. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +25 -12
  165. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  166. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +11 -23
  167. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +56 -189
  168. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  169. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNodeInternal.d.ts +52 -0
  170. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNodeInternal.js +22 -0
  171. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNodeInternal.js.map +1 -0
  172. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.d.ts +2 -2
  173. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.js +8 -8
  174. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseSearchPaths.js.map +1 -1
  175. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.d.ts +6 -10
  176. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +179 -72
  177. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -1
  178. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.d.ts +6 -0
  179. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.js +20 -8
  180. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHelper.js.map +1 -1
  181. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/SearchResultsTree.d.ts +4 -2
  182. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/SearchResultsTree.js +73 -13
  183. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/SearchResultsTree.js.map +1 -1
  184. package/lib/esm/tree-widget-react-internal.d.ts +1 -0
  185. package/lib/esm/tree-widget-react-internal.js +1 -0
  186. package/lib/esm/tree-widget-react-internal.js.map +1 -1
  187. package/package.json +77 -82
  188. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.d.ts +0 -20
  189. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.js +0 -53
  190. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseSearchPaths.js.map +0 -1
  191. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
  192. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +0 -1
@@ -4,7 +4,7 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { firstValueFrom } from "rxjs";
6
6
  import { assert } from "@itwin/core-bentley";
7
- import { CLASS_NAME_Classification, CLASS_NAME_ClassificationTable, CLASS_NAME_GeometricElement2d } from "../../../common/internal/ClassNameDefinitions.js";
7
+ import { CLASS_NAME_Classification, CLASS_NAME_ClassificationTable, CLASS_NAME_GeometricElement3d } from "../../../common/internal/ClassNameDefinitions.js";
8
8
  import { createSearchResultsTree, SearchResultsNodesHandler } from "../../../common/internal/visibility/BaseSearchResultsTree.js";
9
9
  /** @internal */
10
10
  export async function createClassificationsSearchResultsTree(props) {
@@ -21,34 +21,28 @@ class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHan
21
21
  this.#props = props;
22
22
  }
23
23
  async getProcessedSearchResultsNodes() {
24
- const searchResultsTemporary2dElements = new Map();
25
- const searchResultsTemporary3dElements = new Map();
24
+ const searchResultsTemporaryElements = new Map();
26
25
  const result = {
27
- searchResults2dElements: new Map(),
28
- searchResults3dElements: new Map(),
26
+ searchResultsElements: new Map(),
29
27
  };
30
28
  for (const node of this.searchResultsNodesArr) {
31
- if (node.type === "element2d") {
32
- searchResultsTemporary2dElements.set(node.id, node);
33
- }
34
- else if (node.type === "element3d") {
35
- searchResultsTemporary3dElements.set(node.id, node);
29
+ if (node.type === "element") {
30
+ searchResultsTemporaryElements.set(node.id, node);
36
31
  }
37
32
  }
38
33
  const searchResultsElementsModels = await firstValueFrom(this.#props.idsCache.getFilteredElementsData({
39
- element2dIds: [...searchResultsTemporary2dElements.keys()],
40
- element3dIds: [...searchResultsTemporary3dElements.keys()],
34
+ elementIds: [...searchResultsTemporaryElements.keys()],
41
35
  }));
42
- searchResultsTemporary2dElements.forEach((element, id) => {
43
- const entry = searchResultsElementsModels.get(element.id);
44
- assert(entry !== undefined);
45
- result.searchResults2dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });
46
- });
47
- searchResultsTemporary3dElements.forEach((element, id) => {
36
+ for (const [id, element] of searchResultsTemporaryElements) {
48
37
  const entry = searchResultsElementsModels.get(element.id);
49
38
  assert(entry !== undefined);
50
- result.searchResults3dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });
51
- });
39
+ result.searchResultsElements.set(id, {
40
+ ...element,
41
+ modelId: entry.modelId,
42
+ categoryId: entry.categoryId,
43
+ categoryOfTopMostParentElement: entry.categoryOfTopMostParentElement,
44
+ });
45
+ }
52
46
  return result;
53
47
  }
54
48
  convertNodesToSearchTargets(searchResultsNodes, processedSearchResultsNodes) {
@@ -56,39 +50,51 @@ class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHan
56
50
  searchResultsNodes.forEach((searchResultsNode) => this.collectSearchTargets(searchTargets, searchResultsNode, processedSearchResultsNodes));
57
51
  return this.convertInternalSearchTargets(searchTargets);
58
52
  }
53
+ convertInternalSearchTargetElementsRecursively(searchTargetsInternalElements, currentPath) {
54
+ const result = [];
55
+ // Internal search target elements are stored in a tree structure, need to convert that to array structure.
56
+ for (const [identifierAsString, entry] of searchTargetsInternalElements) {
57
+ const identifier = this.convertSearchResultsNodeIdentifierStringToHierarchyNodeIdentifier(identifierAsString);
58
+ if (entry.modelCategoryElements) {
59
+ for (const [modelCategoryKey, { elementsMap: elements, categoryOfTopMostParentElement }] of entry.modelCategoryElements) {
60
+ const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);
61
+ result.push({
62
+ pathToElements: [...currentPath, identifier],
63
+ modelId,
64
+ categoryId,
65
+ elements,
66
+ categoryOfTopMostParentElement,
67
+ topMostParentElementId: entry.topMostParentElementId,
68
+ });
69
+ }
70
+ }
71
+ if (!entry.children) {
72
+ continue;
73
+ }
74
+ for (const childValue of this.convertInternalSearchTargetElementsRecursively(entry.children, [...currentPath, identifier])) {
75
+ result.push(childValue);
76
+ }
77
+ }
78
+ return result;
79
+ }
59
80
  convertInternalSearchTargets(searchTargets) {
60
- if (!searchTargets.classificationIds && !searchTargets.classificationIds && !searchTargets.elements2d && !searchTargets.elements3d) {
81
+ if (!searchTargets.classificationIds && !searchTargets.classificationIds && !searchTargets.elements) {
61
82
  return undefined;
62
83
  }
63
84
  return {
64
85
  classificationIds: searchTargets.classificationIds,
65
86
  classificationTableIds: searchTargets.classificationIds,
66
- elements2d: searchTargets.elements2d
67
- ? [...searchTargets.elements2d?.entries()].map(([modelCategoryKey, elements]) => {
68
- const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);
69
- return { modelId, categoryId, elements };
70
- })
71
- : undefined,
72
- elements3d: searchTargets.elements3d
73
- ? [...searchTargets.elements3d?.entries()].map(([modelCategoryKey, elements]) => {
74
- const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);
75
- return { modelId, categoryId, elements };
76
- })
77
- : undefined,
87
+ elements: searchTargets.elements ? this.convertInternalSearchTargetElementsRecursively(searchTargets.elements, []) : undefined,
78
88
  };
79
89
  }
80
90
  collectSearchTargets(searchTargets, node, processedSearchResultsNodes) {
81
- const searchResultsNode = node.type === "element2d"
82
- ? processedSearchResultsNodes.searchResults2dElements.get(node.id)
83
- : node.type === "element3d"
84
- ? processedSearchResultsNodes.searchResults3dElements.get(node.id)
85
- : node;
91
+ const searchResultsNode = node.type === "element" ? processedSearchResultsNodes.searchResultsElements.get(node.id) : node;
86
92
  assert(searchResultsNode !== undefined);
87
93
  if (searchResultsNode.isSearchTarget) {
88
94
  this.addTarget(searchTargets, searchResultsNode);
89
95
  return;
90
96
  }
91
- if (searchResultsNode.type === "element2d" || searchResultsNode.type === "element3d") {
97
+ if (searchResultsNode.type === "element") {
92
98
  // need to add parent ids as search target will be an element
93
99
  this.addTarget(searchTargets, searchResultsNode);
94
100
  }
@@ -99,6 +105,47 @@ class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHan
99
105
  this.collectSearchTargets(searchTargets, child, processedSearchResultsNodes);
100
106
  }
101
107
  }
108
+ addTargetElement(searchTargets, node) {
109
+ // Internal search target elements need to have path saved in some way.
110
+ // For this, a tree structure is used, where keys are stringified identifiers of parent nodes depending on the hierarchy.
111
+ const modelCategoryKey = this.createModelCategoryKey(node.modelId, node.categoryId);
112
+ if (!searchTargets.elements) {
113
+ searchTargets.elements = new Map();
114
+ }
115
+ const searchTargetElementsMap = searchTargets.elements;
116
+ assert(searchTargetElementsMap !== undefined);
117
+ let entry = searchTargetElementsMap;
118
+ let topMostParentElementId;
119
+ for (let i = 0; i < node.pathToNode.length; ++i) {
120
+ if (topMostParentElementId === undefined && node.type === "element") {
121
+ topMostParentElementId = node.pathToNode[i].id;
122
+ }
123
+ const identifierAsString = this.convertSearchResultsNodeIdentifierToString(node.pathToNode[i]);
124
+ let identifierEntry = entry.get(identifierAsString);
125
+ // create a new entry for parent node if it does not exist
126
+ if (!identifierEntry) {
127
+ identifierEntry = { topMostParentElementId };
128
+ entry.set(identifierAsString, identifierEntry);
129
+ }
130
+ // last entry in the path don't need to have children
131
+ if (i < node.pathToNode.length - 1) {
132
+ identifierEntry.children ??= new Map();
133
+ entry = identifierEntry.children;
134
+ continue;
135
+ }
136
+ const elements = (identifierEntry.modelCategoryElements ??= new Map()).get(modelCategoryKey);
137
+ // Add elements who share the same path to the modelCategoryElements map
138
+ if (elements) {
139
+ elements.set(node.id, { isSearchTarget: node.isSearchTarget });
140
+ }
141
+ else {
142
+ identifierEntry.modelCategoryElements.set(modelCategoryKey, {
143
+ elementsMap: new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]),
144
+ categoryOfTopMostParentElement: node.categoryOfTopMostParentElement,
145
+ });
146
+ }
147
+ }
148
+ }
102
149
  addTarget(searchTargets, node) {
103
150
  switch (node.type) {
104
151
  case "classificationTable":
@@ -107,25 +154,8 @@ class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHan
107
154
  case "classification":
108
155
  (searchTargets.classificationIds ??= new Set()).add(node.id);
109
156
  return;
110
- case "element2d":
111
- const element2dKey = this.createModelCategoryKey(node.modelId, node.categoryId);
112
- const elements2d = (searchTargets.elements2d ??= new Map()).get(element2dKey);
113
- if (elements2d) {
114
- elements2d.set(node.id, { isSearchTarget: node.isSearchTarget });
115
- }
116
- else {
117
- searchTargets.elements2d.set(element2dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));
118
- }
119
- return;
120
- case "element3d":
121
- const element3dKey = this.createModelCategoryKey(node.modelId, node.categoryId);
122
- const elements3d = (searchTargets.elements3d ??= new Map()).get(element3dKey);
123
- if (elements3d) {
124
- elements3d.set(node.id, { isSearchTarget: node.isSearchTarget });
125
- }
126
- else {
127
- searchTargets.elements3d.set(element3dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));
128
- }
157
+ case "element":
158
+ this.addTargetElement(searchTargets, node);
129
159
  return;
130
160
  }
131
161
  }
@@ -136,20 +166,24 @@ class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHan
136
166
  const [modelId, categoryId] = key.split("-");
137
167
  return { modelId, categoryId };
138
168
  }
139
- createSearchResultsTreeNode({ type, id, isSearchTarget, }) {
140
- if (type === "element2d" || type === "element3d") {
169
+ createSearchResultsTreeNode({ type, id, isSearchTarget, parent, }) {
170
+ const pathToNode = "pathToNode" in parent ? [...parent.pathToNode, { type: parent.type, id: parent.id }] : [];
171
+ if (type === "element") {
141
172
  return {
142
173
  id,
143
174
  isSearchTarget,
144
175
  type,
145
176
  modelId: undefined,
146
177
  categoryId: undefined,
178
+ categoryOfTopMostParentElement: undefined,
179
+ pathToNode,
147
180
  };
148
181
  }
149
182
  return {
150
183
  id,
151
184
  isSearchTarget,
152
185
  type,
186
+ pathToNode,
153
187
  };
154
188
  }
155
189
  async getType(className) {
@@ -159,10 +193,17 @@ class ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHan
159
193
  if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_Classification)) {
160
194
  return "classification";
161
195
  }
162
- if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_GeometricElement2d)) {
163
- return "element2d";
196
+ return "element";
197
+ }
198
+ getClassName(type) {
199
+ switch (type) {
200
+ case "classificationTable":
201
+ return CLASS_NAME_ClassificationTable;
202
+ case "classification":
203
+ return CLASS_NAME_Classification;
204
+ case "element":
205
+ return CLASS_NAME_GeometricElement3d;
164
206
  }
165
- return "element3d";
166
207
  }
167
208
  }
168
209
  //# sourceMappingURL=SearchResultsTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchResultsTree.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { firstValueFrom } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { CLASS_NAME_Classification, CLASS_NAME_ClassificationTable, CLASS_NAME_GeometricElement2d } from \"../../../common/internal/ClassNameDefinitions.js\";\nimport { createSearchResultsTree, SearchResultsNodesHandler } from \"../../../common/internal/visibility/BaseSearchResultsTree.js\";\n\nimport type { Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector } from \"@itwin/presentation-shared\";\nimport type { CategoryId, ElementId, ModelId } from \"../../../common/internal/Types.js\";\nimport type { BaseSearchResultsTreeNode, SearchResultsTree, SearchResultsTreeNodeChildren } from \"../../../common/internal/visibility/BaseSearchResultsTree.js\";\nimport type { ClassificationsTreeIdsCache } from \"../ClassificationsTreeIdsCache.js\";\n\ninterface ClassificationTableSearchResultsTreeNode extends BaseSearchResultsTreeNode<ClassificationTableSearchResultsTreeNode> {\n type: \"classificationTable\";\n}\n\ninterface ClassificationSearchResultsTreeNode extends BaseSearchResultsTreeNode<ClassificationSearchResultsTreeNode> {\n type: \"classification\";\n}\n\ninterface Element2dSearchResultsTreeNode extends BaseSearchResultsTreeNode<Element2dSearchResultsTreeNode> {\n type: \"element2d\";\n categoryId: Id64String;\n modelId: Id64String;\n}\n\ninterface Element3dSearchResultsTreeNode extends BaseSearchResultsTreeNode<Element3dSearchResultsTreeNode> {\n type: \"element3d\";\n categoryId: Id64String;\n modelId: Id64String;\n}\n\ntype SearchResultsTreeNode =\n | ClassificationTableSearchResultsTreeNode\n | ClassificationSearchResultsTreeNode\n | Element2dSearchResultsTreeNode\n | Element3dSearchResultsTreeNode;\n\ntype TemporaryElement2dSearchResultsNode = Omit<Element2dSearchResultsTreeNode, \"modelId\" | \"categoryId\" | \"children\"> & {\n modelId: string | undefined;\n categoryId: string | undefined;\n children?: SearchResultsTreeNodeChildren<TemporaryElement2dSearchResultsNode>;\n};\n\ntype TemporaryElement3dSearchResultsNode = Omit<Element3dSearchResultsTreeNode, \"modelId\" | \"categoryId\" | \"children\"> & {\n modelId: string | undefined;\n categoryId: string | undefined;\n children?: SearchResultsTreeNodeChildren<TemporaryElement3dSearchResultsNode>;\n};\n\ntype TemporarySearchResultsTreeNode =\n | ClassificationTableSearchResultsTreeNode\n | ClassificationSearchResultsTreeNode\n | TemporaryElement2dSearchResultsNode\n | TemporaryElement3dSearchResultsNode;\n\n/** @internal */\nexport interface ClassificationsTreeSearchTargets {\n elements2d?: Array<{ modelId: Id64String; categoryId: Id64String; elements: Map<ElementId, { isSearchTarget: boolean }> }>;\n elements3d?: Array<{ modelId: Id64String; categoryId: Id64String; elements: Map<ElementId, { isSearchTarget: boolean }> }>;\n classificationTableIds?: Id64Set;\n classificationIds?: Id64Set;\n}\n\n/** @internal */\nexport async function createClassificationsSearchResultsTree(props: {\n imodelAccess: ECClassHierarchyInspector;\n searchPaths: HierarchySearchPath[];\n idsCache: ClassificationsTreeIdsCache;\n}): Promise<SearchResultsTree<ClassificationsTreeSearchTargets>> {\n const { imodelAccess, searchPaths, idsCache } = props;\n return createSearchResultsTree({\n searchResultsNodesHandler: new ClassificationsTreeSearchResultsNodesHandler({ idsCache, imodelAccess }),\n searchPaths,\n });\n}\n\ninterface SearchTargetsInternal {\n elements2d?: Map<ModelCategoryKey, Map<ElementId, { isSearchTarget: boolean }>>;\n elements3d?: Map<ModelCategoryKey, Map<ElementId, { isSearchTarget: boolean }>>;\n classificationTableIds?: Id64Set;\n classificationIds?: Id64Set;\n}\n\ninterface ClassificationsTreeSearchResultsNodesHandlerProps {\n idsCache: ClassificationsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n}\n\ntype ModelCategoryKey = `${ModelId}-${CategoryId}`;\n\ninterface ProcessedSearchResultsNodes {\n searchResults2dElements: Map<Id64String, Omit<Element2dSearchResultsTreeNode, \"children\">>;\n searchResults3dElements: Map<Id64String, Omit<Element3dSearchResultsTreeNode, \"children\">>;\n}\n\nclass ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHandler<\n ProcessedSearchResultsNodes,\n ClassificationsTreeSearchTargets,\n TemporarySearchResultsTreeNode\n> {\n readonly #props: ClassificationsTreeSearchResultsNodesHandlerProps;\n constructor(props: ClassificationsTreeSearchResultsNodesHandlerProps) {\n super();\n this.#props = props;\n }\n\n public async getProcessedSearchResultsNodes(): Promise<ProcessedSearchResultsNodes> {\n const searchResultsTemporary2dElements = new Map<Id64String, Omit<TemporaryElement2dSearchResultsNode, \"children\">>();\n const searchResultsTemporary3dElements = new Map<Id64String, Omit<TemporaryElement3dSearchResultsNode, \"children\">>();\n const result: ProcessedSearchResultsNodes = {\n searchResults2dElements: new Map(),\n searchResults3dElements: new Map(),\n };\n for (const node of this.searchResultsNodesArr) {\n if (node.type === \"element2d\") {\n searchResultsTemporary2dElements.set(node.id, node);\n } else if (node.type === \"element3d\") {\n searchResultsTemporary3dElements.set(node.id, node);\n }\n }\n\n const searchResultsElementsModels = await firstValueFrom(\n this.#props.idsCache.getFilteredElementsData({\n element2dIds: [...searchResultsTemporary2dElements.keys()],\n element3dIds: [...searchResultsTemporary3dElements.keys()],\n }),\n );\n searchResultsTemporary2dElements.forEach((element, id) => {\n const entry = searchResultsElementsModels.get(element.id);\n assert(entry !== undefined);\n result.searchResults2dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });\n });\n searchResultsTemporary3dElements.forEach((element, id) => {\n const entry = searchResultsElementsModels.get(element.id);\n assert(entry !== undefined);\n result.searchResults3dElements.set(id, { ...element, modelId: entry.modelId, categoryId: entry.categoryId });\n });\n return result;\n }\n\n public convertNodesToSearchTargets(\n searchResultsNodes: TemporarySearchResultsTreeNode[],\n processedSearchResultsNodes: ProcessedSearchResultsNodes,\n ): ClassificationsTreeSearchTargets | undefined {\n const searchTargets: SearchTargetsInternal = {};\n\n searchResultsNodes.forEach((searchResultsNode) => this.collectSearchTargets(searchTargets, searchResultsNode, processedSearchResultsNodes));\n\n return this.convertInternalSearchTargets(searchTargets);\n }\n\n private convertInternalSearchTargets(searchTargets: SearchTargetsInternal): ClassificationsTreeSearchTargets | undefined {\n if (!searchTargets.classificationIds && !searchTargets.classificationIds && !searchTargets.elements2d && !searchTargets.elements3d) {\n return undefined;\n }\n\n return {\n classificationIds: searchTargets.classificationIds,\n classificationTableIds: searchTargets.classificationIds,\n elements2d: searchTargets.elements2d\n ? [...searchTargets.elements2d?.entries()].map(([modelCategoryKey, elements]) => {\n const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);\n return { modelId, categoryId, elements };\n })\n : undefined,\n elements3d: searchTargets.elements3d\n ? [...searchTargets.elements3d?.entries()].map(([modelCategoryKey, elements]) => {\n const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);\n return { modelId, categoryId, elements };\n })\n : undefined,\n };\n }\n\n private collectSearchTargets(\n searchTargets: SearchTargetsInternal,\n node: TemporarySearchResultsTreeNode,\n processedSearchResultsNodes: ProcessedSearchResultsNodes,\n ) {\n const searchResultsNode =\n node.type === \"element2d\"\n ? processedSearchResultsNodes.searchResults2dElements.get(node.id)\n : node.type === \"element3d\"\n ? processedSearchResultsNodes.searchResults3dElements.get(node.id)\n : node;\n assert(searchResultsNode !== undefined);\n if (searchResultsNode.isSearchTarget) {\n this.addTarget(searchTargets, searchResultsNode);\n return;\n }\n\n if (searchResultsNode.type === \"element2d\" || searchResultsNode.type === \"element3d\") {\n // need to add parent ids as search target will be an element\n this.addTarget(searchTargets, searchResultsNode);\n }\n\n if (!node.children) {\n return;\n }\n\n for (const child of node.children.values()) {\n this.collectSearchTargets(searchTargets, child, processedSearchResultsNodes);\n }\n }\n\n private addTarget(searchTargets: SearchTargetsInternal, node: SearchResultsTreeNode) {\n switch (node.type) {\n case \"classificationTable\":\n (searchTargets.classificationTableIds ??= new Set()).add(node.id);\n return;\n case \"classification\":\n (searchTargets.classificationIds ??= new Set()).add(node.id);\n return;\n case \"element2d\":\n const element2dKey = this.createModelCategoryKey(node.modelId, node.categoryId);\n const elements2d = (searchTargets.elements2d ??= new Map()).get(element2dKey);\n if (elements2d) {\n elements2d.set(node.id, { isSearchTarget: node.isSearchTarget });\n } else {\n searchTargets.elements2d.set(element2dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));\n }\n return;\n case \"element3d\":\n const element3dKey = this.createModelCategoryKey(node.modelId, node.categoryId);\n const elements3d = (searchTargets.elements3d ??= new Map()).get(element3dKey);\n if (elements3d) {\n elements3d.set(node.id, { isSearchTarget: node.isSearchTarget });\n } else {\n searchTargets.elements3d.set(element3dKey, new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]));\n }\n return;\n }\n }\n\n private createModelCategoryKey(modelId: Id64String, categoryId: Id64String): ModelCategoryKey {\n return `${modelId}-${categoryId}`;\n }\n\n private parseModelCategoryKey(key: ModelCategoryKey): { modelId: Id64String; categoryId: Id64String } {\n const [modelId, categoryId] = key.split(\"-\");\n return { modelId, categoryId };\n }\n\n public createSearchResultsTreeNode({\n type,\n id,\n isSearchTarget,\n }: {\n type: SearchResultsTreeNode[\"type\"];\n id: Id64String;\n isSearchTarget: boolean;\n }): TemporarySearchResultsTreeNode {\n if (type === \"element2d\" || type === \"element3d\") {\n return {\n id,\n isSearchTarget,\n type,\n modelId: undefined,\n categoryId: undefined,\n };\n }\n return {\n id,\n isSearchTarget,\n type,\n };\n }\n\n public async getType(className: string): Promise<TemporarySearchResultsTreeNode[\"type\"]> {\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_ClassificationTable)) {\n return \"classificationTable\";\n }\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_Classification)) {\n return \"classification\";\n }\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_GeometricElement2d)) {\n return \"element2d\";\n }\n return \"element3d\";\n }\n}\n"]}
1
+ {"version":3,"file":"SearchResultsTree.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/classifications-tree/internal/visibility/SearchResultsTree.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AAC5J,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,8DAA8D,CAAC;AAuDlI,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAAC,KAI5D;IACC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACtD,OAAO,uBAAuB,CAAC;QAC7B,yBAAyB,EAAE,IAAI,4CAA4C,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QACvG,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AA2BD,MAAM,4CAA6C,SAAQ,yBAI1D;IACU,MAAM,CAAoD;IACnE,YAAY,KAAwD;QAClE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,8BAA8B;QACzC,MAAM,8BAA8B,GAAG,IAAI,GAAG,EAAmE,CAAC;QAClH,MAAM,MAAM,GAAgC;YAC1C,qBAAqB,EAAE,IAAI,GAAG,EAAE;SACjC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,MAAM,2BAA2B,GAAG,MAAM,cAAc,CACtD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC3C,UAAU,EAAE,CAAC,GAAG,8BAA8B,CAAC,IAAI,EAAE,CAAC;SACvD,CAAC,CACH,CAAC;QACF,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,8BAA8B,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;YAC5B,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnC,GAAG,OAAO;gBACV,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,8BAA8B,EAAE,KAAK,CAAC,8BAA8B;aACrE,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,2BAA2B,CAChC,kBAAoD,EACpD,2BAAwD;QAExD,MAAM,aAAa,GAA0B,EAAE,CAAC;QAEhD,kBAAkB,CAAC,OAAO,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,EAAE,2BAA2B,CAAC,CAAC,CAAC;QAE5I,OAAO,IAAI,CAAC,4BAA4B,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC;IAEO,8CAA8C,CACpD,6BAA4D,EAC5D,WAA0B;QAE1B,MAAM,MAAM,GAA2D,EAAE,CAAC;QAC1E,2GAA2G;QAC3G,KAAK,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,IAAI,6BAA6B,EAAE,CAAC;YACxE,MAAM,UAAU,GAAG,IAAI,CAAC,iEAAiE,CAAC,kBAAkB,CAAC,CAAC;YAC9G,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC;gBAChC,KAAK,MAAM,CAAC,gBAAgB,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,8BAA8B,EAAE,CAAC,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC;oBACxH,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;oBAC7E,MAAM,CAAC,IAAI,CAAC;wBACV,cAAc,EAAE,CAAC,GAAG,WAAW,EAAE,UAAU,CAAC;wBAC5C,OAAO;wBACP,UAAU;wBACV,QAAQ;wBACR,8BAA8B;wBAC9B,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;qBACrD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,8CAA8C,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,WAAW,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC3H,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,4BAA4B,CAAC,aAAoC;QACvE,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YACpG,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,iBAAiB,EAAE,aAAa,CAAC,iBAAiB;YAClD,sBAAsB,EAAE,aAAa,CAAC,iBAAiB;YACvD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;SAC/H,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAC1B,aAAoC,EACpC,IAAoC,EACpC,2BAAwD;QAExD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1H,MAAM,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC;QACxC,IAAI,iBAAiB,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,iBAAiB,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzC,6DAA6D;YAC7D,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,oBAAoB,CAAC,aAAa,EAAE,KAAK,EAAE,2BAA2B,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,aAAoC,EAAE,IAAkC;QAC/F,uEAAuE;QACvE,yHAAyH;QACzH,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpF,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QACrC,CAAC;QACD,MAAM,uBAAuB,GAAG,aAAa,CAAC,QAAQ,CAAC;QACvD,MAAM,CAAC,uBAAuB,KAAK,SAAS,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,uBAAuB,CAAC;QACpC,IAAI,sBAA8C,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAChD,IAAI,sBAAsB,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACpE,sBAAsB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,CAAC;YACD,MAAM,kBAAkB,GAAG,IAAI,CAAC,0CAA0C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,IAAI,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACpD,0DAA0D;YAC1D,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,eAAe,GAAG,EAAE,sBAAsB,EAAE,CAAC;gBAC7C,KAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;YACjD,CAAC;YACD,qDAAqD;YACrD,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,eAAe,CAAC,QAAQ,KAAK,IAAI,GAAG,EAAE,CAAC;gBACvC,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,eAAe,CAAC,qBAAqB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC7F,wEAAwE;YACxE,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,EAAE;oBAC1D,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;oBAC1E,8BAA8B,EAAE,IAAI,CAAC,8BAA8B;iBACpE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,aAAoC,EAAE,IAA2B;QACjF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,qBAAqB;gBACxB,CAAC,aAAa,CAAC,sBAAsB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClE,OAAO;YACT,KAAK,gBAAgB;gBACnB,CAAC,aAAa,CAAC,iBAAiB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7D,OAAO;YACT,KAAK,SAAS;gBACZ,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBAC3C,OAAO;QACX,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,OAAmB,EAAE,UAAsB;QACxE,OAAO,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC;IACpC,CAAC;IAEO,qBAAqB,CAAC,GAAqB;QACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACjC,CAAC;IAEM,2BAA2B,CAAC,EACjC,IAAI,EACJ,EAAE,EACF,cAAc,EACd,MAAM,GAMP;QACC,MAAM,UAAU,GAAG,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;gBACL,EAAE;gBACF,cAAc;gBACd,IAAI;gBACJ,OAAO,EAAE,SAAS;gBAClB,UAAU,EAAE,SAAS;gBACrB,8BAA8B,EAAE,SAAS;gBACzC,UAAU;aACX,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE;YACF,cAAc;YACd,IAAI;YACJ,UAAU;SACX,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,SAAiB;QACpC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,8BAA8B,CAAC,EAAE,CAAC;YAC/F,OAAO,qBAAqB,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAE,yBAAyB,CAAC,EAAE,CAAC;YAC1F,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,YAAY,CAAC,IAA4C;QAC9D,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,qBAAqB;gBACxB,OAAO,8BAA8B,CAAC;YACxC,KAAK,gBAAgB;gBACnB,OAAO,yBAAyB,CAAC;YACnC,KAAK,SAAS;gBACZ,OAAO,6BAA6B,CAAC;QACzC,CAAC;IACH,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { firstValueFrom } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { CLASS_NAME_Classification, CLASS_NAME_ClassificationTable, CLASS_NAME_GeometricElement3d } from \"../../../common/internal/ClassNameDefinitions.js\";\nimport { createSearchResultsTree, SearchResultsNodesHandler } from \"../../../common/internal/visibility/BaseSearchResultsTree.js\";\n\nimport type { Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { CategoryId, ElementId, ModelId } from \"../../../common/internal/Types.js\";\nimport type {\n BaseSearchResultsTreeNode,\n SearchResultsNodeIdentifierAsString,\n SearchResultsTree,\n SearchResultsTreeNodeChildren,\n SearchResultsTreeRootNode,\n} from \"../../../common/internal/visibility/BaseSearchResultsTree.js\";\nimport type { ClassificationsTreeIdsCache } from \"../ClassificationsTreeIdsCache.js\";\n\ninterface ClassificationTableSearchResultsTreeNode extends BaseSearchResultsTreeNode<ClassificationTableSearchResultsTreeNode> {\n type: \"classificationTable\";\n}\n\ninterface ClassificationSearchResultsTreeNode extends BaseSearchResultsTreeNode<ClassificationSearchResultsTreeNode> {\n type: \"classification\";\n}\n\ninterface ElementSearchResultsTreeNode extends BaseSearchResultsTreeNode<ElementSearchResultsTreeNode> {\n type: \"element\";\n categoryId: Id64String;\n modelId: Id64String;\n categoryOfTopMostParentElement: CategoryId;\n}\n\ntype SearchResultsTreeNode = ClassificationTableSearchResultsTreeNode | ClassificationSearchResultsTreeNode | ElementSearchResultsTreeNode;\n\ntype TemporaryElementSearchResultsNode = Omit<ElementSearchResultsTreeNode, \"modelId\" | \"categoryId\" | \"categoryOfTopMostParentElement\" | \"children\"> & {\n modelId: Id64String | undefined;\n categoryId: Id64String | undefined;\n categoryOfTopMostParentElement: CategoryId | undefined;\n children?: SearchResultsTreeNodeChildren<TemporaryElementSearchResultsNode>;\n};\n\ntype TemporarySearchResultsTreeNode = ClassificationTableSearchResultsTreeNode | ClassificationSearchResultsTreeNode | TemporaryElementSearchResultsNode;\n\n/** @internal */\nexport interface ClassificationsTreeSearchTargets {\n elements?: Array<{\n pathToElements: InstanceKey[];\n modelId: Id64String;\n categoryId: Id64String;\n topMostParentElementId?: Id64String;\n elements: Map<ElementId, { isSearchTarget: boolean }>;\n categoryOfTopMostParentElement: CategoryId;\n }>;\n classificationTableIds?: Id64Set;\n classificationIds?: Id64Set;\n}\n\n/** @internal */\nexport async function createClassificationsSearchResultsTree(props: {\n imodelAccess: ECClassHierarchyInspector;\n searchPaths: HierarchySearchPath[];\n idsCache: ClassificationsTreeIdsCache;\n}): Promise<SearchResultsTree<ClassificationsTreeSearchTargets>> {\n const { imodelAccess, searchPaths, idsCache } = props;\n return createSearchResultsTree({\n searchResultsNodesHandler: new ClassificationsTreeSearchResultsNodesHandler({ idsCache, imodelAccess }),\n searchPaths,\n });\n}\n\ntype SearchTargetsInternalElements = Map<\n SearchResultsNodeIdentifierAsString,\n {\n children?: SearchTargetsInternalElements;\n topMostParentElementId?: Id64String;\n modelCategoryElements?: Map<ModelCategoryKey, { elementsMap: Map<ElementId, { isSearchTarget: boolean }>; categoryOfTopMostParentElement: CategoryId }>;\n }\n>;\ninterface SearchTargetsInternal {\n elements?: SearchTargetsInternalElements;\n classificationTableIds?: Id64Set;\n classificationIds?: Id64Set;\n}\n\ninterface ClassificationsTreeSearchResultsNodesHandlerProps {\n idsCache: ClassificationsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector;\n}\n\ntype ModelCategoryKey = `${ModelId}-${CategoryId}`;\n\ninterface ProcessedSearchResultsNodes {\n searchResultsElements: Map<Id64String, Omit<ElementSearchResultsTreeNode, \"children\">>;\n}\n\nclass ClassificationsTreeSearchResultsNodesHandler extends SearchResultsNodesHandler<\n ProcessedSearchResultsNodes,\n ClassificationsTreeSearchTargets,\n TemporarySearchResultsTreeNode\n> {\n readonly #props: ClassificationsTreeSearchResultsNodesHandlerProps;\n constructor(props: ClassificationsTreeSearchResultsNodesHandlerProps) {\n super();\n this.#props = props;\n }\n\n public async getProcessedSearchResultsNodes(): Promise<ProcessedSearchResultsNodes> {\n const searchResultsTemporaryElements = new Map<Id64String, Omit<TemporaryElementSearchResultsNode, \"children\">>();\n const result: ProcessedSearchResultsNodes = {\n searchResultsElements: new Map(),\n };\n for (const node of this.searchResultsNodesArr) {\n if (node.type === \"element\") {\n searchResultsTemporaryElements.set(node.id, node);\n }\n }\n\n const searchResultsElementsModels = await firstValueFrom(\n this.#props.idsCache.getFilteredElementsData({\n elementIds: [...searchResultsTemporaryElements.keys()],\n }),\n );\n for (const [id, element] of searchResultsTemporaryElements) {\n const entry = searchResultsElementsModels.get(element.id);\n assert(entry !== undefined);\n result.searchResultsElements.set(id, {\n ...element,\n modelId: entry.modelId,\n categoryId: entry.categoryId,\n categoryOfTopMostParentElement: entry.categoryOfTopMostParentElement,\n });\n }\n return result;\n }\n\n public convertNodesToSearchTargets(\n searchResultsNodes: TemporarySearchResultsTreeNode[],\n processedSearchResultsNodes: ProcessedSearchResultsNodes,\n ): ClassificationsTreeSearchTargets | undefined {\n const searchTargets: SearchTargetsInternal = {};\n\n searchResultsNodes.forEach((searchResultsNode) => this.collectSearchTargets(searchTargets, searchResultsNode, processedSearchResultsNodes));\n\n return this.convertInternalSearchTargets(searchTargets);\n }\n\n private convertInternalSearchTargetElementsRecursively(\n searchTargetsInternalElements: SearchTargetsInternalElements,\n currentPath: InstanceKey[],\n ): Required<ClassificationsTreeSearchTargets>[\"elements\"] {\n const result: Required<ClassificationsTreeSearchTargets>[\"elements\"] = [];\n // Internal search target elements are stored in a tree structure, need to convert that to array structure.\n for (const [identifierAsString, entry] of searchTargetsInternalElements) {\n const identifier = this.convertSearchResultsNodeIdentifierStringToHierarchyNodeIdentifier(identifierAsString);\n if (entry.modelCategoryElements) {\n for (const [modelCategoryKey, { elementsMap: elements, categoryOfTopMostParentElement }] of entry.modelCategoryElements) {\n const { modelId, categoryId } = this.parseModelCategoryKey(modelCategoryKey);\n result.push({\n pathToElements: [...currentPath, identifier],\n modelId,\n categoryId,\n elements,\n categoryOfTopMostParentElement,\n topMostParentElementId: entry.topMostParentElementId,\n });\n }\n }\n if (!entry.children) {\n continue;\n }\n for (const childValue of this.convertInternalSearchTargetElementsRecursively(entry.children, [...currentPath, identifier])) {\n result.push(childValue);\n }\n }\n return result;\n }\n\n private convertInternalSearchTargets(searchTargets: SearchTargetsInternal): ClassificationsTreeSearchTargets | undefined {\n if (!searchTargets.classificationIds && !searchTargets.classificationIds && !searchTargets.elements) {\n return undefined;\n }\n\n return {\n classificationIds: searchTargets.classificationIds,\n classificationTableIds: searchTargets.classificationIds,\n elements: searchTargets.elements ? this.convertInternalSearchTargetElementsRecursively(searchTargets.elements, []) : undefined,\n };\n }\n\n private collectSearchTargets(\n searchTargets: SearchTargetsInternal,\n node: TemporarySearchResultsTreeNode,\n processedSearchResultsNodes: ProcessedSearchResultsNodes,\n ) {\n const searchResultsNode = node.type === \"element\" ? processedSearchResultsNodes.searchResultsElements.get(node.id) : node;\n assert(searchResultsNode !== undefined);\n if (searchResultsNode.isSearchTarget) {\n this.addTarget(searchTargets, searchResultsNode);\n return;\n }\n\n if (searchResultsNode.type === \"element\") {\n // need to add parent ids as search target will be an element\n this.addTarget(searchTargets, searchResultsNode);\n }\n\n if (!node.children) {\n return;\n }\n\n for (const child of node.children.values()) {\n this.collectSearchTargets(searchTargets, child, processedSearchResultsNodes);\n }\n }\n\n private addTargetElement(searchTargets: SearchTargetsInternal, node: ElementSearchResultsTreeNode) {\n // Internal search target elements need to have path saved in some way.\n // For this, a tree structure is used, where keys are stringified identifiers of parent nodes depending on the hierarchy.\n const modelCategoryKey = this.createModelCategoryKey(node.modelId, node.categoryId);\n if (!searchTargets.elements) {\n searchTargets.elements = new Map();\n }\n const searchTargetElementsMap = searchTargets.elements;\n assert(searchTargetElementsMap !== undefined);\n let entry = searchTargetElementsMap;\n let topMostParentElementId: Id64String | undefined;\n for (let i = 0; i < node.pathToNode.length; ++i) {\n if (topMostParentElementId === undefined && node.type === \"element\") {\n topMostParentElementId = node.pathToNode[i].id;\n }\n const identifierAsString = this.convertSearchResultsNodeIdentifierToString(node.pathToNode[i]);\n let identifierEntry = entry.get(identifierAsString);\n // create a new entry for parent node if it does not exist\n if (!identifierEntry) {\n identifierEntry = { topMostParentElementId };\n entry.set(identifierAsString, identifierEntry);\n }\n // last entry in the path don't need to have children\n if (i < node.pathToNode.length - 1) {\n identifierEntry.children ??= new Map();\n entry = identifierEntry.children;\n continue;\n }\n\n const elements = (identifierEntry.modelCategoryElements ??= new Map()).get(modelCategoryKey);\n // Add elements who share the same path to the modelCategoryElements map\n if (elements) {\n elements.set(node.id, { isSearchTarget: node.isSearchTarget });\n } else {\n identifierEntry.modelCategoryElements.set(modelCategoryKey, {\n elementsMap: new Map([[node.id, { isSearchTarget: node.isSearchTarget }]]),\n categoryOfTopMostParentElement: node.categoryOfTopMostParentElement,\n });\n }\n }\n }\n\n private addTarget(searchTargets: SearchTargetsInternal, node: SearchResultsTreeNode) {\n switch (node.type) {\n case \"classificationTable\":\n (searchTargets.classificationTableIds ??= new Set()).add(node.id);\n return;\n case \"classification\":\n (searchTargets.classificationIds ??= new Set()).add(node.id);\n return;\n case \"element\":\n this.addTargetElement(searchTargets, node);\n return;\n }\n }\n\n private createModelCategoryKey(modelId: Id64String, categoryId: Id64String): ModelCategoryKey {\n return `${modelId}-${categoryId}`;\n }\n\n private parseModelCategoryKey(key: ModelCategoryKey): { modelId: Id64String; categoryId: Id64String } {\n const [modelId, categoryId] = key.split(\"-\");\n return { modelId, categoryId };\n }\n\n public createSearchResultsTreeNode({\n type,\n id,\n isSearchTarget,\n parent,\n }: {\n type: SearchResultsTreeNode[\"type\"];\n id: Id64String;\n isSearchTarget: boolean;\n parent: SearchResultsTreeNode | SearchResultsTreeRootNode<SearchResultsTreeNode>;\n }): TemporarySearchResultsTreeNode {\n const pathToNode = \"pathToNode\" in parent ? [...parent.pathToNode, { type: parent.type, id: parent.id }] : [];\n if (type === \"element\") {\n return {\n id,\n isSearchTarget,\n type,\n modelId: undefined,\n categoryId: undefined,\n categoryOfTopMostParentElement: undefined,\n pathToNode,\n };\n }\n return {\n id,\n isSearchTarget,\n type,\n pathToNode,\n };\n }\n\n public async getType(className: string): Promise<TemporarySearchResultsTreeNode[\"type\"]> {\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_ClassificationTable)) {\n return \"classificationTable\";\n }\n if (await this.#props.imodelAccess.classDerivesFrom(className, CLASS_NAME_Classification)) {\n return \"classification\";\n }\n return \"element\";\n }\n\n public getClassName(type: TemporarySearchResultsTreeNode[\"type\"]): string {\n switch (type) {\n case \"classificationTable\":\n return CLASS_NAME_ClassificationTable;\n case \"classification\":\n return CLASS_NAME_Classification;\n case \"element\":\n return CLASS_NAME_GeometricElement3d;\n }\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { PropsWithChildren } from "react";
2
+ /**
3
+ * A React context provider for setting up shared tree context.
4
+ * @beta
5
+ */
6
+ export declare function SharedTreeContextProvider({ children }: PropsWithChildren<{}>): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=SharedTreeContextProvider.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
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
+ import { SharedTreeContextProviderInternal } from "./internal/SharedTreeContextProviderInternal.js";
7
+ /**
8
+ * A React context provider for setting up shared tree context.
9
+ * @beta
10
+ */
11
+ export function SharedTreeContextProvider({ children }) {
12
+ return _jsx(SharedTreeContextProviderInternal, { children: children });
13
+ }
14
+ //# sourceMappingURL=SharedTreeContextProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedTreeContextProvider.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/SharedTreeContextProvider.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,iCAAiC,EAAE,MAAM,iDAAiD,CAAC;AAIpG;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,EAAE,QAAQ,EAAyB;IAC3E,OAAO,KAAC,iCAAiC,cAAE,QAAQ,GAAqC,CAAC;AAC3F,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { SharedTreeContextProviderInternal } from \"./internal/SharedTreeContextProviderInternal.js\";\n\nimport type { PropsWithChildren } from \"react\";\n\n/**\n * A React context provider for setting up shared tree context.\n * @beta\n */\nexport function SharedTreeContextProvider({ children }: PropsWithChildren<{}>) {\n return <SharedTreeContextProviderInternal>{children}</SharedTreeContextProviderInternal>;\n}\n"]}
@@ -24,7 +24,7 @@ export function createTreeWidgetViewport(viewport) {
24
24
  viewport.changeModelDisplay(props.modelIds, false);
25
25
  },
26
26
  viewsCategory: (categoryId) => viewport.view.viewsCategory(categoryId),
27
- changeCategoryDisplay: (props) => viewport.changeCategoryDisplay(props.categoryIds, props.display, props.enableAllSubCategories),
27
+ changeCategoryDisplay: (props) => viewport.changeCategoryDisplay(props.categoryIds, props.display, props.enableAllSubCategories, true),
28
28
  viewsSubCategory: (subCategoryId) => viewport.isSubCategoryVisible(subCategoryId),
29
29
  changeSubCategoryDisplay: (props) => viewport.changeSubCategoryDisplay(props.subCategoryId, props.display),
30
30
  get perModelCategoryOverrides() {
@@ -1 +1 @@
1
- {"version":3,"file":"TreeWidgetViewport.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/TreeWidgetViewport.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\n\nimport type { BeEvent, Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\n\n/** @public */\nexport type PerModelCategoryOverride = \"show\" | \"hide\" | \"none\";\n\n/**\n * Creates a `TreeWidgetViewport`.\n * @beta\n */\nexport function createTreeWidgetViewport(viewport: Viewport): TreeWidgetViewport {\n return {\n get viewType() {\n return viewport.view.is2d() ? \"2d\" : viewport.view.isSpatialView() ? \"3d\" : \"other\";\n },\n get iModel() {\n return viewport.iModel;\n },\n viewsModel: (modelId) => viewport.view.viewsModel(modelId),\n changeModelDisplay: (props) => {\n if (props.display) {\n void viewport.addViewedModels(props.modelIds);\n return;\n }\n viewport.changeModelDisplay(props.modelIds, false);\n },\n viewsCategory: (categoryId) => viewport.view.viewsCategory(categoryId),\n changeCategoryDisplay: (props) => viewport.changeCategoryDisplay(props.categoryIds, props.display, props.enableAllSubCategories),\n viewsSubCategory: (subCategoryId) => viewport.isSubCategoryVisible(subCategoryId),\n changeSubCategoryDisplay: (props) => viewport.changeSubCategoryDisplay(props.subCategoryId, props.display),\n get perModelCategoryOverrides() {\n return viewport.perModelCategoryVisibility;\n },\n setPerModelCategoryOverride: (props) => {\n const override =\n props.override === \"show\"\n ? PerModelCategoryVisibility.Override.Show\n : props.override === \"hide\"\n ? PerModelCategoryVisibility.Override.Hide\n : PerModelCategoryVisibility.Override.None;\n viewport.perModelCategoryVisibility.setOverride(props.modelIds, props.categoryIds, override);\n },\n getPerModelCategoryOverride: (props) => {\n const override = viewport.perModelCategoryVisibility.getOverride(props.modelId, props.categoryId);\n return override === PerModelCategoryVisibility.Override.Show ? \"show\" : override === PerModelCategoryVisibility.Override.Hide ? \"hide\" : \"none\";\n },\n clearPerModelCategoryOverrides: (props) => viewport.perModelCategoryVisibility.clearOverrides(props?.modelIds),\n get neverDrawn() {\n return viewport.neverDrawn;\n },\n setNeverDrawn: (props) => viewport.setNeverDrawn(props.elementIds),\n clearNeverDrawn: () => viewport.clearNeverDrawn(),\n get alwaysDrawn() {\n return viewport.alwaysDrawn;\n },\n setAlwaysDrawn: (props) => viewport.setAlwaysDrawn(props.elementIds, props.exclusive),\n clearAlwaysDrawn: () => viewport.clearAlwaysDrawn(),\n get isAlwaysDrawnExclusive() {\n return viewport.isAlwaysDrawnExclusive;\n },\n get onAlwaysDrawnChanged() {\n return viewport.onAlwaysDrawnChanged;\n },\n get onNeverDrawnChanged() {\n return viewport.onNeverDrawnChanged;\n },\n get onDisplayStyleChanged() {\n return viewport.onDisplayStyleChanged;\n },\n get onDisplayedModelsChanged() {\n return viewport.onViewedModelsChanged;\n },\n get onDisplayedCategoriesChanged() {\n return viewport.onViewedCategoriesChanged;\n },\n get onPerModelCategoriesOverridesChanged() {\n return viewport.onViewedCategoriesPerModelChanged;\n },\n };\n}\n\n/**\n * A simplified interface for a Viewport that is used by the Tree Widget to control and determine visibility.\n *\n * Viewport should only display elements. Since elements have model, category and sub-category assigned to them, each of these can affect element visibility.\n *\n * The order of precedence for visibility is:\n * 1. Model visibility - if model is not visible, elements from that model should never be displayed.\n * 2. `neverDrawn` set - elements in that set should never be displayed.\n * 3. `alwaysDrawn` set - elements in that set should always be displayed.\n * 4. Per-model category visibility overrides:\n * - if a per-model-category has `Hide` override, elements which have that category and model should not be displayed.\n * - if a per-model-category has `Show` override, elements which have that category and model should be displayed.\n * 5. Category and sub-category visibility - if element's category or sub-category is turned off, it should not be displayed.\n *\n * Based on this order of precedence, element can only be displayed in these scenarios:\n * - Model is visible *AND* element is in `alwaysDrawn` set.\n * - Model is visible *AND* element is not in `neverDrawn` set *AND* per-model category override is set to show `Show`.\n * - Model is visible *AND* element is not in `neverDrawn` set *AND* per-model category override is not set to `Hide` *AND* category and sub-category are visible.\n * @public\n */\nexport interface TreeWidgetViewport {\n /**\n * The type of the view. Generally it should be either `3d` or `2d`.\n *\n * The `other` value is reserved for edge cases when viewport doesn't show any elements, e.g. a blank viewport.\n */\n viewType: \"2d\" | \"3d\" | \"other\";\n /** The iModel of this Viewport. */\n iModel: IModelConnection;\n /**\n * Should return true if model specified by `modelId` is visible in the viewport.\n *\n * Model display should not take into account its' child elements display.\n *\n * When model is not displayed, all elements that have that model should not be shown in the viewport.\n */\n viewsModel: (modelId: Id64String) => boolean;\n /**\n * Should add or remove a set of models from those models currently displayed in this viewport.\n *\n * **NOTE** When turning model display to:\n * - `true`, model display should be turned on. This does not mean that any elements should be turned on, it only means that\n * model visibility should not interfere with elements visibility.\n * - `false`, model display should be turned off. All elements which have that model should not be displayed in the viewport.\n */\n changeModelDisplay: (props: { modelIds: Id64Arg; display: boolean }) => void;\n /**\n * Should return true if category specified by `categoryId` is visible in the viewport.\n *\n * Category display should not take into account its' child elements or sub-categories display.\n *\n * When category is not displayed, all elements and sub-categories which have that category should not be shown in the viewport.\n *\n * **NOTE** Elements might still be visible if per-model category `Show` override or `alwaysDrawn` set makes them visible.\n */\n viewsCategory: (categoryId: Id64String) => boolean;\n /**\n * Should enable or disable display of elements belonging to a set of categories specified by Id.\n *\n * Visibility of individual sub-categories belonging to a category can be controlled separately through the use of `changeSubCategoryDisplay`.\n *\n * By default, enabling display of a category does not affect display of sub-categories thereof which have been set to be invisible.\n *\n * Changing category visibility should not change per-model category overrides.\n *\n * **NOTE** When turning category display to:\n * - `true`, category display should be turned on. All elements which have specified category should be turned on if model is visible,\n * category does not have per-model `hide` override and element is not in the `neverDrawn` set.\n * - `false`, category and its' sub-categories display should be turned off. All elements which have that category should not be displayed in the viewport,\n * unless element has per-model category `Show` override, or is in the `alwaysDrawn` set.\n */\n changeCategoryDisplay: (props: { categoryIds: Id64Arg; display: boolean; enableAllSubCategories?: boolean }) => void;\n /**\n * Should return true if sub-category specified by `subCategoryId` is visible in the viewport.\n *\n * Sub-category display should not take into account its' child elements.\n *\n * When sub-category is not displayed, all elements that have that sub-category should not be shown in the viewport, unless they have per-model category `Show` override or are in the `alwaysDrawn` list.\n */\n viewsSubCategory: (subCategoryId: Id64String) => boolean;\n /**\n * Should enable or disable display of elements belonging to sub-category specified by Id.\n *\n * Changing sub-category display should not change category display.\n *\n * **NOTE** When turning sub-category display to:\n * - `true`, sub-category display should be turned on. All elements which have specified sub-category should be turned on if model and category are visible,\n * category does not have per-model `hide` override and element is not in the `neverDrawn` set.\n * - `false`, sub-category display should be turned off. All elements that have that sub-category should not be displayed in the viewport,\n * unless element has per-model category `Show` override, or is in the `alwaysDrawn` set.\n */\n changeSubCategoryDisplay: (props: { subCategoryId: Id64String; display: boolean }) => void;\n /** Returns an iterable of per-model-category overrides. */\n perModelCategoryOverrides: Readonly<Iterable<{ modelId: Id64String; categoryId: Id64String; visible: boolean }>>;\n /** Should change the override state of one or more categories for one or more models. */\n setPerModelCategoryOverride: (props: { modelIds: Id64Arg; categoryIds: Id64Arg; override: PerModelCategoryOverride }) => void;\n /** Should return the per-model category override. */\n getPerModelCategoryOverride: (props: { modelId: Id64String; categoryId: Id64String }) => PerModelCategoryOverride;\n /** Should remove per-model category override for the specified models. */\n clearPerModelCategoryOverrides: (props?: { modelIds?: Id64Arg }) => void;\n /**\n * Ids of elements which should not be displayed.\n *\n * This set takes precedence over category and sub-category display, per-model category overrides, and the `alwaysDrawn` set.\n */\n neverDrawn: ReadonlySet<Id64String> | undefined;\n /** Ids of elements which should not be displayed in the viewport, regardless of category and sub-category visibility. */\n setNeverDrawn: (props: { elementIds: Set<Id64String> }) => void;\n /** Should clear the set of never-drawn elements. */\n clearNeverDrawn: () => void;\n /**\n * Ids of elements which should be displayed.\n *\n * Elements in this set should be displayed only when model is displayed as well.\n *\n * This set takes precedence over category and sub-category display and per-model category override.\n */\n alwaysDrawn: ReadonlySet<Id64String> | undefined;\n /**\n * Ids of elements which should be displayed in the viewport, regardless of category and sub-category visibility.\n *\n * These elements should be displayed only when their models are displayed as well.\n *\n * When the `exclusive` prop is set to `true`, only the specified elements should be drawn.\n */\n setAlwaysDrawn: (props: { elementIds: Set<Id64String>; exclusive?: boolean }) => void;\n /** Should clear the set of always-drawn elements. */\n clearAlwaysDrawn: () => void;\n /**\n * Should return true if elements in the [[alwaysDrawn]] set are the *only* elements that are displayed when their models are visible.\n *\n * Should be set to true when `setAlwaysDrawn` is called with `exclusive` flag. Should be set to false\n * when `setAlwaysDrawn` is called with `exclusive` set to `false` or `undefined`, or when `clearAlwaysDrawn` is called.\n */\n readonly isAlwaysDrawnExclusive: boolean;\n /** Event that should be raised when set of always-drawn elements changes. */\n onAlwaysDrawnChanged: BeEvent<() => void>;\n /** Event that should be raised when set of never-drawn elements changes. */\n onNeverDrawnChanged: BeEvent<() => void>;\n /** Event that should be raised when per-model category overrides changes. */\n onPerModelCategoriesOverridesChanged: BeEvent<() => void>;\n /** Event that should be raised when category display changes. */\n onDisplayedCategoriesChanged: BeEvent<() => void>;\n /** Event that should be raised when model display changes. */\n onDisplayedModelsChanged: BeEvent<() => void>;\n /** Event that should be raised when view changes between `2d`, `3d` or `other`. */\n onDisplayStyleChanged: BeEvent<() => void>;\n}\n"]}
1
+ {"version":3,"file":"TreeWidgetViewport.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/TreeWidgetViewport.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAQlE;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAkB;IACzD,OAAO;QACL,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACtF,CAAC;QACD,IAAI,MAAM;YACR,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAC1D,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,KAAK,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,aAAa,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;QACtE,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC;QACtI,gBAAgB,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACjF,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC;QAC1G,IAAI,yBAAyB;YAC3B,OAAO,QAAQ,CAAC,0BAA0B,CAAC;QAC7C,CAAC;QACD,2BAA2B,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,MAAM,QAAQ,GACZ,KAAK,CAAC,QAAQ,KAAK,MAAM;gBACvB,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,IAAI;gBAC1C,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM;oBACzB,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,IAAI;oBAC1C,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjD,QAAQ,CAAC,0BAA0B,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/F,CAAC;QACD,2BAA2B,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,0BAA0B,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAClG,OAAO,QAAQ,KAAK,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAClJ,CAAC;QACD,8BAA8B,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC9G,IAAI,UAAU;YACZ,OAAO,QAAQ,CAAC,UAAU,CAAC;QAC7B,CAAC;QACD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QAClE,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE;QACjD,IAAI,WAAW;YACb,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC9B,CAAC;QACD,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;QACrF,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE;QACnD,IAAI,sBAAsB;YACxB,OAAO,QAAQ,CAAC,sBAAsB,CAAC;QACzC,CAAC;QACD,IAAI,oBAAoB;YACtB,OAAO,QAAQ,CAAC,oBAAoB,CAAC;QACvC,CAAC;QACD,IAAI,mBAAmB;YACrB,OAAO,QAAQ,CAAC,mBAAmB,CAAC;QACtC,CAAC;QACD,IAAI,qBAAqB;YACvB,OAAO,QAAQ,CAAC,qBAAqB,CAAC;QACxC,CAAC;QACD,IAAI,wBAAwB;YAC1B,OAAO,QAAQ,CAAC,qBAAqB,CAAC;QACxC,CAAC;QACD,IAAI,4BAA4B;YAC9B,OAAO,QAAQ,CAAC,yBAAyB,CAAC;QAC5C,CAAC;QACD,IAAI,oCAAoC;YACtC,OAAO,QAAQ,CAAC,iCAAiC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\n\nimport type { BeEvent, Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\n\n/** @public */\nexport type PerModelCategoryOverride = \"show\" | \"hide\" | \"none\";\n\n/**\n * Creates a `TreeWidgetViewport`.\n * @beta\n */\nexport function createTreeWidgetViewport(viewport: Viewport): TreeWidgetViewport {\n return {\n get viewType() {\n return viewport.view.is2d() ? \"2d\" : viewport.view.isSpatialView() ? \"3d\" : \"other\";\n },\n get iModel() {\n return viewport.iModel;\n },\n viewsModel: (modelId) => viewport.view.viewsModel(modelId),\n changeModelDisplay: (props) => {\n if (props.display) {\n void viewport.addViewedModels(props.modelIds);\n return;\n }\n viewport.changeModelDisplay(props.modelIds, false);\n },\n viewsCategory: (categoryId) => viewport.view.viewsCategory(categoryId),\n changeCategoryDisplay: (props) => viewport.changeCategoryDisplay(props.categoryIds, props.display, props.enableAllSubCategories, true),\n viewsSubCategory: (subCategoryId) => viewport.isSubCategoryVisible(subCategoryId),\n changeSubCategoryDisplay: (props) => viewport.changeSubCategoryDisplay(props.subCategoryId, props.display),\n get perModelCategoryOverrides() {\n return viewport.perModelCategoryVisibility;\n },\n setPerModelCategoryOverride: (props) => {\n const override =\n props.override === \"show\"\n ? PerModelCategoryVisibility.Override.Show\n : props.override === \"hide\"\n ? PerModelCategoryVisibility.Override.Hide\n : PerModelCategoryVisibility.Override.None;\n viewport.perModelCategoryVisibility.setOverride(props.modelIds, props.categoryIds, override);\n },\n getPerModelCategoryOverride: (props) => {\n const override = viewport.perModelCategoryVisibility.getOverride(props.modelId, props.categoryId);\n return override === PerModelCategoryVisibility.Override.Show ? \"show\" : override === PerModelCategoryVisibility.Override.Hide ? \"hide\" : \"none\";\n },\n clearPerModelCategoryOverrides: (props) => viewport.perModelCategoryVisibility.clearOverrides(props?.modelIds),\n get neverDrawn() {\n return viewport.neverDrawn;\n },\n setNeverDrawn: (props) => viewport.setNeverDrawn(props.elementIds),\n clearNeverDrawn: () => viewport.clearNeverDrawn(),\n get alwaysDrawn() {\n return viewport.alwaysDrawn;\n },\n setAlwaysDrawn: (props) => viewport.setAlwaysDrawn(props.elementIds, props.exclusive),\n clearAlwaysDrawn: () => viewport.clearAlwaysDrawn(),\n get isAlwaysDrawnExclusive() {\n return viewport.isAlwaysDrawnExclusive;\n },\n get onAlwaysDrawnChanged() {\n return viewport.onAlwaysDrawnChanged;\n },\n get onNeverDrawnChanged() {\n return viewport.onNeverDrawnChanged;\n },\n get onDisplayStyleChanged() {\n return viewport.onDisplayStyleChanged;\n },\n get onDisplayedModelsChanged() {\n return viewport.onViewedModelsChanged;\n },\n get onDisplayedCategoriesChanged() {\n return viewport.onViewedCategoriesChanged;\n },\n get onPerModelCategoriesOverridesChanged() {\n return viewport.onViewedCategoriesPerModelChanged;\n },\n };\n}\n\n/**\n * A simplified interface for a Viewport that is used by the Tree Widget to control and determine visibility.\n *\n * Viewport should only display elements. Since elements have model, category and sub-category assigned to them, each of these can affect element visibility.\n *\n * The order of precedence for visibility is:\n * 1. Model visibility - if model is not visible, elements from that model should never be displayed.\n * 2. `neverDrawn` set - elements in that set should never be displayed.\n * 3. `alwaysDrawn` set - elements in that set should always be displayed.\n * 4. Per-model category visibility overrides:\n * - if a per-model-category has `Hide` override, elements which have that category and model should not be displayed.\n * - if a per-model-category has `Show` override, elements which have that category and model should be displayed.\n * 5. Category and sub-category visibility - if element's category or sub-category is turned off, it should not be displayed.\n *\n * Based on this order of precedence, element can only be displayed in these scenarios:\n * - Model is visible *AND* element is in `alwaysDrawn` set.\n * - Model is visible *AND* element is not in `neverDrawn` set *AND* per-model category override is set to show `Show`.\n * - Model is visible *AND* element is not in `neverDrawn` set *AND* per-model category override is not set to `Hide` *AND* category and sub-category are visible.\n * @public\n */\nexport interface TreeWidgetViewport {\n /**\n * The type of the view. Generally it should be either `3d` or `2d`.\n *\n * The `other` value is reserved for edge cases when viewport doesn't show any elements, e.g. a blank viewport.\n */\n viewType: \"2d\" | \"3d\" | \"other\";\n /** The iModel of this Viewport. */\n iModel: IModelConnection;\n /**\n * Should return true if model specified by `modelId` is visible in the viewport.\n *\n * Model display should not take into account its' child elements display.\n *\n * When model is not displayed, all elements that have that model should not be shown in the viewport.\n */\n viewsModel: (modelId: Id64String) => boolean;\n /**\n * Should add or remove a set of models from those models currently displayed in this viewport.\n *\n * **NOTE** When turning model display to:\n * - `true`, model display should be turned on. This does not mean that any elements should be turned on, it only means that\n * model visibility should not interfere with elements visibility.\n * - `false`, model display should be turned off. All elements which have that model should not be displayed in the viewport.\n */\n changeModelDisplay: (props: { modelIds: Id64Arg; display: boolean }) => void;\n /**\n * Should return true if category specified by `categoryId` is visible in the viewport.\n *\n * Category display should not take into account its' child elements or sub-categories display.\n *\n * When category is not displayed, all elements and sub-categories which have that category should not be shown in the viewport.\n *\n * **NOTE** Elements might still be visible if per-model category `Show` override or `alwaysDrawn` set makes them visible.\n */\n viewsCategory: (categoryId: Id64String) => boolean;\n /**\n * Should enable or disable display of elements belonging to a set of categories specified by Id.\n *\n * Visibility of individual sub-categories belonging to a category can be controlled separately through the use of `changeSubCategoryDisplay`.\n *\n * By default, enabling display of a category does not affect display of sub-categories thereof which have been set to be invisible.\n *\n * Changing category visibility should not change per-model category overrides.\n *\n * **NOTE** When turning category display to:\n * - `true`, category display should be turned on. All elements which have specified category should be turned on if model is visible,\n * category does not have per-model `hide` override and element is not in the `neverDrawn` set.\n * - `false`, category and its' sub-categories display should be turned off. All elements which have that category should not be displayed in the viewport,\n * unless element has per-model category `Show` override, or is in the `alwaysDrawn` set.\n */\n changeCategoryDisplay: (props: { categoryIds: Id64Arg; display: boolean; enableAllSubCategories?: boolean }) => void;\n /**\n * Should return true if sub-category specified by `subCategoryId` is visible in the viewport.\n *\n * Sub-category display should not take into account its' child elements.\n *\n * When sub-category is not displayed, all elements that have that sub-category should not be shown in the viewport, unless they have per-model category `Show` override or are in the `alwaysDrawn` list.\n */\n viewsSubCategory: (subCategoryId: Id64String) => boolean;\n /**\n * Should enable or disable display of elements belonging to sub-category specified by Id.\n *\n * Changing sub-category display should not change category display.\n *\n * **NOTE** When turning sub-category display to:\n * - `true`, sub-category display should be turned on. All elements which have specified sub-category should be turned on if model and category are visible,\n * category does not have per-model `hide` override and element is not in the `neverDrawn` set.\n * - `false`, sub-category display should be turned off. All elements that have that sub-category should not be displayed in the viewport,\n * unless element has per-model category `Show` override, or is in the `alwaysDrawn` set.\n */\n changeSubCategoryDisplay: (props: { subCategoryId: Id64String; display: boolean }) => void;\n /** Returns an iterable of per-model-category overrides. */\n perModelCategoryOverrides: Readonly<Iterable<{ modelId: Id64String; categoryId: Id64String; visible: boolean }>>;\n /** Should change the override state of one or more categories for one or more models. */\n setPerModelCategoryOverride: (props: { modelIds: Id64Arg; categoryIds: Id64Arg; override: PerModelCategoryOverride }) => void;\n /** Should return the per-model category override. */\n getPerModelCategoryOverride: (props: { modelId: Id64String; categoryId: Id64String }) => PerModelCategoryOverride;\n /** Should remove per-model category override for the specified models. */\n clearPerModelCategoryOverrides: (props?: { modelIds?: Id64Arg }) => void;\n /**\n * Ids of elements which should not be displayed.\n *\n * This set takes precedence over category and sub-category display, per-model category overrides, and the `alwaysDrawn` set.\n */\n neverDrawn: ReadonlySet<Id64String> | undefined;\n /** Ids of elements which should not be displayed in the viewport, regardless of category and sub-category visibility. */\n setNeverDrawn: (props: { elementIds: Set<Id64String> }) => void;\n /** Should clear the set of never-drawn elements. */\n clearNeverDrawn: () => void;\n /**\n * Ids of elements which should be displayed.\n *\n * Elements in this set should be displayed only when model is displayed as well.\n *\n * This set takes precedence over category and sub-category display and per-model category override.\n */\n alwaysDrawn: ReadonlySet<Id64String> | undefined;\n /**\n * Ids of elements which should be displayed in the viewport, regardless of category and sub-category visibility.\n *\n * These elements should be displayed only when their models are displayed as well.\n *\n * When the `exclusive` prop is set to `true`, only the specified elements should be drawn.\n */\n setAlwaysDrawn: (props: { elementIds: Set<Id64String>; exclusive?: boolean }) => void;\n /** Should clear the set of always-drawn elements. */\n clearAlwaysDrawn: () => void;\n /**\n * Should return true if elements in the [[alwaysDrawn]] set are the *only* elements that are displayed when their models are visible.\n *\n * Should be set to true when `setAlwaysDrawn` is called with `exclusive` flag. Should be set to false\n * when `setAlwaysDrawn` is called with `exclusive` set to `false` or `undefined`, or when `clearAlwaysDrawn` is called.\n */\n readonly isAlwaysDrawnExclusive: boolean;\n /** Event that should be raised when set of always-drawn elements changes. */\n onAlwaysDrawnChanged: BeEvent<() => void>;\n /** Event that should be raised when set of never-drawn elements changes. */\n onNeverDrawnChanged: BeEvent<() => void>;\n /** Event that should be raised when per-model category overrides changes. */\n onPerModelCategoriesOverridesChanged: BeEvent<() => void>;\n /** Event that should be raised when category display changes. */\n onDisplayedCategoriesChanged: BeEvent<() => void>;\n /** Event that should be raised when model display changes. */\n onDisplayedModelsChanged: BeEvent<() => void>;\n /** Event that should be raised when view changes between `2d`, `3d` or `other`. */\n onDisplayStyleChanged: BeEvent<() => void>;\n}\n"]}
@@ -26,9 +26,9 @@ export function useHierarchyVisibility({ visibilityHandlerFactory }) {
26
26
  calculate.next(node);
27
27
  };
28
28
  const resetCache = () => {
29
- visibilityStatusMap.current.forEach((value) => {
29
+ for (const value of visibilityStatusMap.current.values()) {
30
30
  value.needsRefresh = true;
31
- });
31
+ }
32
32
  visibilityChanged.next();
33
33
  };
34
34
  const triggerCheckboxUpdate = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"UseHierarchyVisibility.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/UseHierarchyVisibility.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { asyncScheduler, catchError, defer, distinct, EMPTY, from, lastValueFrom, mergeMap, observeOn, Subject, takeUntil, tap, throttleTime } from \"rxjs\";\nimport { createTooltip } from \"./internal/Tooltip.js\";\nimport { useErrorState } from \"./internal/UseErrorState.js\";\nimport { useTelemetryContext } from \"./UseTelemetryContext.js\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport type { HierarchyNode, PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { TreeItemVisibilityButtonState, VisibilityContext } from \"./components/TreeNodeVisibilityButton.js\";\n\n/**\n * Data structure that describes instance visibility status.\n * @beta\n */\nexport interface VisibilityStatus {\n /** Instance visibility state. */\n state: \"visible\" | \"partial\" | \"hidden\";\n /** Specifies whether visibility changing is disabled or not. */\n isDisabled?: boolean;\n}\n\n/**\n * Handler that can be used to determine and change visibility of instances represented by tree nodes.\n * @beta\n */\nexport interface HierarchyVisibilityHandler extends Disposable {\n /** Event used to notify tree about visibility changes from outside. */\n readonly onVisibilityChange: BeEvent<() => void>;\n /** Returns current visibility status for tree node. */\n getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> | VisibilityStatus;\n /** Changes visibility of the instance represented by tree node. */\n changeVisibility(node: HierarchyNode, on: boolean): Promise<void>;\n}\n\ninterface UseHierarchyVisibilityProps {\n visibilityHandlerFactory: () => HierarchyVisibilityHandler;\n}\n\n/** @internal */\nexport function useHierarchyVisibility({ visibilityHandlerFactory }: UseHierarchyVisibilityProps): VisibilityContext & { triggerRefresh: () => void } {\n const visibilityStatusMap = useRef(new Map<string, { node: PresentationHierarchyNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>());\n const [state, setState] = useState<VisibilityContext & { triggerRefresh: () => void }>({\n getVisibilityButtonState: () => ({ isLoading: true }),\n onVisibilityButtonClick: () => {},\n triggerRefresh: () => {},\n });\n const { onFeatureUsed } = useTelemetryContext();\n const setErrorState = useErrorState();\n\n useEffect(() => {\n visibilityStatusMap.current.clear();\n const handler = visibilityHandlerFactory();\n\n const visibilityChanged = new Subject<void>();\n const calculate = new Subject<PresentationHierarchyNode>();\n const calculateNodeStatus = (node: PresentationHierarchyNode) => {\n calculate.next(node);\n };\n\n const resetCache = () => {\n visibilityStatusMap.current.forEach((value) => {\n value.needsRefresh = true;\n });\n visibilityChanged.next();\n };\n\n const triggerCheckboxUpdate = () => {\n setState((prev) => ({\n ...prev,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n }));\n };\n\n const subscription = calculate\n .pipe(\n distinct(undefined, visibilityChanged),\n observeOn(asyncScheduler),\n mergeMap((node) =>\n defer(async () => handler.getVisibilityStatus(node.nodeData)).pipe(\n tap({\n next: (status) => {\n visibilityStatusMap.current.set(node.id, {\n node,\n status: {\n ...status,\n tooltip: createTooltip(status.state),\n },\n needsRefresh: false,\n });\n },\n }),\n takeUntil(visibilityChanged),\n catchError((error) => {\n setErrorState(error);\n return EMPTY;\n }),\n ),\n ),\n throttleTime(100, undefined, { leading: false, trailing: true }),\n )\n .subscribe({\n next: () => {\n triggerCheckboxUpdate();\n },\n });\n\n const changeVisibility: VisibilityContext[\"onVisibilityButtonClick\"] = (node, visibilityState) => {\n onFeatureUsed({ featureId: \"visibility-change\", reportInteraction: true });\n // visible should become hidden, partial and hidden should become visible TODO: redo for clarity\n const on = visibilityState === \"visible\" ? false : true;\n void (async () => {\n try {\n await handler.changeVisibility(node.nodeData, on);\n } catch {}\n })();\n const entry = visibilityStatusMap.current.get(node.id);\n if (!entry) {\n return;\n }\n entry.status = {\n ...entry.status,\n state: visibilityState,\n tooltip: createTooltip(\"determining\"),\n };\n triggerCheckboxUpdate();\n };\n\n setState({\n onVisibilityButtonClick: changeVisibility,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n triggerRefresh: () => {\n resetCache();\n triggerCheckboxUpdate();\n },\n });\n\n const removeListener = handler.onVisibilityChange.addListener(() => {\n resetCache();\n triggerCheckboxUpdate();\n });\n\n return () => {\n subscription.unsubscribe();\n removeListener();\n handler[Symbol.dispose]();\n };\n }, [visibilityHandlerFactory, onFeatureUsed, setErrorState]);\n\n return state;\n}\n\nfunction createStateGetter(\n map: MutableRefObject<Map<string, { node: PresentationHierarchyNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>>,\n calculateVisibility: (node: PresentationHierarchyNode) => void,\n): VisibilityContext[\"getVisibilityButtonState\"] {\n return (node) => {\n const entry = map.current.get(node.id);\n if (entry === undefined) {\n calculateVisibility(node);\n return { isLoading: true };\n }\n\n if (entry.needsRefresh) {\n calculateVisibility(node);\n }\n\n return entry.status;\n };\n}\n\n/**\n * Properties for an overridden method of a `HierarchyVisibilityHandler` implementation.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethodProps<TFunc> = TFunc extends (props: infer TProps) => infer TResult\n ? TProps & {\n /** A callback that produces the value from the original implementation. */\n readonly originalImplementation: () => TResult;\n /**\n * Reference to the hierarchy based handler.\n * @note Calling `getVisibility` or `changeVisibility` of this object invokes the overridden implementation as well.\n */\n readonly handler: HierarchyVisibilityHandler;\n }\n : never;\n\n/**\n * Function type for an overridden method of `HierarchyVisibilityHandler`.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethod<TFunc> = TFunc extends (...args: any[]) => infer TResult\n ? (props: HierarchyVisibilityHandlerOverridableMethodProps<TFunc>) => TResult\n : never;\n\n/** @internal */\nexport class HierarchyVisibilityOverrideHandler {\n #baseHandler: HierarchyVisibilityHandler;\n constructor(baseHandler: HierarchyVisibilityHandler) {\n this.#baseHandler = baseHandler;\n }\n public createVisibilityHandlerResult<TResult, TOverrideProps>(props: {\n nonOverriddenResult: Observable<TResult>;\n override: HierarchyVisibilityHandlerOverridableMethod<(props: TOverrideProps) => Promise<TResult>> | undefined;\n overrideProps: TOverrideProps;\n }): Observable<TResult> {\n const { nonOverriddenResult, override, overrideProps } = props;\n return override\n ? from(\n override({\n ...overrideProps,\n originalImplementation: async () => lastValueFrom(nonOverriddenResult, { defaultValue: undefined as TResult }),\n handler: this.#baseHandler,\n }),\n )\n : nonOverriddenResult;\n }\n}\n"]}
1
+ {"version":3,"file":"UseHierarchyVisibility.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/UseHierarchyVisibility.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { asyncScheduler, catchError, defer, distinct, EMPTY, from, lastValueFrom, mergeMap, observeOn, Subject, takeUntil, tap, throttleTime } from \"rxjs\";\nimport { createTooltip } from \"./internal/Tooltip.js\";\nimport { useErrorState } from \"./internal/UseErrorState.js\";\nimport { useTelemetryContext } from \"./UseTelemetryContext.js\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport type { HierarchyNode, TreeNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { TreeItemVisibilityButtonState, VisibilityContext } from \"./components/TreeNodeVisibilityButton.js\";\n\n/**\n * Data structure that describes instance visibility status.\n * @beta\n */\nexport interface VisibilityStatus {\n /** Instance visibility state. */\n state: \"visible\" | \"partial\" | \"hidden\";\n /** Specifies whether visibility changing is disabled or not. */\n isDisabled?: boolean;\n}\n\n/**\n * Handler that can be used to determine and change visibility of instances represented by tree nodes.\n * @beta\n */\nexport interface HierarchyVisibilityHandler extends Disposable {\n /** Event used to notify tree about visibility changes from outside. */\n readonly onVisibilityChange: BeEvent<() => void>;\n /** Returns current visibility status for tree node. */\n getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> | VisibilityStatus;\n /** Changes visibility of the instance represented by tree node. */\n changeVisibility(node: HierarchyNode, on: boolean): Promise<void>;\n}\n\ninterface UseHierarchyVisibilityProps {\n visibilityHandlerFactory: () => HierarchyVisibilityHandler;\n}\n\n/** @internal */\nexport function useHierarchyVisibility({ visibilityHandlerFactory }: UseHierarchyVisibilityProps): VisibilityContext & { triggerRefresh: () => void } {\n const visibilityStatusMap = useRef(new Map<string, { node: TreeNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>());\n const [state, setState] = useState<VisibilityContext & { triggerRefresh: () => void }>({\n getVisibilityButtonState: () => ({ isLoading: true }),\n onVisibilityButtonClick: () => {},\n triggerRefresh: () => {},\n });\n const { onFeatureUsed } = useTelemetryContext();\n const setErrorState = useErrorState();\n\n useEffect(() => {\n visibilityStatusMap.current.clear();\n const handler = visibilityHandlerFactory();\n\n const visibilityChanged = new Subject<void>();\n const calculate = new Subject<TreeNode>();\n const calculateNodeStatus = (node: TreeNode) => {\n calculate.next(node);\n };\n\n const resetCache = () => {\n for (const value of visibilityStatusMap.current.values()) {\n value.needsRefresh = true;\n }\n visibilityChanged.next();\n };\n\n const triggerCheckboxUpdate = () => {\n setState((prev) => ({\n ...prev,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n }));\n };\n\n const subscription = calculate\n .pipe(\n distinct(undefined, visibilityChanged),\n observeOn(asyncScheduler),\n mergeMap((node) =>\n defer(async () => handler.getVisibilityStatus(node.nodeData)).pipe(\n tap({\n next: (status) => {\n visibilityStatusMap.current.set(node.id, {\n node,\n status: {\n ...status,\n tooltip: createTooltip(status.state),\n },\n needsRefresh: false,\n });\n },\n }),\n takeUntil(visibilityChanged),\n catchError((error) => {\n setErrorState(error);\n return EMPTY;\n }),\n ),\n ),\n throttleTime(100, undefined, { leading: false, trailing: true }),\n )\n .subscribe({\n next: () => {\n triggerCheckboxUpdate();\n },\n });\n\n const changeVisibility: VisibilityContext[\"onVisibilityButtonClick\"] = (node, visibilityState) => {\n onFeatureUsed({ featureId: \"visibility-change\", reportInteraction: true });\n // visible should become hidden, partial and hidden should become visible TODO: redo for clarity\n const on = visibilityState === \"visible\" ? false : true;\n void (async () => {\n try {\n await handler.changeVisibility(node.nodeData, on);\n } catch {}\n })();\n const entry = visibilityStatusMap.current.get(node.id);\n if (!entry) {\n return;\n }\n entry.status = {\n ...entry.status,\n state: visibilityState,\n tooltip: createTooltip(\"determining\"),\n };\n triggerCheckboxUpdate();\n };\n\n setState({\n onVisibilityButtonClick: changeVisibility,\n getVisibilityButtonState: createStateGetter(visibilityStatusMap, calculateNodeStatus),\n triggerRefresh: () => {\n resetCache();\n triggerCheckboxUpdate();\n },\n });\n\n const removeListener = handler.onVisibilityChange.addListener(() => {\n resetCache();\n triggerCheckboxUpdate();\n });\n\n return () => {\n subscription.unsubscribe();\n removeListener();\n handler[Symbol.dispose]();\n };\n }, [visibilityHandlerFactory, onFeatureUsed, setErrorState]);\n\n return state;\n}\n\nfunction createStateGetter(\n map: MutableRefObject<Map<string, { node: TreeNode; status: TreeItemVisibilityButtonState; needsRefresh: boolean }>>,\n calculateVisibility: (node: TreeNode) => void,\n): VisibilityContext[\"getVisibilityButtonState\"] {\n return (node) => {\n const entry = map.current.get(node.id);\n if (entry === undefined) {\n calculateVisibility(node);\n return { isLoading: true };\n }\n\n if (entry.needsRefresh) {\n calculateVisibility(node);\n }\n\n return entry.status;\n };\n}\n\n/**\n * Properties for an overridden method of a `HierarchyVisibilityHandler` implementation.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethodProps<TFunc> = TFunc extends (props: infer TProps) => infer TResult\n ? TProps & {\n /** A callback that produces the value from the original implementation. */\n readonly originalImplementation: () => TResult;\n /**\n * Reference to the hierarchy based handler.\n * @note Calling `getVisibility` or `changeVisibility` of this object invokes the overridden implementation as well.\n */\n readonly handler: HierarchyVisibilityHandler;\n }\n : never;\n\n/**\n * Function type for an overridden method of `HierarchyVisibilityHandler`.\n * @beta\n */\nexport type HierarchyVisibilityHandlerOverridableMethod<TFunc> = TFunc extends (...args: any[]) => infer TResult\n ? (props: HierarchyVisibilityHandlerOverridableMethodProps<TFunc>) => TResult\n : never;\n\n/** @internal */\nexport class HierarchyVisibilityOverrideHandler {\n #baseHandler: HierarchyVisibilityHandler;\n constructor(baseHandler: HierarchyVisibilityHandler) {\n this.#baseHandler = baseHandler;\n }\n public createVisibilityHandlerResult<TResult, TOverrideProps>(props: {\n nonOverriddenResult: Observable<TResult>;\n override: HierarchyVisibilityHandlerOverridableMethod<(props: TOverrideProps) => Promise<TResult>> | undefined;\n overrideProps: TOverrideProps;\n }): Observable<TResult> {\n const { nonOverriddenResult, override, overrideProps } = props;\n return override\n ? from(\n override({\n ...overrideProps,\n originalImplementation: async () => lastValueFrom(nonOverriddenResult, { defaultValue: undefined as TResult }),\n handler: this.#baseHandler,\n }),\n )\n : nonOverriddenResult;\n }\n}\n"]}
@@ -78,7 +78,7 @@ export function areAllModelsVisible(models, viewport) {
78
78
  export function joinHierarchySearchPaths(subTreePaths, searchPaths) {
79
79
  const result = new Array();
80
80
  const searchPathsToIncludeIndexes = new Set();
81
- subTreePaths.forEach((subTreePath) => {
81
+ for (const subTreePath of subTreePaths) {
82
82
  let options;
83
83
  let addSubTreePathToResult = false;
84
84
  for (let i = 0; i < searchPaths.length; ++i) {
@@ -115,7 +115,7 @@ export function joinHierarchySearchPaths(subTreePaths, searchPaths) {
115
115
  options,
116
116
  });
117
117
  }
118
- });
118
+ }
119
119
  for (const index of searchPathsToIncludeIndexes) {
120
120
  result.push(searchPaths[index]);
121
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/Utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { HierarchyNodeIdentifier, HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport { showAllCategories } from \"./CategoriesVisibilityUtils.js\";\nimport { enableCategoryDisplay, loadCategoriesFromViewport } from \"./internal/VisibilityUtils.js\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, HierarchySearchPathOptions } from \"@itwin/presentation-hierarchies\";\nimport type { TreeWidgetViewport } from \"./TreeWidgetViewport.js\";\n\n/**\n * This is a logging namespace for public log messages that may be interesting to consumers.\n * @internal\n */\nexport const LOGGING_NAMESPACE = \"TreeWidget\";\n\n/** @beta */\nexport type FunctionProps<THook extends (props: any) => any> = Parameters<THook>[0];\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport function hideAllModels(models: string[], viewport: TreeWidgetViewport) {\n viewport.changeModelDisplay({ modelIds: models, display: false });\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n * @public\n */\nexport async function showAll(props: {\n /** ID's of models to enable */\n models: Id64Array;\n /** ID's of categories to enable, if set to undefined, all categories will be enabled */\n categories?: Id64Array;\n viewport: TreeWidgetViewport;\n componentId?: GuidString;\n}) {\n const { models, categories, viewport, componentId } = props;\n if (categories) {\n await showAllCategories(categories, viewport);\n } else {\n const categoryInfos = await loadCategoriesFromViewport(viewport, componentId);\n if (categoryInfos.length === 0) {\n return;\n }\n const ids = categoryInfos.map((categoryInfo) => categoryInfo.categoryId);\n await enableCategoryDisplay(viewport, ids, true);\n }\n viewport.changeModelDisplay({ modelIds: models, display: true });\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport function invertAllModels(models: Id64Array, viewport: TreeWidgetViewport) {\n const notViewedModels = new Array<Id64String>();\n const viewedModels = new Array<Id64String>();\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n viewport.changeModelDisplay({ modelIds: notViewedModels, display: true });\n viewport.changeModelDisplay({ modelIds: viewedModels, display: false });\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport function toggleModels(models: string[], enable: boolean, viewport: TreeWidgetViewport) {\n if (!models) {\n return;\n }\n viewport.changeModelDisplay({ modelIds: models, display: enable });\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: TreeWidgetViewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n\n/** @public */\nexport type NormalizedHierarchySearchPath = ReturnType<(typeof HierarchySearchPath)[\"normalize\"]>;\n\n/** @internal */\nexport function joinHierarchySearchPaths(\n subTreePaths: HierarchyNodeIdentifiersPath[],\n searchPaths: NormalizedHierarchySearchPath[],\n): NormalizedHierarchySearchPath[] {\n const result = new Array<NormalizedHierarchySearchPath>();\n const searchPathsToIncludeIndexes = new Set<number>();\n\n subTreePaths.forEach((subTreePath) => {\n let options: HierarchySearchPathOptions | undefined;\n let addSubTreePathToResult = false;\n\n for (let i = 0; i < searchPaths.length; ++i) {\n const searchPath = searchPaths[i];\n if (searchPath.path.length === 0) {\n continue;\n }\n\n for (let j = 0; j < subTreePath.length; ++j) {\n const identifier = subTreePath[j];\n if (searchPath.path.length <= j || !HierarchyNodeIdentifier.equal(searchPath.path[j], identifier)) {\n break;\n }\n\n // search paths that are shorter or equal than subTree paths length don't need to be added to the result\n if (searchPath.path.length === j + 1) {\n addSubTreePathToResult = true;\n // If search path has reveal set to true, it means that we should expand only to the targeted search node\n // This is done by setting depthInPath\n options =\n searchPath.options?.reveal !== true\n ? HierarchySearchPath.mergeOptions(options, searchPath.options)\n : { reveal: { depthInPath: searchPath.path.length - 1 } };\n break;\n }\n\n // search paths that are longer than subTree paths need to be added to the result\n if (subTreePath.length === j + 1) {\n addSubTreePathToResult = true;\n searchPathsToIncludeIndexes.add(i);\n }\n }\n }\n\n if (addSubTreePathToResult) {\n result.push({\n path: subTreePath,\n options,\n });\n }\n });\n for (const index of searchPathsToIncludeIndexes) {\n result.push(searchPaths[index]);\n }\n return result;\n}\n"]}
1
+ {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/common/Utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { HierarchyNodeIdentifier, HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport { showAllCategories } from \"./CategoriesVisibilityUtils.js\";\nimport { enableCategoryDisplay, loadCategoriesFromViewport } from \"./internal/VisibilityUtils.js\";\n\nimport type { GuidString, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, HierarchySearchPathOptions } from \"@itwin/presentation-hierarchies\";\nimport type { TreeWidgetViewport } from \"./TreeWidgetViewport.js\";\n\n/**\n * This is a logging namespace for public log messages that may be interesting to consumers.\n * @internal\n */\nexport const LOGGING_NAMESPACE = \"TreeWidget\";\n\n/** @beta */\nexport type FunctionProps<THook extends (props: any) => any> = Parameters<THook>[0];\n\n/**\n * Disables display of all given models.\n * @public\n */\nexport function hideAllModels(models: string[], viewport: TreeWidgetViewport) {\n viewport.changeModelDisplay({ modelIds: models, display: false });\n}\n\n/**\n * Enables display of all given models. Also enables display of all categories and clears always and\n * never drawn lists in the viewport.\n * @public\n */\nexport async function showAll(props: {\n /** ID's of models to enable */\n models: Id64Array;\n /** ID's of categories to enable, if set to undefined, all categories will be enabled */\n categories?: Id64Array;\n viewport: TreeWidgetViewport;\n componentId?: GuidString;\n}) {\n const { models, categories, viewport, componentId } = props;\n if (categories) {\n await showAllCategories(categories, viewport);\n } else {\n const categoryInfos = await loadCategoriesFromViewport(viewport, componentId);\n if (categoryInfos.length === 0) {\n return;\n }\n const ids = categoryInfos.map((categoryInfo) => categoryInfo.categoryId);\n await enableCategoryDisplay(viewport, ids, true);\n }\n viewport.changeModelDisplay({ modelIds: models, display: true });\n viewport.clearNeverDrawn();\n viewport.clearAlwaysDrawn();\n}\n\n/**\n * Inverts display of all given models.\n * @public\n */\nexport function invertAllModels(models: Id64Array, viewport: TreeWidgetViewport) {\n const notViewedModels = new Array<Id64String>();\n const viewedModels = new Array<Id64String>();\n models.forEach((modelId) => {\n if (viewport.viewsModel(modelId)) {\n viewedModels.push(modelId);\n } else {\n notViewedModels.push(modelId);\n }\n });\n viewport.changeModelDisplay({ modelIds: notViewedModels, display: true });\n viewport.changeModelDisplay({ modelIds: viewedModels, display: false });\n}\n\n/**\n * Based on the value of `enable` argument, either enables or disables display of given models.\n * @public\n */\nexport function toggleModels(models: string[], enable: boolean, viewport: TreeWidgetViewport) {\n if (!models) {\n return;\n }\n viewport.changeModelDisplay({ modelIds: models, display: enable });\n}\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @public\n */\nexport function areAllModelsVisible(models: string[], viewport: TreeWidgetViewport) {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n\n/** @public */\nexport type NormalizedHierarchySearchPath = ReturnType<(typeof HierarchySearchPath)[\"normalize\"]>;\n\n/** @internal */\nexport function joinHierarchySearchPaths(\n subTreePaths: HierarchyNodeIdentifiersPath[],\n searchPaths: NormalizedHierarchySearchPath[],\n): NormalizedHierarchySearchPath[] {\n const result = new Array<NormalizedHierarchySearchPath>();\n const searchPathsToIncludeIndexes = new Set<number>();\n\n for (const subTreePath of subTreePaths) {\n let options: HierarchySearchPathOptions | undefined;\n let addSubTreePathToResult = false;\n\n for (let i = 0; i < searchPaths.length; ++i) {\n const searchPath = searchPaths[i];\n if (searchPath.path.length === 0) {\n continue;\n }\n\n for (let j = 0; j < subTreePath.length; ++j) {\n const identifier = subTreePath[j];\n if (searchPath.path.length <= j || !HierarchyNodeIdentifier.equal(searchPath.path[j], identifier)) {\n break;\n }\n\n // search paths that are shorter or equal than subTree paths length don't need to be added to the result\n if (searchPath.path.length === j + 1) {\n addSubTreePathToResult = true;\n // If search path has reveal set to true, it means that we should expand only to the targeted search node\n // This is done by setting depthInPath\n options =\n searchPath.options?.reveal !== true\n ? HierarchySearchPath.mergeOptions(options, searchPath.options)\n : { reveal: { depthInPath: searchPath.path.length - 1 } };\n break;\n }\n\n // search paths that are longer than subTree paths need to be added to the result\n if (subTreePath.length === j + 1) {\n addSubTreePathToResult = true;\n searchPathsToIncludeIndexes.add(i);\n }\n }\n }\n\n if (addSubTreePathToResult) {\n result.push({\n path: subTreePath,\n options,\n });\n }\n }\n for (const index of searchPathsToIncludeIndexes) {\n result.push(searchPaths[index]);\n }\n return result;\n}\n"]}