@itwin/tree-widget-react 3.0.3 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +31 -19
  2. package/README.md +8 -8
  3. package/lib/cjs/components/tree-header/TreeHeader.js +1 -1
  4. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -1
  5. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.js +3 -3
  6. package/lib/cjs/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  7. package/lib/cjs/components/trees/categories-tree/CategoriesVisibilityHandler.js +2 -1
  8. package/lib/cjs/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +1 -1
  9. package/lib/cjs/components/trees/{models-tree/internal → common}/Tooltip.d.ts +7 -3
  10. package/lib/cjs/components/trees/{models-tree/internal → common}/Tooltip.js +5 -5
  11. package/lib/cjs/components/trees/common/Tooltip.js.map +1 -0
  12. package/lib/cjs/components/trees/common/UseActiveViewport.js.map +1 -1
  13. package/lib/cjs/components/trees/common/UseHierarchyVisibility.js +3 -3
  14. package/lib/cjs/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  15. package/lib/cjs/components/trees/common/components/Tree.d.ts +6 -1
  16. package/lib/cjs/components/trees/common/components/Tree.js +14 -4
  17. package/lib/cjs/components/trees/common/components/Tree.js.map +1 -1
  18. package/lib/cjs/components/trees/common/components/TreeNodeCheckbox.js +5 -5
  19. package/lib/cjs/components/trees/common/components/TreeNodeCheckbox.js.map +1 -1
  20. package/lib/cjs/components/trees/common/components/TreeRenderer.d.ts +1 -1
  21. package/lib/cjs/components/trees/common/components/TreeRenderer.js +4 -3
  22. package/lib/cjs/components/trees/common/components/TreeRenderer.js.map +1 -1
  23. package/lib/cjs/components/trees/common/components/TreeRenderer.scss +0 -6
  24. package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +1 -1
  25. package/lib/cjs/components/trees/models-tree/ModelsTree.js +2 -1
  26. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  27. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js +13 -13
  28. package/lib/cjs/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  29. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  30. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  31. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js +1 -1
  32. package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  33. package/lib/cjs/components/trees/models-tree/UseModelsTree.d.ts +12 -3
  34. package/lib/cjs/components/trees/models-tree/UseModelsTree.js +32 -13
  35. package/lib/cjs/components/trees/models-tree/UseModelsTree.js.map +1 -1
  36. package/lib/cjs/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +5 -0
  37. package/lib/cjs/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +28 -7
  38. package/lib/cjs/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
  39. package/lib/cjs/components/trees/models-tree/internal/FilteredTree.d.ts +25 -0
  40. package/lib/cjs/components/trees/models-tree/internal/FilteredTree.js +178 -0
  41. package/lib/cjs/components/trees/models-tree/internal/FilteredTree.js.map +1 -0
  42. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +2 -1
  43. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeIdsCache.js +55 -23
  44. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  45. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeNode.d.ts +12 -6
  46. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeNode.js +18 -1
  47. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeNode.js.map +1 -1
  48. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +8 -8
  49. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +162 -207
  50. package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  51. package/lib/cjs/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +2 -0
  52. package/lib/cjs/components/trees/models-tree/internal/VisibilityChangeEventListener.js +11 -1
  53. package/lib/cjs/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +1 -1
  54. package/lib/esm/components/tree-header/TreeHeader.js +1 -1
  55. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -1
  56. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.js +3 -3
  57. package/lib/esm/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  58. package/lib/esm/components/trees/categories-tree/CategoriesVisibilityHandler.js +2 -1
  59. package/lib/esm/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +1 -1
  60. package/lib/esm/components/trees/{models-tree/internal → common}/Tooltip.d.ts +7 -3
  61. package/lib/esm/components/trees/{models-tree/internal → common}/Tooltip.js +5 -5
  62. package/lib/esm/components/trees/common/Tooltip.js.map +1 -0
  63. package/lib/esm/components/trees/common/UseActiveViewport.js.map +1 -1
  64. package/lib/esm/components/trees/common/UseHierarchyVisibility.js +4 -4
  65. package/lib/esm/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  66. package/lib/esm/components/trees/common/components/Tree.d.ts +6 -1
  67. package/lib/esm/components/trees/common/components/Tree.js +14 -4
  68. package/lib/esm/components/trees/common/components/Tree.js.map +1 -1
  69. package/lib/esm/components/trees/common/components/TreeNodeCheckbox.js +6 -6
  70. package/lib/esm/components/trees/common/components/TreeNodeCheckbox.js.map +1 -1
  71. package/lib/esm/components/trees/common/components/TreeRenderer.d.ts +1 -1
  72. package/lib/esm/components/trees/common/components/TreeRenderer.js +4 -3
  73. package/lib/esm/components/trees/common/components/TreeRenderer.js.map +1 -1
  74. package/lib/esm/components/trees/common/components/TreeRenderer.scss +0 -6
  75. package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +1 -1
  76. package/lib/esm/components/trees/models-tree/ModelsTree.js +2 -1
  77. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  78. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js +14 -14
  79. package/lib/esm/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  80. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -1
  81. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  82. package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  83. package/lib/esm/components/trees/models-tree/UseModelsTree.d.ts +12 -3
  84. package/lib/esm/components/trees/models-tree/UseModelsTree.js +33 -14
  85. package/lib/esm/components/trees/models-tree/UseModelsTree.js.map +1 -1
  86. package/lib/esm/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +5 -0
  87. package/lib/esm/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +29 -8
  88. package/lib/esm/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
  89. package/lib/esm/components/trees/models-tree/internal/FilteredTree.d.ts +25 -0
  90. package/lib/esm/components/trees/models-tree/internal/FilteredTree.js +173 -0
  91. package/lib/esm/components/trees/models-tree/internal/FilteredTree.js.map +1 -0
  92. package/lib/esm/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +2 -1
  93. package/lib/esm/components/trees/models-tree/internal/ModelsTreeIdsCache.js +55 -23
  94. package/lib/esm/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  95. package/lib/esm/components/trees/models-tree/internal/ModelsTreeNode.d.ts +12 -6
  96. package/lib/esm/components/trees/models-tree/internal/ModelsTreeNode.js +17 -0
  97. package/lib/esm/components/trees/models-tree/internal/ModelsTreeNode.js.map +1 -1
  98. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +8 -8
  99. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +161 -206
  100. package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  101. package/lib/esm/components/trees/models-tree/internal/VisibilityChangeEventListener.d.ts +2 -0
  102. package/lib/esm/components/trees/models-tree/internal/VisibilityChangeEventListener.js +11 -1
  103. package/lib/esm/components/trees/models-tree/internal/VisibilityChangeEventListener.js.map +1 -1
  104. package/lib/public/locales/en/TreeWidget.json +47 -43
  105. package/package.json +43 -37
  106. package/lib/cjs/components/trees/models-tree/internal/Tooltip.js.map +0 -1
  107. package/lib/esm/components/trees/models-tree/internal/Tooltip.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../src/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 { defer, from, map, merge, mergeAll, mergeMap } from \"rxjs\";\nimport {\n createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, NodeSelectClauseColumnNames, ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport { collect } from \"../common/Rxjs\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors\";\nimport { createIdsSelector, parseIdsSelectorResult } from \"../common/Utils\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { Observable } from \"rxjs\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type {\n ClassGroupingNodeKey,\n createIModelHierarchyProvider,\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodeIdentifiersPath,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache\";\n\n/** @beta */\nexport type ClassGroupingHierarchyNode = GroupingHierarchyNode & { key: ClassGroupingNodeKey };\n\nconst MAX_FILTERING_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}\n\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: \"BisCore.GeometricElement3d\",\n showEmptyModels: false,\n};\n\ninterface ModelsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\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 ModelsTreeInstanceKeyPathsFromTargetItemsProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n targetItems: Array<InstanceKey | ElementsGroupInfo>;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\ninterface ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n label: string;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\nexport type ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsFromTargetItemsProps | ModelsTreeInstanceKeyPathsFromInstanceLabelProps;\ntype HierarchyProviderProps = Parameters<typeof createIModelHierarchyProvider>[0];\ntype HierarchyFilteringPaths = NonNullable<NonNullable<HierarchyProviderProps[\"filtering\"]>[\"paths\"]>;\ntype HierarchyFilteringPath = HierarchyFilteringPaths[number];\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\nexport class ModelsTreeDefinition implements HierarchyDefinition {\n private _impl: HierarchyDefinition;\n private _idsCache: ModelsTreeIdsCache;\n private _hierarchyConfig: ModelsTreeHierarchyConfiguration;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n private _queryExecutor: LimitingECSqlQueryExecutor;\n private _isSupported?: Promise<boolean>;\n\n public constructor(props: ModelsTreeDefinitionProps) {\n this._impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition(requestProps),\n childNodes: [\n {\n parentInstancesNodePredicate: \"BisCore.Subject\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubjectChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.ISubModeledElement\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricModel3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.SpatialCategory\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSpatialCategoryChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricElement3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricElement3dChildrenQuery(requestProps),\n },\n ],\n },\n });\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 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 // `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 createRootHierarchyLevelDefinition(props: DefineRootHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: props.instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.Subject\",\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: \"BisCore.Subject\",\n }),\n },\n extendedData: {\n imageId: \"icon-imodel-hollow-2\",\n isSubject: true,\n },\n autoExpand: true,\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createSubjectChildrenQuery({\n parentNodeInstanceIds: subjectIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const [subjectFilterClauses, modelFilterClauses] = await Promise.all([\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n }),\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.GeometricModel3d\", alias: \"this\" },\n }),\n ]);\n const [childSubjectIds, childModelIds] = await Promise.all([\n this._idsCache.getChildSubjectIds(subjectIds),\n this._idsCache.getChildSubjectModelIds(subjectIds),\n ]);\n const defs = new Array<HierarchyNodesDefinition>();\n childSubjectIds.length &&\n defs.push({\n fullClassName: \"BisCore.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: \"BisCore.Subject\",\n }),\n },\n hideIfNoChildren: true,\n hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },\n grouping: { byLabel: { action: \"merge\", groupId: \"subject\" } },\n extendedData: {\n imageId: \"icon-folder\",\n isSubject: true,\n },\n supportsFiltering: true,\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 this._idsCache.getParentSubjectIds() },\n ...childSubjectIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n ],\n },\n });\n childModelIds.length &&\n defs.push({\n fullClassName: \"BisCore.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: \"BisCore.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: true,\n })}\n FROM Bis.GeometricModel3d m\n JOIN bis.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: \"BisCore.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 BisCore.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: \"BisCore.SpatialCategory\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.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: \"BisCore.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: true,\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 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 (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\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: true,\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 (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\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: true,\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) {\n if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });\n }\n return createInstanceKeyPathsFromTargetItems(props);\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 return true;\n }\n return false;\n }\n}\n\nfunction createSubjectInstanceKeysPath(subjectId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getSubjectAncestorsPath(subjectId)).pipe(map((idsPath) => idsPath.map((id) => ({ className: \"BisCore.Subject\", id }))));\n}\n\nfunction createModelInstanceKeyPaths(modelId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getModelSubjects(modelId)).pipe(\n mergeAll(),\n mergeMap((modelSubjectId) =>\n createSubjectInstanceKeysPath(modelSubjectId, idsCache).pipe(\n map((subjectPath) => [...subjectPath, { className: \"BisCore.GeometricModel3d\", id: modelId }]),\n ),\n ),\n );\n}\n\nfunction createCategoryInstanceKeyPaths(categoryId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getCategoryModels(categoryId)).pipe(\n mergeAll(),\n mergeMap((categoryModelId) =>\n createModelInstanceKeyPaths(categoryModelId, idsCache).pipe(map((modelPath) => [...modelPath, { className: \"BisCore.SpatialCategory\", id: categoryId }])),\n ),\n );\n}\n\nfunction createGeometricElementInstanceKeyPaths(\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor,\n idsCache: ModelsTreeIdsCache,\n hierarchyConfig: ModelsTreeHierarchyConfiguration,\n targetItems: Array<Id64String | ElementsGroupInfo>,\n): Observable<HierarchyFilteringPath> {\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 bis.GeometricModel3d m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)\n LEFT JOIN bis.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 bis.GeometricModel3d m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN bis.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({ ctes, ecsql }, { rowFormat: \"Indexes\", limit: \"unbounded\" });\n }).pipe(\n map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)),\n mergeMap(({ modelId, elementHierarchyPath, groupingNode }) =>\n createModelInstanceKeyPaths(modelId, idsCache).pipe(\n map((modelPath) => {\n modelPath.pop(); // model is already included in the element hierarchy path\n const path = [...modelPath, ...elementHierarchyPath];\n if (!groupingNode) {\n return path;\n }\n return {\n path,\n options: {\n autoExpand: {\n key: groupingNode.key,\n depth: 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: \"BisCore.SpatialCategory\", id: rowElements[i + 1] });\n break;\n case \"m\":\n path.push({ className: \"BisCore.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\nasync function createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n hierarchyConfig,\n idsCache,\n limit,\n}: ModelsTreeInstanceKeyPathsFromTargetItemsProps): Promise<HierarchyFilteringPath[]> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n const ids = {\n models: new Array<Id64String>(),\n categories: new Array<Id64String>(),\n subjects: new Array<Id64String>(),\n elements: new Array<Id64String | ElementsGroupInfo>(),\n };\n await Promise.all(\n targetItems.map(async (key) => {\n if (\"parent\" in key) {\n ids.elements.push(key);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Subject\")) {\n ids.subjects.push(key.id);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Model\")) {\n ids.models.push(key.id);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.SpatialCategory\")) {\n ids.categories.push(key.id);\n } else {\n ids.elements.push(key.id);\n }\n }),\n );\n const elementBlocks: Array<Array<Id64String | ElementsGroupInfo>> = [];\n const elementsLength = ids.elements.length;\n const blockSize = Math.ceil(elementsLength / Math.ceil(elementsLength / 5000));\n for (let i = 0; i < ids.elements.length; i += blockSize) {\n elementBlocks.push(ids.elements.slice(i, i + blockSize));\n }\n\n return collect(\n merge(\n from(ids.subjects).pipe(mergeMap((id) => createSubjectInstanceKeysPath(id, idsCache))),\n from(ids.models).pipe(mergeMap((id) => createModelInstanceKeyPaths(id, idsCache))),\n from(ids.categories).pipe(mergeMap((id) => createCategoryInstanceKeyPaths(id, idsCache))),\n from(elementBlocks).pipe(mergeMap((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, block))),\n ),\n );\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: ModelsTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory },\n) {\n const elementLabelSelectClause = await props.labelsFactory.createSelectClause({\n classAlias: \"e\",\n className: \"BisCore.Element\",\n // eslint-disable-next-line @typescript-eslint/unbound-method\n selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,\n });\n const targetsReader = props.imodelAccess.createQueryReader(\n {\n ecsql: `\n SELECT *\n FROM (\n SELECT\n ec_classname(e.ECClassId, 's.c'),\n e.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.Element e\n WHERE e.ECClassId IS (BisCore.Subject, BisCore.SpatialCategory, ${props.hierarchyConfig.elementClassSpecification})\n\n UNION ALL\n\n SELECT\n ec_classname(m.ECClassId, 's.c'),\n m.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.GeometricModel3d m\n JOIN BisCore.Element e ON e.ECInstanceId = m.ModeledElement.Id\n WHERE NOT m.IsPrivate\n ${props.hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${props.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_FILTERING_INSTANCE_KEY_COUNT + 1}\n `,\n bindings: [{ type: \"string\", value: props.label.replace(/[%_\\\\]/g, \"\\\\$&\") }],\n },\n { rowFormat: \"Indexes\", restartToken: \"tree-widget/models-tree/filter-by-label-query\", limit: props.limit },\n );\n\n const targetKeys = new Array<InstanceKey>();\n for await (const row of targetsReader) {\n targetKeys.push({ className: row[0], id: row[1] });\n }\n\n return createInstanceKeyPathsFromTargetItems({ ...props, targetItems: targetKeys });\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../src/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 { defer, from, map, merge, mergeAll, mergeMap } from \"rxjs\";\nimport {\n createNodesQueryClauseFactory,\n createPredicateBasedHierarchyDefinition,\n NodeSelectClauseColumnNames,\n ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport { collect } from \"../common/Rxjs\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors\";\nimport { createIdsSelector, parseIdsSelectorResult } from \"../common/Utils\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { Observable } from \"rxjs\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type {\n ClassGroupingNodeKey,\n createIModelHierarchyProvider,\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodeIdentifiersPath,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache\";\n\n/** @beta */\nexport type ClassGroupingHierarchyNode = GroupingHierarchyNode & { key: ClassGroupingNodeKey };\n\nconst MAX_FILTERING_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}\n\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: \"BisCore.GeometricElement3d\",\n showEmptyModels: false,\n};\n\ninterface ModelsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\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 ModelsTreeInstanceKeyPathsFromTargetItemsProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n targetItems: Array<InstanceKey | ElementsGroupInfo>;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\ninterface ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n label: string;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\nexport type ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsFromTargetItemsProps | ModelsTreeInstanceKeyPathsFromInstanceLabelProps;\ntype HierarchyProviderProps = Parameters<typeof createIModelHierarchyProvider>[0];\ntype HierarchyFilteringPaths = NonNullable<NonNullable<HierarchyProviderProps[\"filtering\"]>[\"paths\"]>;\ntype HierarchyFilteringPath = HierarchyFilteringPaths[number];\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\nexport class ModelsTreeDefinition implements HierarchyDefinition {\n private _impl: HierarchyDefinition;\n private _idsCache: ModelsTreeIdsCache;\n private _hierarchyConfig: ModelsTreeHierarchyConfiguration;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n private _queryExecutor: LimitingECSqlQueryExecutor;\n private _isSupported?: Promise<boolean>;\n\n public constructor(props: ModelsTreeDefinitionProps) {\n this._impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition(requestProps),\n childNodes: [\n {\n parentInstancesNodePredicate: \"BisCore.Subject\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubjectChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.ISubModeledElement\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricModel3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.SpatialCategory\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSpatialCategoryChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricElement3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricElement3dChildrenQuery(requestProps),\n },\n ],\n },\n });\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 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 // `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 createRootHierarchyLevelDefinition(props: DefineRootHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: props.instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.Subject\",\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: \"BisCore.Subject\",\n }),\n },\n extendedData: {\n imageId: \"icon-imodel-hollow-2\",\n isSubject: true,\n },\n autoExpand: true,\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createSubjectChildrenQuery({\n parentNodeInstanceIds: subjectIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const [subjectFilterClauses, modelFilterClauses] = await Promise.all([\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n }),\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.GeometricModel3d\", alias: \"this\" },\n }),\n ]);\n const [childSubjectIds, childModelIds] = await Promise.all([\n this._idsCache.getChildSubjectIds(subjectIds),\n this._idsCache.getChildSubjectModelIds(subjectIds),\n ]);\n const defs = new Array<HierarchyNodesDefinition>();\n childSubjectIds.length &&\n defs.push({\n fullClassName: \"BisCore.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: \"BisCore.Subject\",\n }),\n },\n hideIfNoChildren: true,\n hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },\n grouping: { byLabel: { action: \"merge\", groupId: \"subject\" } },\n extendedData: {\n imageId: \"icon-folder\",\n isSubject: true,\n },\n supportsFiltering: true,\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 this._idsCache.getParentSubjectIds() },\n ...childSubjectIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n ],\n },\n });\n childModelIds.length &&\n defs.push({\n fullClassName: \"BisCore.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: \"BisCore.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: true,\n })}\n FROM Bis.GeometricModel3d m\n JOIN bis.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: \"BisCore.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 BisCore.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: \"BisCore.SpatialCategory\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.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: \"BisCore.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: true,\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 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 (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\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: true,\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 (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\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: true,\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) {\n if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });\n }\n return createInstanceKeyPathsFromTargetItems(props);\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 return true;\n }\n return false;\n }\n}\n\nfunction createSubjectInstanceKeysPath(subjectId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getSubjectAncestorsPath(subjectId)).pipe(map((idsPath) => idsPath.map((id) => ({ className: \"BisCore.Subject\", id }))));\n}\n\nfunction createModelInstanceKeyPaths(modelId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getModelSubjects(modelId)).pipe(\n mergeAll(),\n mergeMap((modelSubjectId) =>\n createSubjectInstanceKeysPath(modelSubjectId, idsCache).pipe(\n map((subjectPath) => [...subjectPath, { className: \"BisCore.GeometricModel3d\", id: modelId }]),\n ),\n ),\n );\n}\n\nfunction createCategoryInstanceKeyPaths(categoryId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getCategoryModels(categoryId)).pipe(\n mergeAll(),\n mergeMap((categoryModelId) =>\n createModelInstanceKeyPaths(categoryModelId, idsCache).pipe(map((modelPath) => [...modelPath, { className: \"BisCore.SpatialCategory\", id: categoryId }])),\n ),\n );\n}\n\nfunction createGeometricElementInstanceKeyPaths(\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor,\n idsCache: ModelsTreeIdsCache,\n hierarchyConfig: ModelsTreeHierarchyConfiguration,\n targetItems: Array<Id64String | ElementsGroupInfo>,\n): Observable<HierarchyFilteringPath> {\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 bis.GeometricModel3d m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)\n LEFT JOIN bis.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 bis.GeometricModel3d m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN bis.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({ ctes, ecsql }, { rowFormat: \"Indexes\", limit: \"unbounded\" });\n }).pipe(\n map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)),\n mergeMap(({ modelId, elementHierarchyPath, groupingNode }) =>\n createModelInstanceKeyPaths(modelId, idsCache).pipe(\n map((modelPath) => {\n modelPath.pop(); // model is already included in the element hierarchy path\n const path = [...modelPath, ...elementHierarchyPath];\n if (!groupingNode) {\n return path;\n }\n return {\n path,\n options: {\n autoExpand: {\n key: groupingNode.key,\n depth: 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: \"BisCore.SpatialCategory\", id: rowElements[i + 1] });\n break;\n case \"m\":\n path.push({ className: \"BisCore.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\nasync function createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n hierarchyConfig,\n idsCache,\n limit,\n}: ModelsTreeInstanceKeyPathsFromTargetItemsProps): Promise<HierarchyFilteringPath[]> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n const ids = {\n models: new Array<Id64String>(),\n categories: new Array<Id64String>(),\n subjects: new Array<Id64String>(),\n elements: new Array<Id64String | ElementsGroupInfo>(),\n };\n await Promise.all(\n targetItems.map(async (key) => {\n if (\"parent\" in key) {\n ids.elements.push(key);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Subject\")) {\n ids.subjects.push(key.id);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Model\")) {\n ids.models.push(key.id);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.SpatialCategory\")) {\n ids.categories.push(key.id);\n } else {\n ids.elements.push(key.id);\n }\n }),\n );\n const elementBlocks: Array<Array<Id64String | ElementsGroupInfo>> = [];\n const elementsLength = ids.elements.length;\n const blockSize = Math.ceil(elementsLength / Math.ceil(elementsLength / 5000));\n for (let i = 0; i < ids.elements.length; i += blockSize) {\n elementBlocks.push(ids.elements.slice(i, i + blockSize));\n }\n\n return collect(\n merge(\n from(ids.subjects).pipe(mergeMap((id) => createSubjectInstanceKeysPath(id, idsCache))),\n from(ids.models).pipe(mergeMap((id) => createModelInstanceKeyPaths(id, idsCache))),\n from(ids.categories).pipe(mergeMap((id) => createCategoryInstanceKeyPaths(id, idsCache))),\n from(elementBlocks).pipe(mergeMap((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, block))),\n ),\n );\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: ModelsTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory },\n) {\n const elementLabelSelectClause = await props.labelsFactory.createSelectClause({\n classAlias: \"e\",\n className: \"BisCore.Element\",\n // eslint-disable-next-line @typescript-eslint/unbound-method\n selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,\n });\n const targetsReader = props.imodelAccess.createQueryReader(\n {\n ecsql: `\n SELECT *\n FROM (\n SELECT\n ec_classname(e.ECClassId, 's.c'),\n e.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.Element e\n WHERE e.ECClassId IS (BisCore.Subject, BisCore.SpatialCategory, ${props.hierarchyConfig.elementClassSpecification})\n\n UNION ALL\n\n SELECT\n ec_classname(m.ECClassId, 's.c'),\n m.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.GeometricModel3d m\n JOIN BisCore.Element e ON e.ECInstanceId = m.ModeledElement.Id\n WHERE NOT m.IsPrivate\n ${props.hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${props.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_FILTERING_INSTANCE_KEY_COUNT + 1}\n `,\n bindings: [{ type: \"string\", value: props.label.replace(/[%_\\\\]/g, \"\\\\$&\") }],\n },\n { rowFormat: \"Indexes\", restartToken: \"tree-widget/models-tree/filter-by-label-query\", limit: props.limit },\n );\n\n const targetKeys = new Array<InstanceKey>();\n for await (const row of targetsReader) {\n targetKeys.push({ className: row[0], id: row[1] });\n }\n\n return createInstanceKeyPathsFromTargetItems({ ...props, targetItems: targetKeys });\n}\n"]}
