@itwin/tree-widget-react 4.0.0-alpha.13 → 4.0.0-alpha.14

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 (39) hide show
  1. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
  2. package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.css +1 -1
  3. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +1 -1
  4. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +2 -2
  5. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  6. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +13 -8
  7. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -1
  8. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +1 -1
  9. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +4 -3
  10. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -1
  11. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +1 -1
  12. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +2 -2
  13. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -1
  14. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.d.ts +10 -1
  15. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +268 -0
  16. package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -1
  17. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +3 -2
  18. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +46 -8
  19. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +16 -3
  21. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +74 -8
  22. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
  23. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.d.ts +2 -2
  24. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js.map +1 -1
  25. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeVisibilityHandler.d.ts +2 -0
  26. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeVisibilityHandler.js +69 -6
  27. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeVisibilityHandler.js.map +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/FilteredTree.d.ts +37 -0
  29. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/FilteredTree.js +193 -0
  30. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/FilteredTree.js.map +1 -0
  31. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.d.ts +18 -0
  32. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js +51 -0
  33. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js.map +1 -0
  34. package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js.map +1 -1
  35. package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js.map +1 -1
  36. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  37. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +1 -1
  38. package/lib/public/locales/en/TreeWidget.json +8 -1
  39. package/package.json +1 -1
@@ -2,9 +2,13 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ import { bufferCount, defer, EMPTY, from, identity, lastValueFrom, map, merge, mergeMap, of, reduce, toArray } from "rxjs";
5
6
  import { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition } from "@itwin/presentation-hierarchies";
6
7
  import { createBisInstanceLabelSelectClauseFactory, ECSql, parseFullClassName } from "@itwin/presentation-shared";
7
8
  import { CLASS_NAME_Classification, CLASS_NAME_ClassificationSystem, CLASS_NAME_ClassificationTable, CLASS_NAME_Element, CLASS_NAME_ElementHasClassifications, CLASS_NAME_GeometricElement, CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d, } from "../common/internal/ClassNameDefinitions.js";
9
+ import { releaseMainThreadOnItemsCount } from "../common/internal/Utils.js";
10
+ import { FilterLimitExceededError } from "../common/TreeErrors.js";
11
+ const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
8
12
  /** @internal */
9
13
  export class ClassificationsTreeDefinition {
10
14
  _props;
@@ -254,6 +258,10 @@ export class ClassificationsTreeDefinition {
254
258
  supportsFiltering: true,
255
259
  });
256
260
  }
261
+ static async createInstanceKeyPaths(props) {
262
+ const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });
263
+ return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });
264
+ }
257
265
  }
258
266
  function createClassificationHasChildrenSelector(classificationAlias) {
259
267
  return `
@@ -272,4 +280,264 @@ function createClassificationHasChildrenSelector(classificationAlias) {
272
280
  )
273
281
  `;
274
282
  }
