@itwin/tree-widget-react 4.0.0-alpha.5 → 4.0.0-alpha.7

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 (186) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/README.md +2 -1
  3. package/lib/esm/tree-widget-react/TreeWidget.js +1 -1
  4. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  5. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js +1 -1
  6. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
  7. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js +1 -1
  8. package/lib/esm/tree-widget-react/components/tree-header/ErrorState.js.map +1 -1
  9. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.d.ts +1 -0
  10. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +3 -2
  11. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +2 -1
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +2 -2
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +3 -2
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +9 -2
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +53 -7
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +1 -1
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +30 -3
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +588 -170
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +15 -4
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +149 -56
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +30 -15
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +192 -38
  30. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  31. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +18 -3
  32. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +30 -3
  33. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -1
  34. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.d.ts +24 -0
  35. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +785 -0
  36. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -0
  37. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.d.ts +39 -0
  38. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js +221 -0
  39. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js.map +1 -0
  40. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +5 -17
  41. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +5 -62
  42. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  43. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +2 -0
  44. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +4 -2
  45. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  46. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +1 -0
  47. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +2 -1
  48. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +1 -1
  49. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
  50. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
  51. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
  52. package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +33 -23
  53. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +60 -47
  54. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  55. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +3 -3
  56. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
  57. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
  58. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
  59. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
  60. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.css +1 -0
  61. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
  62. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +4 -3
  63. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
  64. package/lib/esm/tree-widget-react/components/trees/{categories-tree/internal/ClassNameDefinitions.js → common/components/SkeletonTree.css} +12 -7
  65. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.d.ts +4 -0
  66. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js +16 -0
  67. package/lib/esm/tree-widget-react/components/trees/common/components/SkeletonTree.js.map +1 -0
  68. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +11 -0
  69. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +1 -0
  70. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +8 -7
  71. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  72. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js +3 -3
  73. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeVisibilityButton.js.map +1 -1
  74. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +1 -0
  75. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +1 -0
  76. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
  77. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
  79. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  80. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +44 -0
  81. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/AlwaysAndNeverDrawnElementInfo.js +81 -31
  82. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
  83. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +33 -0
  84. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +37 -0
  85. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
  86. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +16 -0
  87. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +72 -0
  88. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
  89. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
  90. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +9 -2
  91. package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
  92. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +5 -1
  93. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.js → internal/Tooltip.js} +7 -1
  94. package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
  95. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
  96. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js +6 -0
  97. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
  98. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveViewport.js.map +1 -0
  99. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +1 -0
  100. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
  101. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
  102. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -0
  103. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +4 -3
  104. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
  105. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
  106. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
  107. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
  108. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +47 -0
  109. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +101 -0
  110. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
  111. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
  112. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/VisibilityChangeEventListener.js +17 -9
  113. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
  114. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +82 -0
  115. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +234 -0
  116. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
  117. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +7 -2
  118. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +24 -18
  119. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  120. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -1
  121. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  122. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +1 -0
  123. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +1 -0
  124. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  125. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +9 -2
  126. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +44 -34
  127. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  128. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  129. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  130. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -0
  131. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +39 -38
  132. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  133. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +5 -5
  134. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +25 -24
  135. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  136. package/lib/esm/tree-widget-react/components/trees/index.d.ts +4 -2
  137. package/lib/esm/tree-widget-react/components/trees/index.js +4 -2
  138. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  139. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +2 -2
  140. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +2 -2
  141. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  142. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +15 -11
  143. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  144. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  145. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +1 -1
  146. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  147. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +7 -2
  148. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +73 -70
  149. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  150. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +5 -1
  151. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +73 -49
  152. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  153. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -9
  154. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +4 -6
  155. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
  156. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -5
  157. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +54 -104
  158. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  159. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -26
  160. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +75 -291
  161. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  162. package/lib/public/locales/en/TreeWidget.json +55 -6
  163. package/package.json +17 -18
  164. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +0 -37
  165. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +0 -214
  166. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +0 -1
  167. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +0 -7
  168. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +0 -1
  169. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
  170. package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
  171. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
  172. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
  173. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
  174. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
  175. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
  176. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
  177. package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
  178. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
  179. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
  180. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
  181. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
  182. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
  183. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
  184. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
  185. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.d.ts → internal/UseActiveViewport.d.ts} +0 -0
  186. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.js → internal/UseActiveViewport.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"UseCategoriesTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport categorySvg from \"@itwin/itwinui-icons/bis-category-3d.svg\";\nimport subcategorySvg from \"@itwin/itwinui-icons/bis-category-subcategory.svg\";\nimport definitionContainerSvg from \"@itwin/itwinui-icons/bis-definitions-container.svg\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport { HierarchyFilteringPath, HierarchyNodeIdentifier } from \"@itwin/presentation-hierarchies\";\nimport { EmptyTreeContent, FilterUnknownError, NoFilterMatches, TooManyFilterMatches } from \"../common/components/EmptyTree.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext.js\";\nimport { CategoriesTreeDefinition } from \"./CategoriesTreeDefinition.js\";\nimport { CategoriesTreeIdsCache } from \"./internal/CategoriesTreeIdsCache.js\";\nimport { CategoriesVisibilityHandler } from \"./internal/CategoriesVisibilityHandler.js\";\nimport { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./internal/ClassNameDefinitions.js\";\n\nimport type { ReactNode } from \"react\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CategoryInfo } from \"../common/CategoriesVisibilityUtils.js\";\ntype CategoriesTreeFilteringError = \"tooManyFilterMatches\" | \"unknownFilterError\";\ntype HierarchyFilteringPaths = Awaited<ReturnType<Required<VisibilityTreeProps>[\"getFilteredPaths\"]>>;\n\n/** @beta */\nexport interface UseCategoriesTreeProps {\n activeView: Viewport;\n onCategoriesFiltered?: (categories: CategoryInfo[] | undefined) => void;\n filter?: string;\n emptyTreeContent?: ReactNode;\n}\n\n/** @beta */\ninterface UseCategoriesTreeResult {\n categoriesTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"getFilteredPaths\" | \"visibilityHandlerFactory\" | \"highlight\" | \"emptyTreeContent\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getIcon\" | \"getSublabel\">>;\n}\n\n/**\n * Custom hook to create and manage state for the categories tree.\n * @beta\n */\nexport function useCategoriesTree({ filter, activeView, onCategoriesFiltered, emptyTreeContent }: UseCategoriesTreeProps): UseCategoriesTreeResult {\n const [filteringError, setFilteringError] = useState<CategoriesTreeFilteringError | undefined>();\n\n const viewType = activeView.view.is2d() ? \"2d\" : \"3d\";\n const iModel = activeView.iModel;\n\n const idsCache = useMemo(() => {\n return new CategoriesTreeIdsCache(createECSqlQueryExecutor(iModel), viewType);\n }, [viewType, iModel]);\n\n const visibilityHandlerFactory = useCallback(() => {\n const visibilityHandler = new CategoriesVisibilityHandler({\n viewport: activeView,\n idsCache,\n });\n return {\n getVisibilityStatus: async (node: HierarchyNode) => visibilityHandler.getVisibilityStatus(node),\n changeVisibility: async (node: HierarchyNode, on: boolean) => visibilityHandler.changeVisibility(node, on),\n onVisibilityChange: visibilityHandler.onVisibilityChange,\n dispose: () => visibilityHandler.dispose(),\n };\n }, [activeView, idsCache]);\n const { onFeatureUsed } = useTelemetryContext();\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n (props) => {\n return new CategoriesTreeDefinition({ ...props, viewType, idsCache });\n },\n [viewType, idsCache],\n );\n\n const getFilteredPaths = useMemo<VisibilityTreeProps[\"getFilteredPaths\"] | undefined>(() => {\n setFilteringError(undefined);\n onCategoriesFiltered?.(undefined);\n if (!filter) {\n return undefined;\n }\n return async ({ imodelAccess }) => {\n onFeatureUsed({ featureId: \"filtering\", reportInteraction: true });\n try {\n const paths = await CategoriesTreeDefinition.createInstanceKeyPaths({ imodelAccess, label: filter, viewType, idsCache });\n onCategoriesFiltered?.(await getCategoriesFromPaths(paths, idsCache));\n return paths;\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyFilterMatches\" : \"unknownFilterError\";\n if (newError !== \"tooManyFilterMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }, [filter, viewType, onFeatureUsed, onCategoriesFiltered, idsCache]);\n\n return {\n categoriesTreeProps: {\n treeName: \"categories-tree-v2\",\n getHierarchyDefinition,\n getFilteredPaths,\n visibilityHandlerFactory,\n emptyTreeContent: getEmptyTreeContentComponent(filter, filteringError, emptyTreeContent),\n highlight: filter ? { text: filter } : undefined,\n },\n rendererProps: {\n getIcon,\n getSublabel,\n },\n };\n}\n\nasync function getCategoriesFromPaths(paths: HierarchyFilteringPaths, idsCache: CategoriesTreeIdsCache): Promise<CategoryInfo[] | undefined> {\n if (!paths) {\n return undefined;\n }\n\n const categories = new Map<Id64String, Id64String[]>();\n for (const path of paths) {\n const currPath = HierarchyFilteringPath.normalize(path).path;\n if (currPath.length === 0) {\n continue;\n }\n\n let category: HierarchyNodeIdentifier;\n let subCategory: HierarchyNodeIdentifier | undefined;\n const lastNode = currPath[currPath.length - 1];\n\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(lastNode)) {\n continue;\n }\n\n if (lastNode.className === DEFINITION_CONTAINER_CLASS) {\n const definitionContainerCategories = await idsCache.getAllContainedCategories([lastNode.id]);\n for (const categoryId of definitionContainerCategories) {\n const value = categories.get(categoryId);\n if (value === undefined) {\n categories.set(categoryId, []);\n }\n }\n continue;\n }\n\n if (lastNode.className === SUB_CATEGORY_CLASS) {\n const secondToLastNode = currPath.length > 1 ? currPath[currPath.length - 2] : undefined;\n assert(secondToLastNode !== undefined && HierarchyNodeIdentifier.isInstanceNodeIdentifier(secondToLastNode));\n\n subCategory = lastNode;\n category = secondToLastNode;\n } else {\n category = lastNode;\n }\n\n let entry = categories.get(category.id);\n if (entry === undefined) {\n entry = [];\n categories.set(category.id, entry);\n }\n\n if (subCategory) {\n entry.push(subCategory.id);\n }\n }\n\n return [...categories.entries()].map(([categoryId, subCategoryIds]) => ({\n categoryId,\n subCategoryIds: subCategoryIds.length === 0 ? undefined : subCategoryIds,\n }));\n}\n\nfunction getEmptyTreeContentComponent(filter?: string, error?: CategoriesTreeFilteringError, emptyTreeContent?: React.ReactNode) {\n if (error) {\n if (error === \"tooManyFilterMatches\") {\n return <TooManyFilterMatches base={\"categoriesTree\"} />;\n }\n return <FilterUnknownError base={\"categoriesTree\"} />;\n }\n if (filter) {\n return <NoFilterMatches base={\"categoriesTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={categorySvg} />;\n}\n\n\nfunction getIcon(node: PresentationHierarchyNode): string | undefined {\n if (node.extendedData?.imageId === undefined) {\n return undefined;\n }\n\n switch (node.extendedData.imageId) {\n case \"icon-layers\":\n return categorySvg;\n case \"icon-layers-isolate\":\n return subcategorySvg;\n case \"icon-definition-container\":\n return definitionContainerSvg;\n }\n\n return undefined;\n}\n\nfunction getSublabel(node: PresentationHierarchyNode) {\n return node.extendedData?.description;\n}\n"]}
