@itwin/tree-widget-react 3.0.0-dev.2 → 3.0.0-dev.4

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 (276) hide show
  1. package/README.md +225 -1
  2. package/lib/cjs/components/SelectableTree.d.ts +12 -6
  3. package/lib/cjs/components/SelectableTree.js.map +1 -1
  4. package/lib/cjs/components/TreeSelector.d.ts +2 -2
  5. package/lib/cjs/components/TreeSelector.js.map +1 -1
  6. package/lib/cjs/components/TreeWidgetUiItemsProvider.d.ts +3 -2
  7. package/lib/cjs/components/TreeWidgetUiItemsProvider.js.map +1 -1
  8. package/lib/cjs/components/tree-header/TreeHeader.d.ts +11 -9
  9. package/lib/cjs/components/tree-header/TreeHeader.js +4 -6
  10. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -1
  11. package/lib/cjs/components/tree-header/TreeWithHeader.d.ts +13 -0
  12. package/lib/cjs/components/tree-header/TreeWithHeader.js +20 -0
  13. package/lib/cjs/components/tree-header/TreeWithHeader.js.map +1 -0
  14. package/lib/cjs/components/trees/categories-tree/CategoriesTree.d.ts +7 -10
  15. package/lib/cjs/components/trees/categories-tree/CategoriesTree.js +9 -66
  16. package/lib/cjs/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  17. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.d.ts +12 -5
  18. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.js +27 -7
  19. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  20. package/lib/cjs/components/trees/categories-tree/CategoriesTreeComponent.d.ts +4 -5
  21. package/lib/cjs/components/trees/categories-tree/CategoriesTreeComponent.js +17 -20
  22. package/lib/cjs/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  23. package/lib/cjs/components/trees/categories-tree/CategoriesVisibilityHandler.d.ts +1 -9
  24. package/lib/cjs/components/trees/categories-tree/CategoriesVisibilityHandler.js +2 -6
  25. package/lib/cjs/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +1 -1
  26. package/lib/cjs/components/trees/categories-tree/UseCategoriesTree.d.ts +25 -0
  27. package/lib/cjs/components/trees/categories-tree/UseCategoriesTree.js +89 -0
  28. package/lib/cjs/components/trees/categories-tree/UseCategoriesTree.js.map +1 -0
  29. package/lib/cjs/components/trees/common/CategoriesVisibilityUtils.d.ts +7 -11
  30. package/lib/cjs/components/trees/common/CategoriesVisibilityUtils.js +32 -83
  31. package/lib/cjs/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  32. package/lib/cjs/components/trees/common/FocusedInstancesContext.d.ts +0 -3
  33. package/lib/cjs/components/trees/common/FocusedInstancesContext.js +0 -2
  34. package/lib/cjs/components/trees/common/FocusedInstancesContext.js.map +1 -1
  35. package/lib/cjs/components/trees/common/FocusedInstancesContextProvider.d.ts +0 -1
  36. package/lib/cjs/components/trees/common/FocusedInstancesContextProvider.js +0 -1
  37. package/lib/cjs/components/trees/common/FocusedInstancesContextProvider.js.map +1 -1
  38. package/lib/cjs/components/trees/common/UseFiltering.d.ts +0 -1
  39. package/lib/cjs/components/trees/common/UseFiltering.js +0 -1
  40. package/lib/cjs/components/trees/common/UseFiltering.js.map +1 -1
  41. package/lib/cjs/components/trees/common/UseHierarchiesLocalization.d.ts +0 -1
  42. package/lib/cjs/components/trees/common/UseHierarchiesLocalization.js +0 -1
  43. package/lib/cjs/components/trees/common/UseHierarchiesLocalization.js.map +1 -1
  44. package/lib/cjs/components/trees/common/UseHierarchyFiltering.d.ts +1 -7
  45. package/lib/cjs/components/trees/common/UseHierarchyFiltering.js +4 -3
  46. package/lib/cjs/components/trees/common/UseHierarchyFiltering.js.map +1 -1
  47. package/lib/cjs/components/trees/common/UseHierarchyVisibility.d.ts +15 -10
  48. package/lib/cjs/components/trees/common/UseHierarchyVisibility.js +20 -17
  49. package/lib/cjs/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  50. package/lib/cjs/components/trees/common/UseIModelChangeListener.d.ts +0 -1
  51. package/lib/cjs/components/trees/common/UseIModelChangeListener.js +0 -1
  52. package/lib/cjs/components/trees/common/UseIModelChangeListener.js.map +1 -1
  53. package/lib/cjs/components/trees/common/UseMultiCheckboxHandler.d.ts +0 -1
  54. package/lib/cjs/components/trees/common/UseMultiCheckboxHandler.js +0 -1
  55. package/lib/cjs/components/trees/common/UseMultiCheckboxHandler.js.map +1 -1
  56. package/lib/cjs/components/trees/common/UseNodeHighlighting.d.ts +9 -5
  57. package/lib/cjs/components/trees/common/UseNodeHighlighting.js +15 -24
  58. package/lib/cjs/components/trees/common/UseNodeHighlighting.js.map +1 -1
  59. package/lib/cjs/components/trees/common/UseTelemetryContext.d.ts +29 -0
  60. package/lib/cjs/components/trees/common/UseTelemetryContext.js +49 -0
  61. package/lib/cjs/components/trees/common/UseTelemetryContext.js.map +1 -0
  62. package/lib/cjs/components/trees/common/Utils.d.ts +3 -0
  63. package/lib/cjs/components/trees/common/Utils.js +11 -1
  64. package/lib/cjs/components/trees/common/Utils.js.map +1 -1
  65. package/lib/cjs/components/trees/common/components/Delayed.d.ts +0 -1
  66. package/lib/cjs/components/trees/common/components/Delayed.js +0 -1
  67. package/lib/cjs/components/trees/common/components/Delayed.js.map +1 -1
  68. package/lib/cjs/components/trees/common/components/ProgressOverlay.d.ts +0 -1
  69. package/lib/cjs/components/trees/common/components/ProgressOverlay.js +0 -1
  70. package/lib/cjs/components/trees/common/components/ProgressOverlay.js.map +1 -1
  71. package/lib/cjs/components/trees/common/components/Tree.d.ts +52 -0
  72. package/lib/cjs/components/trees/common/components/{BaseTree.js → Tree.js} +27 -23
  73. package/lib/cjs/components/trees/common/components/Tree.js.map +1 -0
  74. package/lib/cjs/components/trees/common/components/TreeNodeCheckbox.d.ts +14 -7
  75. package/lib/cjs/components/trees/common/components/TreeNodeCheckbox.js.map +1 -1
  76. package/lib/cjs/components/trees/common/components/TreeNodeRenderer.d.ts +7 -6
  77. package/lib/cjs/components/trees/common/components/TreeNodeRenderer.js +1 -1
  78. package/lib/cjs/components/trees/common/components/TreeNodeRenderer.js.map +1 -1
  79. package/lib/cjs/components/trees/common/components/TreeRenderer.d.ts +11 -1
  80. package/lib/cjs/components/trees/common/components/TreeRenderer.js +4 -1
  81. package/lib/cjs/components/trees/common/components/TreeRenderer.js.map +1 -1
  82. package/lib/cjs/components/trees/common/components/VisibilityTree.d.ts +27 -10
  83. package/lib/cjs/components/trees/common/components/VisibilityTree.js +8 -23
  84. package/lib/cjs/components/trees/common/components/VisibilityTree.js.map +1 -1
  85. package/lib/cjs/components/trees/common/components/VisibilityTreeRenderer.d.ts +12 -0
  86. package/lib/cjs/components/trees/common/components/VisibilityTreeRenderer.js +26 -0
  87. package/lib/cjs/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -0
  88. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +8 -7
  89. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js +7 -10
  90. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  91. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +5 -5
  92. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +3 -4
  93. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  94. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.d.ts +8 -7
  95. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js +9 -12
  96. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  97. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +5 -5
  98. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js +3 -4
  99. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  100. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  101. package/lib/cjs/components/trees/index.d.ts +11 -0
  102. package/lib/cjs/components/trees/index.js +19 -1
  103. package/lib/cjs/components/trees/index.js.map +1 -1
  104. package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +10 -9
  105. package/lib/cjs/components/trees/models-tree/ModelsTree.js +6 -206
  106. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  107. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.d.ts +19 -8
  108. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js +31 -8
  109. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  110. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +11 -6
  111. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +33 -34
  112. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  113. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.d.ts +9 -5
  114. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  115. package/lib/cjs/components/trees/models-tree/UseModelsTree.d.ts +29 -0
  116. package/lib/cjs/components/trees/models-tree/UseModelsTree.js +233 -0
  117. package/lib/cjs/components/trees/models-tree/UseModelsTree.js.map +1 -0
  118. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +11 -3
  119. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +1 -1
  120. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  121. package/lib/cjs/tree-widget-react.d.ts +2 -1
  122. package/lib/cjs/tree-widget-react.js +3 -1
  123. package/lib/cjs/tree-widget-react.js.map +1 -1
  124. package/lib/esm/components/SelectableTree.d.ts +12 -6
  125. package/lib/esm/components/SelectableTree.js.map +1 -1
  126. package/lib/esm/components/TreeSelector.d.ts +2 -2
  127. package/lib/esm/components/TreeSelector.js.map +1 -1
  128. package/lib/esm/components/TreeWidgetUiItemsProvider.d.ts +3 -2
  129. package/lib/esm/components/TreeWidgetUiItemsProvider.js.map +1 -1
  130. package/lib/esm/components/tree-header/TreeHeader.d.ts +11 -9
  131. package/lib/esm/components/tree-header/TreeHeader.js +4 -6
  132. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -1
  133. package/lib/esm/components/tree-header/TreeWithHeader.d.ts +13 -0
  134. package/lib/esm/components/tree-header/TreeWithHeader.js +13 -0
  135. package/lib/esm/components/tree-header/TreeWithHeader.js.map +1 -0
  136. package/lib/esm/components/trees/categories-tree/CategoriesTree.d.ts +7 -10
  137. package/lib/esm/components/trees/categories-tree/CategoriesTree.js +9 -66
  138. package/lib/esm/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  139. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.d.ts +12 -5
  140. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.js +25 -7
  141. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  142. package/lib/esm/components/trees/categories-tree/CategoriesTreeComponent.d.ts +4 -5
  143. package/lib/esm/components/trees/categories-tree/CategoriesTreeComponent.js +18 -18
  144. package/lib/esm/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  145. package/lib/esm/components/trees/categories-tree/CategoriesVisibilityHandler.d.ts +1 -9
  146. package/lib/esm/components/trees/categories-tree/CategoriesVisibilityHandler.js +2 -6
  147. package/lib/esm/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +1 -1
  148. package/lib/esm/components/trees/categories-tree/UseCategoriesTree.d.ts +25 -0
  149. package/lib/esm/components/trees/categories-tree/UseCategoriesTree.js +85 -0
  150. package/lib/esm/components/trees/categories-tree/UseCategoriesTree.js.map +1 -0
  151. package/lib/esm/components/trees/common/CategoriesVisibilityUtils.d.ts +7 -11
  152. package/lib/esm/components/trees/common/CategoriesVisibilityUtils.js +33 -84
  153. package/lib/esm/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  154. package/lib/esm/components/trees/common/FocusedInstancesContext.d.ts +0 -3
  155. package/lib/esm/components/trees/common/FocusedInstancesContext.js +0 -2
  156. package/lib/esm/components/trees/common/FocusedInstancesContext.js.map +1 -1
  157. package/lib/esm/components/trees/common/FocusedInstancesContextProvider.d.ts +0 -1
  158. package/lib/esm/components/trees/common/FocusedInstancesContextProvider.js +0 -1
  159. package/lib/esm/components/trees/common/FocusedInstancesContextProvider.js.map +1 -1
  160. package/lib/esm/components/trees/common/UseFiltering.d.ts +0 -1
  161. package/lib/esm/components/trees/common/UseFiltering.js +0 -1
  162. package/lib/esm/components/trees/common/UseFiltering.js.map +1 -1
  163. package/lib/esm/components/trees/common/UseHierarchiesLocalization.d.ts +0 -1
  164. package/lib/esm/components/trees/common/UseHierarchiesLocalization.js +0 -1
  165. package/lib/esm/components/trees/common/UseHierarchiesLocalization.js.map +1 -1
  166. package/lib/esm/components/trees/common/UseHierarchyFiltering.d.ts +1 -7
  167. package/lib/esm/components/trees/common/UseHierarchyFiltering.js +4 -3
  168. package/lib/esm/components/trees/common/UseHierarchyFiltering.js.map +1 -1
  169. package/lib/esm/components/trees/common/UseHierarchyVisibility.d.ts +15 -10
  170. package/lib/esm/components/trees/common/UseHierarchyVisibility.js +20 -17
  171. package/lib/esm/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  172. package/lib/esm/components/trees/common/UseIModelChangeListener.d.ts +0 -1
  173. package/lib/esm/components/trees/common/UseIModelChangeListener.js +0 -1
  174. package/lib/esm/components/trees/common/UseIModelChangeListener.js.map +1 -1
  175. package/lib/esm/components/trees/common/UseMultiCheckboxHandler.d.ts +0 -1
  176. package/lib/esm/components/trees/common/UseMultiCheckboxHandler.js +0 -1
  177. package/lib/esm/components/trees/common/UseMultiCheckboxHandler.js.map +1 -1
  178. package/lib/esm/components/trees/common/UseNodeHighlighting.d.ts +9 -5
  179. package/lib/esm/components/trees/common/UseNodeHighlighting.js +14 -23
  180. package/lib/esm/components/trees/common/UseNodeHighlighting.js.map +1 -1
  181. package/lib/esm/components/trees/common/UseTelemetryContext.d.ts +29 -0
  182. package/lib/esm/components/trees/common/UseTelemetryContext.js +43 -0
  183. package/lib/esm/components/trees/common/UseTelemetryContext.js.map +1 -0
  184. package/lib/esm/components/trees/common/Utils.d.ts +3 -0
  185. package/lib/esm/components/trees/common/Utils.js +9 -0
  186. package/lib/esm/components/trees/common/Utils.js.map +1 -1
  187. package/lib/esm/components/trees/common/components/Delayed.d.ts +0 -1
  188. package/lib/esm/components/trees/common/components/Delayed.js +0 -1
  189. package/lib/esm/components/trees/common/components/Delayed.js.map +1 -1
  190. package/lib/esm/components/trees/common/components/ProgressOverlay.d.ts +0 -1
  191. package/lib/esm/components/trees/common/components/ProgressOverlay.js +0 -1
  192. package/lib/esm/components/trees/common/components/ProgressOverlay.js.map +1 -1
  193. package/lib/esm/components/trees/common/components/Tree.d.ts +52 -0
  194. package/lib/esm/components/trees/common/components/{BaseTree.js → Tree.js} +26 -22
  195. package/lib/esm/components/trees/common/components/Tree.js.map +1 -0
  196. package/lib/esm/components/trees/common/components/TreeNodeCheckbox.d.ts +14 -7
  197. package/lib/esm/components/trees/common/components/TreeNodeCheckbox.js.map +1 -1
  198. package/lib/esm/components/trees/common/components/TreeNodeRenderer.d.ts +7 -6
  199. package/lib/esm/components/trees/common/components/TreeNodeRenderer.js +1 -1
  200. package/lib/esm/components/trees/common/components/TreeNodeRenderer.js.map +1 -1
  201. package/lib/esm/components/trees/common/components/TreeRenderer.d.ts +11 -1
  202. package/lib/esm/components/trees/common/components/TreeRenderer.js +4 -1
  203. package/lib/esm/components/trees/common/components/TreeRenderer.js.map +1 -1
  204. package/lib/esm/components/trees/common/components/VisibilityTree.d.ts +27 -10
  205. package/lib/esm/components/trees/common/components/VisibilityTree.js +8 -23
  206. package/lib/esm/components/trees/common/components/VisibilityTree.js.map +1 -1
  207. package/lib/esm/components/trees/common/components/VisibilityTreeRenderer.d.ts +12 -0
  208. package/lib/esm/components/trees/common/components/VisibilityTreeRenderer.js +22 -0
  209. package/lib/esm/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -0
  210. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +8 -7
  211. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js +7 -10
  212. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  213. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +5 -5
  214. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +3 -4
  215. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  216. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.d.ts +8 -7
  217. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js +9 -12
  218. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  219. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +5 -5
  220. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js +3 -4
  221. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  222. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  223. package/lib/esm/components/trees/index.d.ts +11 -0
  224. package/lib/esm/components/trees/index.js +9 -0
  225. package/lib/esm/components/trees/index.js.map +1 -1
  226. package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +10 -9
  227. package/lib/esm/components/trees/models-tree/ModelsTree.js +7 -207
  228. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  229. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.d.ts +19 -8
  230. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js +30 -8
  231. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  232. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +11 -6
  233. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +35 -33
  234. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  235. package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.d.ts +9 -5
  236. package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  237. package/lib/esm/components/trees/models-tree/UseModelsTree.d.ts +29 -0
  238. package/lib/esm/components/trees/models-tree/UseModelsTree.js +229 -0
  239. package/lib/esm/components/trees/models-tree/UseModelsTree.js.map +1 -0
  240. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +11 -3
  241. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +2 -2
  242. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  243. package/lib/esm/tree-widget-react.d.ts +2 -1
  244. package/lib/esm/tree-widget-react.js +1 -0
  245. package/lib/esm/tree-widget-react.js.map +1 -1
  246. package/package.json +12 -16
  247. package/lib/cjs/components/trees/categories-tree/UseCategories.d.ts +0 -8
  248. package/lib/cjs/components/trees/categories-tree/UseCategories.js +0 -22
  249. package/lib/cjs/components/trees/categories-tree/UseCategories.js.map +0 -1
  250. package/lib/cjs/components/trees/common/UseFeatureReporting.d.ts +0 -34
  251. package/lib/cjs/components/trees/common/UseFeatureReporting.js +0 -39
  252. package/lib/cjs/components/trees/common/UseFeatureReporting.js.map +0 -1
  253. package/lib/cjs/components/trees/common/UsePerformanceReporting.d.ts +0 -18
  254. package/lib/cjs/components/trees/common/UsePerformanceReporting.js +0 -25
  255. package/lib/cjs/components/trees/common/UsePerformanceReporting.js.map +0 -1
  256. package/lib/cjs/components/trees/common/components/BaseTree.d.ts +0 -34
  257. package/lib/cjs/components/trees/common/components/BaseTree.js.map +0 -1
  258. package/lib/cjs/components/utils/AutoSizer.d.ts +0 -13
  259. package/lib/cjs/components/utils/AutoSizer.js +0 -21
  260. package/lib/cjs/components/utils/AutoSizer.js.map +0 -1
  261. package/lib/esm/components/trees/categories-tree/UseCategories.d.ts +0 -8
  262. package/lib/esm/components/trees/categories-tree/UseCategories.js +0 -18
  263. package/lib/esm/components/trees/categories-tree/UseCategories.js.map +0 -1
  264. package/lib/esm/components/trees/common/UseFeatureReporting.d.ts +0 -34
  265. package/lib/esm/components/trees/common/UseFeatureReporting.js +0 -34
  266. package/lib/esm/components/trees/common/UseFeatureReporting.js.map +0 -1
  267. package/lib/esm/components/trees/common/UsePerformanceReporting.d.ts +0 -18
  268. package/lib/esm/components/trees/common/UsePerformanceReporting.js +0 -21
  269. package/lib/esm/components/trees/common/UsePerformanceReporting.js.map +0 -1
  270. package/lib/esm/components/trees/common/components/BaseTree.d.ts +0 -34
  271. package/lib/esm/components/trees/common/components/BaseTree.js.map +0 -1
  272. package/lib/esm/components/utils/AutoSizer.d.ts +0 -13
  273. package/lib/esm/components/utils/AutoSizer.js +0 -17
  274. package/lib/esm/components/utils/AutoSizer.js.map +0 -1
  275. /package/lib/cjs/components/{trees/Tree.scss → tree-header/TreeWithHeader.scss} +0 -0
  276. /package/lib/esm/components/{trees/Tree.scss → tree-header/TreeWithHeader.scss} +0 -0
