@itwin/tree-widget-react 4.0.0-alpha.23 → 4.0.0-alpha.25

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 (111) hide show
  1. package/README.md +48 -37
  2. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +3 -3
  3. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js +4 -3
  4. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.js.map +1 -1
  5. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +43 -18
  6. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  7. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +1 -1
  8. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  9. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +2 -1
  10. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +15 -2
  11. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeNode.d.ts +84 -0
  13. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeNode.js +50 -0
  14. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeNode.js.map +1 -0
  15. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +5 -4
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +8 -9
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +8 -7
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.d.ts +1 -3
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +22 -49
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -1
  23. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +3 -3
  24. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +4 -3
  25. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -1
  26. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +1 -1
  27. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +3 -2
  29. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -1
  30. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeNode.d.ts +34 -0
  31. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeNode.js +28 -0
  32. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeNode.js.map +1 -0
  33. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +5 -4
  34. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +6 -5
  35. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -1
  36. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +6 -5
  37. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
  38. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.d.ts +1 -1
  39. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +10 -15
  40. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -1
  41. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js +14 -4
  42. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  43. package/lib/esm/tree-widget-react/components/trees/common/Utils.js +3 -3
  44. package/lib/esm/tree-widget-react/components/trees/common/Utils.js.map +1 -1
  45. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +7 -1
  46. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js +3 -1
  47. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.js.map +1 -1
  48. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +4 -4
  49. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js +5 -8
  50. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.js.map +1 -1
  51. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +4 -3
  52. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js +5 -8
  53. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.js.map +1 -1
  54. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js +2 -1
  55. package/lib/esm/tree-widget-react/components/trees/common/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
  56. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js +2 -1
  57. package/lib/esm/tree-widget-react/components/trees/common/internal/ModelCategoryElementsCountCache.js.map +1 -1
  58. package/lib/esm/tree-widget-react/components/trees/common/internal/UseErrorState.d.ts +15 -0
  59. package/lib/esm/tree-widget-react/components/trees/common/internal/UseErrorState.js +37 -0
  60. package/lib/esm/tree-widget-react/components/trees/common/internal/UseErrorState.js.map +1 -0
  61. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js +16 -6
  62. package/lib/esm/tree-widget-react/components/trees/common/internal/VisibilityUtils.js.map +1 -1
  63. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +3 -3
  64. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +5 -2
  65. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  66. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -1
  67. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  68. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -3
  69. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +5 -2
  70. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  71. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  72. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  73. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +65 -43
  74. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  75. package/lib/esm/tree-widget-react/components/trees/index.d.ts +3 -0
  76. package/lib/esm/tree-widget-react/components/trees/index.js +3 -0
  77. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +3 -3
  79. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js +4 -3
  80. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.js.map +1 -1
  81. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +1 -1
  82. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  83. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  84. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  85. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +2 -1
  86. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +17 -2
  87. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  88. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeNode.d.ts +63 -0
  89. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeNode.js +56 -0
  90. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeNode.js.map +1 -0
  91. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +5 -4
  92. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +8 -7
  93. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  94. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +6 -5
  95. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  96. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.d.ts +1 -3
  97. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +20 -51
  98. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -1
  99. package/lib/esm/tree-widget-react-internal.d.ts +0 -1
  100. package/lib/esm/tree-widget-react-internal.js +0 -1
  101. package/lib/esm/tree-widget-react-internal.js.map +1 -1
  102. package/package.json +3 -3
  103. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +0 -41
  104. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +0 -50
  105. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +0 -1
  106. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.d.ts +0 -19
  107. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js +0 -32
  108. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js.map +0 -1
  109. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.d.ts +0 -37
  110. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.js +0 -54
  111. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeNode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.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 {\n bufferCount,\n defaultIfEmpty,\n defer,\n firstValueFrom,\n forkJoin,\n from,\n fromEvent,\n identity,\n lastValueFrom,\n map,\n merge,\n mergeAll,\n mergeMap,\n reduce,\n switchMap,\n takeUntil,\n toArray,\n} from \"rxjs\";\nimport { Guid } from \"@itwin/core-bentley\";\nimport { IModel } from \"@itwin/core-common\";\nimport {\n createNodesQueryClauseFactory,\n createPredicateBasedHierarchyDefinition,\n HierarchySearchPath,\n NodeSelectClauseColumnNames,\n ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport {\n CLASS_NAME_Element,\n CLASS_NAME_GeometricElement3d,\n CLASS_NAME_GeometricModel3d,\n CLASS_NAME_InformationPartitionElement,\n CLASS_NAME_ISubModeledElement,\n CLASS_NAME_Model,\n CLASS_NAME_SpatialCategory,\n CLASS_NAME_Subject,\n} from \"../common/internal/ClassNameDefinitions.js\";\nimport { collect } from \"../common/internal/Rxjs.js\";\nimport {\n createIdsSelector,\n fromWithRelease,\n getOptimalBatchSize,\n groupingNodeHasSearchTargets,\n parseIdsSelectorResult,\n releaseMainThreadOnItemsCount,\n} from \"../common/internal/Utils.js\";\nimport { SearchLimitExceededError } from \"../common/TreeErrors.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64String } from \"@itwin/core-bentley\";\nimport type {\n ClassGroupingNodeKey,\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type { ElementId } from \"../common/internal/Types.js\";\nimport type { NormalizedHierarchySearchPath } from \"../common/Utils.js\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\n\n/** @beta */\nexport type ClassGroupingHierarchyNode = GroupingHierarchyNode & { key: ClassGroupingNodeKey };\n\nconst MAX_SEARCH_INSTANCE_KEY_COUNT = 100;\n\n/**\n * Defines hierarchy configuration supported by `ModelsTree`.\n * @beta\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should element nodes be grouped by class. Defaults to `enable`. */\n elementClassGrouping: \"enable\" | \"enableWithCounts\" | \"disable\";\n /** Full class name of a `GeometricElement3d` sub-class that should be used to load element nodes. Defaults to `BisCore.GeometricElement3d`. */\n elementClassSpecification: string;\n /** Should models without elements be shown. Defaults to `false`. */\n showEmptyModels: boolean;\n /** Should the root Subject node be hidden. Defaults to `false`. */\n hideRootSubject: boolean;\n /** Should hierarchy level be filterable. Defaults to `enable` */\n hierarchyLevelFiltering: \"enable\" | \"disable\";\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: CLASS_NAME_GeometricElement3d,\n showEmptyModels: false,\n hideRootSubject: false,\n hierarchyLevelFiltering: \"enable\",\n};\n\ninterface ModelsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n componentId?: GuidString;\n}\n\n/** @beta */\nexport interface ElementsGroupInfo {\n parent:\n | {\n ids: Id64String[];\n type: \"element\";\n }\n | {\n ids: Id64String[];\n modelIds: Id64String[];\n type: \"category\";\n };\n groupingNode: ClassGroupingHierarchyNode;\n}\n\ninterface ModelsTreeInstanceKeyPathsBaseProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n abortSignal?: AbortSignal;\n componentId?: string;\n}\n\ntype ModelsTreeInstanceKeyPathsFromTargetItemsProps = {\n targetItems: Array<InstanceKey | ElementsGroupInfo>;\n} & ModelsTreeInstanceKeyPathsBaseProps;\n\ntype ModelsTreeInstanceKeyPathsFromInstanceLabelProps = {\n label: string;\n} & ModelsTreeInstanceKeyPathsBaseProps;\n\n/** @internal */\nexport type ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsFromTargetItemsProps | ModelsTreeInstanceKeyPathsFromInstanceLabelProps;\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace ModelsTreeInstanceKeyPathsProps {\n export function isLabelProps(props: ModelsTreeInstanceKeyPathsProps): props is ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n return !!(props as ModelsTreeInstanceKeyPathsFromInstanceLabelProps).label;\n }\n}\n\n/** @internal */\nexport class ModelsTreeDefinition implements HierarchyDefinition {\n #impl: HierarchyDefinition;\n #idsCache: ModelsTreeIdsCache;\n #hierarchyConfig: ModelsTreeHierarchyConfiguration;\n #selectQueryFactory: NodesQueryClauseFactory;\n #nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #isSupported?: Promise<boolean>;\n static #componentName = \"ModelsTreeDefinition\";\n #componentId: GuidString;\n\n public constructor(props: ModelsTreeDefinitionProps) {\n this.#impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps) =>\n this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this.#hierarchyConfig.hideRootSubject ? [IModel.rootSubjectId] : [] }),\n childNodes: [\n {\n parentInstancesNodePredicate: CLASS_NAME_Subject,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubjectChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_ISubModeledElement,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_GeometricModel3d,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_SpatialCategory,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSpatialCategoryChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_GeometricElement3d,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricElement3dChildrenQuery(requestProps),\n },\n ],\n },\n });\n this.#componentId = props.componentId ?? Guid.createValue();\n this.#idsCache = props.idsCache;\n this.#queryExecutor = props.imodelAccess;\n this.#hierarchyConfig = props.hierarchyConfig;\n this.#nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this.#selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,\n });\n }\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n const { hasSearchTargetAncestor, hasDirectNonSearchTargets } = groupingNodeHasSearchTargets(node.children);\n return {\n ...node,\n label: this.#hierarchyConfig.elementClassGrouping === \"enableWithCounts\" ? `${node.label} (${node.children.length})` : node.label,\n extendedData: {\n ...node.extendedData,\n // add `modelId` and `categoryId` from the first grouped element\n ...node.children[0].extendedData,\n ...(hasDirectNonSearchTargets ? { hasDirectNonSearchTargets } : {}),\n ...(hasSearchTargetAncestor ? { hasSearchTargetAncestor } : {}),\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 public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n if (this.#isSupported === undefined) {\n this.#isSupported = this.isSupported();\n }\n\n if ((await this.#isSupported) === false) {\n return [];\n }\n\n return this.#impl.defineHierarchyLevel(props);\n }\n\n private async createSubjectChildrenQuery({\n parentNodeInstanceIds: parentSubjectIds,\n instanceFilter,\n }: Pick<DefineInstanceNodeChildHierarchyLevelProps, \"parentNodeInstanceIds\" | \"instanceFilter\">): Promise<HierarchyLevelDefinition> {\n const [subjectFilterClauses, modelFilterClauses] = await Promise.all([\n this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_Subject, alias: \"this\" },\n }),\n this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_GeometricModel3d, alias: \"this\" },\n }),\n ]);\n const { childSubjectIds, childModelIds } = parentSubjectIds.length\n ? await firstValueFrom(\n forkJoin({\n childSubjectIds: this.#idsCache.getChildSubjectIds(parentSubjectIds),\n childModelIds: this.#idsCache.getChildSubjectModelIds(parentSubjectIds),\n }),\n )\n : { childSubjectIds: [IModel.rootSubjectId], childModelIds: [] };\n const defs = new Array<HierarchyNodesDefinition>();\n childSubjectIds.length &&\n defs.push({\n fullClassName: CLASS_NAME_Subject,\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: CLASS_NAME_Subject,\n }),\n },\n hideIfNoChildren: true,\n hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },\n grouping: { byLabel: { action: \"merge\", groupId: \"subject\" } },\n extendedData: {\n imageId: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, 'icon-imodel-hollow-2', 'icon-folder')` },\n isSubject: true,\n },\n autoExpand: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, true, false)` },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${subjectFilterClauses.from} this\n ${subjectFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${childSubjectIds.map(() => \"?\").join(\",\")})\n ${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : \"\"}\n `,\n bindings: [\n { type: \"idset\", value: await firstValueFrom(this.#idsCache.getParentSubjectIds()) },\n ...childSubjectIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n ],\n },\n });\n childModelIds.length &&\n defs.push({\n fullClassName: CLASS_NAME_GeometricModel3d,\n query: {\n ecsql: `\n SELECT model.ECInstanceId AS ECInstanceId, model.*\n FROM (\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"m.ECClassId\" },\n ecInstanceId: { selector: \"m.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"partition\",\n className: CLASS_NAME_InformationPartitionElement,\n }),\n },\n hideNodeInHierarchy: {\n selector: `\n CASE\n WHEN (\n json_extract([partition].JsonProperties, '$.PhysicalPartition.Model.Content') IS NOT NULL\n OR json_extract([partition].JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NOT NULL\n ) THEN 1\n ELSE 0\n END\n `,\n },\n hasChildren: this.#hierarchyConfig.showEmptyModels\n ? {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this.#hierarchyConfig.elementClassSpecification} e\n WHERE e.Model.Id = m.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n }\n : true,\n extendedData: {\n imageId: \"icon-model\",\n isModel: true,\n },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${CLASS_NAME_GeometricModel3d} m\n JOIN ${CLASS_NAME_InformationPartitionElement} [partition] ON [partition].ECInstanceId = m.ModeledElement.Id\n WHERE\n m.ECInstanceId IN (${childModelIds.map(() => \"?\").join(\",\")})\n ) model\n JOIN ${modelFilterClauses.from} this ON this.ECInstanceId = model.ECInstanceId\n ${modelFilterClauses.joins}\n ${modelFilterClauses.where ? `AND (model.${NodeSelectClauseColumnNames.HideNodeInHierarchy} OR ${modelFilterClauses.where})` : \"\"}\n `,\n bindings: childModelIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n },\n });\n return defs;\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: CLASS_NAME_GeometricModel3d,\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 })}\n FROM ${CLASS_NAME_GeometricModel3d} 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.#hierarchyConfig.elementClassSpecification})\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: CLASS_NAME_SpatialCategory, alias: \"this\" },\n });\n return [\n {\n fullClassName: CLASS_NAME_SpatialCategory,\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: CLASS_NAME_SpatialCategory,\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 },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this.#hierarchyConfig.elementClassSpecification} element\n WHERE\n element.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: modelIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n private async createSpatialCategoryChildrenQuery({\n parentNodeInstanceIds: categoryIds,\n parentNode,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const modelIds = parseIdsSelectorResult(parentNode.extendedData?.modelIds);\n if (modelIds.length === 0) {\n throw new Error(`Invalid category node \"${parentNode.label}\" - missing model information.`);\n }\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n const modeledElements = await firstValueFrom(\n from(modelIds).pipe(\n mergeMap((modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n reduce((acc, foundModeledElements) => {\n return acc.concat(foundModeledElements);\n }, new Array<ElementId>()),\n ),\n );\n return [\n {\n fullClassName: this.#hierarchyConfig.elementClassSpecification,\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.#hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this.#hierarchyConfig.elementClassGrouping !== \"disable\",\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.#hierarchyConfig.elementClassSpecification} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n )\n `,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.map(() => \"?\").join(\",\")})\n AND this.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: [...categoryIds.map((id) => ({ type: \"id\", value: id })), ...modelIds.map((id) => ({ type: \"id\", value: id }))] as ECSqlBinding[],\n },\n },\n ];\n }\n\n private async createGeometricElement3dChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n return [\n {\n fullClassName: this.#hierarchyConfig.elementClassSpecification,\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.#hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this.#hierarchyConfig.elementClassGrouping !== \"disable\",\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this.#hierarchyConfig.elementClassSpecification} ce\n JOIN ${CLASS_NAME_Model} 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 extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n 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: ModelsTreeInstanceKeyPathsProps): Promise<NormalizedHierarchySearchPath[]> {\n return lastValueFrom(\n defer(() => {\n const componentInfo = { componentId: props.componentId ?? Guid.createValue(), componentName: this.#componentName };\n if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabelObs({ ...props, ...componentInfo, labelsFactory });\n }\n return createInstanceKeyPathsFromTargetItemsObs({ ...props, ...componentInfo });\n }).pipe(props.abortSignal ? takeUntil(fromEvent(props.abortSignal, \"abort\")) : identity, defaultIfEmpty([])),\n );\n }\n\n private supportsFiltering() {\n return this.#hierarchyConfig.hierarchyLevelFiltering === \"enable\";\n }\n\n private async isSupported() {\n const [schemaName, className] = this.#hierarchyConfig.elementClassSpecification.split(/[\\.:]/);\n if (!schemaName || !className) {\n throw new Error(\n `Provided class specification ${this.#hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`,\n );\n }\n\n const query: ECSqlQueryDef = {\n ecsql: `\n SELECT 1\n FROM ECDbMeta.ECSchemaDef s\n JOIN ECDbMeta.ECClassDef c ON c.Schema.Id = s.ECInstanceId\n WHERE s.Name = ? AND c.Name = ? AND c.ECInstanceId IS (BisCore.GeometricElement3d)\n `,\n bindings: [\n { type: \"string\", value: schemaName },\n { type: \"string\", value: className },\n ],\n };\n\n for await (const _row of this.#queryExecutor.createQueryReader(query, {\n restartToken: `${ModelsTreeDefinition.#componentName}/${this.#componentId}/is-class-supported`,\n })) {\n return true;\n }\n return false;\n }\n}\n\nfunction createGeometricElementInstanceKeyPaths(props: {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n targetItems: Array<Id64String | ElementsGroupInfo>;\n componentId: GuidString;\n componentName: string;\n chunkIndex: number;\n}): Observable<NormalizedHierarchySearchPath> {\n const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess } = props;\n const elementIds = targetItems.filter((info): info is Id64String => typeof info === \"string\");\n const groupInfos = targetItems.filter((info): info is ElementsGroupInfo => typeof info !== \"string\");\n const separator = \";\";\n\n return defer(() => {\n const targetElementsInfoQuery =\n elementIds.length > 0\n ? `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, -1\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE e.ECInstanceId IN (${elementIds.join(\",\")})\n `\n : undefined;\n\n const targetGroupingNodesElementInfoQueries = groupInfos.map(\n ({ parent, groupingNode }, index) => `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, ${index}\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE\n e.ECClassId IS (${groupingNode.key.className})\n AND ${parent.type === \"element\" ? `e.Parent.Id IN (${parent.ids.join(\",\")})` : `e.Parent.Id IS NULL AND e.Category.Id IN (${parent.ids.join(\",\")}) AND e.Model.Id IN (${parent.modelIds.join(\",\")})`}\n `,\n );\n\n const ctes = [\n `InstanceElementsWithClassGroupingNodes(ECInstanceId, ECClassId, ParentId, ModelId, CategoryId, GroupingNodeIndex) AS (\n ${[...(targetElementsInfoQuery ? [targetElementsInfoQuery] : []), ...targetGroupingNodesElementInfoQueries].join(\" UNION ALL \")}\n )`,\n `ModelsCategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, GroupingNodeIndex, Path) AS (\n SELECT\n e.ECInstanceId,\n e.ParentId,\n e.ModelId,\n e.GroupingNodeIndex,\n IIF(e.ParentId 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\n FROM InstanceElementsWithClassGroupingNodes e\n LEFT JOIN ${CLASS_NAME_GeometricModel3d} m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)\n LEFT JOIN ${CLASS_NAME_SpatialCategory} c ON (e.ParentId IS NULL AND c.ECInstanceId = e.CategoryId)\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n ce.GroupingNodeIndex,\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 ModelsCategoriesElementsHierarchy ce\n JOIN ${hierarchyConfig.elementClassSpecification} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN ${CLASS_NAME_GeometricModel3d} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN ${CLASS_NAME_SpatialCategory} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.ModelId, mce.Path, mce.GroupingNodeIndex\n FROM ModelsCategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"Indexes\", limit: \"unbounded\", restartToken: `${componentName}/${componentId}/geometric-element-paths/${chunkIndex}` },\n );\n }).pipe(\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)),\n mergeMap(({ modelId, elementHierarchyPath, groupingNode }) =>\n idsCache.createModelInstanceKeyPaths(modelId).pipe(\n mergeAll(),\n map((modelPath) => {\n // We don't want to modify the original path, we create a copy that we can modify\n const newModelPath = [...modelPath];\n newModelPath.pop(); // model is already included in the element hierarchy path\n const path = [...newModelPath, ...elementHierarchyPath];\n if (!groupingNode) {\n return { path };\n }\n return {\n path,\n options: {\n reveal: {\n depthInHierarchy: groupingNode.parentKeys.length,\n },\n },\n };\n }),\n ),\n ),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, groupInfos: ElementsGroupInfo[], separator: string, elementClassName: string) {\n const rowElements: string[] = row[1].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: CLASS_NAME_SpatialCategory, id: rowElements[i + 1] });\n break;\n case \"m\":\n path.push({ className: CLASS_NAME_GeometricModel3d, id: rowElements[i + 1] });\n break;\n }\n }\n return {\n modelId: row[0],\n elementHierarchyPath: path,\n groupingNode: row[2] === -1 ? undefined : groupInfos[row[2]].groupingNode,\n };\n}\n\nfunction createInstanceKeyPathsFromTargetItemsObs({\n targetItems,\n imodelAccess,\n hierarchyConfig,\n idsCache,\n limit,\n componentId,\n componentName,\n}: Omit<ModelsTreeInstanceKeyPathsFromTargetItemsProps, \"abortSignal\" | \"componentId\"> & { componentId: GuidString; componentName: string }): Observable<\n NormalizedHierarchySearchPath[]\n> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_SEARCH_INSTANCE_KEY_COUNT)) {\n throw new SearchLimitExceededError(limit ?? MAX_SEARCH_INSTANCE_KEY_COUNT);\n }\n\n return fromWithRelease({ source: targetItems, releaseOnCount: 2000 }).pipe(\n mergeMap(async (key): Promise<{ key: Id64String; type: number } | { key: ElementsGroupInfo; type: 0 }> => {\n if (\"parent\" in key) {\n return { key, type: 0 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_Subject)) {\n return { key: key.id, type: 1 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_Model)) {\n return { key: key.id, type: 2 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_SpatialCategory)) {\n return { key: key.id, type: 3 };\n }\n\n return { key: key.id, type: 0 };\n }, 2),\n reduce(\n (acc, value) => {\n if (value.type === 1) {\n acc.subjectIds.push(value.key);\n return acc;\n }\n if (value.type === 2) {\n acc.modelIds.push(value.key);\n return acc;\n }\n if (value.type === 3) {\n acc.categoryIds.push(value.key);\n return acc;\n }\n acc.elementIds.push(value.key);\n return acc;\n },\n {\n modelIds: new Array<Id64String>(),\n categoryIds: new Array<Id64String>(),\n subjectIds: new Array<Id64String>(),\n elementIds: new Array<Id64String | ElementsGroupInfo>(),\n },\n ),\n switchMap(async (ids) => {\n const elementsLength = ids.elementIds.length;\n return collect(\n merge(\n from(ids.subjectIds).pipe(mergeMap((id) => idsCache.createSubjectInstanceKeysPath(id).pipe(map(HierarchySearchPath.normalize)))),\n from(ids.modelIds).pipe(mergeMap((id) => idsCache.createModelInstanceKeyPaths(id).pipe(mergeAll(), map(HierarchySearchPath.normalize)))),\n from(ids.categoryIds).pipe(mergeMap((id) => idsCache.createCategoryInstanceKeyPaths(id).pipe(mergeAll(), map(HierarchySearchPath.normalize)))),\n from(ids.elementIds).pipe(\n bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })),\n releaseMainThreadOnItemsCount(1),\n mergeMap(\n (block, chunkIndex) =>\n createGeometricElementInstanceKeyPaths({\n imodelAccess,\n idsCache,\n hierarchyConfig,\n targetItems: block,\n componentId,\n componentName,\n chunkIndex,\n }),\n 10,\n ),\n ),\n ),\n );\n }),\n );\n}\n\nfunction createInstanceKeyPathsFromInstanceLabelObs(\n props: Omit<ModelsTreeInstanceKeyPathsFromInstanceLabelProps, \"abortSignal\" | \"componentId\"> & {\n labelsFactory: IInstanceLabelSelectClauseFactory;\n componentId: GuidString;\n componentName: string;\n },\n) {\n const { labelsFactory, hierarchyConfig, label, imodelAccess, limit } = props;\n return defer(async () => {\n const elementLabelSelectClause = await labelsFactory.createSelectClause({\n classAlias: \"e\",\n className: CLASS_NAME_Element,\n selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,\n });\n const ecsql = `\n SELECT *\n FROM (\n SELECT\n ec_classname(e.ECClassId, 's.c'),\n e.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM ${CLASS_NAME_Element} e\n WHERE e.ECClassId IS (${CLASS_NAME_Subject}, ${CLASS_NAME_SpatialCategory}, ${hierarchyConfig.elementClassSpecification})\n\n UNION ALL\n\n SELECT\n ec_classname(m.ECClassId, 's.c'),\n m.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM ${CLASS_NAME_GeometricModel3d} m\n JOIN ${CLASS_NAME_Element} e ON e.ECInstanceId = m.ModeledElement.Id\n WHERE NOT m.IsPrivate\n ${hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}\n AND json_extract(e.JsonProperties, '$.PhysicalPartition.Model.Content') IS NULL\n AND json_extract(e.JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NULL\n )\n WHERE Label LIKE '%' || ? || '%' ESCAPE '\\\\'\n LIMIT ${MAX_SEARCH_INSTANCE_KEY_COUNT + 1}\n `;\n const bindings: ECSqlBinding[] = [{ type: \"string\", value: label.replace(/[%_\\\\]/g, \"\\\\$&\") }];\n return { ecsql, bindings };\n }).pipe(\n mergeMap((queryProps) => {\n return imodelAccess.createQueryReader(queryProps, {\n rowFormat: \"Indexes\",\n restartToken: `${props.componentName}/${props.componentId}/filter-by-label`,\n limit,\n });\n }),\n map((row) => ({ className: row[0], id: row[1] })),\n toArray(),\n mergeMap((targetKeys) => createInstanceKeyPathsFromTargetItemsObs({ ...props, targetItems: targetKeys })),\n );\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.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 {\n bufferCount,\n defaultIfEmpty,\n defer,\n firstValueFrom,\n forkJoin,\n from,\n fromEvent,\n identity,\n lastValueFrom,\n map,\n merge,\n mergeAll,\n mergeMap,\n reduce,\n switchMap,\n takeUntil,\n toArray,\n} from \"rxjs\";\nimport { Guid } from \"@itwin/core-bentley\";\nimport { IModel } from \"@itwin/core-common\";\nimport {\n createNodesQueryClauseFactory,\n createPredicateBasedHierarchyDefinition,\n HierarchySearchPath,\n NodeSelectClauseColumnNames,\n ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport {\n CLASS_NAME_Element,\n CLASS_NAME_GeometricElement3d,\n CLASS_NAME_GeometricModel3d,\n CLASS_NAME_InformationPartitionElement,\n CLASS_NAME_ISubModeledElement,\n CLASS_NAME_Model,\n CLASS_NAME_SpatialCategory,\n CLASS_NAME_Subject,\n} from \"../common/internal/ClassNameDefinitions.js\";\nimport { collect } from \"../common/internal/Rxjs.js\";\nimport { catchBeSQLiteInterrupts } from \"../common/internal/UseErrorState.js\";\nimport {\n createIdsSelector,\n fromWithRelease,\n getOptimalBatchSize,\n groupingNodeHasSearchTargets,\n parseIdsSelectorResult,\n releaseMainThreadOnItemsCount,\n} from \"../common/internal/Utils.js\";\nimport { SearchLimitExceededError } from \"../common/TreeErrors.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64String } from \"@itwin/core-bentley\";\nimport type {\n ClassGroupingNodeKey,\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodePreProcessor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type { ElementId } from \"../common/internal/Types.js\";\nimport type { NormalizedHierarchySearchPath } from \"../common/Utils.js\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\n\n/** @beta */\nexport type ClassGroupingHierarchyNode = GroupingHierarchyNode & { key: ClassGroupingNodeKey };\n\nconst MAX_SEARCH_INSTANCE_KEY_COUNT = 100;\n\n/**\n * Defines hierarchy configuration supported by `ModelsTree`.\n * @beta\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should element nodes be grouped by class. Defaults to `enable`. */\n elementClassGrouping: \"enable\" | \"enableWithCounts\" | \"disable\";\n /** Full class name of a `GeometricElement3d` sub-class that should be used to load element nodes. Defaults to `BisCore.GeometricElement3d`. */\n elementClassSpecification: string;\n /** Should models without elements be shown. Defaults to `false`. */\n showEmptyModels: boolean;\n /** Should the root Subject node be hidden. Defaults to `false`. */\n hideRootSubject: boolean;\n /** Should hierarchy level be filterable. Defaults to `enable` */\n hierarchyLevelFiltering: \"enable\" | \"disable\";\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: CLASS_NAME_GeometricElement3d,\n showEmptyModels: false,\n hideRootSubject: false,\n hierarchyLevelFiltering: \"enable\",\n};\n\ninterface ModelsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n componentId?: GuidString;\n}\n\n/** @beta */\nexport interface ElementsGroupInfo {\n parent:\n | {\n ids: Id64String[];\n type: \"element\";\n }\n | {\n ids: Id64String[];\n modelIds: Id64String[];\n type: \"category\";\n };\n groupingNode: ClassGroupingHierarchyNode;\n}\n\ninterface ModelsTreeInstanceKeyPathsBaseProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n abortSignal?: AbortSignal;\n componentId?: string;\n}\n\ntype ModelsTreeInstanceKeyPathsFromTargetItemsProps = {\n targetItems: Array<InstanceKey | ElementsGroupInfo>;\n} & ModelsTreeInstanceKeyPathsBaseProps;\n\ntype ModelsTreeInstanceKeyPathsFromInstanceLabelProps = {\n label: string;\n} & ModelsTreeInstanceKeyPathsBaseProps;\n\n/** @internal */\nexport type ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsFromTargetItemsProps | ModelsTreeInstanceKeyPathsFromInstanceLabelProps;\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace ModelsTreeInstanceKeyPathsProps {\n export function isLabelProps(props: ModelsTreeInstanceKeyPathsProps): props is ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n return !!(props as ModelsTreeInstanceKeyPathsFromInstanceLabelProps).label;\n }\n}\n\n/** @internal */\nexport class ModelsTreeDefinition implements HierarchyDefinition {\n #impl: HierarchyDefinition;\n #idsCache: ModelsTreeIdsCache;\n #hierarchyConfig: ModelsTreeHierarchyConfiguration;\n #selectQueryFactory: NodesQueryClauseFactory;\n #nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #isSupported?: Promise<boolean>;\n static #componentName = \"ModelsTreeDefinition\";\n #componentId: GuidString;\n\n public constructor(props: ModelsTreeDefinitionProps) {\n this.#impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps) =>\n this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this.#hierarchyConfig.hideRootSubject ? [IModel.rootSubjectId] : [] }),\n childNodes: [\n {\n parentInstancesNodePredicate: CLASS_NAME_Subject,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubjectChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_ISubModeledElement,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_GeometricModel3d,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_SpatialCategory,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSpatialCategoryChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_GeometricElement3d,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricElement3dChildrenQuery(requestProps),\n },\n ],\n },\n });\n this.#componentId = props.componentId ?? Guid.createValue();\n this.#idsCache = props.idsCache;\n this.#queryExecutor = props.imodelAccess;\n this.#hierarchyConfig = props.hierarchyConfig;\n this.#nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this.#selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,\n });\n }\n\n public preProcessNode: NodePreProcessor = async (node) => {\n if (node.extendedData?.isCategory) {\n return {\n ...node,\n extendedData: {\n ...node.extendedData,\n modelIds: parseIdsSelectorResult(node.extendedData.modelIds),\n },\n };\n }\n return node;\n };\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n const { hasSearchTargetAncestor, hasDirectNonSearchTargets } = groupingNodeHasSearchTargets(node.children);\n return {\n ...node,\n label: this.#hierarchyConfig.elementClassGrouping === \"enableWithCounts\" ? `${node.label} (${node.children.length})` : node.label,\n extendedData: {\n ...node.extendedData,\n // add `modelId` and `categoryId` from the first grouped element\n ...node.children[0].extendedData,\n ...(hasDirectNonSearchTargets ? { hasDirectNonSearchTargets } : {}),\n ...(hasSearchTargetAncestor ? { hasSearchTargetAncestor } : {}),\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 public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n if (this.#isSupported === undefined) {\n this.#isSupported = this.isSupported();\n }\n\n if ((await this.#isSupported) === false) {\n return [];\n }\n\n return this.#impl.defineHierarchyLevel(props);\n }\n\n private async createSubjectChildrenQuery({\n parentNodeInstanceIds: parentSubjectIds,\n instanceFilter,\n }: Pick<DefineInstanceNodeChildHierarchyLevelProps, \"parentNodeInstanceIds\" | \"instanceFilter\">): Promise<HierarchyLevelDefinition> {\n const [subjectFilterClauses, modelFilterClauses] = await Promise.all([\n this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_Subject, alias: \"this\" },\n }),\n this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_GeometricModel3d, alias: \"this\" },\n }),\n ]);\n const { childSubjectIds, childModelIds } = parentSubjectIds.length\n ? await firstValueFrom(\n forkJoin({\n childSubjectIds: this.#idsCache.getChildSubjectIds(parentSubjectIds),\n childModelIds: this.#idsCache.getChildSubjectModelIds(parentSubjectIds),\n }),\n )\n : { childSubjectIds: [IModel.rootSubjectId], childModelIds: [] };\n const defs = new Array<HierarchyNodesDefinition>();\n childSubjectIds.length &&\n defs.push({\n fullClassName: CLASS_NAME_Subject,\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: CLASS_NAME_Subject,\n }),\n },\n hideIfNoChildren: true,\n hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },\n grouping: { byLabel: { action: \"merge\", groupId: \"subject\" } },\n extendedData: {\n imageId: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, 'icon-imodel-hollow-2', 'icon-folder')` },\n isSubject: true,\n },\n autoExpand: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, true, false)` },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${subjectFilterClauses.from} this\n ${subjectFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${childSubjectIds.map(() => \"?\").join(\",\")})\n ${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : \"\"}\n `,\n bindings: [\n { type: \"idset\", value: await firstValueFrom(this.#idsCache.getParentSubjectIds()) },\n ...childSubjectIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n ],\n },\n });\n childModelIds.length &&\n defs.push({\n fullClassName: CLASS_NAME_GeometricModel3d,\n query: {\n ecsql: `\n SELECT model.ECInstanceId AS ECInstanceId, model.*\n FROM (\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"m.ECClassId\" },\n ecInstanceId: { selector: \"m.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"partition\",\n className: CLASS_NAME_InformationPartitionElement,\n }),\n },\n hideNodeInHierarchy: {\n selector: `\n CASE\n WHEN (\n json_extract([partition].JsonProperties, '$.PhysicalPartition.Model.Content') IS NOT NULL\n OR json_extract([partition].JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NOT NULL\n ) THEN 1\n ELSE 0\n END\n `,\n },\n hasChildren: this.#hierarchyConfig.showEmptyModels\n ? {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this.#hierarchyConfig.elementClassSpecification} e\n WHERE e.Model.Id = m.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n }\n : true,\n extendedData: {\n imageId: \"icon-model\",\n isModel: true,\n },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${CLASS_NAME_GeometricModel3d} m\n JOIN ${CLASS_NAME_InformationPartitionElement} [partition] ON [partition].ECInstanceId = m.ModeledElement.Id\n WHERE\n m.ECInstanceId IN (${childModelIds.map(() => \"?\").join(\",\")})\n ) model\n JOIN ${modelFilterClauses.from} this ON this.ECInstanceId = model.ECInstanceId\n ${modelFilterClauses.joins}\n ${modelFilterClauses.where ? `AND (model.${NodeSelectClauseColumnNames.HideNodeInHierarchy} OR ${modelFilterClauses.where})` : \"\"}\n `,\n bindings: childModelIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n },\n });\n return defs;\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: CLASS_NAME_GeometricModel3d,\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 })}\n FROM ${CLASS_NAME_GeometricModel3d} 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.#hierarchyConfig.elementClassSpecification})\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: CLASS_NAME_SpatialCategory, alias: \"this\" },\n });\n return [\n {\n fullClassName: CLASS_NAME_SpatialCategory,\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: CLASS_NAME_SpatialCategory,\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 },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this.#hierarchyConfig.elementClassSpecification} element\n WHERE\n element.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: modelIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n private async createSpatialCategoryChildrenQuery({\n parentNodeInstanceIds: categoryIds,\n parentNode,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const modelIds = parseIdsSelectorResult(parentNode.extendedData?.modelIds);\n if (modelIds.length === 0) {\n throw new Error(`Invalid category node \"${parentNode.label}\" - missing model information.`);\n }\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n const modeledElements = await firstValueFrom(\n from(modelIds).pipe(\n mergeMap((modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n reduce((acc, foundModeledElements) => {\n return acc.concat(foundModeledElements);\n }, new Array<ElementId>()),\n ),\n );\n return [\n {\n fullClassName: this.#hierarchyConfig.elementClassSpecification,\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.#hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this.#hierarchyConfig.elementClassGrouping !== \"disable\",\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.#hierarchyConfig.elementClassSpecification} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n )\n `,\n },\n extendedData: {\n isElement: true,\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.map(() => \"?\").join(\",\")})\n AND this.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: [...categoryIds.map((id) => ({ type: \"id\", value: id })), ...modelIds.map((id) => ({ type: \"id\", value: id }))] as ECSqlBinding[],\n },\n },\n ];\n }\n\n private async createGeometricElement3dChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n return [\n {\n fullClassName: this.#hierarchyConfig.elementClassSpecification,\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.#hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this.#hierarchyConfig.elementClassGrouping !== \"disable\",\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this.#hierarchyConfig.elementClassSpecification} ce\n JOIN ${CLASS_NAME_Model} 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 extendedData: {\n isElement: true,\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: this.supportsFiltering(),\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n 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: ModelsTreeInstanceKeyPathsProps): Promise<NormalizedHierarchySearchPath[]> {\n return lastValueFrom(\n defer(() => {\n const componentInfo = { componentId: props.componentId ?? Guid.createValue(), componentName: this.#componentName };\n if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabelObs({ ...props, ...componentInfo, labelsFactory });\n }\n return createInstanceKeyPathsFromTargetItemsObs({ ...props, ...componentInfo });\n }).pipe(props.abortSignal ? takeUntil(fromEvent(props.abortSignal, \"abort\")) : identity, defaultIfEmpty([])),\n );\n }\n\n private supportsFiltering() {\n return this.#hierarchyConfig.hierarchyLevelFiltering === \"enable\";\n }\n\n private async isSupported() {\n const [schemaName, className] = this.#hierarchyConfig.elementClassSpecification.split(/[\\.:]/);\n if (!schemaName || !className) {\n throw new Error(\n `Provided class specification ${this.#hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`,\n );\n }\n\n const query: ECSqlQueryDef = {\n ecsql: `\n SELECT 1\n FROM ECDbMeta.ECSchemaDef s\n JOIN ECDbMeta.ECClassDef c ON c.Schema.Id = s.ECInstanceId\n WHERE s.Name = ? AND c.Name = ? AND c.ECInstanceId IS (BisCore.GeometricElement3d)\n `,\n bindings: [\n { type: \"string\", value: schemaName },\n { type: \"string\", value: className },\n ],\n };\n\n for await (const _row of this.#queryExecutor.createQueryReader(query, {\n restartToken: `${ModelsTreeDefinition.#componentName}/${this.#componentId}/is-class-supported`,\n })) {\n return true;\n }\n return false;\n }\n}\n\nfunction createGeometricElementInstanceKeyPaths(props: {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n targetItems: Array<Id64String | ElementsGroupInfo>;\n componentId: GuidString;\n componentName: string;\n chunkIndex: number;\n}): Observable<NormalizedHierarchySearchPath> {\n const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess } = props;\n const elementIds = targetItems.filter((info): info is Id64String => typeof info === \"string\");\n const groupInfos = targetItems.filter((info): info is ElementsGroupInfo => typeof info !== \"string\");\n const separator = \";\";\n\n return defer(() => {\n const targetElementsInfoQuery =\n elementIds.length > 0\n ? `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, -1\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE e.ECInstanceId IN (${elementIds.join(\",\")})\n `\n : undefined;\n\n const targetGroupingNodesElementInfoQueries = groupInfos.map(\n ({ parent, groupingNode }, index) => `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, ${index}\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE\n e.ECClassId IS (${groupingNode.key.className})\n AND ${parent.type === \"element\" ? `e.Parent.Id IN (${parent.ids.join(\",\")})` : `e.Parent.Id IS NULL AND e.Category.Id IN (${parent.ids.join(\",\")}) AND e.Model.Id IN (${parent.modelIds.join(\",\")})`}\n `,\n );\n\n const ctes = [\n `InstanceElementsWithClassGroupingNodes(ECInstanceId, ECClassId, ParentId, ModelId, CategoryId, GroupingNodeIndex) AS (\n ${[...(targetElementsInfoQuery ? [targetElementsInfoQuery] : []), ...targetGroupingNodesElementInfoQueries].join(\" UNION ALL \")}\n )`,\n `ModelsCategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, GroupingNodeIndex, Path) AS (\n SELECT\n e.ECInstanceId,\n e.ParentId,\n e.ModelId,\n e.GroupingNodeIndex,\n IIF(e.ParentId 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\n FROM InstanceElementsWithClassGroupingNodes e\n LEFT JOIN ${CLASS_NAME_GeometricModel3d} m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)\n LEFT JOIN ${CLASS_NAME_SpatialCategory} c ON (e.ParentId IS NULL AND c.ECInstanceId = e.CategoryId)\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n ce.GroupingNodeIndex,\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 ModelsCategoriesElementsHierarchy ce\n JOIN ${hierarchyConfig.elementClassSpecification} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN ${CLASS_NAME_GeometricModel3d} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN ${CLASS_NAME_SpatialCategory} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.ModelId, mce.Path, mce.GroupingNodeIndex\n FROM ModelsCategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"Indexes\", limit: \"unbounded\", restartToken: `${componentName}/${componentId}/geometric-element-paths/${chunkIndex}` },\n );\n }).pipe(\n catchBeSQLiteInterrupts,\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)),\n mergeMap(({ modelId, elementHierarchyPath, groupingNode }) =>\n idsCache.createModelInstanceKeyPaths(modelId).pipe(\n mergeAll(),\n map((modelPath) => {\n // We don't want to modify the original path, we create a copy that we can modify\n const newModelPath = [...modelPath];\n newModelPath.pop(); // model is already included in the element hierarchy path\n const path = [...newModelPath, ...elementHierarchyPath];\n if (!groupingNode) {\n return { path };\n }\n return {\n path,\n options: {\n reveal: {\n depthInHierarchy: groupingNode.parentKeys.length,\n },\n },\n };\n }),\n ),\n ),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, groupInfos: ElementsGroupInfo[], separator: string, elementClassName: string) {\n const rowElements: string[] = row[1].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: CLASS_NAME_SpatialCategory, id: rowElements[i + 1] });\n break;\n case \"m\":\n path.push({ className: CLASS_NAME_GeometricModel3d, id: rowElements[i + 1] });\n break;\n }\n }\n return {\n modelId: row[0],\n elementHierarchyPath: path,\n groupingNode: row[2] === -1 ? undefined : groupInfos[row[2]].groupingNode,\n };\n}\n\nfunction createInstanceKeyPathsFromTargetItemsObs({\n targetItems,\n imodelAccess,\n hierarchyConfig,\n idsCache,\n limit,\n componentId,\n componentName,\n}: Omit<ModelsTreeInstanceKeyPathsFromTargetItemsProps, \"abortSignal\" | \"componentId\"> & { componentId: GuidString; componentName: string }): Observable<\n NormalizedHierarchySearchPath[]\n> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_SEARCH_INSTANCE_KEY_COUNT)) {\n throw new SearchLimitExceededError(limit ?? MAX_SEARCH_INSTANCE_KEY_COUNT);\n }\n\n return fromWithRelease({ source: targetItems, releaseOnCount: 2000 }).pipe(\n mergeMap(async (key): Promise<{ key: Id64String; type: number } | { key: ElementsGroupInfo; type: 0 }> => {\n if (\"parent\" in key) {\n return { key, type: 0 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_Subject)) {\n return { key: key.id, type: 1 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_Model)) {\n return { key: key.id, type: 2 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, CLASS_NAME_SpatialCategory)) {\n return { key: key.id, type: 3 };\n }\n\n return { key: key.id, type: 0 };\n }, 2),\n reduce(\n (acc, value) => {\n if (value.type === 1) {\n acc.subjectIds.push(value.key);\n return acc;\n }\n if (value.type === 2) {\n acc.modelIds.push(value.key);\n return acc;\n }\n if (value.type === 3) {\n acc.categoryIds.push(value.key);\n return acc;\n }\n acc.elementIds.push(value.key);\n return acc;\n },\n {\n modelIds: new Array<Id64String>(),\n categoryIds: new Array<Id64String>(),\n subjectIds: new Array<Id64String>(),\n elementIds: new Array<Id64String | ElementsGroupInfo>(),\n },\n ),\n switchMap(async (ids) => {\n const elementsLength = ids.elementIds.length;\n return collect(\n merge(\n from(ids.subjectIds).pipe(mergeMap((id) => idsCache.createSubjectInstanceKeysPath(id).pipe(map(HierarchySearchPath.normalize)))),\n from(ids.modelIds).pipe(mergeMap((id) => idsCache.createModelInstanceKeyPaths(id).pipe(mergeAll(), map(HierarchySearchPath.normalize)))),\n from(ids.categoryIds).pipe(mergeMap((id) => idsCache.createCategoryInstanceKeyPaths(id).pipe(mergeAll(), map(HierarchySearchPath.normalize)))),\n from(ids.elementIds).pipe(\n bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })),\n releaseMainThreadOnItemsCount(1),\n mergeMap(\n (block, chunkIndex) =>\n createGeometricElementInstanceKeyPaths({\n imodelAccess,\n idsCache,\n hierarchyConfig,\n targetItems: block,\n componentId,\n componentName,\n chunkIndex,\n }),\n 10,\n ),\n ),\n ),\n );\n }),\n );\n}\n\nfunction createInstanceKeyPathsFromInstanceLabelObs(\n props: Omit<ModelsTreeInstanceKeyPathsFromInstanceLabelProps, \"abortSignal\" | \"componentId\"> & {\n labelsFactory: IInstanceLabelSelectClauseFactory;\n componentId: GuidString;\n componentName: string;\n },\n) {\n const { labelsFactory, hierarchyConfig, label, imodelAccess, limit } = props;\n return defer(async () => {\n const elementLabelSelectClause = await labelsFactory.createSelectClause({\n classAlias: \"e\",\n className: CLASS_NAME_Element,\n selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,\n });\n const ecsql = `\n SELECT *\n FROM (\n SELECT\n ec_classname(e.ECClassId, 's.c'),\n e.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM ${CLASS_NAME_Element} e\n WHERE e.ECClassId IS (${CLASS_NAME_Subject}, ${CLASS_NAME_SpatialCategory}, ${hierarchyConfig.elementClassSpecification})\n\n UNION ALL\n\n SELECT\n ec_classname(m.ECClassId, 's.c'),\n m.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM ${CLASS_NAME_GeometricModel3d} m\n JOIN ${CLASS_NAME_Element} e ON e.ECInstanceId = m.ModeledElement.Id\n WHERE NOT m.IsPrivate\n ${hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}\n AND json_extract(e.JsonProperties, '$.PhysicalPartition.Model.Content') IS NULL\n AND json_extract(e.JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NULL\n )\n WHERE Label LIKE '%' || ? || '%' ESCAPE '\\\\'\n LIMIT ${MAX_SEARCH_INSTANCE_KEY_COUNT + 1}\n `;\n const bindings: ECSqlBinding[] = [{ type: \"string\", value: label.replace(/[%_\\\\]/g, \"\\\\$&\") }];\n return { ecsql, bindings };\n }).pipe(\n mergeMap((queryProps) => {\n return imodelAccess.createQueryReader(queryProps, {\n rowFormat: \"Indexes\",\n restartToken: `${props.componentName}/${props.componentId}/filter-by-label`,\n limit,\n });\n }),\n catchBeSQLiteInterrupts,\n map((row) => ({ className: row[0], id: row[1] })),\n toArray(),\n mergeMap((targetKeys) => createInstanceKeyPathsFromTargetItemsObs({ ...props, targetItems: targetKeys })),\n );\n}\n"]}