@@ -1,7 +1,8 @@
1
- import type { Id64String } from "@itwin/core-bentley";
2
1
  import type { HierarchyFilteringPath } from "@itwin/presentation-hierarchies";
2
+ import type { Id64String } from "@itwin/core-bentley";
3
3
  import type { InstanceKey } from "@itwin/presentation-shared";
4
4
  import type { Viewport } from "@itwin/core-frontend";
5
+ import type { PresentationHierarchyNode } from "@itwin/presentation-hierarchies-react";
5
6
  import type { ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from "./ModelsTreeDefinition";
6
7
  import type { ModelsTreeVisibilityHandlerOverrides } from "./internal/ModelsTreeVisibilityHandler";
7
8
  import type { VisibilityTreeProps } from "../common/components/VisibilityTree";
@@ -20,16 +21,24 @@ export interface UseModelsTreeProps {
20
21
  }) => Promise<HierarchyFilteringPath[]>;
21
22
  }) => Promise<HierarchyFilteringPath[]>;
22
23
  onModelsFiltered?: (modelIds: Id64String[] | undefined) => void;
24
+ /**
25
+ * An optional predicate to allow or prohibit selection of a node.
26
+ * When not supplied, all nodes are selectable.
27
+ */
28
+ selectionPredicate?: (props: {
29
+ node: PresentationHierarchyNode;
30
+ type: "subject" | "model" | "category" | "element" | "elements-class-group";
31
+ }) => boolean;
23
32
  }
