@itwin/tree-widget-react 4.0.0-alpha.6 → 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 (159) 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/tree-header/SearchBox.d.ts +1 -0
  6. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js +1 -0
  7. package/lib/esm/tree-widget-react/components/tree-header/SearchBox.js.map +1 -1
  8. package/lib/esm/tree-widget-react/components/tree-header/SelectableTree.css +2 -0
  9. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +9 -2
  10. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +50 -4
  11. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js +1 -1
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +17 -3
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +561 -161
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +6 -2
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +115 -40
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +30 -15
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +192 -38
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +18 -3
  24. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +30 -3
  25. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -1
  26. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.d.ts +24 -0
  27. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +785 -0
  28. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -0
  29. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.d.ts +39 -0
  30. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js +221 -0
  31. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/FilteredTree.js.map +1 -0
  32. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +5 -17
  33. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +5 -62
  34. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  35. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.d.ts +2 -0
  36. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +4 -2
  37. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  38. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.d.ts +1 -0
  39. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js +2 -1
  40. package/lib/esm/tree-widget-react/components/trees/common/UseNodeHighlighting.js.map +1 -1
  41. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -0
  42. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js +2 -1
  43. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.js.map +1 -1
  44. package/lib/esm/tree-widget-react/components/trees/common/Utils.d.ts +33 -23
  45. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +60 -47
  46. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  47. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js +3 -3
  48. package/lib/esm/tree-widget-react/components/trees/common/components/BaseTreeRenderer.js.map +1 -1
  49. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -0
  50. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js +1 -0
  51. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.js.map +1 -1
  52. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -0
  53. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js +1 -0
  54. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.js.map +1 -1
  55. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.css +2 -1
  56. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +4 -4
  57. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  58. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.d.ts +1 -0
  59. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js +1 -0
  60. package/lib/esm/tree-widget-react/components/trees/common/components/UseVisibilityButtonHandler.js.map +1 -1
  61. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js +1 -1
  62. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.js.map +1 -1
  63. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  64. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.d.ts +44 -0
  65. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/AlwaysAndNeverDrawnElementInfo.js +81 -31
  66. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -0
  67. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.d.ts +33 -0
  68. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js +37 -0
  69. package/lib/esm/tree-widget-react/components/trees/common/internal/ClassNameDefinitions.js.map +1 -0
  70. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.d.ts +16 -0
  71. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +72 -0
  72. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -0
  73. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.d.ts → internal/Rxjs.d.ts} +9 -2
  74. package/lib/esm/tree-widget-react/components/trees/common/{Rxjs.js → internal/Rxjs.js} +9 -2
  75. package/lib/esm/tree-widget-react/components/trees/common/internal/Rxjs.js.map +1 -0
  76. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.d.ts → internal/Tooltip.d.ts} +5 -1
  77. package/lib/esm/tree-widget-react/components/trees/common/{Tooltip.js → internal/Tooltip.js} +7 -1
  78. package/lib/esm/tree-widget-react/components/trees/common/internal/Tooltip.js.map +1 -0
  79. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.d.ts +14 -0
  80. package/lib/esm/tree-widget-react/components/trees/{categories-tree/internal/ClassNameDefinitions.js → common/internal/Types.js} +2 -7
  81. package/lib/esm/tree-widget-react/components/trees/common/internal/Types.js.map +1 -0
  82. package/lib/esm/tree-widget-react/components/trees/common/internal/UseActiveViewport.js.map +1 -0
  83. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.d.ts → internal/UseHierarchiesLocalization.d.ts} +1 -0
  84. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchiesLocalization.js → internal/UseHierarchiesLocalization.js} +6 -2
  85. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchiesLocalization.js.map +1 -0
  86. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.d.ts → internal/UseHierarchyFiltering.d.ts} +1 -0
  87. package/lib/esm/tree-widget-react/components/trees/common/{UseHierarchyFiltering.js → internal/UseHierarchyFiltering.js} +4 -3
  88. package/lib/esm/tree-widget-react/components/trees/common/internal/UseHierarchyFiltering.js.map +1 -0
  89. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.d.ts → internal/UseIModelChangeListener.d.ts} +1 -0
  90. package/lib/esm/tree-widget-react/components/trees/common/{UseIModelChangeListener.js → internal/UseIModelChangeListener.js} +1 -0
  91. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelChangeListener.js.map +1 -0
  92. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.d.ts +47 -0
  93. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js +101 -0
  94. package/lib/esm/tree-widget-react/components/trees/common/internal/Utils.js.map +1 -0
  95. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.d.ts +20 -0
  96. package/lib/esm/tree-widget-react/components/trees/{models-tree → common}/internal/VisibilityChangeEventListener.js +17 -9
  97. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityChangeEventListener.js.map +1 -0
  98. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.d.ts +82 -0
  99. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +234 -0
  100. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -0
  101. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  102. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  103. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +1 -0
  104. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +1 -0
  105. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  106. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -1
  107. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +13 -9
  108. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  109. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  110. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  111. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +13 -0
  112. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +39 -38
  113. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  114. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +5 -5
  115. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +25 -24
  116. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  117. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +9 -5
  118. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  119. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js +1 -1
  120. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  121. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +7 -2
  122. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +73 -70
  123. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  124. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +47 -29
  125. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  126. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +7 -9
  127. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +4 -6
  128. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
  129. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -5
  130. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +54 -104
  131. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  132. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +0 -26
  133. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +75 -291
  134. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  135. package/lib/public/locales/en/TreeWidget.json +51 -6
  136. package/package.json +17 -18
  137. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +0 -37
  138. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +0 -214
  139. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +0 -1
  140. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +0 -7
  141. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +0 -1
  142. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +0 -1
  143. package/lib/esm/tree-widget-react/components/trees/common/Tooltip.js.map +0 -1
  144. package/lib/esm/tree-widget-react/components/trees/common/UseActiveViewport.js.map +0 -1
  145. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.d.ts +0 -11
  146. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js +0 -24
  147. package/lib/esm/tree-widget-react/components/trees/common/UseFiltering.js.map +0 -1
  148. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchiesLocalization.js.map +0 -1
  149. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.js.map +0 -1
  150. package/lib/esm/tree-widget-react/components/trees/common/UseIModelChangeListener.js.map +0 -1
  151. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +0 -7
  152. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +0 -21
  153. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +0 -1
  154. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +0 -29
  155. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +0 -1
  156. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +0 -12
  157. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +0 -1
  158. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.d.ts → internal/UseActiveViewport.d.ts} +0 -0
  159. /package/lib/esm/tree-widget-react/components/trees/common/{UseActiveViewport.js → internal/UseActiveViewport.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { defer, EMPTY, from, lastValueFrom, map, mergeMap, toArray } from \"rxjs\";\nimport { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition } from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { getClassesByView } from \"./internal/CategoriesTreeIdsCache.js\";\nimport { DEFINITION_CONTAINER_CLASS, DEFINITION_ELEMENT_CLASS, SUB_CATEGORY_CLASS } from \"./internal/ClassNameDefinitions.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { ECClassHierarchyInspector, ECSchemaProvider, IInstanceLabelSelectClauseFactory, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { CategoriesTreeIdsCache } from \"./internal/CategoriesTreeIdsCache.js\";\nimport type {\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GenericInstanceFilter,\n HierarchyDefinition,\n HierarchyFilteringPath,\n HierarchyLevelDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\ninterface CategoriesTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n viewType: \"2d\" | \"3d\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\ninterface CategoriesTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n label: string;\n viewType: \"2d\" | \"3d\";\n limit?: number | \"unbounded\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/**\n * Defines hierarchy configuration supported by `CategoriesTree`.\n * @beta\n */\nexport interface CategoriesTreeHierarchyConfiguration {\n /** Should SubCategories be hidden. Defaults to `false` */\n hideSubCategories: boolean;\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: CategoriesTreeHierarchyConfiguration = {\n hideSubCategories: false,\n};\n\nexport class CategoriesTreeDefinition implements HierarchyDefinition {\n private _impl: Promise<HierarchyDefinition> | undefined;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n private _idsCache: CategoriesTreeIdsCache;\n private _viewType: \"2d\" | \"3d\";\n private _hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n private _iModelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n\n public constructor(props: CategoriesTreeDefinitionProps) {\n this._iModelAccess = props.imodelAccess;\n this._viewType = props.viewType;\n this._idsCache = props.idsCache;\n this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this._selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,\n });\n this._hierarchyConfig = props.hierarchyConfig;\n }\n\n private async getHierarchyDefinition(): Promise<HierarchyDefinition> {\n this._impl ??= (async () => {\n const isDefinitionContainerSupported = await this._idsCache.getIsDefinitionContainerSupported();\n return createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: this._iModelAccess,\n hierarchy: {\n rootNodes: async (requestProps: DefineRootHierarchyLevelProps) =>\n this.createDefinitionContainersAndCategoriesQuery({ ...requestProps, viewType: this._viewType }),\n childNodes: [\n ...(this._hierarchyConfig.hideSubCategories\n ? []\n : [\n {\n parentInstancesNodePredicate: \"BisCore.Category\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubcategoryQuery(requestProps),\n },\n ]),\n ...(isDefinitionContainerSupported\n ? [\n {\n parentInstancesNodePredicate: DEFINITION_CONTAINER_CLASS,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) =>\n this.createDefinitionContainersAndCategoriesQuery({\n ...requestProps,\n viewType: this._viewType,\n }),\n },\n ]\n : []),\n ],\n },\n });\n })();\n return this._impl;\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n return (await this.getHierarchyDefinition()).defineHierarchyLevel(props);\n }\n\n private async createDefinitionContainersAndCategoriesQuery(props: {\n parentNodeInstanceIds?: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n viewType: \"2d\" | \"3d\";\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds, instanceFilter, viewType } = props;\n const { definitionContainers, categories } =\n parentNodeInstanceIds === undefined\n ? await this._idsCache.getRootDefinitionContainersAndCategories()\n : await this._idsCache.getDirectChildDefinitionContainersAndCategories(parentNodeInstanceIds);\n if (categories.length === 0 && definitionContainers.length === 0) {\n return [];\n }\n\n const categoriesWithSingleChild = new Array<Id64String>();\n const categoriesWithMultipleChildren = new Array<Id64String>();\n categories.forEach((category) => {\n if (category.childCount > 1) {\n categoriesWithMultipleChildren.push(category.id);\n } else {\n categoriesWithSingleChild.push(category.id);\n }\n });\n const dataToDetermineHasChildren =\n categoriesWithSingleChild.length > categoriesWithMultipleChildren.length\n ? { ids: categoriesWithMultipleChildren, ifTrue: 1, ifFalse: 0 }\n : { ids: categoriesWithSingleChild, ifTrue: 0, ifFalse: 1 };\n\n const { categoryClass } = getClassesByView(viewType);\n\n const [categoriesInstanceFilterClauses, definitionContainersInstanceFilterClauses] = await Promise.all(\n [categoryClass, ...(definitionContainers.length > 0 ? [DEFINITION_CONTAINER_CLASS] : [])].map(async (className) =>\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: className, alias: \"this\" },\n }),\n ),\n );\n\n const definitionContainersQuery =\n definitionContainers.length > 0\n ? `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: DEFINITION_CONTAINER_CLASS,\n }),\n },\n extendedData: {\n isDefinitionContainer: true,\n imageId: \"icon-definition-container\",\n },\n hasChildren: true,\n supportsFiltering: true,\n })}\n FROM\n ${definitionContainersInstanceFilterClauses.from} this\n ${definitionContainersInstanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${definitionContainers.join(\", \")})\n ${definitionContainersInstanceFilterClauses.where ? `AND ${definitionContainersInstanceFilterClauses.where}` : \"\"}\n `\n : undefined;\n\n const categoriesQuery =\n categories.length > 0\n ? `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: categoryClass,\n }),\n },\n ...(this._hierarchyConfig.hideSubCategories\n ? { hasChildren: false }\n : dataToDetermineHasChildren.ids.length > 0\n ? {\n hasChildren: {\n selector: `\n IIF(this.ECInstanceId IN (${dataToDetermineHasChildren.ids.join(\",\")}),\n ${dataToDetermineHasChildren.ifTrue},\n ${dataToDetermineHasChildren.ifFalse}\n )\n `,\n },\n }\n : { hasChildren: !!dataToDetermineHasChildren.ifFalse }),\n extendedData: {\n description: { selector: \"this.Description\" },\n isCategory: true,\n imageId: \"icon-layers\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${categoriesInstanceFilterClauses.from} this\n ${categoriesInstanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${categories.map((category) => category.id).join(\", \")})\n ${categoriesInstanceFilterClauses.where ? `AND ${categoriesInstanceFilterClauses.where}` : \"\"}\n `\n : undefined;\n const queries = [categoriesQuery, definitionContainersQuery].filter((query) => query !== undefined);\n return [\n {\n fullClassName: DEFINITION_ELEMENT_CLASS,\n query: {\n ecsql: queries.join(\" UNION ALL \"),\n },\n },\n ];\n }\n\n private async createSubcategoryQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: SUB_CATEGORY_CLASS, alias: \"this\" },\n });\n return [\n {\n fullClassName: SUB_CATEGORY_CLASS,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: SUB_CATEGORY_CLASS,\n }),\n },\n extendedData: {\n categoryId: { selector: \"printf('0x%x', this.Parent.Id)\" },\n isSubCategory: true,\n imageId: \"icon-layers-isolate\",\n },\n supportsFiltering: false,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n NOT this.IsPrivate AND this.Parent.Id IN (${elementIds.map(() => \"?\").join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: elementIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n public static async createInstanceKeyPaths(props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps): Promise<HierarchyFilteringPath[]> {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory, cache: props.idsCache });\n }\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory; cache: CategoriesTreeIdsCache },\n): Promise<HierarchyFilteringPath[]> {\n const { definitionContainers, categories } = await props.cache.getAllDefinitionContainersAndCategories();\n if (categories.length === 0) {\n return [];\n }\n\n const { categoryClass } = getClassesByView(props.viewType);\n const adjustedLabel = props.label.replace(/[%_\\\\]/g, \"\\\\$&\");\n\n const CATEGORIES_WITH_LABELS_CTE = \"CategoriesWithLabels\";\n const SUBCATEGORIES_WITH_LABELS_CTE = \"SubCategoriesWithLabels\";\n const DEFINITION_CONTAINERS_WITH_LABELS_CTE = \"DefinitionContainersWithLabels\";\n const [categoryLabelSelectClause, subCategoryLabelSelectClause, definitionContainerLabelSelectClause] = await Promise.all(\n [categoryClass, SUB_CATEGORY_CLASS, ...(definitionContainers.length > 0 ? [DEFINITION_CONTAINER_CLASS] : [])].map(async (className) =>\n props.labelsFactory.createSelectClause({ classAlias: \"this\", className }),\n ),\n );\n return lastValueFrom(\n defer(() => {\n const ctes = [\n `${CATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ChildCount, DisplayLabel) AS (\n SELECT\n 'c',\n this.ECInstanceId,\n COUNT(sc.ECInstanceId),\n ${categoryLabelSelectClause}\n FROM\n ${categoryClass} this\n JOIN ${SUB_CATEGORY_CLASS} sc ON sc.Parent.Id = this.ECInstanceId\n WHERE\n this.ECInstanceId IN (${categories.join(\", \")})\n GROUP BY this.ECInstanceId\n )`,\n ...(props.hierarchyConfig.hideSubCategories\n ? []\n : [\n `${SUBCATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'sc',\n this.ECInstanceId,\n this.Parent.Id,\n ${subCategoryLabelSelectClause}\n FROM\n ${SUB_CATEGORY_CLASS} this\n WHERE\n NOT this.IsPrivate\n AND this.Parent.Id IN (${categories.join(\", \")})\n )`,\n ]),\n ...(definitionContainers.length > 0\n ? [\n `${DEFINITION_CONTAINERS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'dc',\n this.ECInstanceId,\n ${definitionContainerLabelSelectClause}\n FROM\n ${DEFINITION_CONTAINER_CLASS} this\n WHERE\n this.ECInstanceId IN (${definitionContainers.join(\", \")})\n )`,\n ]\n : []),\n ];\n const ecsql = `\n SELECT * FROM (\n SELECT\n c.ClassName AS ClassName,\n c.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n WHERE\n c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n ${\n props.hierarchyConfig.hideSubCategories\n ? \"\"\n : `\n UNION ALL\n SELECT\n sc.ClassName AS ClassName,\n sc.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n JOIN ${SUBCATEGORIES_WITH_LABELS_CTE} sc ON sc.ParentId = c.ECInstanceId\n WHERE\n c.ChildCount > 1\n AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n }\n ${\n definitionContainers.length > 0\n ? `\n UNION ALL\n SELECT\n dc.ClassName AS ClassName,\n dc.ECInstanceId AS ECInstanceId\n FROM\n ${DEFINITION_CONTAINERS_WITH_LABELS_CTE} dc\n WHERE\n dc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n )\n ${props.limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : props.limit !== \"unbounded\" ? `LIMIT ${props.limit}` : \"\"}\n `;\n const bindings = [\n { type: \"string\" as const, value: adjustedLabel },\n ...(props.hierarchyConfig.hideSubCategories ? [] : [{ type: \"string\" as const, value: adjustedLabel }]),\n ...(definitionContainers.length > 0 ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ];\n return props.imodelAccess.createQueryReader(\n { ctes, ecsql, bindings },\n { restartToken: \"tree-widget/categories-tree/filter-by-label-query\", limit: props.limit },\n );\n }).pipe(\n map(\n (row): InstanceKey => ({\n className: row.ClassName === \"c\" ? categoryClass : row.ClassName === \"sc\" ? SUB_CATEGORY_CLASS : DEFINITION_CONTAINER_CLASS,\n id: row.ECInstanceId,\n }),\n ),\n toArray(),\n mergeMap((targetItems): Observable<HierarchyFilteringPath> => createInstanceKeyPathsFromTargetItems({ ...props, targetItems })),\n toArray(),\n ),\n );\n}\n\nfunction createInstanceKeyPathsFromTargetItems(\n props: Pick<CategoriesTreeInstanceKeyPathsFromInstanceLabelProps, \"idsCache\" | \"limit\" | \"viewType\" | \"hierarchyConfig\"> & {\n targetItems: InstanceKey[];\n },\n): Observable<HierarchyFilteringPath> {\n const { limit, targetItems, viewType, idsCache, hierarchyConfig } = props;\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n\n if (targetItems.length === 0) {\n return EMPTY;\n }\n\n const { categoryClass } = getClassesByView(viewType);\n return from(targetItems).pipe(\n mergeMap(async (targetItem) => {\n if (targetItem.className === DEFINITION_CONTAINER_CLASS) {\n return { path: await idsCache.getInstanceKeyPaths({ definitionContainerId: targetItem.id }), options: { autoExpand: true } };\n }\n if (targetItem.className === categoryClass) {\n return { path: await idsCache.getInstanceKeyPaths({ categoryId: targetItem.id }), options: { autoExpand: true } };\n }\n return hierarchyConfig.hideSubCategories\n ? []\n : { path: await idsCache.getInstanceKeyPaths({ subCategoryId: targetItem.id }), options: { autoExpand: true } };\n }),\n );\n}\n"]}
