@itwin/tree-widget-react 3.14.0 → 3.14.1

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 (30) hide show
  1. package/CHANGELOG.md +10 -2
  2. package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +2 -2
  3. package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +22 -10
  4. package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  5. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +2 -1
  6. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +1 -0
  7. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  8. package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +17 -0
  9. package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +49 -0
  10. package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -0
  11. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +4 -4
  12. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js +16 -23
  13. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  14. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +1 -1
  15. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  16. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.d.ts +2 -2
  17. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +22 -10
  18. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  19. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +2 -1
  20. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +1 -0
  21. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  22. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +17 -0
  23. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +46 -0
  24. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -0
  25. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.d.ts +4 -4
  26. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +16 -23
  27. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +1 -1
  29. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  30. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesTreeIdsCache.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.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 { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./ClassNameDefinitions.js\";\n\nimport type { Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { LimitingECSqlQueryExecutor } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\n\ninterface DefinitionContainerInfo {\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCategories: CategoryInfo[];\n childDefinitionContainers: Id64Array;\n}\n\ninterface CategoriesInfo {\n childCategories: CategoryInfo[];\n parentDefinitionContainerExists: boolean;\n}\n\ninterface CategoryInfo {\n id: Id64String;\n childCount: number;\n}\n\ninterface SubCategoryInfo {\n categoryId: Id64String;\n}\n\n/** @internal */\nexport class CategoriesTreeIdsCache {\n private _definitionContainersInfo: Promise<Map<Id64String, DefinitionContainerInfo>> | undefined;\n private _modelsCategoriesInfo: Promise<Map<Id64String, CategoriesInfo>> | undefined;\n private _subCategoriesInfo: Promise<Map<Id64String, SubCategoryInfo>> | undefined;\n private _elementModelsCategories: Promise<Map<Id64String, Id64Set>> | undefined;\n private _categoryClass: string;\n private _categoryElementClass: string;\n private _categoryModelClass: string;\n private _isDefinitionContainerSupported: Promise<boolean> | undefined;\n\n constructor(\n private _queryExecutor: LimitingECSqlQueryExecutor,\n viewType: \"3d\" | \"2d\",\n ) {\n const { categoryClass, categoryElementClass, categoryModelClass } = getClassesByView(viewType);\n this._categoryClass = categoryClass;\n this._categoryElementClass = categoryElementClass;\n this._categoryModelClass = categoryModelClass;\n }\n\n private async *queryElementModelCategories(): AsyncIterableIterator<{\n modelId: Id64String;\n categoryId: Id64String;\n }> {\n const query = `\n SELECT this.Model.Id modelId, this.Category.Id categoryId\n FROM ${this._categoryModelClass} m\n JOIN ${this._categoryElementClass} this ON m.ECInstanceId = this.Model.Id\n WHERE m.IsPrivate = false\n GROUP BY modelId, categoryId\n `;\n for await (const row of this._queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: \"tree-widget/categories-tree/element-models-and-categories-query\" },\n )) {\n yield { modelId: row.modelId, categoryId: row.categoryId };\n }\n }\n\n private async *queryCategories(): AsyncIterableIterator<{\n id: Id64String;\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCount: number;\n }> {\n const isDefinitionContainerSupported = await this.getIsDefinitionContainerSupported();\n const categoriesQuery = `\n SELECT\n this.ECInstanceId id,\n COUNT(sc.ECInstanceId) childCount,\n this.Model.Id modelId,\n ${\n isDefinitionContainerSupported\n ? `\n IIF(this.Model.Id IN (SELECT dc.ECInstanceId FROM ${DEFINITION_CONTAINER_CLASS} dc),\n true,\n false\n )`\n : \"false\"\n } parentDefinitionContainerExists\n FROM\n ${this._categoryClass} this\n JOIN ${SUB_CATEGORY_CLASS} sc ON sc.Parent.Id = this.ECInstanceId\n JOIN BisCore.Model m ON m.ECInstanceId = this.Model.Id\n WHERE\n NOT this.IsPrivate\n AND (NOT m.IsPrivate OR m.ECClassId IS (BisCore.DictionaryModel))\n AND EXISTS (SELECT 1 FROM ${this._categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId)\n GROUP BY this.ECInstanceId\n `;\n for await (const row of this._queryExecutor.createQueryReader({ ecsql: categoriesQuery }, { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\" })) {\n yield { id: row.id, modelId: row.modelId, parentDefinitionContainerExists: row.parentDefinitionContainerExists, childCount: row.childCount };\n }\n }\n\n private async queryIsDefinitionContainersSupported(): Promise<boolean> {\n const query = `\n SELECT\n 1\n FROM\n ECDbMeta.ECSchemaDef s\n JOIN ECDbMeta.ECClassDef c ON c.Schema.Id = s.ECInstanceId\n WHERE\n s.Name = 'BisCore'\n AND c.Name = 'DefinitionContainer'\n `;\n\n for await (const _row of this._queryExecutor.createQueryReader({ ecsql: query })) {\n return true;\n }\n return false;\n }\n\n private async *queryDefinitionContainers(): AsyncIterableIterator<{ id: Id64String; modelId: Id64String }> {\n // DefinitionModel ECInstanceId will always be the same as modeled DefinitionContainer ECInstanceId, if this wasn't the case, we would need to do something like:\n // JOIN BisCore.DefinitionModel dm ON dm.ECInstanceId = ${modelIdAccessor}\n // JOIN BisCore.DefinitionModelBreaksDownDefinitionContainer dr ON dr.SourceECInstanceId = dm.ECInstanceId\n // JOIN BisCore.DefinitionContainer dc ON dc.ECInstanceId = dr.TargetECInstanceId\n const DEFINITION_CONTAINERS_CTE = \"DefinitionContainers\";\n const ctes = [\n `\n ${DEFINITION_CONTAINERS_CTE}(ECInstanceId, ModelId) AS (\n SELECT\n dc.ECInstanceId,\n dc.Model.Id\n FROM\n ${DEFINITION_CONTAINER_CLASS} dc\n WHERE\n dc.ECInstanceId IN (SELECT c.Model.Id FROM ${this._categoryClass} c WHERE NOT c.IsPrivate AND EXISTS (SELECT 1 FROM ${this._categoryElementClass} e WHERE e.Category.Id = c.ECInstanceId))\n AND NOT dc.IsPrivate\n\n UNION ALL\n\n SELECT\n pdc.ECInstanceId,\n pdc.Model.Id\n FROM\n ${DEFINITION_CONTAINERS_CTE} cdc\n JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId\n WHERE\n NOT pdc.IsPrivate\n )\n `,\n ];\n const definitionsQuery = `\n SELECT dc.ECInstanceId id, dc.ModelId modelId FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId\n `;\n for await (const row of this._queryExecutor.createQueryReader({ ctes, ecsql: definitionsQuery }, { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\" })) {\n yield { id: row.id, modelId: row.modelId };\n }\n }\n\n private async *queryVisibleSubCategories(categoriesInfo: Id64Array): AsyncIterableIterator<{ id: Id64String; parentId: Id64String }> {\n const definitionsQuery = `\n SELECT\n sc.ECInstanceId id,\n sc.Parent.Id categoryId\n FROM\n ${SUB_CATEGORY_CLASS} sc\n WHERE\n NOT sc.IsPrivate\n AND sc.Parent.Id IN (${categoriesInfo.join(\",\")})\n `;\n for await (const row of this._queryExecutor.createQueryReader({ ecsql: definitionsQuery }, { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\" })) {\n yield { id: row.id, parentId: row.categoryId };\n }\n }\n\n private async getModelsCategoriesInfo() {\n this._modelsCategoriesInfo ??= (async () => {\n const allModelsCategories = new Map<Id64String, CategoriesInfo>();\n for await (const queriedCategory of this.queryCategories()) {\n let modelCategories = allModelsCategories.get(queriedCategory.modelId);\n if (modelCategories === undefined) {\n modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };\n allModelsCategories.set(queriedCategory.modelId, modelCategories);\n }\n modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount });\n }\n return allModelsCategories;\n })();\n return this._modelsCategoriesInfo;\n }\n\n private async getElementModelsCategories() {\n this._elementModelsCategories ??= (async () => {\n const elementModelsCategories = new Map<Id64String, Id64Set>();\n for await (const queriedCategory of this.queryElementModelCategories()) {\n let modelEntry = elementModelsCategories.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = new Set();\n elementModelsCategories.set(queriedCategory.modelId, modelEntry);\n }\n modelEntry.add(queriedCategory.categoryId);\n }\n return elementModelsCategories;\n })();\n return this._elementModelsCategories;\n }\n\n private async getSubCategoriesInfo() {\n this._subCategoriesInfo ??= (async () => {\n const allSubCategories = new Map<Id64String, SubCategoryInfo>();\n const modelsCategoriesInfo = await this.getModelsCategoriesInfo();\n const categoriesWithMoreThanOneSubCategory = new Array<Id64String>();\n for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {\n categoriesWithMoreThanOneSubCategory.push(\n ...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id),\n );\n }\n\n if (categoriesWithMoreThanOneSubCategory.length === 0) {\n return allSubCategories;\n }\n\n for await (const queriedSubCategory of this.queryVisibleSubCategories(categoriesWithMoreThanOneSubCategory)) {\n allSubCategories.set(queriedSubCategory.id, { categoryId: queriedSubCategory.parentId });\n }\n return allSubCategories;\n })();\n return this._subCategoriesInfo;\n }\n\n private async getDefinitionContainersInfo() {\n this._definitionContainersInfo ??= (async () => {\n const definitionContainersInfo = new Map<Id64String, DefinitionContainerInfo>();\n const [isDefinitionContainerSupported, modelsCategoriesInfo] = await Promise.all([\n this.getIsDefinitionContainerSupported(),\n this.getModelsCategoriesInfo(),\n ]);\n if (!isDefinitionContainerSupported || modelsCategoriesInfo.size === 0) {\n return definitionContainersInfo;\n }\n\n for await (const queriedDefinitionContainer of this.queryDefinitionContainers()) {\n const modelCategoriesInfo = modelsCategoriesInfo.get(queriedDefinitionContainer.id);\n\n definitionContainersInfo.set(queriedDefinitionContainer.id, {\n childCategories: modelCategoriesInfo?.childCategories ?? [],\n modelId: queriedDefinitionContainer.modelId,\n childDefinitionContainers: [],\n parentDefinitionContainerExists: false,\n });\n }\n\n for (const [definitionContainerId, definitionContainerInfo] of definitionContainersInfo) {\n const parentDefinitionContainer = definitionContainersInfo.get(definitionContainerInfo.modelId);\n if (parentDefinitionContainer !== undefined) {\n parentDefinitionContainer.childDefinitionContainers.push(definitionContainerId);\n definitionContainerInfo.parentDefinitionContainerExists = true;\n }\n }\n\n return definitionContainersInfo;\n })();\n return this._definitionContainersInfo;\n }\n\n public async getDirectChildDefinitionContainersAndCategories(\n parentDefinitionContainerIds: Id64Array,\n ): Promise<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n const definitionContainersInfo = await this.getDefinitionContainersInfo();\n\n const result = { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() };\n\n parentDefinitionContainerIds.forEach((parentDefinitionContainerId) => {\n const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);\n if (parentDefinitionContainerInfo !== undefined) {\n result.definitionContainers.push(...parentDefinitionContainerInfo.childDefinitionContainers);\n result.categories.push(...parentDefinitionContainerInfo.childCategories);\n }\n });\n return result;\n }\n\n public async getCategoriesElementModels(categoryIds: Id64Array): Promise<Map<Id64String, Id64Array>> {\n const elementModelsCategories = await this.getElementModelsCategories();\n const result = new Map<Id64String, Id64Array>();\n for (const categoryId of categoryIds) {\n for (const [modelId, categories] of elementModelsCategories) {\n if (categories.has(categoryId)) {\n let categoryModels = result.get(categoryId);\n if (!categoryModels) {\n categoryModels = new Array<Id64String>();\n result.set(categoryId, categoryModels);\n }\n categoryModels.push(modelId);\n }\n }\n }\n return result;\n }\n\n public async getAllContainedCategories(definitionContainerIds: Id64Array): Promise<Id64Array> {\n const result = new Array<Id64String>();\n\n const definitionContainersInfo = await this.getDefinitionContainersInfo();\n const indirectCategories = await Promise.all(\n definitionContainerIds.map(async (definitionContainerId) => {\n const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return [];\n }\n result.push(...definitionContainerInfo.childCategories.map((category) => category.id));\n return this.getAllContainedCategories(definitionContainerInfo.childDefinitionContainers);\n }),\n );\n for (const categories of indirectCategories) {\n result.push(...categories);\n }\n\n return result;\n }\n\n public async getInstanceKeyPaths(\n props: { categoryId: Id64String } | { definitionContainerId: Id64String } | { subCategoryId: Id64String },\n ): Promise<InstanceKey[]> {\n if (\"subCategoryId\" in props) {\n const subCategoriesInfo = await this.getSubCategoriesInfo();\n const subCategoryInfo = subCategoriesInfo.get(props.subCategoryId);\n if (subCategoryInfo === undefined) {\n return [];\n }\n return [...(await this.getInstanceKeyPaths({ categoryId: subCategoryInfo.categoryId })), { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }];\n }\n\n if (\"categoryId\" in props) {\n const modelsCategoriesInfo = await this.getModelsCategoriesInfo();\n for (const [modelId, modelCategoriesInfo] of modelsCategoriesInfo) {\n if (modelCategoriesInfo.childCategories.find((childCategory) => childCategory.id === props.categoryId)) {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n return [{ id: props.categoryId, className: this._categoryClass }];\n }\n\n return [...(await this.getInstanceKeyPaths({ definitionContainerId: modelId })), { id: props.categoryId, className: this._categoryClass }];\n }\n }\n return [];\n }\n\n const definitionContainersInfo = await this.getDefinitionContainersInfo();\n const definitionContainerInfo = definitionContainersInfo.get(props.definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return [];\n }\n\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n return [{ id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS }];\n }\n\n return [\n ...(await this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId })),\n { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS },\n ];\n }\n\n public async getAllDefinitionContainersAndCategories(): Promise<{ categories: Id64Array; definitionContainers: Id64Array }> {\n const [modelsCategoriesInfo, definitionContainersInfo] = await Promise.all([this.getModelsCategoriesInfo(), this.getDefinitionContainersInfo()]);\n const result = { definitionContainers: [...definitionContainersInfo.keys()], categories: new Array<Id64String>() };\n for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {\n result.categories.push(...modelCategoriesInfo.childCategories.map((childCategory) => childCategory.id));\n }\n\n return result;\n }\n\n public async getRootDefinitionContainersAndCategories(): Promise<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n const [modelsCategoriesInfo, definitionContainersInfo] = await Promise.all([this.getModelsCategoriesInfo(), this.getDefinitionContainersInfo()]);\n const result = { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() };\n for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n result.categories.push(...modelCategoriesInfo.childCategories);\n }\n }\n\n for (const [definitionContainerId, definitionContainerInfo] of definitionContainersInfo) {\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n result.definitionContainers.push(definitionContainerId);\n }\n }\n return result;\n }\n\n public async getSubCategories(categoryId: Id64String): Promise<Id64Array> {\n const subCategoriesInfo = await this.getSubCategoriesInfo();\n const result = new Array<Id64String>();\n for (const [subCategoryId, subCategoryInfo] of subCategoriesInfo) {\n if (subCategoryInfo.categoryId === categoryId) {\n result.push(subCategoryId);\n }\n }\n return result;\n }\n\n public async getIsDefinitionContainerSupported(): Promise<boolean> {\n this._isDefinitionContainerSupported ??= this.queryIsDefinitionContainersSupported();\n return this._isDefinitionContainerSupported;\n }\n}\n\n/** @internal */\nexport function getClassesByView(viewType: \"2d\" | \"3d\") {\n return viewType === \"2d\"\n ? { categoryClass: \"BisCore.DrawingCategory\", categoryElementClass: \"BisCore.GeometricElement2d\", categoryModelClass: \"BisCore.GeometricModel2d\" }\n : { categoryClass: \"BisCore.SpatialCategory\", categoryElementClass: \"BisCore.GeometricElement3d\", categoryModelClass: \"BisCore.GeometricModel3d\" };\n}\n"]}