package/README.md CHANGED
@@ -144,6 +144,7 @@ Available header buttons:
144
144
  - `ModelsTreeComponent.InvertButton` inverts display of all models.
145
145
  - `ModelsTreeComponent.View2DButton` toggles plan projection models' display.
146
146
  - `ModelsTreeComponent.View3DButton` toggles non-plan projection models' display.
147
+ - `ModelsTreeComponent.ToggleInstancesFocusButton` enables/disables instances focusing mode.
147
148
 
148
149
  #### Focus mode
149
150
 
@@ -151,6 +152,48 @@ The Models tree can be used in a "focus mode" where the tree is automatically fi
151
152
 
152
153
  ![Models tree focus mode demo](./media/models-tree-focus-mode.gif)
153
154
 
155
+ #### Custom models tree
156
+
157
+ This package provides building blocks for custom models tree:
158
+
159
+ - `useModelsTree` - hook for creating and managing models tree state.
160
+ - `useModelsTreeButtonProps` - hook for creating props for models tree buttons.
161
+
162
+ Example:
163
+
164
+ ```tsx
165
+ function CustomModelsTreeComponent({ imodel, viewport, getSchemaContext, selectionStorage }: CustomModelsTreeProps) {
166
+ const buttonProps = useModelsTreeButtonProps({ imodel, viewport });
167
+ const { modelsTreeProps, rendererProps } = useModelsTree({ activeView: viewport });
168
+
169
+ return (
170
+ <TreeWithHeader buttons={[<ModelsTreeComponent.ShowAllButton {...buttonProps} />, <ModelsTreeComponent.HideAllButton {...buttonProps} />]}>
171
+ <VisibilityTree
172
+ {...modelsTreeProps}
173
+ getSchemaContext={getSchemaContext}
174
+ selectionStorage={selectionStorage}
175
+ imodel={imodel}
176
+ treeRenderer={(props) => <CustomModelsTreeRenderer {...props} {...rendererProps} />}
177
+ />
178
+ </TreeWithHeader>
179
+ );
180
+ }
181
+
182
+ type VisibilityTreeRendererProps = ComponentPropsWithoutRef<typeof VisibilityTreeRenderer>;
183
+ type CustomModelsTreeRendererProps = Parameters<ComponentPropsWithoutRef<typeof VisibilityTree>["treeRenderer"]>[0];
184
+
185
+ function CustomModelsTreeRenderer(props: CustomModelsTreeRendererProps) {
186
+ const getLabel = useCallback<Required<VisibilityTreeRendererProps>["getLabel"]>(
187
+ (node) => {
188
+ const originalLabel = props.getLabel(node);
189
+ return <>Custom node - {originalLabel}</>;
190
+ },
191
+ [props.getLabel],
192
+ );
193
+ return <VisibilityTreeRenderer {...props} getLabel={getLabel} getSublabel={getSublabel} />;
194
+ }
195
+ ```
196
+
154
197
  ### Categories tree
