@itwin/tree-widget-react 3.15.1 → 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.
Files changed (126) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/lib/cjs/tree-widget-react/TreeWidget.d.ts +1 -2
  3. package/lib/cjs/tree-widget-react/TreeWidget.js +12 -12
  4. package/lib/cjs/tree-widget-react/TreeWidget.js.map +1 -1
  5. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +2 -3
  6. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +5 -4
  7. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  8. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +4 -7
  9. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +39 -31
  10. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  11. package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +6 -2
  12. package/lib/cjs/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  13. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +3 -11
  14. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +45 -36
  15. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  16. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +1 -3
  17. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +30 -30
  18. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
  19. package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +2 -7
  20. package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +8 -21
  21. package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  22. package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +3 -0
  23. package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +7 -7
  24. package/lib/cjs/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -1
  25. package/lib/cjs/tree-widget-react/components/trees/common/useGuid.d.ts +2 -0
  26. package/lib/cjs/tree-widget-react/components/trees/common/useGuid.js +14 -0
  27. package/lib/cjs/tree-widget-react/components/trees/common/useGuid.js.map +1 -0
  28. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +4 -1
  29. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  30. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +4 -6
  31. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +31 -26
  32. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  33. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
  34. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +4 -2
  35. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  36. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +1 -5
  37. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +44 -44
  38. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  39. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +3 -6
  40. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +20 -16
  41. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  42. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +3 -1
  43. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  44. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +6 -10
  45. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +107 -64
  46. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  47. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js +18 -8
  48. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  49. package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.d.ts +24 -0
  50. package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js +46 -0
  51. package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
  52. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +40 -9
  53. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +68 -39
  54. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
  55. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +13 -5
  56. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +20 -14
  57. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
  58. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -13
  59. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +62 -60
  60. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  61. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +6 -2
  62. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +155 -177
  63. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  64. package/lib/esm/tree-widget-react/TreeWidget.d.ts +1 -2
  65. package/lib/esm/tree-widget-react/TreeWidget.js +12 -12
  66. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  67. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +2 -3
  68. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js +5 -3
  69. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  70. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.d.ts +4 -7
  71. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +39 -31
  72. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  73. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js +6 -2
  74. package/lib/esm/tree-widget-react/components/trees/categories-tree/UseCategoriesTree.js.map +1 -1
  75. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +3 -11
  76. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +45 -36
  77. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.d.ts +1 -3
  79. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js +30 -30
  80. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesVisibilityHandler.js.map +1 -1
  81. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.d.ts +2 -7
  82. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +8 -20
  83. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  84. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.d.ts +3 -0
  85. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js +7 -7
  86. package/lib/esm/tree-widget-react/components/trees/common/internal/useTreeHooks/UseIdsCache.js.map +1 -1
  87. package/lib/esm/tree-widget-react/components/trees/common/useGuid.d.ts +2 -0
  88. package/lib/esm/tree-widget-react/components/trees/common/useGuid.js +11 -0
  89. package/lib/esm/tree-widget-react/components/trees/common/useGuid.js.map +1 -0
  90. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js +4 -1
  91. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  92. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.d.ts +4 -6
  93. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js +31 -26
  94. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.js.map +1 -1
  95. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
  96. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +4 -2
  97. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  98. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +1 -5
  99. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +44 -44
  100. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  101. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.d.ts +3 -6
  102. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +21 -17
  103. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  104. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js +3 -1
  105. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  106. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +6 -10
  107. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +107 -64
  108. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  109. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +18 -8
  110. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  111. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +24 -0
  112. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js +44 -0
  113. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
  114. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.d.ts +40 -9
  115. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js +70 -41
  116. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/AlwaysAndNeverDrawnElementInfo.js.map +1 -1
  117. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.d.ts +13 -5
  118. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js +22 -16
  119. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/FilteredTree.js.map +1 -1
  120. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -13
  121. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +63 -61
  122. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  123. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.d.ts +6 -2
  124. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +157 -179
  125. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  126. 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