283
+ async function createInstanceKeyPathsFromInstanceLabel(props) {
284
+ const adjustedLabel = props.label.replace(/[%_\\]/g, "\\$&");
285
+ const CLASSIFICATION_TABLES_WITH_LABELS_CTE = "ClassificationTablesWithLabels";
286
+ const CLASSIFICATIONS_WITH_LABELS_CTE = "ClassificationsWithLabels";
287
+ const ELEMENTS_2D_WITH_LABELS_CTE = "Elements2dWithLabels";
288
+ const ELEMENTS_3D_WITH_LABELS_CTE = "Elements3dWithLabels";
289
+ return lastValueFrom(defer(async () => {
290
+ const [classificationTableLabelSelectClause, classificationLabelSelectClause, element2dLabelSelectClause, element3dLabelSelectClause] = await Promise.all([CLASS_NAME_ClassificationTable, CLASS_NAME_Classification, CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d].map(async (className) => props.labelsFactory.createSelectClause({ classAlias: "this", className })));
291
+ const classificationIds = await props.idsCache.getAllClassifications();
292
+ const ctes = [
293
+ `
294
+ ${CLASSIFICATION_TABLES_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (
295
+ SELECT
296
+ 'ct',
297
+ this.ECInstanceId,
298
+ ${classificationTableLabelSelectClause}
299
+ FROM
300
+ ${CLASS_NAME_ClassificationTable} this
301
+ JOIN ${CLASS_NAME_ClassificationSystem} system ON system.ECInstanceId = this.Parent.Id
302
+ WHERE
303
+ system.CodeValue = '${props.hierarchyConfig.rootClassificationSystemCode}'
304
+ AND NOT this.IsPrivate
305
+ )
306
+ `,
307
+ ...(classificationIds.length > 0
308
+ ? [
309
+ `${CLASSIFICATIONS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (
310
+ SELECT
311
+ 'c',
312
+ this.ECInstanceId,
313
+ ${classificationLabelSelectClause}
314
+ FROM
315
+ ${CLASS_NAME_Classification} this
316
+ WHERE
317
+ this.ECInstanceId IN (${classificationIds.join(",")})
318
+ )`,
319
+ `${ELEMENTS_2D_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (
320
+ SELECT
321
+ 'e2d',
322
+ this.ECInstanceId,
323
+ ${element2dLabelSelectClause}
324
+ FROM
325
+ ${CLASS_NAME_GeometricElement2d} this
326
+ JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = this.ECInstanceId
327
+ WHERE
328
+ ehc.TargetECInstanceId IN (${classificationIds.join(",")})
329
+ AND this.Parent.Id IS NULL
330
+
331
+ UNION ALL
332
+
333
+ SELECT
334
+ 'e2d',
335
+ this.ECInstanceId,
336
+ ${element2dLabelSelectClause}
337
+ FROM
338
+ ${CLASS_NAME_GeometricElement2d} this
339
+ JOIN ${ELEMENTS_2D_WITH_LABELS_CTE} pe ON pe.ECInstanceId = this.Parent.Id
340
+ )`,
341
+ `${ELEMENTS_3D_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (
342
+ SELECT
343
+ 'e3d',
344
+ this.ECInstanceId,
345
+ ${element3dLabelSelectClause}
346
+ FROM
347
+ ${CLASS_NAME_GeometricElement3d} this
348
+ JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = this.ECInstanceId
349
+ WHERE
350
+ ehc.TargetECInstanceId IN (${classificationIds.join(",")})
351
+ AND this.Parent.Id IS NULL
352
+
353
+ UNION ALL
354
+
355
+ SELECT
356
+ 'e3d',
357
+ this.ECInstanceId,
358
+ ${element3dLabelSelectClause}
359
+ FROM
360
+ ${CLASS_NAME_GeometricElement3d} this
361
+ JOIN ${ELEMENTS_3D_WITH_LABELS_CTE} pe ON pe.ECInstanceId = this.Parent.Id
362
+ )`,
363
+ ]
364
+ : []),
365
+ ];
366
+ const ecsql = `
367
+ SELECT * FROM (
368
+ SELECT
369
+ ct.ClassName AS ClassName,
370
+ ct.ECInstanceId AS ECInstanceId
371
+ FROM
372
+ ${CLASSIFICATION_TABLES_WITH_LABELS_CTE} ct
373
+ WHERE
374
+ ct.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
375
+
376
+ ${classificationIds.length > 0
377
+ ? `
378
+ UNION ALL
379
+
380
+ SELECT
381
+ c.ClassName AS ClassName,
382
+ c.ECInstanceId AS ECInstanceId
383
+ FROM
384
+ ${CLASSIFICATIONS_WITH_LABELS_CTE} c
385
+ WHERE
386
+ c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
387
+
388
+ UNION ALL
389
+
390
+ SELECT
391
+ e2d.ClassName AS ClassName,
392
+ e2d.ECInstanceId AS ECInstanceId
393
+ FROM
394
+ ${ELEMENTS_2D_WITH_LABELS_CTE} e2d
395
+ WHERE
396
+ e2d.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
397
+
398
+ UNION ALL
399
+
400
+ SELECT
401
+ e3d.ClassName AS ClassName,
402
+ e3d.ECInstanceId AS ECInstanceId
403
+ FROM
404
+ ${ELEMENTS_3D_WITH_LABELS_CTE} e3d
405
+ WHERE
406
+ e3d.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\'
407
+ `
408
+ : ""}
409
+ )
410
+ ${props.limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : props.limit !== "unbounded" ? `LIMIT ${props.limit}` : ""}
411
+ `;
412
+ const bindings = [
413
+ { type: "string", value: adjustedLabel },
414
+ ...(classificationIds.length > 0
415
+ ? [
416
+ { type: "string", value: adjustedLabel },
417
+ { type: "string", value: adjustedLabel },
418
+ { type: "string", value: adjustedLabel },
419
+ ]
420
+ : []),
421
+ ];
422
+ return { ctes, ecsql, bindings };
423
+ }).pipe(mergeMap((queryProps) => props.imodelAccess.createQueryReader(queryProps, { restartToken: "tree-widget/classifications-tree/filter-by-label-query", limit: props.limit })), map((row) => {
424
+ let className;
425
+ switch (row.ClassName) {
426
+ case "ct":
427
+ className = CLASS_NAME_ClassificationTable;
428
+ break;
429
+ case "c":
430
+ className = CLASS_NAME_Classification;
431
+ break;
432
+ case "e2d":
433
+ className = CLASS_NAME_GeometricElement2d;
434
+ break;
435
+ default:
436
+ className = CLASS_NAME_GeometricElement3d;
437
+ break;
438
+ }
439
+ return {
440
+ className,
441
+ id: row.ECInstanceId,
442
+ };
443
+ }), createInstanceKeyPathsFromTargetItems(props), toArray()));
444
+ }
445
+ function createInstanceKeyPathsFromTargetItems({ idsCache, imodelAccess, limit, }) {
446
+ const actualLimit = limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT;
447
+ return (targetItems) => {
448
+ return targetItems.pipe(actualLimit !== "unbounded"
449
+ ? map((targetItem, index) => {
450
+ if (index >= actualLimit) {
451
+ throw new FilterLimitExceededError(actualLimit);
452
+ }
453
+ return targetItem;
454
+ })
455
+ : identity, releaseMainThreadOnItemsCount(2000), reduce((acc, { id, className }) => {
456
+ if (className === CLASS_NAME_ClassificationTable) {
457
+ acc.classificationTableIds.push(id);
458
+ return acc;
459
+ }
460
+ if (className === CLASS_NAME_Classification) {
461
+ acc.classificationIds.push(id);
462
+ return acc;
463
+ }
464
+ if (className === CLASS_NAME_GeometricElement2d) {
465
+ acc.element2dIds.push(id);
466
+ return acc;
467
+ }
468
+ acc.element3dIds.push(id);
469
+ return acc;
470
+ }, {
471
+ classificationTableIds: new Array(),
472
+ classificationIds: new Array(),
473
+ element2dIds: new Array(),
474
+ element3dIds: new Array(),
475
+ }), mergeMap((ids) => {
476
+ const elements2dLength = ids.element2dIds.length;
477
+ const elements3dLength = ids.element3dIds.length;
478
+ return merge(from(ids.classificationTableIds).pipe(map((id) => ({ path: [{ id, className: CLASS_NAME_ClassificationTable }], options: { autoExpand: true } }))), idsCache.getClassificationsPathObs(ids.classificationIds).pipe(map((path) => ({ path, options: { autoExpand: true } }))), from(ids.element2dIds).pipe(bufferCount(Math.ceil(elements2dLength / Math.ceil(elements2dLength / 5000))), releaseMainThreadOnItemsCount(1), mergeMap((block) => createGeometricElementInstanceKeyPaths({ idsCache, imodelAccess, targetItems: block, type: "2d" }), 10)), from(ids.element3dIds).pipe(bufferCount(Math.ceil(elements3dLength / Math.ceil(elements3dLength / 5000))), releaseMainThreadOnItemsCount(1), mergeMap((block) => createGeometricElementInstanceKeyPaths({ idsCache, imodelAccess, targetItems: block, type: "3d" }), 10)));
479
+ }));
480
+ };
481
+ }
482
+ function createGeometricElementInstanceKeyPaths(props) {
483
+ const { targetItems, imodelAccess, type, idsCache } = props;
484
+ if (targetItems.length === 0) {
485
+ return EMPTY;
486
+ }
487
+ const separator = ";";
488
+ return defer(() => {
489
+ const ctes = [
490
+ `ElementsHierarchy(ECInstanceId, ParentId, Path) AS (
491
+ SELECT
492
+ e.ECInstanceId,
493
+ e.Parent.Id,
494
+ 'e${type}${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT)
495
+ FROM ${CLASS_NAME_Element} e
496
+ WHERE e.ECInstanceId IN (${targetItems.join(",")})
497
+
498
+ UNION ALL
499
+
500
+ SELECT
501
+ pe.ECInstanceId,
502
+ pe.Parent.Id,
503
+ 'e${type}${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path
504
+ FROM ElementsHierarchy ce
505
+ JOIN ${CLASS_NAME_Element} pe ON pe.ECInstanceId = ce.ParentId
506
+ )`,
507
+ ];
508
+ const ecsql = `
509
+ SELECT
510
+ e.Path path,
511
+ c.ECInstanceId classificationId
512
+ FROM
513
+ ${CLASS_NAME_Classification} c
514
+ JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.TargetECInstanceId = c.ECInstanceId
515
+ JOIN ElementsHierarchy e ON ehc.SourceECInstanceId = e.ECInstanceId
516
+ WHERE e.ParentId IS NULL
517
+ `;
518
+ return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded", restartToken: `tree-widget/classifications-tree/elements${type}-filter-paths-query` });
519
+ }).pipe(releaseMainThreadOnItemsCount(300), map((row) => parseQueryRow(row, separator)), mergeMap(({ path, parentClassificationId }) => {
520
+ if (parentClassificationId) {
521
+ return idsCache
522
+ .getClassificationsPathObs([parentClassificationId])
523
+ .pipe(map((parentClassificationPath) => ({ path: parentClassificationPath.concat(path), options: { autoExpand: true } })));
524
+ }
525
+ return of({ path, options: { autoExpand: true } });
526
+ }));
527
+ }
528
+ function parseQueryRow(row, separator) {
529
+ const rowElements = row.path.split(separator);
530
+ const path = [];
531
+ for (let i = 0; i < rowElements.length; i += 2) {
532
+ switch (rowElements[i]) {
533
+ case "e2d":
534
+ path.push({ className: CLASS_NAME_GeometricElement2d, id: rowElements[i + 1] });
535
+ break;
536
+ case "e3d":
537
+ path.push({ className: CLASS_NAME_GeometricElement3d, id: rowElements[i + 1] });
538
+ break;
539
+ }
540
+ }
541
+ return { path, parentClassificationId: row.classificationId };
542
+ }
275
543
  //# sourceMappingURL=ClassificationsTreeDefinition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClassificationsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition } from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql, parseFullClassName } from \"@itwin/presentation-shared\";\nimport {\n CLASS_NAME_Classification,\n CLASS_NAME_ClassificationSystem,\n CLASS_NAME_ClassificationTable,\n CLASS_NAME_Element,\n CLASS_NAME_ElementHasClassifications,\n CLASS_NAME_GeometricElement,\n CLASS_NAME_GeometricElement2d,\n CLASS_NAME_GeometricElement3d,\n} from \"../common/internal/ClassNameDefinitions.js\";\n\nimport type {\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GenericInstanceFilter,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector, ECSchemaProvider, IInstanceLabelSelectClauseFactory } from \"@itwin/presentation-shared\";\nimport type { ClassificationId, ClassificationsTreeIdsCache, ClassificationTableId } from \"./internal/ClassificationsTreeIdsCache.js\";\n\ninterface ClassificationsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ClassificationsTreeIdsCache;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n}\n\n/** @alpha */\nexport interface ClassificationsTreeHierarchyConfiguration {\n /**\n * The classifications' hierarchy starts at the root `ClassificationSystem` element. This attribute identifiers that\n * root `ClassificationSystem`.\n */\n rootClassificationSystemCode: string;\n}\n\n/** @internal */\nexport class ClassificationsTreeDefinition implements HierarchyDefinition {\n private _impl: HierarchyDefinition;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n\n public constructor(private _props: ClassificationsTreeDefinitionProps) {\n this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: this._props.imodelAccess });\n this._selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: this._props.imodelAccess,\n instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,\n });\n this._impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: this._props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps: DefineRootHierarchyLevelProps) => this.#createClassificationTablesQuery(requestProps),\n childNodes: [\n {\n parentInstancesNodePredicate: CLASS_NAME_ClassificationTable,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.#createClassificationTableChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_Classification,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.#createClassificationChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_GeometricElement,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.#createGeometricElementChildrenQuery(requestProps),\n },\n ],\n },\n });\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n return this._impl.defineHierarchyLevel(props);\n }\n\n async #createClassificationTablesQuery(props: { instanceFilter?: GenericInstanceFilter }): Promise<HierarchyLevelDefinition> {\n const { instanceFilter } = props;\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_ClassificationTable, alias: \"this\" },\n });\n return [\n {\n fullClassName: CLASS_NAME_ClassificationTable,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_ClassificationTable,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${CLASS_NAME_Classification} classification\n WHERE classification.Model.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n type: \"ClassificationTable\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n JOIN ${CLASS_NAME_ClassificationSystem} system ON system.ECInstanceId = this.Parent.Id\n ${instanceFilterClauses.joins}\n WHERE\n system.CodeValue = '${this._props.hierarchyConfig.rootClassificationSystemCode}'\n AND NOT this.IsPrivate\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n async #createClassificationTableChildrenQuery(props: {\n parentNodeInstanceIds: ClassificationTableId[];\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds: classificationTableIds, instanceFilter } = props;\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_Classification, alias: \"this\" },\n });\n const classificationIds = await this._props.idsCache.getDirectChildClassifications(classificationTableIds);\n return classificationIds.length\n ? [\n {\n fullClassName: CLASS_NAME_Classification,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_Classification,\n }),\n },\n hasChildren: {\n selector: createClassificationHasChildrenSelector(\"this\"),\n },\n extendedData: {\n type: \"Classification\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${classificationIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ]\n : [];\n }\n\n async #createClassificationChildrenQuery(props: {\n parentNodeInstanceIds: ClassificationId[];\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds: parentClassificationIds, instanceFilter } = props;\n const classificationIds = await this._props.idsCache.getDirectChildClassifications(parentClassificationIds);\n return [\n // load child classifications\n ...(classificationIds.length\n ? [\n await (async () => {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_Classification, alias: \"this\" },\n });\n return {\n fullClassName: CLASS_NAME_Classification,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_Classification,\n }),\n },\n hasChildren: {\n selector: createClassificationHasChildrenSelector(\"this\"),\n },\n extendedData: {\n type: \"Classification\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${classificationIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n };\n })(),\n ]\n : []),\n // load classification elements\n ...(await Promise.all(\n [CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d].map(async (elementClassName) => {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: elementClassName, alias: \"this\" },\n });\n return {\n fullClassName: elementClassName,\n query: {\n ecsql: `\n SELECT ${await this.#createElementSelectClause(elementClassName)}\n FROM ${instanceFilterClauses.from} this\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = this.ECInstanceId\n ${instanceFilterClauses.joins}\n WHERE\n ehc.TargetECInstanceId IN (${parentClassificationIds.join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n };\n }),\n )),\n ];\n }\n\n async #createGeometricElementChildrenQuery({\n parentNodeInstanceIds: parentElementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n return Promise.all(\n [CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d].map(async (elementClassName) => {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: elementClassName, alias: \"this\" },\n });\n return {\n fullClassName: elementClassName,\n query: {\n ecsql: `\n SELECT ${await this.#createElementSelectClause(elementClassName)}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${parentElementIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n };\n }),\n );\n }\n\n async #createElementSelectClause(elementFullClassName: string): Promise<string> {\n const { className: elementClassName } = parseFullClassName(elementFullClassName);\n return this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: elementFullClassName,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${CLASS_NAME_Element} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n type: elementClassName,\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n },\n supportsFiltering: true,\n });\n }\n}\n\nfunction createClassificationHasChildrenSelector(classificationAlias: string) {\n return `\n COALESCE((\n SELECT 1\n FROM ${CLASS_NAME_Classification} classification\n WHERE classification.Parent.Id = ${classificationAlias}.ECInstanceId\n LIMIT 1\n ), (\n SELECT 1\n FROM ${CLASS_NAME_ElementHasClassifications} ehc\n WHERE ehc.TargetECInstanceId = ${classificationAlias}.ECInstanceId\n LIMIT 1\n ),\n 0\n )\n `;\n}\n"]}