24
33
  /** @beta */
25
34
  interface UseModelsTreeResult {
26
- modelsTreeProps: Pick<VisibilityTreeProps, "treeName" | "getHierarchyDefinition" | "getFilteredPaths" | "visibilityHandlerFactory" | "highlight" | "noDataMessage">;
35
+ modelsTreeProps: Pick<VisibilityTreeProps, "treeName" | "getHierarchyDefinition" | "getFilteredPaths" | "visibilityHandlerFactory" | "highlight" | "noDataMessage" | "selectionPredicate">;
27
36
  rendererProps: Required<Pick<VisibilityTreeRendererProps, "getIcon" | "onNodeDoubleClick">>;
28
37
  }
29
38
  /**
30
39
  * Custom hook to create and manage state for the models tree.
31
40
  * @beta
32
41
  */
33
- export declare function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerOverrides, getFilteredPaths, onModelsFiltered, }: UseModelsTreeProps): UseModelsTreeResult;
42
+ export declare function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerOverrides, getFilteredPaths, onModelsFiltered, selectionPredicate: nodeTypeSelectionPredicate, }: UseModelsTreeProps): UseModelsTreeResult;
34
43
  export {};
35
44
  //# sourceMappingURL=UseModelsTree.d.ts.map
@@ -18,13 +18,14 @@ const TreeErrors_1 = require("../common/TreeErrors");
18
18
  const UseIModelChangeListener_1 = require("../common/UseIModelChangeListener");
