@itwin/tree-widget-react 1.2.2 → 2.0.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/README.md +1 -1
  3. package/lib/cjs/TreeWidget.d.ts +0 -1
  4. package/lib/cjs/TreeWidget.js +9 -10
  5. package/lib/cjs/TreeWidget.js.map +1 -1
  6. package/lib/cjs/components/SelectableTree.js +24 -13
  7. package/lib/cjs/components/SelectableTree.js.map +1 -1
  8. package/lib/cjs/components/TreeFilteringState.js +3 -3
  9. package/lib/cjs/components/TreeFilteringState.js.map +1 -1
  10. package/lib/cjs/components/TreeWidgetUiItemsProvider.js +7 -5
  11. package/lib/cjs/components/TreeWidgetUiItemsProvider.js.map +1 -1
  12. package/lib/cjs/components/TreeWidgetUiItemsProvider.scss +1 -1
  13. package/lib/cjs/components/tree-header/TreeHeader.js +15 -12
  14. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -1
  15. package/lib/cjs/components/tree-header/TreeHeader.scss +1 -1
  16. package/lib/cjs/components/trees/CategoriesVisibilityUtils.js +13 -8
  17. package/lib/cjs/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  18. package/lib/cjs/components/trees/VisibilityTreeBase.scss +1 -1
  19. package/lib/cjs/components/trees/VisibilityTreeEventHandler.d.ts +1 -1
  20. package/lib/cjs/components/trees/VisibilityTreeEventHandler.js +18 -10
  21. package/lib/cjs/components/trees/VisibilityTreeEventHandler.js.map +1 -1
  22. package/lib/cjs/components/trees/VisibilityTreeRenderer.d.ts +20 -4
  23. package/lib/cjs/components/trees/VisibilityTreeRenderer.js +28 -10
  24. package/lib/cjs/components/trees/VisibilityTreeRenderer.js.map +1 -1
  25. package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +7 -2
  26. package/lib/cjs/components/trees/category-tree/CategoriesTree.js +47 -30
  27. package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
  28. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js +14 -10
  29. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  30. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js +18 -13
  31. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  32. package/lib/cjs/components/trees/common/ContextMenu.js +4 -4
  33. package/lib/cjs/components/trees/common/ContextMenu.js.map +1 -1
  34. package/lib/cjs/components/trees/common/TreeNodeRenderer.d.ts +1 -1
  35. package/lib/cjs/components/trees/common/TreeNodeRenderer.js +4 -4
  36. package/lib/cjs/components/trees/common/TreeNodeRenderer.js.map +1 -1
  37. package/lib/cjs/components/trees/common/TreeRenderer.d.ts +15 -1
  38. package/lib/cjs/components/trees/common/TreeRenderer.js +17 -7
  39. package/lib/cjs/components/trees/common/TreeRenderer.js.map +1 -1
  40. package/lib/cjs/components/trees/common/TreeRenderer.scss +7 -2
  41. package/lib/cjs/components/trees/common/Types.d.ts +8 -0
  42. package/lib/cjs/components/trees/common/Types.js +3 -3
  43. package/lib/cjs/components/trees/common/Types.js.map +1 -1
  44. package/lib/cjs/components/trees/common/UseVisibilityTreeState.d.ts +36 -0
  45. package/lib/cjs/components/trees/common/UseVisibilityTreeState.js +47 -0
  46. package/lib/cjs/components/trees/common/UseVisibilityTreeState.js.map +1 -0
  47. package/lib/cjs/components/trees/common/Utils.js +7 -5
  48. package/lib/cjs/components/trees/common/Utils.js.map +1 -1
  49. package/lib/cjs/components/trees/external-sources-tree/ExternalSources.json +1 -3
  50. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +9 -3
  51. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js +19 -7
  52. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  53. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +4 -4
  54. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  55. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.d.ts +9 -3
  56. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js +16 -12
  57. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  58. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js +6 -5
  59. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  60. package/lib/cjs/components/trees/index.js +3 -3
  61. package/lib/cjs/components/trees/index.js.map +1 -1
  62. package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +7 -2
  63. package/lib/cjs/components/trees/models-tree/ModelsTree.js +76 -62
  64. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  65. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +11 -18
  66. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  67. package/lib/cjs/components/trees/models-tree/ModelsTreeEventHandler.d.ts +9 -0
  68. package/lib/cjs/components/trees/models-tree/ModelsTreeEventHandler.js +31 -0
  69. package/lib/cjs/components/trees/models-tree/ModelsTreeEventHandler.js.map +1 -0
  70. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js +125 -66
  71. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  72. package/lib/cjs/components/trees/models-tree/Utils.d.ts +4 -0
  73. package/lib/cjs/components/trees/models-tree/Utils.js +52 -58
  74. package/lib/cjs/components/trees/models-tree/Utils.js.map +1 -1
  75. package/lib/cjs/components/utils/AutoSizer.js +7 -5
  76. package/lib/cjs/components/utils/AutoSizer.js.map +1 -1
  77. package/lib/cjs/components/utils/IsPromiseLike.js +4 -4
  78. package/lib/cjs/components/utils/IsPromiseLike.js.map +1 -1
  79. package/lib/cjs/components/utils/UseTreeTransientState.js +3 -3
  80. package/lib/cjs/components/utils/UseTreeTransientState.js.map +1 -1
  81. package/lib/cjs/e2e-tests/TreeWidget.test.js +53 -0
  82. package/lib/cjs/e2e-tests/TreeWidget.test.js.map +1 -1
  83. package/lib/cjs/e2e-tests/utils.d.ts +1 -0
  84. package/lib/cjs/e2e-tests/utils.js +4 -5
  85. package/lib/cjs/e2e-tests/utils.js.map +1 -1
  86. package/lib/cjs/tree-widget-react.js +3 -3
  87. package/lib/cjs/tree-widget-react.js.map +1 -1
  88. package/lib/esm/TreeWidget.d.ts +0 -1
  89. package/lib/esm/TreeWidget.js +9 -10
  90. package/lib/esm/TreeWidget.js.map +1 -1
  91. package/lib/esm/components/SelectableTree.js +24 -13
  92. package/lib/esm/components/SelectableTree.js.map +1 -1
  93. package/lib/esm/components/TreeFilteringState.js +3 -3
  94. package/lib/esm/components/TreeFilteringState.js.map +1 -1
  95. package/lib/esm/components/TreeWidgetUiItemsProvider.js +7 -5
  96. package/lib/esm/components/TreeWidgetUiItemsProvider.js.map +1 -1
  97. package/lib/esm/components/TreeWidgetUiItemsProvider.scss +1 -1
  98. package/lib/esm/components/tree-header/TreeHeader.js +15 -12
  99. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -1
  100. package/lib/esm/components/tree-header/TreeHeader.scss +1 -1
  101. package/lib/esm/components/trees/CategoriesVisibilityUtils.js +13 -8
  102. package/lib/esm/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  103. package/lib/esm/components/trees/VisibilityTreeBase.scss +1 -1
  104. package/lib/esm/components/trees/VisibilityTreeEventHandler.d.ts +1 -1
  105. package/lib/esm/components/trees/VisibilityTreeEventHandler.js +18 -10
  106. package/lib/esm/components/trees/VisibilityTreeEventHandler.js.map +1 -1
  107. package/lib/esm/components/trees/VisibilityTreeRenderer.d.ts +20 -4
  108. package/lib/esm/components/trees/VisibilityTreeRenderer.js +27 -10
  109. package/lib/esm/components/trees/VisibilityTreeRenderer.js.map +1 -1
  110. package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +7 -2
  111. package/lib/esm/components/trees/category-tree/CategoriesTree.js +51 -34
  112. package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
  113. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js +14 -10
  114. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  115. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js +18 -13
  116. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  117. package/lib/esm/components/trees/common/ContextMenu.js +4 -4
  118. package/lib/esm/components/trees/common/ContextMenu.js.map +1 -1
  119. package/lib/esm/components/trees/common/TreeNodeRenderer.d.ts +1 -1
  120. package/lib/esm/components/trees/common/TreeNodeRenderer.js +4 -4
  121. package/lib/esm/components/trees/common/TreeNodeRenderer.js.map +1 -1
  122. package/lib/esm/components/trees/common/TreeRenderer.d.ts +15 -1
  123. package/lib/esm/components/trees/common/TreeRenderer.js +15 -6
  124. package/lib/esm/components/trees/common/TreeRenderer.js.map +1 -1
  125. package/lib/esm/components/trees/common/TreeRenderer.scss +7 -2
  126. package/lib/esm/components/trees/common/Types.d.ts +8 -0
  127. package/lib/esm/components/trees/common/Types.js +3 -3
  128. package/lib/esm/components/trees/common/Types.js.map +1 -1
  129. package/lib/esm/components/trees/common/UseVisibilityTreeState.d.ts +36 -0
  130. package/lib/esm/components/trees/common/UseVisibilityTreeState.js +43 -0
  131. package/lib/esm/components/trees/common/UseVisibilityTreeState.js.map +1 -0
  132. package/lib/esm/components/trees/common/Utils.js +7 -5
  133. package/lib/esm/components/trees/common/Utils.js.map +1 -1
  134. package/lib/esm/components/trees/external-sources-tree/ExternalSources.json +1 -3
  135. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +9 -3
  136. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js +22 -10
  137. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  138. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +4 -4
  139. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  140. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.d.ts +9 -3
  141. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js +19 -15
  142. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  143. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js +6 -5
  144. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  145. package/lib/esm/components/trees/index.js +3 -3
  146. package/lib/esm/components/trees/index.js.map +1 -1
  147. package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +7 -2
  148. package/lib/esm/components/trees/models-tree/ModelsTree.js +80 -66
  149. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  150. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +12 -19
  151. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  152. package/lib/esm/components/trees/models-tree/ModelsTreeEventHandler.d.ts +9 -0
  153. package/lib/esm/components/trees/models-tree/ModelsTreeEventHandler.js +27 -0
  154. package/lib/esm/components/trees/models-tree/ModelsTreeEventHandler.js.map +1 -0
  155. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js +125 -66
  156. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  157. package/lib/esm/components/trees/models-tree/Utils.d.ts +4 -0
  158. package/lib/esm/components/trees/models-tree/Utils.js +50 -57
  159. package/lib/esm/components/trees/models-tree/Utils.js.map +1 -1
  160. package/lib/esm/components/utils/AutoSizer.js +7 -5
  161. package/lib/esm/components/utils/AutoSizer.js.map +1 -1
  162. package/lib/esm/components/utils/IsPromiseLike.js +4 -4
  163. package/lib/esm/components/utils/IsPromiseLike.js.map +1 -1
  164. package/lib/esm/components/utils/UseTreeTransientState.js +3 -3
  165. package/lib/esm/components/utils/UseTreeTransientState.js.map +1 -1
  166. package/lib/esm/e2e-tests/TreeWidget.test.js +54 -1
  167. package/lib/esm/e2e-tests/TreeWidget.test.js.map +1 -1
  168. package/lib/esm/e2e-tests/utils.d.ts +1 -0
  169. package/lib/esm/e2e-tests/utils.js +2 -4
  170. package/lib/esm/e2e-tests/utils.js.map +1 -1
  171. package/lib/esm/tree-widget-react.js +3 -3
  172. package/lib/esm/tree-widget-react.js.map +1 -1
  173. package/package.json +47 -46
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalSourcesTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/external-sources-tree/ExternalSourcesTree.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAE/F,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,6BAA6B,EAAE,mCAAmC,EAAE,MAAM,gCAAgC,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kCAAkC,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,KAAK,+BAA+B,MAAM,wBAAwB,CAAC;AAI1E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,+BAA0C,CAAC;AAEnF,MAAM,WAAW,GAAG,EAAE,CAAC;AAQvB;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,UAAU,EAAE,GAAG,6BAA6B,CAAC;QACnD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,wBAAwB;QACjC,UAAU,EAAE,WAAW;QACvB,qBAAqB;KACtB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,mCAAmC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACvD,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,KAAC,cAAc,IACb,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,QAAQ,EAC5D,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,YAAY,EAAE,IAAI,EAClB,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAC1B,KAAC,YAAY,OACP,SAAS,EACb,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EACxC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAC1C,OAAO,EAAE,KAAK,CAAC,OAAO,GACtB,GAEJ,GACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;IAC9D,kCAAkC;IAClC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;IACzC,CAAC;CACF,CAAC,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 \"../VisibilityTreeBase.scss\";\nimport { ControlledTree, SelectionMode, useTreeModel } from \"@itwin/components-react\";\nimport { usePresentationTreeNodeLoader, useUnifiedSelectionTreeEventHandler } from \"@itwin/presentation-components\";\nimport { TreeRenderer } from \"../common/TreeRenderer\";\nimport { addCustomTreeNodeItemLabelRenderer, combineTreeNodeItemCustomizations } from \"../common/Utils\";\nimport * as RULESET_EXTERNAL_SOURCES_IMPORT from \"./ExternalSources.json\";\n\nimport type { Ruleset } from \"@itwin/presentation-common\";\nimport type { BaseTreeProps } from \"../common/Types\";\n/**\n * Presentation rules used by ControlledCategoriesTree\n * @internal\n */\nexport const RULESET_EXTERNAL_SOURCES = RULESET_EXTERNAL_SOURCES_IMPORT as Ruleset;\n\nconst PAGING_SIZE = 20;\n\n/**\n * Props for the [[ExternalSourcesTree]] component\n * @alpha\n */\nexport type ExternalSourcesTreeProps = BaseTreeProps;\n\n/**\n * Tree which displays a hierarchy of ExternalSources and their elements.\n * @alpha\n */\nexport function ExternalSourcesTree(props: ExternalSourcesTreeProps) {\n const { nodeLoader } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: RULESET_EXTERNAL_SOURCES,\n pagingSize: PAGING_SIZE,\n customizeTreeNodeItem,\n });\n const eventsHandler = useUnifiedSelectionTreeEventHandler({ nodeLoader });\n const treeModel = useTreeModel(nodeLoader.modelSource);\n return (\n <div className=\"tree-widget-tree-container\">\n <ControlledTree\n nodeLoader={nodeLoader}\n model={treeModel}\n selectionMode={props.selectionMode ?? SelectionMode.Extended}\n eventsHandler={eventsHandler}\n width={props.width}\n height={props.height}\n iconsEnabled={true}\n treeRenderer={(treeProps) =>\n <TreeRenderer\n {...treeProps}\n contextMenuItems={props.contextMenuItems}\n nodeLabelRenderer={props.nodeLabelRenderer}\n density={props.density}\n />\n }\n />\n </div>\n );\n}\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([\n addCustomTreeNodeItemLabelRenderer,\n (item, node) => {\n item.icon = node.extendedData?.imageId;\n },\n]);\n"]}
1
+ {"version":3,"file":"ExternalSourcesTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/external-sources-tree/ExternalSourcesTree.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC5J,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,kCAAkC,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,KAAK,+BAA+B,MAAM,wBAAwB,CAAC;AAK1E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,+BAA0C,CAAC;AAEnF,MAAM,WAAW,GAAG,EAAE,CAAC;AAcvB;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAErF,MAAM,KAAK,GAAG,wBAAwB,CAAC;QACrC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,wBAAwB;QACjC,UAAU,EAAE,WAAW;QACvB,mBAAmB,EAAE,uCAAuC;QAC5D,qBAAqB;QACrB,uBAAuB,EAAE,oBAAoB,EAAE,SAAS;KACzD,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG;QACxB,gBAAgB;QAChB,iBAAiB;QACjB,OAAO;KACR,CAAC;IAEF,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,QAAQ,EAC5D,YAAY,EAAE,IAAI,EAClB,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAC1B,oBAAoB,EAAE,kBAAkB,CAAC,CAAC,CAAC,CACzC,KAAC,sBAAsB,OACjB,SAAS,KACT,iBAAiB,EACrB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,YAAY,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,KAAC,4BAA4B,OAAK,iBAAiB,GAAI,GAC5F,CACH,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,OAAK,SAAS,KAAM,iBAAiB,GAAI,CACvD,GAEH,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,uCAAuC,CAAC,KAAwC;IACvF,OAAO,IAAI,gCAAgC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;IAC9D,kCAAkC;IAClC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;IACzC,CAAC;CACF,CAAC,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 \"../VisibilityTreeBase.scss\";\nimport { SelectionMode } from \"@itwin/components-react\";\nimport { PresentationTree, PresentationTreeNodeRenderer, UnifiedSelectionTreeEventHandler, usePresentationTreeState } from \"@itwin/presentation-components\";\nimport { FilterableTreeRenderer, TreeRenderer } from \"../common/TreeRenderer\";\nimport { addCustomTreeNodeItemLabelRenderer, combineTreeNodeItemCustomizations } from \"../common/Utils\";\nimport * as RULESET_EXTERNAL_SOURCES_IMPORT from \"./ExternalSources.json\";\n\nimport type { Ruleset } from \"@itwin/presentation-common\";\nimport type { PresentationTreeEventHandlerProps } from \"@itwin/presentation-components\";\nimport type { BaseTreeProps, HierarchyLevelConfig } from \"../common/Types\";\n/**\n * Presentation rules used by ControlledCategoriesTree\n * @internal\n */\nexport const RULESET_EXTERNAL_SOURCES = RULESET_EXTERNAL_SOURCES_IMPORT as Ruleset;\n\nconst PAGING_SIZE = 20;\n\n/**\n * Props for the [[ExternalSourcesTree]] component\n * @alpha\n */\nexport interface ExternalSourcesTreeProps extends BaseTreeProps {\n /**\n * Props for configuring hierarchy level.\n * @beta\n */\n hierarchyLevelConfig?: HierarchyLevelConfig;\n}\n\n/**\n * Tree which displays a hierarchy of ExternalSources and their elements.\n * @alpha\n */\nexport function ExternalSourcesTree(props: ExternalSourcesTreeProps) {\n const { hierarchyLevelConfig, contextMenuItems, nodeLabelRenderer, density } = props;\n\n const state = usePresentationTreeState({\n imodel: props.iModel,\n ruleset: RULESET_EXTERNAL_SOURCES,\n pagingSize: PAGING_SIZE,\n eventHandlerFactory: unifiedSelectionTreeEventHandlerFactory,\n customizeTreeNodeItem,\n hierarchyLevelSizeLimit: hierarchyLevelConfig?.sizeLimit,\n });\n\n const treeRendererProps = {\n contextMenuItems,\n nodeLabelRenderer,\n density,\n };\n\n if (!state) {\n return null;\n }\n\n return (\n <div className=\"tree-widget-tree-container\">\n <PresentationTree\n width={props.width}\n height={props.height}\n state={state}\n selectionMode={props.selectionMode ?? SelectionMode.Extended}\n iconsEnabled={true}\n treeRenderer={(treeProps) =>\n hierarchyLevelConfig?.isFilteringEnabled ? (\n <FilterableTreeRenderer\n {...treeProps}\n {...treeRendererProps}\n nodeLoader={state.nodeLoader}\n nodeRenderer={(nodeRendererProps) => <PresentationTreeNodeRenderer {...nodeRendererProps} />}\n />\n ) : (\n <TreeRenderer {...treeProps} {...treeRendererProps} />\n )\n }\n />\n </div>\n );\n}\n\nfunction unifiedSelectionTreeEventHandlerFactory(props: PresentationTreeEventHandlerProps) {\n return new UnifiedSelectionTreeEventHandler({ nodeLoader: props.nodeLoader });\n}\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([\n addCustomTreeNodeItemLabelRenderer,\n (item, node) => {\n item.icon = node.extendedData?.imageId;\n },\n]);\n"]}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
6
  import "../VisibilityTreeBase.scss";