1
+ {"version":3,"file":"CategoriesTreeIdsCache.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.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 { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./ClassNameDefinitions.js\";\n\nimport type { Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { LimitingECSqlQueryExecutor } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\n\ninterface DefinitionContainerInfo {\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCategories: CategoryInfo[];\n childDefinitionContainers: Id64Array;\n}\n\ninterface CategoriesInfo {\n childCategories: CategoryInfo[];\n parentDefinitionContainerExists: boolean;\n}\n\ninterface CategoryInfo {\n id: Id64String;\n childCount: number;\n}\n\ninterface SubCategoryInfo {\n categoryId: Id64String;\n}\n\n/** @internal */\nexport class CategoriesTreeIdsCache implements Disposable {\n private _definitionContainersInfo: Promise<Map<Id64String, DefinitionContainerInfo>> | undefined;\n private _modelsCategoriesInfo: Promise<Map<Id64String, CategoriesInfo>> | undefined;\n private _subCategoriesInfo: Promise<Map<Id64String, SubCategoryInfo>> | undefined;\n private _elementModelsCategories: Promise<Map<Id64String, Id64Set>> | undefined;\n private _categoryClass: string;\n private _categoryElementClass: string;\n private _categoryModelClass: string;\n private _isDefinitionContainerSupported: Promise<boolean> | undefined;\n\n constructor(\n private _queryExecutor: LimitingECSqlQueryExecutor,\n viewType: \"3d\" | \"2d\",\n ) {\n const { categoryClass, categoryElementClass, categoryModelClass } = getClassesByView(viewType);\n this._categoryClass = categoryClass;\n this._categoryElementClass = categoryElementClass;\n this._categoryModelClass = categoryModelClass;\n }\n\n public [Symbol.dispose]() {}\n\n private async *queryElementModelCategories(): AsyncIterableIterator<{\n modelId: Id64String;\n categoryId: Id64String;\n }> {\n const query = `\n SELECT this.Model.Id modelId, this.Category.Id categoryId\n FROM ${this._categoryModelClass} m\n JOIN ${this._categoryElementClass} this ON m.ECInstanceId = this.Model.Id\n WHERE m.IsPrivate = false\n GROUP BY modelId, categoryId\n `;\n for await (const row of this._queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: \"tree-widget/categories-tree/element-models-and-categories-query\" },\n )) {\n yield { modelId: row.modelId, categoryId: row.categoryId };\n }\n }\n\n private async *queryCategories(): AsyncIterableIterator<{\n id: Id64String;\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCount: number;\n }> {\n const isDefinitionContainerSupported = await this.getIsDefinitionContainerSupported();\n const categoriesQuery = `\n SELECT\n this.ECInstanceId id,\n COUNT(sc.ECInstanceId) childCount,\n this.Model.Id modelId,\n ${\n isDefinitionContainerSupported\n ? `\n IIF(this.Model.Id IN (SELECT dc.ECInstanceId FROM ${DEFINITION_CONTAINER_CLASS} dc),\n true,\n false\n )`\n : \"false\"\n } parentDefinitionContainerExists\n FROM\n ${this._categoryClass} this\n JOIN ${SUB_CATEGORY_CLASS} sc ON sc.Parent.Id = this.ECInstanceId\n JOIN BisCore.Model m ON m.ECInstanceId = this.Model.Id\n WHERE\n NOT this.IsPrivate\n AND (NOT m.IsPrivate OR m.ECClassId IS (BisCore.DictionaryModel))\n AND EXISTS (SELECT 1 FROM ${this._categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId)\n GROUP BY this.ECInstanceId\n `;\n for await (const row of this._queryExecutor.createQueryReader({ ecsql: categoriesQuery }, { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\" })) {\n yield { id: row.id, modelId: row.modelId, parentDefinitionContainerExists: row.parentDefinitionContainerExists, childCount: row.childCount };\n }\n }\n\n private async queryIsDefinitionContainersSupported(): Promise<boolean> {\n const query = `\n SELECT\n 1\n FROM\n ECDbMeta.ECSchemaDef s\n JOIN ECDbMeta.ECClassDef c ON c.Schema.Id = s.ECInstanceId\n WHERE\n s.Name = 'BisCore'\n AND c.Name = 'DefinitionContainer'\n `;\n\n for await (const _row of this._queryExecutor.createQueryReader({ ecsql: query })) {\n return true;\n }\n return false;\n }\n\n private async *queryDefinitionContainers(): AsyncIterableIterator<{ id: Id64String; modelId: Id64String }> {\n // DefinitionModel ECInstanceId will always be the same as modeled DefinitionContainer ECInstanceId, if this wasn't the case, we would need to do something like:\n // JOIN BisCore.DefinitionModel dm ON dm.ECInstanceId = ${modelIdAccessor}\n // JOIN BisCore.DefinitionModelBreaksDownDefinitionContainer dr ON dr.SourceECInstanceId = dm.ECInstanceId\n // JOIN BisCore.DefinitionContainer dc ON dc.ECInstanceId = dr.TargetECInstanceId\n const DEFINITION_CONTAINERS_CTE = \"DefinitionContainers\";\n const ctes = [\n `\n ${DEFINITION_CONTAINERS_CTE}(ECInstanceId, ModelId) AS (\n SELECT\n dc.ECInstanceId,\n dc.Model.Id\n FROM\n ${DEFINITION_CONTAINER_CLASS} dc\n WHERE\n dc.ECInstanceId IN (SELECT c.Model.Id FROM ${this._categoryClass} c WHERE NOT c.IsPrivate AND EXISTS (SELECT 1 FROM ${this._categoryElementClass} e WHERE e.Category.Id = c.ECInstanceId))\n AND NOT dc.IsPrivate\n\n UNION ALL\n\n SELECT\n pdc.ECInstanceId,\n pdc.Model.Id\n FROM\n ${DEFINITION_CONTAINERS_CTE} cdc\n JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId\n WHERE\n NOT pdc.IsPrivate\n )\n `,\n ];\n const definitionsQuery = `\n SELECT dc.ECInstanceId id, dc.ModelId modelId FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId\n `;\n for await (const row of this._queryExecutor.createQueryReader({ ctes, ecsql: definitionsQuery }, { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\" })) {\n yield { id: row.id, modelId: row.modelId };\n }\n }\n\n private async *queryVisibleSubCategories(categoriesInfo: Id64Array): AsyncIterableIterator<{ id: Id64String; parentId: Id64String }> {\n const definitionsQuery = `\n SELECT\n sc.ECInstanceId id,\n sc.Parent.Id categoryId\n FROM\n ${SUB_CATEGORY_CLASS} sc\n WHERE\n NOT sc.IsPrivate\n AND sc.Parent.Id IN (${categoriesInfo.join(\",\")})\n `;\n for await (const row of this._queryExecutor.createQueryReader({ ecsql: definitionsQuery }, { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\" })) {\n yield { id: row.id, parentId: row.categoryId };\n }\n }\n\n private async getModelsCategoriesInfo() {\n this._modelsCategoriesInfo ??= (async () => {\n const allModelsCategories = new Map<Id64String, CategoriesInfo>();\n for await (const queriedCategory of this.queryCategories()) {\n let modelCategories = allModelsCategories.get(queriedCategory.modelId);\n if (modelCategories === undefined) {\n modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };\n allModelsCategories.set(queriedCategory.modelId, modelCategories);\n }\n modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount });\n }\n return allModelsCategories;\n })();\n return this._modelsCategoriesInfo;\n }\n\n private async getElementModelsCategories() {\n this._elementModelsCategories ??= (async () => {\n const elementModelsCategories = new Map<Id64String, Id64Set>();\n for await (const queriedCategory of this.queryElementModelCategories()) {\n let modelEntry = elementModelsCategories.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = new Set();\n elementModelsCategories.set(queriedCategory.modelId, modelEntry);\n }\n modelEntry.add(queriedCategory.categoryId);\n }\n return elementModelsCategories;\n })();\n return this._elementModelsCategories;\n }\n\n private async getSubCategoriesInfo() {\n this._subCategoriesInfo ??= (async () => {\n const allSubCategories = new Map<Id64String, SubCategoryInfo>();\n const modelsCategoriesInfo = await this.getModelsCategoriesInfo();\n const categoriesWithMoreThanOneSubCategory = new Array<Id64String>();\n for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {\n categoriesWithMoreThanOneSubCategory.push(\n ...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id),\n );\n }\n\n if (categoriesWithMoreThanOneSubCategory.length === 0) {\n return allSubCategories;\n }\n\n for await (const queriedSubCategory of this.queryVisibleSubCategories(categoriesWithMoreThanOneSubCategory)) {\n allSubCategories.set(queriedSubCategory.id, { categoryId: queriedSubCategory.parentId });\n }\n return allSubCategories;\n })();\n return this._subCategoriesInfo;\n }\n\n private async getDefinitionContainersInfo() {\n this._definitionContainersInfo ??= (async () => {\n const definitionContainersInfo = new Map<Id64String, DefinitionContainerInfo>();\n const [isDefinitionContainerSupported, modelsCategoriesInfo] = await Promise.all([\n this.getIsDefinitionContainerSupported(),\n this.getModelsCategoriesInfo(),\n ]);\n if (!isDefinitionContainerSupported || modelsCategoriesInfo.size === 0) {\n return definitionContainersInfo;\n }\n\n for await (const queriedDefinitionContainer of this.queryDefinitionContainers()) {\n const modelCategoriesInfo = modelsCategoriesInfo.get(queriedDefinitionContainer.id);\n\n definitionContainersInfo.set(queriedDefinitionContainer.id, {\n childCategories: modelCategoriesInfo?.childCategories ?? [],\n modelId: queriedDefinitionContainer.modelId,\n childDefinitionContainers: [],\n parentDefinitionContainerExists: false,\n });\n }\n\n for (const [definitionContainerId, definitionContainerInfo] of definitionContainersInfo) {\n const parentDefinitionContainer = definitionContainersInfo.get(definitionContainerInfo.modelId);\n if (parentDefinitionContainer !== undefined) {\n parentDefinitionContainer.childDefinitionContainers.push(definitionContainerId);\n definitionContainerInfo.parentDefinitionContainerExists = true;\n }\n }\n\n return definitionContainersInfo;\n })();\n return this._definitionContainersInfo;\n }\n\n public async getDirectChildDefinitionContainersAndCategories(\n parentDefinitionContainerIds: Id64Array,\n ): Promise<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n const definitionContainersInfo = await this.getDefinitionContainersInfo();\n\n const result = { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() };\n\n parentDefinitionContainerIds.forEach((parentDefinitionContainerId) => {\n const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);\n if (parentDefinitionContainerInfo !== undefined) {\n result.definitionContainers.push(...parentDefinitionContainerInfo.childDefinitionContainers);\n result.categories.push(...parentDefinitionContainerInfo.childCategories);\n }\n });\n return result;\n }\n\n public async getCategoriesElementModels(categoryIds: Id64Array): Promise<Map<Id64String, Id64Array>> {\n const elementModelsCategories = await this.getElementModelsCategories();\n const result = new Map<Id64String, Id64Array>();\n for (const categoryId of categoryIds) {\n for (const [modelId, categories] of elementModelsCategories) {\n if (categories.has(categoryId)) {\n let categoryModels = result.get(categoryId);\n if (!categoryModels) {\n categoryModels = new Array<Id64String>();\n result.set(categoryId, categoryModels);\n }\n categoryModels.push(modelId);\n }\n }\n }\n return result;\n }\n\n public async getAllContainedCategories(definitionContainerIds: Id64Array): Promise<Id64Array> {\n const result = new Array<Id64String>();\n\n const definitionContainersInfo = await this.getDefinitionContainersInfo();\n const indirectCategories = await Promise.all(\n definitionContainerIds.map(async (definitionContainerId) => {\n const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return [];\n }\n result.push(...definitionContainerInfo.childCategories.map((category) => category.id));\n return this.getAllContainedCategories(definitionContainerInfo.childDefinitionContainers);\n }),\n );\n for (const categories of indirectCategories) {\n result.push(...categories);\n }\n\n return result;\n }\n\n public async getInstanceKeyPaths(\n props: { categoryId: Id64String } | { definitionContainerId: Id64String } | { subCategoryId: Id64String },\n ): Promise<InstanceKey[]> {\n if (\"subCategoryId\" in props) {\n const subCategoriesInfo = await this.getSubCategoriesInfo();\n const subCategoryInfo = subCategoriesInfo.get(props.subCategoryId);\n if (subCategoryInfo === undefined) {\n return [];\n }\n return [...(await this.getInstanceKeyPaths({ categoryId: subCategoryInfo.categoryId })), { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }];\n }\n\n if (\"categoryId\" in props) {\n const modelsCategoriesInfo = await this.getModelsCategoriesInfo();\n for (const [modelId, modelCategoriesInfo] of modelsCategoriesInfo) {\n if (modelCategoriesInfo.childCategories.find((childCategory) => childCategory.id === props.categoryId)) {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n return [{ id: props.categoryId, className: this._categoryClass }];\n }\n\n return [...(await this.getInstanceKeyPaths({ definitionContainerId: modelId })), { id: props.categoryId, className: this._categoryClass }];\n }\n }\n return [];\n }\n\n const definitionContainersInfo = await this.getDefinitionContainersInfo();\n const definitionContainerInfo = definitionContainersInfo.get(props.definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return [];\n }\n\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n return [{ id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS }];\n }\n\n return [\n ...(await this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId })),\n { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS },\n ];\n }\n\n public async getAllDefinitionContainersAndCategories(): Promise<{ categories: Id64Array; definitionContainers: Id64Array }> {\n const [modelsCategoriesInfo, definitionContainersInfo] = await Promise.all([this.getModelsCategoriesInfo(), this.getDefinitionContainersInfo()]);\n const result = { definitionContainers: [...definitionContainersInfo.keys()], categories: new Array<Id64String>() };\n for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {\n result.categories.push(...modelCategoriesInfo.childCategories.map((childCategory) => childCategory.id));\n }\n\n return result;\n }\n\n public async getRootDefinitionContainersAndCategories(): Promise<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n const [modelsCategoriesInfo, definitionContainersInfo] = await Promise.all([this.getModelsCategoriesInfo(), this.getDefinitionContainersInfo()]);\n const result = { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() };\n for (const modelCategoriesInfo of modelsCategoriesInfo.values()) {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n result.categories.push(...modelCategoriesInfo.childCategories);\n }\n }\n\n for (const [definitionContainerId, definitionContainerInfo] of definitionContainersInfo) {\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n result.definitionContainers.push(definitionContainerId);\n }\n }\n return result;\n }\n\n public async getSubCategories(categoryId: Id64String): Promise<Id64Array> {\n const subCategoriesInfo = await this.getSubCategoriesInfo();\n const result = new Array<Id64String>();\n for (const [subCategoryId, subCategoryInfo] of subCategoriesInfo) {\n if (subCategoryInfo.categoryId === categoryId) {\n result.push(subCategoryId);\n }\n }\n return result;\n }\n\n public async getIsDefinitionContainerSupported(): Promise<boolean> {\n this._isDefinitionContainerSupported ??= this.queryIsDefinitionContainersSupported();\n return this._isDefinitionContainerSupported;\n }\n}\n\n/** @internal */\nexport function getClassesByView(viewType: \"2d\" | \"3d\") {\n return viewType === \"2d\"\n ? { categoryClass: \"BisCore.DrawingCategory\", categoryElementClass: \"BisCore.GeometricElement2d\", categoryModelClass: \"BisCore.GeometricModel2d\" }\n : { categoryClass: \"BisCore.SpatialCategory\", categoryElementClass: \"BisCore.GeometricElement3d\", categoryModelClass: \"BisCore.GeometricModel3d\" };\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { IModelConnection } from "@itwin/core-frontend";
2
+ /** @internal */
3
+ export interface CreateCacheProps<TCacheSpecificProps> {
4
+ imodel: IModelConnection;
5
+ specificProps: TCacheSpecificProps;
6
+ }
7
+ /** @internal */
8
+ export interface UseIdsCacheProps<TCache, TCacheSpecificProps> {
9
+ imodel: IModelConnection;
10
+ createCache: (props: CreateCacheProps<TCacheSpecificProps>) => TCache;
11
+ cacheSpecificProps: TCacheSpecificProps;
12
+ }
13
+ /** @internal */
14
+ export declare function useIdsCache<TCache extends Disposable, TCacheSpecificProps extends object>(props: UseIdsCacheProps<TCache, TCacheSpecificProps>): {
15
+ getCache: () => TCache;
16
+ };
17
+ //# sourceMappingURL=UseIdsCache.d.ts.map
@@ -0,0 +1,46 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { useCallback, useEffect, useRef, useState } from "react";
6
+ import { useIModelChangeListener } from "../../UseIModelChangeListener.js";
7
+ /** @internal */
8
+ export function useIdsCache(props) {
9
+ const cacheRef = useRef(undefined);
10
+ const clearCacheRef = useRef(() => {
11
+ cacheRef.current?.[Symbol.dispose]?.();
12
+ cacheRef.current = undefined;
13
+ });
14
+ const { imodel, createCache, cacheSpecificProps } = props;
15
+ const createCacheGetterRef = useRef((currImodel, specificProps) => {
16
+ return () => {
17
+ if (cacheRef.current === undefined) {
18
+ cacheRef.current = createCache({ imodel: currImodel, specificProps });
19
+ }
20
+ return cacheRef.current;
21
+ };
22
+ });
23
+ const [getCache, setCacheGetter] = useState(() => createCacheGetterRef.current(imodel, cacheSpecificProps));
24
+ useEffect(() => {
25
+ // clear cache in case it was created before `useEffect` was run first time
26
+ clearCacheRef.current();
27
+ // make sure all cache users rerender
28
+ setCacheGetter(() => createCacheGetterRef.current(imodel, cacheSpecificProps));
29
+ return () => {
30
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31
+ clearCacheRef.current();
32
+ };
33
+ }, [imodel, cacheSpecificProps]);
34
+ useIModelChangeListener({
35
+ imodel,
36
+ action: useCallback(() => {
37
+ clearCacheRef.current();
38
+ // make sure all cache users rerender
39
+ setCacheGetter(() => createCacheGetterRef.current(imodel, cacheSpecificProps));
40
+ }, [imodel, cacheSpecificProps]),
41
+ });
42
+ return {
43
+ getCache,
44
+ };
45
+ }
46
+ //# sourceMappingURL=UseIdsCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UseIdsCache.js","sourceRoot":"","sources":["../../../../../../../../src/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAiB3E,gBAAgB;AAChB,MAAM,UAAU,WAAW,CACzB,KAAoD;IAEpD,MAAM,QAAQ,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,EAAE;QAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACvC,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;IAE1D,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,UAA4B,EAAE,aAAkC,EAAE,EAAE;QACvG,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACnC,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAe,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE1H,SAAS,CAAC,GAAG,EAAE;QACb,2EAA2E;QAC3E,aAAa,CAAC,OAAO,EAAE,CAAC;QAExB,qCAAqC;QACrC,cAAc,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC/E,OAAO,GAAG,EAAE;YACV,uDAAuD;YACvD,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEjC,uBAAuB,CAAC;QACtB,MAAM;QACN,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE;YACvB,aAAa,CAAC,OAAO,EAAE,CAAC;YACxB,qCAAqC;YACrC,cAAc,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACjF,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;KACjC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;KACT,CAAC;AACJ,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useIModelChangeListener } from \"../../UseIModelChangeListener.js\";\n\nimport type { IModelConnection } from \"@itwin/core-frontend\";\n\n/** @internal */\nexport interface CreateCacheProps<TCacheSpecificProps> {\n imodel: IModelConnection;\n specificProps: TCacheSpecificProps;\n}\n\n/** @internal */\nexport interface UseIdsCacheProps<TCache, TCacheSpecificProps> {\n imodel: IModelConnection;\n createCache: (props: CreateCacheProps<TCacheSpecificProps>) => TCache;\n cacheSpecificProps: TCacheSpecificProps;\n}\n\n/** @internal */\nexport function useIdsCache<TCache extends Disposable, TCacheSpecificProps extends object>(\n props: UseIdsCacheProps<TCache, TCacheSpecificProps>,\n): { getCache: () => TCache } {\n const cacheRef = useRef<TCache | undefined>(undefined);\n const clearCacheRef = useRef(() => {\n cacheRef.current?.[Symbol.dispose]?.();\n cacheRef.current = undefined;\n });\n const { imodel, createCache, cacheSpecificProps } = props;\n\n const createCacheGetterRef = useRef((currImodel: IModelConnection, specificProps: TCacheSpecificProps) => {\n return () => {\n if (cacheRef.current === undefined) {\n cacheRef.current = createCache({ imodel: currImodel, specificProps });\n }\n return cacheRef.current;\n };\n });\n\n const [getCache, setCacheGetter] = useState<() => TCache>(() => createCacheGetterRef.current(imodel, cacheSpecificProps));\n\n useEffect(() => {\n // clear cache in case it was created before `useEffect` was run first time\n clearCacheRef.current();\n\n // make sure all cache users rerender\n setCacheGetter(() => createCacheGetterRef.current(imodel, cacheSpecificProps));\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n clearCacheRef.current();\n };\n }, [imodel, cacheSpecificProps]);\n\n useIModelChangeListener({\n imodel,\n action: useCallback(() => {\n clearCacheRef.current();\n // make sure all cache users rerender\n setCacheGetter(() => createCacheGetterRef.current(imodel, cacheSpecificProps));\n }, [imodel, cacheSpecificProps]),\n });\n\n return {\n getCache,\n };\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  import { HierarchyFilteringPath } from "@itwin/presentation-hierarchies";
2
- import type { NormalizedHierarchyFilteringPath } from "../common/Utils.js";
3
2
  import type { Id64String } from "@itwin/core-bentley";
4
- import type { InstanceKey } from "@itwin/presentation-shared";
5
3
  import type { Viewport } from "@itwin/core-frontend";
6
4
  import type { PresentationHierarchyNode } from "@itwin/presentation-hierarchies-react";
7
- import type { ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from "./ModelsTreeDefinition.js";
8
- import type { ModelsTreeVisibilityHandlerOverrides } from "./internal/ModelsTreeVisibilityHandler.js";
5
+ import type { InstanceKey } from "@itwin/presentation-shared";
9
6
  import type { VisibilityTreeProps } from "../common/components/VisibilityTree.js";
10
7
  import type { VisibilityTreeRendererProps } from "../common/components/VisibilityTreeRenderer.js";
8
+ import type { NormalizedHierarchyFilteringPath } from "../common/Utils.js";
9
+ import type { ModelsTreeVisibilityHandlerOverrides } from "./internal/ModelsTreeVisibilityHandler.js";
10
+ import type { ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from "./ModelsTreeDefinition.js";
11
11
  /** @beta */
12
12
  export interface UseModelsTreeProps {
13
13
  /**
@@ -11,8 +11,8 @@ import { createECSqlQueryExecutor } from "@itwin/presentation-core-interop";
11
11
  import { HierarchyFilteringPath, HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from "@itwin/presentation-hierarchies";
12
12
  import { TreeWidget } from "../../../TreeWidget.js";
13
13
  import { useFocusedInstancesContext } from "../common/FocusedInstancesContext.js";
14
+ import { useIdsCache } from "../common/internal/useTreeHooks/UseIdsCache.js";
14
15
  import { FilterLimitExceededError } from "../common/TreeErrors.js";
15
- import { useIModelChangeListener } from "../common/UseIModelChangeListener.js";
16
16
  import { useTelemetryContext } from "../common/UseTelemetryContext.js";
17
17
  import { joinHierarchyFilteringPaths } from "../common/Utils.js";
18
18
  import { ModelsTreeIdsCache } from "./internal/ModelsTreeIdsCache.js";
@@ -33,7 +33,16 @@ export function useModelsTree({ activeView, filter, hierarchyConfig, visibilityH
33
33
  // eslint-disable-next-line react-hooks/exhaustive-deps
34
34
  Object.values(hierarchyConfig ?? {}));
35
35
  const { onFeatureUsed } = useTelemetryContext();
36
- const { getModelsTreeIdsCache, visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility(activeView, hierarchyConfiguration, visibilityHandlerOverrides);
36
+ const { getCache: getModelsTreeIdsCache } = useIdsCache({
37
+ imodel: activeView.iModel,
38
+ createCache,
39
+ cacheSpecificProps: useMemo(() => ({ hierarchyConfig: hierarchyConfiguration }), [hierarchyConfiguration]),
40
+ });
41
+ const { visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility({
42
+ activeView,
43
+ overrides: visibilityHandlerOverrides,
44
+ getModelsTreeIdsCache,
45
+ });
37
46
  const { loadFocusedItems } = useFocusedInstancesContext();
38
47
  const getHierarchyDefinition = useCallback(({ imodelAccess }) => new ModelsTreeDefinition({ imodelAccess, idsCache: getModelsTreeIdsCache(), hierarchyConfig: hierarchyConfiguration }), [getModelsTreeIdsCache, hierarchyConfiguration]);
39
48
  const onNodeDoubleClick = useCallback(async ({ nodeData, extendedData }) => {
@@ -290,35 +299,16 @@ function getIcon(node) {
290
299
  function createVisibilityHandlerFactory(activeView, idsCacheGetter, overrides, filteredPaths) {
291
300
  return ({ imodelAccess }) => createModelsTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess, overrides, filteredPaths });
292
301
  }
293
- function useCachedVisibility(activeView, hierarchyConfig, overrides) {
294
- const cacheRef = useRef();
302
+ function useCachedVisibility(props) {
303
+ const { activeView, getModelsTreeIdsCache, overrides } = props;
295
304
  const currentIModelRef = useRef(activeView.iModel);
296
- const resetModelsTreeIdsCache = () => {
297
- cacheRef.current?.[Symbol.dispose]();
298
- cacheRef.current = undefined;
299
- };
300
- const getModelsTreeIdsCache = useCallback(() => {
301
- if (!cacheRef.current) {
302
- cacheRef.current = new ModelsTreeIdsCache(createECSqlQueryExecutor(currentIModelRef.current), hierarchyConfig);
303
- }
304
- return cacheRef.current;
305
- }, [hierarchyConfig]);
306
305
  const [filteredPaths, setFilteredPaths] = useState();
307
306
  const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));
308
- useIModelChangeListener({
309
- imodel: activeView.iModel,
310
- action: useCallback(() => {
311
- resetModelsTreeIdsCache();
312
- setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));
313
- }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]),
314
- });
315
307
  useEffect(() => {
316
308
  currentIModelRef.current = activeView.iModel;
317
309
  setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));
318
- return () => resetModelsTreeIdsCache();
319
310
  }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]);
320
311
  return {
321
- getModelsTreeIdsCache,
322
312
  visibilityHandlerFactory,
323
313
  onFilteredPathsChanged: useCallback((paths) => setFilteredPaths(paths), []),
324
314
  };
@@ -386,4 +376,7 @@ async function createFilteringPathsResult({ getSubTreePaths, getFilteringPaths,
386
376
  }
387
377
  return joinedPaths;
388
378
  }
379
+ function createCache(props) {
380
+ return new ModelsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig);
381
+ }
389
382
  //# sourceMappingURL=UseModelsTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UseModelsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/UseModelsTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, 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 { HierarchyFilteringPath, HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { TreeWidget } from \"../../../TreeWidget.js\";\nimport { useFocusedInstancesContext } from \"../common/FocusedInstancesContext.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { useIModelChangeListener } from \"../common/UseIModelChangeListener.js\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext.js\";\nimport { joinHierarchyFilteringPaths } from \"../common/Utils.js\";\nimport { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\nimport { ModelsTreeNode } from \"./internal/ModelsTreeNode.js\";\nimport { createModelsTreeVisibilityHandler } from \"./internal/ModelsTreeVisibilityHandler.js\";\nimport { defaultHierarchyConfiguration, ModelsTreeDefinition } from \"./ModelsTreeDefinition.js\";\n\nimport type { NormalizedHierarchyFilteringPath } from \"../common/Utils.js\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { GroupingHierarchyNode, HierarchyNodeIdentifiersPath, 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.js\";\nimport type { ModelsTreeVisibilityHandlerOverrides } from \"./internal/ModelsTreeVisibilityHandler.js\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\n\ntype ModelsTreeFilteringError = \"tooManyFilterMatches\" | \"tooManyInstancesFocused\" | \"unknownFilterError\" | \"unknownInstanceFocusError\";\ntype ModelsTreeSubTreeError = \"unknownSubTreeError\";\n\n/** @beta */\nexport interface UseModelsTreeProps {\n /**\n * Optional search string used to filter tree nodes by label, as well as highlight matching substrings in the tree.\n * Nodes that do not contain this string in their label will be filtered out.\n *\n * If `getFilteredPaths` function is provided, it will take precedence and automatic filtering by this string will not be applied.\n * Instead, the string will be supplied to the given `getFilteredPaths` function for consumers to apply the filtering.\n */\n filter?: string;\n activeView: Viewport;\n hierarchyConfig?: Partial<ModelsTreeHierarchyConfiguration>;\n visibilityHandlerOverrides?: ModelsTreeVisibilityHandlerOverrides;\n /**\n * Optional function for applying custom filtering on the hierarchy. Use it when you want full control over which nodes should be displayed, based on more complex logic or known instance keys.\n *\n * When defined, this function takes precedence over filtering by `filter` string. If both are supplied, the `filter` is provided as an argument to `getFilteredPaths`.\n *\n * @param props Parameters provided when `getFilteredPaths` is called:\n * - `createInstanceKeyPaths`: Helper function to create filter paths.\n * - `filter`: The filter string which would otherwise be used for default filtering.\n *\n * **Example use cases:**\n * - You have a list of `InstanceKey` items, which you want to use for filtering the hierarchy.\n * - You want to create filter paths based on node label, but also apply some extra conditions (for example exclude paths with sub-models).\n * - You want to construct custom filtered paths. For example: create a filter path for each geometric element which has a parent element.\n *\n * @note Paths returned by `createInstanceKeyPaths` will not have `autoExpand` flag set. If you want nodes to be expanded, iterate over the paths and\n * set `autoExpand: true` manually.\n */\n getFilteredPaths?: (props: {\n /** A function that creates filtering paths based on provided target instance keys or node label. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> } | { label: string }) => Promise<NormalizedHierarchyFilteringPath[]>;\n /** Filter which would be used to create filter paths if `getFilteredPaths` wouldn't be provided. */\n filter?: string;\n }) => Promise<HierarchyFilteringPath[] | undefined>;\n /**\n * Optional function for restricting the visible hierarchy to a specific sub-tree of nodes, without changing how filtering works.\n *\n * Use when you want to display only part of the hierarchy, but still allow normal filtering within that sub-tree.\n *\n * When defined, only nodes that are in the provided paths or children of target nodes will be part of the hierarchy.\n * Filtering (by label or custom logic) will still apply within this sub-tree.\n *\n * Key difference:\n * - `getFilteredPaths` determines which nodes should be shown, giving you full control over filtering logic.\n * - `getSubTreePaths` restricts the hierarchy to a sub-tree, but does not override the filtering logic — filtering is still applied within the restricted sub-tree.\n */\n getSubTreePaths?: (props: {\n /** A function that creates filtering paths based on provided target instance keys. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> }) => Promise<NormalizedHierarchyFilteringPath[]>;\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 getSubTreePaths,\n}: UseModelsTreeProps): UseModelsTreeResult {\n const [filteringError, setFilteringError] = useState<ModelsTreeFilteringError | undefined>(undefined);\n const [subTreeError, setSubTreeError] = useState<ModelsTreeSubTreeError | 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 getSubTreePathsInternal = useMemo<\n ((...props: Parameters<Required<VisibilityTreeProps>[\"getFilteredPaths\"]>) => Promise<HierarchyNodeIdentifiersPath[]>) | undefined\n >(() => {\n if (!getSubTreePaths) {\n return undefined;\n }\n return async ({ imodelAccess, abortSignal }) => {\n try {\n const paths = await getSubTreePaths({\n createInstanceKeyPaths: async ({ targetItems }) =>\n ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n targetItems,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n limit: \"unbounded\",\n abortSignal,\n }),\n });\n return paths.map(HierarchyFilteringPath.normalize).map(({ path }) => path);\n } catch (e) {\n const newError = \"unknownSubTreeError\";\n setSubTreeError(newError);\n return [];\n }\n };\n }, [getModelsTreeIdsCache, hierarchyConfiguration, getSubTreePaths]);\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 && !getSubTreePathsInternal) {\n onFilteredPathsChanged(undefined);\n }\n\n const handlePaths = async (filteredPaths: HierarchyFilteringPath[] | undefined, classInspector: ECClassHierarchyInspector) => {\n onFilteredPathsChanged(filteredPaths);\n if (!onModelsFiltered) {\n return;\n }\n\n const modelIds = filteredPaths ? await getModels(filteredPaths, getModelsTreeIdsCache(), classInspector) : undefined;\n onModelsFiltered(modelIds);\n };\n\n if (loadFocusedItems) {\n return async ({ imodelAccess, abortSignal }) => {\n try {\n const focusedItems = await collectFocusedItems(loadFocusedItems);\n return await createFilteringPathsResult({\n getFilteringPaths: async () => {\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n idsCache: getModelsTreeIdsCache(),\n targetItems: focusedItems,\n hierarchyConfig: hierarchyConfiguration,\n abortSignal,\n });\n return paths.map(({ path, options }) => ({ path, options: { ...options, autoExpand: true } }));\n },\n getSubTreePaths: async () => (getSubTreePathsInternal ? getSubTreePathsInternal({ imodelAccess, abortSignal }) : undefined),\n handlePaths: async (paths) => handlePaths(paths, imodelAccess),\n });\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, abortSignal }) => {\n try {\n return await createFilteringPathsResult({\n getFilteringPaths: async () => {\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 abortSignal,\n }),\n filter,\n });\n return paths?.map(HierarchyFilteringPath.normalize);\n },\n getSubTreePaths: async () => (getSubTreePathsInternal ? getSubTreePathsInternal({ imodelAccess, abortSignal }) : undefined),\n handlePaths: async (paths) => handlePaths(paths, imodelAccess),\n });\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, abortSignal }) => {\n onFeatureUsed({ featureId: \"filtering\", reportInteraction: true });\n try {\n return await createFilteringPathsResult({\n getFilteringPaths: async () => {\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n label: filter,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n abortSignal,\n });\n return paths.map(({ path, options }) => ({ path, options: { ...options, autoExpand: true } }));\n },\n getSubTreePaths: async () => (getSubTreePathsInternal ? getSubTreePathsInternal({ imodelAccess, abortSignal }) : undefined),\n handlePaths: async (paths) => handlePaths(paths, imodelAccess),\n });\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 getSubTreePathsInternal;\n }, [\n filter,\n loadFocusedItems,\n getModelsTreeIdsCache,\n onFeatureUsed,\n getFilteredPaths,\n hierarchyConfiguration,\n onModelsFiltered,\n onFilteredPathsChanged,\n getSubTreePathsInternal,\n ]);\n\n const nodeSelectionPredicate = useCallback<NonNullable<VisibilityTreeProps[\"selectionPredicate\"]>>(\n (node) => {\n if (!nodeTypeSelectionPredicate) {\n return true;\n }\n return nodeTypeSelectionPredicate({ node, type: ModelsTreeNode.getType(node.nodeData) });\n },\n [nodeTypeSelectionPredicate],\n );\n\n return {\n modelsTreeProps: {\n treeName: \"models-tree-v2\",\n visibilityHandlerFactory,\n getHierarchyDefinition,\n getFilteredPaths: getPaths,\n noDataMessage: getNoDataMessage(filter, subTreeError, 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, subTreeError?: ModelsTreeSubTreeError, filteringError?: ModelsTreeFilteringError) {\n if (isSubTreeError(subTreeError)) {\n return <Text>{TreeWidget.translate(`modelsTree.subTree.${subTreeError}`)}</Text>;\n }\n if (isInstanceFocusError(filteringError)) {\n return <InstanceFocusError error={filteringError} />;\n }\n if (isFilterError(filteringError)) {\n return <Text>{TreeWidget.translate(`modelsTree.filtering.${filteringError}`)}</Text>;\n }\n if (filter) {\n return <Text>{TreeWidget.translate(\"modelsTree.filtering.noMatches\", { filter })}</Text>;\n }\n return undefined;\n}\n\nfunction isSubTreeError(error: ModelsTreeSubTreeError | undefined) {\n return error === \"unknownSubTreeError\";\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\nasync function createFilteringPathsResult({\n getSubTreePaths,\n getFilteringPaths,\n handlePaths,\n}: {\n getSubTreePaths: () => Promise<HierarchyNodeIdentifiersPath[] | undefined>;\n getFilteringPaths: () => Promise<NormalizedHierarchyFilteringPath[] | undefined>;\n handlePaths: (filteredPaths: HierarchyFilteringPath[] | undefined) => Promise<void>;\n}): Promise<HierarchyFilteringPath[] | undefined> {\n const [subTreePaths, filterPaths] = await Promise.all([getSubTreePaths(), getFilteringPaths()]);\n let joinedPaths: HierarchyFilteringPath[] | undefined;\n try {\n if (subTreePaths && filterPaths) {\n return (joinedPaths = joinHierarchyFilteringPaths(subTreePaths, filterPaths));\n }\n if (subTreePaths) {\n return (joinedPaths = subTreePaths);\n }\n if (filterPaths) {\n return (joinedPaths = filterPaths);\n }\n } finally {\n void handlePaths(joinedPaths);\n }\n return joinedPaths;\n}\n"]}
1
+ {"version":3,"file":"UseModelsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/models-tree/UseModelsTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, 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 { HierarchyFilteringPath, HierarchyNode, HierarchyNodeIdentifier, HierarchyNodeKey } from \"@itwin/presentation-hierarchies\";\nimport { TreeWidget } from \"../../../TreeWidget.js\";\nimport { useFocusedInstancesContext } from \"../common/FocusedInstancesContext.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { useTelemetryContext } from \"../common/UseTelemetryContext.js\";\nimport { joinHierarchyFilteringPaths } from \"../common/Utils.js\";\nimport { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\nimport { ModelsTreeNode } from \"./internal/ModelsTreeNode.js\";\nimport { createModelsTreeVisibilityHandler } from \"./internal/ModelsTreeVisibilityHandler.js\";\nimport { defaultHierarchyConfiguration, ModelsTreeDefinition } from \"./ModelsTreeDefinition.js\";\n\nimport type { ReactElement } from \"react\";\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { GroupingHierarchyNode, HierarchyNodeIdentifiersPath, InstancesNodeKey } from \"@itwin/presentation-hierarchies\";\nimport type { PresentationHierarchyNode } from \"@itwin/presentation-hierarchies-react\";\nimport type { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { NormalizedHierarchyFilteringPath } from \"../common/Utils.js\";\nimport type { ModelsTreeVisibilityHandlerOverrides } from \"./internal/ModelsTreeVisibilityHandler.js\";\nimport type { ClassGroupingHierarchyNode, ElementsGroupInfo, ModelsTreeHierarchyConfiguration } from \"./ModelsTreeDefinition.js\";\n\ntype ModelsTreeFilteringError = \"tooManyFilterMatches\" | \"tooManyInstancesFocused\" | \"unknownFilterError\" | \"unknownInstanceFocusError\";\ntype ModelsTreeSubTreeError = \"unknownSubTreeError\";\n\n/** @beta */\nexport interface UseModelsTreeProps {\n /**\n * Optional search string used to filter tree nodes by label, as well as highlight matching substrings in the tree.\n * Nodes that do not contain this string in their label will be filtered out.\n *\n * If `getFilteredPaths` function is provided, it will take precedence and automatic filtering by this string will not be applied.\n * Instead, the string will be supplied to the given `getFilteredPaths` function for consumers to apply the filtering.\n */\n filter?: string;\n activeView: Viewport;\n hierarchyConfig?: Partial<ModelsTreeHierarchyConfiguration>;\n visibilityHandlerOverrides?: ModelsTreeVisibilityHandlerOverrides;\n /**\n * Optional function for applying custom filtering on the hierarchy. Use it when you want full control over which nodes should be displayed, based on more complex logic or known instance keys.\n *\n * When defined, this function takes precedence over filtering by `filter` string. If both are supplied, the `filter` is provided as an argument to `getFilteredPaths`.\n *\n * @param props Parameters provided when `getFilteredPaths` is called:\n * - `createInstanceKeyPaths`: Helper function to create filter paths.\n * - `filter`: The filter string which would otherwise be used for default filtering.\n *\n * **Example use cases:**\n * - You have a list of `InstanceKey` items, which you want to use for filtering the hierarchy.\n * - You want to create filter paths based on node label, but also apply some extra conditions (for example exclude paths with sub-models).\n * - You want to construct custom filtered paths. For example: create a filter path for each geometric element which has a parent element.\n *\n * @note Paths returned by `createInstanceKeyPaths` will not have `autoExpand` flag set. If you want nodes to be expanded, iterate over the paths and\n * set `autoExpand: true` manually.\n */\n getFilteredPaths?: (props: {\n /** A function that creates filtering paths based on provided target instance keys or node label. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> } | { label: string }) => Promise<NormalizedHierarchyFilteringPath[]>;\n /** Filter which would be used to create filter paths if `getFilteredPaths` wouldn't be provided. */\n filter?: string;\n }) => Promise<HierarchyFilteringPath[] | undefined>;\n /**\n * Optional function for restricting the visible hierarchy to a specific sub-tree of nodes, without changing how filtering works.\n *\n * Use when you want to display only part of the hierarchy, but still allow normal filtering within that sub-tree.\n *\n * When defined, only nodes that are in the provided paths or children of target nodes will be part of the hierarchy.\n * Filtering (by label or custom logic) will still apply within this sub-tree.\n *\n * Key difference:\n * - `getFilteredPaths` determines which nodes should be shown, giving you full control over filtering logic.\n * - `getSubTreePaths` restricts the hierarchy to a sub-tree, but does not override the filtering logic — filtering is still applied within the restricted sub-tree.\n */\n getSubTreePaths?: (props: {\n /** A function that creates filtering paths based on provided target instance keys. */\n createInstanceKeyPaths: (props: { targetItems: Array<InstanceKey | ElementsGroupInfo> }) => Promise<NormalizedHierarchyFilteringPath[]>;\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 getSubTreePaths,\n}: UseModelsTreeProps): UseModelsTreeResult {\n const [filteringError, setFilteringError] = useState<ModelsTreeFilteringError | undefined>(undefined);\n const [subTreeError, setSubTreeError] = useState<ModelsTreeSubTreeError | 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 { getCache: getModelsTreeIdsCache } = useIdsCache<ModelsTreeIdsCache, { hierarchyConfig: ModelsTreeHierarchyConfiguration }>({\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig: hierarchyConfiguration }), [hierarchyConfiguration]),\n });\n\n const { visibilityHandlerFactory, onFilteredPathsChanged } = useCachedVisibility({\n activeView,\n overrides: visibilityHandlerOverrides,\n getModelsTreeIdsCache,\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 getSubTreePathsInternal = useMemo<\n ((...props: Parameters<Required<VisibilityTreeProps>[\"getFilteredPaths\"]>) => Promise<HierarchyNodeIdentifiersPath[]>) | undefined\n >(() => {\n if (!getSubTreePaths) {\n return undefined;\n }\n return async ({ imodelAccess, abortSignal }) => {\n try {\n const paths = await getSubTreePaths({\n createInstanceKeyPaths: async ({ targetItems }) =>\n ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n targetItems,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n limit: \"unbounded\",\n abortSignal,\n }),\n });\n return paths.map(HierarchyFilteringPath.normalize).map(({ path }) => path);\n } catch (e) {\n const newError = \"unknownSubTreeError\";\n setSubTreeError(newError);\n return [];\n }\n };\n }, [getModelsTreeIdsCache, hierarchyConfiguration, getSubTreePaths]);\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 && !getSubTreePathsInternal) {\n onFilteredPathsChanged(undefined);\n }\n\n const handlePaths = async (filteredPaths: HierarchyFilteringPath[] | undefined, classInspector: ECClassHierarchyInspector) => {\n onFilteredPathsChanged(filteredPaths);\n if (!onModelsFiltered) {\n return;\n }\n\n const modelIds = filteredPaths ? await getModels(filteredPaths, getModelsTreeIdsCache(), classInspector) : undefined;\n onModelsFiltered(modelIds);\n };\n\n if (loadFocusedItems) {\n return async ({ imodelAccess, abortSignal }) => {\n try {\n const focusedItems = await collectFocusedItems(loadFocusedItems);\n return await createFilteringPathsResult({\n getFilteringPaths: async () => {\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n idsCache: getModelsTreeIdsCache(),\n targetItems: focusedItems,\n hierarchyConfig: hierarchyConfiguration,\n abortSignal,\n });\n return paths.map(({ path, options }) => ({ path, options: { ...options, autoExpand: true } }));\n },\n getSubTreePaths: async () => (getSubTreePathsInternal ? getSubTreePathsInternal({ imodelAccess, abortSignal }) : undefined),\n handlePaths: async (paths) => handlePaths(paths, imodelAccess),\n });\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, abortSignal }) => {\n try {\n return await createFilteringPathsResult({\n getFilteringPaths: async () => {\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 abortSignal,\n }),\n filter,\n });\n return paths?.map(HierarchyFilteringPath.normalize);\n },\n getSubTreePaths: async () => (getSubTreePathsInternal ? getSubTreePathsInternal({ imodelAccess, abortSignal }) : undefined),\n handlePaths: async (paths) => handlePaths(paths, imodelAccess),\n });\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, abortSignal }) => {\n onFeatureUsed({ featureId: \"filtering\", reportInteraction: true });\n try {\n return await createFilteringPathsResult({\n getFilteringPaths: async () => {\n const paths = await ModelsTreeDefinition.createInstanceKeyPaths({\n imodelAccess,\n label: filter,\n idsCache: getModelsTreeIdsCache(),\n hierarchyConfig: hierarchyConfiguration,\n abortSignal,\n });\n return paths.map(({ path, options }) => ({ path, options: { ...options, autoExpand: true } }));\n },\n getSubTreePaths: async () => (getSubTreePathsInternal ? getSubTreePathsInternal({ imodelAccess, abortSignal }) : undefined),\n handlePaths: async (paths) => handlePaths(paths, imodelAccess),\n });\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 getSubTreePathsInternal;\n }, [\n filter,\n loadFocusedItems,\n getModelsTreeIdsCache,\n onFeatureUsed,\n getFilteredPaths,\n hierarchyConfiguration,\n onModelsFiltered,\n onFilteredPathsChanged,\n getSubTreePathsInternal,\n ]);\n\n const nodeSelectionPredicate = useCallback<NonNullable<VisibilityTreeProps[\"selectionPredicate\"]>>(\n (node) => {\n if (!nodeTypeSelectionPredicate) {\n return true;\n }\n return nodeTypeSelectionPredicate({ node, type: ModelsTreeNode.getType(node.nodeData) });\n },\n [nodeTypeSelectionPredicate],\n );\n\n return {\n modelsTreeProps: {\n treeName: \"models-tree-v2\",\n visibilityHandlerFactory,\n getHierarchyDefinition,\n getFilteredPaths: getPaths,\n noDataMessage: getNoDataMessage(filter, subTreeError, 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, subTreeError?: ModelsTreeSubTreeError, filteringError?: ModelsTreeFilteringError) {\n if (isSubTreeError(subTreeError)) {\n return <Text>{TreeWidget.translate(`modelsTree.subTree.${subTreeError}`)}</Text>;\n }\n if (isInstanceFocusError(filteringError)) {\n return <InstanceFocusError error={filteringError} />;\n }\n if (isFilterError(filteringError)) {\n return <Text>{TreeWidget.translate(`modelsTree.filtering.${filteringError}`)}</Text>;\n }\n if (filter) {\n return <Text>{TreeWidget.translate(\"modelsTree.filtering.noMatches\", { filter })}</Text>;\n }\n return undefined;\n}\n\nfunction isSubTreeError(error: ModelsTreeSubTreeError | undefined) {\n return error === \"unknownSubTreeError\";\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(props: {\n activeView: Viewport;\n getModelsTreeIdsCache: () => ModelsTreeIdsCache;\n overrides?: ModelsTreeVisibilityHandlerOverrides;\n}) {\n const { activeView, getModelsTreeIdsCache, overrides } = props;\n const currentIModelRef = useRef(activeView.iModel);\n\n const [filteredPaths, setFilteredPaths] = useState<HierarchyFilteringPath[]>();\n const [visibilityHandlerFactory, setVisibilityHandlerFactory] = useState<VisibilityTreeProps[\"visibilityHandlerFactory\"]>(() =>\n createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths),\n );\n\n useEffect(() => {\n currentIModelRef.current = activeView.iModel;\n setVisibilityHandlerFactory(() => createVisibilityHandlerFactory(activeView, getModelsTreeIdsCache, overrides, filteredPaths));\n }, [activeView, getModelsTreeIdsCache, overrides, filteredPaths]);\n\n return {\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\nasync function createFilteringPathsResult({\n getSubTreePaths,\n getFilteringPaths,\n handlePaths,\n}: {\n getSubTreePaths: () => Promise<HierarchyNodeIdentifiersPath[] | undefined>;\n getFilteringPaths: () => Promise<NormalizedHierarchyFilteringPath[] | undefined>;\n handlePaths: (filteredPaths: HierarchyFilteringPath[] | undefined) => Promise<void>;\n}): Promise<HierarchyFilteringPath[] | undefined> {\n const [subTreePaths, filterPaths] = await Promise.all([getSubTreePaths(), getFilteringPaths()]);\n let joinedPaths: HierarchyFilteringPath[] | undefined;\n try {\n if (subTreePaths && filterPaths) {\n return (joinedPaths = joinHierarchyFilteringPaths(subTreePaths, filterPaths));\n }\n if (subTreePaths) {\n return (joinedPaths = subTreePaths);\n }\n if (filterPaths) {\n return (joinedPaths = filterPaths);\n }\n } finally {\n void handlePaths(joinedPaths);\n }\n return joinedPaths;\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ModelsTreeHierarchyConfiguration }>) {\n return new ModelsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig);\n}\n"]}
@@ -3,7 +3,7 @@ import type { Id64Arg, Id64Array, Id64String } from "@itwin/core-bentley";
3
3
  import type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
4
4
  type ModelsTreeHierarchyConfiguration = ConstructorParameters<typeof ModelsTreeDefinition>[0]["hierarchyConfig"];
5
5
  /** @internal */
6
- export declare class ModelsTreeIdsCache {
6
+ export declare class ModelsTreeIdsCache implements Disposable {
7
7
  private _queryExecutor;
8
8
  private _hierarchyConfig;
9
9
  private readonly _categoryElementCounts;