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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/lib/cjs/TreeWidget.d.ts +2 -3
  3. package/lib/cjs/TreeWidget.js.map +1 -1
  4. package/lib/cjs/components/tree-header/TreeHeader.js +11 -3
  5. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -1
  6. package/lib/cjs/components/trees/CategoriesVisibilityUtils.d.ts +1 -1
  7. package/lib/cjs/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  8. package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +1 -1
  9. package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
  10. package/lib/cjs/components/trees/category-tree/CategoriesTreeButtons.d.ts +28 -0
  11. package/lib/cjs/components/trees/category-tree/CategoriesTreeButtons.js +38 -0
  12. package/lib/cjs/components/trees/category-tree/CategoriesTreeButtons.js.map +1 -0
  13. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.d.ts +2 -17
  14. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js +7 -26
  15. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  16. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.d.ts +1 -8
  17. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  18. package/lib/cjs/components/trees/index.d.ts +3 -0
  19. package/lib/cjs/components/trees/index.js +1 -0
  20. package/lib/cjs/components/trees/index.js.map +1 -1
  21. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.d.ts +33 -0
  22. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js +86 -0
  23. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js.map +1 -0
  24. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +2 -24
  25. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +24 -76
  26. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  27. package/lib/cjs/components/trees/models-tree/Utils.d.ts +2 -2
  28. package/lib/cjs/components/trees/models-tree/Utils.js.map +1 -1
  29. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTree.d.ts +20 -0
  30. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTree.js +61 -0
  31. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTree.js.map +1 -0
  32. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeComponent.d.ts +16 -0
  33. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeComponent.js +43 -0
  34. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeComponent.js.map +1 -0
  35. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeDefinition.d.ts +23 -0
  36. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js +180 -0
  37. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js.map +1 -0
  38. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.d.ts +36 -0
  39. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js +94 -0
  40. package/lib/cjs/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js.map +1 -0
  41. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContext.d.ts +13 -0
  42. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContext.js +16 -0
  43. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContext.js.map +1 -0
  44. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContextProvider.d.ts +8 -0
  45. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContextProvider.js +47 -0
  46. package/lib/cjs/components/trees/stateless/common/FocusedInstancesContextProvider.js.map +1 -0
  47. package/lib/cjs/components/trees/stateless/common/UseHierarchiesLocalization.d.ts +8 -0
  48. package/lib/cjs/components/trees/stateless/common/UseHierarchiesLocalization.js +33 -0
  49. package/lib/cjs/components/trees/stateless/common/UseHierarchiesLocalization.js.map +1 -0
  50. package/lib/cjs/components/trees/stateless/common/UseHierarchyFiltering.d.ts +16 -0
  51. package/lib/cjs/components/trees/stateless/common/UseHierarchyFiltering.js +139 -0
  52. package/lib/cjs/components/trees/stateless/common/UseHierarchyFiltering.js.map +1 -0
  53. package/lib/cjs/components/trees/stateless/common/UseHierarchyVisibility.d.ts +21 -0
  54. package/lib/cjs/components/trees/stateless/common/UseHierarchyVisibility.js +82 -0
  55. package/lib/cjs/components/trees/stateless/common/UseHierarchyVisibility.js.map +1 -0
  56. package/lib/cjs/components/trees/stateless/common/UseMultiCheckboxHandler.d.ts +13 -0
  57. package/lib/cjs/components/trees/stateless/common/UseMultiCheckboxHandler.js +34 -0
  58. package/lib/cjs/components/trees/stateless/common/UseMultiCheckboxHandler.js.map +1 -0
  59. package/lib/cjs/components/trees/stateless/common/Utils.d.ts +3 -0
  60. package/lib/cjs/components/trees/stateless/common/Utils.js +23 -0
  61. package/lib/cjs/components/trees/stateless/common/Utils.js.map +1 -0
  62. package/lib/cjs/components/trees/stateless/common/components/Delayed.d.ts +6 -0
  63. package/lib/cjs/components/trees/stateless/common/components/Delayed.js +31 -0
  64. package/lib/cjs/components/trees/stateless/common/components/Delayed.js.map +1 -0
  65. package/lib/cjs/components/trees/stateless/common/components/FilterableTree.d.ts +23 -0
  66. package/lib/cjs/components/trees/stateless/common/components/FilterableTree.js +66 -0
  67. package/lib/cjs/components/trees/stateless/common/components/FilterableTree.js.map +1 -0
  68. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.d.ts +5 -0
  69. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.js +16 -0
  70. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.js.map +1 -0
  71. package/lib/cjs/components/trees/stateless/common/components/ProgressOverlay.scss +21 -0
  72. package/lib/cjs/components/trees/stateless/common/components/VisibilityTree.d.ts +26 -0
  73. package/lib/cjs/components/trees/stateless/common/components/VisibilityTree.js +68 -0
  74. package/lib/cjs/components/trees/stateless/common/components/VisibilityTree.js.map +1 -0
  75. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.d.ts +12 -0
  76. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js +24 -0
  77. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js.map +1 -0
  78. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.d.ts +10 -0
  79. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js +20 -0
  80. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js.map +1 -0
  81. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.d.ts +16 -0
  82. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.js +23 -0
  83. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.js.map +1 -0
  84. package/lib/cjs/components/trees/stateless/common/components/VisibilityTreeRenderer.scss +41 -0
  85. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTree.d.ts +13 -0
  86. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js +40 -0
  87. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js.map +1 -0
  88. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.d.ts +14 -0
  89. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js +25 -0
  90. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -0
  91. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +20 -0
  92. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js +244 -0
  93. package/lib/cjs/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -0
  94. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTree.d.ts +13 -0
  95. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTree.js +48 -0
  96. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTree.js.map +1 -0
  97. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.d.ts +14 -0
  98. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js +25 -0
  99. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js.map +1 -0
  100. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.d.ts +25 -0
  101. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js +639 -0
  102. package/lib/cjs/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -0
  103. package/lib/cjs/components/trees/stateless/index.d.ts +5 -0
  104. package/lib/cjs/components/trees/stateless/index.js +16 -0
  105. package/lib/cjs/components/trees/stateless/index.js.map +1 -0
  106. package/lib/cjs/components/trees/stateless/models-tree/ModelsTree.d.ts +16 -0
  107. package/lib/cjs/components/trees/stateless/models-tree/ModelsTree.js +77 -0
  108. package/lib/cjs/components/trees/stateless/models-tree/ModelsTree.js.map +1 -0
  109. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeComponent.d.ts +17 -0
  110. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeComponent.js +55 -0
  111. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeComponent.js.map +1 -0
  112. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeDefinition.d.ts +35 -0
  113. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeDefinition.js +856 -0
  114. package/lib/cjs/components/trees/stateless/models-tree/ModelsTreeDefinition.js.map +1 -0
  115. package/lib/cjs/components/trees/stateless/models-tree/ModelsVisibilityHandler.d.ts +48 -0
  116. package/lib/cjs/components/trees/stateless/models-tree/ModelsVisibilityHandler.js +470 -0
  117. package/lib/cjs/components/trees/stateless/models-tree/ModelsVisibilityHandler.js.map +1 -0
  118. package/lib/esm/TreeWidget.d.ts +2 -3
  119. package/lib/esm/TreeWidget.js.map +1 -1
  120. package/lib/esm/components/tree-header/TreeHeader.js +11 -3
  121. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -1
  122. package/lib/esm/components/trees/CategoriesVisibilityUtils.d.ts +1 -1
  123. package/lib/esm/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  124. package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +1 -1
  125. package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
  126. package/lib/esm/components/trees/category-tree/CategoriesTreeButtons.d.ts +28 -0
  127. package/lib/esm/components/trees/category-tree/CategoriesTreeButtons.js +32 -0
  128. package/lib/esm/components/trees/category-tree/CategoriesTreeButtons.js.map +1 -0
  129. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.d.ts +2 -17
  130. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js +2 -21
  131. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  132. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.d.ts +1 -8
  133. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  134. package/lib/esm/components/trees/index.d.ts +3 -0
  135. package/lib/esm/components/trees/index.js +1 -0
  136. package/lib/esm/components/trees/index.js.map +1 -1
  137. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.d.ts +33 -0
  138. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js +77 -0
  139. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js.map +1 -0
  140. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +2 -24
  141. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +20 -72
  142. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  143. package/lib/esm/components/trees/models-tree/Utils.d.ts +2 -2
  144. package/lib/esm/components/trees/models-tree/Utils.js.map +1 -1
  145. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTree.d.ts +20 -0
  146. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTree.js +57 -0
  147. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTree.js.map +1 -0
  148. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeComponent.d.ts +16 -0
  149. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeComponent.js +39 -0
  150. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeComponent.js.map +1 -0
  151. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeDefinition.d.ts +23 -0
  152. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js +176 -0
  153. package/lib/esm/components/trees/stateless/categories-tree/CategoriesTreeDefinition.js.map +1 -0
  154. package/lib/esm/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.d.ts +36 -0
  155. package/lib/esm/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js +90 -0
  156. package/lib/esm/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.js.map +1 -0
  157. package/lib/esm/components/trees/stateless/common/FocusedInstancesContext.d.ts +13 -0
  158. package/lib/esm/components/trees/stateless/common/FocusedInstancesContext.js +12 -0
  159. package/lib/esm/components/trees/stateless/common/FocusedInstancesContext.js.map +1 -0
  160. package/lib/esm/components/trees/stateless/common/FocusedInstancesContextProvider.d.ts +8 -0
  161. package/lib/esm/components/trees/stateless/common/FocusedInstancesContextProvider.js +43 -0
  162. package/lib/esm/components/trees/stateless/common/FocusedInstancesContextProvider.js.map +1 -0
  163. package/lib/esm/components/trees/stateless/common/UseHierarchiesLocalization.d.ts +8 -0
  164. package/lib/esm/components/trees/stateless/common/UseHierarchiesLocalization.js +29 -0
  165. package/lib/esm/components/trees/stateless/common/UseHierarchiesLocalization.js.map +1 -0
  166. package/lib/esm/components/trees/stateless/common/UseHierarchyFiltering.d.ts +16 -0
  167. package/lib/esm/components/trees/stateless/common/UseHierarchyFiltering.js +135 -0
  168. package/lib/esm/components/trees/stateless/common/UseHierarchyFiltering.js.map +1 -0
  169. package/lib/esm/components/trees/stateless/common/UseHierarchyVisibility.d.ts +21 -0
  170. package/lib/esm/components/trees/stateless/common/UseHierarchyVisibility.js +78 -0
  171. package/lib/esm/components/trees/stateless/common/UseHierarchyVisibility.js.map +1 -0
  172. package/lib/esm/components/trees/stateless/common/UseMultiCheckboxHandler.d.ts +13 -0
  173. package/lib/esm/components/trees/stateless/common/UseMultiCheckboxHandler.js +30 -0
  174. package/lib/esm/components/trees/stateless/common/UseMultiCheckboxHandler.js.map +1 -0
  175. package/lib/esm/components/trees/stateless/common/Utils.d.ts +3 -0
  176. package/lib/esm/components/trees/stateless/common/Utils.js +19 -0
  177. package/lib/esm/components/trees/stateless/common/Utils.js.map +1 -0
  178. package/lib/esm/components/trees/stateless/common/components/Delayed.d.ts +6 -0
  179. package/lib/esm/components/trees/stateless/common/components/Delayed.js +27 -0
  180. package/lib/esm/components/trees/stateless/common/components/Delayed.js.map +1 -0
  181. package/lib/esm/components/trees/stateless/common/components/FilterableTree.d.ts +23 -0
  182. package/lib/esm/components/trees/stateless/common/components/FilterableTree.js +62 -0
  183. package/lib/esm/components/trees/stateless/common/components/FilterableTree.js.map +1 -0
  184. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.d.ts +5 -0
  185. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.js +12 -0
  186. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.js.map +1 -0
  187. package/lib/esm/components/trees/stateless/common/components/ProgressOverlay.scss +21 -0
  188. package/lib/esm/components/trees/stateless/common/components/VisibilityTree.d.ts +26 -0
  189. package/lib/esm/components/trees/stateless/common/components/VisibilityTree.js +64 -0
  190. package/lib/esm/components/trees/stateless/common/components/VisibilityTree.js.map +1 -0
  191. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.d.ts +12 -0
  192. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js +20 -0
  193. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeCheckbox.js.map +1 -0
  194. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.d.ts +10 -0
  195. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js +13 -0
  196. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeNodeRenderer.js.map +1 -0
  197. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.d.ts +16 -0
  198. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.js +19 -0
  199. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.js.map +1 -0
  200. package/lib/esm/components/trees/stateless/common/components/VisibilityTreeRenderer.scss +41 -0
  201. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTree.d.ts +13 -0
  202. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js +36 -0
  203. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTree.js.map +1 -0
  204. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.d.ts +14 -0
  205. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js +21 -0
  206. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -0
  207. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +20 -0
  208. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js +240 -0
  209. package/lib/esm/components/trees/stateless/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -0
  210. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTree.d.ts +13 -0
  211. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTree.js +44 -0
  212. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTree.js.map +1 -0
  213. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.d.ts +14 -0
  214. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js +21 -0
  215. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeComponent.js.map +1 -0
  216. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.d.ts +25 -0
  217. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js +635 -0
  218. package/lib/esm/components/trees/stateless/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -0
  219. package/lib/esm/components/trees/stateless/index.d.ts +5 -0
  220. package/lib/esm/components/trees/stateless/index.js +9 -0
  221. package/lib/esm/components/trees/stateless/index.js.map +1 -0
  222. package/lib/esm/components/trees/stateless/models-tree/ModelsTree.d.ts +16 -0
  223. package/lib/esm/components/trees/stateless/models-tree/ModelsTree.js +73 -0
  224. package/lib/esm/components/trees/stateless/models-tree/ModelsTree.js.map +1 -0
  225. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeComponent.d.ts +17 -0
  226. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeComponent.js +51 -0
  227. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeComponent.js.map +1 -0
  228. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeDefinition.d.ts +35 -0
  229. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeDefinition.js +852 -0
  230. package/lib/esm/components/trees/stateless/models-tree/ModelsTreeDefinition.js.map +1 -0
  231. package/lib/esm/components/trees/stateless/models-tree/ModelsVisibilityHandler.d.ts +48 -0
  232. package/lib/esm/components/trees/stateless/models-tree/ModelsVisibilityHandler.js +466 -0
  233. package/lib/esm/components/trees/stateless/models-tree/ModelsVisibilityHandler.js.map +1 -0
  234. package/lib/public/locales/en/TreeWidget.json +21 -0
  235. package/package.json +7 -1
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.StatelessCategoriesVisibilityHandler = void 0;
8
+ const core_bentley_1 = require("@itwin/core-bentley");
9
+ const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies");
10
+ const CategoriesVisibilityUtils_1 = require("../../CategoriesVisibilityUtils");
11
+ /** @internal */
12
+ class StatelessCategoriesVisibilityHandler {
13
+ constructor(props) {
14
+ this.onVisibilityChange = new core_bentley_1.BeEvent();
15
+ // eslint-disable-next-line @typescript-eslint/naming-convention
16
+ this.onDisplayStyleChanged = () => {
17
+ this.onVisibilityChangeInternal();
18
+ };
19
+ // eslint-disable-next-line @typescript-eslint/naming-convention
20
+ this.onViewedCategoriesChanged = () => {
21
+ this.onVisibilityChangeInternal();
22
+ };
23
+ this._viewManager = props.viewManager;
24
+ this._imodel = props.imodel;
25
+ this._viewport = props.viewport;
26
+ // istanbul ignore next
27
+ this._useAllViewports = props.allViewports ?? false;
28
+ this._viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);
29
+ this._viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);
30
+ }
31
+ dispose() {
32
+ this._viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);
33
+ this._viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);
34
+ clearTimeout(this._pendingVisibilityChange);
35
+ }
36
+ /** Returns visibility status of the tree node. */
37
+ getVisibilityStatus(node) {
38
+ if (!presentation_hierarchies_1.HierarchyNode.isInstancesNode(node)) {
39
+ return { state: "hidden", isDisabled: true };
40
+ }
41
+ return { state: node.parentKeys.length ? this.getSubCategoryVisibility(node) : this.getCategoryVisibility(node) };
42
+ }
43
+ async changeVisibility(node, on) {
44
+ if (!presentation_hierarchies_1.HierarchyNode.isInstancesNode(node)) {
45
+ return;
46
+ }
47
+ // handle subcategory visibility change
48
+ if (node.parentKeys.length) {
49
+ const childId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);
50
+ const parentCategoryId = node.extendedData?.categoryId;
51
+ // make sure parent category is enabled
52
+ if (on && parentCategoryId) {
53
+ await this.enableCategory([parentCategoryId], true, false);
54
+ }
55
+ this.enableSubCategory(childId, on);
56
+ return;
57
+ }
58
+ const instanceId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);
59
+ await this.enableCategory([instanceId], on, true);
60
+ }
61
+ getSubCategoryVisibility(node) {
62
+ const parentCategoryId = node.extendedData?.categoryId;
63
+ if (!parentCategoryId) {
64
+ return "hidden";
65
+ }
66
+ const subcategoryId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);
67
+ const isVisible = this._viewport.view.viewsCategory(parentCategoryId) && this._viewport.isSubCategoryVisible(subcategoryId);
68
+ return isVisible ? "visible" : "hidden";
69
+ }
70
+ getCategoryVisibility(node) {
71
+ const instanceId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);
72
+ return this._viewport.view.viewsCategory(instanceId) ? "visible" : "hidden";
73
+ }
74
+ onVisibilityChangeInternal() {
75
+ if (this._pendingVisibilityChange) {
76
+ return;
77
+ }
78
+ this._pendingVisibilityChange = setTimeout(() => {
79
+ this.onVisibilityChange.raiseEvent();
80
+ this._pendingVisibilityChange = undefined;
81
+ }, 0);
82
+ }
83
+ static getInstanceIdFromHierarchyNode(node) {
84
+ return presentation_hierarchies_1.HierarchyNode.isInstancesNode(node) && node.key.instanceKeys.length > 0 ? node.key.instanceKeys[0].id : /* istanbul ignore next */ "";
85
+ }
86
+ async enableCategory(ids, enabled, enableAllSubCategories = true) {
87
+ await (0, CategoriesVisibilityUtils_1.enableCategory)(this._viewManager, this._imodel, ids, enabled, this._useAllViewports, enableAllSubCategories);
88
+ }
89
+ enableSubCategory(key, enabled) {
90
+ (0, CategoriesVisibilityUtils_1.enableSubCategory)(this._viewManager, key, enabled, this._useAllViewports);
91
+ }
92
+ }
93
+ exports.StatelessCategoriesVisibilityHandler = StatelessCategoriesVisibilityHandler;
94
+ //# sourceMappingURL=CategoriesVisibilityHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../src/components/trees/stateless/categories-tree/CategoriesVisibilityHandler.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 { BeEvent } from \"@itwin/core-bentley\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategory, enableSubCategory } from \"../../CategoriesVisibilityUtils\";\n\nimport type { CategoryInfo } from \"../../category-tree/CategoriesTreeButtons\";\nimport type { VisibilityChangeListener, VisibilityStatus } from \"../../VisibilityTreeEventHandler\";\nimport type { IModelConnection, ViewManager, Viewport } from \"@itwin/core-frontend\";\n\ninterface StatelessCategoriesVisibilityHandlerProps {\n viewManager: ViewManager;\n imodel: IModelConnection;\n categories: CategoryInfo[];\n viewport: Viewport;\n allViewports?: boolean;\n}\n\n/** @internal */\nexport class StatelessCategoriesVisibilityHandler {\n private _viewManager: ViewManager;\n private _imodel: IModelConnection;\n private _pendingVisibilityChange: any | undefined;\n private _viewport: Viewport;\n private _useAllViewports: boolean;\n\n constructor(props: StatelessCategoriesVisibilityHandlerProps) {\n this._viewManager = props.viewManager;\n this._imodel = props.imodel;\n this._viewport = props.viewport;\n // istanbul ignore next\n this._useAllViewports = props.allViewports ?? false;\n this._viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this._viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n }\n\n public dispose() {\n this._viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this._viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n clearTimeout(this._pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent<VisibilityChangeListener>();\n\n /** Returns visibility status of the tree node. */\n public getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> | VisibilityStatus {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n return { state: node.parentKeys.length ? this.getSubCategoryVisibility(node) : this.getCategoryVisibility(node) };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n // handle subcategory visibility change\n if (node.parentKeys.length) {\n const childId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);\n const parentCategoryId = node.extendedData?.categoryId;\n\n // make sure parent category is enabled\n if (on && parentCategoryId) {\n await this.enableCategory([parentCategoryId], true, false);\n }\n\n this.enableSubCategory(childId, on);\n return;\n }\n\n const instanceId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);\n await this.enableCategory([instanceId], on, true);\n }\n\n public getSubCategoryVisibility(node: HierarchyNode) {\n const parentCategoryId = node.extendedData?.categoryId;\n if (!parentCategoryId) {\n return \"hidden\";\n }\n\n const subcategoryId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);\n const isVisible = this._viewport.view.viewsCategory(parentCategoryId) && this._viewport.isSubCategoryVisible(subcategoryId);\n return isVisible ? \"visible\" : \"hidden\";\n }\n\n public getCategoryVisibility(node: HierarchyNode) {\n const instanceId = StatelessCategoriesVisibilityHandler.getInstanceIdFromHierarchyNode(node);\n return this._viewport.view.viewsCategory(instanceId) ? \"visible\" : \"hidden\";\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this._pendingVisibilityChange) {\n return;\n }\n\n this._pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this._pendingVisibilityChange = undefined;\n }, 0);\n }\n\n public static getInstanceIdFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) && node.key.instanceKeys.length > 0 ? node.key.instanceKeys[0].id : /* istanbul ignore next */ \"\";\n }\n\n public async enableCategory(ids: string[], enabled: boolean, enableAllSubCategories = true) {\n await enableCategory(this._viewManager, this._imodel, ids, enabled, this._useAllViewports, enableAllSubCategories);\n }\n\n public enableSubCategory(key: string, enabled: boolean) {\n enableSubCategory(this._viewManager, key, enabled, this._useAllViewports);\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import type { InstanceKey } from "@itwin/presentation-shared";
3
+ /** @internal */
4
+ export interface FocusedInstancesContext {
5
+ instanceKeys?: InstanceKey[];
6
+ enabled: boolean;
7
+ toggle: () => void;
8
+ }
9
+ /** @internal */
10
+ export declare const focusedInstancesContext: import("react").Context<FocusedInstancesContext>;
11
+ /** @internal */
12
+ export declare function useFocusedInstancesContext(): FocusedInstancesContext;
13
+ //# sourceMappingURL=FocusedInstancesContext.d.ts.map
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.useFocusedInstancesContext = exports.focusedInstancesContext = void 0;
8
+ const react_1 = require("react");
9
+ /** @internal */
10
+ exports.focusedInstancesContext = (0, react_1.createContext)({ enabled: false, toggle: () => { } });
11
+ /** @internal */
12
+ function useFocusedInstancesContext() {
13
+ return (0, react_1.useContext)(exports.focusedInstancesContext);
14
+ }
15
+ exports.useFocusedInstancesContext = useFocusedInstancesContext;
16
+ //# sourceMappingURL=FocusedInstancesContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FocusedInstancesContext.js","sourceRoot":"","sources":["../../../../../../src/components/trees/stateless/common/FocusedInstancesContext.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,iCAAkD;AAWlD,gBAAgB;AACH,QAAA,uBAAuB,GAAG,IAAA,qBAAa,EAA0B,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;AAEpH,gBAAgB;AAChB,SAAgB,0BAA0B;IACxC,OAAO,IAAA,kBAAU,EAAC,+BAAuB,CAAC,CAAC;AAC7C,CAAC;AAFD,gEAEC","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 { createContext, useContext } from \"react\";\n\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\n\n/** @internal */\nexport interface FocusedInstancesContext {\n instanceKeys?: InstanceKey[];\n enabled: boolean;\n toggle: () => void;\n}\n\n/** @internal */\nexport const focusedInstancesContext = createContext<FocusedInstancesContext>({ enabled: false, toggle: () => {} });\n\n/** @internal */\nexport function useFocusedInstancesContext() {\n return useContext(focusedInstancesContext);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { PropsWithChildren } from "react";
2
+ import type { SelectionStorage } from "@itwin/presentation-hierarchies-react";
3
+ /** @internal */
4
+ export declare function FocusedInstancesContextProvider({ selectionStorage, imodelKey, children, }: PropsWithChildren<{
5
+ selectionStorage: SelectionStorage;
6
+ imodelKey: string;
7
+ }>): JSX.Element;
8
+ //# sourceMappingURL=FocusedInstancesContextProvider.d.ts.map
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FocusedInstancesContextProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /*---------------------------------------------------------------------------------------------
6
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
7
+ * See LICENSE.md in the project root for license terms and full copyright notice.
8
+ *--------------------------------------------------------------------------------------------*/
9
+ const react_1 = require("react");
10
+ const unified_selection_1 = require("@itwin/unified-selection");
11
+ const FocusedInstancesContext_1 = require("./FocusedInstancesContext");
12
+ /** @internal */
13
+ function FocusedInstancesContextProvider({ selectionStorage, imodelKey, children, }) {
14
+ const [state, setState] = (0, react_1.useState)({
15
+ enabled: false,
16
+ toggle: () => {
17
+ setState((prev) => ({ ...prev, enabled: !prev.enabled }));
18
+ },
19
+ });
20
+ const enabled = state.enabled;
21
+ (0, react_1.useEffect)(() => {
22
+ if (!enabled) {
23
+ setState((prev) => ({ ...prev, instanceKeys: undefined }));
24
+ return;
25
+ }
26
+ const onSelectionChanged = () => {
27
+ const selection = selectionStorage.getSelection({ imodelKey, level: 0 });
28
+ const selectedInstanceKeys = [];
29
+ unified_selection_1.Selectables.forEach(selection, (key) => {
30
+ if (unified_selection_1.Selectable.isInstanceKey(key)) {
31
+ selectedInstanceKeys.push(key);
32
+ }
33
+ });
34
+ setState((prev) => ({ ...prev, instanceKeys: selectedInstanceKeys.length === 0 ? undefined : selectedInstanceKeys }));
35
+ };
36
+ onSelectionChanged();
37
+ return selectionStorage.selectionChangeEvent.addListener(({ imodelKey: changeImodelKey, level }) => {
38
+ if (changeImodelKey !== imodelKey || level !== 0) {
39
+ return;
40
+ }
41
+ onSelectionChanged();
42
+ });
43
+ }, [enabled, imodelKey, selectionStorage]);
44
+ return (0, jsx_runtime_1.jsx)(FocusedInstancesContext_1.focusedInstancesContext.Provider, { value: state, children: children });
45
+ }
46
+ exports.FocusedInstancesContextProvider = FocusedInstancesContextProvider;
47
+ //# sourceMappingURL=FocusedInstancesContextProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FocusedInstancesContextProvider.js","sourceRoot":"","sources":["../../../../../../src/components/trees/stateless/common/FocusedInstancesContextProvider.tsx"],"names":[],"mappings":";;;;AAAA;;;gGAGgG;AAEhG,iCAA4C;AAC5C,gEAAmE;AACnE,uEAAoE;AAOpE,gBAAgB;AAChB,SAAgB,+BAA+B,CAAC,EAC9C,gBAAgB,EAChB,SAAS,EACT,QAAQ,GACqE;IAC7E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAA0B;QAC1D,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,GAAG,EAAE;YACX,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE;YACZ,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO;SACR;QAED,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,MAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACzE,MAAM,oBAAoB,GAAkB,EAAE,CAAC;YAC/C,+BAAW,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrC,IAAI,8BAAU,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;oBACjC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;iBAChC;YACH,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;QACxH,CAAC,CAAC;QAEF,kBAAkB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE;YACjG,IAAI,eAAe,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,EAAE;gBAChD,OAAO;aACR;YACD,kBAAkB,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE3C,OAAO,uBAAC,iDAAuB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAoC,CAAC;AACvG,CAAC;AAxCD,0EAwCC","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, useState } from \"react\";\nimport { Selectable, Selectables } from \"@itwin/unified-selection\";\nimport { focusedInstancesContext } from \"./FocusedInstancesContext\";\n\nimport type { PropsWithChildren } from \"react\";\nimport type { InstanceKey } from \"@itwin/presentation-common\";\nimport type { SelectionStorage } from \"@itwin/presentation-hierarchies-react\";\nimport type { FocusedInstancesContext } from \"./FocusedInstancesContext\";\n\n/** @internal */\nexport function FocusedInstancesContextProvider({\n selectionStorage,\n imodelKey,\n children,\n}: PropsWithChildren<{ selectionStorage: SelectionStorage; imodelKey: string }>) {\n const [state, setState] = useState<FocusedInstancesContext>({\n enabled: false,\n toggle: () => {\n setState((prev) => ({ ...prev, enabled: !prev.enabled }));\n },\n });\n const enabled = state.enabled;\n\n useEffect(() => {\n if (!enabled) {\n setState((prev) => ({ ...prev, instanceKeys: undefined }));\n return;\n }\n\n const onSelectionChanged = () => {\n const selection = selectionStorage.getSelection({ imodelKey, level: 0 });\n const selectedInstanceKeys: InstanceKey[] = [];\n Selectables.forEach(selection, (key) => {\n if (Selectable.isInstanceKey(key)) {\n selectedInstanceKeys.push(key);\n }\n });\n setState((prev) => ({ ...prev, instanceKeys: selectedInstanceKeys.length === 0 ? undefined : selectedInstanceKeys }));\n };\n\n onSelectionChanged();\n return selectionStorage.selectionChangeEvent.addListener(({ imodelKey: changeImodelKey, level }) => {\n if (changeImodelKey !== imodelKey || level !== 0) {\n return;\n }\n onSelectionChanged();\n });\n }, [enabled, imodelKey, selectionStorage]);\n\n return <focusedInstancesContext.Provider value={state}>{children}</focusedInstancesContext.Provider>;\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { TreeRenderer, useTree } from "@itwin/presentation-hierarchies-react";
2
+ type UseTreeLocalizedStrings = Parameters<typeof useTree>[0]["localizedStrings"];
3
+ type TreeRendererLocalizedStrings = Parameters<typeof TreeRenderer>[0]["localizedStrings"];
4
+ type useHierarchiesLocalizationResult = UseTreeLocalizedStrings & TreeRendererLocalizedStrings;
5
+ /** @internal */
6
+ export declare function useHierarchiesLocalization(): useHierarchiesLocalizationResult;
7
+ export {};
8
+ //# sourceMappingURL=UseHierarchiesLocalization.d.ts.map
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.useHierarchiesLocalization = void 0;
8
+ const react_1 = require("react");
9
+ const TreeWidget_1 = require("../../../../TreeWidget");
10
+ /** @internal */
11
+ function useHierarchiesLocalization() {
12
+ const stringValues = Object.values(getLocalizedStrings());
13
+ const localizedStrings = (0, react_1.useMemo)(getLocalizedStrings, stringValues);
14
+ return localizedStrings;
15
+ }
16
+ exports.useHierarchiesLocalization = useHierarchiesLocalization;
17
+ function getLocalizedStrings() {
18
+ return {
19
+ // strings for the `useUnifiedSelectionTree` hook
20
+ unspecified: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.unspecified"),
21
+ other: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.other"),
22
+ // strings for `TreeRenderer` and `TreeNodeRenderer`
23
+ loading: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.loading"),
24
+ filterHierarchyLevel: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.filterHierarchyLevel"),
25
+ clearHierarchyLevelFilter: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.clearHierarchyLevelFilter"),
26
+ noFilteredChildren: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.noFilteredChildren"),
27
+ resultLimitExceeded: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.resultLimitExceeded"),
28
+ resultLimitExceededWithFiltering: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.resultLimitExceededWithFiltering"),
29
+ increaseHierarchyLimit: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.increaseHierarchyLimit"),
30
+ increaseHierarchyLimitWithFiltering: TreeWidget_1.TreeWidget.translate("stateless.hierarchies.increaseHierarchyLimitWithFiltering"),
31
+ };
32
+ }
33
+ //# sourceMappingURL=UseHierarchiesLocalization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseHierarchiesLocalization.js","sourceRoot":"","sources":["../../../../../../src/components/trees/stateless/common/UseHierarchiesLocalization.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,iCAAgC;AAChC,uDAAoD;AASpD,gBAAgB;AAChB,SAAgB,0BAA0B;IACxC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAG,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,IAAA,eAAO,EAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAEpE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AALD,gEAKC;AAED,SAAS,mBAAmB;IAC1B,OAAO;QACL,iDAAiD;QACjD,WAAW,EAAE,uBAAU,CAAC,SAAS,CAAC,mCAAmC,CAAC;QACtE,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,6BAA6B,CAAC;QAE1D,oDAAoD;QACpD,OAAO,EAAE,uBAAU,CAAC,SAAS,CAAC,+BAA+B,CAAC;QAC9D,oBAAoB,EAAE,uBAAU,CAAC,SAAS,CAAC,4CAA4C,CAAC;QACxF,yBAAyB,EAAE,uBAAU,CAAC,SAAS,CAAC,iDAAiD,CAAC;QAClG,kBAAkB,EAAE,uBAAU,CAAC,SAAS,CAAC,0CAA0C,CAAC;QACpF,mBAAmB,EAAE,uBAAU,CAAC,SAAS,CAAC,2CAA2C,CAAC;QACtF,gCAAgC,EAAE,uBAAU,CAAC,SAAS,CAAC,wDAAwD,CAAC;QAChH,sBAAsB,EAAE,uBAAU,CAAC,SAAS,CAAC,8CAA8C,CAAC;QAC5F,mCAAmC,EAAE,uBAAU,CAAC,SAAS,CAAC,2DAA2D,CAAC;KACvH,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 { useMemo } from \"react\";\nimport { TreeWidget } from \"../../../../TreeWidget\";\n\nimport type { TreeRenderer, useTree } from \"@itwin/presentation-hierarchies-react\";\n\ntype UseTreeLocalizedStrings = Parameters<typeof useTree>[0][\"localizedStrings\"];\ntype TreeRendererLocalizedStrings = Parameters<typeof TreeRenderer>[0][\"localizedStrings\"];\n\ntype useHierarchiesLocalizationResult = UseTreeLocalizedStrings & TreeRendererLocalizedStrings;\n\n/** @internal */\nexport function useHierarchiesLocalization(): useHierarchiesLocalizationResult {\n const stringValues = Object.values(getLocalizedStrings()!);\n const localizedStrings = useMemo(getLocalizedStrings, stringValues);\n\n return localizedStrings;\n}\n\nfunction getLocalizedStrings(): useHierarchiesLocalizationResult {\n return {\n // strings for the `useUnifiedSelectionTree` hook\n unspecified: TreeWidget.translate(\"stateless.hierarchies.unspecified\"),\n other: TreeWidget.translate(\"stateless.hierarchies.other\"),\n\n // strings for `TreeRenderer` and `TreeNodeRenderer`\n loading: TreeWidget.translate(\"stateless.hierarchies.loading\"),\n filterHierarchyLevel: TreeWidget.translate(\"stateless.hierarchies.filterHierarchyLevel\"),\n clearHierarchyLevelFilter: TreeWidget.translate(\"stateless.hierarchies.clearHierarchyLevelFilter\"),\n noFilteredChildren: TreeWidget.translate(\"stateless.hierarchies.noFilteredChildren\"),\n resultLimitExceeded: TreeWidget.translate(\"stateless.hierarchies.resultLimitExceeded\"),\n resultLimitExceededWithFiltering: TreeWidget.translate(\"stateless.hierarchies.resultLimitExceededWithFiltering\"),\n increaseHierarchyLimit: TreeWidget.translate(\"stateless.hierarchies.increaseHierarchyLimit\"),\n increaseHierarchyLimitWithFiltering: TreeWidget.translate(\"stateless.hierarchies.increaseHierarchyLimitWithFiltering\"),\n };\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ import type { IModelConnection } from "@itwin/core-frontend";
3
+ import type { useTree } from "@itwin/presentation-hierarchies-react";
4
+ type UseTreeResult = ReturnType<typeof useTree>;
5
+ interface UseHierarchyLevelFilteringOwnProps {
6
+ imodel: IModelConnection;
7
+ defaultHierarchyLevelSizeLimit: number;
8
+ }
9
+ type UseHierarchyLevelFilteringProps = UseHierarchyLevelFilteringOwnProps & Pick<UseTreeResult, "getHierarchyLevelDetails">;
10
+ /** @internal */
11
+ export declare function useHierarchyLevelFiltering({ imodel, defaultHierarchyLevelSizeLimit, getHierarchyLevelDetails }: UseHierarchyLevelFilteringProps): {
12
+ onFilterClick: (nodeId: string | undefined) => void;
13
+ filteringDialog: JSX.Element;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=UseHierarchyFiltering.d.ts.map
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useHierarchyLevelFiltering = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /*---------------------------------------------------------------------------------------------
6
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
7
+ * See LICENSE.md in the project root for license terms and full copyright notice.
8
+ *--------------------------------------------------------------------------------------------*/
9
+ const react_1 = require("react");
10
+ const components_react_1 = require("@itwin/components-react");
11
+ const presentation_common_1 = require("@itwin/presentation-common");
12
+ const presentation_components_1 = require("@itwin/presentation-components");
13
+ const presentation_frontend_1 = require("@itwin/presentation-frontend");
14
+ const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies");
15
+ const TreeWidget_1 = require("../../../../TreeWidget");
16
+ /** @internal */
17
+ function useHierarchyLevelFiltering({ imodel, defaultHierarchyLevelSizeLimit, getHierarchyLevelDetails }) {
18
+ const [filteringOptions, setFilteringOptions] = (0, react_1.useState)();
19
+ const onFilterClick = (0, react_1.useCallback)((nodeId) => {
20
+ const hierarchyDetails = getHierarchyLevelDetails(nodeId);
21
+ setFilteringOptions(hierarchyDetails ? { nodeId, hierarchyDetails } : undefined);
22
+ }, [getHierarchyLevelDetails]);
23
+ const propertiesSource = (0, react_1.useMemo)(() => {
24
+ if (!filteringOptions) {
25
+ return undefined;
26
+ }
27
+ return async () => {
28
+ const inputKeys = await collectInstanceKeys(filteringOptions.hierarchyDetails.getInstanceKeysIterator());
29
+ if (inputKeys.length === 0) {
30
+ throw new Error("Hierarchy level is empty - unable to create content descriptor.");
31
+ }
32
+ const descriptor = await presentation_frontend_1.Presentation.presentation.getContentDescriptor({
33
+ imodel,
34
+ rulesetOrId: {
35
+ id: `Hierarchy level descriptor ruleset`,
36
+ rules: [
37
+ {
38
+ ruleType: "Content",
39
+ specifications: [
40
+ {
41
+ specType: "SelectedNodeInstances",
42
+ },
43
+ ],
44
+ },
45
+ ],
46
+ },
47
+ displayType: presentation_common_1.DefaultContentDisplayTypes.PropertyPane,
48
+ keys: new presentation_common_1.KeySet(inputKeys),
49
+ });
50
+ if (!descriptor) {
51
+ throw new Error("Failed to create content descriptor");
52
+ }
53
+ return { descriptor, inputKeys };
54
+ };
55
+ }, [filteringOptions, imodel]);
56
+ const getInitialFilter = (0, react_1.useMemo)(() => {
57
+ const currentFilter = filteringOptions?.hierarchyDetails.instanceFilter;
58
+ if (!currentFilter) {
59
+ return undefined;
60
+ }
61
+ return (descriptor) => fromGenericFilter(descriptor, currentFilter);
62
+ }, [filteringOptions]);
63
+ const filteringDialog = ((0, jsx_runtime_1.jsx)(presentation_components_1.PresentationInstanceFilterDialog, { imodel: imodel, isOpen: !!filteringOptions, onApply: (info) => {
64
+ if (!filteringOptions) {
65
+ return;
66
+ }
67
+ filteringOptions.hierarchyDetails.setInstanceFilter(toGenericFilter(info));
68
+ setFilteringOptions(undefined);
69
+ }, onClose: () => {
70
+ setFilteringOptions(undefined);
71
+ }, propertiesSource: propertiesSource, initialFilter: getInitialFilter, filterResultsCountRenderer: (filter) => {
72
+ if (!filteringOptions) {
73
+ return null;
74
+ }
75
+ return ((0, jsx_runtime_1.jsx)(MatchingInstancesCount, { filter: filter, hierarchyLevelDetails: filteringOptions.hierarchyDetails, defaultHierarchyLevelSizeLimit: defaultHierarchyLevelSizeLimit }));
76
+ } }));
77
+ return {
78
+ onFilterClick,
79
+ filteringDialog,
80
+ };
81
+ }
82
+ exports.useHierarchyLevelFiltering = useHierarchyLevelFiltering;
83
+ function MatchingInstancesCount({ filter, defaultHierarchyLevelSizeLimit, hierarchyLevelDetails }) {
84
+ const { value } = (0, components_react_1.useDebouncedAsyncValue)((0, react_1.useCallback)(async () => {
85
+ const instanceFilter = toGenericFilter(filter);
86
+ try {
87
+ const instanceKeys = await collectInstanceKeys(hierarchyLevelDetails.getInstanceKeysIterator({
88
+ instanceFilter,
89
+ hierarchyLevelSizeLimit: hierarchyLevelDetails.sizeLimit ?? defaultHierarchyLevelSizeLimit,
90
+ }));
91
+ return TreeWidget_1.TreeWidget.translate("stateless.matchingInstancesCount", { count: instanceKeys.length });
92
+ }
93
+ catch (e) {
94
+ if (e instanceof presentation_hierarchies_1.RowsLimitExceededError) {
95
+ return TreeWidget_1.TreeWidget.translate("stateless.filterExceedsLimit", { limit: e.limit });
96
+ }
97
+ return TreeWidget_1.TreeWidget.translate("stateless.failedToCalculateMatchingInstances");
98
+ }
99
+ }, [filter, hierarchyLevelDetails, defaultHierarchyLevelSizeLimit]));
100
+ if (!value) {
101
+ return null;
102
+ }
103
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: value });
104
+ }
105
+ async function collectInstanceKeys(iterator) {
106
+ const inputKeys = [];
107
+ for await (const inputKey of iterator) {
108
+ inputKeys.push(inputKey);
109
+ }
110
+ return inputKeys;
111
+ }
112
+ function fromGenericFilter(descriptor, filter) {
113
+ const presentationFilter = presentation_hierarchies_1.GenericInstanceFilter.isFilterRuleGroup(filter.rules) && filter.rules.rules.length === 0
114
+ ? undefined
115
+ : presentation_components_1.PresentationInstanceFilter.fromGenericInstanceFilter(descriptor, filter);
116
+ return {
117
+ filter: presentationFilter,
118
+ usedClasses: (filter.filteredClassNames ?? [])
119
+ .map((name) => descriptor.selectClasses.find((selectClass) => selectClass.selectClassInfo.name === name)?.selectClassInfo)
120
+ .filter((classInfo) => classInfo !== undefined),
121
+ };
122
+ }
123
+ function toGenericFilter(filterInfo) {
124
+ if (!filterInfo) {
125
+ return undefined;
126
+ }
127
+ if (!filterInfo.filter) {
128
+ return filterInfo.usedClasses.length > 0
129
+ ? {
130
+ propertyClassNames: [],
131
+ relatedInstances: [],
132
+ filteredClassNames: filterInfo.usedClasses.map((info) => info.name),
133
+ rules: { operator: "and", rules: [] },
134
+ }
135
+ : undefined;
136
+ }
137
+ return presentation_components_1.PresentationInstanceFilter.toGenericInstanceFilter(filterInfo.filter, filterInfo.usedClasses);
138
+ }
139
+ //# sourceMappingURL=UseHierarchyFiltering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseHierarchyFiltering.js","sourceRoot":"","sources":["../../../../../../src/components/trees/stateless/common/UseHierarchyFiltering.tsx"],"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 { useCallback, useMemo, useState } from \"react\";\nimport { useDebouncedAsyncValue } from \"@itwin/components-react\";\nimport { DefaultContentDisplayTypes, KeySet } from \"@itwin/presentation-common\";\nimport { PresentationInstanceFilter, PresentationInstanceFilterDialog } from \"@itwin/presentation-components\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { GenericInstanceFilter, RowsLimitExceededError } from \"@itwin/presentation-hierarchies\";\nimport { TreeWidget } from \"../../../../TreeWidget\";\n\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { ClassInfo, Descriptor } from \"@itwin/presentation-common\";\nimport type { PresentationInstanceFilterInfo, PresentationInstanceFilterPropertiesSource } from \"@itwin/presentation-components\";\nimport type { HierarchyLevelDetails, useTree } from \"@itwin/presentation-hierarchies-react\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\n\ntype UseTreeResult = ReturnType<typeof useTree>;\n\ninterface UseHierarchyLevelFilteringOwnProps {\n imodel: IModelConnection;\n defaultHierarchyLevelSizeLimit: number;\n}\n\ntype UseHierarchyLevelFilteringProps = UseHierarchyLevelFilteringOwnProps & Pick<UseTreeResult, \"getHierarchyLevelDetails\">;\n\n/** @internal */\nexport function useHierarchyLevelFiltering({ imodel, defaultHierarchyLevelSizeLimit, getHierarchyLevelDetails }: UseHierarchyLevelFilteringProps) {\n const [filteringOptions, setFilteringOptions] = useState<{ nodeId: string | undefined; hierarchyDetails: HierarchyLevelDetails }>();\n const onFilterClick = useCallback(\n (nodeId: string | undefined) => {\n const hierarchyDetails = getHierarchyLevelDetails(nodeId);\n setFilteringOptions(hierarchyDetails ? { nodeId, hierarchyDetails } : undefined);\n },\n [getHierarchyLevelDetails],\n );\n\n const propertiesSource = useMemo<(() => Promise<PresentationInstanceFilterPropertiesSource>) | undefined>(() => {\n if (!filteringOptions) {\n return undefined;\n }\n\n return async () => {\n const inputKeys = await collectInstanceKeys(filteringOptions.hierarchyDetails.getInstanceKeysIterator());\n if (inputKeys.length === 0) {\n throw new Error(\"Hierarchy level is empty - unable to create content descriptor.\");\n }\n\n const descriptor = await Presentation.presentation.getContentDescriptor({\n imodel,\n rulesetOrId: {\n id: `Hierarchy level descriptor ruleset`,\n rules: [\n {\n ruleType: \"Content\",\n specifications: [\n {\n specType: \"SelectedNodeInstances\",\n },\n ],\n },\n ],\n },\n displayType: DefaultContentDisplayTypes.PropertyPane,\n keys: new KeySet(inputKeys),\n });\n if (!descriptor) {\n throw new Error(\"Failed to create content descriptor\");\n }\n\n return { descriptor, inputKeys };\n };\n }, [filteringOptions, imodel]);\n\n const getInitialFilter = useMemo(() => {\n const currentFilter = filteringOptions?.hierarchyDetails.instanceFilter;\n if (!currentFilter) {\n return undefined;\n }\n\n return (descriptor: Descriptor) => fromGenericFilter(descriptor, currentFilter);\n }, [filteringOptions]);\n\n const filteringDialog = (\n <PresentationInstanceFilterDialog\n imodel={imodel}\n isOpen={!!filteringOptions}\n onApply={(info) => {\n if (!filteringOptions) {\n return;\n }\n filteringOptions.hierarchyDetails.setInstanceFilter(toGenericFilter(info));\n setFilteringOptions(undefined);\n }}\n onClose={() => {\n setFilteringOptions(undefined);\n }}\n propertiesSource={propertiesSource}\n initialFilter={getInitialFilter}\n filterResultsCountRenderer={(filter) => {\n if (!filteringOptions) {\n return null;\n }\n\n return (\n <MatchingInstancesCount\n filter={filter}\n hierarchyLevelDetails={filteringOptions.hierarchyDetails}\n defaultHierarchyLevelSizeLimit={defaultHierarchyLevelSizeLimit}\n />\n );\n }}\n />\n );\n\n return {\n onFilterClick,\n filteringDialog,\n };\n}\n\ninterface MatchingInstancesCountProps {\n filter: PresentationInstanceFilterInfo;\n hierarchyLevelDetails: HierarchyLevelDetails;\n defaultHierarchyLevelSizeLimit: number;\n}\n\nfunction MatchingInstancesCount({ filter, defaultHierarchyLevelSizeLimit, hierarchyLevelDetails }: MatchingInstancesCountProps) {\n const { value } = useDebouncedAsyncValue(\n useCallback(async () => {\n const instanceFilter = toGenericFilter(filter);\n try {\n const instanceKeys = await collectInstanceKeys(\n hierarchyLevelDetails.getInstanceKeysIterator({\n instanceFilter,\n hierarchyLevelSizeLimit: hierarchyLevelDetails.sizeLimit ?? defaultHierarchyLevelSizeLimit,\n }),\n );\n return TreeWidget.translate(\"stateless.matchingInstancesCount\", { count: instanceKeys.length });\n } catch (e) {\n if (e instanceof RowsLimitExceededError) {\n return TreeWidget.translate(\"stateless.filterExceedsLimit\", { limit: e.limit });\n }\n return TreeWidget.translate(\"stateless.failedToCalculateMatchingInstances\");\n }\n }, [filter, hierarchyLevelDetails, defaultHierarchyLevelSizeLimit]),\n );\n\n if (!value) {\n return null;\n }\n\n return <>{value}</>;\n}\n\nasync function collectInstanceKeys(iterator: AsyncIterableIterator<InstanceKey>) {\n const inputKeys = [];\n for await (const inputKey of iterator) {\n inputKeys.push(inputKey);\n }\n return inputKeys;\n}\n\nfunction fromGenericFilter(descriptor: Descriptor, filter: GenericInstanceFilter): PresentationInstanceFilterInfo {\n const presentationFilter =\n GenericInstanceFilter.isFilterRuleGroup(filter.rules) && filter.rules.rules.length === 0\n ? undefined\n : PresentationInstanceFilter.fromGenericInstanceFilter(descriptor, filter);\n return {\n filter: presentationFilter,\n usedClasses: (filter.filteredClassNames ?? [])\n .map((name) => descriptor.selectClasses.find((selectClass) => selectClass.selectClassInfo.name === name)?.selectClassInfo)\n .filter((classInfo): classInfo is ClassInfo => classInfo !== undefined),\n };\n}\n\nfunction toGenericFilter(filterInfo?: PresentationInstanceFilterInfo): GenericInstanceFilter | undefined {\n if (!filterInfo) {\n return undefined;\n }\n\n if (!filterInfo.filter) {\n return filterInfo.usedClasses.length > 0\n ? {\n propertyClassNames: [],\n relatedInstances: [],\n filteredClassNames: filterInfo.usedClasses.map((info) => info.name),\n rules: { operator: \"and\", rules: [] },\n }\n : undefined;\n }\n\n return PresentationInstanceFilter.toGenericInstanceFilter(filterInfo.filter, filterInfo.usedClasses);\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { BeEvent } from "@itwin/core-bentley";
2
+ import type { HierarchyNode } from "@itwin/presentation-hierarchies";
3
+ import type { PresentationHierarchyNode } from "@itwin/presentation-hierarchies-react";
4
+ import type { VisibilityStatus } from "../../VisibilityTreeEventHandler";
5
+ interface HierarchyVisibilityHandler {
6
+ getVisibilityStatus: (node: HierarchyNode) => Promise<VisibilityStatus>;
7
+ changeVisibility: (node: HierarchyNode, on: boolean) => Promise<void>;
8
+ onVisibilityChange: BeEvent<() => void>;
9
+ dispose: () => void;
10
+ }
11
+ interface UseHierarchyVisibilityProps {
12
+ visibilityHandlerFactory: () => HierarchyVisibilityHandler;
13
+ }
14
+ interface UseHierarchyVisibilityResult {
15
+ onCheckboxClicked: (node: PresentationHierarchyNode, checked: boolean) => void;
16
+ getCheckboxStatus: (node: PresentationHierarchyNode) => VisibilityStatus;
17
+ }
18
+ /** @internal */
19
+ export declare function useHierarchyVisibility({ visibilityHandlerFactory }: UseHierarchyVisibilityProps): UseHierarchyVisibilityResult;
20
+ export {};
21
+ //# sourceMappingURL=UseHierarchyVisibility.d.ts.map
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.useHierarchyVisibility = void 0;
8
+ const react_1 = require("react");
9
+ const rxjs_1 = require("rxjs");
10
+ /** @internal */
11
+ function useHierarchyVisibility({ visibilityHandlerFactory }) {
12
+ const statusMap = (0, react_1.useRef)(new Map());
13
+ const [state, setState] = (0, react_1.useState)({
14
+ getCheckboxStatus: (_node) => ({ state: "hidden", isDisabled: true }),
15
+ onCheckboxClicked: (_node, _checked) => { },
16
+ });
17
+ (0, react_1.useEffect)(() => {
18
+ statusMap.current.clear();
19
+ const handler = visibilityHandlerFactory();
20
+ const visibilityChanged = new rxjs_1.Subject();
21
+ const calculate = new rxjs_1.Subject();
22
+ const calculateNodeStatus = (node) => {
23
+ calculate.next(node);
24
+ };
25
+ const subscription = calculate
26
+ .pipe((0, rxjs_1.distinct)(undefined, visibilityChanged), (0, rxjs_1.mergeMap)((node) => (0, rxjs_1.defer)(async () => ({ node, status: await handler.getVisibilityStatus(node.nodeData) })).pipe((0, rxjs_1.takeUntil)(visibilityChanged))))
27
+ .subscribe({
28
+ next: ({ node, status }) => {
29
+ statusMap.current.set(node.id, { node, status, needsRefresh: false });
30
+ setState((prev) => ({
31
+ ...prev,
32
+ getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus),
33
+ }));
34
+ },
35
+ });
36
+ const changeVisibility = (node, checked) => {
37
+ void handler.changeVisibility(node.nodeData, checked);
38
+ const status = statusMap.current.get(node.id);
39
+ if (!status) {
40
+ return;
41
+ }
42
+ status.status.state = checked ? "visible" : "hidden";
43
+ status.status.tooltip = undefined;
44
+ setState((prev) => ({ ...prev, getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus) }));
45
+ };
46
+ setState({
47
+ onCheckboxClicked: changeVisibility,
48
+ getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus),
49
+ });
50
+ const removeListener = handler.onVisibilityChange.addListener(() => {
51
+ statusMap.current.forEach((value) => {
52
+ value.needsRefresh = true;
53
+ });
54
+ visibilityChanged.next();
55
+ setState((prev) => ({
56
+ ...prev,
57
+ getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus),
58
+ }));
59
+ });
60
+ return () => {
61
+ subscription.unsubscribe();
62
+ removeListener();
63
+ handler.dispose();
64
+ };
65
+ }, [visibilityHandlerFactory]);
66
+ return state;
67
+ }
68
+ exports.useHierarchyVisibility = useHierarchyVisibility;
69
+ function createStatusGetter(map, calculateVisibility) {
70
+ return (node) => {
71
+ const status = map.current.get(node.id);
72
+ if (status === undefined) {
73
+ calculateVisibility(node);
74
+ return { state: "hidden", isDisabled: true };
75
+ }
76
+ if (status.needsRefresh) {
77
+ calculateVisibility(node);
78
+ }
79
+ return status.status;
80
+ };
81
+ }
82
+ //# sourceMappingURL=UseHierarchyVisibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseHierarchyVisibility.js","sourceRoot":"","sources":["../../../../../../src/components/trees/stateless/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 { defer, distinct, mergeMap, Subject, takeUntil } from \"rxjs\";\n\nimport type { MutableRefObject } from \"react\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport type { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { VisibilityStatus } from \"../../VisibilityTreeEventHandler\";\n\ninterface HierarchyVisibilityHandler {\n getVisibilityStatus: (node: HierarchyNode) => Promise<VisibilityStatus>;\n changeVisibility: (node: HierarchyNode, on: boolean) => Promise<void>;\n onVisibilityChange: BeEvent<() => void>;\n dispose: () => void;\n}\n\ninterface UseHierarchyVisibilityProps {\n visibilityHandlerFactory: () => HierarchyVisibilityHandler;\n}\n\ninterface UseHierarchyVisibilityResult {\n onCheckboxClicked: (node: PresentationHierarchyNode, checked: boolean) => void;\n getCheckboxStatus: (node: PresentationHierarchyNode) => VisibilityStatus;\n}\n\n/** @internal */\nexport function useHierarchyVisibility({ visibilityHandlerFactory }: UseHierarchyVisibilityProps): UseHierarchyVisibilityResult {\n const statusMap = useRef(new Map<string, { node: PresentationHierarchyNode; status: VisibilityStatus; needsRefresh: boolean }>());\n const [state, setState] = useState({\n getCheckboxStatus: (_node: PresentationHierarchyNode): VisibilityStatus => ({ state: \"hidden\", isDisabled: true }),\n onCheckboxClicked: (_node: PresentationHierarchyNode, _checked: boolean): void => {},\n });\n\n useEffect(() => {\n statusMap.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 subscription = calculate\n .pipe(\n distinct(undefined, visibilityChanged),\n mergeMap((node) => defer(async () => ({ node, status: await handler.getVisibilityStatus(node.nodeData) })).pipe(takeUntil(visibilityChanged))),\n )\n .subscribe({\n next: ({ node, status }) => {\n statusMap.current.set(node.id, { node, status, needsRefresh: false });\n setState((prev) => ({\n ...prev,\n getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus),\n }));\n },\n });\n\n const changeVisibility = (node: PresentationHierarchyNode, checked: boolean) => {\n void handler.changeVisibility(node.nodeData, checked);\n const status = statusMap.current.get(node.id);\n if (!status) {\n return;\n }\n status.status.state = checked ? \"visible\" : \"hidden\";\n status.status.tooltip = undefined;\n setState((prev) => ({ ...prev, getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus) }));\n };\n\n setState({\n onCheckboxClicked: changeVisibility,\n getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus),\n });\n\n const removeListener = handler.onVisibilityChange.addListener(() => {\n statusMap.current.forEach((value) => {\n value.needsRefresh = true;\n });\n\n visibilityChanged.next();\n setState((prev) => ({\n ...prev,\n getCheckboxStatus: createStatusGetter(statusMap, calculateNodeStatus),\n }));\n });\n\n return () => {\n subscription.unsubscribe();\n removeListener();\n handler.dispose();\n };\n }, [visibilityHandlerFactory]);\n\n return state;\n}\n\nfunction createStatusGetter(\n map: MutableRefObject<Map<string, { node: PresentationHierarchyNode; status: VisibilityStatus; needsRefresh: boolean }>>,\n calculateVisibility: (node: PresentationHierarchyNode) => void,\n) {\n return (node: PresentationHierarchyNode): VisibilityStatus => {\n const status = map.current.get(node.id);\n if (status === undefined) {\n calculateVisibility(node);\n return { state: \"hidden\", isDisabled: true };\n }\n if (status.needsRefresh) {\n calculateVisibility(node);\n }\n\n return status.status;\n };\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { PresentationHierarchyNode, PresentationTreeNode } from "@itwin/presentation-hierarchies-react";
2
+ interface UseMultiCheckboxHandlerProps {
3
+ rootNodes: PresentationTreeNode[] | undefined;
4
+ isNodeSelected: (nodeId: string) => boolean;
5
+ onClick: (node: PresentationHierarchyNode, checked: boolean) => void;
6
+ }
7
+ interface UseMultiCheckboxHandlerResult {
8
+ onCheckboxClicked: (node: PresentationHierarchyNode, checked: boolean) => void;
9
+ }
10
+ /** @internal */
11
+ export declare function useMultiCheckboxHandler({ rootNodes, isNodeSelected, onClick }: UseMultiCheckboxHandlerProps): UseMultiCheckboxHandlerResult;
12
+ export {};
13
+ //# sourceMappingURL=UseMultiCheckboxHandler.d.ts.map