@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.
- package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.js.map +1 -1
- package/lib/esm/tree-widget-react/components/tree-header/WidgetHeader.css +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js +13 -8
- package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js +4 -3
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.d.ts +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js +2 -2
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.d.ts +10 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js +268 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts +3 -2
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js +46 -8
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +16 -3
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +74 -8
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.d.ts +2 -2
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeNode.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeVisibilityHandler.d.ts +2 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeVisibilityHandler.js +69 -6
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/FilteredTree.d.ts +37 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/FilteredTree.js +193 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/FilteredTree.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.d.ts +18 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js +51 -0
- package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/UseFilteredPaths.js.map +1 -0
- package/lib/esm/tree-widget-react/components/trees/common/components/EmptyTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/common/internal/UseIModelAccess.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
- package/lib/esm/tree-widget-react/components/trees/models-tree/internal/UseFilteredPaths.js.map +1 -1
- package/lib/public/locales/en/TreeWidget.json +8 -1
- 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"]}
|
package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTree.js
CHANGED
|
@@ -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 } =
|
|
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
|
-
|
|
45
|
+
classificationsTreeProps: {
|
|
41
46
|
treeName: ClassificationsTreeComponent.id,
|
|
42
47
|
getHierarchyDefinition,
|
|
43
48
|
visibilityHandlerFactory,
|
|
44
|
-
|
|
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;
|
|
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,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAChI,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;AAChH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AA4BlE;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,EAA+B;IACnH,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;IACF,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,sBAAsB,EAAE,GAAG,kCAAkC,CAAC;QAC9F,UAAU;QACV,QAAQ,EAAE,8BAA8B;KACzC,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,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC;QACpD,sBAAsB,EAAE,eAAe;QACvC,MAAM;QACN,8BAA8B;QAC9B,sBAAsB;KACvB,CAAC,CAAC;IAEH,OAAO;QACL,wBAAwB,EAAE;YACxB,QAAQ,EAAE,4BAA4B,CAAC,EAAE;YACzC,sBAAsB;YACtB,wBAAwB;YACxB,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;YACnJ,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;SAC5E;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,KAAuF;IAC1G,OAAO,IAAI,2BAA2B,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;AACtH,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAe,EAAE,KAAyC,EAAE,gBAAkC;IAClI,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,KAAK,KAAK,sBAAsB,EAAE,CAAC;YACrC,OAAO,KAAC,oBAAoB,IAAC,IAAI,EAAE,qBAAqB,GAAI,CAAC;QAC/D,CAAC;QACD,OAAO,KAAC,kBAAkB,IAAC,IAAI,EAAE,qBAAqB,GAAI,CAAC;IAC7D,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,KAAC,eAAe,IAAC,IAAI,EAAE,qBAAqB,GAAI,CAAC;IAC1D,CAAC;IACD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,KAAC,gBAAgB,IAAC,IAAI,EAAE,iBAAiB,GAAI,CAAC;AACvD,CAAC;AAED,SAAS,kCAAkC,CAAC,KAA4E;IACtH,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACvC,MAAM,EAAE,wBAAwB,EAAE,aAAa,EAAE,sBAAsB,EAAE,GAAG,mBAAmB,CAAyC;QACtI,UAAU;QACV,QAAQ;QACR,YAAY,EAAE,SAAS;QACvB,aAAa,EAAE,8BAA8B;KAC9C,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,EAAE,CAAC,yBAAyB,EAAE,CAAC;IACzC,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE9B,OAAO;QACL,wBAAwB;QACxB,sBAAsB;KACvB,CAAC;AACJ,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, 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"]}
|