This repository was archived by the owner on May 5, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathTree.tsx
56 lines (52 loc) · 2.7 KB
/
Tree.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/* eslint-disable no-duplicate-imports */
import * as React from "react";
import { useCallback } from "react";
import { IModelApp, IModelConnection } from "@bentley/imodeljs-frontend";
import { useOptionalDisposable } from "@bentley/ui-core";
import { ControlledTree, SelectionMode, usePagedTreeNodeLoader, useTreeModelSource, useVisibleTreeNodes } from "@bentley/ui-components";
import { IPresentationTreeDataProvider, PresentationTreeDataProvider, useUnifiedSelectionTreeEventHandler } from "@bentley/presentation-components";
const RULESET_TREE = require("./Tree.ruleset.json"); // eslint-disable-line @typescript-eslint/no-var-requires
/** React properties for the tree component, that accepts an iModel connection with ruleset id */
export interface IModelConnectionProps {
/** iModel whose contents should be displayed in the tree */
imodel: IModelConnection;
}
/** React properties for the tree component, that accepts a data provider */
export interface DataProviderProps {
/** Custom tree data provider. */
dataProvider: IPresentationTreeDataProvider;
}
/** React properties for the tree component */
export type Props = IModelConnectionProps | DataProviderProps;
/** Tree component for the viewer app */
export default function SimpleTreeComponent(props: Props) { // eslint-disable-line @typescript-eslint/naming-convention
const imodel = (props as IModelConnectionProps).imodel;
const pagingSize = 20;
const imodelDataProvider = useOptionalDisposable(useCallback(() => {
if (imodel)
return new PresentationTreeDataProvider({ imodel, ruleset: RULESET_TREE, pagingSize });
return undefined;
}, [imodel]));
const dataProvider = imodelDataProvider ?? (props as DataProviderProps).dataProvider;
const modelSource = useTreeModelSource(dataProvider);
const nodeLoader = usePagedTreeNodeLoader(dataProvider, 20, modelSource);
const eventsHandler = useUnifiedSelectionTreeEventHandler({ nodeLoader, collapsedChildrenDisposalEnabled: true });
return (
<>
<h3 data-testid="tree-component-header">{IModelApp.i18n.translate("SimpleViewer:components.tree")}</h3>
<div style={{ flex: "1" }}>
<ControlledTree
nodeLoader={nodeLoader}
visibleNodes={useVisibleTreeNodes(modelSource)}
treeEvents={eventsHandler}
selectionMode={SelectionMode.Extended}
iconsEnabled={true}
/>
</div>
</>
);
}