7
7
  import { useActiveIModelConnection } from "@itwin/appui-react";
8
8
  import { TreeWidget } from "../../../TreeWidget";
@@ -17,7 +17,7 @@ export const ExternalSourcesTreeComponent = (props) => {
17
17
  if (!iModel) {
18
18
  return null;
19
19
  }
20
- return (_jsx(AutoSizer, { children: ({ width, height }) => (_jsx(ExternalSourcesTree, { ...props, iModel: iModel, width: width, height: height })) }));
20
+ return _jsx(AutoSizer, { children: ({ width, height }) => _jsx(ExternalSourcesTree, { ...props, iModel: iModel, width: width, height: height }) });
21
21
  };
22
22
  /**
23
23
  * Id of the component. May be used when a creating a [[TreeDefinition]] for [[ExternalSourcesTreeComponent]].
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalSourcesTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/external-sources-tree/ExternalSourcesTreeComponent.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAE/F,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAU5D;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAwC,EAAE,EAAE;IACvF,MAAM,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,KAAC,SAAS,cACP,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CACtB,KAAC,mBAAmB,OACd,KAAK,EACT,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACd,CACH,GACS,CACb,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,4BAA4B,CAAC,EAAE,GAAG,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,4BAA4B,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,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 \"../VisibilityTreeBase.scss\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { ExternalSourcesTree } from \"./ExternalSourcesTree\";\n\nimport type { ExternalSourcesTreeProps } from \"./ExternalSourcesTree\";\n\n/**\n * Props for [[ExternalSourcesTreeComponent]].\n * @alpha\n */\nexport type ExternalSourcesTreeComponentProps = Omit<ExternalSourcesTreeProps, \"iModel\" | \"width\" | \"height\">;\n\n/**\n * A component that displays an External Sources tree and any necessary \"chrome\".\n * @alpha\n */\nexport const ExternalSourcesTreeComponent = (props: ExternalSourcesTreeComponentProps) => {\n const iModel = useActiveIModelConnection();\n if (!iModel) {\n return null;\n }\n\n return (\n <AutoSizer>\n {({ width, height }) => (\n <ExternalSourcesTree\n {...props}\n iModel={iModel}\n width={width}\n height={height}\n />\n )}\n </AutoSizer>\n );\n};\n\n/**\n * Id of the component. May be used when a creating a [[TreeDefinition]] for [[ExternalSourcesTreeComponent]].\n * @alpha\n */\nExternalSourcesTreeComponent.id = \"external-sources-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[ExternalSourcesTreeComponent]].\n * @alpha\n */\nExternalSourcesTreeComponent.getLabel = () => TreeWidget.translate(\"externalSources\");\n"]}
1
+ {"version":3,"file":"ExternalSourcesTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/external-sources-tree/ExternalSourcesTreeComponent.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAU5D;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,KAAwC,EAAE,EAAE;IACvF,MAAM,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAC,SAAS,cAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAC,mBAAmB,OAAK,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAI,GAAa,CAAC;AAC1I,CAAC,CAAC;AAEF;;;GAGG;AACH,4BAA4B,CAAC,EAAE,GAAG,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,4BAA4B,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,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 \"../VisibilityTreeBase.scss\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { ExternalSourcesTree } from \"./ExternalSourcesTree\";\n\nimport type { ExternalSourcesTreeProps } from \"./ExternalSourcesTree\";\n\n/**\n * Props for [[ExternalSourcesTreeComponent]].\n * @alpha\n */\nexport type ExternalSourcesTreeComponentProps = Omit<ExternalSourcesTreeProps, \"iModel\" | \"width\" | \"height\">;\n\n/**\n * A component that displays an External Sources tree and any necessary \"chrome\".\n * @alpha\n */\nexport const ExternalSourcesTreeComponent = (props: ExternalSourcesTreeComponentProps) => {\n const iModel = useActiveIModelConnection();\n if (!iModel) {\n return null;\n }\n\n return <AutoSizer>{({ width, height }) => <ExternalSourcesTree {...props} iModel={iModel} width={width} height={height} />}</AutoSizer>;\n};\n\n/**\n * Id of the component. May be used when a creating a [[TreeDefinition]] for [[ExternalSourcesTreeComponent]].\n * @alpha\n */\nExternalSourcesTreeComponent.id = \"external-sources-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[ExternalSourcesTreeComponent]].\n * @alpha\n */\nExternalSourcesTreeComponent.getLabel = () => TreeWidget.translate(\"externalSources\");\n"]}
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import type { Ruleset } from "@itwin/presentation-common";
3
- import type { BaseTreeProps } from "../common/Types";
3
+ import type { BaseTreeProps, HierarchyLevelConfig } from "../common/Types";
4
4
  /**
5
5
  * Presentation rules used by IModelContentTree
6
6
  * @internal
@@ -10,11 +10,17 @@ export declare const RULESET_IMODEL_CONTENT: Ruleset;
10
10
  * Props for [[IModelContentTree]].
11
11
  * @public
12
12
  */