1
+ {"version":3,"file":"ClassificationsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { bufferCount, defer, EMPTY, from, identity, lastValueFrom, map, merge, mergeMap, of, reduce, toArray } from \"rxjs\";\nimport { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition } from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql, parseFullClassName } from \"@itwin/presentation-shared\";\nimport {\n CLASS_NAME_Classification,\n CLASS_NAME_ClassificationSystem,\n CLASS_NAME_ClassificationTable,\n CLASS_NAME_Element,\n CLASS_NAME_ElementHasClassifications,\n CLASS_NAME_GeometricElement,\n CLASS_NAME_GeometricElement2d,\n CLASS_NAME_GeometricElement3d,\n} from \"../common/internal/ClassNameDefinitions.js\";\nimport { releaseMainThreadOnItemsCount } from \"../common/internal/Utils.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\n\nimport type { Observable, OperatorFunction } from \"rxjs\";\nimport type { Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport type {\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GenericInstanceFilter,\n HierarchyDefinition,\n HierarchyFilteringPath,\n HierarchyLevelDefinition,\n HierarchyNodeIdentifiersPath,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ECClassHierarchyInspector, ECSchemaProvider, ECSqlQueryRow, IInstanceLabelSelectClauseFactory, InstanceKey } from \"@itwin/presentation-shared\";\nimport type { ElementId } from \"../common/internal/Types.js\";\nimport type { ClassificationId, ClassificationsTreeIdsCache, ClassificationTableId } from \"./internal/ClassificationsTreeIdsCache.js\";\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\ninterface ClassificationsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ClassificationsTreeIdsCache;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n}\n\n/** @alpha */\nexport interface ClassificationsTreeHierarchyConfiguration {\n /**\n * The classifications' hierarchy starts at the root `ClassificationSystem` element. This attribute identifiers that\n * root `ClassificationSystem`.\n */\n rootClassificationSystemCode: string;\n}\n\n/** @alpha */\nexport interface ClassificationsTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n label: string;\n limit?: number | \"unbounded\";\n idsCache: ClassificationsTreeIdsCache;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n}\n\n/** @internal */\nexport class ClassificationsTreeDefinition implements HierarchyDefinition {\n private _impl: HierarchyDefinition;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n\n public constructor(private _props: ClassificationsTreeDefinitionProps) {\n this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: this._props.imodelAccess });\n this._selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: this._props.imodelAccess,\n instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,\n });\n this._impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: this._props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps: DefineRootHierarchyLevelProps) => this.#createClassificationTablesQuery(requestProps),\n childNodes: [\n {\n parentInstancesNodePredicate: CLASS_NAME_ClassificationTable,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.#createClassificationTableChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_Classification,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.#createClassificationChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_GeometricElement,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.#createGeometricElementChildrenQuery(requestProps),\n },\n ],\n },\n });\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n return this._impl.defineHierarchyLevel(props);\n }\n\n async #createClassificationTablesQuery(props: { instanceFilter?: GenericInstanceFilter }): Promise<HierarchyLevelDefinition> {\n const { instanceFilter } = props;\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_ClassificationTable, alias: \"this\" },\n });\n return [\n {\n fullClassName: CLASS_NAME_ClassificationTable,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_ClassificationTable,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${CLASS_NAME_Classification} classification\n WHERE classification.Model.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n type: \"ClassificationTable\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n JOIN ${CLASS_NAME_ClassificationSystem} system ON system.ECInstanceId = this.Parent.Id\n ${instanceFilterClauses.joins}\n WHERE\n system.CodeValue = '${this._props.hierarchyConfig.rootClassificationSystemCode}'\n AND NOT this.IsPrivate\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n async #createClassificationTableChildrenQuery(props: {\n parentNodeInstanceIds: ClassificationTableId[];\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds: classificationTableIds, instanceFilter } = props;\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_Classification, alias: \"this\" },\n });\n const classificationIds = await this._props.idsCache.getDirectChildClassifications(classificationTableIds);\n return classificationIds.length\n ? [\n {\n fullClassName: CLASS_NAME_Classification,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_Classification,\n }),\n },\n hasChildren: {\n selector: createClassificationHasChildrenSelector(\"this\"),\n },\n extendedData: {\n type: \"Classification\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${classificationIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ]\n : [];\n }\n\n async #createClassificationChildrenQuery(props: {\n parentNodeInstanceIds: ClassificationId[];\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds: parentClassificationIds, instanceFilter } = props;\n const classificationIds = await this._props.idsCache.getDirectChildClassifications(parentClassificationIds);\n return [\n // load child classifications\n ...(classificationIds.length\n ? [\n await (async () => {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_Classification, alias: \"this\" },\n });\n return {\n fullClassName: CLASS_NAME_Classification,\n query: {\n ecsql: `\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_Classification,\n }),\n },\n hasChildren: {\n selector: createClassificationHasChildrenSelector(\"this\"),\n },\n extendedData: {\n type: \"Classification\",\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${classificationIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n };\n })(),\n ]\n : []),\n // load classification elements\n ...(await Promise.all(\n [CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d].map(async (elementClassName) => {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: elementClassName, alias: \"this\" },\n });\n return {\n fullClassName: elementClassName,\n query: {\n ecsql: `\n SELECT ${await this.#createElementSelectClause(elementClassName)}\n FROM ${instanceFilterClauses.from} this\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = this.ECInstanceId\n ${instanceFilterClauses.joins}\n WHERE\n ehc.TargetECInstanceId IN (${parentClassificationIds.join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n };\n }),\n )),\n ];\n }\n\n async #createGeometricElementChildrenQuery({\n parentNodeInstanceIds: parentElementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n return Promise.all(\n [CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d].map(async (elementClassName) => {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: elementClassName, alias: \"this\" },\n });\n return {\n fullClassName: elementClassName,\n query: {\n ecsql: `\n SELECT ${await this.#createElementSelectClause(elementClassName)}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${parentElementIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n };\n }),\n );\n }\n\n async #createElementSelectClause(elementFullClassName: string): Promise<string> {\n const { className: elementClassName } = parseFullClassName(elementFullClassName);\n return this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: elementFullClassName,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${CLASS_NAME_Element} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n type: elementClassName,\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n },\n supportsFiltering: true,\n });\n }\n\n public static async createInstanceKeyPaths(props: ClassificationsTreeInstanceKeyPathsFromInstanceLabelProps): Promise<HierarchyFilteringPath[]> {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });\n }\n}\n\nfunction createClassificationHasChildrenSelector(classificationAlias: string) {\n return `\n COALESCE((\n SELECT 1\n FROM ${CLASS_NAME_Classification} classification\n WHERE classification.Parent.Id = ${classificationAlias}.ECInstanceId\n LIMIT 1\n ), (\n SELECT 1\n FROM ${CLASS_NAME_ElementHasClassifications} ehc\n WHERE ehc.TargetECInstanceId = ${classificationAlias}.ECInstanceId\n LIMIT 1\n ),\n 0\n )\n `;\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: ClassificationsTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory },\n): Promise<HierarchyFilteringPath[]> {\n const adjustedLabel = props.label.replace(/[%_\\\\]/g, \"\\\\$&\");\n\n const CLASSIFICATION_TABLES_WITH_LABELS_CTE = \"ClassificationTablesWithLabels\";\n const CLASSIFICATIONS_WITH_LABELS_CTE = \"ClassificationsWithLabels\";\n const ELEMENTS_2D_WITH_LABELS_CTE = \"Elements2dWithLabels\";\n const ELEMENTS_3D_WITH_LABELS_CTE = \"Elements3dWithLabels\";\n return lastValueFrom(\n defer(async () => {\n const [classificationTableLabelSelectClause, classificationLabelSelectClause, element2dLabelSelectClause, element3dLabelSelectClause] = await Promise.all(\n [CLASS_NAME_ClassificationTable, CLASS_NAME_Classification, CLASS_NAME_GeometricElement2d, CLASS_NAME_GeometricElement3d].map(async (className) =>\n props.labelsFactory.createSelectClause({ classAlias: \"this\", className }),\n ),\n );\n const classificationIds = await props.idsCache.getAllClassifications();\n const ctes = [\n `\n ${CLASSIFICATION_TABLES_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'ct',\n this.ECInstanceId,\n ${classificationTableLabelSelectClause}\n FROM\n ${CLASS_NAME_ClassificationTable} this\n JOIN ${CLASS_NAME_ClassificationSystem} system ON system.ECInstanceId = this.Parent.Id\n WHERE\n system.CodeValue = '${props.hierarchyConfig.rootClassificationSystemCode}'\n AND NOT this.IsPrivate\n )\n `,\n ...(classificationIds.length > 0\n ? [\n `${CLASSIFICATIONS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'c',\n this.ECInstanceId,\n ${classificationLabelSelectClause}\n FROM\n ${CLASS_NAME_Classification} this\n WHERE\n this.ECInstanceId IN (${classificationIds.join(\",\")})\n )`,\n `${ELEMENTS_2D_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'e2d',\n this.ECInstanceId,\n ${element2dLabelSelectClause}\n FROM\n ${CLASS_NAME_GeometricElement2d} this\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = this.ECInstanceId\n WHERE\n ehc.TargetECInstanceId IN (${classificationIds.join(\",\")})\n AND this.Parent.Id IS NULL\n\n UNION ALL\n\n SELECT\n 'e2d',\n this.ECInstanceId,\n ${element2dLabelSelectClause}\n FROM\n ${CLASS_NAME_GeometricElement2d} this\n JOIN ${ELEMENTS_2D_WITH_LABELS_CTE} pe ON pe.ECInstanceId = this.Parent.Id\n )`,\n `${ELEMENTS_3D_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'e3d',\n this.ECInstanceId,\n ${element3dLabelSelectClause}\n FROM\n ${CLASS_NAME_GeometricElement3d} this\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.SourceECInstanceId = this.ECInstanceId\n WHERE\n ehc.TargetECInstanceId IN (${classificationIds.join(\",\")})\n AND this.Parent.Id IS NULL\n\n UNION ALL\n\n SELECT\n 'e3d',\n this.ECInstanceId,\n ${element3dLabelSelectClause}\n FROM\n ${CLASS_NAME_GeometricElement3d} this\n JOIN ${ELEMENTS_3D_WITH_LABELS_CTE} pe ON pe.ECInstanceId = this.Parent.Id\n )`,\n ]\n : []),\n ];\n const ecsql = `\n SELECT * FROM (\n SELECT\n ct.ClassName AS ClassName,\n ct.ECInstanceId AS ECInstanceId\n FROM\n ${CLASSIFICATION_TABLES_WITH_LABELS_CTE} ct\n WHERE\n ct.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n\n ${\n classificationIds.length > 0\n ? `\n UNION ALL\n\n SELECT\n c.ClassName AS ClassName,\n c.ECInstanceId AS ECInstanceId\n FROM\n ${CLASSIFICATIONS_WITH_LABELS_CTE} c\n WHERE\n c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n\n UNION ALL\n\n SELECT\n e2d.ClassName AS ClassName,\n e2d.ECInstanceId AS ECInstanceId\n FROM\n ${ELEMENTS_2D_WITH_LABELS_CTE} e2d\n WHERE\n e2d.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n\n UNION ALL\n\n SELECT\n e3d.ClassName AS ClassName,\n e3d.ECInstanceId AS ECInstanceId\n FROM\n ${ELEMENTS_3D_WITH_LABELS_CTE} e3d\n WHERE\n e3d.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n )\n ${props.limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : props.limit !== \"unbounded\" ? `LIMIT ${props.limit}` : \"\"}\n `;\n const bindings = [\n { type: \"string\" as const, value: adjustedLabel },\n ...(classificationIds.length > 0\n ? [\n { type: \"string\" as const, value: adjustedLabel },\n { type: \"string\" as const, value: adjustedLabel },\n { type: \"string\" as const, value: adjustedLabel },\n ]\n : []),\n ];\n return { ctes, ecsql, bindings };\n }).pipe(\n mergeMap((queryProps) =>\n props.imodelAccess.createQueryReader(queryProps, { restartToken: \"tree-widget/classifications-tree/filter-by-label-query\", limit: props.limit }),\n ),\n map((row): InstanceKey => {\n let className: string;\n switch (row.ClassName) {\n case \"ct\":\n className = CLASS_NAME_ClassificationTable;\n break;\n case \"c\":\n className = CLASS_NAME_Classification;\n break;\n case \"e2d\":\n className = CLASS_NAME_GeometricElement2d;\n break;\n default:\n className = CLASS_NAME_GeometricElement3d;\n break;\n }\n return {\n className,\n id: row.ECInstanceId,\n };\n }),\n createInstanceKeyPathsFromTargetItems(props),\n toArray(),\n ),\n );\n}\n\nfunction createInstanceKeyPathsFromTargetItems({\n idsCache,\n imodelAccess,\n limit,\n}: Pick<ClassificationsTreeInstanceKeyPathsFromInstanceLabelProps, \"limit\" | \"imodelAccess\" | \"idsCache\">): OperatorFunction<\n InstanceKey,\n HierarchyFilteringPath\n> {\n const actualLimit = limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT;\n return (targetItems: Observable<InstanceKey>) => {\n return targetItems.pipe(\n actualLimit !== \"unbounded\"\n ? map((targetItem, index) => {\n if (index >= actualLimit) {\n throw new FilterLimitExceededError(actualLimit);\n }\n return targetItem;\n })\n : identity,\n releaseMainThreadOnItemsCount(2000),\n reduce(\n (acc, { id, className }) => {\n if (className === CLASS_NAME_ClassificationTable) {\n acc.classificationTableIds.push(id);\n return acc;\n }\n if (className === CLASS_NAME_Classification) {\n acc.classificationIds.push(id);\n return acc;\n }\n if (className === CLASS_NAME_GeometricElement2d) {\n acc.element2dIds.push(id);\n return acc;\n }\n\n acc.element3dIds.push(id);\n return acc;\n },\n {\n classificationTableIds: new Array<ClassificationTableId>(),\n classificationIds: new Array<ClassificationId>(),\n element2dIds: new Array<ElementId>(),\n element3dIds: new Array<ElementId>(),\n },\n ),\n mergeMap((ids) => {\n const elements2dLength = ids.element2dIds.length;\n const elements3dLength = ids.element3dIds.length;\n return merge(\n from(ids.classificationTableIds).pipe(\n map((id): HierarchyFilteringPath => ({ path: [{ id, className: CLASS_NAME_ClassificationTable }], options: { autoExpand: true } })),\n ),\n idsCache.getClassificationsPathObs(ids.classificationIds).pipe(map((path) => ({ path, options: { autoExpand: true } }))),\n from(ids.element2dIds).pipe(\n bufferCount(Math.ceil(elements2dLength / Math.ceil(elements2dLength / 5000))),\n releaseMainThreadOnItemsCount(1),\n mergeMap((block) => createGeometricElementInstanceKeyPaths({ idsCache, imodelAccess, targetItems: block, type: \"2d\" }), 10),\n ),\n from(ids.element3dIds).pipe(\n bufferCount(Math.ceil(elements3dLength / Math.ceil(elements3dLength / 5000))),\n releaseMainThreadOnItemsCount(1),\n mergeMap((block) => createGeometricElementInstanceKeyPaths({ idsCache, imodelAccess, targetItems: block, type: \"3d\" }), 10),\n ),\n );\n }),\n );\n };\n}\n\nfunction createGeometricElementInstanceKeyPaths(props: {\n idsCache: ClassificationsTreeIdsCache;\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n targetItems: Id64Array;\n type: \"2d\" | \"3d\";\n}): Observable<HierarchyFilteringPath> {\n const { targetItems, imodelAccess, type, idsCache } = props;\n if (targetItems.length === 0) {\n return EMPTY;\n }\n\n const separator = \";\";\n\n return defer(() => {\n const ctes = [\n `ElementsHierarchy(ECInstanceId, ParentId, Path) AS (\n SELECT\n e.ECInstanceId,\n e.Parent.Id,\n 'e${type}${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT)\n FROM ${CLASS_NAME_Element} e\n WHERE e.ECInstanceId IN (${targetItems.join(\",\")})\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n 'e${type}${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path\n FROM ElementsHierarchy ce\n JOIN ${CLASS_NAME_Element} pe ON pe.ECInstanceId = ce.ParentId\n )`,\n ];\n const ecsql = `\n SELECT\n e.Path path,\n c.ECInstanceId classificationId\n FROM\n ${CLASS_NAME_Classification} c\n JOIN ${CLASS_NAME_ElementHasClassifications} ehc ON ehc.TargetECInstanceId = c.ECInstanceId\n JOIN ElementsHierarchy e ON ehc.SourceECInstanceId = e.ECInstanceId\n WHERE e.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `tree-widget/classifications-tree/elements${type}-filter-paths-query` },\n );\n }).pipe(\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, separator)),\n mergeMap(({ path, parentClassificationId }) => {\n if (parentClassificationId) {\n return idsCache\n .getClassificationsPathObs([parentClassificationId])\n .pipe(map((parentClassificationPath) => ({ path: parentClassificationPath.concat(path), options: { autoExpand: true } })));\n }\n return of({ path, options: { autoExpand: true } });\n }),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, separator: string): { path: HierarchyNodeIdentifiersPath; parentClassificationId: Id64String | undefined } {\n const rowElements: string[] = row.path.split(separator);\n const path: HierarchyNodeIdentifiersPath = [];\n for (let i = 0; i < rowElements.length; i += 2) {\n switch (rowElements[i]) {\n case \"e2d\":\n path.push({ className: CLASS_NAME_GeometricElement2d, id: rowElements[i + 1] });\n break;\n case \"e3d\":\n path.push({ className: CLASS_NAME_GeometricElement3d, id: rowElements[i + 1] });\n break;\n }\n }\n\n return { path, parentClassificationId: row.classificationId };\n}\n"]}
@@ -8,16 +8,17 @@ export interface UseClassificationsTreeProps {
8
8
  activeView: Viewport;
9
9
  hierarchyConfig: ClassificationsTreeHierarchyConfiguration;
10
10
  emptyTreeContent?: ReactNode;
11
+ filter?: string;
11
12
  }