19
19
  const UseTelemetryContext_1 = require("../common/UseTelemetryContext");
20
20
  const ModelsTreeIdsCache_1 = require("./internal/ModelsTreeIdsCache");
21
+ const ModelsTreeNode_1 = require("./internal/ModelsTreeNode");
21
22
  const ModelsTreeVisibilityHandler_1 = require("./internal/ModelsTreeVisibilityHandler");
22
23
  const ModelsTreeDefinition_1 = require("./ModelsTreeDefinition");
23
24
  /**
24
25
  * Custom hook to create and manage state for the models tree.
25
26
  * @beta
26
27
  */
27
- function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerOverrides, getFilteredPaths, onModelsFiltered, }) {
28
+ function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerOverrides, getFilteredPaths, onModelsFiltered, selectionPredicate: nodeTypeSelectionPredicate, }) {
28
29
  const [filteringError, setFilteringError] = (0, react_1.useState)(undefined);
29
30
  const hierarchyConfiguration = (0, react_1.useMemo)(() => ({
30
31
  ...ModelsTreeDefinition_1.defaultHierarchyConfiguration,
@@ -33,7 +34,7 @@ function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerO
33
34
  // eslint-disable-next-line react-hooks/exhaustive-deps
34
35
  Object.values(hierarchyConfig ?? {}));
35
36
  const { onFeatureUsed } = (0, UseTelemetryContext_1.useTelemetryContext)();
36
- const { getModelsTreeIdsCache, visibilityHandlerFactory } = useCachedVisibility(activeView, hierarchyConfiguration, visibilityHandlerOverrides);
37
+ const { getModelsTreeIdsCache, visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility(activeView, hierarchyConfiguration, visibilityHandlerOverrides);
37
38
  const { loadFocusedItems } = (0, FocusedInstancesContext_1.useFocusedInstancesContext)();
38
39
  const getHierarchyDefinition = (0, react_1.useCallback)(({ imodelAccess }) => new ModelsTreeDefinition_1.ModelsTreeDefinition({ imodelAccess, idsCache: getModelsTreeIdsCache(), hierarchyConfig: hierarchyConfiguration }), [getModelsTreeIdsCache, hierarchyConfiguration]);
39
40
  const onNodeDoubleClick = (0, react_1.useCallback)(async ({ nodeData, extendedData }) => {
@@ -47,7 +48,12 @@ function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerO
47
48
  const getPaths = (0, react_1.useMemo)(() => {
48
49
  setFilteringError(undefined);
49
50
  onModelsFiltered?.(undefined);
51
+ // reset filtered paths if there is no filters applied. This allows to keep current filtered paths until new paths are loaded.
52
+ if (!loadFocusedItems && !getFilteredPaths && !filter) {
53
+ onFilteredPathsChanged(undefined);
54
+ }
50
55
  const handlePaths = async (filteredPaths, classInspector) => {
56
+ onFilteredPathsChanged(filteredPaths);
51
57
  if (!onModelsFiltered) {
52
58
  return;
53
59
  }
@@ -129,7 +135,13 @@ function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerO
129
135
  };
130
136
  }
131
137
  return undefined;
132
- }, [filter, loadFocusedItems, getModelsTreeIdsCache, onFeatureUsed, getFilteredPaths, hierarchyConfiguration, onModelsFiltered]);
138
+ }, [filter, loadFocusedItems, getModelsTreeIdsCache, onFeatureUsed, getFilteredPaths, hierarchyConfiguration, onModelsFiltered, onFilteredPathsChanged]);
139
+ const nodeSelectionPredicate = (0, react_1.useCallback)((node) => {
140
+ if (!nodeTypeSelectionPredicate) {
141
+ return true;
142
+ }
143
+ return nodeTypeSelectionPredicate({ node, type: ModelsTreeNode_1.ModelsTreeNode.getType(node.nodeData) });
144
+ }, [nodeTypeSelectionPredicate]);
133
145
  return {
134
146
  modelsTreeProps: {
135
147
  treeName: "models-tree-v2",
@@ -138,6 +150,7 @@ function useModelsTree({ activeView, filter, hierarchyConfig, visibilityHandlerO
138
150
  getFilteredPaths: getPaths,
139
151
  noDataMessage: getNoDataMessage(filter, filteringError),
140
152
  highlight: filter ? { text: filter } : undefined,
153
+ selectionPredicate: nodeSelectionPredicate,
141
154
  },
142
155
  rendererProps: {
143
156
  onNodeDoubleClick,
@@ -216,38 +229,44 @@ function getIcon(node) {
216
229
  }
217
230
  return undefined;
218
231
  }
219
- function createVisibilityHandlerFactory(activeView, idsCacheGetter, overrides) {
220
- return ({ imodelAccess }) => (0, ModelsTreeVisibilityHandler_1.createModelsTreeVisibilityHandler)({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, overrides });
232
+ function createVisibilityHandlerFactory(activeView, idsCacheGetter, overrides, filteredPaths) {
233
+ return ({ imodelAccess }) => (0, ModelsTreeVisibilityHandler_1.createModelsTreeVisibilityHandler)({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, overrides, filteredPaths });
221
234
  }
222
235
  function useCachedVisibility(activeView, hierarchyConfig, overrides) {
223
236
  const cacheRef = (0, react_1.useRef)();
224
237
  const currentIModelRef = (0, react_1.useRef)(activeView.iModel);
238
+ const resetModelsTreeIdsCache = () => {
239
+ cacheRef.current?.[Symbol.dispose]();
240
+ cacheRef.current = undefined;
241
+ };
225
242
  const getModelsTreeIdsCache = (0, react_1.useCallback)(() => {
226
243
  if (!cacheRef.current) {
227
244
  cacheRef.current = new ModelsTreeIdsCache_1.ModelsTreeIdsCache((0, presentation_core_interop_1.createECSqlQueryExecutor)(currentIModelRef.current), hierarchyConfig);
228
245
  }
229
246
  return cacheRef.current;
230
247
  }, [hierarchyConfig]);
231
- const [visibilityHandlerFactory, setVisibilityHandlerFactory] = (0, react_1.useState)(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides));
248
+ const [filteredPaths, setFilteredPaths] = (0, react_1.useState)();
249
+ const [visibilityHandlerFactory, setVisibilityHandlerFactory] = (0, react_1.useState)(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));
232
250
  (0, UseIModelChangeListener_1.useIModelChangeListener)({
233
251
  imodel: activeView.iModel,
234
252
  action: (0, react_1.useCallback)(() => {
235
- cacheRef.current = undefined;
236
- setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides));
237
- }, [activeView, getModelsTreeIdsCache, overrides]),
253
+ resetModelsTreeIdsCache();
254
+ setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));
255
+ }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]),
238
256
  });