13
- export type IModelContentTreeProps = BaseTreeProps;
13
+ export interface IModelContentTreeProps extends BaseTreeProps {
14
+ /**
15
+ * Props for configuring hierarchy level.
16
+ * @beta
17
+ */
18
+ hierarchyLevelConfig?: HierarchyLevelConfig;
19
+ }
14
20
  /**
15
21
  * A tree that shows all iModel content starting from the root Subject, then the hierarchy of child
16
22
  * Subjects, their Models and Elements contained in those Models.
17
23
  * @public
18
24
  */
19
- export declare const IModelContentTree: (props: IModelContentTreeProps) => JSX.Element;
25
+ export declare const IModelContentTree: (props: IModelContentTreeProps) => JSX.Element | null;
20
26
  //# sourceMappingURL=IModelContentTree.d.ts.map
@@ -1,12 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- import { useMemo } from "react";
7
- import { ControlledTree, SelectionMode, useTreeEventsHandler, useTreeModel } from "@itwin/components-react";
8
- import { usePresentationTreeNodeLoader } from "@itwin/presentation-components";
9
- import { TreeRenderer } from "../common/TreeRenderer";
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ import { SelectionMode } from "@itwin/components-react";
7
+ import { PresentationTree, PresentationTreeNodeRenderer, usePresentationTreeState } from "@itwin/presentation-components";
8
+ import { FilterableTreeRenderer, TreeRenderer } from "../common/TreeRenderer";
10
9
  import { addCustomTreeNodeItemLabelRenderer, combineTreeNodeItemCustomizations } from "../common/Utils";
11
10
  /**
12
11
  * Presentation rules used by IModelContentTree
@@ -19,19 +18,24 @@ export const RULESET_IMODEL_CONTENT = require("./IModelContent.json"); // eslint
19
18
  * @public
20
19
  */