12
13
  /** @alpha */
13
14
  interface UseClassificationsTreeResult {
14
- categoriesTreeProps: Pick<VisibilityTreeProps, "treeName" | "getHierarchyDefinition" | "visibilityHandlerFactory" | "emptyTreeContent">;
15
+ classificationsTreeProps: Pick<VisibilityTreeProps, "treeName" | "getHierarchyDefinition" | "visibilityHandlerFactory" | "getFilteredPaths" | "emptyTreeContent" | "highlight">;
15
16
  rendererProps: Required<Pick<VisibilityTreeRendererProps, "getDecorations">>;
16
17
  }
17
18
  /**
18
19
  * Custom hook to create and manage state for the categories tree.
19
20
  * @alpha
20
21
  */
21
- export declare function useClassificationsTree({ activeView, emptyTreeContent, ...rest }: UseClassificationsTreeProps): UseClassificationsTreeResult;
22
+ export declare function useClassificationsTree({ activeView, emptyTreeContent, filter, ...rest }: UseClassificationsTreeProps): UseClassificationsTreeResult;
22
23
  export {};
23
24
  //# sourceMappingURL=UseClassificationsTree.d.ts.map
@@ -3,10 +3,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
- import { useCallback, useMemo } from "react";
6
+ import { useCallback, useEffect, useMemo } from "react";
7
7
  import { createECSqlQueryExecutor } from "@itwin/presentation-core-interop";