1
+ {"version":3,"file":"CategoriesTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { bufferCount, defer, firstValueFrom, from, lastValueFrom, map, merge, mergeMap, of, reduce, toArray } from \"rxjs\";\nimport { assert } from \"@itwin/core-bentley\";\nimport { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, ProcessedHierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport {\n DEFINITION_CONTAINER_CLASS_NAME,\n INFORMATION_PARTITION_ELEMENT_CLASS_NAME,\n MODEL_CLASS_NAME,\n SUB_CATEGORY_CLASS_NAME,\n SUB_MODELED_ELEMENT_CLASS_NAME,\n} from \"../common/internal/ClassNameDefinitions.js\";\nimport { createIdsSelector, getClassesByView, getDistinctMapValues, parseIdsSelectorResult, releaseMainThreadOnItemsCount } from \"../common/internal/Utils.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\n\nimport type { Id64Array } from \"@itwin/core-bentley\";\nimport type { Observable } from \"rxjs\";\nimport type {\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GenericInstanceFilter,\n HierarchyDefinition,\n HierarchyFilteringPath,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type { CategoriesTreeIdsCache, CategoryInfo } from \"./internal/CategoriesTreeIdsCache.js\";\nimport type { CategoryId, DefinitionContainerId, ElementId, ModelId, SubCategoryId } from \"../common/internal/Types.js\";\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\ninterface CategoriesTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n viewType: \"2d\" | \"3d\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\ninterface CategoriesTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n label: string;\n viewType: \"2d\" | \"3d\";\n limit?: number | \"unbounded\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/**\n * Defines hierarchy configuration supported by `CategoriesTree`.\n * @beta\n */\nexport interface CategoriesTreeHierarchyConfiguration {\n /** Should SubCategories be hidden. Defaults to `false` */\n hideSubCategories: boolean;\n /** Should Elements be shown. Defaults to `false` */\n showElements: boolean;\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: CategoriesTreeHierarchyConfiguration = {\n hideSubCategories: false,\n showElements: false,\n};\n\n/** @internal */\nexport class CategoriesTreeDefinition implements HierarchyDefinition {\n private _impl: Promise<HierarchyDefinition> | undefined;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n private _idsCache: CategoriesTreeIdsCache;\n private _hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n private _iModelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n private _categoryClass: string;\n private _categoryElementClass: string;\n private _categoryModelClass: string;\n\n public constructor(props: CategoriesTreeDefinitionProps) {\n this._iModelAccess = props.imodelAccess;\n this._idsCache = props.idsCache;\n this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this._selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,\n });\n this._hierarchyConfig = props.hierarchyConfig;\n const { categoryClass, elementClass, modelClass } = getClassesByView(props.viewType);\n this._categoryClass = categoryClass;\n this._categoryElementClass = elementClass;\n this._categoryModelClass = modelClass;\n }\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n const modelElementsMap = new Map<ModelId, Set<ElementId>>();\n node.children.forEach((child) => {\n let modelEntry = modelElementsMap.get(child.extendedData?.modelId);\n if (!modelEntry) {\n modelEntry = new Set();\n modelElementsMap.set(child.extendedData?.modelId, modelEntry);\n }\n assert(child.key.type === \"instances\");\n for (const { id } of child.key.instanceKeys) {\n modelEntry.add(id);\n }\n });\n return {\n ...node,\n label: node.label,\n extendedData: {\n ...node.extendedData,\n // add `categoryId` from the first grouped element\n categoryId: node.children[0].extendedData?.categoryId,\n modelElementsMap,\n // `imageId` is assigned to instance nodes at query time, but grouping ones need to\n // be handled during post-processing\n imageId: \"icon-ec-class\",\n },\n };\n }\n return node;\n }\n\n private async getHierarchyDefinition(): Promise<HierarchyDefinition> {\n this._impl ??= (async () => {\n const isDefinitionContainerSupported = await this._idsCache.getIsDefinitionContainerSupported();\n return createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: this._iModelAccess,\n hierarchy: {\n rootNodes: async (requestProps: DefineRootHierarchyLevelProps) => this.createDefinitionContainersAndCategoriesQuery(requestProps),\n childNodes: [\n ...(this._hierarchyConfig.showElements\n ? [\n {\n parentInstancesNodePredicate: this._categoryElementClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: SUB_MODELED_ELEMENT_CLASS_NAME,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: this._categoryModelClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n ]\n : []),\n ...(this._hierarchyConfig.hideSubCategories && !this._hierarchyConfig.showElements\n ? []\n : [\n {\n parentInstancesNodePredicate: this._categoryClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createCategoryChildrenQuery(requestProps),\n },\n ]),\n ...(isDefinitionContainerSupported\n ? [\n {\n parentInstancesNodePredicate: DEFINITION_CONTAINER_CLASS_NAME,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) =>\n this.createDefinitionContainersAndCategoriesQuery(requestProps),\n },\n ]\n : []),\n ],\n },\n });\n })();\n return this._impl;\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n return (await this.getHierarchyDefinition()).defineHierarchyLevel(props);\n }\n\n private async createISubModeledElementChildrenQuery({\n parentNodeInstanceIds: elementIds,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n // note: we do not apply hierarchy level filtering on this hierarchy level, because it's always\n // hidden - the filter will get applied on the child hierarchy levels\n return [\n {\n fullClassName: this._categoryModelClass,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: \"\", // doesn't matter - the node is always hidden\n hideNodeInHierarchy: true,\n hasChildren: true,\n extendedData: {\n isModel: true,\n },\n })}\n FROM ${this._categoryModelClass} this\n WHERE\n this.ModeledElement.Id IN (${elementIds.map(() => \"?\").join(\",\")})\n AND NOT this.IsPrivate\n AND this.ECInstanceId IN (SELECT Model.Id FROM ${this._categoryElementClass})\n `,\n bindings: [...elementIds.map((id): ECSqlBinding => ({ type: \"id\", value: id }))],\n },\n },\n ];\n }\n\n private async createGeometricModel3dChildrenQuery({\n parentNodeInstanceIds: modelIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._categoryClass, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: this._categoryClass,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this._categoryClass,\n }),\n },\n grouping: { byLabel: { action: \"merge\", groupId: \"category\" } },\n hasChildren: true,\n extendedData: {\n imageId: \"icon-layers\",\n isCategory: true,\n modelIds: { selector: createIdsSelector(modelIds) },\n isCategoryOfSubModel: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this._categoryElementClass} element\n WHERE\n element.Model.Id IN (${modelIds.join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createDefinitionContainersAndCategoriesQuery(props: {\n parentNodeInstanceIds?: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds, instanceFilter } = props;\n const { definitionContainers, categories } =\n parentNodeInstanceIds === undefined\n ? await this._idsCache.getRootDefinitionContainersAndCategories()\n : await this._idsCache.getDirectChildDefinitionContainersAndCategories(parentNodeInstanceIds);\n const hierarchyDefinition = new Array<HierarchyNodesDefinition>();\n if (categories.length > 0) {\n hierarchyDefinition.push(...(await this.createCategoriesQuery({ categories, instanceFilter })));\n }\n if (definitionContainers.length > 0) {\n hierarchyDefinition.push(...(await this.createDefinitionContainersQuery({ definitionContainerIds: definitionContainers, instanceFilter })));\n }\n return hierarchyDefinition;\n }\n\n private async createDefinitionContainersQuery({\n definitionContainerIds,\n instanceFilter,\n }: {\n definitionContainerIds: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: DEFINITION_CONTAINER_CLASS_NAME, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: DEFINITION_CONTAINER_CLASS_NAME,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: DEFINITION_CONTAINER_CLASS_NAME,\n }),\n },\n extendedData: {\n isDefinitionContainer: true,\n imageId: \"icon-definition-container\",\n },\n hasChildren: true,\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${definitionContainerIds.join(\", \")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoriesQuery({\n categories,\n instanceFilter,\n }: {\n categories: Array<CategoryInfo>;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._categoryClass, alias: \"this\" },\n });\n const categoriesWithMultipleSubCategories = categories\n .filter((categoryInfo) => categoryInfo.subCategoryChildCount > 1)\n .map((categoryInfo) => categoryInfo.id);\n\n const hasChildrenSelector = () => {\n const conditions = new Array<string>();\n if (!this._hierarchyConfig.hideSubCategories && categoriesWithMultipleSubCategories.length > 0) {\n conditions.push(`this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(\",\")})`);\n }\n if (this._hierarchyConfig.showElements) {\n conditions.push(`\n this.ECInstanceId IN (\n SELECT e.Category.Id\n FROM ${this._categoryElementClass} e\n WHERE\n e.Parent.Id IS NULL\n AND e.ECInstanceId NOT IN (SELECT m.ECInstanceId FROM ${this._categoryModelClass} m)\n )`);\n }\n return conditions.length > 0\n ? {\n selector: `IIF(${conditions.join(\" OR \")}, 1, 0)`,\n }\n : false;\n };\n\n return [\n {\n fullClassName: this._categoryClass,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this._categoryClass,\n }),\n },\n hasChildren: hasChildrenSelector(),\n extendedData: {\n description: { selector: \"this.Description\" },\n isCategory: true,\n imageId: \"icon-layers\",\n hasSubCategories:\n categoriesWithMultipleSubCategories.length > 0\n ? { selector: `IIF(this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(\",\")}), true, false) ` }\n : false,\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${categories.map((category) => category.id).join(\", \")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoryChildrenQuery(props: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n return (\n await Promise.all([\n ...(!this._hierarchyConfig.hideSubCategories && props.parentNode.extendedData?.hasSubCategories ? [this.createSubCategoriesQuery(props)] : []),\n ...(this._hierarchyConfig.showElements ? [this.createCategoryElementsQuery(props)] : []),\n ])\n ).reduce((acc, levelDefinition) => acc.concat(levelDefinition), new Array<HierarchyNodesDefinition>());\n }\n\n private async createSubCategoriesQuery({\n parentNodeInstanceIds: categoryIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: SUB_CATEGORY_CLASS_NAME, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: SUB_CATEGORY_CLASS_NAME,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: SUB_CATEGORY_CLASS_NAME,\n }),\n },\n extendedData: {\n categoryId: { selector: \"printf('0x%x', this.Parent.Id)\" },\n isSubCategory: true,\n imageId: \"icon-layers-isolate\",\n },\n supportsFiltering: false,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n NOT this.IsPrivate AND this.Parent.Id IN (${categoryIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoryElementsQuery({\n parentNodeInstanceIds: categoryIds,\n instanceFilter,\n parentNode,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._categoryElementClass, alias: \"this\" },\n });\n const modelIds: Id64Array = parentNode.extendedData?.isCategoryOfSubModel\n ? parseIdsSelectorResult(parentNode.extendedData?.modelIds)\n : [...getDistinctMapValues(await this._idsCache.getCategoriesElementModels(categoryIds))];\n\n if (modelIds.length === 0) {\n return [];\n }\n const modeledElements = await firstValueFrom(\n from(modelIds).pipe(\n mergeMap(async (modelId) => this._idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n reduce((acc, foundModeledElements) => {\n return acc.concat(foundModeledElements);\n }, new Array<ElementId>()),\n ),\n );\n\n return [\n {\n fullClassName: this._categoryElementClass,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this._categoryElementClass,\n }),\n },\n hasChildren: {\n selector: `\n IIF(\n ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(\",\")})` : `FALSE`},\n 1,\n IFNULL((\n SELECT 1\n FROM ${this._categoryElementClass} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n )\n `,\n },\n grouping: {\n byClass: true,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n isElement: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${parentNode.extendedData?.isCategoryOfSubModel ? \"\" : `JOIN ${INFORMATION_PARTITION_ELEMENT_CLASS_NAME} ipe ON ipe.ECInstanceId = this.Model.Id`}\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.join(\",\")})\n AND this.Model.Id IN (${modelIds.join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createElementChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._categoryElementClass, alias: \"this\" },\n });\n return [\n {\n fullClassName: this._categoryElementClass,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this._categoryElementClass,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this._categoryElementClass} ce\n JOIN ${MODEL_CLASS_NAME} m ON ce.Model.Id = m.ECInstanceId\n WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)\n LIMIT 1\n ), 0)\n `,\n },\n grouping: {\n byClass: true,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n isElement: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${elementIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n public static async createInstanceKeyPaths(props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps): Promise<HierarchyFilteringPath[]> {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });\n }\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory },\n): Promise<HierarchyFilteringPath[]> {\n const { definitionContainers, categories } = await props.idsCache.getAllDefinitionContainersAndCategories();\n if (categories.length === 0) {\n return [];\n }\n const { categoryClass, elementClass } = getClassesByView(props.viewType);\n const adjustedLabel = props.label.replace(/[%_\\\\]/g, \"\\\\$&\");\n\n const CATEGORIES_WITH_LABELS_CTE = \"CategoriesWithLabels\";\n const ELEMENTS_WITH_LABELS_CTE = \"ElementsWithLabels\";\n const SUBCATEGORIES_WITH_LABELS_CTE = \"SubCategoriesWithLabels\";\n const DEFINITION_CONTAINERS_WITH_LABELS_CTE = \"DefinitionContainersWithLabels\";\n const [categoryLabelSelectClause, subCategoryLabelSelectClause, elementLabelSelectClause, definitionContainerLabelSelectClause] = await Promise.all(\n [categoryClass, SUB_CATEGORY_CLASS_NAME, elementClass, ...(definitionContainers.length > 0 ? [DEFINITION_CONTAINER_CLASS_NAME] : [])].map(\n async (className) => props.labelsFactory.createSelectClause({ classAlias: \"this\", className }),\n ),\n );\n return lastValueFrom(\n defer(() => {\n const ctes = [\n `${CATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ChildCount, DisplayLabel) AS (\n SELECT\n 'c',\n this.ECInstanceId,\n COUNT(sc.ECInstanceId),\n ${categoryLabelSelectClause}\n FROM\n ${categoryClass} this\n JOIN ${SUB_CATEGORY_CLASS_NAME} sc ON sc.Parent.Id = this.ECInstanceId\n WHERE\n this.ECInstanceId IN (${categories.join(\", \")})\n GROUP BY this.ECInstanceId\n )`,\n ...(props.hierarchyConfig.showElements\n ? [\n `${ELEMENTS_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'e',\n this.ECInstanceId,\n this.Parent.Id,\n ${elementLabelSelectClause}\n FROM\n ${elementClass} this\n JOIN ${MODEL_CLASS_NAME} m ON this.Model.Id = m.ECInstanceId\n WHERE\n NOT m.IsPrivate\n AND this.Category.Id IN (${categories.join(\", \")})\n )`,\n ]\n : []),\n ...(props.hierarchyConfig.hideSubCategories\n ? []\n : [\n `${SUBCATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'sc',\n this.ECInstanceId,\n this.Parent.Id,\n ${subCategoryLabelSelectClause}\n FROM\n ${SUB_CATEGORY_CLASS_NAME} this\n WHERE\n NOT this.IsPrivate\n AND this.Parent.Id IN (${categories.join(\", \")})\n )`,\n ]),\n ...(definitionContainers.length > 0\n ? [\n `${DEFINITION_CONTAINERS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'dc',\n this.ECInstanceId,\n ${definitionContainerLabelSelectClause}\n FROM\n ${DEFINITION_CONTAINER_CLASS_NAME} this\n WHERE\n this.ECInstanceId IN (${definitionContainers.join(\", \")})\n )`,\n ]\n : []),\n ];\n const ecsql = `\n SELECT * FROM (\n SELECT\n c.ClassName AS ClassName,\n c.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n WHERE\n c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n ${\n props.hierarchyConfig.showElements\n ? `\n UNION ALL\n SELECT\n e.ClassName AS ClassName,\n e.ECInstanceId AS ECInstanceId\n FROM\n ${ELEMENTS_WITH_LABELS_CTE} e\n WHERE\n e.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n ${\n props.hierarchyConfig.hideSubCategories\n ? \"\"\n : `\n UNION ALL\n SELECT\n sc.ClassName AS ClassName,\n sc.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n JOIN ${SUBCATEGORIES_WITH_LABELS_CTE} sc ON sc.ParentId = c.ECInstanceId\n WHERE\n c.ChildCount > 1\n AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n }\n ${\n definitionContainers.length > 0\n ? `\n UNION ALL\n SELECT\n dc.ClassName AS ClassName,\n dc.ECInstanceId AS ECInstanceId\n FROM\n ${DEFINITION_CONTAINERS_WITH_LABELS_CTE} dc\n WHERE\n dc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n )\n ${props.limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : props.limit !== \"unbounded\" ? `LIMIT ${props.limit}` : \"\"}\n `;\n const bindings = [\n { type: \"string\" as const, value: adjustedLabel },\n ...(props.hierarchyConfig.showElements ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ...(props.hierarchyConfig.hideSubCategories ? [] : [{ type: \"string\" as const, value: adjustedLabel }]),\n ...(definitionContainers.length > 0 ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ];\n return props.imodelAccess.createQueryReader(\n { ctes, ecsql, bindings },\n { restartToken: \"tree-widget/categories-tree/filter-by-label-query\", limit: props.limit },\n );\n }).pipe(\n map((row): InstanceKey => {\n let className: string;\n switch (row.ClassName) {\n case \"c\":\n className = categoryClass;\n break;\n case \"sc\":\n className = SUB_CATEGORY_CLASS_NAME;\n break;\n case \"e\":\n className = elementClass;\n break;\n default:\n className = DEFINITION_CONTAINER_CLASS_NAME;\n break;\n }\n return {\n className,\n id: row.ECInstanceId,\n };\n }),\n toArray(),\n mergeMap((targetItems) => createInstanceKeyPathsFromTargetItems({ ...props, targetItems })),\n toArray(),\n ),\n );\n}\n\nfunction createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n viewType,\n hierarchyConfig,\n idsCache,\n limit,\n}: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps & { targetItems: InstanceKey[] }): Observable<HierarchyFilteringPath> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n const { categoryClass } = getClassesByView(viewType);\n\n return from(targetItems).pipe(\n releaseMainThreadOnItemsCount(2000),\n reduce(\n (acc, { id, className }) => {\n if (className === categoryClass) {\n acc.categoryIds.push(id);\n return acc;\n }\n if (className === DEFINITION_CONTAINER_CLASS_NAME) {\n acc.definitionContainerIds.push(id);\n return acc;\n }\n if (className === SUB_CATEGORY_CLASS_NAME) {\n if (hierarchyConfig.hideSubCategories) {\n return acc;\n }\n acc.subCategoryIds.push(id);\n return acc;\n }\n\n if (!hierarchyConfig.showElements) {\n return acc;\n }\n acc.elementIds.push(id);\n return acc;\n },\n {\n definitionContainerIds: new Array<DefinitionContainerId>(),\n categoryIds: new Array<CategoryId>(),\n subCategoryIds: new Array<SubCategoryId>(),\n elementIds: new Array<ElementId>(),\n },\n ),\n mergeMap((ids) => {\n const elementsLength = ids.elementIds.length;\n return merge(\n from(ids.definitionContainerIds).pipe(\n mergeMap(async (id) => ({ path: await idsCache.getInstanceKeyPaths({ definitionContainerId: id }), options: { autoExpand: true } })),\n ),\n from(ids.categoryIds).pipe(mergeMap(async (id) => ({ path: await idsCache.getInstanceKeyPaths({ categoryId: id }), options: { autoExpand: true } }))),\n from(ids.subCategoryIds).pipe(\n mergeMap(async (id) => ({ path: await idsCache.getInstanceKeyPaths({ subCategoryId: id }), options: { autoExpand: true } })),\n ),\n from(ids.elementIds).pipe(\n bufferCount(Math.ceil(elementsLength / Math.ceil(elementsLength / 5000))),\n releaseMainThreadOnItemsCount(1),\n mergeMap((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, viewType, block), 10),\n ),\n );\n }),\n );\n}\n\nfunction createGeometricElementInstanceKeyPaths(\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor,\n idsCache: CategoriesTreeIdsCache,\n hierarchyConfig: CategoriesTreeHierarchyConfiguration,\n viewType: \"2d\" | \"3d\",\n targetItems: Id64Array,\n): Observable<HierarchyFilteringPath> {\n const separator = \";\";\n const { categoryClass, elementClass, modelClass } = getClassesByView(viewType);\n if (targetItems.length === 0 || !hierarchyConfig.showElements) {\n return of([]);\n }\n\n return defer(() => {\n const ctes = [\n `CategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, Path) AS (\n SELECT\n e.ECInstanceId,\n e.Parent.Id,\n e.Model.Id,\n IIF(e.Parent.Id IS NULL,\n 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT),\n 'e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT)\n )\n FROM ${elementClass} e\n LEFT JOIN ${modelClass} m ON (e.Parent.Id IS NULL AND m.ECInstanceId = e.Model.Id)\n LEFT JOIN ${categoryClass} c ON (e.Parent.Id IS NULL AND c.ECInstanceId = e.Category.Id)\n WHERE e.ECInstanceId IN (${targetItems.join(\",\")})\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n IIF(pe.Parent.Id IS NULL,\n 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path,\n 'e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path\n )\n FROM CategoriesElementsHierarchy ce\n JOIN ${elementClass} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN ${modelClass} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN ${categoryClass} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.Path\n FROM CategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"Indexes\", limit: \"unbounded\", restartToken: \"tree-widget/categories-tree/elements-filter-paths-query\" },\n );\n }).pipe(\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, separator, elementClass, categoryClass, modelClass)),\n mergeMap(async (elementHierarchyPath) => {\n const pathToCategory = await idsCache.getInstanceKeyPaths({ categoryId: elementHierarchyPath[0].id });\n pathToCategory.pop(); // category is already included in the element hierarchy path\n const path = [...pathToCategory, ...elementHierarchyPath];\n return { path, options: { autoExpand: true } };\n }),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, separator: string, elementClassName: string, categoryClassName: string, modelClassName: string) {\n const rowElements: string[] = row[0].split(separator);\n const path = new Array<InstanceKey>();\n for (let i = 0; i < rowElements.length; i += 2) {\n switch (rowElements[i]) {\n case \"e\":\n path.push({ className: elementClassName, id: rowElements[i + 1] });\n break;\n case \"c\":\n path.push({ className: categoryClassName, id: rowElements[i + 1] });\n break;\n case \"m\":\n // Ignore first model since it isn't in hierarchy\n if (i === 0) {\n break;\n }\n path.push({ className: modelClassName, id: rowElements[i + 1] });\n break;\n }\n }\n\n return path;\n}\n"]}
@@ -1,14 +1,18 @@
1
1
  import type { ReactNode } from "react";