21
20
  export const IModelContentTree = (props) => {
22
- const { iModel, width, height, selectionMode, contextMenuItems } = props;
23
- const { nodeLoader } = usePresentationTreeNodeLoader({
21
+ const { iModel, width, height, selectionMode, hierarchyLevelConfig } = props;
22
+ const state = usePresentationTreeState({
24
23
  imodel: iModel,
25
24
  ruleset: RULESET_IMODEL_CONTENT,
26
25
  pagingSize: 20,
27
26
  appendChildrenCountForGroupingNodes: true,
28
27
  customizeTreeNodeItem,
28
+ hierarchyLevelSizeLimit: hierarchyLevelConfig?.sizeLimit,
29
29
  });
30
- const eventHandler = useTreeEventsHandler(useMemo(() => ({ nodeLoader, modelSource: nodeLoader.modelSource }), [nodeLoader]));
31
- const treeModel = useTreeModel(nodeLoader.modelSource);
32
- return (_jsx("div", { className: "tree-widget-tree-container", children: _jsx(ControlledTree, { width: width, height: height, nodeLoader: nodeLoader, selectionMode: selectionMode ?? SelectionMode.None, eventsHandler: eventHandler, model: treeModel, treeRenderer: (treeProps) => _jsx(TreeRenderer, { ...treeProps, contextMenuItems: contextMenuItems, nodeLabelRenderer: props.nodeLabelRenderer, density: props.density }) }) }));
30
+ const treeRendererProps = {
31
+ contextMenuItems: props.contextMenuItems,
32
+ nodeLabelRenderer: props.nodeLabelRenderer,
33
+ density: props.density,
34
+ };
35
+ if (!state) {
36
+ return null;
37
+ }
38
+ return (_jsx("div", { className: "tree-widget-tree-container", children: _jsx(PresentationTree, { width: width, height: height, state: state, selectionMode: selectionMode ?? SelectionMode.None, treeRenderer: (treeProps) => hierarchyLevelConfig?.isFilteringEnabled ? (_jsx(FilterableTreeRenderer, { ...treeProps, ...treeRendererProps, nodeLoader: state.nodeLoader, nodeRenderer: (nodeRendererProps) => _jsx(PresentationTreeNodeRenderer, { ...nodeRendererProps }) })) : (_jsx(TreeRenderer, { ...treeProps, ...treeRendererProps })) }) }));
33
39
  };
34
- const customizeTreeNodeItem = combineTreeNodeItemCustomizations([
35
- addCustomTreeNodeItemLabelRenderer,
36
- ]);
40
+ const customizeTreeNodeItem = combineTreeNodeItemCustomizations([addCustomTreeNodeItemLabelRenderer]);
37
41
  //# sourceMappingURL=IModelContentTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IModelContentTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/imodel-content-tree/IModelContentTree.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5G,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kCAAkC,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AAKxG;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAY,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,yDAAyD;AAQzI;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAE,EAAE;IACjE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAEzE,MAAM,EAAE,UAAU,EAAE,GAAG,6BAA6B,CAAC;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,sBAAsB;QAC/B,UAAU,EAAE,EAAE;QACd,mCAAmC,EAAE,IAAI;QACzC,qBAAqB;KACtB,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAE9H,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEvD,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,KAAC,cAAc,IACb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,IAAI,aAAa,CAAC,IAAI,EAClD,aAAa,EAAE,YAAY,EAC3B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAC1B,KAAC,YAAY,OACP,SAAS,EACb,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAC1C,OAAO,EAAE,KAAK,CAAC,OAAO,GACtB,GAEJ,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;IAC9D,kCAAkC;CACnC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { useMemo } from \"react\";\nimport { ControlledTree, SelectionMode, useTreeEventsHandler, useTreeModel } from \"@itwin/components-react\";\nimport { usePresentationTreeNodeLoader } from \"@itwin/presentation-components\";\nimport { TreeRenderer } from \"../common/TreeRenderer\";\nimport { addCustomTreeNodeItemLabelRenderer, combineTreeNodeItemCustomizations } from \"../common/Utils\";\n\nimport type { Ruleset } from \"@itwin/presentation-common\";\nimport type { BaseTreeProps } from \"../common/Types\";\n\n/**\n * Presentation rules used by IModelContentTree\n * @internal\n */\nexport const RULESET_IMODEL_CONTENT: Ruleset = require(\"./IModelContent.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\n/**\n * Props for [[IModelContentTree]].\n * @public\n */\nexport type IModelContentTreeProps = BaseTreeProps;\n\n/**\n * A tree that shows all iModel content starting from the root Subject, then the hierarchy of child\n * Subjects, their Models and Elements contained in those Models.\n * @public\n */\nexport const IModelContentTree = (props: IModelContentTreeProps) => {\n const { iModel, width, height, selectionMode, contextMenuItems } = props;\n\n const { nodeLoader } = usePresentationTreeNodeLoader({\n imodel: iModel,\n ruleset: RULESET_IMODEL_CONTENT,\n pagingSize: 20,\n appendChildrenCountForGroupingNodes: true,\n customizeTreeNodeItem,\n });\n const eventHandler = useTreeEventsHandler(useMemo(() => ({ nodeLoader, modelSource: nodeLoader.modelSource }), [nodeLoader]));\n\n const treeModel = useTreeModel(nodeLoader.modelSource);\n\n return (\n <div className=\"tree-widget-tree-container\">\n <ControlledTree\n width={width}\n height={height}\n nodeLoader={nodeLoader}\n selectionMode={selectionMode ?? SelectionMode.None}\n eventsHandler={eventHandler}\n model={treeModel}\n treeRenderer={(treeProps) =>\n <TreeRenderer\n {...treeProps}\n contextMenuItems={contextMenuItems}\n nodeLabelRenderer={props.nodeLabelRenderer}\n density={props.density}\n />\n }\n />\n </div>\n );\n};\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([\n addCustomTreeNodeItemLabelRenderer,\n]);\n"]}
1
+ {"version":3,"file":"IModelContentTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/imodel-content-tree/IModelContentTree.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1H,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,kCAAkC,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AAIxG;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAY,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,yDAAyD;AAczI;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAE,EAAE;IACjE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,EAAE,GAAG,KAAK,CAAC;IAE7E,MAAM,KAAK,GAAG,wBAAwB,CAAC;QACrC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,sBAAsB;QAC/B,UAAU,EAAE,EAAE;QACd,mCAAmC,EAAE,IAAI;QACzC,qBAAqB;QACrB,uBAAuB,EAAE,oBAAoB,EAAE,SAAS;KACzD,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG;QACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IAEF,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,cAAK,SAAS,EAAC,4BAA4B,YACzC,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,IAAI,aAAa,CAAC,IAAI,EAClD,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAC1B,oBAAoB,EAAE,kBAAkB,CAAC,CAAC,CAAC,CACzC,KAAC,sBAAsB,OACjB,SAAS,KACT,iBAAiB,EACrB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,YAAY,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,KAAC,4BAA4B,OAAK,iBAAiB,GAAI,GAC5F,CACH,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,OAAK,SAAS,KAAM,iBAAiB,GAAI,CACvD,GAEH,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,iCAAiC,CAAC,CAAC,kCAAkC,CAAC,CAAC,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 { SelectionMode } from \"@itwin/components-react\";\nimport { PresentationTree, PresentationTreeNodeRenderer, usePresentationTreeState } from \"@itwin/presentation-components\";\nimport { FilterableTreeRenderer, TreeRenderer } from \"../common/TreeRenderer\";\nimport { addCustomTreeNodeItemLabelRenderer, combineTreeNodeItemCustomizations } from \"../common/Utils\";\n\nimport type { Ruleset } from \"@itwin/presentation-common\";\nimport type { BaseTreeProps, HierarchyLevelConfig } from \"../common/Types\";\n/**\n * Presentation rules used by IModelContentTree\n * @internal\n */\nexport const RULESET_IMODEL_CONTENT: Ruleset = require(\"./IModelContent.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\n/**\n * Props for [[IModelContentTree]].\n * @public\n */\nexport interface IModelContentTreeProps extends BaseTreeProps {\n /**\n * Props for configuring hierarchy level.\n * @beta\n */\n hierarchyLevelConfig?: HierarchyLevelConfig;\n}\n\n/**\n * A tree that shows all iModel content starting from the root Subject, then the hierarchy of child\n * Subjects, their Models and Elements contained in those Models.\n * @public\n */\nexport const IModelContentTree = (props: IModelContentTreeProps) => {\n const { iModel, width, height, selectionMode, hierarchyLevelConfig } = props;\n\n const state = usePresentationTreeState({\n imodel: iModel,\n ruleset: RULESET_IMODEL_CONTENT,\n pagingSize: 20,\n appendChildrenCountForGroupingNodes: true,\n customizeTreeNodeItem,\n hierarchyLevelSizeLimit: hierarchyLevelConfig?.sizeLimit,\n });\n\n const treeRendererProps = {\n contextMenuItems: props.contextMenuItems,\n nodeLabelRenderer: props.nodeLabelRenderer,\n density: props.density,\n };\n\n if (!state) {\n return null;\n }\n\n return (\n <div className=\"tree-widget-tree-container\">\n <PresentationTree\n width={width}\n height={height}\n state={state}\n selectionMode={selectionMode ?? SelectionMode.None}\n treeRenderer={(treeProps) =>\n hierarchyLevelConfig?.isFilteringEnabled ? (\n <FilterableTreeRenderer\n {...treeProps}\n {...treeRendererProps}\n nodeLoader={state.nodeLoader}\n nodeRenderer={(nodeRendererProps) => <PresentationTreeNodeRenderer {...nodeRendererProps} />}\n />\n ) : (\n <TreeRenderer {...treeProps} {...treeRendererProps} />\n )\n }\n />\n </div>\n );\n};\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([addCustomTreeNodeItemLabelRenderer]);\n"]}
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
6
  import "../VisibilityTreeBase.scss";
7
7
  import { useActiveIModelConnection } from "@itwin/appui-react";
8
8
  import { TreeWidget } from "../../../TreeWidget";
@@ -14,9 +14,10 @@ import { IModelContentTree } from "./IModelContentTree";
14
14
  */
15
15
  export const IModelContentTreeComponent = (props) => {
16
16
  const iModel = useActiveIModelConnection();
17
- if (!iModel)
17
+ if (!iModel) {
18
18
  return null;
19
- return (_jsx(AutoSizer, { children: ({ width, height }) => (_jsx(IModelContentTree, { ...props, iModel: iModel, width: width, height: height })) }));
19
+ }
20
+ return _jsx(AutoSizer, { children: ({ width, height }) => _jsx(IModelContentTree, { ...props, iModel: iModel, width: width, height: height }) });
20
21
  };
21
22
  /**
22
23
  * Id of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].
@@ -1 +1 @@
1
- {"version":3,"file":"IModelContentTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/imodel-content-tree/IModelContentTreeComponent.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAE/F,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAUxD;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAsC,EAAE,EAAE;IACnF,MAAM,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAE3C,IAAI,CAAC,MAAM;QACT,OAAO,IAAI,CAAC;IAEd,OAAO,CACL,KAAC,SAAS,cACP,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CACtB,KAAC,iBAAiB,OACZ,KAAK,EACT,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACd,CACH,GACS,CACb,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,0BAA0B,CAAC,EAAE,GAAG,qBAAqB,CAAC;AAEtD;;;GAGG;AACH,0BAA0B,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,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 \"../VisibilityTreeBase.scss\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { IModelContentTree } from \"./IModelContentTree\";\n\nimport type { IModelContentTreeProps } from \"./IModelContentTree\";\n\n/**\n * Props for [[IModelContentTreeComponent]].\n * @public\n */\nexport type IModelContentTreeComponentProps = Omit<IModelContentTreeProps, \"iModel\" | \"width\" | \"height\">;\n\n/**\n * A component that renders [[IModelContentTree]]\n * @public\n */\nexport const IModelContentTreeComponent = (props: IModelContentTreeComponentProps) => {\n const iModel = useActiveIModelConnection();\n\n if (!iModel)\n return null;\n\n return (\n <AutoSizer>\n {({ width, height }) => (\n <IModelContentTree\n {...props}\n iModel={iModel}\n width={width}\n height={height}\n />\n )}\n </AutoSizer>\n );\n};\n\n/**\n * Id of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].\n * @public\n */\nIModelContentTreeComponent.id = \"imodel-content-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].\n * @public\n */\nIModelContentTreeComponent.getLabel = () => TreeWidget.translate(\"imodelContent\");\n"]}
1
+ {"version":3,"file":"IModelContentTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/imodel-content-tree/IModelContentTreeComponent.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAUxD;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAsC,EAAE,EAAE;IACnF,MAAM,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAC,SAAS,cAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAC,iBAAiB,OAAK,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAI,GAAa,CAAC;AACxI,CAAC,CAAC;AAEF;;;GAGG;AACH,0BAA0B,CAAC,EAAE,GAAG,qBAAqB,CAAC;AAEtD;;;GAGG;AACH,0BAA0B,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,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 \"../VisibilityTreeBase.scss\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { IModelContentTree } from \"./IModelContentTree\";\n\nimport type { IModelContentTreeProps } from \"./IModelContentTree\";\n\n/**\n * Props for [[IModelContentTreeComponent]].\n * @public\n */\nexport type IModelContentTreeComponentProps = Omit<IModelContentTreeProps, \"iModel\" | \"width\" | \"height\">;\n\n/**\n * A component that renders [[IModelContentTree]]\n * @public\n */\nexport const IModelContentTreeComponent = (props: IModelContentTreeComponentProps) => {\n const iModel = useActiveIModelConnection();\n\n if (!iModel) {\n return null;\n }\n\n return <AutoSizer>{({ width, height }) => <IModelContentTree {...props} iModel={iModel} width={width} height={height} />}</AutoSizer>;\n};\n\n/**\n * Id of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].\n * @public\n */\nIModelContentTreeComponent.id = \"imodel-content-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].\n * @public\n */\nIModelContentTreeComponent.getLabel = () => TreeWidget.translate(\"imodelContent\");\n"]}
@@ -1,7 +1,7 @@
1
1
  /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
