@itwin/tree-widget-react 3.17.4 → 3.17.5
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.
- package/CHANGELOG.md +10 -2
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +1 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +3 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +11 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +3 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +12 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
# Change Log - @itwin/tree-widget-react
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on
|
|
3
|
+
<!-- This log was last generated on Wed, 21 Jan 2026 12:50:27 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 3.17.5
|
|
8
|
+
|
|
9
|
+
Wed, 21 Jan 2026 12:50:27 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Fix enabling category display in categories tree making other categories also visible, when their elements are under hidden model. ([#1556](https://github.com/iTwin/viewer-components-react/pull/1556))
|
|
14
|
+
|
|
7
15
|
## 3.17.4
|
|
8
16
|
|
|
9
|
-
Thu, 15 Jan 2026 14:30:
|
|
17
|
+
Thu, 15 Jan 2026 14:30:28 GMT
|
|
10
18
|
|
|
11
19
|
### Patches
|
|
12
20
|
|
|
@@ -29,6 +29,7 @@ export declare class CategoriesTreeIdsCache implements Disposable {
|
|
|
29
29
|
definitionContainers: Id64Array;
|
|
30
30
|
}>;
|
|
31
31
|
getCategoriesElementModels(categoryIds: Id64Arg): Observable<Map<Id64String, Id64Set>>;
|
|
32
|
+
getCategoriesOfElementModel(modelId: Id64String): Observable<Id64Set | undefined>;
|
|
32
33
|
getAllContainedCategories({ definitionContainerIds, includeEmptyCategories, }: {
|
|
33
34
|
definitionContainerIds: Id64Array;
|
|
34
35
|
includeEmptyCategories?: boolean;
|
|
@@ -281,6 +281,9 @@ class CategoriesTreeIdsCache {
|
|
|
281
281
|
return acc;
|
|
282
282
|
}, new Map()));
|
|
283
283
|
}
|
|
284
|
+
getCategoriesOfElementModel(modelId) {
|
|
285
|
+
return this.getElementModelsCategories().pipe((0, rxjs_1.map)((elementModelsCategories) => elementModelsCategories.get(modelId)));
|
|
286
|
+
}
|
|
284
287
|
getAllContainedCategories({ definitionContainerIds, includeEmptyCategories, }) {
|
|
285
288
|
return this.getDefinitionContainersInfo().pipe((0, rxjs_1.mergeMap)((definitionContainersInfo) => (0, rxjs_1.from)(definitionContainerIds).pipe((0, rxjs_1.mergeMap)((definitionContainerId) => {
|
|
286
289
|
const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);
|
|
@@ -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 { defer, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { setIntersection } from \"../../common/internal/Utils.js\";\nimport { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./ClassNameDefinitions.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Arg, 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: Array<{ id: Id64String; hasElements: boolean }>;\n hasElements: boolean;\n}\n\ninterface CategoriesInfo {\n childCategories: CategoryInfo[];\n parentDefinitionContainerExists: boolean;\n}\n\ninterface CategoryInfo {\n id: Id64String;\n childCount: number;\n hasElements: boolean;\n}\n\n/** @internal */\nexport class CategoriesTreeIdsCache implements Disposable {\n #definitionContainersInfo: Observable<Map<Id64String, DefinitionContainerInfo>> | undefined;\n #modelsCategoriesInfo: Observable<Map<Id64String, CategoriesInfo>> | undefined;\n #subCategoriesInfo: Observable<Map<Id64String, Id64Set>> | undefined;\n #elementModelsCategories: Observable<Map<Id64String, Id64Set>> | undefined;\n #categoryClass: string;\n #categoryElementClass: string;\n #categoryModelClass: string;\n #isDefinitionContainerSupported: Observable<boolean> | undefined;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, viewType: \"3d\" | \"2d\", componentId?: GuidString) {\n this.#queryExecutor = queryExecutor;\n const { categoryClass, categoryElementClass, categoryModelClass } = getClassesByView(viewType);\n this.#categoryClass = categoryClass;\n this.#categoryElementClass = categoryElementClass;\n this.#categoryModelClass = categoryModelClass;\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"CategoriesTreeIdsCache\";\n }\n\n public [Symbol.dispose]() {}\n\n private queryElementModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/element-models-and-categories`,\n },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId };\n }),\n );\n }\n\n private queryCategories(): Observable<{\n id: Id64String;\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCount: number;\n hasElements: boolean;\n }> {\n return this.getIsDefinitionContainerSupported().pipe(\n mergeMap((isDefinitionContainerSupported) =>\n defer(() => {\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 IFNULL(\n (SELECT 1 FROM ${this.#categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId LIMIT 1),\n 0\n ) hasElements\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 GROUP BY this.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: categoriesQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/categories` },\n );\n }).pipe(\n map((row) => {\n return {\n id: row.id,\n modelId: row.modelId,\n parentDefinitionContainerExists: row.parentDefinitionContainerExists,\n childCount: row.childCount,\n hasElements: !!row.hasElements,\n };\n }),\n ),\n ),\n );\n }\n\n private queryIsDefinitionContainersSupported(): Observable<boolean> {\n return defer(() => {\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 LIMIT 1\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { restartToken: `${this.#componentName}/${this.#componentId}/is-definition-container-supported` },\n );\n }).pipe(\n toArray(),\n map((rows) => rows.length > 0),\n );\n }\n\n private queryDefinitionContainers(): Observable<{ id: Id64String; modelId: Id64String; hasElements: boolean }> {\n return defer(() => {\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 CATEGORIES_MODELS_CTE = \"CategoriesModels\";\n const ctes = [\n `${CATEGORIES_MODELS_CTE}(ModelId, HasElements) AS (\n SELECT\n c.Model.Id,\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} e\n WHERE e.Category.Id = c.ECInstanceId\n LIMIT 1\n ), 0)\n FROM\n ${this.#categoryClass} c\n WHERE\n NOT c.IsPrivate\n )`,\n `\n ${DEFINITION_CONTAINERS_CTE}(ECInstanceId, ModelId, HasElements) AS (\n SELECT\n dc.ECInstanceId,\n dc.Model.Id,\n c.HasElements\n FROM ${DEFINITION_CONTAINER_CLASS} dc\n JOIN ${CATEGORIES_MODELS_CTE} c ON dc.ECInstanceId = c.ModelId\n WHERE NOT dc.IsPrivate\n\n UNION ALL\n\n SELECT\n pdc.ECInstanceId,\n pdc.Model.Id,\n cdc.HasElements\n FROM\n ${DEFINITION_CONTAINERS_CTE} cdc\n JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId\n WHERE NOT pdc.IsPrivate\n )\n `,\n ];\n const definitionsQuery = `\n SELECT dc.ECInstanceId id, dc.ModelId modelId, MAX(dc.HasElements) hasElements FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ctes, ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/definition-containers` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, modelId: row.modelId, hasElements: !!row.hasElements };\n }),\n );\n }\n\n private queryVisibleSubCategories(categoriesInfo: Id64Array): Observable<{ id: Id64String; parentId: Id64String }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/visible-sub-categories` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.categoryId };\n }),\n );\n }\n\n private getModelsCategoriesInfo() {\n this.#modelsCategoriesInfo ??= this.queryCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelCategories = acc.get(queriedCategory.modelId);\n if (modelCategories === undefined) {\n modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };\n acc.set(queriedCategory.modelId, modelCategories);\n }\n modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount, hasElements: queriedCategory.hasElements });\n return acc;\n }, new Map<Id64String, CategoriesInfo>()),\n )\n .pipe(shareReplay());\n return this.#modelsCategoriesInfo;\n }\n\n private getElementModelsCategories() {\n this.#elementModelsCategories ??= this.queryElementModelCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelEntry = acc.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = new Set();\n acc.set(queriedCategory.modelId, modelEntry);\n }\n modelEntry.add(queriedCategory.categoryId);\n return acc;\n }, new Map<Id64String, Id64Set>()),\n )\n .pipe(shareReplay());\n return this.#elementModelsCategories;\n }\n\n private getSubCategoriesInfo() {\n this.#subCategoriesInfo ??= this.getModelsCategoriesInfo()\n .pipe(\n mergeMap((modelsCategoriesInfo) => from(modelsCategoriesInfo.values())),\n reduce((acc, modelCategoriesInfo) => {\n acc.push(...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n mergeMap((categoriesWithMoreThanOneSubCategory) => {\n const allSubCategories = new Map<Id64String, Id64Set>();\n if (categoriesWithMoreThanOneSubCategory.length === 0) {\n return of(allSubCategories);\n }\n return this.queryVisibleSubCategories(categoriesWithMoreThanOneSubCategory).pipe(\n reduce((acc, queriedSubCategory) => {\n const entry = acc.get(queriedSubCategory.parentId);\n if (!entry) {\n acc.set(queriedSubCategory.parentId, new Set([queriedSubCategory.id]));\n return acc;\n }\n entry.add(queriedSubCategory.id);\n return acc;\n }, allSubCategories),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#subCategoriesInfo;\n }\n\n private getDefinitionContainersInfo() {\n this.#definitionContainersInfo ??= forkJoin({\n isDefinitionContainerSupported: this.getIsDefinitionContainerSupported(),\n modelsCategoriesInfo: this.getModelsCategoriesInfo(),\n })\n .pipe(\n mergeMap(({ isDefinitionContainerSupported, modelsCategoriesInfo }) => {\n const definitionContainersInfo = new Map<Id64String, DefinitionContainerInfo>();\n if (!isDefinitionContainerSupported || modelsCategoriesInfo.size === 0) {\n return of(definitionContainersInfo);\n }\n return this.queryDefinitionContainers().pipe(\n reduce((acc, queriedDefinitionContainer) => {\n const modelCategoriesInfo = modelsCategoriesInfo.get(queriedDefinitionContainer.id);\n acc.set(queriedDefinitionContainer.id, {\n childCategories: modelCategoriesInfo?.childCategories ?? [],\n modelId: queriedDefinitionContainer.modelId,\n childDefinitionContainers: [],\n parentDefinitionContainerExists: false,\n hasElements: queriedDefinitionContainer.hasElements,\n });\n return acc;\n }, definitionContainersInfo),\n map((result) => {\n for (const [definitionContainerId, definitionContainerInfo] of result) {\n const parentDefinitionContainer = result.get(definitionContainerInfo.modelId);\n if (parentDefinitionContainer !== undefined) {\n parentDefinitionContainer.childDefinitionContainers.push({ id: definitionContainerId, hasElements: definitionContainerInfo.hasElements });\n definitionContainerInfo.parentDefinitionContainerExists = true;\n parentDefinitionContainer.hasElements = parentDefinitionContainer.hasElements || definitionContainerInfo.hasElements;\n }\n }\n\n return result;\n }),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#definitionContainersInfo;\n }\n\n public getDirectChildDefinitionContainersAndCategories({\n parentDefinitionContainerIds,\n includeEmpty,\n }: {\n parentDefinitionContainerIds: Id64Array;\n includeEmpty?: boolean;\n }): Observable<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(parentDefinitionContainerIds).pipe(\n reduce(\n (acc, parentDefinitionContainerId) => {\n const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);\n if (parentDefinitionContainerInfo !== undefined) {\n acc.definitionContainers.push(...applyElementsFilter(parentDefinitionContainerInfo.childDefinitionContainers, includeEmpty).map((dc) => dc.id));\n acc.categories.push(...applyElementsFilter(parentDefinitionContainerInfo.childCategories, includeEmpty));\n }\n return acc;\n },\n { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() },\n ),\n ),\n ),\n );\n }\n\n public getCategoriesElementModels(categoryIds: Id64Arg): Observable<Map<Id64String, Id64Set>> {\n return this.getElementModelsCategories().pipe(\n mergeMap((elementModelsCategories) => elementModelsCategories.entries()),\n reduce((acc, [modelId, modelCategoryIds]) => {\n const sharedCategories = setIntersection(Id64.iterable(categoryIds), modelCategoryIds);\n if (sharedCategories.size > 0) {\n acc.set(modelId, sharedCategories);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n );\n }\n\n public getAllContainedCategories({\n definitionContainerIds,\n includeEmptyCategories,\n }: {\n definitionContainerIds: Id64Array;\n includeEmptyCategories?: boolean;\n }): Observable<Id64Set> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(definitionContainerIds).pipe(\n mergeMap((definitionContainerId) => {\n const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of({ directCategories: undefined, indirectCategories: undefined });\n }\n const childDefinitionContainerIds = definitionContainerInfo.childDefinitionContainers.map(({ id }) => id);\n return (\n childDefinitionContainerIds.length > 0\n ? this.getAllContainedCategories({\n definitionContainerIds: childDefinitionContainerIds,\n includeEmptyCategories,\n })\n : of(new Set<string>())\n ).pipe(\n map((indirectCategories) => {\n return {\n directCategories: applyElementsFilter(definitionContainerInfo.childCategories, includeEmptyCategories).map((category) => category.id),\n indirectCategories,\n };\n }),\n );\n }),\n reduce((acc, { directCategories, indirectCategories }) => {\n directCategories?.forEach((categoryId) => acc.add(categoryId));\n indirectCategories?.forEach((categoryId) => acc.add(categoryId));\n return acc;\n }, new Set<Id64String>()),\n ),\n ),\n );\n }\n\n public getInstanceKeyPaths(\n props: { categoryId: Id64String } | { definitionContainerId: Id64String } | { subCategoryId: Id64String },\n ): Observable<InstanceKey[]> {\n if (\"subCategoryId\" in props) {\n return this.getSubCategoriesInfo().pipe(\n mergeMap((subCategoriesInfo) => {\n let categoryOfSubCategory: Id64String | undefined;\n for (const [categoryId, subCategories] of subCategoriesInfo.entries()) {\n if (subCategories.has(props.subCategoryId)) {\n categoryOfSubCategory = categoryId;\n break;\n }\n }\n if (categoryOfSubCategory === undefined) {\n return of([]);\n }\n return this.getInstanceKeyPaths({ categoryId: categoryOfSubCategory }).pipe(\n map((pathToCategory) => [...pathToCategory, { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }]),\n );\n }),\n );\n }\n\n if (\"categoryId\" in props) {\n return this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => {\n for (const [modelId, modelCategoriesInfo] of modelsCategoriesInfo) {\n if (modelCategoriesInfo.childCategories.find((childCategory) => childCategory.id === props.categoryId)) {\n const instanceKey = { id: props.categoryId, className: this.#categoryClass };\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n\n return this.getInstanceKeyPaths({ definitionContainerId: modelId }).pipe(\n map((pathToDefinitionContainer) => [...pathToDefinitionContainer, instanceKey]),\n );\n }\n }\n return of([]);\n }),\n );\n }\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => {\n const definitionContainerInfo = definitionContainersInfo.get(props.definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of([]);\n }\n const instanceKey = { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS };\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n return this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId }).pipe(\n map((pathToParentDefinitionContainer) => [...pathToParentDefinitionContainer, instanceKey]),\n );\n }),\n );\n }\n\n public getAllDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: Id64Array;\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (definitionContainerInfo.hasElements || !!props?.includeEmpty) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getRootDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: CategoryInfo[];\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo));\n }\n return acc;\n }, new Array<CategoryInfo>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (!definitionContainerInfo.parentDefinitionContainerExists && (definitionContainerInfo.hasElements || !!props?.includeEmpty)) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getSubCategories(categoryId: Id64String): Observable<Id64Set> {\n return this.getSubCategoriesInfo().pipe(map((subCategoriesInfo) => subCategoriesInfo.get(categoryId) ?? new Set()));\n }\n\n public getIsDefinitionContainerSupported(): Observable<boolean> {\n this.#isDefinitionContainerSupported ??= this.queryIsDefinitionContainersSupported().pipe(shareReplay());\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\nfunction applyElementsFilter<T extends { hasElements?: boolean }>(list: T[], includeEmpty: boolean | undefined): T[] {\n return includeEmpty ? list : list.filter(({ hasElements }) => !!hasElements);\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 { defer, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { setIntersection } from \"../../common/internal/Utils.js\";\nimport { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./ClassNameDefinitions.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Arg, 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: Array<{ id: Id64String; hasElements: boolean }>;\n hasElements: boolean;\n}\n\ninterface CategoriesInfo {\n childCategories: CategoryInfo[];\n parentDefinitionContainerExists: boolean;\n}\n\ninterface CategoryInfo {\n id: Id64String;\n childCount: number;\n hasElements: boolean;\n}\n\n/** @internal */\nexport class CategoriesTreeIdsCache implements Disposable {\n #definitionContainersInfo: Observable<Map<Id64String, DefinitionContainerInfo>> | undefined;\n #modelsCategoriesInfo: Observable<Map<Id64String, CategoriesInfo>> | undefined;\n #subCategoriesInfo: Observable<Map<Id64String, Id64Set>> | undefined;\n #elementModelsCategories: Observable<Map<Id64String, Id64Set>> | undefined;\n #categoryClass: string;\n #categoryElementClass: string;\n #categoryModelClass: string;\n #isDefinitionContainerSupported: Observable<boolean> | undefined;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, viewType: \"3d\" | \"2d\", componentId?: GuidString) {\n this.#queryExecutor = queryExecutor;\n const { categoryClass, categoryElementClass, categoryModelClass } = getClassesByView(viewType);\n this.#categoryClass = categoryClass;\n this.#categoryElementClass = categoryElementClass;\n this.#categoryModelClass = categoryModelClass;\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"CategoriesTreeIdsCache\";\n }\n\n public [Symbol.dispose]() {}\n\n private queryElementModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/element-models-and-categories`,\n },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId };\n }),\n );\n }\n\n private queryCategories(): Observable<{\n id: Id64String;\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCount: number;\n hasElements: boolean;\n }> {\n return this.getIsDefinitionContainerSupported().pipe(\n mergeMap((isDefinitionContainerSupported) =>\n defer(() => {\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 IFNULL(\n (SELECT 1 FROM ${this.#categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId LIMIT 1),\n 0\n ) hasElements\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 GROUP BY this.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: categoriesQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/categories` },\n );\n }).pipe(\n map((row) => {\n return {\n id: row.id,\n modelId: row.modelId,\n parentDefinitionContainerExists: row.parentDefinitionContainerExists,\n childCount: row.childCount,\n hasElements: !!row.hasElements,\n };\n }),\n ),\n ),\n );\n }\n\n private queryIsDefinitionContainersSupported(): Observable<boolean> {\n return defer(() => {\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 LIMIT 1\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { restartToken: `${this.#componentName}/${this.#componentId}/is-definition-container-supported` },\n );\n }).pipe(\n toArray(),\n map((rows) => rows.length > 0),\n );\n }\n\n private queryDefinitionContainers(): Observable<{ id: Id64String; modelId: Id64String; hasElements: boolean }> {\n return defer(() => {\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 CATEGORIES_MODELS_CTE = \"CategoriesModels\";\n const ctes = [\n `${CATEGORIES_MODELS_CTE}(ModelId, HasElements) AS (\n SELECT\n c.Model.Id,\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} e\n WHERE e.Category.Id = c.ECInstanceId\n LIMIT 1\n ), 0)\n FROM\n ${this.#categoryClass} c\n WHERE\n NOT c.IsPrivate\n )`,\n `\n ${DEFINITION_CONTAINERS_CTE}(ECInstanceId, ModelId, HasElements) AS (\n SELECT\n dc.ECInstanceId,\n dc.Model.Id,\n c.HasElements\n FROM ${DEFINITION_CONTAINER_CLASS} dc\n JOIN ${CATEGORIES_MODELS_CTE} c ON dc.ECInstanceId = c.ModelId\n WHERE NOT dc.IsPrivate\n\n UNION ALL\n\n SELECT\n pdc.ECInstanceId,\n pdc.Model.Id,\n cdc.HasElements\n FROM\n ${DEFINITION_CONTAINERS_CTE} cdc\n JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId\n WHERE NOT pdc.IsPrivate\n )\n `,\n ];\n const definitionsQuery = `\n SELECT dc.ECInstanceId id, dc.ModelId modelId, MAX(dc.HasElements) hasElements FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ctes, ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/definition-containers` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, modelId: row.modelId, hasElements: !!row.hasElements };\n }),\n );\n }\n\n private queryVisibleSubCategories(categoriesInfo: Id64Array): Observable<{ id: Id64String; parentId: Id64String }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/visible-sub-categories` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.categoryId };\n }),\n );\n }\n\n private getModelsCategoriesInfo() {\n this.#modelsCategoriesInfo ??= this.queryCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelCategories = acc.get(queriedCategory.modelId);\n if (modelCategories === undefined) {\n modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };\n acc.set(queriedCategory.modelId, modelCategories);\n }\n modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount, hasElements: queriedCategory.hasElements });\n return acc;\n }, new Map<Id64String, CategoriesInfo>()),\n )\n .pipe(shareReplay());\n return this.#modelsCategoriesInfo;\n }\n\n private getElementModelsCategories() {\n this.#elementModelsCategories ??= this.queryElementModelCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelEntry = acc.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = new Set();\n acc.set(queriedCategory.modelId, modelEntry);\n }\n modelEntry.add(queriedCategory.categoryId);\n return acc;\n }, new Map<Id64String, Id64Set>()),\n )\n .pipe(shareReplay());\n return this.#elementModelsCategories;\n }\n\n private getSubCategoriesInfo() {\n this.#subCategoriesInfo ??= this.getModelsCategoriesInfo()\n .pipe(\n mergeMap((modelsCategoriesInfo) => from(modelsCategoriesInfo.values())),\n reduce((acc, modelCategoriesInfo) => {\n acc.push(...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n mergeMap((categoriesWithMoreThanOneSubCategory) => {\n const allSubCategories = new Map<Id64String, Id64Set>();\n if (categoriesWithMoreThanOneSubCategory.length === 0) {\n return of(allSubCategories);\n }\n return this.queryVisibleSubCategories(categoriesWithMoreThanOneSubCategory).pipe(\n reduce((acc, queriedSubCategory) => {\n const entry = acc.get(queriedSubCategory.parentId);\n if (!entry) {\n acc.set(queriedSubCategory.parentId, new Set([queriedSubCategory.id]));\n return acc;\n }\n entry.add(queriedSubCategory.id);\n return acc;\n }, allSubCategories),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#subCategoriesInfo;\n }\n\n private getDefinitionContainersInfo() {\n this.#definitionContainersInfo ??= forkJoin({\n isDefinitionContainerSupported: this.getIsDefinitionContainerSupported(),\n modelsCategoriesInfo: this.getModelsCategoriesInfo(),\n })\n .pipe(\n mergeMap(({ isDefinitionContainerSupported, modelsCategoriesInfo }) => {\n const definitionContainersInfo = new Map<Id64String, DefinitionContainerInfo>();\n if (!isDefinitionContainerSupported || modelsCategoriesInfo.size === 0) {\n return of(definitionContainersInfo);\n }\n return this.queryDefinitionContainers().pipe(\n reduce((acc, queriedDefinitionContainer) => {\n const modelCategoriesInfo = modelsCategoriesInfo.get(queriedDefinitionContainer.id);\n acc.set(queriedDefinitionContainer.id, {\n childCategories: modelCategoriesInfo?.childCategories ?? [],\n modelId: queriedDefinitionContainer.modelId,\n childDefinitionContainers: [],\n parentDefinitionContainerExists: false,\n hasElements: queriedDefinitionContainer.hasElements,\n });\n return acc;\n }, definitionContainersInfo),\n map((result) => {\n for (const [definitionContainerId, definitionContainerInfo] of result) {\n const parentDefinitionContainer = result.get(definitionContainerInfo.modelId);\n if (parentDefinitionContainer !== undefined) {\n parentDefinitionContainer.childDefinitionContainers.push({ id: definitionContainerId, hasElements: definitionContainerInfo.hasElements });\n definitionContainerInfo.parentDefinitionContainerExists = true;\n parentDefinitionContainer.hasElements = parentDefinitionContainer.hasElements || definitionContainerInfo.hasElements;\n }\n }\n\n return result;\n }),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#definitionContainersInfo;\n }\n\n public getDirectChildDefinitionContainersAndCategories({\n parentDefinitionContainerIds,\n includeEmpty,\n }: {\n parentDefinitionContainerIds: Id64Array;\n includeEmpty?: boolean;\n }): Observable<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(parentDefinitionContainerIds).pipe(\n reduce(\n (acc, parentDefinitionContainerId) => {\n const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);\n if (parentDefinitionContainerInfo !== undefined) {\n acc.definitionContainers.push(...applyElementsFilter(parentDefinitionContainerInfo.childDefinitionContainers, includeEmpty).map((dc) => dc.id));\n acc.categories.push(...applyElementsFilter(parentDefinitionContainerInfo.childCategories, includeEmpty));\n }\n return acc;\n },\n { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() },\n ),\n ),\n ),\n );\n }\n\n public getCategoriesElementModels(categoryIds: Id64Arg): Observable<Map<Id64String, Id64Set>> {\n return this.getElementModelsCategories().pipe(\n mergeMap((elementModelsCategories) => elementModelsCategories.entries()),\n reduce((acc, [modelId, modelCategoryIds]) => {\n const sharedCategories = setIntersection(Id64.iterable(categoryIds), modelCategoryIds);\n if (sharedCategories.size > 0) {\n acc.set(modelId, sharedCategories);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n );\n }\n\n public getCategoriesOfElementModel(modelId: Id64String): Observable<Id64Set | undefined> {\n return this.getElementModelsCategories().pipe(map((elementModelsCategories) => elementModelsCategories.get(modelId)));\n }\n\n public getAllContainedCategories({\n definitionContainerIds,\n includeEmptyCategories,\n }: {\n definitionContainerIds: Id64Array;\n includeEmptyCategories?: boolean;\n }): Observable<Id64Set> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(definitionContainerIds).pipe(\n mergeMap((definitionContainerId) => {\n const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of({ directCategories: undefined, indirectCategories: undefined });\n }\n const childDefinitionContainerIds = definitionContainerInfo.childDefinitionContainers.map(({ id }) => id);\n return (\n childDefinitionContainerIds.length > 0\n ? this.getAllContainedCategories({\n definitionContainerIds: childDefinitionContainerIds,\n includeEmptyCategories,\n })\n : of(new Set<string>())\n ).pipe(\n map((indirectCategories) => {\n return {\n directCategories: applyElementsFilter(definitionContainerInfo.childCategories, includeEmptyCategories).map((category) => category.id),\n indirectCategories,\n };\n }),\n );\n }),\n reduce((acc, { directCategories, indirectCategories }) => {\n directCategories?.forEach((categoryId) => acc.add(categoryId));\n indirectCategories?.forEach((categoryId) => acc.add(categoryId));\n return acc;\n }, new Set<Id64String>()),\n ),\n ),\n );\n }\n\n public getInstanceKeyPaths(\n props: { categoryId: Id64String } | { definitionContainerId: Id64String } | { subCategoryId: Id64String },\n ): Observable<InstanceKey[]> {\n if (\"subCategoryId\" in props) {\n return this.getSubCategoriesInfo().pipe(\n mergeMap((subCategoriesInfo) => {\n let categoryOfSubCategory: Id64String | undefined;\n for (const [categoryId, subCategories] of subCategoriesInfo.entries()) {\n if (subCategories.has(props.subCategoryId)) {\n categoryOfSubCategory = categoryId;\n break;\n }\n }\n if (categoryOfSubCategory === undefined) {\n return of([]);\n }\n return this.getInstanceKeyPaths({ categoryId: categoryOfSubCategory }).pipe(\n map((pathToCategory) => [...pathToCategory, { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }]),\n );\n }),\n );\n }\n\n if (\"categoryId\" in props) {\n return this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => {\n for (const [modelId, modelCategoriesInfo] of modelsCategoriesInfo) {\n if (modelCategoriesInfo.childCategories.find((childCategory) => childCategory.id === props.categoryId)) {\n const instanceKey = { id: props.categoryId, className: this.#categoryClass };\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n\n return this.getInstanceKeyPaths({ definitionContainerId: modelId }).pipe(\n map((pathToDefinitionContainer) => [...pathToDefinitionContainer, instanceKey]),\n );\n }\n }\n return of([]);\n }),\n );\n }\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => {\n const definitionContainerInfo = definitionContainersInfo.get(props.definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of([]);\n }\n const instanceKey = { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS };\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n return this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId }).pipe(\n map((pathToParentDefinitionContainer) => [...pathToParentDefinitionContainer, instanceKey]),\n );\n }),\n );\n }\n\n public getAllDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: Id64Array;\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (definitionContainerInfo.hasElements || !!props?.includeEmpty) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getRootDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: CategoryInfo[];\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo));\n }\n return acc;\n }, new Array<CategoryInfo>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (!definitionContainerInfo.parentDefinitionContainerExists && (definitionContainerInfo.hasElements || !!props?.includeEmpty)) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getSubCategories(categoryId: Id64String): Observable<Id64Set> {\n return this.getSubCategoriesInfo().pipe(map((subCategoriesInfo) => subCategoriesInfo.get(categoryId) ?? new Set()));\n }\n\n public getIsDefinitionContainerSupported(): Observable<boolean> {\n this.#isDefinitionContainerSupported ??= this.queryIsDefinitionContainersSupported().pipe(shareReplay());\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\nfunction applyElementsFilter<T extends { hasElements?: boolean }>(list: T[], includeEmpty: boolean | undefined): T[] {\n return includeEmpty ? list : list.filter(({ hasElements }) => !!hasElements);\n}\n"]}
|
|
@@ -110,7 +110,17 @@ class CategoriesVisibilityHandler {
|
|
|
110
110
|
}));
|
|
111
111
|
}
|
|
112
112
|
enableCategoriesElementModelsVisibility(categoryIds) {
|
|
113
|
-
return this.#idsCache.getCategoriesElementModels(categoryIds).pipe((0, rxjs_1.mergeMap)((categoriesModelsMap) => categoriesModelsMap.
|
|
113
|
+
return this.#idsCache.getCategoriesElementModels(categoryIds).pipe((0, rxjs_1.mergeMap)((categoriesModelsMap) => categoriesModelsMap.entries()), (0, rxjs_1.mergeMap)(([modelId, categoriesFromPropsInModel]) => this.#viewport.view.viewsModel(modelId)
|
|
114
|
+
? rxjs_1.EMPTY
|
|
115
|
+
: this.#idsCache.getCategoriesOfElementModel(modelId).pipe((0, rxjs_1.map)((allModelCategories) => {
|
|
116
|
+
// Add 'Hide' override to categories that were hidden before model is turned on
|
|
117
|
+
allModelCategories?.forEach((categoryId) => {
|
|
118
|
+
if (!categoriesFromPropsInModel.has(categoryId)) {
|
|
119
|
+
this.#viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, core_frontend_1.PerModelCategoryVisibility.Override.Hide);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
return modelId;
|
|
123
|
+
}))), (0, rxjs_1.toArray)(), (0, rxjs_1.mergeMap)(async (hiddenModels) => {
|
|
114
124
|
if (hiddenModels.length > 0) {
|
|
115
125
|
await this.#viewport.addViewedModels(hiddenModels);
|
|
116
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.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 { EMPTY, filter, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from \"rxjs\";\nimport { BeEvent, Id64 } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategoryDisplay, enableSubCategoryDisplay } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { mergeVisibilities, releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\n\n/** @internal */\nexport interface CategoriesVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class CategoriesVisibilityHandler implements HierarchyVisibilityHandler {\n #pendingVisibilityChange: any;\n #viewport: Viewport;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n\n constructor(props: CategoriesVisibilityHandlerProps) {\n this.#idsCache = props.idsCache;\n this.#viewport = props.viewport;\n this.#viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.addListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.addListener(this.onViewedModelsChanged);\n this.#hierarchyConfig = props.hierarchyConfig;\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this.#viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.removeListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.removeListener(this.onViewedModelsChanged);\n clearTimeout(this.#pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent();\n\n /** Returns visibility status of the tree node. */\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (!node.extendedData?.categoryId) {\n return { state: \"hidden\", isDisabled: true };\n }\n return createVisibilityStatus(\n await firstValueFrom(this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId)),\n );\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node))));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getDefinitionContainerVisibility(node)));\n }\n\n return { state: \"hidden\", isDisabled: true };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return toVoidPromise(this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on));\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return toVoidPromise(this.changeSubCategoryVisibility(node, on));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return toVoidPromise(this.changeDefinitionContainerVisibility(node, on));\n }\n }\n\n private getSubCategoriesVisibility(subCategoryIds: Id64Arg, parentCategoryId: Id64String): Observable<Visibility> {\n return this.#idsCache.getCategoriesElementModels(parentCategoryId).pipe(\n mergeMap((modelMap): Observable<{ visibility: \"visible\" | \"hidden\"; isDefault: boolean }> => {\n if (modelMap.size === 0) {\n return of({ visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true });\n }\n return from(modelMap.keys()).pipe(\n map((modelId) => {\n if (!this.#viewport.view.viewsModel(modelId)) {\n return { visibility: \"hidden\", isDefault: false };\n }\n const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);\n return override === PerModelCategoryVisibility.Override.Show\n ? { visibility: \"visible\", isDefault: false }\n : override === PerModelCategoryVisibility.Override.Hide\n ? { visibility: \"hidden\", isDefault: false }\n : { visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true };\n }),\n );\n }),\n mergeMap(({ visibility, isDefault }) => {\n if (!isDefault || visibility === \"hidden\" || Id64.sizeOf(subCategoryIds) === 0) {\n return of(visibility);\n }\n return from(Id64.iterable(subCategoryIds)).pipe(\n releaseMainThreadOnItemsCount(200),\n map((subCategoryId) => (this.#viewport.isSubCategoryVisible(subCategoryId) ? \"visible\" : \"hidden\")),\n );\n }),\n mergeVisibilities,\n map((visibility) => (visibility === \"empty\" ? \"hidden\" : visibility)),\n );\n }\n\n private getDefinitionContainerVisibility(node: HierarchyNode): Observable<Visibility> {\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((categoryIds) => this.getCategoriesVisibility(categoryIds)));\n }\n\n private getCategoriesVisibility(categoryIds: Id64Arg): Observable<Visibility> {\n return from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap((categoryId) => forkJoin({ subCategoryIds: this.#idsCache.getSubCategories(categoryId), categoryId: of(categoryId) })),\n mergeMap(({ subCategoryIds, categoryId }) => this.getSubCategoriesVisibility(subCategoryIds, categoryId)),\n mergeVisibilities,\n map((visibility) => {\n return visibility === \"empty\" ? \"hidden\" : visibility;\n }),\n );\n }\n\n private enableCategoriesElementModelsVisibility(categoryIds: Id64Array) {\n return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(\n mergeMap((categoriesModelsMap) => categoriesModelsMap.keys()),\n filter((modelId) => !this.#viewport.view.viewsModel(modelId)),\n toArray(),\n mergeMap(async (hiddenModels) => {\n if (hiddenModels.length > 0) {\n await this.#viewport.addViewedModels(hiddenModels);\n }\n }),\n );\n }\n\n private changeSubCategoryVisibility(node: HierarchyNode, on: boolean) {\n const parentCategoryId = node.extendedData?.categoryId;\n return merge(\n // make sure parent category and models are enabled\n on && parentCategoryId ? this.enableCategoriesElementModelsVisibility([parentCategoryId]) : EMPTY,\n on && parentCategoryId ? this.changeCategoryState([parentCategoryId], true, false) : EMPTY,\n of(\n (() =>\n CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node).forEach((id) => {\n this.changeSubCategoryState(id, on);\n }))(),\n ),\n );\n }\n\n private changeCategoryVisibility(categoryIds: Id64Array, on: boolean) {\n return merge(\n // make sure models are enabled\n on ? this.enableCategoriesElementModelsVisibility(categoryIds) : EMPTY,\n from(categoryIds).pipe(\n mergeMap((categoryId) => this.#idsCache.getSubCategories(categoryId)),\n mergeMap((subCategorySet) => subCategorySet),\n toArray(),\n mergeMap((subCategories) =>\n subCategories.length > 0 ? this.changeCategoryState(categoryIds, on, false, subCategories) : this.changeCategoryState(categoryIds, on, on),\n ),\n ),\n );\n }\n\n private changeDefinitionContainerVisibility(node: HierarchyNode, on: boolean) {\n const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: definitionContainerId,\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((childCategories) => this.changeCategoryVisibility([...childCategories], on)));\n }\n\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesPerModelChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedModelsChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this.#pendingVisibilityChange) {\n return;\n }\n\n this.#pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this.#pendingVisibilityChange = undefined;\n }, 0);\n }\n\n private static getInstanceIdsFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];\n }\n\n private changeCategoryState(ids: Id64Array, enabled: boolean, enableAllSubCategories: boolean, subCategories?: Id64Arg) {\n return merge(\n from(enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories)),\n enabled && subCategories\n ? from(Id64.iterable(subCategories)).pipe(\n releaseMainThreadOnItemsCount(100),\n map((subCategoryId) => this.changeSubCategoryState(subCategoryId, true)),\n )\n : EMPTY,\n );\n }\n\n private changeSubCategoryState(key: string, enabled: boolean) {\n enableSubCategoryDisplay(this.#viewport, key, enabled);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.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 { EMPTY, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from \"rxjs\";\nimport { BeEvent, Id64 } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategoryDisplay, enableSubCategoryDisplay } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { mergeVisibilities, releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\n\n/** @internal */\nexport interface CategoriesVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class CategoriesVisibilityHandler implements HierarchyVisibilityHandler {\n #pendingVisibilityChange: any;\n #viewport: Viewport;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n\n constructor(props: CategoriesVisibilityHandlerProps) {\n this.#idsCache = props.idsCache;\n this.#viewport = props.viewport;\n this.#viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.addListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.addListener(this.onViewedModelsChanged);\n this.#hierarchyConfig = props.hierarchyConfig;\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this.#viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.removeListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.removeListener(this.onViewedModelsChanged);\n clearTimeout(this.#pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent();\n\n /** Returns visibility status of the tree node. */\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (!node.extendedData?.categoryId) {\n return { state: \"hidden\", isDisabled: true };\n }\n return createVisibilityStatus(\n await firstValueFrom(this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId)),\n );\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node))));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getDefinitionContainerVisibility(node)));\n }\n\n return { state: \"hidden\", isDisabled: true };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return toVoidPromise(this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on));\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return toVoidPromise(this.changeSubCategoryVisibility(node, on));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return toVoidPromise(this.changeDefinitionContainerVisibility(node, on));\n }\n }\n\n private getSubCategoriesVisibility(subCategoryIds: Id64Arg, parentCategoryId: Id64String): Observable<Visibility> {\n return this.#idsCache.getCategoriesElementModels(parentCategoryId).pipe(\n mergeMap((modelMap): Observable<{ visibility: \"visible\" | \"hidden\"; isDefault: boolean }> => {\n if (modelMap.size === 0) {\n return of({ visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true });\n }\n return from(modelMap.keys()).pipe(\n map((modelId) => {\n if (!this.#viewport.view.viewsModel(modelId)) {\n return { visibility: \"hidden\", isDefault: false };\n }\n const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);\n return override === PerModelCategoryVisibility.Override.Show\n ? { visibility: \"visible\", isDefault: false }\n : override === PerModelCategoryVisibility.Override.Hide\n ? { visibility: \"hidden\", isDefault: false }\n : { visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true };\n }),\n );\n }),\n mergeMap(({ visibility, isDefault }) => {\n if (!isDefault || visibility === \"hidden\" || Id64.sizeOf(subCategoryIds) === 0) {\n return of(visibility);\n }\n return from(Id64.iterable(subCategoryIds)).pipe(\n releaseMainThreadOnItemsCount(200),\n map((subCategoryId) => (this.#viewport.isSubCategoryVisible(subCategoryId) ? \"visible\" : \"hidden\")),\n );\n }),\n mergeVisibilities,\n map((visibility) => (visibility === \"empty\" ? \"hidden\" : visibility)),\n );\n }\n\n private getDefinitionContainerVisibility(node: HierarchyNode): Observable<Visibility> {\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((categoryIds) => this.getCategoriesVisibility(categoryIds)));\n }\n\n private getCategoriesVisibility(categoryIds: Id64Arg): Observable<Visibility> {\n return from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap((categoryId) => forkJoin({ subCategoryIds: this.#idsCache.getSubCategories(categoryId), categoryId: of(categoryId) })),\n mergeMap(({ subCategoryIds, categoryId }) => this.getSubCategoriesVisibility(subCategoryIds, categoryId)),\n mergeVisibilities,\n map((visibility) => {\n return visibility === \"empty\" ? \"hidden\" : visibility;\n }),\n );\n }\n\n private enableCategoriesElementModelsVisibility(categoryIds: Id64Array) {\n return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(\n mergeMap((categoriesModelsMap) => categoriesModelsMap.entries()),\n mergeMap(([modelId, categoriesFromPropsInModel]) =>\n this.#viewport.view.viewsModel(modelId)\n ? EMPTY\n : this.#idsCache.getCategoriesOfElementModel(modelId).pipe(\n map((allModelCategories) => {\n // Add 'Hide' override to categories that were hidden before model is turned on\n allModelCategories?.forEach((categoryId) => {\n if (!categoriesFromPropsInModel.has(categoryId)) {\n this.#viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, PerModelCategoryVisibility.Override.Hide);\n }\n });\n return modelId;\n }),\n ),\n ),\n toArray(),\n mergeMap(async (hiddenModels) => {\n if (hiddenModels.length > 0) {\n await this.#viewport.addViewedModels(hiddenModels);\n }\n }),\n );\n }\n\n private changeSubCategoryVisibility(node: HierarchyNode, on: boolean) {\n const parentCategoryId = node.extendedData?.categoryId;\n return merge(\n // make sure parent category and models are enabled\n on && parentCategoryId ? this.enableCategoriesElementModelsVisibility([parentCategoryId]) : EMPTY,\n on && parentCategoryId ? this.changeCategoryState([parentCategoryId], true, false) : EMPTY,\n of(\n (() =>\n CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node).forEach((id) => {\n this.changeSubCategoryState(id, on);\n }))(),\n ),\n );\n }\n\n private changeCategoryVisibility(categoryIds: Id64Array, on: boolean) {\n return merge(\n // make sure models are enabled\n on ? this.enableCategoriesElementModelsVisibility(categoryIds) : EMPTY,\n from(categoryIds).pipe(\n mergeMap((categoryId) => this.#idsCache.getSubCategories(categoryId)),\n mergeMap((subCategorySet) => subCategorySet),\n toArray(),\n mergeMap((subCategories) =>\n subCategories.length > 0 ? this.changeCategoryState(categoryIds, on, false, subCategories) : this.changeCategoryState(categoryIds, on, on),\n ),\n ),\n );\n }\n\n private changeDefinitionContainerVisibility(node: HierarchyNode, on: boolean) {\n const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: definitionContainerId,\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((childCategories) => this.changeCategoryVisibility([...childCategories], on)));\n }\n\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesPerModelChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedModelsChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this.#pendingVisibilityChange) {\n return;\n }\n\n this.#pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this.#pendingVisibilityChange = undefined;\n }, 0);\n }\n\n private static getInstanceIdsFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];\n }\n\n private changeCategoryState(ids: Id64Array, enabled: boolean, enableAllSubCategories: boolean, subCategories?: Id64Arg) {\n return merge(\n from(enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories)),\n enabled && subCategories\n ? from(Id64.iterable(subCategories)).pipe(\n releaseMainThreadOnItemsCount(100),\n map((subCategoryId) => this.changeSubCategoryState(subCategoryId, true)),\n )\n : EMPTY,\n );\n }\n\n private changeSubCategoryState(key: string, enabled: boolean) {\n enableSubCategoryDisplay(this.#viewport, key, enabled);\n }\n}\n"]}
|
|
@@ -29,6 +29,7 @@ export declare class CategoriesTreeIdsCache implements Disposable {
|
|
|
29
29
|
definitionContainers: Id64Array;
|
|
30
30
|
}>;
|
|
31
31
|
getCategoriesElementModels(categoryIds: Id64Arg): Observable<Map<Id64String, Id64Set>>;
|
|
32
|
+
getCategoriesOfElementModel(modelId: Id64String): Observable<Id64Set | undefined>;
|
|
32
33
|
getAllContainedCategories({ definitionContainerIds, includeEmptyCategories, }: {
|
|
33
34
|
definitionContainerIds: Id64Array;
|
|
34
35
|
includeEmptyCategories?: boolean;
|
|
@@ -277,6 +277,9 @@ export class CategoriesTreeIdsCache {
|
|
|
277
277
|
return acc;
|
|
278
278
|
}, new Map()));
|
|
279
279
|
}
|
|
280
|
+
getCategoriesOfElementModel(modelId) {
|
|
281
|
+
return this.getElementModelsCategories().pipe(map((elementModelsCategories) => elementModelsCategories.get(modelId)));
|
|
282
|
+
}
|
|
280
283
|
getAllContainedCategories({ definitionContainerIds, includeEmptyCategories, }) {
|
|
281
284
|
return this.getDefinitionContainersInfo().pipe(mergeMap((definitionContainersInfo) => from(definitionContainerIds).pipe(mergeMap((definitionContainerId) => {
|
|
282
285
|
const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);
|
|
@@ -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 { defer, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { setIntersection } from \"../../common/internal/Utils.js\";\nimport { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./ClassNameDefinitions.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Arg, 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: Array<{ id: Id64String; hasElements: boolean }>;\n hasElements: boolean;\n}\n\ninterface CategoriesInfo {\n childCategories: CategoryInfo[];\n parentDefinitionContainerExists: boolean;\n}\n\ninterface CategoryInfo {\n id: Id64String;\n childCount: number;\n hasElements: boolean;\n}\n\n/** @internal */\nexport class CategoriesTreeIdsCache implements Disposable {\n #definitionContainersInfo: Observable<Map<Id64String, DefinitionContainerInfo>> | undefined;\n #modelsCategoriesInfo: Observable<Map<Id64String, CategoriesInfo>> | undefined;\n #subCategoriesInfo: Observable<Map<Id64String, Id64Set>> | undefined;\n #elementModelsCategories: Observable<Map<Id64String, Id64Set>> | undefined;\n #categoryClass: string;\n #categoryElementClass: string;\n #categoryModelClass: string;\n #isDefinitionContainerSupported: Observable<boolean> | undefined;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, viewType: \"3d\" | \"2d\", componentId?: GuidString) {\n this.#queryExecutor = queryExecutor;\n const { categoryClass, categoryElementClass, categoryModelClass } = getClassesByView(viewType);\n this.#categoryClass = categoryClass;\n this.#categoryElementClass = categoryElementClass;\n this.#categoryModelClass = categoryModelClass;\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"CategoriesTreeIdsCache\";\n }\n\n public [Symbol.dispose]() {}\n\n private queryElementModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/element-models-and-categories`,\n },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId };\n }),\n );\n }\n\n private queryCategories(): Observable<{\n id: Id64String;\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCount: number;\n hasElements: boolean;\n }> {\n return this.getIsDefinitionContainerSupported().pipe(\n mergeMap((isDefinitionContainerSupported) =>\n defer(() => {\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 IFNULL(\n (SELECT 1 FROM ${this.#categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId LIMIT 1),\n 0\n ) hasElements\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 GROUP BY this.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: categoriesQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/categories` },\n );\n }).pipe(\n map((row) => {\n return {\n id: row.id,\n modelId: row.modelId,\n parentDefinitionContainerExists: row.parentDefinitionContainerExists,\n childCount: row.childCount,\n hasElements: !!row.hasElements,\n };\n }),\n ),\n ),\n );\n }\n\n private queryIsDefinitionContainersSupported(): Observable<boolean> {\n return defer(() => {\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 LIMIT 1\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { restartToken: `${this.#componentName}/${this.#componentId}/is-definition-container-supported` },\n );\n }).pipe(\n toArray(),\n map((rows) => rows.length > 0),\n );\n }\n\n private queryDefinitionContainers(): Observable<{ id: Id64String; modelId: Id64String; hasElements: boolean }> {\n return defer(() => {\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 CATEGORIES_MODELS_CTE = \"CategoriesModels\";\n const ctes = [\n `${CATEGORIES_MODELS_CTE}(ModelId, HasElements) AS (\n SELECT\n c.Model.Id,\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} e\n WHERE e.Category.Id = c.ECInstanceId\n LIMIT 1\n ), 0)\n FROM\n ${this.#categoryClass} c\n WHERE\n NOT c.IsPrivate\n )`,\n `\n ${DEFINITION_CONTAINERS_CTE}(ECInstanceId, ModelId, HasElements) AS (\n SELECT\n dc.ECInstanceId,\n dc.Model.Id,\n c.HasElements\n FROM ${DEFINITION_CONTAINER_CLASS} dc\n JOIN ${CATEGORIES_MODELS_CTE} c ON dc.ECInstanceId = c.ModelId\n WHERE NOT dc.IsPrivate\n\n UNION ALL\n\n SELECT\n pdc.ECInstanceId,\n pdc.Model.Id,\n cdc.HasElements\n FROM\n ${DEFINITION_CONTAINERS_CTE} cdc\n JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId\n WHERE NOT pdc.IsPrivate\n )\n `,\n ];\n const definitionsQuery = `\n SELECT dc.ECInstanceId id, dc.ModelId modelId, MAX(dc.HasElements) hasElements FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ctes, ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/definition-containers` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, modelId: row.modelId, hasElements: !!row.hasElements };\n }),\n );\n }\n\n private queryVisibleSubCategories(categoriesInfo: Id64Array): Observable<{ id: Id64String; parentId: Id64String }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/visible-sub-categories` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.categoryId };\n }),\n );\n }\n\n private getModelsCategoriesInfo() {\n this.#modelsCategoriesInfo ??= this.queryCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelCategories = acc.get(queriedCategory.modelId);\n if (modelCategories === undefined) {\n modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };\n acc.set(queriedCategory.modelId, modelCategories);\n }\n modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount, hasElements: queriedCategory.hasElements });\n return acc;\n }, new Map<Id64String, CategoriesInfo>()),\n )\n .pipe(shareReplay());\n return this.#modelsCategoriesInfo;\n }\n\n private getElementModelsCategories() {\n this.#elementModelsCategories ??= this.queryElementModelCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelEntry = acc.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = new Set();\n acc.set(queriedCategory.modelId, modelEntry);\n }\n modelEntry.add(queriedCategory.categoryId);\n return acc;\n }, new Map<Id64String, Id64Set>()),\n )\n .pipe(shareReplay());\n return this.#elementModelsCategories;\n }\n\n private getSubCategoriesInfo() {\n this.#subCategoriesInfo ??= this.getModelsCategoriesInfo()\n .pipe(\n mergeMap((modelsCategoriesInfo) => from(modelsCategoriesInfo.values())),\n reduce((acc, modelCategoriesInfo) => {\n acc.push(...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n mergeMap((categoriesWithMoreThanOneSubCategory) => {\n const allSubCategories = new Map<Id64String, Id64Set>();\n if (categoriesWithMoreThanOneSubCategory.length === 0) {\n return of(allSubCategories);\n }\n return this.queryVisibleSubCategories(categoriesWithMoreThanOneSubCategory).pipe(\n reduce((acc, queriedSubCategory) => {\n const entry = acc.get(queriedSubCategory.parentId);\n if (!entry) {\n acc.set(queriedSubCategory.parentId, new Set([queriedSubCategory.id]));\n return acc;\n }\n entry.add(queriedSubCategory.id);\n return acc;\n }, allSubCategories),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#subCategoriesInfo;\n }\n\n private getDefinitionContainersInfo() {\n this.#definitionContainersInfo ??= forkJoin({\n isDefinitionContainerSupported: this.getIsDefinitionContainerSupported(),\n modelsCategoriesInfo: this.getModelsCategoriesInfo(),\n })\n .pipe(\n mergeMap(({ isDefinitionContainerSupported, modelsCategoriesInfo }) => {\n const definitionContainersInfo = new Map<Id64String, DefinitionContainerInfo>();\n if (!isDefinitionContainerSupported || modelsCategoriesInfo.size === 0) {\n return of(definitionContainersInfo);\n }\n return this.queryDefinitionContainers().pipe(\n reduce((acc, queriedDefinitionContainer) => {\n const modelCategoriesInfo = modelsCategoriesInfo.get(queriedDefinitionContainer.id);\n acc.set(queriedDefinitionContainer.id, {\n childCategories: modelCategoriesInfo?.childCategories ?? [],\n modelId: queriedDefinitionContainer.modelId,\n childDefinitionContainers: [],\n parentDefinitionContainerExists: false,\n hasElements: queriedDefinitionContainer.hasElements,\n });\n return acc;\n }, definitionContainersInfo),\n map((result) => {\n for (const [definitionContainerId, definitionContainerInfo] of result) {\n const parentDefinitionContainer = result.get(definitionContainerInfo.modelId);\n if (parentDefinitionContainer !== undefined) {\n parentDefinitionContainer.childDefinitionContainers.push({ id: definitionContainerId, hasElements: definitionContainerInfo.hasElements });\n definitionContainerInfo.parentDefinitionContainerExists = true;\n parentDefinitionContainer.hasElements = parentDefinitionContainer.hasElements || definitionContainerInfo.hasElements;\n }\n }\n\n return result;\n }),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#definitionContainersInfo;\n }\n\n public getDirectChildDefinitionContainersAndCategories({\n parentDefinitionContainerIds,\n includeEmpty,\n }: {\n parentDefinitionContainerIds: Id64Array;\n includeEmpty?: boolean;\n }): Observable<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(parentDefinitionContainerIds).pipe(\n reduce(\n (acc, parentDefinitionContainerId) => {\n const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);\n if (parentDefinitionContainerInfo !== undefined) {\n acc.definitionContainers.push(...applyElementsFilter(parentDefinitionContainerInfo.childDefinitionContainers, includeEmpty).map((dc) => dc.id));\n acc.categories.push(...applyElementsFilter(parentDefinitionContainerInfo.childCategories, includeEmpty));\n }\n return acc;\n },\n { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() },\n ),\n ),\n ),\n );\n }\n\n public getCategoriesElementModels(categoryIds: Id64Arg): Observable<Map<Id64String, Id64Set>> {\n return this.getElementModelsCategories().pipe(\n mergeMap((elementModelsCategories) => elementModelsCategories.entries()),\n reduce((acc, [modelId, modelCategoryIds]) => {\n const sharedCategories = setIntersection(Id64.iterable(categoryIds), modelCategoryIds);\n if (sharedCategories.size > 0) {\n acc.set(modelId, sharedCategories);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n );\n }\n\n public getAllContainedCategories({\n definitionContainerIds,\n includeEmptyCategories,\n }: {\n definitionContainerIds: Id64Array;\n includeEmptyCategories?: boolean;\n }): Observable<Id64Set> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(definitionContainerIds).pipe(\n mergeMap((definitionContainerId) => {\n const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of({ directCategories: undefined, indirectCategories: undefined });\n }\n const childDefinitionContainerIds = definitionContainerInfo.childDefinitionContainers.map(({ id }) => id);\n return (\n childDefinitionContainerIds.length > 0\n ? this.getAllContainedCategories({\n definitionContainerIds: childDefinitionContainerIds,\n includeEmptyCategories,\n })\n : of(new Set<string>())\n ).pipe(\n map((indirectCategories) => {\n return {\n directCategories: applyElementsFilter(definitionContainerInfo.childCategories, includeEmptyCategories).map((category) => category.id),\n indirectCategories,\n };\n }),\n );\n }),\n reduce((acc, { directCategories, indirectCategories }) => {\n directCategories?.forEach((categoryId) => acc.add(categoryId));\n indirectCategories?.forEach((categoryId) => acc.add(categoryId));\n return acc;\n }, new Set<Id64String>()),\n ),\n ),\n );\n }\n\n public getInstanceKeyPaths(\n props: { categoryId: Id64String } | { definitionContainerId: Id64String } | { subCategoryId: Id64String },\n ): Observable<InstanceKey[]> {\n if (\"subCategoryId\" in props) {\n return this.getSubCategoriesInfo().pipe(\n mergeMap((subCategoriesInfo) => {\n let categoryOfSubCategory: Id64String | undefined;\n for (const [categoryId, subCategories] of subCategoriesInfo.entries()) {\n if (subCategories.has(props.subCategoryId)) {\n categoryOfSubCategory = categoryId;\n break;\n }\n }\n if (categoryOfSubCategory === undefined) {\n return of([]);\n }\n return this.getInstanceKeyPaths({ categoryId: categoryOfSubCategory }).pipe(\n map((pathToCategory) => [...pathToCategory, { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }]),\n );\n }),\n );\n }\n\n if (\"categoryId\" in props) {\n return this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => {\n for (const [modelId, modelCategoriesInfo] of modelsCategoriesInfo) {\n if (modelCategoriesInfo.childCategories.find((childCategory) => childCategory.id === props.categoryId)) {\n const instanceKey = { id: props.categoryId, className: this.#categoryClass };\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n\n return this.getInstanceKeyPaths({ definitionContainerId: modelId }).pipe(\n map((pathToDefinitionContainer) => [...pathToDefinitionContainer, instanceKey]),\n );\n }\n }\n return of([]);\n }),\n );\n }\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => {\n const definitionContainerInfo = definitionContainersInfo.get(props.definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of([]);\n }\n const instanceKey = { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS };\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n return this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId }).pipe(\n map((pathToParentDefinitionContainer) => [...pathToParentDefinitionContainer, instanceKey]),\n );\n }),\n );\n }\n\n public getAllDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: Id64Array;\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (definitionContainerInfo.hasElements || !!props?.includeEmpty) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getRootDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: CategoryInfo[];\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo));\n }\n return acc;\n }, new Array<CategoryInfo>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (!definitionContainerInfo.parentDefinitionContainerExists && (definitionContainerInfo.hasElements || !!props?.includeEmpty)) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getSubCategories(categoryId: Id64String): Observable<Id64Set> {\n return this.getSubCategoriesInfo().pipe(map((subCategoriesInfo) => subCategoriesInfo.get(categoryId) ?? new Set()));\n }\n\n public getIsDefinitionContainerSupported(): Observable<boolean> {\n this.#isDefinitionContainerSupported ??= this.queryIsDefinitionContainersSupported().pipe(shareReplay());\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\nfunction applyElementsFilter<T extends { hasElements?: boolean }>(list: T[], includeEmpty: boolean | undefined): T[] {\n return includeEmpty ? list : list.filter(({ hasElements }) => !!hasElements);\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 { defer, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from \"rxjs\";\nimport { Guid, Id64 } from \"@itwin/core-bentley\";\nimport { setIntersection } from \"../../common/internal/Utils.js\";\nimport { DEFINITION_CONTAINER_CLASS, SUB_CATEGORY_CLASS } from \"./ClassNameDefinitions.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Arg, 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: Array<{ id: Id64String; hasElements: boolean }>;\n hasElements: boolean;\n}\n\ninterface CategoriesInfo {\n childCategories: CategoryInfo[];\n parentDefinitionContainerExists: boolean;\n}\n\ninterface CategoryInfo {\n id: Id64String;\n childCount: number;\n hasElements: boolean;\n}\n\n/** @internal */\nexport class CategoriesTreeIdsCache implements Disposable {\n #definitionContainersInfo: Observable<Map<Id64String, DefinitionContainerInfo>> | undefined;\n #modelsCategoriesInfo: Observable<Map<Id64String, CategoriesInfo>> | undefined;\n #subCategoriesInfo: Observable<Map<Id64String, Id64Set>> | undefined;\n #elementModelsCategories: Observable<Map<Id64String, Id64Set>> | undefined;\n #categoryClass: string;\n #categoryElementClass: string;\n #categoryModelClass: string;\n #isDefinitionContainerSupported: Observable<boolean> | undefined;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, viewType: \"3d\" | \"2d\", componentId?: GuidString) {\n this.#queryExecutor = queryExecutor;\n const { categoryClass, categoryElementClass, categoryModelClass } = getClassesByView(viewType);\n this.#categoryClass = categoryClass;\n this.#categoryElementClass = categoryElementClass;\n this.#categoryModelClass = categoryModelClass;\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"CategoriesTreeIdsCache\";\n }\n\n public [Symbol.dispose]() {}\n\n private queryElementModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/element-models-and-categories`,\n },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId };\n }),\n );\n }\n\n private queryCategories(): Observable<{\n id: Id64String;\n modelId: Id64String;\n parentDefinitionContainerExists: boolean;\n childCount: number;\n hasElements: boolean;\n }> {\n return this.getIsDefinitionContainerSupported().pipe(\n mergeMap((isDefinitionContainerSupported) =>\n defer(() => {\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 IFNULL(\n (SELECT 1 FROM ${this.#categoryElementClass} e WHERE e.Category.Id = this.ECInstanceId LIMIT 1),\n 0\n ) hasElements\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 GROUP BY this.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: categoriesQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/categories` },\n );\n }).pipe(\n map((row) => {\n return {\n id: row.id,\n modelId: row.modelId,\n parentDefinitionContainerExists: row.parentDefinitionContainerExists,\n childCount: row.childCount,\n hasElements: !!row.hasElements,\n };\n }),\n ),\n ),\n );\n }\n\n private queryIsDefinitionContainersSupported(): Observable<boolean> {\n return defer(() => {\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 LIMIT 1\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { restartToken: `${this.#componentName}/${this.#componentId}/is-definition-container-supported` },\n );\n }).pipe(\n toArray(),\n map((rows) => rows.length > 0),\n );\n }\n\n private queryDefinitionContainers(): Observable<{ id: Id64String; modelId: Id64String; hasElements: boolean }> {\n return defer(() => {\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 CATEGORIES_MODELS_CTE = \"CategoriesModels\";\n const ctes = [\n `${CATEGORIES_MODELS_CTE}(ModelId, HasElements) AS (\n SELECT\n c.Model.Id,\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} e\n WHERE e.Category.Id = c.ECInstanceId\n LIMIT 1\n ), 0)\n FROM\n ${this.#categoryClass} c\n WHERE\n NOT c.IsPrivate\n )`,\n `\n ${DEFINITION_CONTAINERS_CTE}(ECInstanceId, ModelId, HasElements) AS (\n SELECT\n dc.ECInstanceId,\n dc.Model.Id,\n c.HasElements\n FROM ${DEFINITION_CONTAINER_CLASS} dc\n JOIN ${CATEGORIES_MODELS_CTE} c ON dc.ECInstanceId = c.ModelId\n WHERE NOT dc.IsPrivate\n\n UNION ALL\n\n SELECT\n pdc.ECInstanceId,\n pdc.Model.Id,\n cdc.HasElements\n FROM\n ${DEFINITION_CONTAINERS_CTE} cdc\n JOIN ${DEFINITION_CONTAINER_CLASS} pdc ON pdc.ECInstanceId = cdc.ModelId\n WHERE NOT pdc.IsPrivate\n )\n `,\n ];\n const definitionsQuery = `\n SELECT dc.ECInstanceId id, dc.ModelId modelId, MAX(dc.HasElements) hasElements FROM ${DEFINITION_CONTAINERS_CTE} dc GROUP BY dc.ECInstanceId\n `;\n return this.#queryExecutor.createQueryReader(\n { ctes, ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/definition-containers` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, modelId: row.modelId, hasElements: !!row.hasElements };\n }),\n );\n }\n\n private queryVisibleSubCategories(categoriesInfo: Id64Array): Observable<{ id: Id64String; parentId: Id64String }> {\n return defer(() => {\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 return this.#queryExecutor.createQueryReader(\n { ecsql: definitionsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/visible-sub-categories` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.categoryId };\n }),\n );\n }\n\n private getModelsCategoriesInfo() {\n this.#modelsCategoriesInfo ??= this.queryCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelCategories = acc.get(queriedCategory.modelId);\n if (modelCategories === undefined) {\n modelCategories = { parentDefinitionContainerExists: queriedCategory.parentDefinitionContainerExists, childCategories: [] };\n acc.set(queriedCategory.modelId, modelCategories);\n }\n modelCategories.childCategories.push({ id: queriedCategory.id, childCount: queriedCategory.childCount, hasElements: queriedCategory.hasElements });\n return acc;\n }, new Map<Id64String, CategoriesInfo>()),\n )\n .pipe(shareReplay());\n return this.#modelsCategoriesInfo;\n }\n\n private getElementModelsCategories() {\n this.#elementModelsCategories ??= this.queryElementModelCategories()\n .pipe(\n reduce((acc, queriedCategory) => {\n let modelEntry = acc.get(queriedCategory.modelId);\n if (modelEntry === undefined) {\n modelEntry = new Set();\n acc.set(queriedCategory.modelId, modelEntry);\n }\n modelEntry.add(queriedCategory.categoryId);\n return acc;\n }, new Map<Id64String, Id64Set>()),\n )\n .pipe(shareReplay());\n return this.#elementModelsCategories;\n }\n\n private getSubCategoriesInfo() {\n this.#subCategoriesInfo ??= this.getModelsCategoriesInfo()\n .pipe(\n mergeMap((modelsCategoriesInfo) => from(modelsCategoriesInfo.values())),\n reduce((acc, modelCategoriesInfo) => {\n acc.push(...modelCategoriesInfo.childCategories.filter((categoryInfo) => categoryInfo.childCount > 1).map((categoryInfo) => categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n mergeMap((categoriesWithMoreThanOneSubCategory) => {\n const allSubCategories = new Map<Id64String, Id64Set>();\n if (categoriesWithMoreThanOneSubCategory.length === 0) {\n return of(allSubCategories);\n }\n return this.queryVisibleSubCategories(categoriesWithMoreThanOneSubCategory).pipe(\n reduce((acc, queriedSubCategory) => {\n const entry = acc.get(queriedSubCategory.parentId);\n if (!entry) {\n acc.set(queriedSubCategory.parentId, new Set([queriedSubCategory.id]));\n return acc;\n }\n entry.add(queriedSubCategory.id);\n return acc;\n }, allSubCategories),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#subCategoriesInfo;\n }\n\n private getDefinitionContainersInfo() {\n this.#definitionContainersInfo ??= forkJoin({\n isDefinitionContainerSupported: this.getIsDefinitionContainerSupported(),\n modelsCategoriesInfo: this.getModelsCategoriesInfo(),\n })\n .pipe(\n mergeMap(({ isDefinitionContainerSupported, modelsCategoriesInfo }) => {\n const definitionContainersInfo = new Map<Id64String, DefinitionContainerInfo>();\n if (!isDefinitionContainerSupported || modelsCategoriesInfo.size === 0) {\n return of(definitionContainersInfo);\n }\n return this.queryDefinitionContainers().pipe(\n reduce((acc, queriedDefinitionContainer) => {\n const modelCategoriesInfo = modelsCategoriesInfo.get(queriedDefinitionContainer.id);\n acc.set(queriedDefinitionContainer.id, {\n childCategories: modelCategoriesInfo?.childCategories ?? [],\n modelId: queriedDefinitionContainer.modelId,\n childDefinitionContainers: [],\n parentDefinitionContainerExists: false,\n hasElements: queriedDefinitionContainer.hasElements,\n });\n return acc;\n }, definitionContainersInfo),\n map((result) => {\n for (const [definitionContainerId, definitionContainerInfo] of result) {\n const parentDefinitionContainer = result.get(definitionContainerInfo.modelId);\n if (parentDefinitionContainer !== undefined) {\n parentDefinitionContainer.childDefinitionContainers.push({ id: definitionContainerId, hasElements: definitionContainerInfo.hasElements });\n definitionContainerInfo.parentDefinitionContainerExists = true;\n parentDefinitionContainer.hasElements = parentDefinitionContainer.hasElements || definitionContainerInfo.hasElements;\n }\n }\n\n return result;\n }),\n );\n }),\n )\n .pipe(shareReplay());\n return this.#definitionContainersInfo;\n }\n\n public getDirectChildDefinitionContainersAndCategories({\n parentDefinitionContainerIds,\n includeEmpty,\n }: {\n parentDefinitionContainerIds: Id64Array;\n includeEmpty?: boolean;\n }): Observable<{ categories: CategoryInfo[]; definitionContainers: Id64Array }> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(parentDefinitionContainerIds).pipe(\n reduce(\n (acc, parentDefinitionContainerId) => {\n const parentDefinitionContainerInfo = definitionContainersInfo.get(parentDefinitionContainerId);\n if (parentDefinitionContainerInfo !== undefined) {\n acc.definitionContainers.push(...applyElementsFilter(parentDefinitionContainerInfo.childDefinitionContainers, includeEmpty).map((dc) => dc.id));\n acc.categories.push(...applyElementsFilter(parentDefinitionContainerInfo.childCategories, includeEmpty));\n }\n return acc;\n },\n { definitionContainers: new Array<Id64String>(), categories: new Array<CategoryInfo>() },\n ),\n ),\n ),\n );\n }\n\n public getCategoriesElementModels(categoryIds: Id64Arg): Observable<Map<Id64String, Id64Set>> {\n return this.getElementModelsCategories().pipe(\n mergeMap((elementModelsCategories) => elementModelsCategories.entries()),\n reduce((acc, [modelId, modelCategoryIds]) => {\n const sharedCategories = setIntersection(Id64.iterable(categoryIds), modelCategoryIds);\n if (sharedCategories.size > 0) {\n acc.set(modelId, sharedCategories);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n );\n }\n\n public getCategoriesOfElementModel(modelId: Id64String): Observable<Id64Set | undefined> {\n return this.getElementModelsCategories().pipe(map((elementModelsCategories) => elementModelsCategories.get(modelId)));\n }\n\n public getAllContainedCategories({\n definitionContainerIds,\n includeEmptyCategories,\n }: {\n definitionContainerIds: Id64Array;\n includeEmptyCategories?: boolean;\n }): Observable<Id64Set> {\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) =>\n from(definitionContainerIds).pipe(\n mergeMap((definitionContainerId) => {\n const definitionContainerInfo = definitionContainersInfo.get(definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of({ directCategories: undefined, indirectCategories: undefined });\n }\n const childDefinitionContainerIds = definitionContainerInfo.childDefinitionContainers.map(({ id }) => id);\n return (\n childDefinitionContainerIds.length > 0\n ? this.getAllContainedCategories({\n definitionContainerIds: childDefinitionContainerIds,\n includeEmptyCategories,\n })\n : of(new Set<string>())\n ).pipe(\n map((indirectCategories) => {\n return {\n directCategories: applyElementsFilter(definitionContainerInfo.childCategories, includeEmptyCategories).map((category) => category.id),\n indirectCategories,\n };\n }),\n );\n }),\n reduce((acc, { directCategories, indirectCategories }) => {\n directCategories?.forEach((categoryId) => acc.add(categoryId));\n indirectCategories?.forEach((categoryId) => acc.add(categoryId));\n return acc;\n }, new Set<Id64String>()),\n ),\n ),\n );\n }\n\n public getInstanceKeyPaths(\n props: { categoryId: Id64String } | { definitionContainerId: Id64String } | { subCategoryId: Id64String },\n ): Observable<InstanceKey[]> {\n if (\"subCategoryId\" in props) {\n return this.getSubCategoriesInfo().pipe(\n mergeMap((subCategoriesInfo) => {\n let categoryOfSubCategory: Id64String | undefined;\n for (const [categoryId, subCategories] of subCategoriesInfo.entries()) {\n if (subCategories.has(props.subCategoryId)) {\n categoryOfSubCategory = categoryId;\n break;\n }\n }\n if (categoryOfSubCategory === undefined) {\n return of([]);\n }\n return this.getInstanceKeyPaths({ categoryId: categoryOfSubCategory }).pipe(\n map((pathToCategory) => [...pathToCategory, { id: props.subCategoryId, className: SUB_CATEGORY_CLASS }]),\n );\n }),\n );\n }\n\n if (\"categoryId\" in props) {\n return this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => {\n for (const [modelId, modelCategoriesInfo] of modelsCategoriesInfo) {\n if (modelCategoriesInfo.childCategories.find((childCategory) => childCategory.id === props.categoryId)) {\n const instanceKey = { id: props.categoryId, className: this.#categoryClass };\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n\n return this.getInstanceKeyPaths({ definitionContainerId: modelId }).pipe(\n map((pathToDefinitionContainer) => [...pathToDefinitionContainer, instanceKey]),\n );\n }\n }\n return of([]);\n }),\n );\n }\n return this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => {\n const definitionContainerInfo = definitionContainersInfo.get(props.definitionContainerId);\n if (definitionContainerInfo === undefined) {\n return of([]);\n }\n const instanceKey = { id: props.definitionContainerId, className: DEFINITION_CONTAINER_CLASS };\n if (!definitionContainerInfo.parentDefinitionContainerExists) {\n return of([instanceKey]);\n }\n return this.getInstanceKeyPaths({ definitionContainerId: definitionContainerInfo.modelId }).pipe(\n map((pathToParentDefinitionContainer) => [...pathToParentDefinitionContainer, instanceKey]),\n );\n }),\n );\n }\n\n public getAllDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: Id64Array;\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo.id));\n return acc;\n }, new Array<Id64String>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (definitionContainerInfo.hasElements || !!props?.includeEmpty) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getRootDefinitionContainersAndCategories(props?: { includeEmpty?: boolean }): Observable<{\n categories: CategoryInfo[];\n definitionContainers: Id64Array;\n }> {\n return forkJoin({\n categories: this.getModelsCategoriesInfo().pipe(\n mergeMap((modelsCategoriesInfo) => modelsCategoriesInfo.values()),\n reduce((acc, modelCategoriesInfo) => {\n if (!modelCategoriesInfo.parentDefinitionContainerExists) {\n applyElementsFilter(modelCategoriesInfo.childCategories, props?.includeEmpty).forEach((categoryInfo) => acc.push(categoryInfo));\n }\n return acc;\n }, new Array<CategoryInfo>()),\n ),\n definitionContainers: this.getDefinitionContainersInfo().pipe(\n mergeMap((definitionContainersInfo) => definitionContainersInfo.entries()),\n reduce((acc, [definitionContainerId, definitionContainerInfo]) => {\n if (!definitionContainerInfo.parentDefinitionContainerExists && (definitionContainerInfo.hasElements || !!props?.includeEmpty)) {\n acc.push(definitionContainerId);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n });\n }\n\n public getSubCategories(categoryId: Id64String): Observable<Id64Set> {\n return this.getSubCategoriesInfo().pipe(map((subCategoriesInfo) => subCategoriesInfo.get(categoryId) ?? new Set()));\n }\n\n public getIsDefinitionContainerSupported(): Observable<boolean> {\n this.#isDefinitionContainerSupported ??= this.queryIsDefinitionContainersSupported().pipe(shareReplay());\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\nfunction applyElementsFilter<T extends { hasElements?: boolean }>(list: T[], includeEmpty: boolean | undefined): T[] {\n return includeEmpty ? list : list.filter(({ hasElements }) => !!hasElements);\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import { EMPTY,
|
|
5
|
+
import { EMPTY, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from "rxjs";
|
|
6
6
|
import { BeEvent, Id64 } from "@itwin/core-bentley";
|
|
7
7
|
import { PerModelCategoryVisibility } from "@itwin/core-frontend";
|
|
8
8
|
import { HierarchyNode } from "@itwin/presentation-hierarchies";
|
|
@@ -107,7 +107,17 @@ export class CategoriesVisibilityHandler {
|
|
|
107
107
|
}));
|
|
108
108
|
}
|
|
109
109
|
enableCategoriesElementModelsVisibility(categoryIds) {
|
|
110
|
-
return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(mergeMap((categoriesModelsMap) => categoriesModelsMap.
|
|
110
|
+
return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(mergeMap((categoriesModelsMap) => categoriesModelsMap.entries()), mergeMap(([modelId, categoriesFromPropsInModel]) => this.#viewport.view.viewsModel(modelId)
|
|
111
|
+
? EMPTY
|
|
112
|
+
: this.#idsCache.getCategoriesOfElementModel(modelId).pipe(map((allModelCategories) => {
|
|
113
|
+
// Add 'Hide' override to categories that were hidden before model is turned on
|
|
114
|
+
allModelCategories?.forEach((categoryId) => {
|
|
115
|
+
if (!categoriesFromPropsInModel.has(categoryId)) {
|
|
116
|
+
this.#viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, PerModelCategoryVisibility.Override.Hide);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return modelId;
|
|
120
|
+
}))), toArray(), mergeMap(async (hiddenModels) => {
|
|
111
121
|
if (hiddenModels.length > 0) {
|
|
112
122
|
await this.#viewport.addViewedModels(hiddenModels);
|
|
113
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.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 { EMPTY, filter, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from \"rxjs\";\nimport { BeEvent, Id64 } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategoryDisplay, enableSubCategoryDisplay } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { mergeVisibilities, releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\n\n/** @internal */\nexport interface CategoriesVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class CategoriesVisibilityHandler implements HierarchyVisibilityHandler {\n #pendingVisibilityChange: any;\n #viewport: Viewport;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n\n constructor(props: CategoriesVisibilityHandlerProps) {\n this.#idsCache = props.idsCache;\n this.#viewport = props.viewport;\n this.#viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.addListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.addListener(this.onViewedModelsChanged);\n this.#hierarchyConfig = props.hierarchyConfig;\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this.#viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.removeListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.removeListener(this.onViewedModelsChanged);\n clearTimeout(this.#pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent();\n\n /** Returns visibility status of the tree node. */\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (!node.extendedData?.categoryId) {\n return { state: \"hidden\", isDisabled: true };\n }\n return createVisibilityStatus(\n await firstValueFrom(this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId)),\n );\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node))));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getDefinitionContainerVisibility(node)));\n }\n\n return { state: \"hidden\", isDisabled: true };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return toVoidPromise(this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on));\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return toVoidPromise(this.changeSubCategoryVisibility(node, on));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return toVoidPromise(this.changeDefinitionContainerVisibility(node, on));\n }\n }\n\n private getSubCategoriesVisibility(subCategoryIds: Id64Arg, parentCategoryId: Id64String): Observable<Visibility> {\n return this.#idsCache.getCategoriesElementModels(parentCategoryId).pipe(\n mergeMap((modelMap): Observable<{ visibility: \"visible\" | \"hidden\"; isDefault: boolean }> => {\n if (modelMap.size === 0) {\n return of({ visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true });\n }\n return from(modelMap.keys()).pipe(\n map((modelId) => {\n if (!this.#viewport.view.viewsModel(modelId)) {\n return { visibility: \"hidden\", isDefault: false };\n }\n const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);\n return override === PerModelCategoryVisibility.Override.Show\n ? { visibility: \"visible\", isDefault: false }\n : override === PerModelCategoryVisibility.Override.Hide\n ? { visibility: \"hidden\", isDefault: false }\n : { visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true };\n }),\n );\n }),\n mergeMap(({ visibility, isDefault }) => {\n if (!isDefault || visibility === \"hidden\" || Id64.sizeOf(subCategoryIds) === 0) {\n return of(visibility);\n }\n return from(Id64.iterable(subCategoryIds)).pipe(\n releaseMainThreadOnItemsCount(200),\n map((subCategoryId) => (this.#viewport.isSubCategoryVisible(subCategoryId) ? \"visible\" : \"hidden\")),\n );\n }),\n mergeVisibilities,\n map((visibility) => (visibility === \"empty\" ? \"hidden\" : visibility)),\n );\n }\n\n private getDefinitionContainerVisibility(node: HierarchyNode): Observable<Visibility> {\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((categoryIds) => this.getCategoriesVisibility(categoryIds)));\n }\n\n private getCategoriesVisibility(categoryIds: Id64Arg): Observable<Visibility> {\n return from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap((categoryId) => forkJoin({ subCategoryIds: this.#idsCache.getSubCategories(categoryId), categoryId: of(categoryId) })),\n mergeMap(({ subCategoryIds, categoryId }) => this.getSubCategoriesVisibility(subCategoryIds, categoryId)),\n mergeVisibilities,\n map((visibility) => {\n return visibility === \"empty\" ? \"hidden\" : visibility;\n }),\n );\n }\n\n private enableCategoriesElementModelsVisibility(categoryIds: Id64Array) {\n return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(\n mergeMap((categoriesModelsMap) => categoriesModelsMap.keys()),\n filter((modelId) => !this.#viewport.view.viewsModel(modelId)),\n toArray(),\n mergeMap(async (hiddenModels) => {\n if (hiddenModels.length > 0) {\n await this.#viewport.addViewedModels(hiddenModels);\n }\n }),\n );\n }\n\n private changeSubCategoryVisibility(node: HierarchyNode, on: boolean) {\n const parentCategoryId = node.extendedData?.categoryId;\n return merge(\n // make sure parent category and models are enabled\n on && parentCategoryId ? this.enableCategoriesElementModelsVisibility([parentCategoryId]) : EMPTY,\n on && parentCategoryId ? this.changeCategoryState([parentCategoryId], true, false) : EMPTY,\n of(\n (() =>\n CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node).forEach((id) => {\n this.changeSubCategoryState(id, on);\n }))(),\n ),\n );\n }\n\n private changeCategoryVisibility(categoryIds: Id64Array, on: boolean) {\n return merge(\n // make sure models are enabled\n on ? this.enableCategoriesElementModelsVisibility(categoryIds) : EMPTY,\n from(categoryIds).pipe(\n mergeMap((categoryId) => this.#idsCache.getSubCategories(categoryId)),\n mergeMap((subCategorySet) => subCategorySet),\n toArray(),\n mergeMap((subCategories) =>\n subCategories.length > 0 ? this.changeCategoryState(categoryIds, on, false, subCategories) : this.changeCategoryState(categoryIds, on, on),\n ),\n ),\n );\n }\n\n private changeDefinitionContainerVisibility(node: HierarchyNode, on: boolean) {\n const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: definitionContainerId,\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((childCategories) => this.changeCategoryVisibility([...childCategories], on)));\n }\n\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesPerModelChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedModelsChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this.#pendingVisibilityChange) {\n return;\n }\n\n this.#pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this.#pendingVisibilityChange = undefined;\n }, 0);\n }\n\n private static getInstanceIdsFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];\n }\n\n private changeCategoryState(ids: Id64Array, enabled: boolean, enableAllSubCategories: boolean, subCategories?: Id64Arg) {\n return merge(\n from(enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories)),\n enabled && subCategories\n ? from(Id64.iterable(subCategories)).pipe(\n releaseMainThreadOnItemsCount(100),\n map((subCategoryId) => this.changeSubCategoryState(subCategoryId, true)),\n )\n : EMPTY,\n );\n }\n\n private changeSubCategoryState(key: string, enabled: boolean) {\n enableSubCategoryDisplay(this.#viewport, key, enabled);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CategoriesVisibilityHandler.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.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 { EMPTY, firstValueFrom, forkJoin, from, map, merge, mergeMap, of, toArray } from \"rxjs\";\nimport { BeEvent, Id64 } from \"@itwin/core-bentley\";\nimport { PerModelCategoryVisibility } from \"@itwin/core-frontend\";\nimport { HierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { enableCategoryDisplay, enableSubCategoryDisplay } from \"../../common/CategoriesVisibilityUtils.js\";\nimport { mergeVisibilities, releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { toVoidPromise } from \"../../common/Rxjs.js\";\nimport { createVisibilityStatus } from \"../../common/Tooltip.js\";\nimport { CategoriesTreeNode } from \"./CategoriesTreeNode.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { Id64Arg, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { Visibility } from \"../../common/Tooltip.js\";\nimport type { HierarchyVisibilityHandler, VisibilityStatus } from \"../../common/UseHierarchyVisibility.js\";\nimport type { CategoriesTreeHierarchyConfiguration } from \"../CategoriesTreeDefinition.js\";\nimport type { CategoriesTreeIdsCache } from \"./CategoriesTreeIdsCache.js\";\n\n/** @internal */\nexport interface CategoriesVisibilityHandlerProps {\n viewport: Viewport;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class CategoriesVisibilityHandler implements HierarchyVisibilityHandler {\n #pendingVisibilityChange: any;\n #viewport: Viewport;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n\n constructor(props: CategoriesVisibilityHandlerProps) {\n this.#idsCache = props.idsCache;\n this.#viewport = props.viewport;\n this.#viewport.onDisplayStyleChanged.addListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.addListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.addListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.addListener(this.onViewedModelsChanged);\n this.#hierarchyConfig = props.hierarchyConfig;\n }\n\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public [Symbol.dispose]() {\n this.#viewport.onDisplayStyleChanged.removeListener(this.onDisplayStyleChanged);\n this.#viewport.onViewedCategoriesChanged.removeListener(this.onViewedCategoriesChanged);\n this.#viewport.onViewedCategoriesPerModelChanged.removeListener(this.onViewedCategoriesPerModelChanged);\n this.#viewport.onViewedModelsChanged.removeListener(this.onViewedModelsChanged);\n clearTimeout(this.#pendingVisibilityChange);\n }\n\n public onVisibilityChange = new BeEvent();\n\n /** Returns visibility status of the tree node. */\n public async getVisibilityStatus(node: HierarchyNode): Promise<VisibilityStatus> {\n if (!HierarchyNode.isInstancesNode(node)) {\n return { state: \"hidden\", isDisabled: true };\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n if (!node.extendedData?.categoryId) {\n return { state: \"hidden\", isDisabled: true };\n }\n return createVisibilityStatus(\n await firstValueFrom(this.getSubCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), node.extendedData.categoryId)),\n );\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getCategoriesVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node))));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return createVisibilityStatus(await firstValueFrom(this.getDefinitionContainerVisibility(node)));\n }\n\n return { state: \"hidden\", isDisabled: true };\n }\n\n public async changeVisibility(node: HierarchyNode, on: boolean) {\n if (!HierarchyNode.isInstancesNode(node)) {\n return;\n }\n\n if (CategoriesTreeNode.isCategoryNode(node)) {\n return toVoidPromise(this.changeCategoryVisibility(CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node), on));\n }\n\n if (CategoriesTreeNode.isSubCategoryNode(node)) {\n return toVoidPromise(this.changeSubCategoryVisibility(node, on));\n }\n\n if (CategoriesTreeNode.isDefinitionContainerNode(node)) {\n return toVoidPromise(this.changeDefinitionContainerVisibility(node, on));\n }\n }\n\n private getSubCategoriesVisibility(subCategoryIds: Id64Arg, parentCategoryId: Id64String): Observable<Visibility> {\n return this.#idsCache.getCategoriesElementModels(parentCategoryId).pipe(\n mergeMap((modelMap): Observable<{ visibility: \"visible\" | \"hidden\"; isDefault: boolean }> => {\n if (modelMap.size === 0) {\n return of({ visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true });\n }\n return from(modelMap.keys()).pipe(\n map((modelId) => {\n if (!this.#viewport.view.viewsModel(modelId)) {\n return { visibility: \"hidden\", isDefault: false };\n }\n const override = this.#viewport.perModelCategoryVisibility.getOverride(modelId, parentCategoryId);\n return override === PerModelCategoryVisibility.Override.Show\n ? { visibility: \"visible\", isDefault: false }\n : override === PerModelCategoryVisibility.Override.Hide\n ? { visibility: \"hidden\", isDefault: false }\n : { visibility: this.#viewport.view.viewsCategory(parentCategoryId) ? \"visible\" : \"hidden\", isDefault: true };\n }),\n );\n }),\n mergeMap(({ visibility, isDefault }) => {\n if (!isDefault || visibility === \"hidden\" || Id64.sizeOf(subCategoryIds) === 0) {\n return of(visibility);\n }\n return from(Id64.iterable(subCategoryIds)).pipe(\n releaseMainThreadOnItemsCount(200),\n map((subCategoryId) => (this.#viewport.isSubCategoryVisible(subCategoryId) ? \"visible\" : \"hidden\")),\n );\n }),\n mergeVisibilities,\n map((visibility) => (visibility === \"empty\" ? \"hidden\" : visibility)),\n );\n }\n\n private getDefinitionContainerVisibility(node: HierarchyNode): Observable<Visibility> {\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node),\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((categoryIds) => this.getCategoriesVisibility(categoryIds)));\n }\n\n private getCategoriesVisibility(categoryIds: Id64Arg): Observable<Visibility> {\n return from(categoryIds).pipe(\n releaseMainThreadOnItemsCount(50),\n mergeMap((categoryId) => forkJoin({ subCategoryIds: this.#idsCache.getSubCategories(categoryId), categoryId: of(categoryId) })),\n mergeMap(({ subCategoryIds, categoryId }) => this.getSubCategoriesVisibility(subCategoryIds, categoryId)),\n mergeVisibilities,\n map((visibility) => {\n return visibility === \"empty\" ? \"hidden\" : visibility;\n }),\n );\n }\n\n private enableCategoriesElementModelsVisibility(categoryIds: Id64Array) {\n return this.#idsCache.getCategoriesElementModels(categoryIds).pipe(\n mergeMap((categoriesModelsMap) => categoriesModelsMap.entries()),\n mergeMap(([modelId, categoriesFromPropsInModel]) =>\n this.#viewport.view.viewsModel(modelId)\n ? EMPTY\n : this.#idsCache.getCategoriesOfElementModel(modelId).pipe(\n map((allModelCategories) => {\n // Add 'Hide' override to categories that were hidden before model is turned on\n allModelCategories?.forEach((categoryId) => {\n if (!categoriesFromPropsInModel.has(categoryId)) {\n this.#viewport.perModelCategoryVisibility.setOverride(modelId, categoryId, PerModelCategoryVisibility.Override.Hide);\n }\n });\n return modelId;\n }),\n ),\n ),\n toArray(),\n mergeMap(async (hiddenModels) => {\n if (hiddenModels.length > 0) {\n await this.#viewport.addViewedModels(hiddenModels);\n }\n }),\n );\n }\n\n private changeSubCategoryVisibility(node: HierarchyNode, on: boolean) {\n const parentCategoryId = node.extendedData?.categoryId;\n return merge(\n // make sure parent category and models are enabled\n on && parentCategoryId ? this.enableCategoriesElementModelsVisibility([parentCategoryId]) : EMPTY,\n on && parentCategoryId ? this.changeCategoryState([parentCategoryId], true, false) : EMPTY,\n of(\n (() =>\n CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node).forEach((id) => {\n this.changeSubCategoryState(id, on);\n }))(),\n ),\n );\n }\n\n private changeCategoryVisibility(categoryIds: Id64Array, on: boolean) {\n return merge(\n // make sure models are enabled\n on ? this.enableCategoriesElementModelsVisibility(categoryIds) : EMPTY,\n from(categoryIds).pipe(\n mergeMap((categoryId) => this.#idsCache.getSubCategories(categoryId)),\n mergeMap((subCategorySet) => subCategorySet),\n toArray(),\n mergeMap((subCategories) =>\n subCategories.length > 0 ? this.changeCategoryState(categoryIds, on, false, subCategories) : this.changeCategoryState(categoryIds, on, on),\n ),\n ),\n );\n }\n\n private changeDefinitionContainerVisibility(node: HierarchyNode, on: boolean) {\n const definitionContainerId = CategoriesVisibilityHandler.getInstanceIdsFromHierarchyNode(node);\n return this.#idsCache\n .getAllContainedCategories({\n definitionContainerIds: definitionContainerId,\n includeEmptyCategories: this.#hierarchyConfig.showEmptyCategories,\n })\n .pipe(mergeMap((childCategories) => this.changeCategoryVisibility([...childCategories], on)));\n }\n\n private onDisplayStyleChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedCategoriesPerModelChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onViewedModelsChanged = () => {\n this.onVisibilityChangeInternal();\n };\n\n private onVisibilityChangeInternal() {\n if (this.#pendingVisibilityChange) {\n return;\n }\n\n this.#pendingVisibilityChange = setTimeout(() => {\n this.onVisibilityChange.raiseEvent();\n this.#pendingVisibilityChange = undefined;\n }, 0);\n }\n\n private static getInstanceIdsFromHierarchyNode(node: HierarchyNode) {\n return HierarchyNode.isInstancesNode(node) ? node.key.instanceKeys.map((instanceKey) => instanceKey.id) : /* istanbul ignore next */ [];\n }\n\n private changeCategoryState(ids: Id64Array, enabled: boolean, enableAllSubCategories: boolean, subCategories?: Id64Arg) {\n return merge(\n from(enableCategoryDisplay(this.#viewport, ids, enabled, enableAllSubCategories)),\n enabled && subCategories\n ? from(Id64.iterable(subCategories)).pipe(\n releaseMainThreadOnItemsCount(100),\n map((subCategoryId) => this.changeSubCategoryState(subCategoryId, true)),\n )\n : EMPTY,\n );\n }\n\n private changeSubCategoryState(key: string, enabled: boolean) {\n enableSubCategoryDisplay(this.#viewport, key, enabled);\n }\n}\n"]}
|