8
8
  import iconBisCategory3d from "@stratakit/icons/bis-category-3d.svg";
9
- import { EmptyTreeContent } from "../common/components/EmptyTree.js";
9
+ import { EmptyTreeContent, FilterUnknownError, NoFilterMatches, TooManyFilterMatches } from "../common/components/EmptyTree.js";
10
10
  import { useCachedVisibility } from "../common/internal/useTreeHooks/UseCachedVisibility.js";
11
11
  import { useIdsCache } from "../common/internal/useTreeHooks/UseIdsCache.js";
12
12
  import { ClassificationsTreeComponent } from "./ClassificationsTreeComponent.js";
@@ -14,11 +14,12 @@ import { ClassificationsTreeDefinition } from "./ClassificationsTreeDefinition.j
14
14
  import { ClassificationsTreeIcon } from "./ClassificationsTreeIcon.js";
15
15
  import { ClassificationsTreeIdsCache } from "./internal/ClassificationsTreeIdsCache.js";
16
16
  import { createClassificationsTreeVisibilityHandler } from "./internal/ClassificationsTreeVisibilityHandler.js";
17
+ import { useFilteredPaths } from "./internal/UseFilteredPaths.js";
17
18
  /**
18
19
  * Custom hook to create and manage state for the categories tree.
19
20
  * @alpha
20
21
  */