5
  export * from "./common/Types";
6
6
  export * from "./common/ContextMenu";
7
7
  export * from "./common/TreeRenderer";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/trees/index.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAE1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sDAAsD,CAAC;AAErE,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,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\nexport * from \"./common/Types\";\nexport * from \"./common/ContextMenu\";\nexport * from \"./common/TreeRenderer\";\nexport * from \"./common/TreeNodeRenderer\";\nexport * from \"./VisibilityTreeEventHandler\";\nexport * from \"./VisibilityTreeRenderer\";\n\nexport * from \"./imodel-content-tree/IModelContentTree\";\nexport * from \"./imodel-content-tree/IModelContentTreeComponent\";\n\nexport * from \"./category-tree/CategoriesTree\";\nexport * from \"./category-tree/CategoriesTreeComponent\";\nexport * from \"./category-tree/CategoryVisibilityHandler\";\n\nexport * from \"./external-sources-tree/ExternalSourcesTree\";\nexport * from \"./external-sources-tree/ExternalSourcesTreeComponent\";\n\nexport * from \"./models-tree/ModelsTree\";\nexport * from \"./models-tree/ModelsTreeComponent\";\nexport * from \"./models-tree/ModelsVisibilityHandler\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/trees/index.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,kDAAkD,CAAC;AAEjE,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAE1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sDAAsD,CAAC;AAErE,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,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\nexport * from \"./common/Types\";\nexport * from \"./common/ContextMenu\";\nexport * from \"./common/TreeRenderer\";\nexport * from \"./common/TreeNodeRenderer\";\nexport * from \"./VisibilityTreeEventHandler\";\nexport * from \"./VisibilityTreeRenderer\";\n\nexport * from \"./imodel-content-tree/IModelContentTree\";\nexport * from \"./imodel-content-tree/IModelContentTreeComponent\";\n\nexport * from \"./category-tree/CategoriesTree\";\nexport * from \"./category-tree/CategoriesTreeComponent\";\nexport * from \"./category-tree/CategoryVisibilityHandler\";\n\nexport * from \"./external-sources-tree/ExternalSourcesTree\";\nexport * from \"./external-sources-tree/ExternalSourcesTreeComponent\";\n\nexport * from \"./models-tree/ModelsTree\";\nexport * from \"./models-tree/ModelsTreeComponent\";\nexport * from \"./models-tree/ModelsVisibilityHandler\";\n"]}
@@ -4,7 +4,7 @@ import { ClassGroupingOption } from "../common/Types";
4
4
  import { ModelsVisibilityHandler } from "./ModelsVisibilityHandler";
5
5
  import type { SingleSchemaClassSpecification } from "@itwin/presentation-common";
6
6
  import type { Viewport } from "@itwin/core-frontend";
7
- import type { BaseFilterableTreeProps } from "../common/Types";
7
+ import type { BaseFilterableTreeProps, HierarchyLevelConfig } from "../common/Types";
8
8
  import type { ModelsTreeSelectionPredicate, ModelsVisibilityHandlerProps } from "./ModelsVisibilityHandler";
9
9
  /**
10
10
  * Props for configuring the hierarchy in [[ModelsTree]].
@@ -47,6 +47,11 @@ export interface ModelsTreeProps extends BaseFilterableTreeProps {
47
47
  * Custom visibility handler.
48
48
  */
49
49
  modelsVisibilityHandler?: ModelsVisibilityHandler | ((props: ModelsVisibilityHandlerProps) => ModelsVisibilityHandler);
50
+ /**
51
+ * Props for configuring hierarchy level.
52
+ * @beta
53
+ */
54
+ hierarchyLevelConfig?: HierarchyLevelConfig;
50
55
  }
51
56
  /**
52
57
  * A tree component that shows a subject - model - category - element
@@ -54,5 +59,5 @@ export interface ModelsTreeProps extends BaseFilterableTreeProps {
54
59
  * the display of those instances.
55
60
  * @public
56
61
  */
57
- export declare function ModelsTree(props: ModelsTreeProps): JSX.Element;
62
+ export declare function ModelsTree(props: ModelsTreeProps): JSX.Element | null;
58
63
  //# sourceMappingURL=ModelsTree.d.ts.map
@@ -1,19 +1,20 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
6
  import "../VisibilityTreeBase.scss";
7
7
  import classNames from "classnames";
8
- import { useCallback, useEffect, useMemo } from "react";
9
- import { ControlledTree, SelectionMode, useTreeModel } from "@itwin/components-react";
10
- import { useDisposable } from "@itwin/core-react";
11
- import { isPresentationTreeNodeItem, usePresentationTreeNodeLoader } from "@itwin/presentation-components";
8
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
9
+ import { SelectionMode } from "@itwin/components-react";
10
+ import { isPresentationTreeNodeItem, PresentationTree } from "@itwin/presentation-components";
12
11
  import { TreeWidget } from "../../../TreeWidget";
12
+ import { FilterableTreeRenderer } from "../common/TreeRenderer";
13
13
  import { ClassGroupingOption } from "../common/Types";
14
+ import { useVisibilityTreeState } from "../common/UseVisibilityTreeState";
14
15
  import { addCustomTreeNodeItemLabelRenderer, addTreeNodeItemCheckbox, combineTreeNodeItemCustomizations } from "../common/Utils";
15
- import { VisibilityTreeEventHandler } from "../VisibilityTreeEventHandler";
16
- import { createVisibilityTreeRenderer, useVisibilityTreeFiltering, VisibilityTreeNoFilteredData } from "../VisibilityTreeRenderer";
16
+ import { createVisibilityTreeRenderer, FilterableVisibilityTreeNodeRenderer, VisibilityTreeNoFilteredData } from "../VisibilityTreeRenderer";
17
+ import { ModelsTreeEventHandler } from "./ModelsTreeEventHandler";
17
18
  import { ModelsVisibilityHandler, SubjectModelIdsCache } from "./ModelsVisibilityHandler";
18
19
  import { addModelsTreeNodeItemIcons, createRuleset, createSearchRuleset } from "./Utils";
19
20
  const PAGING_SIZE = 20;
@@ -24,18 +25,9 @@ const PAGING_SIZE = 20;
24
25
  * @public
25
26
  */