2
- import type { VisibilityTreeProps } from "../common/components/VisibilityTree.js";
2
+ import type { Id64Array } from "@itwin/core-bentley";
3
3
  import type { Viewport } from "@itwin/core-frontend";
4
4
  import type { PresentationHierarchyNode } from "@itwin/presentation-hierarchies-react";
5
+ import type { VisibilityTreeProps } from "../common/components/VisibilityTree.js";
5
6
  import type { VisibilityTreeRendererProps } from "../common/components/VisibilityTreeRenderer.js";
6
7
  import type { CategoryInfo } from "../common/CategoriesVisibilityUtils.js";
7
8
  import type { CategoriesTreeHierarchyConfiguration } from "./CategoriesTreeDefinition.js";
8
9
  /** @beta */
9
10
  export interface UseCategoriesTreeProps {
10
11
  activeView: Viewport;
11
- onCategoriesFiltered?: (categories: CategoryInfo[] | undefined) => void;
12
+ onCategoriesFiltered?: (props: {
13
+ categories: CategoryInfo[] | undefined;
14
+ models?: Id64Array;
15
+ }) => void;
12
16
  filter?: string;
13
17
  emptyTreeContent?: ReactNode;
14
18
  hierarchyConfig?: Partial<CategoriesTreeHierarchyConfiguration>;
@@ -3,18 +3,74 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
- import { useCallback, useMemo, useState } from "react";
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
7
  import { assert } from "@itwin/core-bentley";
8
8
  import { Icon } from "@itwin/itwinui-react/bricks";
9
9
  import { createECSqlQueryExecutor } from "@itwin/presentation-core-interop";
10
10
  import { HierarchyFilteringPath, HierarchyNodeIdentifier } from "@itwin/presentation-hierarchies";
11
11
  import { EmptyTreeContent, FilterUnknownError, NoFilterMatches, TooManyFilterMatches } from "../common/components/EmptyTree.js";
12
+ import { DEFINITION_CONTAINER_CLASS_NAME, SUB_CATEGORY_CLASS_NAME } from "../common/internal/ClassNameDefinitions.js";
13
+ import { useIModelChangeListener } from "../common/internal/UseIModelChangeListener.js";
14
+ import { getClassesByView } from "../common/internal/Utils.js";
12
15
  import { FilterLimitExceededError } from "../common/TreeErrors.js";
13
16
  import { useTelemetryContext } from "../common/UseTelemetryContext.js";
14
17
  import { CategoriesTreeDefinition, defaultHierarchyConfiguration } from "./CategoriesTreeDefinition.js";
15
18
  import { CategoriesTreeIdsCache } from "./internal/CategoriesTreeIdsCache.js";
16
- import { CategoriesVisibilityHandler } from "./internal/CategoriesVisibilityHandler.js";
17
- import { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from "./internal/ClassNameDefinitions.js";
19
+ import { createCategoriesTreeVisibilityHandler } from "./internal/CategoriesTreeVisibilityHandler.js";
20
+ function createVisibilityHandlerFactory(activeView, idsCacheGetter, hierarchyConfig, filteredPaths) {
21
+ return ({ imodelAccess }) => createCategoriesTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, filteredPaths, hierarchyConfig });
22
+ }
23
+ function useIdsCache(imodel, viewType, filteredPaths) {
24
+ const cacheRef = useRef(undefined);
25
+ const clearCacheRef = useRef(() => () => {
26
+ cacheRef.current?.[Symbol.dispose]?.();
27
+ cacheRef.current = undefined;
28
+ });
29
+ const createCacheGetterRef = useRef((currImodel, currViewType) => () => {
30
+ if (cacheRef.current === undefined) {
31
+ cacheRef.current = new CategoriesTreeIdsCache(createECSqlQueryExecutor(currImodel), currViewType);
32
+ }
33
+ return cacheRef.current;
34
+ });
35
+ const [getCache, setCacheGetter] = useState(() => createCacheGetterRef.current(imodel, viewType));
36
+ useEffect(() => {
37
+ // clear cache in case it was created before `useEffect` was run first time
38
+ clearCacheRef.current();
39
+ // make sure all cache users rerender
40
+ setCacheGetter(() => createCacheGetterRef.current(imodel, viewType));
41
+ return () => {
42
+ // eslint-disable-next-line react-hooks/exhaustive-deps
43
+ clearCacheRef.current();
44
+ };
45
+ }, [imodel, viewType]);
46
+ useEffect(() => {
47
+ cacheRef.current?.clearFilteredElementsModels();
48
+ }, [filteredPaths]);
49
+ useIModelChangeListener({
50
+ imodel,
51
+ action: useCallback(() => {
52
+ clearCacheRef.current();
53
+ // make sure all cache users rerender
54
+ setCacheGetter(() => createCacheGetterRef.current(imodel, viewType));
55
+ }, [imodel, viewType]),
56
+ });
57
+ return {
58
+ getCache,
59
+ };
60
+ }
61
+ function useCachedVisibility(activeView, hierarchyConfig, viewType) {
62
+ const [filteredPaths, setFilteredPaths] = useState();
63
+ const { getCache: getCategoriesTreeIdsCache } = useIdsCache(activeView.iModel, viewType, filteredPaths);
64
+ const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState(() => createVisibilityHandlerFactory(activeView, getCategoriesTreeIdsCache, hierarchyConfig, filteredPaths));
65
+ useEffect(() => {
66
+ setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getCategoriesTreeIdsCache, hierarchyConfig, filteredPaths));
67
+ }, [activeView, getCategoriesTreeIdsCache, hierarchyConfig, filteredPaths]);
68
+ return {
69
+ getCategoriesTreeIdsCache,
70
+ visibilityHandlerFactory,
71
+ onFilteredPathsChanged: useCallback((paths) => setFilteredPaths(paths), []),
72
+ };
73
+ }
18
74
  /**
19
75
  * Custom hook to create and manage state for the categories tree.
20
76
  * @beta
@@ -28,30 +84,16 @@ export function useCategoriesTree({ filter, activeView, onCategoriesFiltered, em
28
84
  // eslint-disable-next-line react-hooks/exhaustive-deps
29
85
  Object.values(hierarchyConfig ?? {}));
30
86
  const viewType = activeView.view.is2d() ? "2d" : "3d";
31
- const iModel = activeView.iModel;
32
- const idsCache = useMemo(() => {
33
- return new CategoriesTreeIdsCache(createECSqlQueryExecutor(iModel), viewType);
34
- }, [viewType, iModel]);
35
- const visibilityHandlerFactory = useCallback(() => {
36
- const visibilityHandler = new CategoriesVisibilityHandler({
37
- viewport: activeView,
38
- idsCache,
39
- });
40
- return {
41
- getVisibilityStatus: async (node) => visibilityHandler.getVisibilityStatus(node),
42
- changeVisibility: async (node, on) => visibilityHandler.changeVisibility(node, on),
43
- onVisibilityChange: visibilityHandler.onVisibilityChange,
44
- dispose: () => visibilityHandler.dispose(),
45
- };
46
- }, [activeView, idsCache]);
87
+ const { getCategoriesTreeIdsCache, visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility(activeView, hierarchyConfiguration, viewType);
47
88
  const { onFeatureUsed } = useTelemetryContext();
48
89
  const getHierarchyDefinition = useCallback((props) => {
49
- return new CategoriesTreeDefinition({ ...props, viewType, idsCache, hierarchyConfig: hierarchyConfiguration });
50
- }, [viewType, idsCache, hierarchyConfiguration]);
90
+ return new CategoriesTreeDefinition({ ...props, viewType, idsCache: getCategoriesTreeIdsCache(), hierarchyConfig: hierarchyConfiguration });
91
+ }, [viewType, getCategoriesTreeIdsCache, hierarchyConfiguration]);
51
92
  const getFilteredPaths = useMemo(() => {
52
93
  setFilteringError(undefined);
53
- onCategoriesFiltered?.(undefined);
94
+ onCategoriesFiltered?.({ categories: undefined, models: undefined });
54
95
  if (!filter) {
96
+ onFilteredPathsChanged(undefined);
55
97
  return undefined;
56
98
  }
57
99
  return async ({ imodelAccess }) => {
@@ -61,10 +103,12 @@ export function useCategoriesTree({ filter, activeView, onCategoriesFiltered, em
61
103
  imodelAccess,
62
104
  label: filter,
63
105
  viewType,
64
- idsCache,
106
+ idsCache: getCategoriesTreeIdsCache(),
65
107
  hierarchyConfig: hierarchyConfiguration,
66
108
  });
67
- onCategoriesFiltered?.(await getCategoriesFromPaths(paths, idsCache));
109
+ onFilteredPathsChanged(paths);
110
+ const { elementClass, modelClass } = getClassesByView(viewType);
111
+ onCategoriesFiltered?.(await getCategoriesFromPaths(paths, getCategoriesTreeIdsCache(), elementClass, modelClass));
68
112
  return paths;
69
113
  }
70
114
  catch (e) {
@@ -77,7 +121,7 @@ export function useCategoriesTree({ filter, activeView, onCategoriesFiltered, em
77
121
  return [];
78
122
  }
79
123
  };
80
- }, [filter, viewType, onFeatureUsed, onCategoriesFiltered, idsCache, hierarchyConfiguration]);
124
+ }, [onCategoriesFiltered, filter, onFilteredPathsChanged, onFeatureUsed, viewType, getCategoriesTreeIdsCache, hierarchyConfiguration]);
81
125
  return {
82
126
  categoriesTreeProps: {
83
127
  treeName: "categories-tree-v2",
@@ -93,10 +137,12 @@ export function useCategoriesTree({ filter, activeView, onCategoriesFiltered, em
93
137
  },
94
138
  };
95
139
  }
96
- async function getCategoriesFromPaths(paths, idsCache) {
140
+ async function getCategoriesFromPaths(paths, idsCache, elementClassName, modelsClassName) {
97
141
  if (!paths) {
98
- return undefined;
142
+ return { categories: undefined };
99
143
  }
144
+ const rootFilteredElementIds = new Set();
145
+ const subModelIds = new Set();
100
146
  const categories = new Map();
101
147
  for (const path of paths) {
102
148
  const currPath = HierarchyFilteringPath.normalize(path).path;
@@ -105,12 +151,30 @@ async function getCategoriesFromPaths(paths, idsCache) {
105
151
  }
106
152
  let category;
107
153
  let subCategory;
108
- const lastNode = currPath[currPath.length - 1];
109
- if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(lastNode)) {
110
- continue;
154
+ let lastNodeInfo;
155
+ for (let i = 0; i < currPath.length; ++i) {
156
+ const currentNode = currPath[i];
157
+ if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(currentNode)) {
158
+ continue;
159
+ }
160
+ if (currentNode.className === elementClassName) {
161
+ rootFilteredElementIds.add(currentNode.id);
162
+ for (let j = i + 1; j < currPath.length; ++j) {
163
+ const childNode = currPath[j];
164
+ if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(childNode)) {
165
+ continue;
166
+ }
167
+ if (childNode.className === modelsClassName) {
168
+ subModelIds.add(childNode.id);
169
+ }
170
+ }
171
+ break;
172
+ }
173
+ lastNodeInfo = { lastNode: currentNode, nodeIndex: i };
111
174
  }
112
- if (lastNode.className === DEFINITION_CONTAINER_CLASS) {
113
- const definitionContainerCategories = await idsCache.getAllContainedCategories([lastNode.id]);
175
+ assert(lastNodeInfo !== undefined && HierarchyNodeIdentifier.isInstanceNodeIdentifier(lastNodeInfo.lastNode));
176
+ if (lastNodeInfo.lastNode.className === DEFINITION_CONTAINER_CLASS_NAME) {
177
+ const definitionContainerCategories = await idsCache.getAllContainedCategories([lastNodeInfo.lastNode.id]);
114
178
  for (const categoryId of definitionContainerCategories) {
115
179
  const value = categories.get(categoryId);
116
180
  if (value === undefined) {
@@ -119,14 +183,14 @@ async function getCategoriesFromPaths(paths, idsCache) {
119
183
  }
120
184
  continue;
121
185
  }
122
- if (lastNode.className === SUB_CATEGORY_CLASS) {
123
- const secondToLastNode = currPath.length > 1 ? currPath[currPath.length - 2] : undefined;
186
+ if (lastNodeInfo.lastNode.className === SUB_CATEGORY_CLASS_NAME) {
187
+ const secondToLastNode = lastNodeInfo.nodeIndex > 0 ? currPath[lastNodeInfo.nodeIndex - 1] : undefined;
124
188
  assert(secondToLastNode !== undefined && HierarchyNodeIdentifier.isInstanceNodeIdentifier(secondToLastNode));
125
- subCategory = lastNode;
189
+ subCategory = lastNodeInfo.lastNode;
126
190
  category = secondToLastNode;
127
191
  }
128
192
  else {
129
- category = lastNode;
193
+ category = lastNodeInfo.lastNode;
130
194
  }
131
195
  let entry = categories.get(category.id);
132
196
  if (entry === undefined) {
@@ -137,10 +201,15 @@ async function getCategoriesFromPaths(paths, idsCache) {
137
201
  entry.push(subCategory.id);
138
202
  }
139
203
  }
140
- return [...categories.entries()].map(([categoryId, subCategoryIds]) => ({
141
- categoryId,
142
- subCategoryIds: subCategoryIds.length === 0 ? undefined : subCategoryIds,
143
- }));
204
+ const rootElementModelMap = await idsCache.getFilteredElementsModels([...rootFilteredElementIds]);
205
+ const models = [...subModelIds, ...new Set(rootElementModelMap.values())];
206
+ return {
207
+ categories: [...categories.entries()].map(([categoryId, subCategoryIds]) => ({
208
+ categoryId,
209
+ subCategoryIds: subCategoryIds.length === 0 ? undefined : subCategoryIds,
210
+ })),
211
+ models,
212
+ };
144
213
  }
145
214
  const categorySvg = new URL("@itwin/itwinui-icons/bis-category-3d.svg", import.meta.url).href;
146
215
  function getEmptyTreeContentComponent(filter, error, emptyTreeContent) {
@@ -160,6 +229,8 @@ function getEmptyTreeContentComponent(filter, error, emptyTreeContent) {
160
229
  }
161
230
  const subcategorySvg = new URL("@itwin/itwinui-icons/bis-category-subcategory.svg", import.meta.url).href;
162
231
  const definitionContainerSvg = new URL("@itwin/itwinui-icons/bis-definitions-container.svg", import.meta.url).href;
232
+ const classSvg = new URL("@itwin/itwinui-icons/bis-class.svg", import.meta.url).href;
233
+ const elementSvg = new URL("@itwin/itwinui-icons/bis-element.svg", import.meta.url).href;
163
234
  /** @beta */
164
235
  export function CategoriesTreeIcon({ node }) {
165
236
  if (node.extendedData?.imageId === undefined) {
@@ -173,6 +244,10 @@ export function CategoriesTreeIcon({ node }) {
173
244
  return subcategorySvg;
174
245
  case "icon-definition-container":
175
246
  return definitionContainerSvg;
247
+ case "icon-item":
248
+ return elementSvg;
249
+ case "icon-ec-class":
250
+ return classSvg;
176
251
  default:
177
252
  return undefined;
178
253
  }
@@ -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 { 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 { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext.js\";\nimport { CategoriesTreeDefinition, defaultHierarchyConfiguration } 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\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"./CategoriesTreeDefinition.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 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\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\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, hierarchyConfig: hierarchyConfiguration });\n },\n [viewType, idsCache, hierarchyConfiguration],\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({\n imodelAccess,\n label: filter,\n viewType,\n idsCache,\n hierarchyConfig: hierarchyConfiguration,\n });\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, 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(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\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;\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 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
+ {"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"]}