155
198
 
156
199
  The component, based on the active view, renders a hierarchy of either spatial (3d) or drawing (2d) categories. The hierarchy consists of two levels - the category (spatial or drawing) and its sub-categories. There's also a header that renders categories search box and various visibility control buttons.
@@ -199,6 +242,53 @@ Available header buttons:
199
242
  - `ModelsTreeComponent.HideAllButton` makes all categories hidden.
200
243
  - `ModelsTreeComponent.InvertButton` inverts display of all categories.
201
244
 
245
+ #### Custom categories tree
246
+
247
+ This package provides building blocks for custom categories tree:
248
+
249
+ - `useCategoriesTree` - hook for creating and managing categories tree state.
250
+ - `useCategoriesTreeButtonProps` - hook for creating props for categories tree buttons.
251
+
252
+ Example:
253
+
254
+ ```tsx
255
+ function CustomCategoriesTreeComponent({ imodel, viewport, getSchemaContext, selectionStorage }: CustomCategoriesTreeProps) {
256
+ const buttonProps = useCategoriesTreeButtonProps({ imodel, viewport });
257
+ const { categoriesTreeProps, rendererProps } = useCategoriesTree({ activeView: viewport });
258
+
259
+ return (
260
+ <TreeWithHeader buttons={[<CategoriesTreeComponent.ShowAllButton {...buttonProps} />, <CategoriesTreeComponent.HideAllButton {...buttonProps} />]}>
261
+ <VisibilityTree
262
+ {...categoriesTreeProps}
263
+ getSchemaContext={getSchemaContext}
264
+ selectionStorage={selectionStorage}
265
+ imodel={imodel}
266
+ treeRenderer={(props) => <CustomCategoriesTreeRenderer {...props} {...rendererProps} />}
267
+ />
268
+ </TreeWithHeader>
269
+ );
270
+ }
271
+
272
+ type VisibilityTreeRendererProps = ComponentPropsWithoutRef<typeof VisibilityTreeRenderer>;
273
+ type CustomCategoriesTreeRendererProps = Parameters<ComponentPropsWithoutRef<typeof VisibilityTree>["treeRenderer"]>[0];
274
+
275
+ function CustomCategoriesTreeRenderer(props: CustomCategoriesTreeRendererProps) {
276
+ const getLabel = useCallback<Required<VisibilityTreeRendererProps>["getLabel"]>(
277
+ (node) => {
278
+ const originalLabel = props.getLabel(node);
279
+ return <>Custom node - {originalLabel}</>;
280
+ },
281
+ [props.getLabel],
282
+ );
283
+
284
+ const getSublabel = useCallback<Required<VisibilityTreeRendererProps>["getSublabel"]>(() => {
285
+ return <>Custom sub label</>;
286
+ }, []);
287
+
288
+ return <VisibilityTreeRenderer {...props} getLabel={getLabel} getSublabel={getSublabel} />;
289
+ }
290
+ ```
291
+
202
292
  ### iModel content tree
203
293
 