26
27
  export function ModelsTree(props) {
27
- const { nodeLoader, onItemsRendered } = useModelsTreeNodeLoader(props);
28
- const { filteredNodeLoader, isFiltering, nodeHighlightingProps } = useVisibilityTreeFiltering(nodeLoader, props.filterInfo, props.onFilterApplied);
29
- const filterApplied = filteredNodeLoader !== nodeLoader;
30
- const { activeView, modelsVisibilityHandler, selectionPredicate } = props;
31
- const visibilityHandler = useVisibilityHandler(nodeLoader.dataProvider.rulesetId, props.iModel, activeView, modelsVisibilityHandler, getFilteredDataProvider(filteredNodeLoader.dataProvider), props.enableHierarchyAutoUpdate);
32
- const eventHandler = useDisposable(useCallback(() => new VisibilityTreeEventHandler({
33
- nodeLoader: filteredNodeLoader,
34
- visibilityHandler,
35
- selectionPredicate: (node) => !selectionPredicate || !isPresentationTreeNodeItem(node) ? true : selectionPredicate(node.key, ModelsVisibilityHandler.getNodeType(node)),
36
- }), [filteredNodeLoader, visibilityHandler, selectionPredicate]));
37
- const treeModel = useTreeModel(filteredNodeLoader.modelSource);
38
- const treeRenderer = createVisibilityTreeRenderer({
28
+ const { hierarchyLevelConfig, density, height, width, selectionMode } = props;
29
+ const state = useModelsTreeState(props);
30
+ const baseRendererProps = {
39
31
  contextMenuItems: props.contextMenuItems,
40
32
  nodeLabelRenderer: props.nodeLabelRenderer,
41
33
  density: props.density,
@@ -45,20 +37,24 @@ export function ModelsTree(props) {
45
37
  levelOffset: 10,
46
38
  disableRootNodeCollapse: true,
47
39
  },
48
- });
49
- const overlay = isFiltering ? _jsx("div", { className: "filteredTreeOverlay" }) : undefined;
40
+ };
50
41
  // istanbul ignore next
51
42
  const noFilteredDataRenderer = useCallback(() => {
52
- return _jsx(VisibilityTreeNoFilteredData, { title: TreeWidget.translate("modelTree.noModelFound"), message: TreeWidget.translate("modelTree.noMatchingModelNames") });
43
+ return (_jsx(VisibilityTreeNoFilteredData, { title: TreeWidget.translate("modelTree.noModelFound"), message: TreeWidget.translate("modelTree.noMatchingModelNames") }));
53
44
  }, []);
54
- return (_jsxs("div", { className: classNames("tree-widget-visibility-tree-base", "tree-widget-tree-container"), children: [_jsx(ControlledTree, { nodeLoader: filteredNodeLoader, model: treeModel, selectionMode: props.selectionMode || SelectionMode.None, eventsHandler: eventHandler, treeRenderer: treeRenderer, nodeHighlightingProps: nodeHighlightingProps, noDataRenderer: filterApplied ? noFilteredDataRenderer : undefined, onItemsRendered: onItemsRendered, width: props.width, height: props.height }), overlay] }));
45
+ if (!state) {
46
+ return null;
47
+ }
48
+ const isFilterApplied = state.filteringResult?.filteredProvider !== undefined;
49
+ const overlay = state.filteringResult?.isFiltering ? _jsx("div", { className: "filteredTreeOverlay" }) : undefined;
50
+ return (_jsxs("div", { className: classNames("tree-widget-visibility-tree-base", "tree-widget-tree-container"), children: [_jsx(PresentationTree, { state: state, selectionMode: selectionMode || SelectionMode.None, treeRenderer: hierarchyLevelConfig?.isFilteringEnabled
51
+ ? (rendererProps) => (_jsx(FilterableTreeRenderer, { ...rendererProps, ...baseRendererProps, nodeLoader: state.nodeLoader, nodeRenderer: (nodeProps) => _jsx(ModelsTreeNodeRenderer, { ...nodeProps, density: density }) }))
52
+ : createVisibilityTreeRenderer(baseRendererProps), noDataRenderer: isFilterApplied ? noFilteredDataRenderer : undefined, width: width, height: height }), overlay] }));
53
+ }
54
+ function ModelsTreeNodeRenderer(props) {
55
+ return (_jsx(FilterableVisibilityTreeNodeRenderer, { ...props, iconsEnabled: true, descriptionEnabled: false, levelOffset: 10, disableRootNodeCollapse: true, isEnlarged: props.density === "enlarged" }));
55
56
  }