21
- export function useClassificationsTree({ activeView, emptyTreeContent, ...rest }) {
22
+ export function useClassificationsTree({ activeView, emptyTreeContent, filter, ...rest }) {
22
23
  const hierarchyConfig = useMemo(() => ({ ...rest.hierarchyConfig }),
23
24
  // eslint-disable-next-line react-hooks/exhaustive-deps
24
25
  [...Object.values(rest.hierarchyConfig)]);
@@ -27,21 +28,27 @@ export function useClassificationsTree({ activeView, emptyTreeContent, ...rest }
27
28
  createCache,
28
29
  cacheSpecificProps: useMemo(() => ({ hierarchyConfig }), [hierarchyConfig]),
29
30
  });
30
- const { visibilityHandlerFactory } = useCachedVisibility({
31
+ const { visibilityHandlerFactory, onFilteredPathsChanged } = useClassificationsCachedVisibility({
31
32
  activeView,
32
33
  getCache: getClassificationsTreeIdsCache,
33
- factoryProps: undefined,
34
- createFactory: createVisibilityHandlerFactory,
35
34
  });
36
35
  const getHierarchyDefinition = useCallback((props) => {
37
36
  return new ClassificationsTreeDefinition({ ...props, idsCache: getClassificationsTreeIdsCache(), hierarchyConfig });
38
37
  }, [getClassificationsTreeIdsCache, hierarchyConfig]);
38
+ const { getPaths, filteringError } = useFilteredPaths({
39
+ hierarchyConfiguration: hierarchyConfig,
40
+ filter,
41
+ getClassificationsTreeIdsCache,
42
+ onFilteredPathsChanged,
43
+ });
39
44
  return {
40
- categoriesTreeProps: {
45
+ classificationsTreeProps: {
41
46
  treeName: ClassificationsTreeComponent.id,
42
47
  getHierarchyDefinition,
43
48
  visibilityHandlerFactory,
44
- emptyTreeContent: emptyTreeContent ?? _jsx(EmptyTreeContent, { icon: iconBisCategory3d }),
49
+ getFilteredPaths: getPaths,
50
+ emptyTreeContent: useMemo(() => getEmptyTreeContentComponent(filter, filteringError, emptyTreeContent), [filter, filteringError, emptyTreeContent]),
51
+ highlight: useMemo(() => (filter ? { text: filter } : undefined), [filter]),
45
52
  },
46
53
  rendererProps: {
47
54
  getDecorations: useCallback((node) => _jsx(ClassificationsTreeIcon, { node: node }), []),
@@ -55,4 +62,35 @@ function createVisibilityHandlerFactory(props) {
55
62
  function createCache(props) {
56
63
  return new ClassificationsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig);
57
64
  }
65
+ function getEmptyTreeContentComponent(filter, error, emptyTreeContent) {
66
+ if (error) {
67
+ if (error === "tooManyFilterMatches") {
68
+ return _jsx(TooManyFilterMatches, { base: "classificationsTree" });
69
+ }
70
+ return _jsx(FilterUnknownError, { base: "classificationsTree" });
71
+ }
72
+ if (filter) {
73
+ return _jsx(NoFilterMatches, { base: "classificationsTree" });
74
+ }
75
+ if (emptyTreeContent) {
76
+ return emptyTreeContent;
77
+ }
78
+ return _jsx(EmptyTreeContent, { icon: iconBisCategory3d });
79
+ }
80
+ function useClassificationsCachedVisibility(props) {
81
+ const { activeView, getCache } = props;
82
+ const { visibilityHandlerFactory, filteredPaths, onFilteredPathsChanged } = useCachedVisibility({
83
+ activeView,
84
+ getCache,
85
+ factoryProps: undefined,
86
+ createFactory: createVisibilityHandlerFactory,
87
+ });
88
+ useEffect(() => {
89
+ getCache().clearFilteredElementsData();
90
+ }, [filteredPaths, getCache]);
91
+ return {
92
+ visibilityHandlerFactory,
93
+ onFilteredPathsChanged,
94
+ };
95
+ }
58
96
  //# sourceMappingURL=UseClassificationsTree.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UseClassificationsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,0CAA0C,EAAE,MAAM,oDAAoD,CAAC;AAuBhH;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAA+B;IAC3G,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACnC,uDAAuD;IACvD,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CACzC,CAAC;IAEF,MAAM,EAAE,QAAQ,EAAE,8BAA8B,EAAE,GAAG,WAAW,CAC9D;QACE,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,WAAW;QACX,kBAAkB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;KAC5E,CACF,CAAC;IAEF,MAAM,EAAE,wBAAwB,EAAE,GAAG,mBAAmB,CAAyC;QAC/F,UAAU;QACV,QAAQ,EAAE,8BAA8B;QACxC,YAAY,EAAE,SAAS;QACvB,aAAa,EAAE,8BAA8B;KAC9C,CAAC,CAAC;IAEH,MAAM,sBAAsB,GAAG,WAAW,CACxC,CAAC,KAAK,EAAE,EAAE;QACR,OAAO,IAAI,6BAA6B,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,8BAA8B,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IACtH,CAAC,EACD,CAAC,8BAA8B,EAAE,eAAe,CAAC,CAClD,CAAC;IAEF,OAAO;QACL,mBAAmB,EAAE;YACnB,QAAQ,EAAE,4BAA4B,CAAC,EAAE;YACzC,sBAAsB;YACtB,wBAAwB;YACxB,gBAAgB,EAAE,gBAAgB,IAAI,KAAC,gBAAgB,IAAC,IAAI,EAAE,iBAAiB,GAAI;SACpF;QACD,aAAa,EAAE;YACb,cAAc,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAC,uBAAuB,IAAC,IAAI,EAAE,IAAI,GAAI,EAAE,EAAE,CAAC;SACnF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAiE;IACvG,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAC7C,OAAO,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,0CAA0C,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;AAC9I,CAAC;AAED,SAAS,WAAW,CAAC,KAAwF;IAC3G,OAAO,IAAI,2BAA2B,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;AACtH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useMemo } from \"react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport iconBisCategory3d from \"@stratakit/icons/bis-category-3d.svg\";\nimport { EmptyTreeContent } from \"../common/components/EmptyTree.js\";\nimport { useCachedVisibility } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { ClassificationsTreeComponent } from \"./ClassificationsTreeComponent.js\";\nimport { ClassificationsTreeDefinition } from \"./ClassificationsTreeDefinition.js\";\nimport { ClassificationsTreeIcon } from \"./ClassificationsTreeIcon.js\";\nimport { ClassificationsTreeIdsCache } from \"./internal/ClassificationsTreeIdsCache.js\";\nimport { createClassificationsTreeVisibilityHandler } from \"./internal/ClassificationsTreeVisibilityHandler.js\";\n\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { CreateFactoryProps } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"./ClassificationsTreeDefinition.js\";\nimport type { ReactNode } from \"react\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\n\n/** @alpha */\nexport interface UseClassificationsTreeProps {\n activeView: Viewport;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n emptyTreeContent?: ReactNode;\n}\n\n/** @alpha */\ninterface UseClassificationsTreeResult {\n categoriesTreeProps: Pick<VisibilityTreeProps, \"treeName\" | \"getHierarchyDefinition\" | \"visibilityHandlerFactory\" | \"emptyTreeContent\">;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getDecorations\">>;\n}\n\n/**\n * Custom hook to create and manage state for the categories tree.\n * @alpha\n */\nexport function useClassificationsTree({ activeView, emptyTreeContent, ...rest }: UseClassificationsTreeProps): UseClassificationsTreeResult {\n const hierarchyConfig = useMemo(\n () => ({ ...rest.hierarchyConfig }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [...Object.values(rest.hierarchyConfig)],\n );\n\n const { getCache: getClassificationsTreeIdsCache } = useIdsCache<ClassificationsTreeIdsCache, { hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>(\n {\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig }), [hierarchyConfig]),\n },\n );\n\n const { visibilityHandlerFactory } = useCachedVisibility<ClassificationsTreeIdsCache, undefined>({\n activeView,\n getCache: getClassificationsTreeIdsCache,\n factoryProps: undefined,\n createFactory: createVisibilityHandlerFactory,\n });\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n (props) => {\n return new ClassificationsTreeDefinition({ ...props, idsCache: getClassificationsTreeIdsCache(), hierarchyConfig });\n },\n [getClassificationsTreeIdsCache, hierarchyConfig],\n );\n\n return {\n categoriesTreeProps: {\n treeName: ClassificationsTreeComponent.id,\n getHierarchyDefinition,\n visibilityHandlerFactory,\n emptyTreeContent: emptyTreeContent ?? <EmptyTreeContent icon={iconBisCategory3d} />,\n },\n rendererProps: {\n getDecorations: useCallback((node) => <ClassificationsTreeIcon node={node} />, []),\n },\n };\n}\n\nfunction createVisibilityHandlerFactory(props: CreateFactoryProps<ClassificationsTreeIdsCache, undefined>): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n const { activeView, idsCacheGetter } = props;\n return ({ imodelAccess }) => createClassificationsTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess });\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>) {\n return new ClassificationsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig);\n}\n"]}
1
+ {"version":3,"file":"UseClassificationsTree.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { createECSqlQueryExecutor } from \"@itwin/presentation-core-interop\";\nimport iconBisCategory3d from \"@stratakit/icons/bis-category-3d.svg\";\nimport { EmptyTreeContent, FilterUnknownError, NoFilterMatches, TooManyFilterMatches } from \"../common/components/EmptyTree.js\";\nimport { useCachedVisibility } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport { useIdsCache } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport { ClassificationsTreeComponent } from \"./ClassificationsTreeComponent.js\";\nimport { ClassificationsTreeDefinition } from \"./ClassificationsTreeDefinition.js\";\nimport { ClassificationsTreeIcon } from \"./ClassificationsTreeIcon.js\";\nimport { ClassificationsTreeIdsCache } from \"./internal/ClassificationsTreeIdsCache.js\";\nimport { createClassificationsTreeVisibilityHandler } from \"./internal/ClassificationsTreeVisibilityHandler.js\";\nimport { useFilteredPaths } from \"./internal/UseFilteredPaths.js\";\n\nimport type { ClassificationsTreeFilteringError } from \"./internal/UseFilteredPaths.js\";\nimport type { CreateCacheProps } from \"../common/internal/useTreeHooks/UseIdsCache.js\";\nimport type { CreateFactoryProps } from \"../common/internal/useTreeHooks/UseCachedVisibility.js\";\nimport type { ClassificationsTreeHierarchyConfiguration } from \"./ClassificationsTreeDefinition.js\";\nimport type { ReactNode } from \"react\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport type { VisibilityTreeProps } from \"../common/components/VisibilityTree.js\";\nimport type { VisibilityTreeRendererProps } from \"../common/components/VisibilityTreeRenderer.js\";\n\n/** @alpha */\nexport interface UseClassificationsTreeProps {\n activeView: Viewport;\n hierarchyConfig: ClassificationsTreeHierarchyConfiguration;\n emptyTreeContent?: ReactNode;\n filter?: string;\n}\n\n/** @alpha */\ninterface UseClassificationsTreeResult {\n classificationsTreeProps: Pick<\n VisibilityTreeProps,\n \"treeName\" | \"getHierarchyDefinition\" | \"visibilityHandlerFactory\" | \"getFilteredPaths\" | \"emptyTreeContent\" | \"highlight\"\n >;\n rendererProps: Required<Pick<VisibilityTreeRendererProps, \"getDecorations\">>;\n}\n\n/**\n * Custom hook to create and manage state for the categories tree.\n * @alpha\n */\nexport function useClassificationsTree({ activeView, emptyTreeContent, filter, ...rest }: UseClassificationsTreeProps): UseClassificationsTreeResult {\n const hierarchyConfig = useMemo(\n () => ({ ...rest.hierarchyConfig }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [...Object.values(rest.hierarchyConfig)],\n );\n const { getCache: getClassificationsTreeIdsCache } = useIdsCache<ClassificationsTreeIdsCache, { hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>(\n {\n imodel: activeView.iModel,\n createCache,\n cacheSpecificProps: useMemo(() => ({ hierarchyConfig }), [hierarchyConfig]),\n },\n );\n\n const { visibilityHandlerFactory, onFilteredPathsChanged } = useClassificationsCachedVisibility({\n activeView,\n getCache: getClassificationsTreeIdsCache,\n });\n\n const getHierarchyDefinition = useCallback<VisibilityTreeProps[\"getHierarchyDefinition\"]>(\n (props) => {\n return new ClassificationsTreeDefinition({ ...props, idsCache: getClassificationsTreeIdsCache(), hierarchyConfig });\n },\n [getClassificationsTreeIdsCache, hierarchyConfig],\n );\n\n const { getPaths, filteringError } = useFilteredPaths({\n hierarchyConfiguration: hierarchyConfig,\n filter,\n getClassificationsTreeIdsCache,\n onFilteredPathsChanged,\n });\n\n return {\n classificationsTreeProps: {\n treeName: ClassificationsTreeComponent.id,\n getHierarchyDefinition,\n visibilityHandlerFactory,\n getFilteredPaths: getPaths,\n emptyTreeContent: useMemo(() => getEmptyTreeContentComponent(filter, filteringError, emptyTreeContent), [filter, filteringError, emptyTreeContent]),\n highlight: useMemo(() => (filter ? { text: filter } : undefined), [filter]),\n },\n rendererProps: {\n getDecorations: useCallback((node) => <ClassificationsTreeIcon node={node} />, []),\n },\n };\n}\n\nfunction createVisibilityHandlerFactory(props: CreateFactoryProps<ClassificationsTreeIdsCache, undefined>): VisibilityTreeProps[\"visibilityHandlerFactory\"] {\n const { activeView, idsCacheGetter } = props;\n return ({ imodelAccess }) => createClassificationsTreeVisibilityHandler({ viewport: activeView, idsCache: idsCacheGetter(), imodelAccess });\n}\n\nfunction createCache(props: CreateCacheProps<{ hierarchyConfig: ClassificationsTreeHierarchyConfiguration }>) {\n return new ClassificationsTreeIdsCache(createECSqlQueryExecutor(props.imodel), props.specificProps.hierarchyConfig);\n}\n\nfunction getEmptyTreeContentComponent(filter?: string, error?: ClassificationsTreeFilteringError, emptyTreeContent?: React.ReactNode) {\n if (error) {\n if (error === \"tooManyFilterMatches\") {\n return <TooManyFilterMatches base={\"classificationsTree\"} />;\n }\n return <FilterUnknownError base={\"classificationsTree\"} />;\n }\n if (filter) {\n return <NoFilterMatches base={\"classificationsTree\"} />;\n }\n if (emptyTreeContent) {\n return emptyTreeContent;\n }\n return <EmptyTreeContent icon={iconBisCategory3d} />;\n}\n\nfunction useClassificationsCachedVisibility(props: { activeView: Viewport; getCache: () => ClassificationsTreeIdsCache }) {\n const { activeView, getCache } = props;\n const { visibilityHandlerFactory, filteredPaths, onFilteredPathsChanged } = useCachedVisibility<ClassificationsTreeIdsCache, undefined>({\n activeView,\n getCache,\n factoryProps: undefined,\n createFactory: createVisibilityHandlerFactory,\n });\n\n useEffect(() => {\n getCache().clearFilteredElementsData();\n }, [filteredPaths, getCache]);\n\n return {\n visibilityHandlerFactory,\n onFilteredPathsChanged,\n };\n}\n"]}