1
+ {"version":3,"file":"UseCategoriesTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { Icon } from \"@itwin/itwinui-react/bricks\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport { HierarchyFilteringPath, HierarchyNodeIdentifier } from \"@itwin/presentation-hierarchies\";\nimport { EmptyTreeContent, FilterUnknownError, NoFilterMatches, TooManyFilterMatches } from \"../common/components/EmptyTree.js\";\nimport { DEFINITION_CONTAINER_CLASS_NAME, SUB_CATEGORY_CLASS_NAME } from \"../common/internal/ClassNameDefinitions.js\";\nimport { useIModelChangeListener } from \"../common/internal/UseIModelChangeListener.js\";\nimport { getClassesByView } from \"../common/internal/Utils.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext.js\";\nimport { CategoriesTreeDefinition, defaultHierarchyConfiguration } from \"./CategoriesTreeDefinition.js\";\nimport { CategoriesTreeIdsCache } from \"./internal/CategoriesTreeIdsCache.js\";\nimport { createCategoriesTreeVisibilityHandler } from \"./internal/CategoriesTreeVisibilityHandler.js\";\n\nimport type { ReactNode } from \"react\";\nimport type { Id64Array } from \"@itwin/core-bentley\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CategoryInfo } from \"../common/CategoriesVisibilityUtils.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"./CategoriesTreeDefinition.js\";\nimport type { CategoryId, ElementId, ModelId, SubCategoryId } from \"../common/internal/Types.js\";\n\ntype CategoriesTreeFilteringError = \"tooManyFilterMatches\" | \"unknownFilterError\";\ntype HierarchyFilteringPaths = Awaited<ReturnType<Required<VisibilityTreeProps>[\"getFilteredPaths\"]>>;\n\n/** @beta */\nexport interface UseCategoriesTreeProps {\n activeView: Viewport;\n onCategoriesFiltered?: (props: { categories: CategoryInfo[] | undefined; models?: Id64Array }) => void;\n filter?: string;\n emptyTreeContent?: ReactNode;\n hierarchyConfig?: Partial<CategoriesTreeHierarchyConfiguration>;\n}\n\n/** @beta */\ninterface UseCategoriesTreeResult {\n categoriesTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"getFilteredPaths\" | \"visibilityHandlerFactory\" | \"highlight\" | \"emptyTreeContent\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getDecorations\" | \"getSublabel\">>;\n}\n\nfunction createVisibilityHandlerFactory(\n activeView: Viewport,\n idsCacheGetter: () => CategoriesTreeIdsCache,\n hierarchyConfig: CategoriesTreeHierarchyConfiguration,\n filteredPaths?: HierarchyFilteringPath[],\n): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n return ({ imodelAccess }) =>\n createCategoriesTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, filteredPaths, hierarchyConfig });\n}\n\nfunction useIdsCache(imodel: IModelConnection, viewType: \"2d\" | \"3d\", filteredPaths?: HierarchyFilteringPath[]) {\n const cacheRef = useRef<CategoriesTreeIdsCache | undefined>(undefined);\n const clearCacheRef = useRef(() => () => {\n cacheRef.current?.[Symbol.dispose]?.();\n cacheRef.current = undefined;\n });\n const createCacheGetterRef = useRef((currImodel: IModelConnection, currViewType: \"2d\" | \"3d\") => () => {\n if (cacheRef.current === undefined) {\n cacheRef.current = new CategoriesTreeIdsCache(createECSqlQueryExecutor(currImodel), currViewType);\n }\n return cacheRef.current;\n });\n const [getCache, setCacheGetter] = useState<() => CategoriesTreeIdsCache>(() => createCacheGetterRef.current(imodel, viewType));\n\n useEffect(() => {\n // clear cache in case it was created before `useEffect` was run first time\n clearCacheRef.current();\n\n // make sure all cache users rerender\n setCacheGetter(() => createCacheGetterRef.current(imodel, viewType));\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n clearCacheRef.current();\n };\n }, [imodel, viewType]);\n\n useEffect(() => {\n cacheRef.current?.clearFilteredElementsModels();\n }, [filteredPaths]);\n\n useIModelChangeListener({\n imodel,\n action: useCallback(() => {\n clearCacheRef.current();\n // make sure all cache users rerender\n setCacheGetter(() => createCacheGetterRef.current(imodel, viewType));\n }, [imodel, viewType]),\n });\n\n return {\n getCache,\n };\n}\n\nfunction useCachedVisibility(activeView: Viewport, hierarchyConfig: CategoriesTreeHierarchyConfiguration, viewType: \"2d\" | \"3d\") {\n const [filteredPaths, setFilteredPaths] = useState<HierarchyFilteringPath[]>();\n const { getCache: getCategoriesTreeIdsCache } = useIdsCache(activeView.iModel, viewType, filteredPaths);\n\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState<VisibilityTreeProps[\"visibilityHandlerFactory\"]>(() =>\n createVisibilityHandlerFactory(activeView, getCategoriesTreeIdsCache, hierarchyConfig, filteredPaths),\n );\n\n useEffect(() => {\n setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getCategoriesTreeIdsCache, hierarchyConfig, filteredPaths));\n }, [activeView, getCategoriesTreeIdsCache, hierarchyConfig, filteredPaths]);\n\n return {\n getCategoriesTreeIdsCache,\n visibilityHandlerFactory,\n onFilteredPathsChanged: useCallback((paths: HierarchyFilteringPath[] | undefined) => setFilteredPaths(paths), []),\n };\n}\n\n/**\n * Custom hook to create and manage state for the categories tree.\n * @beta\n */\nexport function useCategoriesTree({\n filter,\n activeView,\n onCategoriesFiltered,\n emptyTreeContent,\n hierarchyConfig,\n}: UseCategoriesTreeProps): UseCategoriesTreeResult {\n const [filteringError, setFilteringError] = useState<CategoriesTreeFilteringError | undefined>();\n const hierarchyConfiguration = useMemo<CategoriesTreeHierarchyConfiguration>(\n () => ({\n ...defaultHierarchyConfiguration,\n ...hierarchyConfig,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Object.values(hierarchyConfig ?? {}),\n );\n const viewType = activeView.view.is2d() ? \"2d\" : \"3d\";\n\n const { getCategoriesTreeIdsCache, visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility(activeView, hierarchyConfiguration, viewType);\n\n const { onFeatureUsed } = useTelemetryContext();\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n (props) => {\n return new CategoriesTreeDefinition({ ...props, viewType, idsCache: getCategoriesTreeIdsCache(), hierarchyConfig: hierarchyConfiguration });\n },\n [viewType, getCategoriesTreeIdsCache, hierarchyConfiguration],\n );\n\n const getFilteredPaths = useMemo<VisibilityTreeProps[\"getFilteredPaths\"] | undefined>(() => {\n setFilteringError(undefined);\n onCategoriesFiltered?.({ categories: undefined, models: undefined });\n if (!filter) {\n onFilteredPathsChanged(undefined);\n return undefined;\n }\n return async ({ imodelAccess }) => {\n onFeatureUsed({ featureId: \"filtering\", reportInteraction: true });\n try {\n const paths = await CategoriesTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n label: filter,\n viewType,\n idsCache: getCategoriesTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n });\n onFilteredPathsChanged(paths);\n const { elementClass, modelClass } = getClassesByView(viewType);\n onCategoriesFiltered?.(await getCategoriesFromPaths(paths, getCategoriesTreeIdsCache(), elementClass, modelClass));\n return paths;\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyFilterMatches\" : \"unknownFilterError\";\n if (newError !== \"tooManyFilterMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }, [onCategoriesFiltered, filter, onFilteredPathsChanged, onFeatureUsed, viewType, getCategoriesTreeIdsCache, hierarchyConfiguration]);\n\n return {\n categoriesTreeProps: {\n treeName: \"categories-tree-v2\",\n getHierarchyDefinition,\n getFilteredPaths,\n visibilityHandlerFactory,\n emptyTreeContent: getEmptyTreeContentComponent(filter, filteringError, emptyTreeContent),\n highlight: filter ? { text: filter } : undefined,\n },\n rendererProps: {\n getDecorations: (node) => <CategoriesTreeIcon node={node} />,\n getSublabel,\n },\n };\n}\n\nasync function getCategoriesFromPaths(\n paths: HierarchyFilteringPaths,\n idsCache: CategoriesTreeIdsCache,\n elementClassName: string,\n modelsClassName: string,\n): Promise<{ categories: CategoryInfo[] | undefined; models?: Array<ModelId> }> {\n if (!paths) {\n return { categories: undefined };\n }\n\n const rootFilteredElementIds = new Set<ElementId>();\n const subModelIds = new Set<ModelId>();\n\n const categories = new Map<CategoryId, Array<SubCategoryId>>();\n for (const path of paths) {\n const currPath = HierarchyFilteringPath.normalize(path).path;\n if (currPath.length === 0) {\n continue;\n }\n\n let category: HierarchyNodeIdentifier;\n let subCategory: HierarchyNodeIdentifier | undefined;\n\n let lastNodeInfo: { lastNode: HierarchyNodeIdentifier; nodeIndex: number } | undefined;\n\n for (let i = 0; i < currPath.length; ++i) {\n const currentNode = currPath[i];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(currentNode)) {\n continue;\n }\n if (currentNode.className === elementClassName) {\n rootFilteredElementIds.add(currentNode.id);\n for (let j = i + 1; j < currPath.length; ++j) {\n const childNode = currPath[j];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(childNode)) {\n continue;\n }\n if (childNode.className === modelsClassName) {\n subModelIds.add(childNode.id);\n }\n }\n break;\n }\n lastNodeInfo = { lastNode: currentNode, nodeIndex: i };\n }\n\n assert(lastNodeInfo !== undefined && HierarchyNodeIdentifier.isInstanceNodeIdentifier(lastNodeInfo.lastNode));\n\n if (lastNodeInfo.lastNode.className === DEFINITION_CONTAINER_CLASS_NAME) {\n const definitionContainerCategories = await idsCache.getAllContainedCategories([lastNodeInfo.lastNode.id]);\n for (const categoryId of definitionContainerCategories) {\n const value = categories.get(categoryId);\n if (value === undefined) {\n categories.set(categoryId, []);\n }\n }\n continue;\n }\n\n if (lastNodeInfo.lastNode.className === SUB_CATEGORY_CLASS_NAME) {\n const secondToLastNode = lastNodeInfo.nodeIndex > 0 ? currPath[lastNodeInfo.nodeIndex - 1] : undefined;\n assert(secondToLastNode !== undefined && HierarchyNodeIdentifier.isInstanceNodeIdentifier(secondToLastNode));\n\n subCategory = lastNodeInfo.lastNode;\n category = secondToLastNode;\n } else {\n category = lastNodeInfo.lastNode;\n }\n\n let entry = categories.get(category.id);\n if (entry === undefined) {\n entry = [];\n categories.set(category.id, entry);\n }\n\n if (subCategory) {\n entry.push(subCategory.id);\n }\n }\n const rootElementModelMap = await idsCache.getFilteredElementsModels([...rootFilteredElementIds]);\n const models = [...subModelIds, ...new Set(rootElementModelMap.values())];\n return {\n categories: [...categories.entries()].map(([categoryId, subCategoryIds]) => ({\n categoryId,\n subCategoryIds: subCategoryIds.length === 0 ? undefined : subCategoryIds,\n })),\n models,\n };\n}\n\nconst categorySvg = new URL(\"@itwin/itwinui-icons/bis-category-3d.svg\", import.meta.url).href;\n\nfunction getEmptyTreeContentComponent(filter?: string, error?: CategoriesTreeFilteringError, emptyTreeContent?: React.ReactNode) {\n if (error) {\n if (error === \"tooManyFilterMatches\") {\n return <TooManyFilterMatches base={\"categoriesTree\"} />;\n }\n return <FilterUnknownError base={\"categoriesTree\"} />;\n }\n if (filter) {\n return <NoFilterMatches base={\"categoriesTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={categorySvg} />;\n}\n\nconst subcategorySvg = new URL(\"@itwin/itwinui-icons/bis-category-subcategory.svg\", import.meta.url).href;\nconst definitionContainerSvg = new URL(\"@itwin/itwinui-icons/bis-definitions-container.svg\", import.meta.url).href;\nconst classSvg = new URL(\"@itwin/itwinui-icons/bis-class.svg\", import.meta.url).href;\nconst elementSvg = new URL(\"@itwin/itwinui-icons/bis-element.svg\", import.meta.url).href;\n\n/** @beta */\nexport function CategoriesTreeIcon({ node }: { node: PresentationHierarchyNode }) {\n if (node.extendedData?.imageId === undefined) {\n return undefined;\n }\n\n const getIcon = () => {\n switch (node.extendedData!.imageId) {\n case \"icon-layers\":\n return categorySvg;\n case \"icon-layers-isolate\":\n return subcategorySvg;\n case \"icon-definition-container\":\n return definitionContainerSvg;\n case \"icon-item\":\n return elementSvg;\n case \"icon-ec-class\":\n return classSvg;\n default:\n return undefined;\n }\n };\n\n return <Icon href={getIcon()} />;\n}\n\nfunction getSublabel(node: PresentationHierarchyNode) {\n return node.extendedData?.description;\n}\n"]}
@@ -1,31 +1,51 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import type { CategoryId, DefinitionContainerId, ModelId, SubCategoryId } from "../../common/internal/Types.js";
1
3
  import type { Id64Array, Id64String } from "@itwin/core-bentley";