56
- const customizeTreeNodeItem = combineTreeNodeItemCustomizations([
57
- addCustomTreeNodeItemLabelRenderer,
58
- addTreeNodeItemCheckbox,
59
- addModelsTreeNodeItemIcons,
60
- ]);
61
- function useModelsTreeNodeLoader(props) {
57
+ function useModelsTreeState({ filterInfo, onFilterApplied, ...props }) {
62
58
  const rulesets = {
63
59
  general: useMemo(() => createRuleset({
64
60
  enableElementsClassGrouping: !!props.hierarchyConfig?.enableElementsClassGrouping,
@@ -70,54 +66,72 @@ function useModelsTreeNodeLoader(props) {
70
66
  showEmptyModels: props.hierarchyConfig?.showEmptyModels,
71
67
  }), [props.hierarchyConfig?.elementClassSpecification, props.hierarchyConfig?.showEmptyModels]),
72
68
  };
73
- const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({
74
- imodel: props.iModel,
69
+ const treeState = useTreeState({
70
+ ...props,
75
71
  ruleset: rulesets.general,
76
- appendChildrenCountForGroupingNodes: (props.hierarchyConfig?.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts),
77
- pagingSize: PAGING_SIZE,
78
- enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,
79
- customizeTreeNodeItem,
80
72
  });
81
- const { nodeLoader: searchNodeLoader, onItemsRendered: onSearchItemsRendered } = usePresentationTreeNodeLoader({
82
- imodel: props.iModel,
73
+ const filteredTreeState = useTreeState({
74
+ ...props,
83
75
  ruleset: rulesets.search,
76
+ filterInfo,
77
+ onFilterApplied,
78
+ });
79
+ return filterInfo?.filter ? filteredTreeState : treeState;
80
+ }
81
+ function useTreeState({ modelsVisibilityHandler, activeView, selectionPredicate, hierarchyConfig, iModel, ruleset, enableHierarchyAutoUpdate, filterInfo, onFilterApplied, hierarchyLevelConfig, }) {
82
+ const visibilityHandler = useVisibilityHandler(ruleset.id, iModel, activeView, modelsVisibilityHandler);
83
+ const selectionPredicateRef = useRef(selectionPredicate);
84
+ useEffect(() => {
85
+ selectionPredicateRef.current = selectionPredicate;
86
+ }, [selectionPredicate]);
87
+ const onFilterChange = useCallback((dataProvider, matchesCount) => {
88
+ if (onFilterApplied && dataProvider && matchesCount !== undefined) {
89
+ onFilterApplied(dataProvider, matchesCount);
90
+ }
91
+ if (visibilityHandler) {
92
+ visibilityHandler.setFilteredDataProvider(dataProvider);
93
+ }
94
+ }, [onFilterApplied, visibilityHandler]);
95
+ return useVisibilityTreeState({
96
+ imodel: iModel,
97
+ ruleset,
84
98
  pagingSize: PAGING_SIZE,
85
- enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,
99
+ appendChildrenCountForGroupingNodes: hierarchyConfig?.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts,
100
+ enableHierarchyAutoUpdate,
86
101
  customizeTreeNodeItem,
102
+ visibilityHandler,
103
+ filterInfo,
104
+ onFilterChange,
105
+ selectionPredicate: useCallback((node) => !selectionPredicateRef.current || !isPresentationTreeNodeItem(node)
106
+ ? true
107
+ : selectionPredicateRef.current(node.key, ModelsVisibilityHandler.getNodeType(node)), []),
108
+ eventHandler: eventHandlerFactory,
109
+ hierarchyLevelSizeLimit: hierarchyLevelConfig?.sizeLimit,
87
110
  });
88
- const activeNodeLoader = props.filterInfo?.filter ? searchNodeLoader : nodeLoader;
89
- const activeItemsRenderedCallback = props.filterInfo?.filter ? onSearchItemsRendered : onItemsRendered;
90
- return {
91
- nodeLoader: activeNodeLoader,
92
- onItemsRendered: activeItemsRenderedCallback,
93
- };
94
111
  }
95
- function useVisibilityHandler(rulesetId, iModel, activeView, visibilityHandler, filteredDataProvider, hierarchyAutoUpdateEnabled) {
112
+ function eventHandlerFactory(props) {
113
+ return new ModelsTreeEventHandler(props);
114
+ }
115
+ function useVisibilityHandler(rulesetId, iModel, activeView, visibilityHandler, hierarchyAutoUpdateEnabled) {
96
116
  const subjectModelIdsCache = useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);
97
- const disposableVisibilityHandler = useDisposable(useCallback(() => {
117
+ const [state, setState] = useState();
118
+ useEffect(() => {
119
+ if (visibilityHandler && typeof visibilityHandler !== "function") {
120
+ return;
121
+ }
98
122
  const visibilityHandlerProps = {
99
123
  rulesetId,
100
124
  viewport: activeView,
101
125
  hierarchyAutoUpdateEnabled,
102
126
  subjectModelIdsCache,
103
127
  };
104
- return typeof visibilityHandler === "function"
105
- ? visibilityHandler(visibilityHandlerProps)
106
- : new ModelsVisibilityHandler(visibilityHandlerProps);
107
- }, [visibilityHandler, rulesetId, activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache]));
108
- const handler = typeof visibilityHandler === "function" || visibilityHandler === undefined
109
- ? disposableVisibilityHandler
110
- : visibilityHandler;
111
- useEffect(() => {
112
- handler && handler.setFilteredDataProvider(filteredDataProvider);
113
- }, [handler, filteredDataProvider]);
114
- return handler;
128
+ const handler = visibilityHandler ? visibilityHandler(visibilityHandlerProps) : new ModelsVisibilityHandler(visibilityHandlerProps);
129
+ setState(handler);
130
+ return () => {
131
+ handler.dispose();
132
+ };
133
+ }, [rulesetId, activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache, visibilityHandler]);
134
+ return visibilityHandler && typeof visibilityHandler !== "function" ? visibilityHandler : state;
115
135
  }
116
- const isFilteredDataProvider = (dataProvider) => {
117
- const filteredProvider = dataProvider;
118
- return filteredProvider.nodeMatchesFilter !== undefined && filteredProvider.getActiveMatch !== undefined && filteredProvider.countFilteringResults !== undefined;
119
- };
120
- const getFilteredDataProvider = (dataProvider) => {
121
- return isFilteredDataProvider(dataProvider) ? dataProvider : undefined;
122
- };
136
+ const customizeTreeNodeItem = combineTreeNodeItemCustomizations([addCustomTreeNodeItemLabelRenderer, addTreeNodeItemCheckbox, addModelsTreeNodeItemIcons]);
123
137
  //# sourceMappingURL=ModelsTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTree.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 \"../VisibilityTreeBase.scss\";\nimport classNames from \"classnames\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { ControlledTree, SelectionMode, useTreeModel } from \"@itwin/components-react\";\nimport { useDisposable } from \"@itwin/core-react\";\nimport { isPresentationTreeNodeItem, usePresentationTreeNodeLoader } from \"@itwin/presentation-components\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { ClassGroupingOption } from \"../common/Types\";\nimport { addCustomTreeNodeItemLabelRenderer, addTreeNodeItemCheckbox, combineTreeNodeItemCustomizations } from \"../common/Utils\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { createVisibilityTreeRenderer, useVisibilityTreeFiltering, VisibilityTreeNoFilteredData } from \"../VisibilityTreeRenderer\";\nimport { ModelsVisibilityHandler, SubjectModelIdsCache } from \"./ModelsVisibilityHandler\";\nimport { addModelsTreeNodeItemIcons, createRuleset, createSearchRuleset } from \"./Utils\";\n\nimport type { SingleSchemaClassSpecification } from \"@itwin/presentation-common\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport type { IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport type { BaseFilterableTreeProps } from \"../common/Types\";\nimport type { ModelsTreeSelectionPredicate, ModelsVisibilityHandlerProps } from \"./ModelsVisibilityHandler\";\n\nconst PAGING_SIZE = 20;\n\n/**\n * Props for configuring the hierarchy in [[ModelsTree]].\n * @public\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should the tree group displayed element nodes by class. Defaults to `ClassGroupingOption.No`. */\n enableElementsClassGrouping?: ClassGroupingOption;\n /**\n * Defines the `bis.GeometricElement3d` sub-class that should be used to load element nodes.\n * Defaults to `bis.GeometricElement3d`. It's expected for the given class to derive from it.\n */\n elementClassSpecification?: SingleSchemaClassSpecification;\n /** Should the tree show models without elements. */\n showEmptyModels?: boolean;\n}\n\n/**\n * Props for [[ModelsTree]] component.\n * @public\n */\nexport interface ModelsTreeProps extends BaseFilterableTreeProps {\n /**\n * Predicate which indicates whether node can be selected or no\n */\n selectionPredicate?: ModelsTreeSelectionPredicate;\n /**\n * Active view used to determine and control visibility\n */\n activeView: Viewport;\n /**\n * Configuration options for the hierarchy loaded in the component.\n */\n hierarchyConfig?: ModelsTreeHierarchyConfiguration;\n /**\n * Auto-update the hierarchy when data in the iModel changes.\n * @alpha\n */\n enableHierarchyAutoUpdate?: boolean;\n /**\n * Custom visibility handler.\n */\n modelsVisibilityHandler?: ModelsVisibilityHandler | ((props: ModelsVisibilityHandlerProps) => ModelsVisibilityHandler);\n}\n\n/**\n * A tree component that shows a subject - model - category - element\n * hierarchy along with checkboxes that represent and allow changing\n * the display of those instances.\n * @public\n */\nexport function ModelsTree(props: ModelsTreeProps) {\n const { nodeLoader, onItemsRendered } = useModelsTreeNodeLoader(props);\n const { filteredNodeLoader, isFiltering, nodeHighlightingProps } = useVisibilityTreeFiltering(nodeLoader, props.filterInfo, props.onFilterApplied);\n const filterApplied = filteredNodeLoader !== nodeLoader;\n\n const { activeView, modelsVisibilityHandler, selectionPredicate } = props;\n\n const visibilityHandler = useVisibilityHandler(\n nodeLoader.dataProvider.rulesetId,\n props.iModel,\n activeView,\n modelsVisibilityHandler,\n getFilteredDataProvider(filteredNodeLoader.dataProvider),\n props.enableHierarchyAutoUpdate);\n const eventHandler = useDisposable(useCallback(() => new VisibilityTreeEventHandler({\n nodeLoader: filteredNodeLoader,\n visibilityHandler,\n selectionPredicate: (node) => !selectionPredicate || !isPresentationTreeNodeItem(node) ? true : selectionPredicate(node.key, ModelsVisibilityHandler.getNodeType(node)),\n }), [filteredNodeLoader, visibilityHandler, selectionPredicate]));\n\n const treeModel = useTreeModel(filteredNodeLoader.modelSource);\n const treeRenderer = createVisibilityTreeRenderer({\n contextMenuItems: props.contextMenuItems,\n nodeLabelRenderer: props.nodeLabelRenderer,\n density: props.density,\n nodeRendererProps: {\n iconsEnabled: true,\n descriptionEnabled: false,\n levelOffset: 10,\n disableRootNodeCollapse: true,\n },\n });\n\n const overlay = isFiltering ? <div className=\"filteredTreeOverlay\" /> : undefined;\n\n // istanbul ignore next\n const noFilteredDataRenderer = useCallback(() => {\n return <VisibilityTreeNoFilteredData\n title={TreeWidget.translate(\"modelTree.noModelFound\")}\n message={TreeWidget.translate(\"modelTree.noMatchingModelNames\")}\n />;\n }, []);\n\n return (\n <div className={classNames(\"tree-widget-visibility-tree-base\", \"tree-widget-tree-container\")}>\n <ControlledTree\n nodeLoader={filteredNodeLoader}\n model={treeModel}\n selectionMode={props.selectionMode || SelectionMode.None}\n eventsHandler={eventHandler}\n treeRenderer={treeRenderer}\n nodeHighlightingProps={nodeHighlightingProps}\n noDataRenderer={filterApplied ? noFilteredDataRenderer : undefined}\n onItemsRendered={onItemsRendered}\n width={props.width}\n height={props.height}\n />\n {overlay}\n </div>\n );\n}\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([\n addCustomTreeNodeItemLabelRenderer,\n addTreeNodeItemCheckbox,\n addModelsTreeNodeItemIcons,\n]);\n\nfunction useModelsTreeNodeLoader(props: ModelsTreeProps) {\n const rulesets = {\n general: useMemo(() => createRuleset({\n enableElementsClassGrouping: !!props.hierarchyConfig?.enableElementsClassGrouping,\n elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,\n showEmptyModels: props.hierarchyConfig?.showEmptyModels,\n }), [props.hierarchyConfig?.enableElementsClassGrouping, props.hierarchyConfig?.elementClassSpecification, props.hierarchyConfig?.showEmptyModels]),\n search: useMemo(() => createSearchRuleset({\n elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,\n showEmptyModels: props.hierarchyConfig?.showEmptyModels,\n }), [props.hierarchyConfig?.elementClassSpecification, props.hierarchyConfig?.showEmptyModels]),\n };\n\n const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.general,\n appendChildrenCountForGroupingNodes: (props.hierarchyConfig?.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts),\n pagingSize: PAGING_SIZE,\n enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,\n customizeTreeNodeItem,\n });\n const { nodeLoader: searchNodeLoader, onItemsRendered: onSearchItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.search,\n pagingSize: PAGING_SIZE,\n enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,\n customizeTreeNodeItem,\n });\n\n const activeNodeLoader = props.filterInfo?.filter ? searchNodeLoader : nodeLoader;\n const activeItemsRenderedCallback = props.filterInfo?.filter ? onSearchItemsRendered : onItemsRendered;\n\n return {\n nodeLoader: activeNodeLoader,\n onItemsRendered: activeItemsRenderedCallback,\n };\n}\n\nfunction useVisibilityHandler(\n rulesetId: string,\n iModel: IModelConnection,\n activeView: Viewport,\n visibilityHandler?: ModelsVisibilityHandler | ((props: ModelsVisibilityHandlerProps) => ModelsVisibilityHandler),\n filteredDataProvider?: IFilteredPresentationTreeDataProvider,\n hierarchyAutoUpdateEnabled?: boolean,\n) {\n const subjectModelIdsCache = useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);\n\n const disposableVisibilityHandler = useDisposable(useCallback(\n () => {\n const visibilityHandlerProps: ModelsVisibilityHandlerProps = {\n rulesetId,\n viewport: activeView,\n hierarchyAutoUpdateEnabled,\n subjectModelIdsCache,\n };\n\n return typeof visibilityHandler === \"function\"\n ? visibilityHandler(visibilityHandlerProps)\n : new ModelsVisibilityHandler(visibilityHandlerProps);\n },\n [visibilityHandler, rulesetId, activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache])\n );\n\n const handler = typeof visibilityHandler === \"function\" || visibilityHandler === undefined\n ? disposableVisibilityHandler\n : visibilityHandler;\n\n useEffect(() => {\n handler && handler.setFilteredDataProvider(filteredDataProvider);\n }, [handler, filteredDataProvider]);\n\n return handler;\n}\n\nconst isFilteredDataProvider = (dataProvider: IPresentationTreeDataProvider | IFilteredPresentationTreeDataProvider): dataProvider is IFilteredPresentationTreeDataProvider => {\n const filteredProvider = dataProvider as IFilteredPresentationTreeDataProvider;\n return filteredProvider.nodeMatchesFilter !== undefined && filteredProvider.getActiveMatch !== undefined && filteredProvider.countFilteringResults !== undefined;\n};\n\nconst getFilteredDataProvider = (dataProvider: IPresentationTreeDataProvider | IFilteredPresentationTreeDataProvider): IFilteredPresentationTreeDataProvider | undefined => {\n return isFilteredDataProvider(dataProvider) ? dataProvider : undefined;\n};\n"]}
1
+ {"version":3,"file":"ModelsTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTree.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 \"../VisibilityTreeBase.scss\";\nimport classNames from \"classnames\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { SelectionMode } from \"@itwin/components-react\";\nimport { isPresentationTreeNodeItem, PresentationTree } from \"@itwin/presentation-components\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { FilterableTreeRenderer } from \"../common/TreeRenderer\";\nimport { ClassGroupingOption } from \"../common/Types\";\nimport { useVisibilityTreeState } from \"../common/UseVisibilityTreeState\";\nimport { addCustomTreeNodeItemLabelRenderer, addTreeNodeItemCheckbox, combineTreeNodeItemCustomizations } from \"../common/Utils\";\nimport { createVisibilityTreeRenderer, FilterableVisibilityTreeNodeRenderer, VisibilityTreeNoFilteredData } from \"../VisibilityTreeRenderer\";\nimport { ModelsTreeEventHandler } from \"./ModelsTreeEventHandler\";\nimport { ModelsVisibilityHandler, SubjectModelIdsCache } from \"./ModelsVisibilityHandler\";\nimport { addModelsTreeNodeItemIcons, createRuleset, createSearchRuleset } from \"./Utils\";\n\nimport type { VisibilityTreeEventHandlerParams } from \"../VisibilityTreeEventHandler\";\nimport type { Ruleset, SingleSchemaClassSpecification } from \"@itwin/presentation-common\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport type { TreeNodeItem } from \"@itwin/components-react\";\nimport type { IFilteredPresentationTreeDataProvider, PresentationTreeNodeRendererProps } from \"@itwin/presentation-components\";\nimport type { BaseFilterableTreeProps, HierarchyLevelConfig } from \"../common/Types\";\nimport type { ModelsTreeSelectionPredicate, ModelsVisibilityHandlerProps } from \"./ModelsVisibilityHandler\";\nconst PAGING_SIZE = 20;\n\n/**\n * Props for configuring the hierarchy in [[ModelsTree]].\n * @public\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should the tree group displayed element nodes by class. Defaults to `ClassGroupingOption.No`. */\n enableElementsClassGrouping?: ClassGroupingOption;\n /**\n * Defines the `bis.GeometricElement3d` sub-class that should be used to load element nodes.\n * Defaults to `bis.GeometricElement3d`. It's expected for the given class to derive from it.\n */\n elementClassSpecification?: SingleSchemaClassSpecification;\n /** Should the tree show models without elements. */\n showEmptyModels?: boolean;\n}\n\n/**\n * Props for [[ModelsTree]] component.\n * @public\n */\nexport interface ModelsTreeProps extends BaseFilterableTreeProps {\n /**\n * Predicate which indicates whether node can be selected or no\n */\n selectionPredicate?: ModelsTreeSelectionPredicate;\n /**\n * Active view used to determine and control visibility\n */\n activeView: Viewport;\n /**\n * Configuration options for the hierarchy loaded in the component.\n */\n hierarchyConfig?: ModelsTreeHierarchyConfiguration;\n /**\n * Auto-update the hierarchy when data in the iModel changes.\n * @alpha\n */\n enableHierarchyAutoUpdate?: boolean;\n /**\n * Custom visibility handler.\n */\n modelsVisibilityHandler?: ModelsVisibilityHandler | ((props: ModelsVisibilityHandlerProps) => ModelsVisibilityHandler);\n /**\n * Props for configuring hierarchy level.\n * @beta\n */\n hierarchyLevelConfig?: HierarchyLevelConfig;\n}\n\n/**\n * A tree component that shows a subject - model - category - element\n * hierarchy along with checkboxes that represent and allow changing\n * the display of those instances.\n * @public\n */\nexport function ModelsTree(props: ModelsTreeProps) {\n const { hierarchyLevelConfig, density, height, width, selectionMode } = props;\n const state = useModelsTreeState(props);\n\n const baseRendererProps = {\n contextMenuItems: props.contextMenuItems,\n nodeLabelRenderer: props.nodeLabelRenderer,\n density: props.density,\n nodeRendererProps: {\n iconsEnabled: true,\n descriptionEnabled: false,\n levelOffset: 10,\n disableRootNodeCollapse: true,\n },\n };\n\n // istanbul ignore next\n const noFilteredDataRenderer = useCallback(() => {\n return (\n <VisibilityTreeNoFilteredData title={TreeWidget.translate(\"modelTree.noModelFound\")} message={TreeWidget.translate(\"modelTree.noMatchingModelNames\")} />\n );\n }, []);\n\n if (!state) {\n return null;\n }\n\n const isFilterApplied = state.filteringResult?.filteredProvider !== undefined;\n const overlay = state.filteringResult?.isFiltering ? <div className=\"filteredTreeOverlay\" /> : undefined;\n return (\n <div className={classNames(\"tree-widget-visibility-tree-base\", \"tree-widget-tree-container\")}>\n <PresentationTree\n state={state}\n selectionMode={selectionMode || SelectionMode.None}\n treeRenderer={\n hierarchyLevelConfig?.isFilteringEnabled\n ? (rendererProps) => (\n <FilterableTreeRenderer\n {...rendererProps}\n {...baseRendererProps}\n nodeLoader={state.nodeLoader}\n nodeRenderer={(nodeProps) => <ModelsTreeNodeRenderer {...nodeProps} density={density} />}\n />\n )\n : createVisibilityTreeRenderer(baseRendererProps)\n }\n noDataRenderer={isFilterApplied ? noFilteredDataRenderer : undefined}\n width={width}\n height={height}\n />\n {overlay}\n </div>\n );\n}\n\nfunction ModelsTreeNodeRenderer(props: PresentationTreeNodeRendererProps & { density?: \"default\" | \"enlarged\" }) {\n return (\n <FilterableVisibilityTreeNodeRenderer\n {...props}\n iconsEnabled={true}\n descriptionEnabled={false}\n levelOffset={10}\n disableRootNodeCollapse={true}\n isEnlarged={props.density === \"enlarged\"}\n />\n );\n}\n\nfunction useModelsTreeState({ filterInfo, onFilterApplied, ...props }: ModelsTreeProps) {\n const rulesets = {\n general: useMemo(\n () =>\n createRuleset({\n enableElementsClassGrouping: !!props.hierarchyConfig?.enableElementsClassGrouping,\n elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,\n showEmptyModels: props.hierarchyConfig?.showEmptyModels,\n }),\n [props.hierarchyConfig?.enableElementsClassGrouping, props.hierarchyConfig?.elementClassSpecification, props.hierarchyConfig?.showEmptyModels],\n ),\n search: useMemo(\n () =>\n createSearchRuleset({\n elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,\n showEmptyModels: props.hierarchyConfig?.showEmptyModels,\n }),\n [props.hierarchyConfig?.elementClassSpecification, props.hierarchyConfig?.showEmptyModels],\n ),\n };\n\n const treeState = useTreeState({\n ...props,\n ruleset: rulesets.general,\n });\n\n const filteredTreeState = useTreeState({\n ...props,\n ruleset: rulesets.search,\n filterInfo,\n onFilterApplied,\n });\n\n return filterInfo?.filter ? filteredTreeState : treeState;\n}\n\ninterface UseTreeProps extends ModelsTreeProps {\n ruleset: Ruleset;\n}\n\nfunction useTreeState({\n modelsVisibilityHandler,\n activeView,\n selectionPredicate,\n hierarchyConfig,\n iModel,\n ruleset,\n enableHierarchyAutoUpdate,\n filterInfo,\n onFilterApplied,\n hierarchyLevelConfig,\n}: UseTreeProps) {\n const visibilityHandler = useVisibilityHandler(ruleset.id, iModel, activeView, modelsVisibilityHandler);\n const selectionPredicateRef = useRef(selectionPredicate);\n useEffect(() => {\n selectionPredicateRef.current = selectionPredicate;\n }, [selectionPredicate]);\n\n const onFilterChange = useCallback(\n (dataProvider?: IFilteredPresentationTreeDataProvider, matchesCount?: number) => {\n if (onFilterApplied && dataProvider && matchesCount !== undefined) {\n onFilterApplied(dataProvider, matchesCount);\n }\n\n if (visibilityHandler) {\n visibilityHandler.setFilteredDataProvider(dataProvider);\n }\n },\n [onFilterApplied, visibilityHandler],\n );\n\n return useVisibilityTreeState({\n imodel: iModel,\n ruleset,\n pagingSize: PAGING_SIZE,\n appendChildrenCountForGroupingNodes: hierarchyConfig?.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts,\n enableHierarchyAutoUpdate,\n customizeTreeNodeItem,\n visibilityHandler,\n filterInfo,\n onFilterChange,\n selectionPredicate: useCallback(\n (node: TreeNodeItem) =>\n !selectionPredicateRef.current || !isPresentationTreeNodeItem(node)\n ? true\n : selectionPredicateRef.current(node.key, ModelsVisibilityHandler.getNodeType(node)),\n [],\n ),\n eventHandler: eventHandlerFactory,\n hierarchyLevelSizeLimit: hierarchyLevelConfig?.sizeLimit,\n });\n}\n\nfunction eventHandlerFactory(props: VisibilityTreeEventHandlerParams) {\n return new ModelsTreeEventHandler(props);\n}\n\nfunction useVisibilityHandler(\n rulesetId: string,\n iModel: IModelConnection,\n activeView: Viewport,\n visibilityHandler?: ModelsVisibilityHandler | ((props: ModelsVisibilityHandlerProps) => ModelsVisibilityHandler),\n hierarchyAutoUpdateEnabled?: boolean,\n) {\n const subjectModelIdsCache = useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);\n const [state, setState] = useState<ModelsVisibilityHandler>();\n\n useEffect(() => {\n if (visibilityHandler && typeof visibilityHandler !== \"function\") {\n return;\n }\n\n const visibilityHandlerProps: ModelsVisibilityHandlerProps = {\n rulesetId,\n viewport: activeView,\n hierarchyAutoUpdateEnabled,\n subjectModelIdsCache,\n };\n\n const handler = visibilityHandler ? visibilityHandler(visibilityHandlerProps) : new ModelsVisibilityHandler(visibilityHandlerProps);\n setState(handler);\n return () => {\n handler.dispose();\n };\n }, [rulesetId, activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache, visibilityHandler]);\n\n return visibilityHandler && typeof visibilityHandler !== \"function\" ? visibilityHandler : state;\n}\n\nconst customizeTreeNodeItem = combineTreeNodeItemCustomizations([addCustomTreeNodeItemLabelRenderer, addTreeNodeItemCheckbox, addModelsTreeNodeItemIcons]);\n"]}