@@ -0,0 +1,63 @@
1
+ import { HierarchyNode } from "@itwin/presentation-hierarchies";
2
+ import type { Id64String } from "@itwin/core-bentley";
3
+ import type { ClassGroupingNodeKey, GroupingHierarchyNode, InstancesNodeKey, NonGroupingHierarchyNode } from "@itwin/presentation-hierarchies";
4
+ /**
5
+ * Contains utility functions for working with Models Tree nodes.
6
+ * @beta
7
+ */
8
+ export declare namespace ModelsTreeNode {
9
+ /** Checks if the given node represents a `BisCore.Subject` element. */
10
+ const isSubjectNode: (node: Pick<HierarchyNode, "extendedData">) => node is NonGroupingHierarchyNode & {
11
+ key: InstancesNodeKey;
12
+ };
13
+ /** Checks if the given node represents a `BisCore.Model`. */
14
+ const isModelNode: (node: Pick<HierarchyNode, "extendedData">) => node is NonGroupingHierarchyNode & {
15
+ key: InstancesNodeKey;
16
+ };
17
+ /**
18
+ * Checks if the given node represents a `BisCore.Category` element.
19
+ *
20
+ * If it does, the node's `extendedData` will contain the following properties:
21
+ * - `modelIds`: `Id64String[]` of the model that this category node is contained under
22
+ */
23
+ const isCategoryNode: (node: Pick<HierarchyNode, "extendedData">) => node is Omit<NonGroupingHierarchyNode, "extendedData"> & {
24
+ key: InstancesNodeKey;
25
+ } & {
26
+ extendedData: {
27
+ modelIds: Id64String[];
28
+ };
29
+ };
30
+ /**
31
+ * Checks if the given node represents a `BisCore.GeometricElement` element.
32
+ *
33
+ * If it does, the node's `extendedData` will contain the following properties:
34
+ * - `modelId`: `Id64String` of the model containing the element
35
+ * - `categoryId`: `Id64String` of the category of the element
36
+ */
37
+ const isElementNode: (node: Pick<HierarchyNode, "extendedData">) => node is Omit<NonGroupingHierarchyNode, "extendedData"> & {
38
+ key: InstancesNodeKey;
39
+ } & {
40
+ extendedData: {
41
+ modelId: Id64String;
42
+ categoryId: Id64String;
43
+ };
44
+ };
45
+ /**
46
+ * Checks if the given node is a class grouping node of `BisCore.GeometricElement` nodes.
47
+ *
48
+ * If it is, the node's `extendedData` will contain the following properties:
49
+ * - `modelId`: `Id64String` of the model containing the elements
50
+ * - `categoryId`: `Id64String` of the category of the elements
51
+ */
52
+ const isElementClassGroupingNode: (node: Pick<HierarchyNode, "key">) => node is Omit<GroupingHierarchyNode, "extendedData"> & {
53
+ key: ClassGroupingNodeKey;
54
+ } & {
55
+ extendedData: {
56
+ modelId: Id64String;
57
+ categoryId: Id64String;
58
+ };
59
+ };
60
+ /** Returns type of the node. */
61
+ const getType: (node: HierarchyNode) => "subject" | "model" | "category" | "element" | "elements-class-group";
62
+ }
63
+ //# sourceMappingURL=ModelsTreeNode.d.ts.map
@@ -0,0 +1,56 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { HierarchyNode, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
6
+ /**
7
+ * Contains utility functions for working with Models Tree nodes.
8
+ * @beta
9
+ */
10
+ export var ModelsTreeNode;
11
+ (function (ModelsTreeNode) {
12
+ /** Checks if the given node represents a `BisCore.Subject` element. */
13
+ ModelsTreeNode.isSubjectNode = (node) => !!node.extendedData?.isSubject;
14
+ /** Checks if the given node represents a `BisCore.Model`. */
15
+ ModelsTreeNode.isModelNode = (node) => !!node.extendedData?.isModel;
16
+ /**
17
+ * Checks if the given node represents a `BisCore.Category` element.
18
+ *
19
+ * If it does, the node's `extendedData` will contain the following properties:
20
+ * - `modelIds`: `Id64String[]` of the model that this category node is contained under
21
+ */
22
+ ModelsTreeNode.isCategoryNode = (node) => !!node.extendedData?.isCategory;
23
+ /**
24
+ * Checks if the given node represents a `BisCore.GeometricElement` element.
25
+ *
26
+ * If it does, the node's `extendedData` will contain the following properties:
27
+ * - `modelId`: `Id64String` of the model containing the element
28
+ * - `categoryId`: `Id64String` of the category of the element
29
+ */
30
+ ModelsTreeNode.isElementNode = (node) => !!node.extendedData && "isElement" in node.extendedData && !!node.extendedData.isElement;
31
+ /**
32
+ * Checks if the given node is a class grouping node of `BisCore.GeometricElement` nodes.
33
+ *
34
+ * If it is, the node's `extendedData` will contain the following properties:
35
+ * - `modelId`: `Id64String` of the model containing the elements
36
+ * - `categoryId`: `Id64String` of the category of the elements
37
+ */
38
+ ModelsTreeNode.isElementClassGroupingNode = (node) => HierarchyNode.isClassGroupingNode(node);
39
+ /** Returns type of the node. */
40
+ ModelsTreeNode.getType = (node) => {
41
+ if (HierarchyNodeKey.isClassGrouping(node.key)) {
42
+ return "elements-class-group";
43
+ }
44
+ if (ModelsTreeNode.isSubjectNode(node)) {
45
+ return "subject";
46
+ }
47
+ if (ModelsTreeNode.isModelNode(node)) {
48
+ return "model";
49
+ }
50
+ if (ModelsTreeNode.isCategoryNode(node)) {
51
+ return "category";
52
+ }
53
+ return "element";
54
+ };
55
+ })(ModelsTreeNode || (ModelsTreeNode = {}));
56
+ //# sourceMappingURL=ModelsTreeNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelsTreeNode.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/ModelsTreeNode.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKlF;;;GAGG;AACH,MAAM,KAAW,cAAc,CAuE9B;AAvED,WAAiB,cAAc;IAC7B,uEAAuE;IAC1D,4BAAa,GAAG,CAAC,IAAyC,EAAgE,EAAE,CACvI,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;IAEjC,6DAA6D;IAChD,0BAAW,GAAG,CAAC,IAAyC,EAAgE,EAAE,CACrI,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC;IAE/B;;;;;OAKG;IACU,6BAAc,GAAG,CAC5B,IAAyC,EAKzC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;IAErC;;;;;;OAMG;IACU,4BAAa,GAAG,CAC3B,IAAyC,EAMzC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IAE9F;;;;;;OAMG;IACU,yCAA0B,GAAG,CACxC,IAAgC,EAMhC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE7C,gCAAgC;IACnB,sBAAO,GAAG,CAAC,IAAmB,EAAyE,EAAE;QACpH,IAAI,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,sBAAsB,CAAC;QAChC,CAAC;QACD,IAAI,eAAA,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,eAAA,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,eAAA,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC,EAvEgB,cAAc,KAAd,cAAc,QAuE9B","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 { HierarchyNode, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { ClassGroupingNodeKey, GroupingHierarchyNode, InstancesNodeKey, NonGroupingHierarchyNode } from \"@itwin/presentation-hierarchies\";\n\n/**\n * Contains utility functions for working with Models Tree nodes.\n * @beta\n */\nexport namespace ModelsTreeNode {\n /** Checks if the given node represents a `BisCore.Subject` element. */\n export const isSubjectNode = (node: Pick<HierarchyNode, \"extendedData\">): node is NonGroupingHierarchyNode & { key: InstancesNodeKey } =>\n !!node.extendedData?.isSubject;\n\n /** Checks if the given node represents a `BisCore.Model`. */\n export const isModelNode = (node: Pick<HierarchyNode, \"extendedData\">): node is NonGroupingHierarchyNode & { key: InstancesNodeKey } =>\n !!node.extendedData?.isModel;\n\n /**\n * Checks if the given node represents a `BisCore.Category` element.\n *\n * If it does, the node's `extendedData` will contain the following properties:\n * - `modelIds`: `Id64String[]` of the model that this category node is contained under\n */\n export const isCategoryNode = (\n node: Pick<HierarchyNode, \"extendedData\">,\n ): node is Omit<NonGroupingHierarchyNode, \"extendedData\"> & { key: InstancesNodeKey } & {\n extendedData: {\n modelIds: Id64String[];\n };\n } => !!node.extendedData?.isCategory;\n\n /**\n * Checks if the given node represents a `BisCore.GeometricElement` element.\n *\n * If it does, the node's `extendedData` will contain the following properties:\n * - `modelId`: `Id64String` of the model containing the element\n * - `categoryId`: `Id64String` of the category of the element\n */\n export const isElementNode = (\n node: Pick<HierarchyNode, \"extendedData\">,\n ): node is Omit<NonGroupingHierarchyNode, \"extendedData\"> & { key: InstancesNodeKey } & {\n extendedData: {\n modelId: Id64String;\n categoryId: Id64String;\n };\n } => !!node.extendedData && \"isElement\" in node.extendedData && !!node.extendedData.isElement;\n\n /**\n * Checks if the given node is a class grouping node of `BisCore.GeometricElement` nodes.\n *\n * If it is, the node's `extendedData` will contain the following properties:\n * - `modelId`: `Id64String` of the model containing the elements\n * - `categoryId`: `Id64String` of the category of the elements\n */\n export const isElementClassGroupingNode = (\n node: Pick<HierarchyNode, \"key\">,\n ): node is Omit<GroupingHierarchyNode, \"extendedData\"> & { key: ClassGroupingNodeKey } & {\n extendedData: {\n modelId: Id64String;\n categoryId: Id64String;\n };\n } => HierarchyNode.isClassGroupingNode(node);\n\n /** Returns type of the node. */\n export const getType = (node: HierarchyNode): \"subject\" | \"model\" | \"category\" | \"element\" | \"elements-class-group\" => {\n if (HierarchyNodeKey.isClassGrouping(node.key)) {\n return \"elements-class-group\";\n }\n if (isSubjectNode(node)) {\n return \"subject\";\n }\n if (isModelNode(node)) {\n return \"model\";\n }\n if (isCategoryNode(node)) {\n return \"category\";\n }\n return \"element\";\n };\n}\n"]}
@@ -4,7 +4,7 @@ import type { HierarchySearchPath } from "@itwin/presentation-hierarchies";
4
4
  import type { PresentationHierarchyNode } from "@itwin/presentation-hierarchies-react";
5
5
  import type { InstanceKey } from "@itwin/presentation-shared";
6
6
  import type { VisibilityTreeProps } from "../common/components/VisibilityTree.js";
7
- import type { VisibilityTreeRendererProps } from "../common/components/VisibilityTreeRenderer.js";
7
+ import type { ExtendedVisibilityTreeRendererProps } from "../common/components/VisibilityTreeRenderer.js";
8
8
  import type { TreeWidgetViewport } from "../common/TreeWidgetViewport.js";
9
9
  import type { NormalizedHierarchySearchPath } from "../common/Utils.js";
10
10
  import type { ModelsTreeVisibilityHandlerOverrides } from "./internal/visibility/ModelsTreeVisibilityHandler.js";
@@ -77,17 +77,18 @@ export interface UseModelsTreeProps {
77
77
  type: "subject" | "model" | "category" | "element" | "elements-class-group";
78
78
  }) => boolean;