204
294
  The component renders a similar hierarchy to [Models tree](#models-tree), but with the following changes:
@@ -243,6 +333,114 @@ function MyWidget() {
243
333
  }
244
334
  ```
245
335
 
336
+ ### Custom trees
337
+
338
+ The package delivers a set of building blocks for creating trees that look and feel similar to the tree components provided by this package.
339
+
340
+ #### Custom basic tree
341
+
342
+ A "basic" tree is a tree that renders the hierarchy without visibility control - see [iModel content tree](#imodel-content-tree) for an example. Core components:
343
+
344
+ - `Tree` - component that manages tree state, selection and filtering.
345
+ - `TreeRenderer` - default renderer for tree data.
346
+
347
+ Example:
348
+
349
+ ```tsx
350
+ import { ComponentPropsWithoutRef } from "react";
351
+ import { IModelConnection } from "@itwin/core-frontend";
352
+ import { SchemaContext } from "@itwin/ecschema-metadata";
353
+ import { SelectionStorage } from "@itwin/unified-selection";
354
+ import { Tree, TreeRenderer } from "@itwin/tree-widget-react";
355
+
356
+
357
+ function getUnifiedSelectionStorage(): SelectionStorage {
358
+ // see "Creating unified selection storage" section for example implementation
359
+ }
360
+
361
+ function getSchemaContext(imodel: IModelConnection): SchemaContext {
362
+ // see "Creating schema context" section for example implementation
363
+ }
364
+
365
+ type TreeProps = ComponentPropsWithoutRef<typeof Tree>;
366
+ const getHierarchyDefinition: TreeProps["getHierarchyDefinition"] = ({ imodelAccess }) => {
367
+ // create a hierarchy definition that defines what should be shown in the tree
368
+ // see https://github.com/iTwin/presentation/blob/master/packages/hierarchies/README.md#hierarchy-definition
369
+ }
370
+
371
+ function MyTree({ imodel }: MyTreeProps) {
372
+ return <Tree
373
+ treeName="MyTree"
374
+ imodel={imodel}
375
+ selectionStorage={getUnifiedSelectionStorage()}
376
+ getSchemaContext={getSchemaContext}
377
+ getHierarchyDefinition={getHierarchyDefinition}
378
+ treeRenderer={(props) => <TreeRenderer {...props} />}
379
+ />;
380
+ }
381
+ ```
382
+
383
+ #### Custom visibility tree
384
+
385
+ A visibility tree is a tree that renders the hierarchy and allows controlling visibility control through the use of "eye" checkboxes - see [Models](#models-tree) and [Categories](#categories-tree) trees. Core components:
386
+
387
+ - `VisibilityTree` - same as `Tree` component but additionally manages visibility of instances represented by tree nodes.
388
+ - `VisibilityTreeRenderer` - same as `TreeRenderer` but additionally renders checkboxes for visibility control.
389
+
390
+ Example:
391
+
392
+ ```tsx
393
+ import { ComponentPropsWithoutRef } from "react";
394
+ import { BeEvent } from "@itwin/core-bentley";
395
+ import { IModelConnection } from "@itwin/core-frontend";
396
+ import { SchemaContext } from "@itwin/ecschema-metadata";
397
+ import { SelectionStorage } from "@itwin/unified-selection";
398
+ import { VisibilityTree, VisibilityTreeRenderer } from "@itwin/tree-widget-react";
399
+
400
+
401
+ function getUnifiedSelectionStorage(): SelectionStorage {
402
+ // see "Creating unified selection storage" section for example implementation
403
+ }
404
+
405
+ function getSchemaContext(imodel: IModelConnection): SchemaContext {
406
+ // see "Creating schema context" section for example implementation
407
+ }
408
+
409
+ type VisibilityTreeProps = ComponentPropsWithoutRef<typeof VisibilityTree>;
410
+ const getHierarchyDefinition: VisibilityTreeProps["getHierarchyDefinition"] = ({ imodelAccess }) => {
411
+ // create a hierarchy definition that defines what should be shown in the tree
412
+ // see https://github.com/iTwin/presentation/blob/master/packages/hierarchies/README.md#hierarchy-definition
413
+ }
414
+
415
+ const visibilityHandlerFactory: VisibilityTreeProps["visibilityHandlerFactory"] = ({ imodelAccess }) => {
416
+ return {
417
+ // event that can be used to notify tree when visibility of instances represented by tree nodes changes from outside.
418
+ onVisibilityChange: new BeEvent(),
419
+ async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {
420
+ // determine visibility status of the instance represented by tree node.
421
+ },
422
+ async changeVisibility(node: HierarchyNode, on: boolean): Promise<void> {
423
+ // change visibility of the instance represented by tree node.
424
+ },
425
+ dispose() {
426
+ // if necessary, do some clean up before new visibility handler is created or component is unmounted.
427
+ },
428
+ };
429
+ }
430
+
431
+ function MyVisibilityTree({ imodel }: MyVisibilityTreeProps) {
432
+ return <VisibilityTree
433
+ treeName="MyVisibilityTree"
434
+ imodel={imodel}
435
+ selectionStorage={getUnifiedSelectionStorage()}
436
+ getSchemaContext={getSchemaContext}
437
+ getHierarchyDefinition={getHierarchyDefinition}
438
+ visibilityHandlerFactory={visibilityFactory}
439
+ treeRenderer={(props) => <VisibilityTreeRenderer {...props} />}
440
+ />;
441
+ }
442
+ ```
443
+
246
444
  ### Hierarchy level size limiting
247
445
 
248
446
  All tree components in this package enforce a hierarchy level size limit. This means that when a node is expanded, only a certain number of child nodes are loaded. The limit is enforced to prevent loading too many nodes at once and to keep the performance of the tree components at an acceptable level.
@@ -340,6 +538,8 @@ This can be achieved by passing `onFeatureUsed` function to `CategoriesTreeCompo
340
538
  - `"choose-{tree}"` - when a tree is selected in the tree selector.
341
539
  - `"use-{tree}"` - when an interaction with a tree hierarchy happens. This includes any kind of interaction with nodes, including them being expanded/collapsed, selected, filtered, their visibility change, etc.
342
540
  - `"{tree}-visibility-change"` - when visibility is toggled using an "eye" button.
541
+ - `"{tree}-error-timeout"` - when a request timeouts while loading hierarchy or filtering.
542
+ - `"{tree}-error-unknown"` - when an unknown error occurs while loading hierarchy or filtering.
343
543
  - `"models-tree-showall"` - when "Show All" button is used in `ModelsTreeComponent`.
344
544
  - `"models-tree-hideall"` - when "Hide All" button is used in `ModelsTreeComponent`.
345
545
  - `"models-tree-invert"` - when "Invert" button is used in `ModelsTreeComponent`.
@@ -376,7 +576,7 @@ UiItemsManager.register(
376
576
 
377
577
  For individual tree components the callbacks should be supplied through props:
378
578
 
379
- ```ts
579
+ ```tsx
380
580
  import { ModelsTreeComponent } from "@itwin/tree-widget-react";
381
581
 
382
582
  function MyWidget() {
@@ -393,3 +593,27 @@ function MyWidget() {
393
593
  );
394
594
  }
395
595
  ```
596
+
597
+ For custom tree components `TelemetryContextProvider` should be used:
598
+
599
+ ```tsx
600
+ import { TelemetryContextProvider } from "@itwin/tree-widget-react";
601
+
602
+ function MyWidget() {
603
+ return <TelemetryContextProvider
604
+ componentIdentifier="MyTree"
605
+ onPerformanceMeasured={(feature, elapsedTime) => {
606
+ console.log(`TreeWidget [${feature}] took ${elapsedTime} ms`)
607
+ }}
608
+ onFeatureUsed={(feature) => {
609
+ console.log(`TreeWidget [${feature}] used`)
610
+ }}
611
+ >
612
+ <MyTree />
613
+ </TelemetryContextProvider>;
614
+ }
615
+
616
+ function MyTree() {
617
+ // see "Custom trees" section for example implementation
618
+ }
619
+ ```
@@ -1,8 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import "./SelectableTree.scss";
3
3
  import type { IModelConnection } from "@itwin/core-frontend";
4
- /** Props for rendering trees */
5
- export interface TreeRenderProps {
4
+ /**
5
+ * Props for rendering trees
6
+ * @public
7
+ */
8
+ export interface SelectableTreeRenderProps {
6
9
  density?: "enlarged" | "default";
7
10
  onPerformanceMeasured?: (featureId: string, elapsedTime: number) => void;
8
11
  onFeatureUsed?: (feature: string) => void;
@@ -11,13 +14,13 @@ export interface TreeRenderProps {
11
14
  * Definition of a tree component displayed in `SelectableTree`.
12
15
  * @public
13
16
  */
14
- export interface TreeDefinition {
17
+ export interface SelectableTreeDefinition {
15
18
  /** Id of the tree */
16
19
  id: string;
17
20
  /** Callback that is used to get tree label */
18
21
  getLabel: () => string;
19
22
  /** Callback that is used to render tree component */
20
- render: (props: TreeRenderProps) => React.ReactNode;
23
+ render: (props: SelectableTreeRenderProps) => React.ReactNode;
21
24
  /**
22
25
  * Callback that is used to determine if tree should be shown for current active iModel connection.
23
26
  * If callback is `undefined` tree is shown for all iModel connections.
@@ -26,9 +29,12 @@ export interface TreeDefinition {
26
29
  /** Icon to render before tree label in tree selector */
27
30
  startIcon?: React.ReactNode;
28
31
  }
29
- /** Props for `SelectableTree` */
32
+ /**
33
+ * Props for `SelectableTree`
34
+ * @public
35
+ */
30
36
  export interface SelectableTreeProps {
31
- trees: TreeDefinition[];
37
+ trees: SelectableTreeDefinition[];
32
38
  density?: "enlarged" | "default";
33
39
  onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;
34
40
  onFeatureUsed?: (feature: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"SelectableTree.js","sourceRoot":"","sources":["../../../src/components/SelectableTree.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 \"./SelectableTree.scss\";\nimport { useEffect, useState } from \"react\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { FillCentered } from \"@itwin/core-react\";\nimport { ProgressLinear } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../TreeWidget\";\nimport { TreeSelector } from \"./TreeSelector\";\n\nimport type { PropsWithChildren } from \"react\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { TreeContentDefinition, TreeSelectorProps } from \"./TreeSelector\";\n\n/** Props for rendering trees */\nexport interface TreeRenderProps {\n density?: \"enlarged\" | \"default\";\n onPerformanceMeasured?: (featureId: string, elapsedTime: number) => void;\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * Definition of a tree component displayed in `SelectableTree`.\n * @public\n */\nexport interface TreeDefinition {\n /** Id of the tree */\n id: string;\n /** Callback that is used to get tree label */\n getLabel: () => string;\n /** Callback that is used to render tree component */\n render: (props: TreeRenderProps) => React.ReactNode;\n /**\n * Callback that is used to determine if tree should be shown for current active iModel connection.\n * If callback is `undefined` tree is shown for all iModel connections.\n */\n shouldShow?: (imodel: IModelConnection) => Promise<boolean>;\n /** Icon to render before tree label in tree selector */\n startIcon?: React.ReactNode;\n}\n\n/** Props for `SelectableTree` */\nexport interface SelectableTreeProps {\n trees: TreeDefinition[];\n density?: \"enlarged\" | \"default\";\n onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * A component that renders a tree (combo box) selector and the selected tree component.\n * @public\n */\nexport function SelectableTree(props: SelectableTreeProps) {\n const imodel = useActiveIModelConnection();\n if (!imodel) {\n return null;\n }\n return <SelectableTreeContent {...props} imodel={imodel} />;\n}\n\nfunction SelectableTreeContent(props: SelectableTreeProps & { imodel: IModelConnection }) {\n const { trees: treeDefinitions, imodel } = props;\n const trees = useActiveTrees(treeDefinitions, imodel);\n\n return (\n <div className=\"tree-widget-selectable-tree\">\n <TreeSelector\n {...getTreeSelectorProps(trees)}\n density={props.density}\n onPerformanceMeasured={props.onPerformanceMeasured}\n onFeatureUsed={props.onFeatureUsed}\n />\n </div>\n );\n}\n\nfunction useActiveTrees(treeDefinitions: TreeDefinition[], imodel: IModelConnection) {\n const [trees, setTrees] = useState<TreeContentDefinition[]>();\n\n useEffect(() => {\n let disposed = false;\n void (async () => {\n const visibleTrees = await getActiveTrees(treeDefinitions, imodel);\n // istanbul ignore else\n if (!disposed) {\n setTrees(visibleTrees);\n }\n })();\n\n return () => {\n disposed = true;\n };\n }, [treeDefinitions, imodel]);\n\n return trees;\n}\n\nasync function getActiveTrees(treeDefinitions: TreeDefinition[], imodel: IModelConnection): Promise<TreeContentDefinition[]> {\n const handleDefinition = async (treeDef: TreeDefinition) => {\n if (treeDef.shouldShow !== undefined && !(await treeDef.shouldShow(imodel))) {\n return undefined;\n }\n return {\n id: treeDef.id,\n label: treeDef.getLabel(),\n render: treeDef.render,\n startIcon: treeDef.startIcon,\n };\n };\n\n return (await Promise.all(treeDefinitions.map(handleDefinition))).filter((tree) => tree !== undefined) as TreeContentDefinition[];\n}\n\nfunction getTreeSelectorProps(trees?: TreeContentDefinition[]): TreeSelectorProps {\n if (trees === undefined) {\n return {\n defaultSelectedContentId: \"loading\",\n trees: [\n {\n id: \"loading\",\n label: \"\",\n render: () => (\n <Delayed>\n <ProgressLinear indeterminate={true} />\n </Delayed>\n ),\n },\n ],\n };\n }\n\n if (trees.length === 0) {\n return {\n defaultSelectedContentId: \"no-trees\",\n trees: [\n {\n id: \"no-trees\",\n label: \"\",\n render: () => <FillCentered>{TreeWidget.translate(\"selectableTree.noTrees\")}</FillCentered>,\n },\n ],\n };\n }\n\n return {\n defaultSelectedContentId: trees[0].id,\n trees,\n };\n}\n\nfunction Delayed({ delay = 200, children }: PropsWithChildren<{ delay?: number }>) {\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setShow(true);\n }, delay);\n return () => {\n clearTimeout(id);\n };\n }, [delay]);\n\n if (!show) {\n return null;\n }\n\n return <>{children}</>;\n}\n"]}
1
+ {"version":3,"file":"SelectableTree.js","sourceRoot":"","sources":["../../../src/components/SelectableTree.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 \"./SelectableTree.scss\";\nimport { useEffect, useState } from \"react\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { FillCentered } from \"@itwin/core-react\";\nimport { ProgressLinear } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../TreeWidget\";\nimport { TreeSelector } from \"./TreeSelector\";\n\nimport type { PropsWithChildren } from \"react\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { TreeContentDefinition, TreeSelectorProps } from \"./TreeSelector\";\n\n/**\n * Props for rendering trees\n * @public\n */\nexport interface SelectableTreeRenderProps {\n density?: \"enlarged\" | \"default\";\n onPerformanceMeasured?: (featureId: string, elapsedTime: number) => void;\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * Definition of a tree component displayed in `SelectableTree`.\n * @public\n */\nexport interface SelectableTreeDefinition {\n /** Id of the tree */\n id: string;\n /** Callback that is used to get tree label */\n getLabel: () => string;\n /** Callback that is used to render tree component */\n render: (props: SelectableTreeRenderProps) => React.ReactNode;\n /**\n * Callback that is used to determine if tree should be shown for current active iModel connection.\n * If callback is `undefined` tree is shown for all iModel connections.\n */\n shouldShow?: (imodel: IModelConnection) => Promise<boolean>;\n /** Icon to render before tree label in tree selector */\n startIcon?: React.ReactNode;\n}\n\n/**\n * Props for `SelectableTree`\n * @public\n */\nexport interface SelectableTreeProps {\n trees: SelectableTreeDefinition[];\n density?: \"enlarged\" | \"default\";\n onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * A component that renders a tree (combo box) selector and the selected tree component.\n * @public\n */\nexport function SelectableTree(props: SelectableTreeProps) {\n const imodel = useActiveIModelConnection();\n if (!imodel) {\n return null;\n }\n return <SelectableTreeContent {...props} imodel={imodel} />;\n}\n\nfunction SelectableTreeContent(props: SelectableTreeProps & { imodel: IModelConnection }) {\n const { trees: treeDefinitions, imodel } = props;\n const trees = useActiveTrees(treeDefinitions, imodel);\n\n return (\n <div className=\"tree-widget-selectable-tree\">\n <TreeSelector\n {...getTreeSelectorProps(trees)}\n density={props.density}\n onPerformanceMeasured={props.onPerformanceMeasured}\n onFeatureUsed={props.onFeatureUsed}\n />\n </div>\n );\n}\n\nfunction useActiveTrees(treeDefinitions: SelectableTreeDefinition[], imodel: IModelConnection) {\n const [trees, setTrees] = useState<TreeContentDefinition[]>();\n\n useEffect(() => {\n let disposed = false;\n void (async () => {\n const visibleTrees = await getActiveTrees(treeDefinitions, imodel);\n // istanbul ignore else\n if (!disposed) {\n setTrees(visibleTrees);\n }\n })();\n\n return () => {\n disposed = true;\n };\n }, [treeDefinitions, imodel]);\n\n return trees;\n}\n\nasync function getActiveTrees(treeDefinitions: SelectableTreeDefinition[], imodel: IModelConnection): Promise<TreeContentDefinition[]> {\n const handleDefinition = async (treeDef: SelectableTreeDefinition) => {\n if (treeDef.shouldShow !== undefined && !(await treeDef.shouldShow(imodel))) {\n return undefined;\n }\n return {\n id: treeDef.id,\n label: treeDef.getLabel(),\n render: treeDef.render,\n startIcon: treeDef.startIcon,\n };\n };\n\n return (await Promise.all(treeDefinitions.map(handleDefinition))).filter((tree) => tree !== undefined) as TreeContentDefinition[];\n}\n\nfunction getTreeSelectorProps(trees?: TreeContentDefinition[]): TreeSelectorProps {\n if (trees === undefined) {\n return {\n defaultSelectedContentId: \"loading\",\n trees: [\n {\n id: \"loading\",\n label: \"\",\n render: () => (\n <Delayed>\n <ProgressLinear indeterminate={true} />\n </Delayed>\n ),\n },\n ],\n };\n }\n\n if (trees.length === 0) {\n return {\n defaultSelectedContentId: \"no-trees\",\n trees: [\n {\n id: \"no-trees\",\n label: \"\",\n render: () => <FillCentered>{TreeWidget.translate(\"selectableTree.noTrees\")}</FillCentered>,\n },\n ],\n };\n }\n\n return {\n defaultSelectedContentId: trees[0].id,\n trees,\n };\n}\n\nfunction Delayed({ delay = 200, children }: PropsWithChildren<{ delay?: number }>) {\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const id = setTimeout(() => {\n setShow(true);\n }, delay);\n return () => {\n clearTimeout(id);\n };\n }, [delay]);\n\n if (!show) {\n return null;\n }\n\n return <>{children}</>;\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import "./TreeSelector.scss";
3
- import type { TreeRenderProps } from "./SelectableTree";
3
+ import type { SelectableTreeRenderProps } from "./SelectableTree";
4
4
  /**
5
5
  * A definition for trees displayed in `TreeSelector`
6
6
  * @internal
@@ -8,7 +8,7 @@ import type { TreeRenderProps } from "./SelectableTree";
8
8
  export interface TreeContentDefinition {
9
9
  id: string;
10
10
  label: string;
11
- render: (props: TreeRenderProps) => React.ReactNode;
11
+ render: (props: SelectableTreeRenderProps) => React.ReactNode;
12
12
  startIcon?: React.ReactNode;
13
13
  }
14
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TreeSelector.js","sourceRoot":"","sources":["../../../src/components/TreeSelector.tsx"],"names":[],"mappings":";;;;AAAA;;;gGAGgG;AAEhG,+BAA6B;AAC7B,iCAA0C;AAC1C,wDAAwD;AA4BxD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,KAAwB;IACnD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC3F,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC3B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAA2B,CAAC;IACrH,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,OAAO,CACL,iCAAK,SAAS,EAAC,+CAA+C,aAC5D,gCAAK,SAAS,EAAC,sDAAsD,YAClE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,uBAAC,sBAAM,IACL,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,eAAe,CAAC,EAAE,EACzB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EACpC,QAAQ,EAAE,CAAC,MAAc,EAAE,EAAE;wBAC3B,KAAK,CAAC,aAAa,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;wBAC1C,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC,EACD,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CACnC,uBAAC,wBAAQ,OAAK,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,YAC3F,MAAM,CAAC,KAAK,GACJ,CACZ,GACD,CACH,GACG,EACN,gCAAK,SAAS,EAAC,uDAAuD,YACnE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,GACxI,IACF,CACP,CAAC;AACJ,CAAC;AAlCD,oCAkCC","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 \"./TreeSelector.scss\";\nimport { useMemo, useState } from \"react\";\nimport { MenuItem, Select } from \"@itwin/itwinui-react\";\n\nimport type { SelectOption } from \"@itwin/itwinui-react\";\nimport type { TreeRenderProps } from \"./SelectableTree\";\n\n/**\n * A definition for trees displayed in `TreeSelector`\n * @internal\n */\nexport interface TreeContentDefinition {\n id: string;\n label: string;\n render: (props: TreeRenderProps) => React.ReactNode;\n startIcon?: React.ReactNode;\n}\n\n/**\n * Props for `TreeSelector`\n * @internal\n */\nexport interface TreeSelectorProps {\n defaultSelectedContentId: string;\n trees: TreeContentDefinition[];\n density?: \"enlarged\" | \"default\";\n onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * A component that accepts a list of trees and renders a select box at the top,\n * allowing to choose which of the provided tree components should be rendered at the bottom.\n * @internal\n */\nexport function TreeSelector(props: TreeSelectorProps) {\n const [selectedContentId, setSelectedContentId] = useState(props.defaultSelectedContentId);\n const selectedContent = props.trees.find((c) => c.id === selectedContentId) ?? props.trees[0];\n const isEnlarged = props.density === \"enlarged\";\n\n const options = useMemo(() => {\n return props.trees.map((c) => ({ label: c.label, value: c.id, startIcon: c.startIcon })) as SelectOption<string>[];\n }, [props.trees]);\n\n return (\n <div className=\"presentation-components-tree-selector-content\">\n <div className=\"presentation-components-tree-selector-content-header\">\n {options.length > 0 && (\n <Select\n options={options}\n value={selectedContent.id}\n size={isEnlarged ? \"large\" : \"small\"}\n onChange={(treeId: string) => {\n props.onFeatureUsed?.(`choose-${treeId}`);\n setSelectedContentId(treeId);\n }}\n itemRenderer={(option, itemProps) => (\n <MenuItem {...option} isSelected={itemProps.isSelected} size={isEnlarged ? \"large\" : \"default\"}>\n {option.label}\n </MenuItem>\n )}\n />\n )}\n </div>\n <div className=\"presentation-components-tree-selector-content-wrapper\">\n {selectedContent?.render({ density: props.density, onPerformanceMeasured: props.onPerformanceMeasured, onFeatureUsed: props.onFeatureUsed })}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"TreeSelector.js","sourceRoot":"","sources":["../../../src/components/TreeSelector.tsx"],"names":[],"mappings":";;;;AAAA;;;gGAGgG;AAEhG,+BAA6B;AAC7B,iCAA0C;AAC1C,wDAAwD;AA4BxD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,KAAwB;IACnD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC3F,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC3B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAA2B,CAAC;IACrH,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,OAAO,CACL,iCAAK,SAAS,EAAC,+CAA+C,aAC5D,gCAAK,SAAS,EAAC,sDAAsD,YAClE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,uBAAC,sBAAM,IACL,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,eAAe,CAAC,EAAE,EACzB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EACpC,QAAQ,EAAE,CAAC,MAAc,EAAE,EAAE;wBAC3B,KAAK,CAAC,aAAa,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;wBAC1C,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC,EACD,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CACnC,uBAAC,wBAAQ,OAAK,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,YAC3F,MAAM,CAAC,KAAK,GACJ,CACZ,GACD,CACH,GACG,EACN,gCAAK,SAAS,EAAC,uDAAuD,YACnE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,GACxI,IACF,CACP,CAAC;AACJ,CAAC;AAlCD,oCAkCC","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 \"./TreeSelector.scss\";\nimport { useMemo, useState } from \"react\";\nimport { MenuItem, Select } from \"@itwin/itwinui-react\";\n\nimport type { SelectOption } from \"@itwin/itwinui-react\";\nimport type { SelectableTreeRenderProps } from \"./SelectableTree\";\n\n/**\n * A definition for trees displayed in `TreeSelector`\n * @internal\n */\nexport interface TreeContentDefinition {\n id: string;\n label: string;\n render: (props: SelectableTreeRenderProps) => React.ReactNode;\n startIcon?: React.ReactNode;\n}\n\n/**\n * Props for `TreeSelector`\n * @internal\n */\nexport interface TreeSelectorProps {\n defaultSelectedContentId: string;\n trees: TreeContentDefinition[];\n density?: \"enlarged\" | \"default\";\n onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * A component that accepts a list of trees and renders a select box at the top,\n * allowing to choose which of the provided tree components should be rendered at the bottom.\n * @internal\n */\nexport function TreeSelector(props: TreeSelectorProps) {\n const [selectedContentId, setSelectedContentId] = useState(props.defaultSelectedContentId);\n const selectedContent = props.trees.find((c) => c.id === selectedContentId) ?? props.trees[0];\n const isEnlarged = props.density === \"enlarged\";\n\n const options = useMemo(() => {\n return props.trees.map((c) => ({ label: c.label, value: c.id, startIcon: c.startIcon })) as SelectOption<string>[];\n }, [props.trees]);\n\n return (\n <div className=\"presentation-components-tree-selector-content\">\n <div className=\"presentation-components-tree-selector-content-header\">\n {options.length > 0 && (\n <Select\n options={options}\n value={selectedContent.id}\n size={isEnlarged ? \"large\" : \"small\"}\n onChange={(treeId: string) => {\n props.onFeatureUsed?.(`choose-${treeId}`);\n setSelectedContentId(treeId);\n }}\n itemRenderer={(option, itemProps) => (\n <MenuItem {...option} isSelected={itemProps.isSelected} size={isEnlarged ? \"large\" : \"default\"}>\n {option.label}\n </MenuItem>\n )}\n />\n )}\n </div>\n <div className=\"presentation-components-tree-selector-content-wrapper\">\n {selectedContent?.render({ density: props.density, onPerformanceMeasured: props.onPerformanceMeasured, onFeatureUsed: props.onFeatureUsed })}\n </div>\n </div>\n );\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  /// <reference types="react" />
2
2
  import "./TreeWidgetUiItemsProvider.scss";
3
3
  import type { Widget } from "@itwin/appui-react";
4
- import type { SelectableTreeProps, TreeDefinition } from "./SelectableTree";
4
+ import type { SelectableTreeDefinition, SelectableTreeProps } from "./SelectableTree";
5
5
  /**
6
6
  * Props for `createWidget`.
7
+ * @public
7
8
  */
8
9
  interface TreeWidgetProps {
9
10
  /**
@@ -13,7 +14,7 @@ interface TreeWidgetProps {
13
14
  * @see ExternalSourcesTreeComponent
14
15
  * @see IModelContentTreeComponent
15
16
  */
16
- trees: TreeDefinition[];
17
+ trees: SelectableTreeDefinition[];
17
18
  /** Modifies the density of the tree widget. `enlarged` widget contains larger content */
18
19
  density?: "enlarged" | "default";
19
20
  /** Callback that is invoked when performance of tracked feature is measured. */
@@ -1 +1 @@
1
- {"version":3,"file":"TreeWidgetUiItemsProvider.js","sourceRoot":"","sources":["../../../src/components/TreeWidgetUiItemsProvider.tsx"],"names":[],"mappings":";;;;AAAA;;;gGAGgG;AAEhG,4CAA0C;AAC1C,iCAA+B;AAC/B,+DAAqD;AACrD,oDAA8F;AAC9F,oEAA8D;AAC9D,oFAA8D;AAC9D,wDAA6D;AAC7D,8CAA2C;AAC3C,qDAAkD;AA2BlD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAsB;IACrD,OAAO;QACL,EAAE,EAAE,yBAAyB;QAC7B,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,cAAc,CAAC;QAC3C,IAAI,EAAE,uBAAC,sCAAgB,KAAG;QAC1B,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,OAAO,EAAE,+BAAiB,CAAC,KAAK;gBAChC,QAAQ,EAAE,gCAAkB,CAAC,KAAK;aACnC;SACF;QACD,OAAO,EAAE,CACP,uBAAC,mBAAmB,IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAClD,aAAa,EAAE,KAAK,CAAC,aAAa,GAClC,CACH;KACF,CAAC;AACJ,CAAC;AApBD,4CAoBC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,KAA0B;IAC5D,MAAM,GAAG,GAAG,2BAA2B,EAAE,CAAC;IAC1C,OAAO,CACL,gCAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,aAAa,YACpC,uBAAC,oCAAa,IAAC,iBAAiB,EAAE,UAAU,YAC1C,uBAAC,+BAAc,OAAK,KAAK,GAAI,GACf,GACZ,CACP,CAAC;AACJ,CAAC;AATD,kDASC;AAED,SAAS,UAAU,CAAC,EAAE,kBAAkB,EAAiB;IACvD,OAAO,CACL,uBAAC,6BAAa,IACZ,GAAG,EAAE,uBAAC,sCAAQ,KAAG,EACjB,OAAO,EAAE,uBAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,EACjD,WAAW,EAAE,uBAAU,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAC3D,OAAO,EACL,uBAAC,sBAAM,IAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,YAC9D,uBAAU,CAAC,SAAS,CAAC,6BAA6B,CAAC,GAC7C,GAEX,CACH,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B;IAClC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IACnD,IAAA,+BAAiB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAA,cAAM,GAAsB,CAAC;IAE/C,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,OAAO,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,6BAA6B,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,SAAS,CAAC,OAAO,GAAG,SAAS,EAAE,SAAS,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;YACjC,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE;gBAClC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;aACzC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACnC,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 \"./TreeWidgetUiItemsProvider.scss\";\nimport { useRef } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { StagePanelLocation, StagePanelSection, useTransientState } from \"@itwin/appui-react\";\nimport { SvgHierarchyTree } from \"@itwin/itwinui-icons-react\";\nimport { SvgError } from \"@itwin/itwinui-illustrations-react\";\nimport { Button, NonIdealState } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../TreeWidget\";\nimport { SelectableTree } from \"./SelectableTree\";\n\nimport type { Widget } from \"@itwin/appui-react\";\nimport type { SelectableTreeProps, TreeDefinition } from \"./SelectableTree\";\nimport type { FallbackProps } from \"react-error-boundary\";\nimport type { Ref } from \"react\";\n\n/**\n * Props for `createWidget`.\n */\ninterface TreeWidgetProps {\n /**\n * Trees to show in the widget.\n * @see ModelsTreeComponent\n * @see CategoriesTreeComponent\n * @see ExternalSourcesTreeComponent\n * @see IModelContentTreeComponent\n */\n trees: TreeDefinition[];\n /** Modifies the density of the tree widget. `enlarged` widget contains larger content */\n density?: \"enlarged\" | \"default\";\n /** Callback that is invoked when performance of tracked feature is measured. */\n onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;\n /** Callback that is invoked when a tracked feature is used. */\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * Creates a tree widget definition that should be returned from `UiItemsProvider.getWidgets()`.\n * @public\n */\nexport function createTreeWidget(props: TreeWidgetProps): Widget {\n return {\n id: \"tree-widget-react:trees\",\n label: TreeWidget.translate(\"widget.label\"),\n icon: <SvgHierarchyTree />,\n layouts: {\n standard: {\n section: StagePanelSection.Start,\n location: StagePanelLocation.Right,\n },\n },\n content: (\n <TreeWidgetComponent\n trees={props.trees}\n density={props.density}\n onPerformanceMeasured={props.onPerformanceMeasured}\n onFeatureUsed={props.onFeatureUsed}\n />\n ),\n };\n}\n\n/**\n * Tree widget component which allows selecting which tree to render.\n * @public\n */\nexport function TreeWidgetComponent(props: SelectableTreeProps) {\n const ref = useTreeWidgetTransientState();\n return (\n <div ref={ref} className=\"tree-widget\">\n <ErrorBoundary FallbackComponent={ErrorState}>\n <SelectableTree {...props} />\n </ErrorBoundary>\n </div>\n );\n}\n\nfunction ErrorState({ resetErrorBoundary }: FallbackProps) {\n return (\n <NonIdealState\n svg={<SvgError />}\n heading={TreeWidget.translate(\"errorState.title\")}\n description={TreeWidget.translate(\"errorState.description\")}\n actions={\n <Button styleType={\"high-visibility\"} onClick={resetErrorBoundary}>\n {TreeWidget.translate(\"errorState.retryButtonLabel\")}\n </Button>\n }\n />\n );\n}\n\nfunction useTreeWidgetTransientState() {\n const { ref, persist, restore } = useTreeStorage();\n useTransientState(persist, restore);\n return ref;\n}\n\ninterface UseTreeStorageResult {\n ref: Ref<HTMLDivElement>;\n persist: () => void;\n restore: () => void;\n}\n\nfunction useTreeStorage(): UseTreeStorageResult {\n const ref = useRef<HTMLDivElement>(null);\n const scrollTop = useRef<number | undefined>();\n\n const getContainer = () => {\n return ref.current?.querySelector(\"#tw-tree-renderer-container\");\n };\n\n const persist = () => {\n const container = getContainer();\n scrollTop.current = container?.scrollTop;\n };\n\n const restore = () => {\n setTimeout(() => {\n const container = getContainer();\n if (container && scrollTop.current) {\n container.scrollTop = scrollTop.current;\n }\n });\n };\n\n return { ref, persist, restore };\n}\n"]}
1
+ {"version":3,"file":"TreeWidgetUiItemsProvider.js","sourceRoot":"","sources":["../../../src/components/TreeWidgetUiItemsProvider.tsx"],"names":[],"mappings":";;;;AAAA;;;gGAGgG;AAEhG,4CAA0C;AAC1C,iCAA+B;AAC/B,+DAAqD;AACrD,oDAA8F;AAC9F,oEAA8D;AAC9D,oFAA8D;AAC9D,wDAA6D;AAC7D,8CAA2C;AAC3C,qDAAkD;AA4BlD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAsB;IACrD,OAAO;QACL,EAAE,EAAE,yBAAyB;QAC7B,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,cAAc,CAAC;QAC3C,IAAI,EAAE,uBAAC,sCAAgB,KAAG;QAC1B,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,OAAO,EAAE,+BAAiB,CAAC,KAAK;gBAChC,QAAQ,EAAE,gCAAkB,CAAC,KAAK;aACnC;SACF;QACD,OAAO,EAAE,CACP,uBAAC,mBAAmB,IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAClD,aAAa,EAAE,KAAK,CAAC,aAAa,GAClC,CACH;KACF,CAAC;AACJ,CAAC;AApBD,4CAoBC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,KAA0B;IAC5D,MAAM,GAAG,GAAG,2BAA2B,EAAE,CAAC;IAC1C,OAAO,CACL,gCAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,aAAa,YACpC,uBAAC,oCAAa,IAAC,iBAAiB,EAAE,UAAU,YAC1C,uBAAC,+BAAc,OAAK,KAAK,GAAI,GACf,GACZ,CACP,CAAC;AACJ,CAAC;AATD,kDASC;AAED,SAAS,UAAU,CAAC,EAAE,kBAAkB,EAAiB;IACvD,OAAO,CACL,uBAAC,6BAAa,IACZ,GAAG,EAAE,uBAAC,sCAAQ,KAAG,EACjB,OAAO,EAAE,uBAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,EACjD,WAAW,EAAE,uBAAU,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAC3D,OAAO,EACL,uBAAC,sBAAM,IAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,YAC9D,uBAAU,CAAC,SAAS,CAAC,6BAA6B,CAAC,GAC7C,GAEX,CACH,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B;IAClC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IACnD,IAAA,+BAAiB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAA,cAAM,GAAsB,CAAC;IAE/C,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,OAAO,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,6BAA6B,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,SAAS,CAAC,OAAO,GAAG,SAAS,EAAE,SAAS,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;YACjC,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE;gBAClC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC;aACzC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACnC,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 \"./TreeWidgetUiItemsProvider.scss\";\nimport { useRef } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { StagePanelLocation, StagePanelSection, useTransientState } from \"@itwin/appui-react\";\nimport { SvgHierarchyTree } from \"@itwin/itwinui-icons-react\";\nimport { SvgError } from \"@itwin/itwinui-illustrations-react\";\nimport { Button, NonIdealState } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../TreeWidget\";\nimport { SelectableTree } from \"./SelectableTree\";\n\nimport type { Widget } from \"@itwin/appui-react\";\nimport type { SelectableTreeDefinition, SelectableTreeProps } from \"./SelectableTree\";\nimport type { FallbackProps } from \"react-error-boundary\";\nimport type { Ref } from \"react\";\n\n/**\n * Props for `createWidget`.\n * @public\n */\ninterface TreeWidgetProps {\n /**\n * Trees to show in the widget.\n * @see ModelsTreeComponent\n * @see CategoriesTreeComponent\n * @see ExternalSourcesTreeComponent\n * @see IModelContentTreeComponent\n */\n trees: SelectableTreeDefinition[];\n /** Modifies the density of the tree widget. `enlarged` widget contains larger content */\n density?: \"enlarged\" | \"default\";\n /** Callback that is invoked when performance of tracked feature is measured. */\n onPerformanceMeasured?: (feature: string, elapsedTime: number) => void;\n /** Callback that is invoked when a tracked feature is used. */\n onFeatureUsed?: (feature: string) => void;\n}\n\n/**\n * Creates a tree widget definition that should be returned from `UiItemsProvider.getWidgets()`.\n * @public\n */\nexport function createTreeWidget(props: TreeWidgetProps): Widget {\n return {\n id: \"tree-widget-react:trees\",\n label: TreeWidget.translate(\"widget.label\"),\n icon: <SvgHierarchyTree />,\n layouts: {\n standard: {\n section: StagePanelSection.Start,\n location: StagePanelLocation.Right,\n },\n },\n content: (\n <TreeWidgetComponent\n trees={props.trees}\n density={props.density}\n onPerformanceMeasured={props.onPerformanceMeasured}\n onFeatureUsed={props.onFeatureUsed}\n />\n ),\n };\n}\n\n/**\n * Tree widget component which allows selecting which tree to render.\n * @public\n */\nexport function TreeWidgetComponent(props: SelectableTreeProps) {\n const ref = useTreeWidgetTransientState();\n return (\n <div ref={ref} className=\"tree-widget\">\n <ErrorBoundary FallbackComponent={ErrorState}>\n <SelectableTree {...props} />\n </ErrorBoundary>\n </div>\n );\n}\n\nfunction ErrorState({ resetErrorBoundary }: FallbackProps) {\n return (\n <NonIdealState\n svg={<SvgError />}\n heading={TreeWidget.translate(\"errorState.title\")}\n description={TreeWidget.translate(\"errorState.description\")}\n actions={\n <Button styleType={\"high-visibility\"} onClick={resetErrorBoundary}>\n {TreeWidget.translate(\"errorState.retryButtonLabel\")}\n </Button>\n }\n />\n );\n}\n\nfunction useTreeWidgetTransientState() {\n const { ref, persist, restore } = useTreeStorage();\n useTransientState(persist, restore);\n return ref;\n}\n\ninterface UseTreeStorageResult {\n ref: Ref<HTMLDivElement>;\n persist: () => void;\n restore: () => void;\n}\n\nfunction useTreeStorage(): UseTreeStorageResult {\n const ref = useRef<HTMLDivElement>(null);\n const scrollTop = useRef<number | undefined>();\n\n const getContainer = () => {\n return ref.current?.querySelector(\"#tw-tree-renderer-container\");\n };\n\n const persist = () => {\n const container = getContainer();\n scrollTop.current = container?.scrollTop;\n };\n\n const restore = () => {\n setTimeout(() => {\n const container = getContainer();\n if (container && scrollTop.current) {\n container.scrollTop = scrollTop.current;\n }\n });\n };\n\n return { ref, persist, restore };\n}\n"]}
@@ -1,15 +1,15 @@
1
- /// <reference types="react" />
2
1
  import "./TreeHeader.scss";
2
+ import type { PropsWithChildren } from "react";
3
3
  import type { Viewport } from "@itwin/core-frontend";
4
4
  import type { CommonProps } from "@itwin/core-react";
5
- /** @internal */
5
+ /** @public */
6
6
  export interface TreeHeaderButtonProps {
7
7
  viewport: Viewport;
8
8
  density?: "default" | "enlarged";
9
9
  onFeatureUsed?: (feature: string) => void;
10
10
  }
11
- /** @internal */
12
- export interface TreeHeaderProps extends CommonProps {
11
+ /** @beta */
12
+ export interface TreeFilteringProps {
13
13
  /** Filtering is cleared after everything's loaded */
14
14
  onFilterStart: (newFilter: string) => void;
15
15
  /** listens for onClick event for Clear (x) icon */
@@ -19,12 +19,14 @@ export interface TreeHeaderProps extends CommonProps {
19
19
  /** Current selected result index */
20
20
  selectedIndex?: number;
21
21
  /** Callback to currently selected result/entry change */
22
- onSelectedChanged: (index: number) => void;
23
- /** Header buttons */
24
- children?: React.ReactNode;
22
+ onSelectedChanged?: (index: number) => void;
23
+ isDisabled?: boolean;
24
+ }
25
+ interface TreeHeaderProps extends CommonProps {
26
+ filteringProps?: TreeFilteringProps;
25
27
  /** Modifies the density of tree header. `enlarged` header contains larger content */
26
28
  density?: "default" | "enlarged";
27
29
  }
28
- /** @internal */
29
- export declare function TreeHeader(props: TreeHeaderProps): JSX.Element;
30
+ export declare function TreeHeader(props: PropsWithChildren<TreeHeaderProps>): JSX.Element;
31
+ export {};
30
32
  //# sourceMappingURL=TreeHeader.d.ts.map
@@ -16,20 +16,18 @@ const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
16
16
  const itwinui_react_1 = require("@itwin/itwinui-react");
17
17
  const TreeWidget_1 = require("../../TreeWidget");
18
18
  const FocusedInstancesContext_1 = require("../trees/common/FocusedInstancesContext");
19
- /** @internal */
20
19
  function TreeHeader(props) {
21
- const { onFilterStart, onFilterClear, resultCount, selectedIndex, onSelectedChanged, children, density, className } = props;
20
+ const { filteringProps, density, className, children } = props;
22
21
  const [isSearchOpen, setIsSearchOpen] = (0, react_1.useState)(false);
23
22
  const { enabled: instanceFocusEnabled } = (0, FocusedInstancesContext_1.useFocusedInstancesContext)();
24
23
  const size = density === "enlarged" ? "large" : "small";
25
24
  (0, react_1.useEffect)(() => {
26
25
  // istanbul ignore if
27
- if (instanceFocusEnabled) {
28
- onFilterClear();
26
+ if (filteringProps?.isDisabled) {
29
27
  setIsSearchOpen(false);
30
28
  }
31
- }, [instanceFocusEnabled, onFilterClear]);
32
- return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)("tree-widget-tree-header", className), children: [(0, jsx_runtime_1.jsx)(HeaderButtons, { contracted: isSearchOpen, size: size, children: children }), (0, jsx_runtime_1.jsx)(DebouncedSearchBox, { isOpened: isSearchOpen, onOpen: () => setIsSearchOpen(true), onClose: () => setIsSearchOpen(false), onChange: (value) => (value ? onFilterStart(value) : onFilterClear()), delay: 500, selectedResultIndex: selectedIndex, resultCount: resultCount, onSelectedResultChanged: onSelectedChanged, size: size, isDisabled: instanceFocusEnabled })] }));
29
+ }, [filteringProps?.isDisabled]);
30
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)("tree-widget-tree-header", className), children: [(0, jsx_runtime_1.jsx)(HeaderButtons, { contracted: isSearchOpen, size: size, children: children }), filteringProps ? ((0, jsx_runtime_1.jsx)(DebouncedSearchBox, { isOpened: isSearchOpen, onOpen: () => setIsSearchOpen(true), onClose: () => setIsSearchOpen(false), onChange: (value) => (value ? filteringProps.onFilterStart(value) : filteringProps.onFilterClear()), delay: 500, selectedResultIndex: filteringProps.selectedIndex, resultCount: filteringProps.resultCount, onSelectedResultChanged: (index) => filteringProps.onSelectedChanged?.(index), size: size, isDisabled: instanceFocusEnabled })) : null] }));
33
31
  }
34
32
  exports.TreeHeader = TreeHeader;
35
33
  function DebouncedSearchBox({ isOpened, selectedResultIndex, resultCount, onSelectedResultChanged, onChange, onOpen, onClose, delay, size, isDisabled, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"TreeHeader.js","sourceRoot":"","sources":["../../../../src/components/tree-header/TreeHeader.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 \"./TreeHeader.scss\";\nimport classnames from \"classnames\";\nimport { Children, useEffect, useRef, useState } from \"react\";\nimport { SvgCaretDownSmall, SvgCaretUpSmall, SvgMore } from \"@itwin/itwinui-icons-react\";\nimport { ButtonGroup, Divider, DropdownMenu, IconButton, SearchBox } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../../TreeWidget\";\nimport { useFocusedInstancesContext } from \"../trees/common/FocusedInstancesContext\";\n\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { CommonProps } from \"@itwin/core-react\";\n\n/** @internal */\nexport interface TreeHeaderButtonProps {\n viewport: Viewport;\n density?: \"default\" | \"enlarged\";\n onFeatureUsed?: (feature: string) => void;\n}\n\n/** @internal */\nexport interface TreeHeaderProps extends CommonProps {\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** listens for onClick event for Clear (x) icon */\n onFilterClear: () => void;\n /** Total number of results/entries */\n resultCount?: number;\n /** Current selected result index */\n selectedIndex?: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n /** Header buttons */\n children?: React.ReactNode;\n /** Modifies the density of tree header. `enlarged` header contains larger content */\n density?: \"default\" | \"enlarged\";\n}\n\n/** @internal */\nexport function TreeHeader(props: TreeHeaderProps) {\n const { onFilterStart, onFilterClear, resultCount, selectedIndex, onSelectedChanged, children, density, className } = props;\n const [isSearchOpen, setIsSearchOpen] = useState<boolean>(false);\n const { enabled: instanceFocusEnabled } = useFocusedInstancesContext();\n const size = density === \"enlarged\" ? \"large\" : \"small\";\n\n useEffect(() => {\n // istanbul ignore if\n if (instanceFocusEnabled) {\n onFilterClear();\n setIsSearchOpen(false);\n }\n }, [instanceFocusEnabled, onFilterClear]);\n\n return (\n <div className={classnames(\"tree-widget-tree-header\", className)}>\n <HeaderButtons contracted={isSearchOpen} size={size}>\n {children}\n </HeaderButtons>\n <DebouncedSearchBox\n isOpened={isSearchOpen}\n onOpen={() => setIsSearchOpen(true)}\n onClose={() => setIsSearchOpen(false)}\n onChange={(value) => (value ? onFilterStart(value) : onFilterClear())}\n delay={500}\n selectedResultIndex={selectedIndex}\n resultCount={resultCount}\n onSelectedResultChanged={onSelectedChanged}\n size={size}\n isDisabled={instanceFocusEnabled}\n />\n </div>\n );\n}\n\ninterface DebouncedSearchBoxProps {\n isOpened: boolean;\n onOpen: () => void;\n onClose: () => void;\n onChange: (value: string) => void;\n delay: number;\n selectedResultIndex?: number;\n resultCount?: number;\n onSelectedResultChanged: (index: number) => void;\n size: \"large\" | \"small\";\n isDisabled?: boolean;\n}\n\nfunction DebouncedSearchBox({\n isOpened,\n selectedResultIndex,\n resultCount,\n onSelectedResultChanged,\n onChange,\n onOpen,\n onClose,\n delay,\n size,\n isDisabled,\n}: DebouncedSearchBoxProps) {\n const [inputValue, setInputValue] = useState<string>(\"\");\n const onChangeRef = useRef(onChange);\n // save latest `onChange` reference into `useRef` to avoid restarting timeout when `onChange` reference changes.\n onChangeRef.current = onChange;\n\n useEffect(() => {\n if (!inputValue) {\n onChangeRef.current(\"\");\n return;\n }\n\n const timeoutId = setTimeout(() => {\n onChangeRef.current(inputValue);\n }, delay);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [inputValue, delay]);\n\n return (\n <SearchBox\n expandable\n isExpanded={isOpened}\n onExpand={onOpen}\n onCollapse={onClose}\n size={size}\n className={classnames(\"tree-widget-search-box\", !isOpened && \"contracted\")}\n isDisabled={isDisabled}\n >\n <SearchBox.CollapsedState>\n <SearchBox.ExpandButton\n title={TreeWidget.translate(\"header.searchBox.searchForSomething\")}\n aria-label={TreeWidget.translate(\"header.searchBox.open\")}\n size={size}\n styleType=\"borderless\"\n />\n </SearchBox.CollapsedState>\n <SearchBox.ExpandedState>\n <SearchBox.Input placeholder={TreeWidget.translate(\"header.searchBox.search\")} onChange={(e) => setInputValue(e.currentTarget.value)} />\n <SearchResultStepper selectedIndex={selectedResultIndex} total={resultCount} onStep={onSelectedResultChanged} size={size} />\n <SearchBox.CollapseButton\n onClick={() => {\n setInputValue(\"\");\n onClose();\n }}\n size={size}\n aria-label={TreeWidget.translate(\"header.searchBox.close\")}\n />\n </SearchBox.ExpandedState>\n </SearchBox>\n );\n}\n\ninterface HeaderButtonsProps {\n contracted: boolean;\n children?: React.ReactNode;\n size: \"large\" | \"small\";\n}\n\nfunction HeaderButtons(props: HeaderButtonsProps) {\n const className = classnames(\"button-container\", props.contracted && \"contracted\");\n\n return (\n <ButtonGroup\n className={className}\n overflowButton={(overflowStart) => (\n <DropdownMenu\n menuItems={() =>\n Children.toArray(props.children)\n .slice(overflowStart)\n .map((btn, index) => (\n <li key={index} className=\"dropdown-item\" role=\"menuitem\">\n {btn}\n </li>\n ))\n }\n className=\"tree-header-button-dropdown-container\"\n >\n <IconButton title={TreeWidget.translate(\"header.dropdownMore\")} styleType=\"borderless\" size={props.size}>\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n )}\n >\n {props.children}\n </ButtonGroup>\n );\n}\n\ninterface SearchResultStepperProps {\n total?: number;\n onStep: (newIndex: number) => void;\n selectedIndex?: number;\n size: \"large\" | \"small\";\n}\n\nfunction SearchResultStepper(props: SearchResultStepperProps) {\n const { selectedIndex = 1, total, onStep } = props;\n if (!total) {\n return null;\n }\n\n return (\n <>\n <span className=\"searchbox-stepping-count\">{`${selectedIndex}/${total}`}</span>\n <Divider orientation=\"vertical\" />\n <SearchBox.Button\n title={TreeWidget.translate(\"header.searchBox.previous\")}\n size={props.size}\n onClick={() => {\n if (selectedIndex > 1) {\n onStep(selectedIndex - 1);\n }\n }}\n >\n <SvgCaretUpSmall />\n </SearchBox.Button>\n <SearchBox.Button\n title={TreeWidget.translate(\"header.searchBox.next\")}\n size={props.size}\n onClick={() => {\n if (selectedIndex < total) {\n onStep(selectedIndex + 1);\n }\n }}\n >\n <SvgCaretDownSmall />\n </SearchBox.Button>\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"TreeHeader.js","sourceRoot":"","sources":["../../../../src/components/tree-header/TreeHeader.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 \"./TreeHeader.scss\";\nimport classnames from \"classnames\";\nimport { Children, useEffect, useRef, useState } from \"react\";\nimport { SvgCaretDownSmall, SvgCaretUpSmall, SvgMore } from \"@itwin/itwinui-icons-react\";\nimport { ButtonGroup, Divider, DropdownMenu, IconButton, SearchBox } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../../TreeWidget\";\nimport { useFocusedInstancesContext } from \"../trees/common/FocusedInstancesContext\";\n\nimport type { PropsWithChildren } from \"react\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { CommonProps } from \"@itwin/core-react\";\n\n/** @public */\nexport interface TreeHeaderButtonProps {\n viewport: Viewport;\n density?: \"default\" | \"enlarged\";\n onFeatureUsed?: (feature: string) => void;\n}\n\n/** @beta */\nexport interface TreeFilteringProps {\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** listens for onClick event for Clear (x) icon */\n onFilterClear: () => void;\n /** Total number of results/entries */\n resultCount?: number;\n /** Current selected result index */\n selectedIndex?: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged?: (index: number) => void;\n isDisabled?: boolean;\n}\n\ninterface TreeHeaderProps extends CommonProps {\n filteringProps?: TreeFilteringProps;\n /** Modifies the density of tree header. `enlarged` header contains larger content */\n density?: \"default\" | \"enlarged\";\n}\n\nexport function TreeHeader(props: PropsWithChildren<TreeHeaderProps>) {\n const { filteringProps, density, className, children } = props;\n const [isSearchOpen, setIsSearchOpen] = useState<boolean>(false);\n const { enabled: instanceFocusEnabled } = useFocusedInstancesContext();\n const size = density === \"enlarged\" ? \"large\" : \"small\";\n\n useEffect(() => {\n // istanbul ignore if\n if (filteringProps?.isDisabled) {\n setIsSearchOpen(false);\n }\n }, [filteringProps?.isDisabled]);\n\n return (\n <div className={classnames(\"tree-widget-tree-header\", className)}>\n <HeaderButtons contracted={isSearchOpen} size={size}>\n {children}\n </HeaderButtons>\n {filteringProps ? (\n <DebouncedSearchBox\n isOpened={isSearchOpen}\n onOpen={() => setIsSearchOpen(true)}\n onClose={() => setIsSearchOpen(false)}\n onChange={(value) => (value ? filteringProps.onFilterStart(value) : filteringProps.onFilterClear())}\n delay={500}\n selectedResultIndex={filteringProps.selectedIndex}\n resultCount={filteringProps.resultCount}\n onSelectedResultChanged={(index) => filteringProps.onSelectedChanged?.(index)}\n size={size}\n isDisabled={instanceFocusEnabled}\n />\n ) : null}\n </div>\n );\n}\n\ninterface DebouncedSearchBoxProps {\n isOpened: boolean;\n onOpen: () => void;\n onClose: () => void;\n onChange: (value: string) => void;\n delay: number;\n selectedResultIndex?: number;\n resultCount?: number;\n onSelectedResultChanged: (index: number) => void;\n size: \"large\" | \"small\";\n isDisabled?: boolean;\n}\n\nfunction DebouncedSearchBox({\n isOpened,\n selectedResultIndex,\n resultCount,\n onSelectedResultChanged,\n onChange,\n onOpen,\n onClose,\n delay,\n size,\n isDisabled,\n}: DebouncedSearchBoxProps) {\n const [inputValue, setInputValue] = useState<string>(\"\");\n const onChangeRef = useRef(onChange);\n // save latest `onChange` reference into `useRef` to avoid restarting timeout when `onChange` reference changes.\n onChangeRef.current = onChange;\n\n useEffect(() => {\n if (!inputValue) {\n onChangeRef.current(\"\");\n return;\n }\n\n const timeoutId = setTimeout(() => {\n onChangeRef.current(inputValue);\n }, delay);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [inputValue, delay]);\n\n return (\n <SearchBox\n expandable\n isExpanded={isOpened}\n onExpand={onOpen}\n onCollapse={onClose}\n size={size}\n className={classnames(\"tree-widget-search-box\", !isOpened && \"contracted\")}\n isDisabled={isDisabled}\n >\n <SearchBox.CollapsedState>\n <SearchBox.ExpandButton\n title={TreeWidget.translate(\"header.searchBox.searchForSomething\")}\n aria-label={TreeWidget.translate(\"header.searchBox.open\")}\n size={size}\n styleType=\"borderless\"\n />\n </SearchBox.CollapsedState>\n <SearchBox.ExpandedState>\n <SearchBox.Input placeholder={TreeWidget.translate(\"header.searchBox.search\")} onChange={(e) => setInputValue(e.currentTarget.value)} />\n <SearchResultStepper selectedIndex={selectedResultIndex} total={resultCount} onStep={onSelectedResultChanged} size={size} />\n <SearchBox.CollapseButton\n onClick={() => {\n setInputValue(\"\");\n onClose();\n }}\n size={size}\n aria-label={TreeWidget.translate(\"header.searchBox.close\")}\n />\n </SearchBox.ExpandedState>\n </SearchBox>\n );\n}\n\ninterface HeaderButtonsProps {\n contracted: boolean;\n size: \"large\" | \"small\";\n}\n\nfunction HeaderButtons(props: PropsWithChildren<HeaderButtonsProps>) {\n const className = classnames(\"button-container\", props.contracted && \"contracted\");\n\n return (\n <ButtonGroup\n className={className}\n overflowButton={(overflowStart) => (\n <DropdownMenu\n menuItems={() =>\n Children.toArray(props.children)\n .slice(overflowStart)\n .map((btn, index) => (\n <li key={index} className=\"dropdown-item\" role=\"menuitem\">\n {btn}\n </li>\n ))\n }\n className=\"tree-header-button-dropdown-container\"\n >\n <IconButton title={TreeWidget.translate(\"header.dropdownMore\")} styleType=\"borderless\" size={props.size}>\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n )}\n >\n {props.children}\n </ButtonGroup>\n );\n}\n\ninterface SearchResultStepperProps {\n total?: number;\n onStep: (newIndex: number) => void;\n selectedIndex?: number;\n size: \"large\" | \"small\";\n}\n\nfunction SearchResultStepper(props: SearchResultStepperProps) {\n const { selectedIndex = 1, total, onStep } = props;\n if (!total) {\n return null;\n }\n\n return (\n <>\n <span className=\"searchbox-stepping-count\">{`${selectedIndex}/${total}`}</span>\n <Divider orientation=\"vertical\" />\n <SearchBox.Button\n title={TreeWidget.translate(\"header.searchBox.previous\")}\n size={props.size}\n onClick={() => {\n if (selectedIndex > 1) {\n onStep(selectedIndex - 1);\n }\n }}\n >\n <SvgCaretUpSmall />\n </SearchBox.Button>\n <SearchBox.Button\n title={TreeWidget.translate(\"header.searchBox.next\")}\n size={props.size}\n onClick={() => {\n if (selectedIndex < total) {\n onStep(selectedIndex + 1);\n }\n }}\n >\n <SvgCaretDownSmall />\n </SearchBox.Button>\n </>\n );\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import "./TreeWithHeader.scss";
2
+ import type { PropsWithChildren, ReactNode } from "react";
3
+ import type { TreeFilteringProps } from "./TreeHeader";
4
+ /** @beta */
5
+ interface TreeWithHeaderProps {
6
+ density?: "enlarged" | "default";
7
+ filteringProps?: TreeFilteringProps;
8
+ buttons?: ReactNode;
9
+ }
10
+ /** @beta */
11
+ export declare function TreeWithHeader({ filteringProps, buttons, density, children }: PropsWithChildren<TreeWithHeaderProps>): JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=TreeWithHeader.d.ts.map
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TreeWithHeader = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ /*---------------------------------------------------------------------------------------------
9
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
10
+ * See LICENSE.md in the project root for license terms and full copyright notice.
11
+ *--------------------------------------------------------------------------------------------*/
12
+ require("./TreeWithHeader.scss");
13
+ const classnames_1 = __importDefault(require("classnames"));
14
+ const TreeHeader_1 = require("./TreeHeader");
15
+ /** @beta */
16
+ function TreeWithHeader({ filteringProps, buttons, density, children }) {
17
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)("tw-tree-with-header", density === "enlarged" && "enlarge"), children: [(0, jsx_runtime_1.jsx)(TreeHeader_1.TreeHeader, { filteringProps: filteringProps, density: density, children: buttons }), (0, jsx_runtime_1.jsx)("div", { className: "tw-tree-content", children: children })] }));
18
+ }
19
+ exports.TreeWithHeader = TreeWithHeader;
20
+ //# sourceMappingURL=TreeWithHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeWithHeader.js","sourceRoot":"","sources":["../../../../src/components/tree-header/TreeWithHeader.tsx"],"names":[],"mappings":";;;;;;;AAAA;;;gGAGgG;AAEhG,iCAA+B;AAC/B,4DAAoC;AACpC,6CAA0C;AAY1C,YAAY;AACZ,SAAgB,cAAc,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAA0C;IACnH,OAAO,CACL,iCAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,qBAAqB,EAAE,OAAO,KAAK,UAAU,IAAI,SAAS,CAAC,aACpF,uBAAC,uBAAU,IAAC,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,YACzD,OAAO,GACG,EACb,gCAAK,SAAS,EAAC,iBAAiB,YAAE,QAAQ,GAAO,IAC7C,CACP,CAAC;AACJ,CAAC;AATD,wCASC","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 \"./TreeWithHeader.scss\";\nimport classNames from \"classnames\";\nimport { TreeHeader } from \"./TreeHeader\";\n\nimport type { PropsWithChildren, ReactNode } from \"react\";\nimport type { TreeFilteringProps } from \"./TreeHeader\";\n\n/** @beta */\ninterface TreeWithHeaderProps {\n density?: \"enlarged\" | \"default\";\n filteringProps?: TreeFilteringProps;\n buttons?: ReactNode;\n}\n\n/** @beta */\nexport function TreeWithHeader({ filteringProps, buttons, density, children }: PropsWithChildren<TreeWithHeaderProps>) {\n return (\n <div className={classNames(\"tw-tree-with-header\", density === \"enlarged\" && \"enlarge\")}>\n <TreeHeader filteringProps={filteringProps} density={density}>\n {buttons}\n </TreeHeader>\n <div className=\"tw-tree-content\">{children}</div>\n </div>\n );\n}\n"]}