2
4
  import type { LimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
3
5
  import type { InstanceKey } from "@itwin/presentation-shared";
4
- interface CategoryInfo {
5
- id: Id64String;
6
- childCount: number;
6
+ /** @internal */
7
+ export interface CategoryInfo {
8
+ id: CategoryId;
9
+ subCategoryChildCount: number;
7
10
  }
8
11
  /** @internal */
9
- export declare class CategoriesTreeIdsCache {
12
+ export declare class CategoriesTreeIdsCache implements Disposable {
10
13
  private _queryExecutor;
11
14
  private _definitionContainersInfo;
12
15
  private _modelsCategoriesInfo;
16
+ private _elementModelsCategories;
13
17
  private _subCategoriesInfo;
18
+ private readonly _categoryElementCounts;
19
+ private _modelWithCategoryModeledElements;
14
20
  private _categoryClass;
15
21
  private _categoryElementClass;
22
+ private _categoryModelClass;
16
23
  private _isDefinitionContainerSupported;
24
+ private _filteredElementsModels;
17
25
  constructor(_queryExecutor: LimitingECSqlQueryExecutor, viewType: "3d" | "2d");
26
+ [Symbol.dispose](): void;
27
+ private queryFilteredElementsModels;
28
+ getFilteredElementsModels(filteredElementIds: Id64Array): Promise<Map<string, string>>;
29
+ clearFilteredElementsModels(): void;
30
+ private queryElementModelCategories;
18
31
  private queryCategories;
19
32
  private queryIsDefinitionContainersSupported;
20
33
  private queryDefinitionContainers;
21
34
  private queryVisibleSubCategories;
22
35
  private getModelsCategoriesInfo;
36
+ private getElementModelsCategories;
37
+ private queryModeledElements;
38
+ private getModelWithCategoryModeledElements;
39
+ getCategoriesModeledElements(modelId: Id64String, categoryIds: Id64Array): Promise<Id64Array>;
23
40
  private getSubCategoriesInfo;
24
41
  private getDefinitionContainersInfo;
25
42
  getDirectChildDefinitionContainersAndCategories(parentDefinitionContainerIds: Id64Array): Promise<{
26
43
  categories: CategoryInfo[];
27
- definitionContainers: Id64Array;
44
+ definitionContainers: Array<DefinitionContainerId>;
28
45
  }>;
46
+ getCategoriesElementModels(categoryIds: Id64Array, includeSubModels?: boolean): Promise<Map<CategoryId, Array<ModelId>>>;
47
+ getModelCategoryIds(modelId: Id64String): Promise<Id64Array>;
48
+ hasSubModel(elementId: Id64String): Promise<boolean>;
29
49
  getAllContainedCategories(definitionContainerIds: Id64Array): Promise<Id64Array>;
30
50
  getInstanceKeyPaths(props: {
31
51
  categoryId: Id64String;
@@ -34,21 +54,16 @@ export declare class CategoriesTreeIdsCache {
34
54
  } | {
35
55
  subCategoryId: Id64String;
36
56
  }): Promise<InstanceKey[]>;
57
+ getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Promise<number>;
37
58
  getAllDefinitionContainersAndCategories(): Promise<{
38
- categories: Id64Array;
39
- definitionContainers: Id64Array;
59
+ categories: Array<CategoryId>;
60
+ definitionContainers: Array<DefinitionContainerId>;
40
61
  }>;
41
62
  getRootDefinitionContainersAndCategories(): Promise<{
42
63
  categories: CategoryInfo[];
43
- definitionContainers: Id64Array;
64
+ definitionContainers: Array<DefinitionContainerId>;
44
65
  }>;
45
- getSubCategories(categoryId: Id64String): Promise<Id64Array>;
66
+ getSubCategories(categoryIds: Id64Array): Promise<Map<CategoryId, Array<SubCategoryId>>>;
46
67
  getIsDefinitionContainerSupported(): Promise<boolean>;
47
68
  }
48
- /** @internal */
49
- export declare function getClassesByView(viewType: "2d" | "3d"): {
50
- categoryClass: string;
51
- categoryElementClass: string;
52
- };
53
- export {};
54
69
  //# sourceMappingURL=CategoriesTreeIdsCache.d.ts.map
@@ -2,41 +2,91 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from "./ClassNameDefinitions.js";
5
+ import { DEFINITION_CONTAINER_CLASS_NAME, MODEL_CLASS_NAME, SUB_CATEGORY_CLASS_NAME } from "../../common/internal/ClassNameDefinitions.js";
6
+ import { ModelCategoryElementsCountCache } from "../../common/internal/ModelCategoryElementsCountCache.js";
7
+ import { getClassesByView, getDistinctMapValues } from "../../common/internal/Utils.js";
6
8
  /** @internal */
7
9
  export class CategoriesTreeIdsCache {
8
10
  constructor(_queryExecutor, viewType) {
9
11
  this._queryExecutor = _queryExecutor;
10
- const { categoryClass, categoryElementClass } = getClassesByView(viewType);
12
+ const { categoryClass, elementClass, modelClass } = getClassesByView(viewType);
11
13
  this._categoryClass = categoryClass;
12
- this._categoryElementClass = categoryElementClass;
14
+ this._categoryElementClass = elementClass;
15
+ this._categoryModelClass = modelClass;
16
+ this._categoryElementCounts = new ModelCategoryElementsCountCache(_queryExecutor, elementClass);
17
+ }
18
+ [Symbol.dispose]() {
19
+ this._categoryElementCounts[Symbol.dispose]();
20
+ }
21
+ async *queryFilteredElementsModels(filteredElementIds) {
22
+ const query = `
23
+ SELECT Model.Id modelId, ECInstanceId id
24
+ FROM ${this._categoryElementClass}
25
+ WHERE ECInstanceId IN (${filteredElementIds.join(", ")})
26
+ `;
27
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
28
+ yield { modelId: row.modelId, id: row.id };
29
+ }
30
+ }
31
+ async getFilteredElementsModels(filteredElementIds) {
32
+ if (filteredElementIds.length === 0) {
33
+ return new Map();
34
+ }
35
+ this._filteredElementsModels ??= (async () => {
36
+ const filteredElementsModels = new Map();
37
+ for await (const { modelId, id } of this.queryFilteredElementsModels(filteredElementIds)) {
38
+ filteredElementsModels.set(id, modelId);
39
+ }
40
+ return filteredElementsModels;
41
+ })();
42
+ return this._filteredElementsModels;
43
+ }
44
+ clearFilteredElementsModels() {
45
+ this._filteredElementsModels = undefined;
46
+ }
47
+ async *queryElementModelCategories() {
48
+ const query = `
49
+ SELECT this.Model.Id modelId, this.Category.Id categoryId, m.IsPrivate isModelPrivate
50
+ FROM ${this._categoryModelClass} m
51
+ JOIN ${this._categoryElementClass} this ON m.ECInstanceId = this.Model.Id
52
+ WHERE this.Parent.Id IS NULL
53
+ GROUP BY modelId, categoryId, isModelPrivate
54
+ `;
55
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: "tree-widget/categories-tree/element-models-and-categories-query" })) {
56
+ yield { modelId: row.modelId, categoryId: row.categoryId, isModelPrivate: !!row.isModelPrivate };
57
+ }
13
58
  }
14
59
  async *queryCategories() {
15
60
  const isDefinitionContainerSupported = await this.getIsDefinitionContainerSupported();
16
61
  const categoriesQuery = `
17
62
  SELECT
18
63
  this.ECInstanceId id,
19
- COUNT(sc.ECInstanceId) childCount,
64
+ COUNT(sc.ECInstanceId) subCategoryChildCount,
20
65
  this.Model.Id modelId,
21
66
  ${isDefinitionContainerSupported
22
67
  ? `
23
- IIF(this.Model.Id IN (SELECT dc.ECInstanceId FROM ${DEFINITION_CONTAINER_CLASS} dc),
68
+ IIF(this.Model.Id IN (SELECT dc.ECInstanceId FROM ${DEFINITION_CONTAINER_CLASS_NAME} dc),
24
69
  true,
25
70
  false
26
71
  )`
27
72
  : "false"} parentDefinitionContainerExists
28
73
  FROM
29
74
  ${this._categoryClass} this
30
- JOIN ${SUB_CATEGORY_CLASS} sc ON sc.Parent.Id = this.ECInstanceId
31
- JOIN BisCore.Model m ON m.ECInstanceId = this.Model.Id
75
+ JOIN ${SUB_CATEGORY_CLASS_NAME} sc ON sc.Parent.Id = this.ECInstanceId
76
+ JOIN ${MODEL_CLASS_NAME} m ON m.ECInstanceId = this.Model.Id
32
77
  WHERE
33
78
  NOT this.IsPrivate
34
79
  AND (NOT m.IsPrivate OR m.ECClassId IS (BisCore.DictionaryModel))
35
80
  AND EXISTS (SELECT 1 FROM ${this._categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId)
36
81
  GROUP BY this.ECInstanceId
37
82
  `;
38
- for await (const row of this._queryExecutor.createQueryReader({ ecsql: categoriesQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
39
- yield { id: row.id, modelId: row.modelId, parentDefinitionContainerExists: row.parentDefinitionContainerExists, childCount: row.childCount };
83
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: categoriesQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: "tree-widget/categories-tree/categories-query" })) {
84
+ yield {
85
+ id: row.id,
86
+ modelId: row.modelId,
87
+ parentDefinitionContainerExists: row.parentDefinitionContainerExists,
88
+ subCategoryChildCount: row.subCategoryChildCount,
89
+ };
40
90
  }
41
91
  }
42
92
  async queryIsDefinitionContainersSupported() {
@@ -50,7 +100,7 @@ export class CategoriesTreeIdsCache {
50
100
  s.Name = 'BisCore'
51
101
  AND c.Name = 'DefinitionContainer'
52
102
  `;
53
- for await (const _row of this._queryExecutor.createQueryReader({ ecsql: query })) {
103
+ for await (const _row of this._queryExecutor.createQueryReader({ ecsql: query }, { restartToken: "tree-widget/categories-tree/is-definition-container-supported-query" })) {
54
104
  return true;
55
105
  }
56
106
  return false;
@@ -68,9 +118,9 @@ export class CategoriesTreeIdsCache {
68
118
  dc.ECInstanceId,
69
119
  dc.Model.Id
70
120
  FROM
71
- ${DEFINITION_CONTAINER_CLASS} dc
121
+ ${DEFINITION_CONTAINER_CLASS_NAME} dc
72
122
  WHERE
73
- dc.ECInstanceId IN (SELECT c.Model.Id FROM ${this._categoryClass} c WHERE NOT c.IsPrivate)
123
+ dc.ECInstanceId IN (SELECT c.Model.Id FROM ${this._categoryClass} c WHERE NOT c.IsPrivate AND EXISTS (SELECT 1 FROM ${this._categoryElementClass} e WHERE e.Category.Id = c.ECInstanceId))
74
124
  AND NOT dc.IsPrivate
75
125
 
76
126
  UNION ALL
@@ -80,7 +130,7 @@ export class CategoriesTreeIdsCache {
80
130
  pdc.Model.Id
81
131
  FROM
82
132
  ${DEFINITION_CONTAINERS_CTE} cdc
83
- JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId
133
+ JOIN ${DEFINITION_CONTAINER_CLASS_NAME} pdc ON pdc.ECInstanceId = cdc.ModelId
84
134
  WHERE
85
135
  NOT pdc.IsPrivate
86
136
  )
@@ -89,22 +139,22 @@ export class CategoriesTreeIdsCache {
89
139
  const definitionsQuery = `
90
140
  SELECT dc.ECInstanceId id, dc.ModelId modelId FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId
91
141
  `;
92
- for await (const row of this._queryExecutor.createQueryReader({ ctes, ecsql: definitionsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
142
+ for await (const row of this._queryExecutor.createQueryReader({ ctes, ecsql: definitionsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: "tree-widget/categories-tree/definition-containers-query" })) {
93
143
  yield { id: row.id, modelId: row.modelId };
94
144
  }
95
145
  }
96
- async *queryVisibleSubCategories(categoriesInfo) {
146
+ async *queryVisibleSubCategories(categoryIds) {
97
147
  const definitionsQuery = `
98
148
  SELECT
99
149
  sc.ECInstanceId id,
100
150
  sc.Parent.Id categoryId
101
151
  FROM
102
- ${SUB_CATEGORY_CLASS} sc
152
+ ${SUB_CATEGORY_CLASS_NAME} sc
103
153
  WHERE
104
154
  NOT sc.IsPrivate
105
- AND sc.Parent.Id IN (${categoriesInfo.join(",")})
155
+ AND sc.Parent.Id IN (${categoryIds.join(",")})
106
156
  `;
107
- for await (const row of this._queryExecutor.createQueryReader({ ecsql: definitionsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
157
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: definitionsQuery }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: "tree-widget/categories-tree/sub-categories-query" })) {
108
158
  yield { id: row.id, parentId: row.categoryId };
109
159
  }
110
160
  }
@@ -117,19 +167,90 @@ export class CategoriesTreeIdsCache {
117
167
  modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };
118
168
  allModelsCategories.set(queriedCategory.modelId, modelCategories);
119
169
  }
120
- modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount });
170
+ modelCategories.childCategories.push({ id: queriedCategory.id, subCategoryChildCount: queriedCategory.subCategoryChildCount });
121
171
  }
122
172
  return allModelsCategories;
123
173
  })();
124
174
  return this._modelsCategoriesInfo;
125
175
  }
176
+ async getElementModelsCategories() {
177
+ this._elementModelsCategories ??= (async () => {
178
+ const [modelCategories, modelWithCategoryModeledElements] = await Promise.all([
179
+ (async () => {
180
+ const elementModelsCategories = new Map();
181
+ for await (const queriedCategory of this.queryElementModelCategories()) {
182
+ let modelEntry = elementModelsCategories.get(queriedCategory.modelId);
183
+ if (modelEntry === undefined) {
184
+ modelEntry = { categoryIds: new Set(), isModelPrivate: queriedCategory.isModelPrivate };
185
+ elementModelsCategories.set(queriedCategory.modelId, modelEntry);
186
+ }
187
+ modelEntry.categoryIds.add(queriedCategory.categoryId);
188
+ }
189
+ return elementModelsCategories;
190
+ })(),
191
+ this.getModelWithCategoryModeledElements(),
192
+ ]);
193
+ const result = new Map();
194
+ const subModels = getDistinctMapValues(modelWithCategoryModeledElements);
195
+ for (const [modelId, modelEntry] of modelCategories) {
196
+ const isSubModel = subModels.has(modelId);
197
+ result.set(modelId, { categoryIds: modelEntry.categoryIds, isSubModel, isModelPrivate: modelEntry.isModelPrivate });
198
+ }
199
+ return result;
200
+ })();
201
+ return this._elementModelsCategories;
202
+ }
203
+ async *queryModeledElements() {
204
+ const query = `
205
+ SELECT
206
+ pe.ECInstanceId modeledElementId,
207
+ pe.Category.Id categoryId,
208
+ pe.Model.Id modelId
209
+ FROM ${this._categoryModelClass} m
210
+ JOIN ${this._categoryElementClass} pe ON pe.ECInstanceId = m.ModeledElement.Id
211
+ WHERE
212
+ m.IsPrivate = false
213
+ AND m.ECInstanceId IN (SELECT Model.Id FROM ${this._categoryElementClass})
214
+ `;
215
+ for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: "tree-widget/categories-tree/modeled-elements-query" })) {
216
+ yield { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId, rootCategoryId: row.rootCategoryId };
217
+ }
218
+ }
219
+ async getModelWithCategoryModeledElements() {
220
+ this._modelWithCategoryModeledElements ??= (async () => {
221
+ const modelWithCategoryModeledElements = new Map();
222
+ for await (const { modelId, categoryId, modeledElementId } of this.queryModeledElements()) {
223
+ const key = `${modelId}-${categoryId}`;
224
+ const entry = modelWithCategoryModeledElements.get(key);
225
+ if (entry === undefined) {
226
+ modelWithCategoryModeledElements.set(key, new Set([modeledElementId]));
227
+ }
228
+ else {
229
+ entry.add(modeledElementId);
230
+ }
231
+ }
232
+ return modelWithCategoryModeledElements;
233
+ })();
234
+ return this._modelWithCategoryModeledElements;
235
+ }
236
+ async getCategoriesModeledElements(modelId, categoryIds) {
237
+ const modelWithCategoryModeledElements = await this.getModelWithCategoryModeledElements();
238
+ const result = new Array();
239
+ for (const categoryId of categoryIds) {
240
+ const entry = modelWithCategoryModeledElements.get(`${modelId}-${categoryId}`);
241
+ if (entry !== undefined) {
242
+ result.push(...entry);
243
+ }
244
+ }
245
+ return result;
246
+ }
126
247
  async getSubCategoriesInfo() {
127
248
  this._subCategoriesInfo ??= (async () => {
128
249
  const allSubCategories = new Map();
129
250
  const modelsCategoriesInfo = await this.getModelsCategoriesInfo();
130
251
  const categoriesWithMoreThanOneSubCategory = new Array();
131
252
  for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {
132
- categoriesWithMoreThanOneSubCategory.push(...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id));
253
+ categoriesWithMoreThanOneSubCategory.push(...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.subCategoryChildCount > 1).map((categoryInfo) => categoryInfo.id));
133
254
  }
134
255
  if (categoriesWithMoreThanOneSubCategory.length === 0) {
135
256
  return allSubCategories;
@@ -156,14 +277,14 @@ export class CategoriesTreeIdsCache {
156
277
  definitionContainersInfo.set(queriedDefinitionContainer.id, {
157
278
  childCategories: modelCategoriesInfo?.childCategories ?? [],
158
279
  modelId: queriedDefinitionContainer.modelId,
159
- childDefinitionContainers: [],
280
+ childDefinitionContainerIds: [],
160
281
  parentDefinitionContainerExists: false,
161
282
  });
162
283
  }
163
284
  for (const [definitionContainerId, definitionContainerInfo] of definitionContainersInfo) {
164
285
  const parentDefinitionContainer = definitionContainersInfo.get(definitionContainerInfo.modelId);
165
286
  if (parentDefinitionContainer !== undefined) {
166
- parentDefinitionContainer.childDefinitionContainers.push(definitionContainerId);
287
+ parentDefinitionContainer.childDefinitionContainerIds.push(definitionContainerId);
167
288
  definitionContainerInfo.parentDefinitionContainerExists = true;
168
289
  }
169
290
  }
@@ -177,12 +298,41 @@ export class CategoriesTreeIdsCache {
177
298
  parentDefinitionContainerIds.forEach((parentDefinitionContainerId) => {
178
299
  const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);
179
300
  if (parentDefinitionContainerInfo !== undefined) {
180
- result.definitionContainers.push(...parentDefinitionContainerInfo.childDefinitionContainers);
301
+ result.definitionContainers.push(...parentDefinitionContainerInfo.childDefinitionContainerIds);
181
302
  result.categories.push(...parentDefinitionContainerInfo.childCategories);
182
303
  }
183
304
  });
184
305
  return result;
185
306
  }
307
+ async getCategoriesElementModels(categoryIds, includeSubModels) {
308
+ const elementModelsCategories = await this.getElementModelsCategories();
309
+ const result = new Map();
310
+ for (const categoryId of categoryIds) {
311
+ for (const [modelId, { categoryIds: categories, isSubModel }] of elementModelsCategories) {
312
+ if ((includeSubModels || !isSubModel) && categories.has(categoryId)) {
313
+ let categoryModels = result.get(categoryId);
314
+ if (!categoryModels) {
315
+ categoryModels = new Array();
316
+ result.set(categoryId, categoryModels);
317
+ }
318
+ categoryModels.push(modelId);
319
+ }
320
+ }
321
+ }
322
+ return result;
323
+ }
324
+ async getModelCategoryIds(modelId) {
325
+ const elementModelsCategories = await this.getElementModelsCategories();
326
+ return [...(elementModelsCategories.get(modelId)?.categoryIds ?? [])];
327
+ }
328
+ async hasSubModel(elementId) {
329
+ const elementModelsCategories = await this.getElementModelsCategories();
330
+ const modeledElementInfo = elementModelsCategories.get(elementId);
331
+ if (!modeledElementInfo) {
332
+ return false;
333
+ }
334
+ return !modeledElementInfo.isModelPrivate;
335
+ }
186
336
  async getAllContainedCategories(definitionContainerIds) {
187
337
  const result = new Array();
188
338
  const definitionContainersInfo = await this.getDefinitionContainersInfo();
@@ -192,7 +342,7 @@ export class CategoriesTreeIdsCache {
192
342
  return [];
193
343
  }
194
344
  result.push(...definitionContainerInfo.childCategories.map((category) => category.id));
195
- return this.getAllContainedCategories(definitionContainerInfo.childDefinitionContainers);
345
+ return this.getAllContainedCategories(definitionContainerInfo.childDefinitionContainerIds);
196
346
  }));
197
347
  for (const categories of indirectCategories) {
198
348
  result.push(...categories);
@@ -206,7 +356,7 @@ export class CategoriesTreeIdsCache {
206
356
  if (subCategoryInfo === undefined) {
207
357
  return [];
208
358
  }
209
- return [...(await this.getInstanceKeyPaths({ categoryId: subCategoryInfo.categoryId })), { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }];
359
+ return [...(await this.getInstanceKeyPaths({ categoryId: subCategoryInfo.categoryId })), { id: props.subCategoryId, className: SUB_CATEGORY_CLASS_NAME }];
210
360
  }
211
361
  if ("categoryId" in props) {
212
362
  const modelsCategoriesInfo = await this.getModelsCategoriesInfo();
@@ -226,13 +376,16 @@ export class CategoriesTreeIdsCache {
226
376
  return [];
227
377
  }
228
378
  if (!definitionContainerInfo.parentDefinitionContainerExists) {
229
- return [{ id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS }];
379
+ return [{ id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS_NAME }];
230
380
  }
231
381
  return [
232
382
  ...(await this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId })),
233
- { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS },
383
+ { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS_NAME },
234
384
  ];
235
385
  }
386
+ async getCategoryElementsCount(modelId, categoryId) {
387
+ return this._categoryElementCounts.getCategoryElementsCount(modelId, categoryId);
388
+ }
236
389
  async getAllDefinitionContainersAndCategories() {
237
390
  const [modelsCategoriesInfo, definitionContainersInfo] = await Promise.all([this.getModelsCategoriesInfo(), this.getDefinitionContainersInfo()]);
238
391
  const result = { definitionContainers: [...definitionContainersInfo.keys()], categories: new Array() };
@@ -256,12 +409,19 @@ export class CategoriesTreeIdsCache {
256
409
  }
257
410
  return result;
258
411
  }
259
- async getSubCategories(categoryId) {
412
+ async getSubCategories(categoryIds) {
260
413
  const subCategoriesInfo = await this.getSubCategoriesInfo();
261
- const result = new Array();
262
- for (const [subCategoryId, subCategoryInfo] of subCategoriesInfo) {
263
- if (subCategoryInfo.categoryId === categoryId) {
264
- result.push(subCategoryId);
414
+ const result = new Map();
415
+ for (const categoryId of categoryIds) {
416
+ for (const [subCategoryId, subCategoryInfo] of subCategoriesInfo) {
417
+ if (subCategoryInfo.categoryId === categoryId) {
418
+ let categoryEntry = result.get(categoryId);
419
+ if (!categoryEntry) {
420
+ categoryEntry = [];
421
+ result.set(categoryId, categoryEntry);
422
+ }
423
+ categoryEntry.push(subCategoryId);
424
+ }
265
425
  }
266
426
  }
267
427
  return result;
@@ -271,10 +431,4 @@ export class CategoriesTreeIdsCache {
271
431
  return this._isDefinitionContainerSupported;
272
432
  }
273
433
  }
274
- /** @internal */
275
- export function getClassesByView(viewType) {
276
- return viewType === "2d"
277
- ? { categoryClass: "BisCore.DrawingCategory", categoryElementClass: "BisCore.GeometricElement2d" }
278
- : { categoryClass: "BisCore.SpatialCategory", categoryElementClass: "BisCore.GeometricElement3d" };
279
- }
280
434
  //# sourceMappingURL=CategoriesTreeIdsCache.js.map