@itwin/tree-widget-react 3.4.2 → 3.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -2
- package/lib/cjs/tree-widget-react/TreeWidget.js +2 -2
- package/lib/cjs/tree-widget-react/TreeWidget.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +10 -2
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +246 -129
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +70 -17
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +54 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +285 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +26 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +26 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/{CategoriesVisibilityHandler.d.ts → internal/CategoriesVisibilityHandler.d.ts} +18 -9
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +218 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +7 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js +14 -0
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +1 -0
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +0 -4
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +1 -2
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +2 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +3 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/TreeWidget.js +1 -1
- package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +10 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +246 -129
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +72 -19
- package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +54 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +280 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.d.ts +26 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js +23 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeNode.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/{CategoriesVisibilityHandler.d.ts → internal/CategoriesVisibilityHandler.d.ts} +18 -9
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +214 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.d.ts +7 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js +11 -0
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/ClassNameDefinitions.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +0 -4
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +2 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +3 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/package.json +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js +0 -91
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +0 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js +0 -87
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesVisibilityHandler.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
# Change Log - @itwin/tree-widget-react
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Thu, 06 Mar 2025 12:37:28 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 3.5.1
|
|
8
|
+
|
|
9
|
+
Thu, 06 Mar 2025 12:37:28 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Update import to use `@itwin/core-bentley` for types that are reexported by `@itwin/core-common` ([#1232](https://github.com/iTwin/viewer-components-react/pull/1232))
|
|
14
|
+
|
|
15
|
+
## 3.5.0
|
|
16
|
+
|
|
17
|
+
Wed, 19 Feb 2025 21:08:10 GMT
|
|
18
|
+
|
|
19
|
+
### Minor changes
|
|
20
|
+
|
|
21
|
+
- `CategoriesTree` component rendered `Categories` as a flat list, where each `Category` had zero or more child `SubCategories`. Some iTwin.js applications started to group `Categories` under `DefinitionContainers` and wanted to see them displayed in `CategoriesTree` component. Added `DefinitionContainers` to `CategoriesTree` component. This change doesn't affect applications that don't have `DefinitionContainers`. ([#1172](https://github.com/iTwin/viewer-components-react/pull/1172))
|
|
22
|
+
|
|
7
23
|
## 3.4.2
|
|
8
24
|
|
|
9
|
-
Fri, 14 Feb 2025 15:54:
|
|
25
|
+
Fri, 14 Feb 2025 15:54:49 GMT
|
|
10
26
|
|
|
11
27
|
### Patches
|
|
12
28
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.TreeWidget = void 0;
|
|
8
|
-
const
|
|
8
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
9
|
const core_frontend_1 = require("@itwin/core-frontend");
|
|
10
10
|
/**
|
|
11
11
|
* Entry point for static initialization required by various components used in the package.
|
|
@@ -35,7 +35,7 @@ class TreeWidget {
|
|
|
35
35
|
/** The internationalization service created by the IModelApp. */
|
|
36
36
|
static get i18n() {
|
|
37
37
|
if (!TreeWidget._i18n) {
|
|
38
|
-
throw new
|
|
38
|
+
throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, "TreeWidget not initialized");
|
|
39
39
|
}
|
|
40
40
|
return TreeWidget._i18n;
|
|
41
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeWidget.js","sourceRoot":"","sources":["../../../src/tree-widget-react/TreeWidget.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,
|
|
1
|
+
{"version":3,"file":"TreeWidget.js","sourceRoot":"","sources":["../../../src/tree-widget-react/TreeWidget.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,sDAAkE;AAClE,wDAAiD;AAIjD;;;GAGG;AACH,MAAa,UAAU;IAIrB;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAmB;QAChD,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,OAAO;SACR;QAED,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;QAC/B,UAAU,CAAC,KAAK,GAAG,IAAI,IAAI,yBAAS,CAAC,YAAY,CAAC;QAClD,OAAO,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC;IAED,wEAAwE;IACjE,MAAM,CAAC,SAAS;QACrB,IAAI,UAAU,CAAC,KAAK,EAAE;YACpB,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAC/D,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC;SAC9B;QAED,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,iEAAiE;IAC1D,MAAM,KAAK,IAAI;QACpB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;YACrB,MAAM,IAAI,2BAAY,CAAC,4BAAa,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;SAC3E;QACD,OAAO,UAAU,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,kDAAkD;IAC3C,MAAM,KAAK,aAAa;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;OACG;IACI,MAAM,CAAC,SAAS,CAAC,GAAsB,EAAE,OAA4B;QAC1E,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC;QACvD,OAAO,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF;AA/CD,gCA+CC","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 { BentleyError, BentleyStatus } from \"@itwin/core-bentley\";\nimport { IModelApp } from \"@itwin/core-frontend\";\n\nimport type { Localization, TranslationOptions } from \"@itwin/core-common\";\n\n/**\n * Entry point for static initialization required by various components used in the package.\n * @public\n */\nexport class TreeWidget {\n private static _i18n?: Localization;\n private static _initialized?: boolean;\n\n /**\n * Called by IModelApp to initialize the Tree Widget\n * @param i18n - The internationalization service created by the IModelApp.\n */\n public static async initialize(i18n?: Localization): Promise<void> {\n if (this._initialized) {\n return;\n }\n\n TreeWidget._initialized = true;\n TreeWidget._i18n = i18n ?? IModelApp.localization;\n return TreeWidget._i18n.registerNamespace(TreeWidget.i18nNamespace);\n }\n\n /** Unregisters the TreeWidget internationalization service namespace */\n public static terminate() {\n if (TreeWidget._i18n) {\n TreeWidget._i18n.unregisterNamespace(TreeWidget.i18nNamespace);\n TreeWidget._i18n = undefined;\n }\n\n TreeWidget._initialized = false;\n }\n\n /** The internationalization service created by the IModelApp. */\n public static get i18n(): Localization {\n if (!TreeWidget._i18n) {\n throw new BentleyError(BentleyStatus.ERROR, \"TreeWidget not initialized\");\n }\n return TreeWidget._i18n;\n }\n\n /** The internationalization service namespace. */\n public static get i18nNamespace(): string {\n return \"TreeWidget\";\n }\n\n /** Calls i18n.translateWithNamespace with the \"TreeWidget\" namespace. Do NOT include the namespace in the key.\n */\n public static translate(key: string | string[], options?: TranslationOptions): string {\n const stringKey = `${TreeWidget.i18nNamespace}:${key}`;\n return TreeWidget.i18n.getLocalizedString(stringKey, options);\n }\n}\n"]}
|
package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts
CHANGED
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
import type { ECClassHierarchyInspector, ECSchemaProvider } from "@itwin/presentation-shared";
|
|
2
|
+
import type { CategoriesTreeIdsCache } from "./internal/CategoriesTreeIdsCache.js";
|
|
2
3
|
import type { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyFilteringPath, HierarchyLevelDefinition, LimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
|
|
3
4
|
interface CategoriesTreeDefinitionProps {
|
|
4
|
-
imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;
|
|
5
|
+
imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;
|
|
5
6
|
viewType: "2d" | "3d";
|
|
7
|
+
idsCache: CategoriesTreeIdsCache;
|
|
6
8
|
}
|
|
7
9
|
interface CategoriesTreeInstanceKeyPathsFromInstanceLabelProps {
|
|
8
10
|
imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;
|
|
9
11
|
label: string;
|
|
10
12
|
viewType: "2d" | "3d";
|
|
13
|
+
limit?: number | "unbounded";
|
|
14
|
+
idsCache: CategoriesTreeIdsCache;
|
|
11
15
|
}
|
|
12
16
|
export declare class CategoriesTreeDefinition implements HierarchyDefinition {
|
|
13
17
|
private _impl;
|
|
14
18
|
private _selectQueryFactory;
|
|
15
19
|
private _nodeLabelSelectClauseFactory;
|
|
20
|
+
private _idsCache;
|
|
21
|
+
private _viewType;
|
|
22
|
+
private _iModelAccess;
|
|
16
23
|
constructor(props: CategoriesTreeDefinitionProps);
|
|
24
|
+
private getHierarchyDefinition;
|
|
17
25
|
defineHierarchyLevel(props: DefineHierarchyLevelProps): Promise<HierarchyLevelDefinition>;
|
|
18
|
-
private
|
|
26
|
+
private createDefinitionContainersAndCategoriesQuery;
|
|
19
27
|
private createSubcategoryQuery;
|
|
20
28
|
static createInstanceKeyPaths(props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps): Promise<HierarchyFilteringPath[]>;
|
|
21
29
|
}
|
package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js
CHANGED
|
@@ -5,81 +5,154 @@
|
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.CategoriesTreeDefinition = void 0;
|
|
8
|
+
const rxjs_1 = require("rxjs");
|
|
8
9
|
const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies");
|
|
9
10
|
const presentation_shared_1 = require("@itwin/presentation-shared");
|
|
10
11
|
const TreeErrors_js_1 = require("../common/TreeErrors.js");
|
|
12
|
+
const CategoriesTreeIdsCache_js_1 = require("./internal/CategoriesTreeIdsCache.js");
|
|
13
|
+
const ClassNameDefinitions_js_1 = require("./internal/ClassNameDefinitions.js");
|
|
11
14
|
const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
|
|
12
15
|
class CategoriesTreeDefinition {
|
|
13
16
|
constructor(props) {
|
|
14
|
-
this.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition({ ...requestProps, viewType: props.viewType }),
|
|
18
|
-
childNodes: [
|
|
19
|
-
{
|
|
20
|
-
parentInstancesNodePredicate: "BisCore.Category",
|
|
21
|
-
definitions: async (requestProps) => this.createSubcategoryQuery(requestProps),
|
|
22
|
-
},
|
|
23
|
-
],
|
|
24
|
-
},
|
|
25
|
-
});
|
|
17
|
+
this._iModelAccess = props.imodelAccess;
|
|
18
|
+
this._viewType = props.viewType;
|
|
19
|
+
this._idsCache = props.idsCache;
|
|
26
20
|
this._nodeLabelSelectClauseFactory = (0, presentation_shared_1.createBisInstanceLabelSelectClauseFactory)({ classHierarchyInspector: props.imodelAccess });
|
|
27
21
|
this._selectQueryFactory = (0, presentation_hierarchies_1.createNodesQueryClauseFactory)({
|
|
28
22
|
imodelAccess: props.imodelAccess,
|
|
29
23
|
instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,
|
|
30
24
|
});
|
|
31
25
|
}
|
|
26
|
+
async getHierarchyDefinition() {
|
|
27
|
+
this._impl ??= (async () => {
|
|
28
|
+
const isDefinitionContainerSupported = await this._idsCache.getIsDefinitionContainerSupported();
|
|
29
|
+
return (0, presentation_hierarchies_1.createPredicateBasedHierarchyDefinition)({
|
|
30
|
+
classHierarchyInspector: this._iModelAccess,
|
|
31
|
+
hierarchy: {
|
|
32
|
+
rootNodes: async (requestProps) => this.createDefinitionContainersAndCategoriesQuery({ ...requestProps, viewType: this._viewType }),
|
|
33
|
+
childNodes: [
|
|
34
|
+
{
|
|
35
|
+
parentInstancesNodePredicate: "BisCore.Category",
|
|
36
|
+
definitions: async (requestProps) => this.createSubcategoryQuery(requestProps),
|
|
37
|
+
},
|
|
38
|
+
...(isDefinitionContainerSupported
|
|
39
|
+
? [
|
|
40
|
+
{
|
|
41
|
+
parentInstancesNodePredicate: ClassNameDefinitions_js_1.DEFINITION_CONTAINER_CLASS,
|
|
42
|
+
definitions: async (requestProps) => this.createDefinitionContainersAndCategoriesQuery({
|
|
43
|
+
...requestProps,
|
|
44
|
+
viewType: this._viewType,
|
|
45
|
+
}),
|
|
46
|
+
},
|
|
47
|
+
]
|
|
48
|
+
: []),
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
})();
|
|
53
|
+
return this._impl;
|
|
54
|
+
}
|
|
32
55
|
async defineHierarchyLevel(props) {
|
|
33
|
-
return this.
|
|
56
|
+
return (await this.getHierarchyDefinition()).defineHierarchyLevel(props);
|
|
34
57
|
}
|
|
35
|
-
async
|
|
36
|
-
const {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
58
|
+
async createDefinitionContainersAndCategoriesQuery(props) {
|
|
59
|
+
const { parentNodeInstanceIds, instanceFilter, viewType } = props;
|
|
60
|
+
const { definitionContainers, categories } = parentNodeInstanceIds === undefined
|
|
61
|
+
? await this._idsCache.getRootDefinitionContainersAndCategories()
|
|
62
|
+
: await this._idsCache.getDirectChildDefinitionContainersAndCategories(parentNodeInstanceIds);
|
|
63
|
+
if (categories.length === 0 && definitionContainers.length === 0) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
const categoriesWithSingleChild = new Array();
|
|
67
|
+
const categoriesWithMultipleChildren = new Array();
|
|
68
|
+
categories.forEach((category) => {
|
|
69
|
+
if (category.childCount > 1) {
|
|
70
|
+
categoriesWithMultipleChildren.push(category.id);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
categoriesWithSingleChild.push(category.id);
|
|
74
|
+
}
|
|
40
75
|
});
|
|
41
|
-
|
|
42
|
-
{
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
76
|
+
const dataToDetermineHasChildren = categoriesWithSingleChild.length > categoriesWithMultipleChildren.length
|
|
77
|
+
? { ids: categoriesWithMultipleChildren, ifTrue: 1, ifFalse: 0 }
|
|
78
|
+
: { ids: categoriesWithSingleChild, ifTrue: 0, ifFalse: 1 };
|
|
79
|
+
const { categoryClass } = (0, CategoriesTreeIdsCache_js_1.getClassesByView)(viewType);
|
|
80
|
+
const [categoriesInstanceFilterClauses, definitionContainersInstanceFilterClauses] = await Promise.all([categoryClass, ...(definitionContainers.length > 0 ? [ClassNameDefinitions_js_1.DEFINITION_CONTAINER_CLASS] : [])].map(async (className) => this._selectQueryFactory.createFilterClauses({
|
|
81
|
+
filter: instanceFilter,
|
|
82
|
+
contentClass: { fullName: className, alias: "this" },
|
|
83
|
+
})));
|
|
84
|
+
const definitionContainersQuery = definitionContainers.length > 0
|
|
85
|
+
? `
|
|
86
|
+
SELECT
|
|
87
|
+
${await this._selectQueryFactory.createSelectClause({
|
|
88
|
+
ecClassId: { selector: presentation_shared_1.ECSql.createRawPropertyValueSelector("this", "ECClassId") },
|
|
89
|
+
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
90
|
+
nodeLabel: {
|
|
91
|
+
selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
|
|
92
|
+
classAlias: "this",
|
|
93
|
+
className: ClassNameDefinitions_js_1.DEFINITION_CONTAINER_CLASS,
|
|
94
|
+
}),
|
|
95
|
+
},
|
|
96
|
+
extendedData: {
|
|
97
|
+
isDefinitionContainer: true,
|
|
98
|
+
imageId: "icon-definition-container",
|
|
99
|
+
},
|
|
100
|
+
hasChildren: true,
|
|
101
|
+
supportsFiltering: true,
|
|
102
|
+
})}
|
|
103
|
+
FROM
|
|
104
|
+
${definitionContainersInstanceFilterClauses.from} this
|
|
105
|
+
${definitionContainersInstanceFilterClauses.joins}
|
|
106
|
+
WHERE
|
|
107
|
+
this.ECInstanceId IN (${definitionContainers.join(", ")})
|
|
108
|
+
${definitionContainersInstanceFilterClauses.where ? `AND ${definitionContainersInstanceFilterClauses.where}` : ""}
|
|
109
|
+
`
|
|
110
|
+
: undefined;
|
|
111
|
+
const categoriesQuery = categories.length > 0
|
|
112
|
+
? `
|
|
113
|
+
SELECT
|
|
47
114
|
${await this._selectQueryFactory.createSelectClause({
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
115
|
+
ecClassId: { selector: presentation_shared_1.ECSql.createRawPropertyValueSelector("this", "ECClassId") },
|
|
116
|
+
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
117
|
+
nodeLabel: {
|
|
118
|
+
selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
|
|
119
|
+
classAlias: "this",
|
|
120
|
+
className: categoryClass,
|
|
121
|
+
}),
|
|
122
|
+
},
|
|
123
|
+
...(dataToDetermineHasChildren.ids.length > 0
|
|
124
|
+
? {
|
|
56
125
|
hasChildren: {
|
|
57
126
|
selector: `
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
WHERE sc.Parent.Id = this.ECInstanceId
|
|
64
|
-
)
|
|
65
|
-
WHERE ChildCount > 1
|
|
66
|
-
), 0)
|
|
67
|
-
`,
|
|
127
|
+
IIF(this.ECInstanceId IN (${dataToDetermineHasChildren.ids.join(",")}),
|
|
128
|
+
${dataToDetermineHasChildren.ifTrue},
|
|
129
|
+
${dataToDetermineHasChildren.ifFalse}
|
|
130
|
+
)
|
|
131
|
+
`,
|
|
68
132
|
},
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
133
|
+
}
|
|
134
|
+
: { hasChildren: !!dataToDetermineHasChildren.ifFalse }),
|
|
135
|
+
extendedData: {
|
|
136
|
+
description: { selector: "this.Description" },
|
|
137
|
+
isCategory: true,
|
|
138
|
+
imageId: "icon-layers",
|
|
139
|
+
},
|
|
140
|
+
supportsFiltering: true,
|
|
141
|
+
})}
|
|
142
|
+
FROM
|
|
143
|
+
${categoriesInstanceFilterClauses.from} this
|
|
144
|
+
${categoriesInstanceFilterClauses.joins}
|
|
77
145
|
WHERE
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
146
|
+
this.ECInstanceId IN (${categories.map((category) => category.id).join(", ")})
|
|
147
|
+
${categoriesInstanceFilterClauses.where ? `AND ${categoriesInstanceFilterClauses.where}` : ""}
|
|
148
|
+
`
|
|
149
|
+
: undefined;
|
|
150
|
+
const queries = [categoriesQuery, definitionContainersQuery].filter((query) => query !== undefined);
|
|
151
|
+
return [
|
|
152
|
+
{
|
|
153
|
+
fullClassName: ClassNameDefinitions_js_1.DEFINITION_ELEMENT_CLASS,
|
|
154
|
+
query: {
|
|
155
|
+
ecsql: queries.join(" UNION ALL "),
|
|
83
156
|
},
|
|
84
157
|
},
|
|
85
158
|
];
|
|
@@ -87,11 +160,11 @@ class CategoriesTreeDefinition {
|
|
|
87
160
|
async createSubcategoryQuery({ parentNodeInstanceIds: elementIds, instanceFilter, }) {
|
|
88
161
|
const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
|
|
89
162
|
filter: instanceFilter,
|
|
90
|
-
contentClass: { fullName:
|
|
163
|
+
contentClass: { fullName: ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS, alias: "this" },
|
|
91
164
|
});
|
|
92
165
|
return [
|
|
93
166
|
{
|
|
94
|
-
fullClassName:
|
|
167
|
+
fullClassName: ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS,
|
|
95
168
|
query: {
|
|
96
169
|
ecsql: `
|
|
97
170
|
SELECT
|
|
@@ -101,11 +174,13 @@ class CategoriesTreeDefinition {
|
|
|
101
174
|
nodeLabel: {
|
|
102
175
|
selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
|
|
103
176
|
classAlias: "this",
|
|
104
|
-
className:
|
|
177
|
+
className: ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS,
|
|
105
178
|
}),
|
|
106
179
|
},
|
|
107
180
|
extendedData: {
|
|
108
181
|
categoryId: { selector: "printf('0x%x', this.Parent.Id)" },
|
|
182
|
+
isSubCategory: true,
|
|
183
|
+
imageId: "icon-layers-isolate",
|
|
109
184
|
},
|
|
110
185
|
supportsFiltering: false,
|
|
111
186
|
})}
|
|
@@ -122,86 +197,128 @@ class CategoriesTreeDefinition {
|
|
|
122
197
|
}
|
|
123
198
|
static async createInstanceKeyPaths(props) {
|
|
124
199
|
const labelsFactory = (0, presentation_shared_1.createBisInstanceLabelSelectClauseFactory)({ classHierarchyInspector: props.imodelAccess });
|
|
125
|
-
return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });
|
|
200
|
+
return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory, cache: props.idsCache });
|
|
126
201
|
}
|
|
127
202
|
}
|
|
128
203
|
exports.CategoriesTreeDefinition = CategoriesTreeDefinition;
|
|
129
|
-
function getClassesByView(viewType) {
|
|
130
|
-
return viewType === "2d"
|
|
131
|
-
? { categoryClass: "BisCore.DrawingCategory", categoryElementClass: "BisCore:GeometricElement2d" }
|
|
132
|
-
: { categoryClass: "BisCore.SpatialCategory", categoryElementClass: "BisCore:GeometricElement3d" };
|
|
133
|
-
}
|
|
134
204
|
async function createInstanceKeyPathsFromInstanceLabel(props) {
|
|
135
|
-
const {
|
|
205
|
+
const { definitionContainers, categories } = await props.cache.getAllDefinitionContainersAndCategories();
|
|
206
|
+
if (categories.length === 0) {
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
const { categoryClass } = (0, CategoriesTreeIdsCache_js_1.getClassesByView)(props.viewType);
|
|
136
210
|
const adjustedLabel = props.label.replace(/[%_\\]/g, "\\$&");
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
211
|
+
const CATEGORIES_WITH_LABELS_CTE = "CategoriesWithLabels";
|
|
212
|
+
const SUBCATEGORIES_WITH_LABELS_CTE = "SubCategoriesWithLabels";
|
|
213
|
+
const DEFINITION_CONTAINERS_WITH_LABELS_CTE = "DefinitionContainersWithLabels";
|
|
214
|
+
const [categoryLabelSelectClause, subCategoryLabelSelectClause, definitionContainerLabelSelectClause] = await Promise.all([categoryClass, ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS, ...(definitionContainers.length > 0 ? [ClassNameDefinitions_js_1.DEFINITION_CONTAINER_CLASS] : [])].map(async (className) => props.labelsFactory.createSelectClause({ classAlias: "this", className })));
|
|
215
|
+
return (0, rxjs_1.lastValueFrom)((0, rxjs_1.defer)(() => {
|
|
216
|
+
const ctes = [
|
|
217
|
+
`${CATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ChildCount, DisplayLabel) AS (
|
|
218
|
+
SELECT
|
|
219
|
+
'c',
|
|
220
|
+
this.ECInstanceId,
|
|
221
|
+
COUNT(sc.ECInstanceId),
|
|
222
|
+
${categoryLabelSelectClause}
|
|
223
|
+
FROM
|
|
224
|
+
${categoryClass} this
|
|
225
|
+
JOIN ${ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS} sc ON sc.Parent.Id = this.ECInstanceId
|
|
226
|
+
WHERE
|
|
227
|
+
this.ECInstanceId IN (${categories.join(", ")})
|
|
228
|
+
GROUP BY this.ECInstanceId
|
|
229
|
+
)`,
|
|
230
|
+
`${SUBCATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (
|
|
231
|
+
SELECT
|
|
232
|
+
'sc',
|
|
233
|
+
this.ECInstanceId,
|
|
234
|
+
this.Parent.Id,
|
|
235
|
+
${subCategoryLabelSelectClause}
|
|
236
|
+
FROM
|
|
237
|
+
${ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS} this
|
|
238
|
+
WHERE
|
|
239
|
+
NOT this.IsPrivate
|
|
240
|
+
AND this.Parent.Id IN (${categories.join(", ")})
|
|
241
|
+
)`,
|
|
242
|
+
...(definitionContainers.length > 0
|
|
243
|
+
? [
|
|
244
|
+
`${DEFINITION_CONTAINERS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (
|
|
245
|
+
SELECT
|
|
246
|
+
'dc',
|
|
247
|
+
this.ECInstanceId,
|
|
248
|
+
${definitionContainerLabelSelectClause}
|
|
249
|
+
FROM
|
|
250
|
+
${ClassNameDefinitions_js_1.DEFINITION_CONTAINER_CLASS} this
|
|
251
|
+
WHERE
|
|
252
|
+
this.ECInstanceId IN (${definitionContainers.join(", ")})
|
|
253
|
+
)`,
|
|
254
|
+
]
|
|
255
|
+
: []),
|
|
256
|
+
];
|
|
257
|
+
const ecsql = `
|
|
258
|
+
SELECT * FROM (
|
|
259
|
+
SELECT
|
|
260
|
+
sc.ClassName AS ClassName,
|
|
261
|
+
sc.ECInstanceId AS ECInstanceId
|
|
262
|
+
FROM
|
|
263
|
+
${CATEGORIES_WITH_LABELS_CTE} c
|
|
264
|
+
JOIN ${SUBCATEGORIES_WITH_LABELS_CTE} sc ON sc.ParentId = c.ECInstanceId
|
|
265
|
+
WHERE
|
|
266
|
+
c.ChildCount > 1
|
|
267
|
+
AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
|
|
268
|
+
|
|
269
|
+
UNION ALL
|
|
270
|
+
|
|
271
|
+
SELECT
|
|
272
|
+
c.ClassName AS ClassName,
|
|
273
|
+
c.ECInstanceId AS ECInstanceId
|
|
274
|
+
FROM
|
|
275
|
+
${CATEGORIES_WITH_LABELS_CTE} c
|
|
276
|
+
WHERE
|
|
277
|
+
c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
|
|
278
|
+
|
|
279
|
+
${definitionContainers.length > 0
|
|
280
|
+
? `
|
|
281
|
+
UNION ALL
|
|
282
|
+
SELECT
|
|
283
|
+
dc.ClassName AS ClassName,
|
|
284
|
+
dc.ECInstanceId AS ECInstanceId
|
|
285
|
+
FROM
|
|
286
|
+
${DEFINITION_CONTAINERS_WITH_LABELS_CTE} dc
|
|
287
|
+
WHERE
|
|
288
|
+
dc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
|
|
289
|
+
`
|
|
290
|
+
: ""}
|
|
188
291
|
)
|
|
189
|
-
LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}
|
|
190
|
-
|
|
191
|
-
bindings
|
|
292
|
+
${props.limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : props.limit !== "unbounded" ? `LIMIT ${props.limit}` : ""}
|
|
293
|
+
`;
|
|
294
|
+
const bindings = [
|
|
192
295
|
{ type: "string", value: adjustedLabel },
|
|
193
296
|
{ type: "string", value: adjustedLabel },
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
297
|
+
...(definitionContainers.length > 0 ? [{ type: "string", value: adjustedLabel }] : []),
|
|
298
|
+
];
|
|
299
|
+
return props.imodelAccess.createQueryReader({ ctes, ecsql, bindings }, { restartToken: "tree-widget/categories-tree/filter-by-label-query", limit: props.limit });
|
|
300
|
+
}).pipe((0, rxjs_1.map)((row) => ({
|
|
301
|
+
className: row.ClassName === "c" ? categoryClass : row.ClassName === "sc" ? ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS : ClassNameDefinitions_js_1.DEFINITION_CONTAINER_CLASS,
|
|
302
|
+
id: row.ECInstanceId,
|
|
303
|
+
})), (0, rxjs_1.toArray)(), (0, rxjs_1.mergeMap)((targetItems) => createInstanceKeyPathsFromTargetItems({ ...props, targetItems })), (0, rxjs_1.toArray)()));
|
|
304
|
+
}
|
|
305
|
+
function createInstanceKeyPathsFromTargetItems(props) {
|
|
306
|
+
const { limit, targetItems, viewType, idsCache } = props;
|
|
307
|
+
if (limit !== "unbounded" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {
|
|
308
|
+
throw new TreeErrors_js_1.FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);
|
|
201
309
|
}
|
|
202
|
-
if (
|
|
203
|
-
|
|
310
|
+
if (targetItems.length === 0) {
|
|
311
|
+
return rxjs_1.EMPTY;
|
|
204
312
|
}
|
|
205
|
-
|
|
313
|
+
const { categoryClass } = (0, CategoriesTreeIdsCache_js_1.getClassesByView)(viewType);
|
|
314
|
+
return (0, rxjs_1.from)(targetItems).pipe((0, rxjs_1.mergeMap)(async (targetItem) => {
|
|
315
|
+
if (targetItem.className === ClassNameDefinitions_js_1.SUB_CATEGORY_CLASS) {
|
|
316
|
+
return { path: await idsCache.getInstanceKeyPaths({ subCategoryId: targetItem.id }), options: { autoExpand: true } };
|
|
317
|
+
}
|
|
318
|
+
if (targetItem.className === categoryClass) {
|
|
319
|
+
return { path: await idsCache.getInstanceKeyPaths({ categoryId: targetItem.id }), options: { autoExpand: true } };
|
|
320
|
+
}
|
|
321
|
+
return { path: await idsCache.getInstanceKeyPaths({ definitionContainerId: targetItem.id }), options: { autoExpand: true } };
|
|
322
|
+
}));
|
|
206
323
|
}
|
|
207
324
|
//# sourceMappingURL=CategoriesTreeDefinition.js.map
|