79
79
  emptyTreeContent?: ReactNode;
80
+ getTreeItemProps?: ExtendedVisibilityTreeRendererProps["getTreeItemProps"];
80
81
  }
81
82
  /** @beta */
82
83
  interface UseModelsTreeResult {
83
- modelsTreeProps: Pick<VisibilityTreeProps, "treeName" | "getHierarchyDefinition" | "getSearchPaths" | "visibilityHandlerFactory" | "highlightText" | "emptyTreeContent" | "selectionPredicate">;
84
- rendererProps: Required<Pick<VisibilityTreeRendererProps, "getDecorations">>;
84
+ treeProps: Pick<VisibilityTreeProps, "treeName" | "getHierarchyDefinition" | "getSearchPaths" | "visibilityHandlerFactory" | "highlightText" | "emptyTreeContent" | "selectionPredicate">;
85
+ getTreeItemProps: Required<ExtendedVisibilityTreeRendererProps>["getTreeItemProps"];
85
86
  }
86
87
  /**
87
88
  * Custom hook to create and manage state for the models tree.
88
89
  * @beta
89
90
  */
90
- export declare function useModelsTree({ activeView, searchText, hierarchyConfig, visibilityHandlerOverrides, getSearchPaths, onModelsFiltered, selectionPredicate: nodeTypeSelectionPredicate, emptyTreeContent, getSubTreePaths, }: UseModelsTreeProps): UseModelsTreeResult;
91
+ export declare function useModelsTree({ activeView, searchText, hierarchyConfig, visibilityHandlerOverrides, getSearchPaths, onModelsFiltered, selectionPredicate: nodeTypeSelectionPredicate, emptyTreeContent, getSubTreePaths, getTreeItemProps, }: UseModelsTreeProps): UseModelsTreeResult;
91
92
  /** @beta */