239
257
  (0, react_1.useEffect)(() => {
240
258
  currentIModelRef.current = activeView.iModel;
241
- cacheRef.current = undefined;
242
- setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides));
243
- }, [activeView, getModelsTreeIdsCache, overrides]);
259
+ setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));
260
+ return () => resetModelsTreeIdsCache();
261
+ }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]);
244
262
  return {
245
263
  getModelsTreeIdsCache,
246
264
  visibilityHandlerFactory,
265
+ onFilteredPathsChanged: (0, react_1.useCallback)((paths) => setFilteredPaths(paths), []),
247
266
  };
248
267
  }
249
268
  function SvgClassGrouping() {
250
- return ((0, jsx_runtime_1.jsx)(itwinui_react_1.Icon, { children: (0, jsx_runtime_1.jsx)("svg", { id: "Calque_1", "data-name": "Calque 1", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", children: (0, jsx_runtime_1.jsx)("path", { d: "M8.00933,0,0,3.97672V11.986L8.00933,16,16,11.93V3.97651ZM1.66173,11.27642c-.26155.03734-.59754-.26154-.76553-.69085-.168-.41066-.09334-.784.168-.82152.26154-.03734.59754.26154.76553.67219C1.99772,10.86577,1.92306,11.23909,1.66173,11.27642Zm0-3.32319c-.26155.03733-.59754-.28-.76553-.69086-.168-.42932-.09334-.80285.168-.84.26133-.03733.59754.28.76532.69086C1.99772,7.54236,1.92306,7.89723,1.66173,7.95323Zm4.31276,5.52621a.18186.18186,0,0,1-.16821-.01866L3.41657,12.15394a.94275.94275,0,0,1-.29887-.80285c.03754-.33621.22421-.52265.41108-.41066L5.9185,12.24727a.88656.88656,0,0,1,.28.80285A.5057.5057,0,0,1,5.97449,13.47944Zm0-3.37919a.18184.18184,0,0,1-.16821-.01867L3.41657,8.77475a.943.943,0,0,1-.29887-.80286c.03754-.3362.22421-.52286.41108-.42953L5.9185,8.86786a.83112.83112,0,0,1,.28.78419A.51684.51684,0,0,1,5.97449,10.10025Z" }) }) }));
269
+ return ((0, jsx_runtime_1.jsx)("svg", { id: "Calque_1", "data-name": "Calque 1", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", children: (0, jsx_runtime_1.jsx)("path", { d: "M8.00933,0,0,3.97672V11.986L8.00933,16,16,11.93V3.97651ZM1.66173,11.27642c-.26155.03734-.59754-.26154-.76553-.69085-.168-.41066-.09334-.784.168-.82152.26154-.03734.59754.26154.76553.67219C1.99772,10.86577,1.92306,11.23909,1.66173,11.27642Zm0-3.32319c-.26155.03733-.59754-.28-.76553-.69086-.168-.42932-.09334-.80285.168-.84.26133-.03733.59754.28.76532.69086C1.99772,7.54236,1.92306,7.89723,1.66173,7.95323Zm4.31276,5.52621a.18186.18186,0,0,1-.16821-.01866L3.41657,12.15394a.94275.94275,0,0,1-.29887-.80285c.03754-.33621.22421-.52265.41108-.41066L5.9185,12.24727a.88656.88656,0,0,1,.28.80285A.5057.5057,0,0,1,5.97449,13.47944Zm0-3.37919a.18184.18184,0,0,1-.16821-.01867L3.41657,8.77475a.943.943,0,0,1-.29887-.80286c.03754-.3362.22421-.52286.41108-.42953L5.9185,8.86786a.83112.83112,0,0,1,.28.78419A.51684.51684,0,0,1,5.97449,10.10025Z" }) }));
251
270
  }
252
271
  async function collectFocusedItems(loadFocusedItems) {
253
272
  const focusedItems = [];
@@ -1 +1 @@
1
- {"version":3,"file":"UseModelsTree.js","sourceRoot":"","sources":["../../../../../src/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, useEffect, useMemo, useRef, useState } from \"react\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { SvgFolder, SvgImodelHollow, SvgItem, SvgLayers, SvgModel } from \"@itwin/itwinui-icons-react\";\nimport { Anchor, Icon, Text } from \"@itwin/itwinui-react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport { HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { useFocusedInstancesContext } from \"../common/FocusedInstancesContext\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors\";\nimport { useIModelChangeListener } from \"../common/UseIModelChangeListener\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext\";\nimport { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache\";\nimport { createModelsTreeVisibilityHandler } from \"./internal/ModelsTreeVisibilityHandler\";\nimport { defaultHierarchyConfiguration, ModelsTreeDefinition } from \"./ModelsTreeDefinition\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { GroupingHierarchyNode, HierarchyFilteringPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { ReactElement } from \"react\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { ClassGroupingHierarchyNode, ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from \"./ModelsTreeDefinition\";\nimport type { ModelsTreeVisibilityHandlerOverrides } from \"./internal/ModelsTreeVisibilityHandler\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer\";\n\ntype ModelsTreeFilteringError = \"tooManyFilterMatches\" | \"tooManyInstancesFocused\" | \"unknownFilterError\" | \"unknownInstanceFocusError\";\n\n/** @beta */\nexport interface UseModelsTreeProps {\n filter?: string;\n activeView: Viewport;\n hierarchyConfig?: Partial<ModelsTreeHierarchyConfiguration>;\n visibilityHandlerOverrides?: ModelsTreeVisibilityHandlerOverrides;\n getFilteredPaths?: (props: {\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> } | { label: string }) => Promise<HierarchyFilteringPath[]>;\n }) => Promise<HierarchyFilteringPath[]>;\n onModelsFiltered?: (modelIds: Id64String[] | undefined) => void;\n}\n\n/** @beta */\ninterface UseModelsTreeResult {\n modelsTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"getFilteredPaths\" | \"visibilityHandlerFactory\" | \"highlight\" | \"noDataMessage\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getIcon\" | \"onNodeDoubleClick\">>;\n}\n\n/**\n * Custom hook to create and manage state for the models tree.\n * @beta\n */\nexport function useModelsTree({\n activeView,\n filter,\n hierarchyConfig,\n visibilityHandlerOverrides,\n getFilteredPaths,\n onModelsFiltered,\n}: UseModelsTreeProps): UseModelsTreeResult {\n const [filteringError, setFilteringError] = useState<ModelsTreeFilteringError | undefined>(undefined);\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 { onFeatureUsed } = useTelemetryContext();\n\n const { getModelsTreeIdsCache, visibilityHandlerFactory } = useCachedVisibility(activeView, hierarchyConfiguration, visibilityHandlerOverrides);\n const { loadFocusedItems } = useFocusedInstancesContext();\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n ({ imodelAccess }) => new ModelsTreeDefinition({ imodelAccess, idsCache: getModelsTreeIdsCache(), hierarchyConfig: hierarchyConfiguration }),\n [getModelsTreeIdsCache, hierarchyConfiguration],\n );\n\n const onNodeDoubleClick = useCallback(\n async ({ nodeData, extendedData }: PresentationHierarchyNode) => {\n if (!HierarchyNode.isInstancesNode(nodeData) || (extendedData && (extendedData.isSubject || extendedData.isModel || extendedData.isCategory))) {\n return;\n }\n const instanceIds = nodeData.key.instanceKeys.map((instanceKey) => instanceKey.id);\n await IModelApp.viewManager.selectedView?.zoomToElements(instanceIds);\n onFeatureUsed({ featureId: \"zoom-to-node\", reportInteraction: false });\n },\n [onFeatureUsed],\n );\n\n const getPaths = useMemo<VisibilityTreeProps[\"getFilteredPaths\"] | undefined>(() => {\n setFilteringError(undefined);\n onModelsFiltered?.(undefined);\n\n const handlePaths = async (filteredPaths: HierarchyFilteringPath[], classInspector: ECClassHierarchyInspector) => {\n if (!onModelsFiltered) {\n return;\n }\n\n const modelIds = await getModels(filteredPaths, getModelsTreeIdsCache(), classInspector);\n onModelsFiltered(modelIds);\n };\n\n if (loadFocusedItems) {\n return async ({ imodelAccess }) => {\n try {\n const focusedItems = await collectFocusedItems(loadFocusedItems);\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n idsCache: getModelsTreeIdsCache(),\n targetItems: focusedItems,\n hierarchyConfig: hierarchyConfiguration,\n });\n void handlePaths(paths, imodelAccess);\n return paths.map((path) => (\"path\" in path ? path : { path, options: { autoExpand: true } }));\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyInstancesFocused\" : \"unknownInstanceFocusError\";\n if (newError !== \"tooManyInstancesFocused\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }\n\n if (getFilteredPaths) {\n return async ({ imodelAccess }) => {\n try {\n const paths = await getFilteredPaths({\n createInstanceKeyPaths: async (props) =>\n ModelsTreeDefinition.createInstanceKeyPaths({\n ...props,\n imodelAccess,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n limit: \"unbounded\",\n }),\n });\n void handlePaths(paths, imodelAccess);\n return paths;\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyFilterMatches\" : \"unknownFilterError\";\n if (newError !== \"tooManyFilterMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }\n\n if (filter) {\n return async ({ imodelAccess }) => {\n onFeatureUsed({ featureId: \"filtering\", reportInteraction: true });\n try {\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n label: filter,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n });\n void handlePaths(paths, imodelAccess);\n return paths.map((path) => (\"path\" in path ? path : { path, options: { autoExpand: true } }));\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyFilterMatches\" : \"unknownFilterError\";\n if (newError !== \"tooManyFilterMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }\n return undefined;\n }, [filter, loadFocusedItems, getModelsTreeIdsCache, onFeatureUsed, getFilteredPaths, hierarchyConfiguration, onModelsFiltered]);\n\n return {\n modelsTreeProps: {\n treeName: \"models-tree-v2\",\n visibilityHandlerFactory,\n getHierarchyDefinition,\n getFilteredPaths: getPaths,\n noDataMessage: getNoDataMessage(filter, filteringError),\n highlight: filter ? { text: filter } : undefined,\n },\n rendererProps: {\n onNodeDoubleClick,\n getIcon,\n },\n };\n}\n\nasync function getModels(paths: HierarchyFilteringPath[], idsCache: ModelsTreeIdsCache, classInspector: ECClassHierarchyInspector) {\n if (!paths) {\n return undefined;\n }\n\n const targetModels = new Set<Id64String>();\n const targetSubjects = new Set<Id64String>();\n for (const path of paths) {\n const currPath = Array.isArray(path) ? path : path.path;\n for (let i = 0; i < currPath.length; i++) {\n const currStep = currPath[i];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(currStep)) {\n break;\n }\n\n // if paths end with subject need to get all models under that subject\n if (i === currPath.length - 1 && currStep.className === \"BisCore.Subject\") {\n targetSubjects.add(currStep.id);\n break;\n }\n\n // collect all the models from the filtered path\n if (await classInspector.classDerivesFrom(currStep.className, \"BisCore.GeometricModel3d\")) {\n targetModels.add(currStep.id);\n }\n }\n }\n\n const matchingModels = await idsCache.getSubjectModelIds([...targetSubjects]);\n return [...targetModels, ...matchingModels];\n}\n\nfunction getNoDataMessage(filter?: string, error?: ModelsTreeFilteringError) {\n if (isInstanceFocusError(error)) {\n return <InstanceFocusError error={error!} />;\n }\n if (isFilterError(error)) {\n return <Text>{TreeWidget.translate(`modelsTree.filtering.${error}`)}</Text>;\n }\n if (filter) {\n return <Text>{TreeWidget.translate(\"modelsTree.filtering.noMatches\", { filter })}</Text>;\n }\n return undefined;\n}\n\nfunction isFilterError(error: ModelsTreeFilteringError | undefined) {\n return error === \"tooManyFilterMatches\" || error === \"unknownFilterError\";\n}\n\nfunction isInstanceFocusError(error: ModelsTreeFilteringError | undefined) {\n return error === \"tooManyInstancesFocused\" || error === \"unknownInstanceFocusError\";\n}\n\nfunction InstanceFocusError({ error }: { error: ModelsTreeFilteringError }) {\n const { toggle } = useFocusedInstancesContext();\n const localizedMessage = createLocalizedMessage(TreeWidget.translate(`modelsTree.filtering.${error}`), () => toggle());\n return <Text>{localizedMessage}</Text>;\n}\n\nfunction getIcon(node: PresentationHierarchyNode): ReactElement | undefined {\n if (node.extendedData?.imageId === undefined) {\n return undefined;\n }\n\n switch (node.extendedData.imageId) {\n case \"icon-layers\":\n return <SvgLayers />;\n case \"icon-item\":\n return <SvgItem />;\n case \"icon-ec-class\":\n return <SvgClassGrouping />;\n case \"icon-imodel-hollow-2\":\n return <SvgImodelHollow />;\n case \"icon-folder\":\n return <SvgFolder />;\n case \"icon-model\":\n return <SvgModel />;\n }\n\n return undefined;\n}\n\nfunction createVisibilityHandlerFactory(\n activeView: Viewport,\n idsCacheGetter: () => ModelsTreeIdsCache,\n overrides?: ModelsTreeVisibilityHandlerOverrides,\n): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n return ({ imodelAccess }) => createModelsTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, overrides });\n}\n\nfunction useCachedVisibility(activeView: Viewport, hierarchyConfig: ModelsTreeHierarchyConfiguration, overrides?: ModelsTreeVisibilityHandlerOverrides) {\n const cacheRef = useRef<ModelsTreeIdsCache>();\n const currentIModelRef = useRef(activeView.iModel);\n\n const getModelsTreeIdsCache = useCallback(() => {\n if (!cacheRef.current) {\n cacheRef.current = new ModelsTreeIdsCache(createECSqlQueryExecutor(currentIModelRef.current), hierarchyConfig);\n }\n return cacheRef.current;\n }, [hierarchyConfig]);\n\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides));\n\n useIModelChangeListener({\n imodel: activeView.iModel,\n action: useCallback(() => {\n cacheRef.current = undefined;\n setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides));\n }, [activeView, getModelsTreeIdsCache, overrides]),\n });\n\n useEffect(() => {\n currentIModelRef.current = activeView.iModel;\n cacheRef.current = undefined;\n setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides));\n }, [activeView, getModelsTreeIdsCache, overrides]);\n\n return {\n getModelsTreeIdsCache,\n visibilityHandlerFactory,\n };\n}\n\nfunction SvgClassGrouping() {\n return (\n <Icon>\n <svg id=\"Calque_1\" data-name=\"Calque 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <path d=\"M8.00933,0,0,3.97672V11.986L8.00933,16,16,11.93V3.97651ZM1.66173,11.27642c-.26155.03734-.59754-.26154-.76553-.69085-.168-.41066-.09334-.784.168-.82152.26154-.03734.59754.26154.76553.67219C1.99772,10.86577,1.92306,11.23909,1.66173,11.27642Zm0-3.32319c-.26155.03733-.59754-.28-.76553-.69086-.168-.42932-.09334-.80285.168-.84.26133-.03733.59754.28.76532.69086C1.99772,7.54236,1.92306,7.89723,1.66173,7.95323Zm4.31276,5.52621a.18186.18186,0,0,1-.16821-.01866L3.41657,12.15394a.94275.94275,0,0,1-.29887-.80285c.03754-.33621.22421-.52265.41108-.41066L5.9185,12.24727a.88656.88656,0,0,1,.28.80285A.5057.5057,0,0,1,5.97449,13.47944Zm0-3.37919a.18184.18184,0,0,1-.16821-.01867L3.41657,8.77475a.943.943,0,0,1-.29887-.80286c.03754-.3362.22421-.52286.41108-.42953L5.9185,8.86786a.83112.83112,0,0,1,.28.78419A.51684.51684,0,0,1,5.97449,10.10025Z\" />\n </svg>\n </Icon>\n );\n}\n\nasync function collectFocusedItems(loadFocusedItems: () => AsyncIterableIterator<InstanceKey | GroupingHierarchyNode>) {\n const focusedItems: Array<InstanceKey | ElementsGroupInfo> = [];\n const groupingNodeInfos: Array<{\n parentKey: InstancesNodeKey;\n parentType: \"element\" | \"category\";\n groupingNode: ClassGroupingHierarchyNode;\n modelIds: Id64String[];\n }> = [];\n for await (const key of loadFocusedItems()) {\n if (\"id\" in key) {\n focusedItems.push(key);\n continue;\n }\n\n if (!HierarchyNodeKey.isClassGrouping(key.key)) {\n continue;\n }\n\n const groupingNode = key as ClassGroupingHierarchyNode;\n if (!groupingNode.nonGroupingAncestor || !HierarchyNodeKey.isInstances(groupingNode.nonGroupingAncestor.key)) {\n continue;\n }\n\n const parentKey = groupingNode.nonGroupingAncestor.key;\n const type = groupingNode.nonGroupingAncestor.extendedData?.isCategory ? \"category\" : \"element\";\n const modelIds = ((groupingNode.nonGroupingAncestor.extendedData?.modelIds as Id64String[][]) ?? []).flatMap((ids) => ids);\n groupingNodeInfos.push({ groupingNode, parentType: type, parentKey, modelIds });\n }\n focusedItems.push(\n ...groupingNodeInfos.map(({ parentKey, parentType, groupingNode, modelIds }) => ({\n parent:\n parentType === \"element\"\n ? { type: \"element\" as const, ids: parentKey.instanceKeys.map((key) => key.id) }\n : { type: \"category\" as const, ids: parentKey.instanceKeys.map((key) => key.id), modelIds },\n groupingNode,\n })),\n );\n return focusedItems;\n}\n\nfunction createLocalizedMessage(message: string, onClick?: () => void) {\n const exp = new RegExp(\"<link>(.*)</link>\");\n const match = message.match(exp);\n if (!match) {\n return message;\n }\n\n const [fullText, innerText] = match;\n const [textBefore, textAfter] = message.split(fullText);\n\n return (\n <>\n {textBefore ? textBefore : null}\n <Anchor\n underline\n onClick={(e) => {\n e.stopPropagation();\n onClick?.();\n }}\n >\n {innerText}\n </Anchor>\n {textAfter ? textAfter : null}\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"UseModelsTree.js","sourceRoot":"","sources":["../../../../../src/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, useEffect, useMemo, useRef, useState } from \"react\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { SvgFolder, SvgImodelHollow, SvgItem, SvgLayers, SvgModel } from \"@itwin/itwinui-icons-react\";\nimport { Anchor, Text } from \"@itwin/itwinui-react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport { HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { useFocusedInstancesContext } from \"../common/FocusedInstancesContext\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors\";\nimport { useIModelChangeListener } from \"../common/UseIModelChangeListener\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext\";\nimport { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache\";\nimport { ModelsTreeNode } from \"./internal/ModelsTreeNode\";\nimport { createModelsTreeVisibilityHandler } from \"./internal/ModelsTreeVisibilityHandler\";\nimport { defaultHierarchyConfiguration, ModelsTreeDefinition } from \"./ModelsTreeDefinition\";\n\nimport type { GroupingHierarchyNode, HierarchyFilteringPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { ReactElement } from \"react\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { ClassGroupingHierarchyNode, ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from \"./ModelsTreeDefinition\";\nimport type { ModelsTreeVisibilityHandlerOverrides } from \"./internal/ModelsTreeVisibilityHandler\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer\";\n\ntype ModelsTreeFilteringError = \"tooManyFilterMatches\" | \"tooManyInstancesFocused\" | \"unknownFilterError\" | \"unknownInstanceFocusError\";\n\n/** @beta */\nexport interface UseModelsTreeProps {\n filter?: string;\n activeView: Viewport;\n hierarchyConfig?: Partial<ModelsTreeHierarchyConfiguration>;\n visibilityHandlerOverrides?: ModelsTreeVisibilityHandlerOverrides;\n getFilteredPaths?: (props: {\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> } | { label: string }) => Promise<HierarchyFilteringPath[]>;\n }) => Promise<HierarchyFilteringPath[]>;\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}\n\n/** @beta */\ninterface UseModelsTreeResult {\n modelsTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"getFilteredPaths\" | \"visibilityHandlerFactory\" | \"highlight\" | \"noDataMessage\" | \"selectionPredicate\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getIcon\" | \"onNodeDoubleClick\">>;\n}\n\n/**\n * Custom hook to create and manage state for the models tree.\n * @beta\n */\nexport function useModelsTree({\n activeView,\n filter,\n hierarchyConfig,\n visibilityHandlerOverrides,\n getFilteredPaths,\n onModelsFiltered,\n selectionPredicate: nodeTypeSelectionPredicate,\n}: UseModelsTreeProps): UseModelsTreeResult {\n const [filteringError, setFilteringError] = useState<ModelsTreeFilteringError | undefined>(undefined);\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 { onFeatureUsed } = useTelemetryContext();\n\n const { getModelsTreeIdsCache, visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility(\n activeView,\n hierarchyConfiguration,\n visibilityHandlerOverrides,\n );\n const { loadFocusedItems } = useFocusedInstancesContext();\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n ({ imodelAccess }) => new ModelsTreeDefinition({ imodelAccess, idsCache: getModelsTreeIdsCache(), hierarchyConfig: hierarchyConfiguration }),\n [getModelsTreeIdsCache, hierarchyConfiguration],\n );\n\n const onNodeDoubleClick = useCallback(\n async ({ nodeData, extendedData }: PresentationHierarchyNode) => {\n if (!HierarchyNode.isInstancesNode(nodeData) || (extendedData && (extendedData.isSubject || extendedData.isModel || extendedData.isCategory))) {\n return;\n }\n const instanceIds = nodeData.key.instanceKeys.map((instanceKey) => instanceKey.id);\n await IModelApp.viewManager.selectedView?.zoomToElements(instanceIds);\n onFeatureUsed({ featureId: \"zoom-to-node\", reportInteraction: false });\n },\n [onFeatureUsed],\n );\n\n const getPaths = useMemo<VisibilityTreeProps[\"getFilteredPaths\"] | undefined>(() => {\n setFilteringError(undefined);\n onModelsFiltered?.(undefined);\n\n // reset filtered paths if there is no filters applied. This allows to keep current filtered paths until new paths are loaded.\n if (!loadFocusedItems && !getFilteredPaths && !filter) {\n onFilteredPathsChanged(undefined);\n }\n\n const handlePaths = async (filteredPaths: HierarchyFilteringPath[], classInspector: ECClassHierarchyInspector) => {\n onFilteredPathsChanged(filteredPaths);\n if (!onModelsFiltered) {\n return;\n }\n\n const modelIds = await getModels(filteredPaths, getModelsTreeIdsCache(), classInspector);\n onModelsFiltered(modelIds);\n };\n\n if (loadFocusedItems) {\n return async ({ imodelAccess }) => {\n try {\n const focusedItems = await collectFocusedItems(loadFocusedItems);\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n idsCache: getModelsTreeIdsCache(),\n targetItems: focusedItems,\n hierarchyConfig: hierarchyConfiguration,\n });\n void handlePaths(paths, imodelAccess);\n return paths.map((path) => (\"path\" in path ? path : { path, options: { autoExpand: true } }));\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyInstancesFocused\" : \"unknownInstanceFocusError\";\n if (newError !== \"tooManyInstancesFocused\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }\n\n if (getFilteredPaths) {\n return async ({ imodelAccess }) => {\n try {\n const paths = await getFilteredPaths({\n createInstanceKeyPaths: async (props) =>\n ModelsTreeDefinition.createInstanceKeyPaths({\n ...props,\n imodelAccess,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n limit: \"unbounded\",\n }),\n });\n void handlePaths(paths, imodelAccess);\n return paths;\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyFilterMatches\" : \"unknownFilterError\";\n if (newError !== \"tooManyFilterMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }\n\n if (filter) {\n return async ({ imodelAccess }) => {\n onFeatureUsed({ featureId: \"filtering\", reportInteraction: true });\n try {\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n label: filter,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n });\n void handlePaths(paths, imodelAccess);\n return paths.map((path) => (\"path\" in path ? path : { path, options: { autoExpand: true } }));\n } catch (e) {\n const newError = e instanceof FilterLimitExceededError ? \"tooManyFilterMatches\" : \"unknownFilterError\";\n if (newError !== \"tooManyFilterMatches\") {\n const feature = e instanceof Error && e.message.includes(\"query too long to execute or server is too busy\") ? \"error-timeout\" : \"error-unknown\";\n onFeatureUsed({ featureId: feature, reportInteraction: false });\n }\n setFilteringError(newError);\n return [];\n }\n };\n }\n return undefined;\n }, [filter, loadFocusedItems, getModelsTreeIdsCache, onFeatureUsed, getFilteredPaths, hierarchyConfiguration, onModelsFiltered, onFilteredPathsChanged]);\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 return {\n modelsTreeProps: {\n treeName: \"models-tree-v2\",\n visibilityHandlerFactory,\n getHierarchyDefinition,\n getFilteredPaths: getPaths,\n noDataMessage: getNoDataMessage(filter, filteringError),\n highlight: filter ? { text: filter } : undefined,\n selectionPredicate: nodeSelectionPredicate,\n },\n rendererProps: {\n onNodeDoubleClick,\n getIcon,\n },\n };\n}\n\nasync function getModels(paths: HierarchyFilteringPath[], idsCache: ModelsTreeIdsCache, classInspector: ECClassHierarchyInspector) {\n if (!paths) {\n return undefined;\n }\n\n const targetModels = new Set<Id64String>();\n const targetSubjects = new Set<Id64String>();\n for (const path of paths) {\n const currPath = Array.isArray(path) ? path : path.path;\n for (let i = 0; i < currPath.length; i++) {\n const currStep = currPath[i];\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(currStep)) {\n break;\n }\n\n // if paths end with subject need to get all models under that subject\n if (i === currPath.length - 1 && currStep.className === \"BisCore.Subject\") {\n targetSubjects.add(currStep.id);\n break;\n }\n\n // collect all the models from the filtered path\n if (await classInspector.classDerivesFrom(currStep.className, \"BisCore.GeometricModel3d\")) {\n targetModels.add(currStep.id);\n }\n }\n }\n\n const matchingModels = await idsCache.getSubjectModelIds([...targetSubjects]);\n return [...targetModels, ...matchingModels];\n}\n\nfunction getNoDataMessage(filter?: string, error?: ModelsTreeFilteringError) {\n if (isInstanceFocusError(error)) {\n return <InstanceFocusError error={error!} />;\n }\n if (isFilterError(error)) {\n return <Text>{TreeWidget.translate(`modelsTree.filtering.${error}`)}</Text>;\n }\n if (filter) {\n return <Text>{TreeWidget.translate(\"modelsTree.filtering.noMatches\", { filter })}</Text>;\n }\n return undefined;\n}\n\nfunction isFilterError(error: ModelsTreeFilteringError | undefined) {\n return error === \"tooManyFilterMatches\" || error === \"unknownFilterError\";\n}\n\nfunction isInstanceFocusError(error: ModelsTreeFilteringError | undefined) {\n return error === \"tooManyInstancesFocused\" || error === \"unknownInstanceFocusError\";\n}\n\nfunction InstanceFocusError({ error }: { error: ModelsTreeFilteringError }) {\n const { toggle } = useFocusedInstancesContext();\n const localizedMessage = createLocalizedMessage(TreeWidget.translate(`modelsTree.filtering.${error}`), () => toggle());\n return <Text>{localizedMessage}</Text>;\n}\n\nfunction getIcon(node: PresentationHierarchyNode): ReactElement | undefined {\n if (node.extendedData?.imageId === undefined) {\n return undefined;\n }\n\n switch (node.extendedData.imageId) {\n case \"icon-layers\":\n return <SvgLayers />;\n case \"icon-item\":\n return <SvgItem />;\n case \"icon-ec-class\":\n return <SvgClassGrouping />;\n case \"icon-imodel-hollow-2\":\n return <SvgImodelHollow />;\n case \"icon-folder\":\n return <SvgFolder />;\n case \"icon-model\":\n return <SvgModel />;\n }\n\n return undefined;\n}\n\nfunction createVisibilityHandlerFactory(\n activeView: Viewport,\n idsCacheGetter: () => ModelsTreeIdsCache,\n overrides?: ModelsTreeVisibilityHandlerOverrides,\n filteredPaths?: HierarchyFilteringPath[],\n): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n return ({ imodelAccess }) => createModelsTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, overrides, filteredPaths });\n}\n\nfunction useCachedVisibility(activeView: Viewport, hierarchyConfig: ModelsTreeHierarchyConfiguration, overrides?: ModelsTreeVisibilityHandlerOverrides) {\n const cacheRef = useRef<ModelsTreeIdsCache>();\n const currentIModelRef = useRef(activeView.iModel);\n\n const resetModelsTreeIdsCache = () => {\n cacheRef.current?.[Symbol.dispose]();\n cacheRef.current = undefined;\n };\n const getModelsTreeIdsCache = useCallback(() => {\n if (!cacheRef.current) {\n cacheRef.current = new ModelsTreeIdsCache(createECSqlQueryExecutor(currentIModelRef.current), hierarchyConfig);\n }\n return cacheRef.current;\n }, [hierarchyConfig]);\n\n const [filteredPaths, setFilteredPaths] = useState<HierarchyFilteringPath[]>();\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState<VisibilityTreeProps[\"visibilityHandlerFactory\"]>(() =>\n createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths),\n );\n\n useIModelChangeListener({\n imodel: activeView.iModel,\n action: useCallback(() => {\n resetModelsTreeIdsCache();\n setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));\n }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]),\n });\n\n useEffect(() => {\n currentIModelRef.current = activeView.iModel;\n setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));\n return () => resetModelsTreeIdsCache();\n }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]);\n\n return {\n getModelsTreeIdsCache,\n visibilityHandlerFactory,\n onFilteredPathsChanged: useCallback((paths: HierarchyFilteringPath[] | undefined) => setFilteredPaths(paths), []),\n };\n}\n\nfunction SvgClassGrouping() {\n return (\n <svg id=\"Calque_1\" data-name=\"Calque 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n <path d=\"M8.00933,0,0,3.97672V11.986L8.00933,16,16,11.93V3.97651ZM1.66173,11.27642c-.26155.03734-.59754-.26154-.76553-.69085-.168-.41066-.09334-.784.168-.82152.26154-.03734.59754.26154.76553.67219C1.99772,10.86577,1.92306,11.23909,1.66173,11.27642Zm0-3.32319c-.26155.03733-.59754-.28-.76553-.69086-.168-.42932-.09334-.80285.168-.84.26133-.03733.59754.28.76532.69086C1.99772,7.54236,1.92306,7.89723,1.66173,7.95323Zm4.31276,5.52621a.18186.18186,0,0,1-.16821-.01866L3.41657,12.15394a.94275.94275,0,0,1-.29887-.80285c.03754-.33621.22421-.52265.41108-.41066L5.9185,12.24727a.88656.88656,0,0,1,.28.80285A.5057.5057,0,0,1,5.97449,13.47944Zm0-3.37919a.18184.18184,0,0,1-.16821-.01867L3.41657,8.77475a.943.943,0,0,1-.29887-.80286c.03754-.3362.22421-.52286.41108-.42953L5.9185,8.86786a.83112.83112,0,0,1,.28.78419A.51684.51684,0,0,1,5.97449,10.10025Z\" />\n </svg>\n );\n}\n\nasync function collectFocusedItems(loadFocusedItems: () => AsyncIterableIterator<InstanceKey | GroupingHierarchyNode>) {\n const focusedItems: Array<InstanceKey | ElementsGroupInfo> = [];\n const groupingNodeInfos: Array<{\n parentKey: InstancesNodeKey;\n parentType: \"element\" | \"category\";\n groupingNode: ClassGroupingHierarchyNode;\n modelIds: Id64String[];\n }> = [];\n for await (const key of loadFocusedItems()) {\n if (\"id\" in key) {\n focusedItems.push(key);\n continue;\n }\n\n if (!HierarchyNodeKey.isClassGrouping(key.key)) {\n continue;\n }\n\n const groupingNode = key as ClassGroupingHierarchyNode;\n if (!groupingNode.nonGroupingAncestor || !HierarchyNodeKey.isInstances(groupingNode.nonGroupingAncestor.key)) {\n continue;\n }\n\n const parentKey = groupingNode.nonGroupingAncestor.key;\n const type = groupingNode.nonGroupingAncestor.extendedData?.isCategory ? \"category\" : \"element\";\n const modelIds = ((groupingNode.nonGroupingAncestor.extendedData?.modelIds as Id64String[][]) ?? []).flatMap((ids) => ids);\n groupingNodeInfos.push({ groupingNode, parentType: type, parentKey, modelIds });\n }\n focusedItems.push(\n ...groupingNodeInfos.map(({ parentKey, parentType, groupingNode, modelIds }) => ({\n parent:\n parentType === \"element\"\n ? { type: \"element\" as const, ids: parentKey.instanceKeys.map((key) => key.id) }\n : { type: \"category\" as const, ids: parentKey.instanceKeys.map((key) => key.id), modelIds },\n groupingNode,\n })),\n );\n return focusedItems;\n}\n\nfunction createLocalizedMessage(message: string, onClick?: () => void) {\n const exp = new RegExp(\"<link>(.*)</link>\");\n const match = message.match(exp);\n if (!match) {\n return message;\n }\n\n const [fullText, innerText] = match;\n const [textBefore, textAfter] = message.split(fullText);\n\n return (\n <>\n {textBefore ? textBefore : null}\n <Anchor\n underline\n onClick={(e) => {\n e.stopPropagation();\n onClick?.();\n }}\n >\n {innerText}\n </Anchor>\n {textAfter ? textAfter : null}\n </>\n );\n}\n"]}
@@ -12,7 +12,12 @@ export declare class AlwaysAndNeverDrawnElementInfo implements IDisposable {
12
12
  private _alwaysDrawn;
13
13
  private _neverDrawn;
14
14
  private _disposeSubject;
15
+ private _suppressors;
16
+ private _suppress;
17
+ private _forceUpdate;
15
18
  constructor(_viewport: Viewport);
19
+ suppressChangeEvents(): void;
20
+ resumeChangeEvents(): void;
16
21
  getElements({ setType, modelId, categoryId }: {
17
22
  setType: "always" | "never";
18
23
  } & AlwaysOrNeverDrawnElementsQueryProps): Observable<Id64Set>;