- _impl;
35
- _idsCache;
36
- _hierarchyConfig;
37
- _selectQueryFactory;
38
- _nodeLabelSelectClauseFactory;
39
- _queryExecutor;
40
- _isSupported;
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._impl = (0, presentation_hierarchies_1.createPredicateBasedHierarchyDefinition)({
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._hierarchyConfig.hideRootSubject ? [core_common_1.IModel.rootSubjectId] : [] }),
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._idsCache = props.idsCache;
71
- this._queryExecutor = props.imodelAccess;
72
- this._hierarchyConfig = props.hierarchyConfig;
73
- this._nodeLabelSelectClauseFactory = (0, presentation_shared_1.createBisInstanceLabelSelectClauseFactory)({ classHierarchyInspector: props.imodelAccess });
74
- this._selectQueryFactory = (0, presentation_hierarchies_1.createNodesQueryClauseFactory)({
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._nodeLabelSelectClauseFactory,
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
- label: this._hierarchyConfig.elementClassGrouping === "enableWithCounts" ? `${node.label} (${node.children.length})` : node.label,
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._isSupported === undefined) {
98
- this._isSupported = this.isSupported();
124
+ if (this.#isSupported === undefined) {
125
+ this.#isSupported = this.isSupported();
99
126
  }
100
- if ((await this._isSupported) === false) {
127
+ if ((await this.#isSupported) === false) {
101
128
  return [];
102
129
  }
103
- return this._impl.defineHierarchyLevel(props);
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._selectQueryFactory.createFilterClauses({
134
+ this.#selectQueryFactory.createFilterClauses({
108
135
  filter: instanceFilter,
109
136
  contentClass: { fullName: "BisCore.Subject", alias: "this" },
110
137
  }),
111
- this._selectQueryFactory.createFilterClauses({
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._idsCache.getChildSubjectIds(parentSubjectIds), this._idsCache.getChildSubjectModelIds(parentSubjectIds)])
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._selectQueryFactory.createSelectClause({
153
+ ${await this.#selectQueryFactory.createSelectClause({
127
154
  ecClassId: { selector: "this.ECClassId" },
128
155
  ecInstanceId: { selector: "this.ECInstanceId" },
129
156
  nodeLabel: {
130
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
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._idsCache.getParentSubjectIds() },
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._selectQueryFactory.createSelectClause({
192
+ ${await this.#selectQueryFactory.createSelectClause({
166
193
  ecClassId: { selector: "m.ECClassId" },
167
194
  ecInstanceId: { selector: "m.ECInstanceId" },
168
195
  nodeLabel: {
169
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
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._hierarchyConfig.showEmptyModels
212
+ hasChildren: this.#hierarchyConfig.showEmptyModels
186
213
  ? {
187
214
  selector: `
188
215
  IFNULL((
189
216
  SELECT 1
190
- FROM ${this._hierarchyConfig.elementClassSpecification} e
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._selectQueryFactory.createSelectClause({
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._hierarchyConfig.elementClassSpecification})
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._selectQueryFactory.createFilterClauses({
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._selectQueryFactory.createSelectClause({
281
+ ${await this.#selectQueryFactory.createSelectClause({
255
282
  ecClassId: { selector: "this.ECClassId" },
256
283
  ecInstanceId: { selector: "this.ECInstanceId" },
257
284
  nodeLabel: {
258
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
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._hierarchyConfig.elementClassSpecification} element
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._selectQueryFactory.createFilterClauses({
322
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
296
323
  filter: instanceFilter,
297
- contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: "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._idsCache.getCategoriesModeledElements(modelId, categoryIds)), (0, rxjs_1.reduce)((acc, foundModeledElements) => {
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._hierarchyConfig.elementClassSpecification,
331
+ fullClassName: this.#hierarchyConfig.elementClassSpecification,
305
332
  query: {
306
333
  ecsql: `
307
334
  SELECT
308
- ${await this._selectQueryFactory.createSelectClause({
335
+ ${await this.#selectQueryFactory.createSelectClause({
309
336
  ecClassId: { selector: "this.ECClassId" },
310
337
  ecInstanceId: { selector: "this.ECInstanceId" },
311
338
  nodeLabel: {
312
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
339
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
313
340
  classAlias: "this",
314
- className: this._hierarchyConfig.elementClassSpecification,
341
+ className: this.#hierarchyConfig.elementClassSpecification,
315
342
  }),
316
343
  },
317
344
  grouping: {
318
- byClass: this._hierarchyConfig.elementClassGrouping !== "disable",
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._hierarchyConfig.elementClassSpecification} ce
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._selectQueryFactory.createFilterClauses({
382
+ const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({
356
383
  filter: instanceFilter,
357
- contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: "this" },
384
+ contentClass: { fullName: this.#hierarchyConfig.elementClassSpecification, alias: "this" },
358
385
  });
359
386
  return [
360
387
  {
361
- fullClassName: this._hierarchyConfig.elementClassSpecification,
388
+ fullClassName: this.#hierarchyConfig.elementClassSpecification,
362
389
  query: {
363
390
  ecsql: `
364
391
  SELECT
365
- ${await this._selectQueryFactory.createSelectClause({
392
+ ${await this.#selectQueryFactory.createSelectClause({
366
393
  ecClassId: { selector: "this.ECClassId" },
367
394
  ecInstanceId: { selector: "this.ECInstanceId" },
368
395
  nodeLabel: {
369
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
396
+ selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({
370
397
  classAlias: "this",
371
- className: this._hierarchyConfig.elementClassSpecification,
398
+ className: this.#hierarchyConfig.elementClassSpecification,
372
399
  }),
373
400
  },
374
401
  grouping: {
375
- byClass: this._hierarchyConfig.elementClassGrouping !== "disable",
402
+ byClass: this.#hierarchyConfig.elementClassGrouping !== "disable",
376
403
  },
377
404
  hasChildren: {
378
405
  selector: `
379
406
  IFNULL((
380
407
  SELECT 1
381
- FROM ${this._hierarchyConfig.elementClassSpecification} ce
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({ ...props, labelsFactory });
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._hierarchyConfig.hierarchyLevelFiltering === "enable";
448
+ return this.#hierarchyConfig.hierarchyLevelFiltering === "enable";
417
449
  }
418
450
  async isSupported() {
419
- const [schemaName, className] = this._hierarchyConfig.elementClassSpecification.split(/[\.:]/);
451
+ const [schemaName, className] = this.#hierarchyConfig.elementClassSpecification.split(/[\.:]/);
420
452
  if (!schemaName || !className) {
421
- throw new Error(`Provided class specification ${this._hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`);
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._queryExecutor.createQueryReader(query)) {
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(imodelAccess, idsCache, hierarchyConfig, targetItems) {
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(imodelAccess, idsCache, hierarchyConfig, block), 10))));
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: "tree-widget/models-tree/filter-by-label-query",
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 })));