@itwin/tree-widget-react 3.15.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -2
- package/lib/cjs/tree-widget-react/TreeWidget.d.ts +1 -2
- package/lib/cjs/tree-widget-react/TreeWidget.js +12 -12
- package/lib/cjs/tree-widget-react/TreeWidget.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +2 -3
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +5 -4
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +4 -7
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +39 -31
- 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 +6 -2
- 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 +3 -11
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +45 -36
- 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.d.ts +1 -3
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +30 -30
- package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +2 -7
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +8 -21
- package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +3 -0
- package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +7 -7
- package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/common/useGuid.d.ts +2 -0
- package/lib/cjs/tree-widget-react/components/trees/common/useGuid.js +14 -0
- package/lib/cjs/tree-widget-react/components/trees/common/useGuid.js.map +1 -0
- package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +4 -1
- package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +4 -6
- package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +31 -26
- package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +4 -2
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +1 -5
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +44 -44
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +3 -6
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +20 -16
- package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +3 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +6 -10
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +107 -64
- package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js +18 -8
- package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.d.ts +24 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js +46 -0
- package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +40 -9
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +68 -39
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +13 -5
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +20 -14
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +5 -13
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +70 -60
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +6 -2
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +189 -197
- package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/TreeWidget.d.ts +1 -2
- package/lib/esm/tree-widget-react/TreeWidget.js +12 -12
- package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +2 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +5 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +4 -7
- package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +39 -31
- 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 +6 -2
- 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 +3 -11
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +45 -36
- 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.d.ts +1 -3
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +30 -30
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +2 -7
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +8 -20
- package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +3 -0
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +7 -7
- package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/useGuid.d.ts +2 -0
- package/lib/esm/tree-widget-react/components/trees/common/useGuid.js +11 -0
- package/lib/esm/tree-widget-react/components/trees/common/useGuid.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +4 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +4 -6
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +31 -26
- package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +4 -2
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +1 -5
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +44 -44
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +3 -6
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +21 -17
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +3 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +6 -10
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +107 -64
- package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +18 -8
- package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +24 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +44 -0
- package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +40 -9
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +70 -41
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +13 -5
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +22 -16
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +5 -13
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +71 -61
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +6 -2
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +192 -200
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/package.json +8 -8
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.ModelsTreeDefinition = exports.ModelsTreeInstanceKeyPathsProps = exports.defaultHierarchyConfiguration = void 0;
|
|
8
8
|
const rxjs_1 = require("rxjs");
|
|
9
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
10
|
const core_common_1 = require("@itwin/core-common");
|
|
10
11
|
const presentation_hierarchies_1 = require("@itwin/presentation-hierarchies");
|
|
11
12
|
const presentation_shared_1 = require("@itwin/presentation-shared");
|
|
@@ -31,18 +32,20 @@ var ModelsTreeInstanceKeyPathsProps;
|
|
|
31
32
|
ModelsTreeInstanceKeyPathsProps.isLabelProps = isLabelProps;
|
|
32
33
|
})(ModelsTreeInstanceKeyPathsProps || (exports.ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsProps = {}));
|
|
33
34
|
class ModelsTreeDefinition {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
#impl;
|
|
36
|
+
#idsCache;
|
|
37
|
+
#hierarchyConfig;
|
|
38
|
+
#selectQueryFactory;
|
|
39
|
+
#nodeLabelSelectClauseFactory;
|
|
40
|
+
#queryExecutor;
|
|
41
|
+
#isSupported;
|
|
42
|
+
static #componentName = "ModelsTreeDefinition";
|
|
43
|
+
#componentId;
|
|
41
44
|
constructor(props) {
|
|
42
|
-
this
|
|
45
|
+
this.#impl = (0, presentation_hierarchies_1.createPredicateBasedHierarchyDefinition)({
|
|
43
46
|
classHierarchyInspector: props.imodelAccess,
|
|
44
47
|
hierarchy: {
|
|
45
|
-
rootNodes: async (requestProps) => this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this.
|
|
48
|
+
rootNodes: async (requestProps) => this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this.#hierarchyConfig.hideRootSubject ? [core_common_1.IModel.rootSubjectId] : [] }),
|
|
46
49
|
childNodes: [
|
|
47
50
|
{
|
|
48
51
|
parentInstancesNodePredicate: "BisCore.Subject",
|
|
@@ -67,24 +70,48 @@ class ModelsTreeDefinition {
|
|
|
67
70
|
],
|
|
68
71
|
},
|
|
69
72
|
});
|
|
70
|
-
this
|
|
71
|
-
this
|
|
72
|
-
this
|
|
73
|
-
this
|
|
74
|
-
this
|
|
73
|
+
this.#componentId = props.componentId ?? core_bentley_1.Guid.createValue();
|
|
74
|
+
this.#idsCache = props.idsCache;
|
|
75
|
+
this.#queryExecutor = props.imodelAccess;
|
|
76
|
+
this.#hierarchyConfig = props.hierarchyConfig;
|
|
77
|
+
this.#nodeLabelSelectClauseFactory = (0, presentation_shared_1.createBisInstanceLabelSelectClauseFactory)({ classHierarchyInspector: props.imodelAccess });
|
|
78
|
+
this.#selectQueryFactory = (0, presentation_hierarchies_1.createNodesQueryClauseFactory)({
|
|
75
79
|
imodelAccess: props.imodelAccess,
|
|
76
|
-
instanceLabelSelectClauseFactory: this
|
|
80
|
+
instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,
|
|
77
81
|
});
|
|
78
82
|
}
|
|
79
83
|
async postProcessNode(node) {
|
|
80
84
|
if (presentation_hierarchies_1.ProcessedHierarchyNode.isGroupingNode(node)) {
|
|
85
|
+
let hasDirectNonFilteredTargets = false;
|
|
86
|
+
let hasFilterTargetAncestor = false;
|
|
87
|
+
for (const child of node.children) {
|
|
88
|
+
if (child.filtering) {
|
|
89
|
+
if (child.filtering.hasFilterTargetAncestor) {
|
|
90
|
+
hasFilterTargetAncestor = true;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
if (!child.filtering.isFilterTarget) {
|
|
94
|
+
hasDirectNonFilteredTargets = true;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
81
99
|
return {
|
|
82
100
|
...node,
|
|
83
|
-
|
|
101
|
+
...(hasFilterTargetAncestor
|
|
102
|
+
? {
|
|
103
|
+
filtering: {
|
|
104
|
+
...(node.filtering ?? {}),
|
|
105
|
+
hasFilterTargetAncestor,
|
|
106
|
+
},
|
|
107
|
+
}
|
|
108
|
+
: {}),
|
|
109
|
+
label: this.#hierarchyConfig.elementClassGrouping === "enableWithCounts" ? `${node.label} (${node.children.length})` : node.label,
|
|
84
110
|
extendedData: {
|
|
85
111
|
...node.extendedData,
|
|
86
112
|
// add `modelId` and `categoryId` from the first grouped element
|
|
87
113
|
...node.children[0].extendedData,
|
|
114
|
+
...(hasDirectNonFilteredTargets ? { hasDirectNonFilteredTargets } : {}),
|
|
88
115
|
// `imageId` is assigned to instance nodes at query time, but grouping ones need to
|
|
89
116
|
// be handled during post-processing
|
|
90
117
|
imageId: "icon-ec-class",
|
|
@@ -94,27 +121,27 @@ class ModelsTreeDefinition {
|
|
|
94
121
|
return node;
|
|
95
122
|
}
|
|
96
123
|
async defineHierarchyLevel(props) {
|
|
97
|
-
if (this
|
|
98
|
-
this
|
|
124
|
+
if (this.#isSupported === undefined) {
|
|
125
|
+
this.#isSupported = this.isSupported();
|
|
99
126
|
}
|
|
100
|
-
if ((await this
|
|
127
|
+
if ((await this.#isSupported) === false) {
|
|
101
128
|
return [];
|
|
102
129
|
}
|
|
103
|
-
return this.
|
|
130
|
+
return this.#impl.defineHierarchyLevel(props);
|
|
104
131
|
}
|
|
105
132
|
async createSubjectChildrenQuery({ parentNodeInstanceIds: parentSubjectIds, instanceFilter, }) {
|
|
106
133
|
const [subjectFilterClauses, modelFilterClauses] = await Promise.all([
|
|
107
|
-
this.
|
|
134
|
+
this.#selectQueryFactory.createFilterClauses({
|
|
108
135
|
filter: instanceFilter,
|
|
109
136
|
contentClass: { fullName: "BisCore.Subject", alias: "this" },
|
|
110
137
|
}),
|
|
111
|
-
this.
|
|
138
|
+
this.#selectQueryFactory.createFilterClauses({
|
|
112
139
|
filter: instanceFilter,
|
|
113
140
|
contentClass: { fullName: "BisCore.GeometricModel3d", alias: "this" },
|
|
114
141
|
}),
|
|
115
142
|
]);
|
|
116
143
|
const [childSubjectIds, childModelIds] = parentSubjectIds.length
|
|
117
|
-
? await Promise.all([this.
|
|
144
|
+
? await Promise.all([this.#idsCache.getChildSubjectIds(parentSubjectIds), this.#idsCache.getChildSubjectModelIds(parentSubjectIds)])
|
|
118
145
|
: [[core_common_1.IModel.rootSubjectId], []];
|
|
119
146
|
const defs = new Array();
|
|
120
147
|
childSubjectIds.length &&
|
|
@@ -123,11 +150,11 @@ class ModelsTreeDefinition {
|
|
|
123
150
|
query: {
|
|
124
151
|
ecsql: `
|
|
125
152
|
SELECT
|
|
126
|
-
${await this.
|
|
153
|
+
${await this.#selectQueryFactory.createSelectClause({
|
|
127
154
|
ecClassId: { selector: "this.ECClassId" },
|
|
128
155
|
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
129
156
|
nodeLabel: {
|
|
130
|
-
selector: await this.
|
|
157
|
+
selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
|
|
131
158
|
classAlias: "this",
|
|
132
159
|
className: "BisCore.Subject",
|
|
133
160
|
}),
|
|
@@ -149,7 +176,7 @@ class ModelsTreeDefinition {
|
|
|
149
176
|
${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : ""}
|
|
150
177
|
`,
|
|
151
178
|
bindings: [
|
|
152
|
-
{ type: "idset", value: await this.
|
|
179
|
+
{ type: "idset", value: await this.#idsCache.getParentSubjectIds() },
|
|
153
180
|
...childSubjectIds.map((id) => ({ type: "id", value: id })),
|
|
154
181
|
],
|
|
155
182
|
},
|
|
@@ -162,11 +189,11 @@ class ModelsTreeDefinition {
|
|
|
162
189
|
SELECT model.ECInstanceId AS ECInstanceId, model.*
|
|
163
190
|
FROM (
|
|
164
191
|
SELECT
|
|
165
|
-
${await this.
|
|
192
|
+
${await this.#selectQueryFactory.createSelectClause({
|
|
166
193
|
ecClassId: { selector: "m.ECClassId" },
|
|
167
194
|
ecInstanceId: { selector: "m.ECInstanceId" },
|
|
168
195
|
nodeLabel: {
|
|
169
|
-
selector: await this.
|
|
196
|
+
selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
|
|
170
197
|
classAlias: "partition",
|
|
171
198
|
className: "BisCore.InformationPartitionElement",
|
|
172
199
|
}),
|
|
@@ -182,12 +209,12 @@ class ModelsTreeDefinition {
|
|
|
182
209
|
END
|
|
183
210
|
`,
|
|
184
211
|
},
|
|
185
|
-
hasChildren: this.
|
|
212
|
+
hasChildren: this.#hierarchyConfig.showEmptyModels
|
|
186
213
|
? {
|
|
187
214
|
selector: `
|
|
188
215
|
IFNULL((
|
|
189
216
|
SELECT 1
|
|
190
|
-
FROM ${this.
|
|
217
|
+
FROM ${this.#hierarchyConfig.elementClassSpecification} e
|
|
191
218
|
WHERE e.Model.Id = m.ECInstanceId
|
|
192
219
|
LIMIT 1
|
|
193
220
|
), 0)
|
|
@@ -223,7 +250,7 @@ class ModelsTreeDefinition {
|
|
|
223
250
|
query: {
|
|
224
251
|
ecsql: `
|
|
225
252
|
SELECT
|
|
226
|
-
${await this.
|
|
253
|
+
${await this.#selectQueryFactory.createSelectClause({
|
|
227
254
|
ecClassId: { selector: "this.ECClassId" },
|
|
228
255
|
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
229
256
|
nodeLabel: "", // doesn't matter - the node is always hidden
|
|
@@ -233,7 +260,7 @@ class ModelsTreeDefinition {
|
|
|
233
260
|
WHERE
|
|
234
261
|
this.ModeledElement.Id IN (${elementIds.map(() => "?").join(",")})
|
|
235
262
|
AND NOT this.IsPrivate
|
|
236
|
-
AND this.ECInstanceId IN (SELECT Model.Id FROM ${this.
|
|
263
|
+
AND this.ECInstanceId IN (SELECT Model.Id FROM ${this.#hierarchyConfig.elementClassSpecification})
|
|
237
264
|
`,
|
|
238
265
|
bindings: [...elementIds.map((id) => ({ type: "id", value: id }))],
|
|
239
266
|
},
|
|
@@ -241,7 +268,7 @@ class ModelsTreeDefinition {
|
|
|
241
268
|
];
|
|
242
269
|
}
|
|
243
270
|
async createGeometricModel3dChildrenQuery({ parentNodeInstanceIds: modelIds, instanceFilter, }) {
|
|
244
|
-
const instanceFilterClauses = await this.
|
|
271
|
+
const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
|
|
245
272
|
filter: instanceFilter,
|
|
246
273
|
contentClass: { fullName: "BisCore.SpatialCategory", alias: "this" },
|
|
247
274
|
});
|
|
@@ -251,11 +278,11 @@ class ModelsTreeDefinition {
|
|
|
251
278
|
query: {
|
|
252
279
|
ecsql: `
|
|
253
280
|
SELECT
|
|
254
|
-
${await this.
|
|
281
|
+
${await this.#selectQueryFactory.createSelectClause({
|
|
255
282
|
ecClassId: { selector: "this.ECClassId" },
|
|
256
283
|
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
257
284
|
nodeLabel: {
|
|
258
|
-
selector: await this.
|
|
285
|
+
selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
|
|
259
286
|
classAlias: "this",
|
|
260
287
|
className: "BisCore.SpatialCategory",
|
|
261
288
|
}),
|
|
@@ -274,7 +301,7 @@ class ModelsTreeDefinition {
|
|
|
274
301
|
WHERE
|
|
275
302
|
EXISTS (
|
|
276
303
|
SELECT 1
|
|
277
|
-
FROM ${this.
|
|
304
|
+
FROM ${this.#hierarchyConfig.elementClassSpecification} element
|
|
278
305
|
WHERE
|
|
279
306
|
element.Model.Id IN (${modelIds.map(() => "?").join(",")})
|
|
280
307
|
AND element.Category.Id = +this.ECInstanceId
|
|
@@ -292,30 +319,30 @@ class ModelsTreeDefinition {
|
|
|
292
319
|
if (modelIds.length === 0) {
|
|
293
320
|
throw new Error(`Invalid category node "${parentNode.label}" - missing model information.`);
|
|
294
321
|
}
|
|
295
|
-
const instanceFilterClauses = await this.
|
|
322
|
+
const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
|
|
296
323
|
filter: instanceFilter,
|
|
297
|
-
contentClass: { fullName: this.
|
|
324
|
+
contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: "this" },
|
|
298
325
|
});
|
|
299
|
-
const modeledElements = await (0, rxjs_1.firstValueFrom)((0, rxjs_1.from)(modelIds).pipe((0, rxjs_1.mergeMap)(async (modelId) => this.
|
|
326
|
+
const modeledElements = await (0, rxjs_1.firstValueFrom)((0, rxjs_1.from)(modelIds).pipe((0, rxjs_1.mergeMap)(async (modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)), (0, rxjs_1.reduce)((acc, foundModeledElements) => {
|
|
300
327
|
return acc.concat(foundModeledElements);
|
|
301
328
|
}, new Array())));
|
|
302
329
|
return [
|
|
303
330
|
{
|
|
304
|
-
fullClassName: this.
|
|
331
|
+
fullClassName: this.#hierarchyConfig.elementClassSpecification,
|
|
305
332
|
query: {
|
|
306
333
|
ecsql: `
|
|
307
334
|
SELECT
|
|
308
|
-
${await this.
|
|
335
|
+
${await this.#selectQueryFactory.createSelectClause({
|
|
309
336
|
ecClassId: { selector: "this.ECClassId" },
|
|
310
337
|
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
311
338
|
nodeLabel: {
|
|
312
|
-
selector: await this.
|
|
339
|
+
selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
|
|
313
340
|
classAlias: "this",
|
|
314
|
-
className: this.
|
|
341
|
+
className: this.#hierarchyConfig.elementClassSpecification,
|
|
315
342
|
}),
|
|
316
343
|
},
|
|
317
344
|
grouping: {
|
|
318
|
-
byClass: this.
|
|
345
|
+
byClass: this.#hierarchyConfig.elementClassGrouping !== "disable",
|
|
319
346
|
},
|
|
320
347
|
hasChildren: {
|
|
321
348
|
selector: `
|
|
@@ -324,7 +351,7 @@ class ModelsTreeDefinition {
|
|
|
324
351
|
1,
|
|
325
352
|
IFNULL((
|
|
326
353
|
SELECT 1
|
|
327
|
-
FROM ${this.
|
|
354
|
+
FROM ${this.#hierarchyConfig.elementClassSpecification} ce
|
|
328
355
|
WHERE ce.Parent.Id = this.ECInstanceId
|
|
329
356
|
LIMIT 1
|
|
330
357
|
), 0)
|
|
@@ -352,33 +379,33 @@ class ModelsTreeDefinition {
|
|
|
352
379
|
];
|
|
353
380
|
}
|
|
354
381
|
async createGeometricElement3dChildrenQuery({ parentNodeInstanceIds: elementIds, instanceFilter, }) {
|
|
355
|
-
const instanceFilterClauses = await this.
|
|
382
|
+
const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
|
|
356
383
|
filter: instanceFilter,
|
|
357
|
-
contentClass: { fullName: this.
|
|
384
|
+
contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: "this" },
|
|
358
385
|
});
|
|
359
386
|
return [
|
|
360
387
|
{
|
|
361
|
-
fullClassName: this.
|
|
388
|
+
fullClassName: this.#hierarchyConfig.elementClassSpecification,
|
|
362
389
|
query: {
|
|
363
390
|
ecsql: `
|
|
364
391
|
SELECT
|
|
365
|
-
${await this.
|
|
392
|
+
${await this.#selectQueryFactory.createSelectClause({
|
|
366
393
|
ecClassId: { selector: "this.ECClassId" },
|
|
367
394
|
ecInstanceId: { selector: "this.ECInstanceId" },
|
|
368
395
|
nodeLabel: {
|
|
369
|
-
selector: await this.
|
|
396
|
+
selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
|
|
370
397
|
classAlias: "this",
|
|
371
|
-
className: this.
|
|
398
|
+
className: this.#hierarchyConfig.elementClassSpecification,
|
|
372
399
|
}),
|
|
373
400
|
},
|
|
374
401
|
grouping: {
|
|
375
|
-
byClass: this.
|
|
402
|
+
byClass: this.#hierarchyConfig.elementClassGrouping !== "disable",
|
|
376
403
|
},
|
|
377
404
|
hasChildren: {
|
|
378
405
|
selector: `
|
|
379
406
|
IFNULL((
|
|
380
407
|
SELECT 1
|
|
381
|
-
FROM ${this.
|
|
408
|
+
FROM ${this.#hierarchyConfig.elementClassSpecification} ce
|
|
382
409
|
JOIN BisCore.Model m ON ce.Model.Id = m.ECInstanceId
|
|
383
410
|
WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)
|
|
384
411
|
LIMIT 1
|
|
@@ -405,20 +432,25 @@ class ModelsTreeDefinition {
|
|
|
405
432
|
}
|
|
406
433
|
static async createInstanceKeyPaths(props) {
|
|
407
434
|
return (0, rxjs_1.lastValueFrom)((0, rxjs_1.defer)(() => {
|
|
435
|
+
const componentInfo = { componentId: props.componentId ?? core_bentley_1.Guid.createValue(), componentName: this.#componentName };
|
|
408
436
|
if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {
|
|
409
437
|
const labelsFactory = (0, presentation_shared_1.createBisInstanceLabelSelectClauseFactory)({ classHierarchyInspector: props.imodelAccess });
|
|
410
|
-
return createInstanceKeyPathsFromInstanceLabelObs({
|
|
438
|
+
return createInstanceKeyPathsFromInstanceLabelObs({
|
|
439
|
+
...props,
|
|
440
|
+
...componentInfo,
|
|
441
|
+
labelsFactory,
|
|
442
|
+
});
|
|
411
443
|
}
|
|
412
|
-
return createInstanceKeyPathsFromTargetItemsObs(props);
|
|
444
|
+
return createInstanceKeyPathsFromTargetItemsObs({ ...props, ...componentInfo });
|
|
413
445
|
}).pipe(props.abortSignal ? (0, rxjs_1.takeUntil)((0, rxjs_1.fromEvent)(props.abortSignal, "abort")) : rxjs_1.identity, (0, rxjs_1.defaultIfEmpty)([])));
|
|
414
446
|
}
|
|
415
447
|
supportsFiltering() {
|
|
416
|
-
return this.
|
|
448
|
+
return this.#hierarchyConfig.hierarchyLevelFiltering === "enable";
|
|
417
449
|
}
|
|
418
450
|
async isSupported() {
|
|
419
|
-
const [schemaName, className] = this.
|
|
451
|
+
const [schemaName, className] = this.#hierarchyConfig.elementClassSpecification.split(/[\.:]/);
|
|
420
452
|
if (!schemaName || !className) {
|
|
421
|
-
throw new Error(`Provided class specification ${this.
|
|
453
|
+
throw new Error(`Provided class specification ${this.#hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`);
|
|
422
454
|
}
|
|
423
455
|
const query = {
|
|
424
456
|
ecsql: `
|
|
@@ -432,14 +464,17 @@ class ModelsTreeDefinition {
|
|
|
432
464
|
{ type: "string", value: className },
|
|
433
465
|
],
|
|
434
466
|
};
|
|
435
|
-
for await (const _row of this.
|
|
467
|
+
for await (const _row of this.#queryExecutor.createQueryReader(query, {
|
|
468
|
+
restartToken: `${ModelsTreeDefinition.#componentName}/${this.#componentId}/is-class-supported`,
|
|
469
|
+
})) {
|
|
436
470
|
return true;
|
|
437
471
|
}
|
|
438
472
|
return false;
|
|
439
473
|
}
|
|
440
474
|
}
|
|
441
475
|
exports.ModelsTreeDefinition = ModelsTreeDefinition;
|
|
442
|
-
function createGeometricElementInstanceKeyPaths(
|
|
476
|
+
function createGeometricElementInstanceKeyPaths(props) {
|
|
477
|
+
const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess } = props;
|
|
443
478
|
const elementIds = targetItems.filter((info) => typeof info === "string");
|
|
444
479
|
const groupInfos = targetItems.filter((info) => typeof info !== "string");
|
|
445
480
|
const separator = ";";
|
|
@@ -499,7 +534,7 @@ function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarch
|
|
|
499
534
|
FROM ModelsCategoriesElementsHierarchy mce
|
|
500
535
|
WHERE mce.ParentId IS NULL
|
|
501
536
|
`;
|
|
502
|
-
return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "Indexes", limit: "unbounded" });
|
|
537
|
+
return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "Indexes", limit: "unbounded", restartToken: `${componentName}/${componentId}/geometric-element-paths/${chunkIndex}` });
|
|
503
538
|
}).pipe((0, Utils_js_2.releaseMainThreadOnItemsCount)(300), (0, rxjs_1.map)((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)), (0, rxjs_1.mergeMap)(({ modelId, elementHierarchyPath, groupingNode }) => (0, rxjs_1.from)(idsCache.createModelInstanceKeyPaths(modelId)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)((modelPath) => {
|
|
504
539
|
// We don't want to modify the original path, we create a copy that we can modify
|
|
505
540
|
const newModelPath = [...modelPath];
|
|
@@ -541,7 +576,7 @@ function parseQueryRow(row, groupInfos, separator, elementClassName) {
|
|
|
541
576
|
groupingNode: row[2] === -1 ? undefined : groupInfos[row[2]].groupingNode,
|
|
542
577
|
};
|
|
543
578
|
}
|
|
544
|
-
function createInstanceKeyPathsFromTargetItemsObs({ targetItems, imodelAccess, hierarchyConfig, idsCache, limit, }) {
|
|
579
|
+
function createInstanceKeyPathsFromTargetItemsObs({ targetItems, imodelAccess, hierarchyConfig, idsCache, limit, componentId, componentName, }) {
|
|
545
580
|
if (limit !== "unbounded" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {
|
|
546
581
|
throw new TreeErrors_js_1.FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);
|
|
547
582
|
}
|
|
@@ -581,7 +616,15 @@ function createInstanceKeyPathsFromTargetItemsObs({ targetItems, imodelAccess, h
|
|
|
581
616
|
elements: new Array(),
|
|
582
617
|
}), (0, rxjs_1.switchMap)(async (ids) => {
|
|
583
618
|
const elementsLength = ids.elements.length;
|
|
584
|
-
return (0, Rxjs_js_1.collect)((0, rxjs_1.merge)((0, rxjs_1.from)(ids.subjects).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createSubjectInstanceKeysPath(id)).pipe((0, rxjs_1.map)(presentation_hierarchies_1.HierarchyFilteringPath.normalize)))), (0, rxjs_1.from)(ids.models).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createModelInstanceKeyPaths(id)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(presentation_hierarchies_1.HierarchyFilteringPath.normalize)))), (0, rxjs_1.from)(ids.categories).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createCategoryInstanceKeyPaths(id)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(presentation_hierarchies_1.HierarchyFilteringPath.normalize)))), (0, rxjs_1.from)(ids.elements).pipe((0, rxjs_1.bufferCount)(Math.ceil(elementsLength / Math.ceil(elementsLength / 5000))), (0, Utils_js_2.releaseMainThreadOnItemsCount)(1), (0, rxjs_1.mergeMap)((block) => createGeometricElementInstanceKeyPaths(
|
|
619
|
+
return (0, Rxjs_js_1.collect)((0, rxjs_1.merge)((0, rxjs_1.from)(ids.subjects).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createSubjectInstanceKeysPath(id)).pipe((0, rxjs_1.map)(presentation_hierarchies_1.HierarchyFilteringPath.normalize)))), (0, rxjs_1.from)(ids.models).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createModelInstanceKeyPaths(id)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(presentation_hierarchies_1.HierarchyFilteringPath.normalize)))), (0, rxjs_1.from)(ids.categories).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createCategoryInstanceKeyPaths(id)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(presentation_hierarchies_1.HierarchyFilteringPath.normalize)))), (0, rxjs_1.from)(ids.elements).pipe((0, rxjs_1.bufferCount)(Math.ceil(elementsLength / Math.ceil(elementsLength / 5000))), (0, Utils_js_2.releaseMainThreadOnItemsCount)(1), (0, rxjs_1.mergeMap)((block, chunkIndex) => createGeometricElementInstanceKeyPaths({
|
|
620
|
+
imodelAccess,
|
|
621
|
+
idsCache,
|
|
622
|
+
hierarchyConfig,
|
|
623
|
+
targetItems: block,
|
|
624
|
+
componentId,
|
|
625
|
+
componentName,
|
|
626
|
+
chunkIndex,
|
|
627
|
+
}), 10))));
|
|
585
628
|
}));
|
|
586
629
|
}
|
|
587
630
|
function createInstanceKeyPathsFromInstanceLabelObs(props) {
|
|
@@ -624,7 +667,7 @@ function createInstanceKeyPathsFromInstanceLabelObs(props) {
|
|
|
624
667
|
}).pipe((0, rxjs_1.mergeMap)((queryProps) => {
|
|
625
668
|
return imodelAccess.createQueryReader(queryProps, {
|
|
626
669
|
rowFormat: "Indexes",
|
|
627
|
-
restartToken:
|
|
670
|
+
restartToken: `${props.componentName}/${props.componentId}/filter-by-label`,
|
|
628
671
|
limit,
|
|
629
672
|
});
|
|
630
673
|
}), (0, rxjs_1.map)((row) => ({ className: row[0], id: row[1] })), (0, rxjs_1.toArray)(), (0, rxjs_1.mergeMap)((targetKeys) => createInstanceKeyPathsFromTargetItemsObs({ ...props, targetItems: targetKeys })));
|