92
93
  export declare function ModelsTreeIcon({ node }: {
93
94
  node: PresentationHierarchyNode;
@@ -16,16 +16,16 @@ import { useGuid } from "../common/internal/useGuid.js";
16
16
  import { useCachedVisibility } from "../common/internal/useTreeHooks/UseCachedVisibility.js";
17
17
  import { useIdsCache } from "../common/internal/useTreeHooks/UseIdsCache.js";
18
18
  import { ModelsTreeIdsCache } from "./internal/ModelsTreeIdsCache.js";
19
- import { ModelsTreeNode } from "./internal/ModelsTreeNode.js";
20
19
  import { useSearchPaths } from "./internal/UseSearchPaths.js";
21
20
  import { ModelsTreeVisibilityHandler } from "./internal/visibility/ModelsTreeVisibilityHandler.js";
22
21
  import { createModelsSearchResultsTree } from "./internal/visibility/SearchResultsTree.js";
23
22
  import { defaultHierarchyConfiguration, ModelsTreeDefinition } from "./ModelsTreeDefinition.js";
23
+ import { ModelsTreeNode } from "./ModelsTreeNode.js";
24
24
  /**
25
25
  * Custom hook to create and manage state for the models tree.
26
26
  * @beta
27
27
  */
28
- export function useModelsTree({ activeView, searchText, hierarchyConfig, visibilityHandlerOverrides, getSearchPaths, onModelsFiltered, selectionPredicate: nodeTypeSelectionPredicate, emptyTreeContent, getSubTreePaths, }) {
28
+ export function useModelsTree({ activeView, searchText, hierarchyConfig, visibilityHandlerOverrides, getSearchPaths, onModelsFiltered, selectionPredicate: nodeTypeSelectionPredicate, emptyTreeContent, getSubTreePaths, getTreeItemProps, }) {
29
29
  const hierarchyConfiguration = useMemo(() => ({
30
30
  ...defaultHierarchyConfiguration,
31
31
  ...hierarchyConfig,
@@ -65,7 +65,7 @@ export function useModelsTree({ activeView, searchText, hierarchyConfig, visibil
65
65
  }, [nodeTypeSelectionPredicate]);
66
66
  // TODO: add double click logic
67
67
  return {
68
- modelsTreeProps: {
68
+ treeProps: {
69
69
  treeName: "models-tree-v2",
70
70
  visibilityHandlerFactory,
71
71
  getHierarchyDefinition,
@@ -74,10 +74,11 @@ export function useModelsTree({ activeView, searchText, hierarchyConfig, visibil
74
74
  highlightText: searchText,
75
75
  selectionPredicate: nodeSelectionPredicate,
76
76
  },
77
- rendererProps: {
78
- // onDoubleClick,
79
- getDecorations: useCallback((node) => _jsx(ModelsTreeIcon, { node: node }), []),
80
- },
77
+ getTreeItemProps: (node, rendererProps) => ({
78
+ ...rendererProps.getTreeItemProps?.(node),
79
+ decorations: _jsx(ModelsTreeIcon, { node: node }),
80
+ ...getTreeItemProps?.(node, rendererProps),
81
+ }),
81
82
  };
82
83
  }
83
84
  async function createSearchResultsTree(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"UseModelsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/UseModelsTree.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 } from \"react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport { Icon } from \"@stratakit/foundations\";\nimport categorySvg from \"@stratakit/icons/bis-category-3d.svg\";\nimport classSvg from \"@stratakit/icons/bis-class.svg\";\nimport elementSvg from \"@stratakit/icons/bis-element.svg\";\nimport subjectSvg from \"@stratakit/icons/bis-subject.svg\";\nimport modelSvg from \"@stratakit/icons/model-cube.svg\";\nimport {\n EmptyTreeContent,\n NoSearchMatches,\n SearchUnknownError,\n SubTreeError,\n TooManyInstancesFocused,\n TooManySearchMatches,\n UnknownInstanceFocusError,\n} from \"../common/components/EmptyTree.js\";\nimport { useGuid } from \"../common/internal/useGuid.js\";\nimport { useCachedVisibility } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\nimport { ModelsTreeNode } from \"./internal/ModelsTreeNode.js\";\nimport { useSearchPaths } from \"./internal/UseSearchPaths.js\";\nimport { ModelsTreeVisibilityHandler } from \"./internal/visibility/ModelsTreeVisibilityHandler.js\";\nimport { createModelsSearchResultsTree } from \"./internal/visibility/SearchResultsTree.js\";\nimport { defaultHierarchyConfiguration, ModelsTreeDefinition } from \"./ModelsTreeDefinition.js\";\n\nimport type { ReactNode } from \"react\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CreateSearchResultsTreeProps, CreateTreeSpecificVisibilityHandlerProps } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { SearchResultsTree } from \"../common/internal/visibility/BaseSearchResultsTree.js\";\nimport type { TreeWidgetViewport } from \"../common/TreeWidgetViewport.js\";\nimport type { NormalizedHierarchySearchPath } from \"../common/Utils.js\";\nimport type { ModelsTreeSearchError, ModelsTreeSubTreeError } from \"./internal/UseSearchPaths.js\";\nimport type { ModelsTreeVisibilityHandlerOverrides } from \"./internal/visibility/ModelsTreeVisibilityHandler.js\";\nimport type { ModelsTreeSearchTargets } from \"./internal/visibility/SearchResultsTree.js\";\nimport type { ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from \"./ModelsTreeDefinition.js\";\n\n/** @beta */\nexport interface UseModelsTreeProps {\n /**\n * Optional search string used to filter tree nodes by label, as well as highlight matching substrings in the tree.\n * Nodes that do not contain this string in their label will be filtered out.\n *\n * If `getSearchPaths` function is provided, it will take precedence and automatic search by this string will not be applied.\n * Instead, the string will be supplied to the given `getSearchPaths` function for consumers to apply the search.\n */\n searchText?: string;\n activeView: TreeWidgetViewport;\n hierarchyConfig?: Partial<ModelsTreeHierarchyConfiguration>;\n visibilityHandlerOverrides?: ModelsTreeVisibilityHandlerOverrides;\n /**\n * Optional function for applying custom search on the hierarchy. Use it when you want full control over which nodes should be displayed, based on more complex logic or known instance keys.\n *\n * When defined, this function takes precedence over search by `searchText` string. If both are supplied, the `searchText` is provided as an argument to `getSearchPaths`.\n *\n * @param props Parameters provided when `getSearchPaths` is called:\n * - `createInstanceKeyPaths`: Helper function to create search paths.\n * - `searchText`: The search text which would otherwise be used for default searching.\n *\n * **Example use cases:**\n * - You have a list of `InstanceKey` items, which you want to use for searching the hierarchy.\n * - You want to create search paths based on node label, but also apply some extra conditions (for example exclude paths with sub-models).\n * - You want to construct custom search paths. For example: create a search path for each geometric element which has a parent element.\n *\n * @note Paths returned by `createInstanceKeyPaths` will not have `reveal` flag set. If you want nodes to be expanded, iterate over the paths and\n * set `reveal: true` manually.\n */\n getSearchPaths?: (props: {\n /** A function that creates search paths based on provided target instance keys or node label. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> } | { label: string }) => Promise<NormalizedHierarchySearchPath[]>;\n /** Search text which would be used to create search paths if `getSearchPaths` wouldn't be provided. */\n searchText?: string;\n }) => Promise<HierarchySearchPath[] | undefined>;\n /**\n * Optional function for restricting the visible hierarchy to a specific sub-tree of nodes, without changing how search works.\n *\n * Use when you want to display only part of the hierarchy, but still allow normal searching within that sub-tree.\n *\n * When defined, only nodes that are in the provided paths or children of target nodes will be part of the hierarchy.\n * Searching (by label or custom logic) will still apply within this sub-tree.\n *\n * Key difference:\n * - `getSearchPaths` determines which nodes should be shown, giving you full control over search logic.\n * - `getSubTreePaths` restricts the hierarchy to a sub-tree, but does not override the search logic — search is still applied within the restricted sub-tree.\n */\n getSubTreePaths?: (props: {\n /** A function that creates search paths based on provided target instance keys. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> }) => Promise<NormalizedHierarchySearchPath[]>;\n }) => Promise<HierarchySearchPath[]>;\n onModelsFiltered?: (modelIds: Id64String[] | undefined) => void;\n /**\n * An optional predicate to allow or prohibit selection of a node.\n * When not supplied, all nodes are selectable.\n */\n selectionPredicate?: (props: { node: PresentationHierarchyNode; type: \"subject\" | \"model\" | \"category\" | \"element\" | \"elements-class-group\" }) => boolean;\n emptyTreeContent?: ReactNode;\n}\n\n/** @beta */\ninterface UseModelsTreeResult {\n modelsTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"getSearchPaths\" | \"visibilityHandlerFactory\" | \"highlightText\" | \"emptyTreeContent\" | \"selectionPredicate\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getDecorations\">>;\n}\n\n/**\n * Custom hook to create and manage state for the models tree.\n * @beta\n */\nexport function useModelsTree({\n activeView,\n searchText,\n hierarchyConfig,\n visibilityHandlerOverrides,\n getSearchPaths,\n onModelsFiltered,\n selectionPredicate: nodeTypeSelectionPredicate,\n emptyTreeContent,\n getSubTreePaths,\n}: UseModelsTreeProps): UseModelsTreeResult {\n const hierarchyConfiguration = useMemo<ModelsTreeHierarchyConfiguration>(\n () => ({\n ...defaultHierarchyConfiguration,\n ...hierarchyConfig,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Object.values(hierarchyConfig ?? {}),\n );\n const componentId = useGuid();\n const { getCache: getModelsTreeIdsCache } = useIdsCache<ModelsTreeIdsCache, { hierarchyConfig: ModelsTreeHierarchyConfiguration }>({\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig: hierarchyConfiguration }), [hierarchyConfiguration]),\n componentId,\n });\n\n const { visibilityHandlerFactory, onSearchPathsChanged } = useCachedVisibility<ModelsTreeIdsCache, ModelsTreeSearchTargets>({\n activeView,\n createSearchResultsTree,\n createTreeSpecificVisibilityHandler: useCallback(\n (treeProps) => createTreeSpecificVisibilityHandler({ ...treeProps, overrides: visibilityHandlerOverrides }),\n [visibilityHandlerOverrides],\n ),\n getCache: getModelsTreeIdsCache,\n componentId,\n });\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n ({ imodelAccess }) => new ModelsTreeDefinition({ imodelAccess, idsCache: getModelsTreeIdsCache(), hierarchyConfig: hierarchyConfiguration, componentId }),\n [getModelsTreeIdsCache, hierarchyConfiguration, componentId],\n );\n\n const { getPaths, searchError, subTreeError } = useSearchPaths({\n hierarchyConfiguration,\n searchText,\n getSearchPaths,\n getModelsTreeIdsCache,\n onSearchPathsChanged,\n onModelsFiltered,\n getSubTreePaths,\n componentId,\n });\n\n const nodeSelectionPredicate = useCallback<NonNullable<VisibilityTreeProps[\"selectionPredicate\"]>>(\n (node) => {\n if (!nodeTypeSelectionPredicate) {\n return true;\n }\n return nodeTypeSelectionPredicate({ node, type: ModelsTreeNode.getType(node.nodeData) });\n },\n [nodeTypeSelectionPredicate],\n );\n\n // TODO: add double click logic\n return {\n modelsTreeProps: {\n treeName: \"models-tree-v2\",\n visibilityHandlerFactory,\n getHierarchyDefinition,\n getSearchPaths: getPaths,\n emptyTreeContent: useMemo(\n () => getEmptyTreeContentComponent(searchText, subTreeError, searchError, emptyTreeContent),\n [searchText, subTreeError, searchError, emptyTreeContent],\n ),\n highlightText: searchText,\n selectionPredicate: nodeSelectionPredicate,\n },\n rendererProps: {\n // onDoubleClick,\n getDecorations: useCallback((node) => <ModelsTreeIcon node={node} />, []),\n },\n };\n}\n\nasync function createSearchResultsTree(props: CreateSearchResultsTreeProps<ModelsTreeIdsCache>): Promise<SearchResultsTree<ModelsTreeSearchTargets>> {\n const { searchPaths, imodelAccess } = props;\n return createModelsSearchResultsTree({\n imodelAccess,\n searchPaths,\n });\n}\n\nfunction createTreeSpecificVisibilityHandler(\n props: CreateTreeSpecificVisibilityHandlerProps<ModelsTreeIdsCache> & { overrides?: ModelsTreeVisibilityHandlerOverrides },\n) {\n const { info, getCache, overrideHandler, overrides, viewport } = props;\n return new ModelsTreeVisibilityHandler({\n alwaysAndNeverDrawnElementInfo: info,\n overrideHandler,\n idsCache: getCache(),\n viewport,\n overrides,\n });\n}\n\nfunction getEmptyTreeContentComponent(\n searchText?: string,\n subTreeError?: ModelsTreeSubTreeError,\n error?: ModelsTreeSearchError,\n emptyTreeContent?: React.ReactNode,\n) {\n if (isSubTreeError(subTreeError)) {\n return <SubTreeError base={\"modelsTree\"} error={subTreeError} />;\n }\n if (isInstanceFocusError(error)) {\n return <InstanceFocusError error={error} />;\n }\n if (isSearchError(error)) {\n if (error === \"tooManySearchMatches\") {\n return <TooManySearchMatches base={\"modelsTree\"} />;\n }\n return <SearchUnknownError base={\"modelsTree\"} />;\n }\n if (searchText) {\n return <NoSearchMatches base={\"modelsTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={modelSvg} />;\n}\n\nfunction isSubTreeError(error: ModelsTreeSubTreeError | undefined) {\n return error === \"unknownSubTreeError\";\n}\n\nfunction isSearchError(error: ModelsTreeSearchError | undefined) {\n return error === \"tooManySearchMatches\" || error === \"unknownSearchError\";\n}\n\nfunction isInstanceFocusError(error: ModelsTreeSearchError | undefined): error is \"tooManyInstancesFocused\" | \"unknownInstanceFocusError\" {\n return error === \"tooManyInstancesFocused\" || error === \"unknownInstanceFocusError\";\n}\n\nfunction InstanceFocusError({ error }: { error: ModelsTreeSearchError }) {\n if (error === \"tooManyInstancesFocused\") {\n return <TooManyInstancesFocused base={\"modelsTree\"} />;\n }\n return <UnknownInstanceFocusError base={\"modelsTree\"} />;\n}\n\n/** @beta */\nexport function ModelsTreeIcon({ node }: { node: PresentationHierarchyNode }) {\n if (node.nodeData.extendedData?.imageId === undefined) {\n return undefined;\n }\n\n const getIcon = () => {\n switch (node.nodeData.extendedData!.imageId) {\n case \"icon-layers\":\n return categorySvg;\n case \"icon-item\":\n return elementSvg;\n case \"icon-ec-class\":\n return classSvg;\n case \"icon-folder\":\n return subjectSvg;\n case \"icon-model\":\n return modelSvg;\n default:\n return undefined;\n }\n };\n\n return <Icon href={getIcon()} />;\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ModelsTreeHierarchyConfiguration }>) {\n return new ModelsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig, props.componentId);\n}\n"]}
1
+ {"version":3,"file":"UseModelsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/UseModelsTree.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 } from \"react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport { Icon } from \"@stratakit/foundations\";\nimport categorySvg from \"@stratakit/icons/bis-category-3d.svg\";\nimport classSvg from \"@stratakit/icons/bis-class.svg\";\nimport elementSvg from \"@stratakit/icons/bis-element.svg\";\nimport subjectSvg from \"@stratakit/icons/bis-subject.svg\";\nimport modelSvg from \"@stratakit/icons/model-cube.svg\";\nimport {\n EmptyTreeContent,\n NoSearchMatches,\n SearchUnknownError,\n SubTreeError,\n TooManyInstancesFocused,\n TooManySearchMatches,\n UnknownInstanceFocusError,\n} from \"../common/components/EmptyTree.js\";\nimport { useGuid } from \"../common/internal/useGuid.js\";\nimport { useCachedVisibility } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\nimport { useSearchPaths } from \"./internal/UseSearchPaths.js\";\nimport { ModelsTreeVisibilityHandler } from \"./internal/visibility/ModelsTreeVisibilityHandler.js\";\nimport { createModelsSearchResultsTree } from \"./internal/visibility/SearchResultsTree.js\";\nimport { defaultHierarchyConfiguration, ModelsTreeDefinition } from \"./ModelsTreeDefinition.js\";\nimport { ModelsTreeNode } from \"./ModelsTreeNode.js\";\n\nimport type { ReactNode } from \"react\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchySearchPath } from \"@itwin/presentation-hierarchies\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { ExtendedVisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CreateSearchResultsTreeProps, CreateTreeSpecificVisibilityHandlerProps } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { SearchResultsTree } from \"../common/internal/visibility/BaseSearchResultsTree.js\";\nimport type { TreeWidgetViewport } from \"../common/TreeWidgetViewport.js\";\nimport type { NormalizedHierarchySearchPath } from \"../common/Utils.js\";\nimport type { ModelsTreeSearchError, ModelsTreeSubTreeError } from \"./internal/UseSearchPaths.js\";\nimport type { ModelsTreeVisibilityHandlerOverrides } from \"./internal/visibility/ModelsTreeVisibilityHandler.js\";\nimport type { ModelsTreeSearchTargets } from \"./internal/visibility/SearchResultsTree.js\";\nimport type { ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from \"./ModelsTreeDefinition.js\";\n\n/** @beta */\nexport interface UseModelsTreeProps {\n /**\n * Optional search string used to filter tree nodes by label, as well as highlight matching substrings in the tree.\n * Nodes that do not contain this string in their label will be filtered out.\n *\n * If `getSearchPaths` function is provided, it will take precedence and automatic search by this string will not be applied.\n * Instead, the string will be supplied to the given `getSearchPaths` function for consumers to apply the search.\n */\n searchText?: string;\n activeView: TreeWidgetViewport;\n hierarchyConfig?: Partial<ModelsTreeHierarchyConfiguration>;\n visibilityHandlerOverrides?: ModelsTreeVisibilityHandlerOverrides;\n /**\n * Optional function for applying custom search on the hierarchy. Use it when you want full control over which nodes should be displayed, based on more complex logic or known instance keys.\n *\n * When defined, this function takes precedence over search by `searchText` string. If both are supplied, the `searchText` is provided as an argument to `getSearchPaths`.\n *\n * @param props Parameters provided when `getSearchPaths` is called:\n * - `createInstanceKeyPaths`: Helper function to create search paths.\n * - `searchText`: The search text which would otherwise be used for default searching.\n *\n * **Example use cases:**\n * - You have a list of `InstanceKey` items, which you want to use for searching the hierarchy.\n * - You want to create search paths based on node label, but also apply some extra conditions (for example exclude paths with sub-models).\n * - You want to construct custom search paths. For example: create a search path for each geometric element which has a parent element.\n *\n * @note Paths returned by `createInstanceKeyPaths` will not have `reveal` flag set. If you want nodes to be expanded, iterate over the paths and\n * set `reveal: true` manually.\n */\n getSearchPaths?: (props: {\n /** A function that creates search paths based on provided target instance keys or node label. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> } | { label: string }) => Promise<NormalizedHierarchySearchPath[]>;\n /** Search text which would be used to create search paths if `getSearchPaths` wouldn't be provided. */\n searchText?: string;\n }) => Promise<HierarchySearchPath[] | undefined>;\n /**\n * Optional function for restricting the visible hierarchy to a specific sub-tree of nodes, without changing how search works.\n *\n * Use when you want to display only part of the hierarchy, but still allow normal searching within that sub-tree.\n *\n * When defined, only nodes that are in the provided paths or children of target nodes will be part of the hierarchy.\n * Searching (by label or custom logic) will still apply within this sub-tree.\n *\n * Key difference:\n * - `getSearchPaths` determines which nodes should be shown, giving you full control over search logic.\n * - `getSubTreePaths` restricts the hierarchy to a sub-tree, but does not override the search logic — search is still applied within the restricted sub-tree.\n */\n getSubTreePaths?: (props: {\n /** A function that creates search paths based on provided target instance keys. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> }) => Promise<NormalizedHierarchySearchPath[]>;\n }) => Promise<HierarchySearchPath[]>;\n onModelsFiltered?: (modelIds: Id64String[] | undefined) => void;\n /**\n * An optional predicate to allow or prohibit selection of a node.\n * When not supplied, all nodes are selectable.\n */\n selectionPredicate?: (props: { node: PresentationHierarchyNode; type: \"subject\" | \"model\" | \"category\" | \"element\" | \"elements-class-group\" }) => boolean;\n emptyTreeContent?: ReactNode;\n getTreeItemProps?: ExtendedVisibilityTreeRendererProps[\"getTreeItemProps\"];\n}\n\n/** @beta */\ninterface UseModelsTreeResult {\n treeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"getSearchPaths\" | \"visibilityHandlerFactory\" | \"highlightText\" | \"emptyTreeContent\" | \"selectionPredicate\"\n >;\n getTreeItemProps: Required<ExtendedVisibilityTreeRendererProps>[\"getTreeItemProps\"];\n}\n\n/**\n * Custom hook to create and manage state for the models tree.\n * @beta\n */\nexport function useModelsTree({\n activeView,\n searchText,\n hierarchyConfig,\n visibilityHandlerOverrides,\n getSearchPaths,\n onModelsFiltered,\n selectionPredicate: nodeTypeSelectionPredicate,\n emptyTreeContent,\n getSubTreePaths,\n getTreeItemProps,\n}: UseModelsTreeProps): UseModelsTreeResult {\n const hierarchyConfiguration = useMemo<ModelsTreeHierarchyConfiguration>(\n () => ({\n ...defaultHierarchyConfiguration,\n ...hierarchyConfig,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n Object.values(hierarchyConfig ?? {}),\n );\n const componentId = useGuid();\n const { getCache: getModelsTreeIdsCache } = useIdsCache<ModelsTreeIdsCache, { hierarchyConfig: ModelsTreeHierarchyConfiguration }>({\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig: hierarchyConfiguration }), [hierarchyConfiguration]),\n componentId,\n });\n\n const { visibilityHandlerFactory, onSearchPathsChanged } = useCachedVisibility<ModelsTreeIdsCache, ModelsTreeSearchTargets>({\n activeView,\n createSearchResultsTree,\n createTreeSpecificVisibilityHandler: useCallback(\n (treeProps) => createTreeSpecificVisibilityHandler({ ...treeProps, overrides: visibilityHandlerOverrides }),\n [visibilityHandlerOverrides],\n ),\n getCache: getModelsTreeIdsCache,\n componentId,\n });\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n ({ imodelAccess }) => new ModelsTreeDefinition({ imodelAccess, idsCache: getModelsTreeIdsCache(), hierarchyConfig: hierarchyConfiguration, componentId }),\n [getModelsTreeIdsCache, hierarchyConfiguration, componentId],\n );\n\n const { getPaths, searchError, subTreeError } = useSearchPaths({\n hierarchyConfiguration,\n searchText,\n getSearchPaths,\n getModelsTreeIdsCache,\n onSearchPathsChanged,\n onModelsFiltered,\n getSubTreePaths,\n componentId,\n });\n\n const nodeSelectionPredicate = useCallback<NonNullable<VisibilityTreeProps[\"selectionPredicate\"]>>(\n (node) => {\n if (!nodeTypeSelectionPredicate) {\n return true;\n }\n return nodeTypeSelectionPredicate({ node, type: ModelsTreeNode.getType(node.nodeData) });\n },\n [nodeTypeSelectionPredicate],\n );\n\n // TODO: add double click logic\n return {\n treeProps: {\n treeName: \"models-tree-v2\",\n visibilityHandlerFactory,\n getHierarchyDefinition,\n getSearchPaths: getPaths,\n emptyTreeContent: useMemo(\n () => getEmptyTreeContentComponent(searchText, subTreeError, searchError, emptyTreeContent),\n [searchText, subTreeError, searchError, emptyTreeContent],\n ),\n highlightText: searchText,\n selectionPredicate: nodeSelectionPredicate,\n },\n getTreeItemProps: (node, rendererProps) => ({\n ...rendererProps.getTreeItemProps?.(node),\n decorations: <ModelsTreeIcon node={node} />,\n ...getTreeItemProps?.(node, rendererProps),\n }),\n };\n}\n\nasync function createSearchResultsTree(props: CreateSearchResultsTreeProps<ModelsTreeIdsCache>): Promise<SearchResultsTree<ModelsTreeSearchTargets>> {\n const { searchPaths, imodelAccess } = props;\n return createModelsSearchResultsTree({\n imodelAccess,\n searchPaths,\n });\n}\n\nfunction createTreeSpecificVisibilityHandler(\n props: CreateTreeSpecificVisibilityHandlerProps<ModelsTreeIdsCache> & { overrides?: ModelsTreeVisibilityHandlerOverrides },\n) {\n const { info, getCache, overrideHandler, overrides, viewport } = props;\n return new ModelsTreeVisibilityHandler({\n alwaysAndNeverDrawnElementInfo: info,\n overrideHandler,\n idsCache: getCache(),\n viewport,\n overrides,\n });\n}\n\nfunction getEmptyTreeContentComponent(\n searchText?: string,\n subTreeError?: ModelsTreeSubTreeError,\n error?: ModelsTreeSearchError,\n emptyTreeContent?: React.ReactNode,\n) {\n if (isSubTreeError(subTreeError)) {\n return <SubTreeError base={\"modelsTree\"} error={subTreeError} />;\n }\n if (isInstanceFocusError(error)) {\n return <InstanceFocusError error={error} />;\n }\n if (isSearchError(error)) {\n if (error === \"tooManySearchMatches\") {\n return <TooManySearchMatches base={\"modelsTree\"} />;\n }\n return <SearchUnknownError base={\"modelsTree\"} />;\n }\n if (searchText) {\n return <NoSearchMatches base={\"modelsTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={modelSvg} />;\n}\n\nfunction isSubTreeError(error: ModelsTreeSubTreeError | undefined) {\n return error === \"unknownSubTreeError\";\n}\n\nfunction isSearchError(error: ModelsTreeSearchError | undefined) {\n return error === \"tooManySearchMatches\" || error === \"unknownSearchError\";\n}\n\nfunction isInstanceFocusError(error: ModelsTreeSearchError | undefined): error is \"tooManyInstancesFocused\" | \"unknownInstanceFocusError\" {\n return error === \"tooManyInstancesFocused\" || error === \"unknownInstanceFocusError\";\n}\n\nfunction InstanceFocusError({ error }: { error: ModelsTreeSearchError }) {\n if (error === \"tooManyInstancesFocused\") {\n return <TooManyInstancesFocused base={\"modelsTree\"} />;\n }\n return <UnknownInstanceFocusError base={\"modelsTree\"} />;\n}\n\n/** @beta */\nexport function ModelsTreeIcon({ node }: { node: PresentationHierarchyNode }) {\n if (node.nodeData.extendedData?.imageId === undefined) {\n return undefined;\n }\n\n const getIcon = () => {\n switch (node.nodeData.extendedData!.imageId) {\n case \"icon-layers\":\n return categorySvg;\n case \"icon-item\":\n return elementSvg;\n case \"icon-ec-class\":\n return classSvg;\n case \"icon-folder\":\n return subjectSvg;\n case \"icon-model\":\n return modelSvg;\n default:\n return undefined;\n }\n };\n\n return <Icon href={getIcon()} />;\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ModelsTreeHierarchyConfiguration }>) {\n return new ModelsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig, props.componentId);\n}\n"]}