@itwin/tree-widget-react 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/TreeWidget.js +1 -1
- package/lib/cjs/TreeWidget.js.map +1 -1
- package/lib/cjs/components/IconButton.js +3 -3
- package/lib/cjs/components/IconButton.js.map +1 -1
- package/lib/cjs/components/TreeFilteringState.js +4 -4
- package/lib/cjs/components/TreeFilteringState.js.map +1 -1
- package/lib/cjs/components/TreeWidgetComponent.d.ts +1 -1
- package/lib/cjs/components/TreeWidgetComponent.js +5 -5
- package/lib/cjs/components/TreeWidgetComponent.js.map +1 -1
- package/lib/cjs/components/TreeWidgetComponent.scss +1 -1
- package/lib/cjs/components/TreeWidgetUiItemsProvider.d.ts +4 -5
- package/lib/cjs/components/TreeWidgetUiItemsProvider.js +19 -14
- package/lib/cjs/components/TreeWidgetUiItemsProvider.js.map +1 -1
- package/lib/cjs/components/search-bar/SearchBar.d.ts +0 -3
- package/lib/cjs/components/search-bar/SearchBar.js +17 -28
- package/lib/cjs/components/search-bar/SearchBar.js.map +1 -1
- package/lib/cjs/components/search-bar/SearchBar.scss +18 -34
- package/lib/cjs/components/search-bar/SearchBox.js +1 -1
- package/lib/cjs/components/search-bar/SearchBox.js.map +1 -1
- package/lib/cjs/components/trees/CategoriesVisibilityUtils.d.ts +19 -0
- package/lib/cjs/components/trees/CategoriesVisibilityUtils.js +118 -0
- package/lib/cjs/components/trees/CategoriesVisibilityUtils.js.map +1 -0
- package/lib/cjs/components/trees/IModelContentTree.js +4 -4
- package/lib/cjs/components/trees/IModelContentTree.js.map +1 -1
- package/lib/cjs/components/trees/VisibilityTreeEventHandler.d.ts +4 -5
- package/lib/cjs/components/trees/VisibilityTreeEventHandler.js +17 -9
- package/lib/cjs/components/trees/VisibilityTreeEventHandler.js.map +1 -1
- package/lib/cjs/components/trees/VisibilityTreeRenderer.d.ts +4 -4
- package/lib/cjs/components/trees/VisibilityTreeRenderer.js +2 -2
- package/lib/cjs/components/trees/VisibilityTreeRenderer.js.map +1 -1
- package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +9 -15
- package/lib/cjs/components/trees/category-tree/CategoriesTree.js +8 -36
- package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
- package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.d.ts +7 -2
- package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js +65 -27
- package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
- package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.d.ts +11 -15
- package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js +15 -92
- package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/Hierarchy.GroupedByClass.json +1 -2
- package/lib/cjs/components/trees/models-tree/Hierarchy.json +1 -2
- package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +5 -13
- package/lib/cjs/components/trees/models-tree/ModelsTree.js +11 -29
- package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +19 -2
- package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +112 -64
- package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.d.ts +6 -8
- package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
- package/lib/cjs/components/trees/spatial-tree/SpatialTreeComponent.js +9 -7
- package/lib/cjs/components/trees/spatial-tree/SpatialTreeComponent.js.map +1 -1
- package/lib/cjs/components/utils/AutoSizer.js +4 -4
- package/lib/cjs/components/utils/AutoSizer.js.map +1 -1
- package/lib/cjs/tree-widget-react.d.ts +0 -1
- package/lib/cjs/tree-widget-react.js +0 -1
- package/lib/cjs/tree-widget-react.js.map +1 -1
- package/lib/cjs/types.d.ts +19 -5
- package/lib/cjs/types.js +4 -0
- package/lib/cjs/types.js.map +1 -1
- package/lib/esm/components/TreeWidgetComponent.d.ts +1 -1
- package/lib/esm/components/TreeWidgetComponent.js +1 -1
- package/lib/esm/components/TreeWidgetComponent.js.map +1 -1
- package/lib/esm/components/TreeWidgetComponent.scss +1 -1
- package/lib/esm/components/TreeWidgetUiItemsProvider.d.ts +4 -5
- package/lib/esm/components/TreeWidgetUiItemsProvider.js +13 -8
- package/lib/esm/components/TreeWidgetUiItemsProvider.js.map +1 -1
- package/lib/esm/components/search-bar/SearchBar.d.ts +0 -3
- package/lib/esm/components/search-bar/SearchBar.js +14 -25
- package/lib/esm/components/search-bar/SearchBar.js.map +1 -1
- package/lib/esm/components/search-bar/SearchBar.scss +18 -34
- package/lib/esm/components/trees/CategoriesVisibilityUtils.d.ts +19 -0
- package/lib/esm/components/trees/CategoriesVisibilityUtils.js +110 -0
- package/lib/esm/components/trees/CategoriesVisibilityUtils.js.map +1 -0
- package/lib/esm/components/trees/VisibilityTreeEventHandler.d.ts +4 -5
- package/lib/esm/components/trees/VisibilityTreeEventHandler.js +13 -5
- package/lib/esm/components/trees/VisibilityTreeEventHandler.js.map +1 -1
- package/lib/esm/components/trees/VisibilityTreeRenderer.d.ts +4 -4
- package/lib/esm/components/trees/VisibilityTreeRenderer.js +1 -1
- package/lib/esm/components/trees/VisibilityTreeRenderer.js.map +1 -1
- package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +9 -15
- package/lib/esm/components/trees/category-tree/CategoriesTree.js +2 -28
- package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
- package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.d.ts +7 -2
- package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js +64 -26
- package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
- package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.d.ts +11 -15
- package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js +12 -88
- package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
- package/lib/esm/components/trees/models-tree/Hierarchy.GroupedByClass.json +1 -2
- package/lib/esm/components/trees/models-tree/Hierarchy.json +1 -2
- package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +5 -13
- package/lib/esm/components/trees/models-tree/ModelsTree.js +4 -22
- package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
- package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +19 -2
- package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +107 -59
- package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
- package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.d.ts +6 -8
- package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
- package/lib/esm/components/trees/spatial-tree/SpatialTreeComponent.js +4 -2
- package/lib/esm/components/trees/spatial-tree/SpatialTreeComponent.js.map +1 -1
- package/lib/esm/tree-widget-react.d.ts +0 -1
- package/lib/esm/tree-widget-react.js +0 -1
- package/lib/esm/tree-widget-react.js.map +1 -1
- package/lib/esm/types.d.ts +19 -5
- package/lib/esm/types.js +4 -0
- package/lib/esm/types.js.map +1 -1
- package/package.json +32 -40
- package/lib/cjs/components/header/TreeHeader.d.ts +0 -15
- package/lib/cjs/components/header/TreeHeader.js +0 -43
- package/lib/cjs/components/header/TreeHeader.js.map +0 -1
- package/lib/cjs/components/header/TreeHeader.scss +0 -20
- package/lib/cjs/components/search-bar/Popup.d.ts +0 -50
- package/lib/cjs/components/search-bar/Popup.js +0 -246
- package/lib/cjs/components/search-bar/Popup.js.map +0 -1
- package/lib/cjs/components/search-bar/Popup.scss +0 -316
- package/lib/esm/components/header/TreeHeader.d.ts +0 -15
- package/lib/esm/components/header/TreeHeader.js +0 -20
- package/lib/esm/components/header/TreeHeader.js.map +0 -1
- package/lib/esm/components/header/TreeHeader.scss +0 -20
- package/lib/esm/components/search-bar/Popup.d.ts +0 -50
- package/lib/esm/components/search-bar/Popup.js +0 -220
- package/lib/esm/components/search-bar/Popup.js.map +0 -1
- package/lib/esm/components/search-bar/Popup.scss +0 -316
|
@@ -266,7 +266,7 @@
|
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
268
|
],
|
|
269
|
-
"instanceFilter": "this.Model.Id = parent.parent.ECInstanceId ANDALSO this.Parent = NULL
|
|
269
|
+
"instanceFilter": "this.Model.Id = parent.parent.ECInstanceId ANDALSO this.Parent = NULL",
|
|
270
270
|
"groupByClass": false,
|
|
271
271
|
"groupByLabel": false
|
|
272
272
|
}
|
|
@@ -300,7 +300,6 @@
|
|
|
300
300
|
}
|
|
301
301
|
}
|
|
302
302
|
],
|
|
303
|
-
"instanceFilter": "NOT HasVariable(\"filtered-element-ids\") OR GetVariableIntValues(\"filtered-element-ids\").AnyMatch(id => id = this.ECInstanceId)",
|
|
304
303
|
"groupByClass": false,
|
|
305
304
|
"groupByLabel": false
|
|
306
305
|
}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import "./ModelsTree.scss";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { SelectionMode } from "@itwin/components-react";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import type { IModelConnection, Viewport } from "@itwin/core-frontend";
|
|
10
|
-
import type { Ruleset } from "@itwin/presentation-common";
|
|
11
|
-
import type { IPresentationTreeDataProvider } from "@itwin/presentation-components";
|
|
4
|
+
import { IModelConnection, Viewport } from "@itwin/core-frontend";
|
|
5
|
+
import { Ruleset } from "@itwin/presentation-common";
|
|
6
|
+
import { IPresentationTreeDataProvider } from "@itwin/presentation-components";
|
|
7
|
+
import { ClassGroupingOption, VisibilityTreeFilterInfo } from "../Common";
|
|
8
|
+
import { ModelsTreeSelectionPredicate, ModelsVisibilityHandler } from "./ModelsVisibilityHandler";
|
|
12
9
|
/** @internal */
|
|
13
10
|
export declare const RULESET_MODELS: Ruleset;
|
|
14
11
|
/** @internal */
|
|
@@ -47,11 +44,6 @@ export interface ModelsTreeProps {
|
|
|
47
44
|
* @alpha
|
|
48
45
|
*/
|
|
49
46
|
filterInfo?: VisibilityTreeFilterInfo;
|
|
50
|
-
/**
|
|
51
|
-
* Filter the hierarchy by given element IDs.
|
|
52
|
-
* @alpha
|
|
53
|
-
*/
|
|
54
|
-
filteredElementIds?: Id64Array;
|
|
55
47
|
/**
|
|
56
48
|
* Callback invoked when tree is filtered.
|
|
57
49
|
*/
|
|
@@ -7,7 +7,6 @@ import * as React from "react";
|
|
|
7
7
|
import { ControlledTree, SelectionMode, useTreeModel } from "@itwin/components-react";
|
|
8
8
|
import { useDisposable, useOptionalDisposable } from "@itwin/core-react";
|
|
9
9
|
import { usePresentationTreeNodeLoader } from "@itwin/presentation-components";
|
|
10
|
-
import { Presentation } from "@itwin/presentation-frontend";
|
|
11
10
|
import { TreeWidget } from "../../../TreeWidget";
|
|
12
11
|
import { ClassGroupingOption } from "../Common";
|
|
13
12
|
import { VisibilityTreeEventHandler } from "../VisibilityTreeEventHandler";
|
|
@@ -53,18 +52,10 @@ export function ModelsTree(props) {
|
|
|
53
52
|
}
|
|
54
53
|
function useModelsTreeNodeLoader(props) {
|
|
55
54
|
var _a, _b;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
general: (!props.enableElementsClassGrouping) ? { ...RULESET_MODELS } : /* istanbul ignore next */ { ...RULESET_MODELS_GROUPED_BY_CLASS },
|
|
61
|
-
search: { ...RULESET_MODELS_SEARCH },
|
|
62
|
-
};
|
|
63
|
-
}, [props.filteredElementIds]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
64
|
-
// const rulesets = {
|
|
65
|
-
// general: (!props.enableElementsClassGrouping) ? RULESET_MODELS : /* istanbul ignore next */ RULESET_MODELS_GROUPED_BY_CLASS,
|
|
66
|
-
// search: RULESET_MODELS_SEARCH,
|
|
67
|
-
// };
|
|
55
|
+
const rulesets = {
|
|
56
|
+
general: (!props.enableElementsClassGrouping) ? RULESET_MODELS : /* istanbul ignore next */ RULESET_MODELS_GROUPED_BY_CLASS,
|
|
57
|
+
search: RULESET_MODELS_SEARCH,
|
|
58
|
+
};
|
|
68
59
|
const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({
|
|
69
60
|
imodel: props.iModel,
|
|
70
61
|
ruleset: rulesets.general,
|
|
@@ -80,15 +71,6 @@ function useModelsTreeNodeLoader(props) {
|
|
|
80
71
|
});
|
|
81
72
|
const activeNodeLoader = ((_a = props.filterInfo) === null || _a === void 0 ? void 0 : _a.filter) ? searchNodeLoader : nodeLoader;
|
|
82
73
|
const activeItemsRenderedCallback = ((_b = props.filterInfo) === null || _b === void 0 ? void 0 : _b.filter) ? onSearchItemsRendered : onItemsRendered;
|
|
83
|
-
const vars = Presentation.presentation.vars(activeNodeLoader.dataProvider.rulesetId);
|
|
84
|
-
if (props.filteredElementIds) {
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
86
|
-
vars.setId64s("filtered-element-ids", props.filteredElementIds);
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
90
|
-
vars.unset("filtered-element-ids");
|
|
91
|
-
}
|
|
92
74
|
return {
|
|
93
75
|
nodeLoader: activeNodeLoader,
|
|
94
76
|
onItemsRendered: activeItemsRenderedCallback,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelsTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTree.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 \"./ModelsTree.scss\";\nimport * as React from \"react\";\nimport { ControlledTree, SelectionMode, useTreeModel } from \"@itwin/components-react\";\nimport { useDisposable, useOptionalDisposable } from \"@itwin/core-react\";\nimport { usePresentationTreeNodeLoader } from \"@itwin/presentation-components\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { ClassGroupingOption } from \"../Common\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { useVisibilityTreeFiltering, useVisibilityTreeRenderer, VisibilityTreeNoFilteredData } from \"../VisibilityTreeRenderer\";\nimport { ModelsVisibilityHandler, SubjectModelIdsCache } from \"./ModelsVisibilityHandler\";\nimport type { VisibilityTreeFilterInfo } from \"../Common\";\nimport type { ModelsTreeSelectionPredicate } from \"./ModelsVisibilityHandler\";\nimport type { TreeNodeItem } from \"@itwin/components-react\";\nimport type { Id64Array } from \"@itwin/core-bentley\";\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport type { NodeKey, Ruleset } from \"@itwin/presentation-common\";\nimport type { IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\n\nconst PAGING_SIZE = 20;\n\n/** @internal */\nexport const RULESET_MODELS: Ruleset = require(\"./Hierarchy.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n/** @internal */\nexport const RULESET_MODELS_GROUPED_BY_CLASS: Ruleset = require(\"./Hierarchy.GroupedByClass.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\nconst RULESET_MODELS_SEARCH: Ruleset = require(\"./ModelsTreeSearch.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\n/** Props for [[ModelsTree]] component\n * @public\n */\nexport interface ModelsTreeProps {\n /**\n * An IModel to pull data from\n */\n iModel: IModelConnection;\n /** Width of the component */\n width: number;\n /** Height of the component */\n height: number;\n /**\n * Selection mode in the tree\n */\n selectionMode?: SelectionMode;\n /**\n * Predicate which indicates whether node can be selected or no\n * @alpha\n */\n selectionPredicate?: ModelsTreeSelectionPredicate;\n /**\n * Active view used to determine and control visibility\n */\n activeView?: Viewport;\n /**\n * Ref to the root HTML element used by this component\n */\n rootElementRef?: React.Ref<HTMLDivElement>;\n /**\n * Information for tree filtering.\n * @alpha\n */\n filterInfo?: VisibilityTreeFilterInfo;\n /**\n * Filter the hierarchy by given element IDs.\n * @alpha\n */\n filteredElementIds?: Id64Array;\n /**\n * Callback invoked when tree is filtered.\n */\n onFilterApplied?: (filteredDataProvider: IPresentationTreeDataProvider, matchesCount: number) => void;\n /**\n * Should the tree group displayed element nodes by class.\n * @beta\n */\n enableElementsClassGrouping?: ClassGroupingOption;\n /**\n * Auto-update the hierarchy when data in the iModel changes.\n * @alpha\n */\n enableHierarchyAutoUpdate?: boolean;\n /**\n * Custom visibility handler.\n * @alpha\n */\n modelsVisibilityHandler?: ModelsVisibilityHandler;\n}\n\n/**\n * A tree component that shows a subject - model - category - element\n * hierarchy along with checkboxes that represent and allow changing\n * the display of those instances.\n * @public\n */\nexport function ModelsTree(props: ModelsTreeProps) {\n const { nodeLoader, onItemsRendered } = useModelsTreeNodeLoader(props);\n const { filteredNodeLoader, isFiltering, nodeHighlightingProps } = useVisibilityTreeFiltering(nodeLoader, props.filterInfo, props.onFilterApplied);\n const filterApplied = filteredNodeLoader !== nodeLoader;\n\n const { activeView, modelsVisibilityHandler, selectionPredicate } = props;\n const nodeSelectionPredicate = React.useCallback((key: NodeKey, node: TreeNodeItem) => {\n return !selectionPredicate ? true : selectionPredicate(key, ModelsVisibilityHandler.getNodeType(node, nodeLoader.dataProvider));\n }, [selectionPredicate, nodeLoader.dataProvider]);\n\n const visibilityHandler = useVisibilityHandler(\n nodeLoader.dataProvider.rulesetId,\n props.iModel,\n activeView,\n modelsVisibilityHandler,\n getFilteredDataProvider(filteredNodeLoader.dataProvider),\n props.enableHierarchyAutoUpdate);\n const eventHandler = useDisposable(React.useCallback(() => new VisibilityTreeEventHandler({\n nodeLoader: filteredNodeLoader,\n visibilityHandler,\n collapsedChildrenDisposalEnabled: true,\n selectionPredicate: nodeSelectionPredicate,\n }), [filteredNodeLoader, visibilityHandler, nodeSelectionPredicate]));\n\n const treeModel = useTreeModel(filteredNodeLoader.modelSource);\n const treeRenderer = useVisibilityTreeRenderer(true, false);\n\n const overlay = isFiltering ? <div className=\"filteredTreeOverlay\" /> : undefined;\n\n // istanbul ignore next\n const noFilteredDataRenderer = React.useCallback(() => {\n return <VisibilityTreeNoFilteredData\n title={TreeWidget.translate(\"modelTree.noModelFound\")}\n message={TreeWidget.translate(\"modelTree.noMatchingModelNames\")}\n />;\n }, []);\n\n return (\n <div className=\"tree-widget-models-tree\" ref={props.rootElementRef}>\n <ControlledTree\n nodeLoader={filteredNodeLoader}\n model={treeModel}\n selectionMode={props.selectionMode || SelectionMode.None}\n eventsHandler={eventHandler}\n treeRenderer={treeRenderer}\n nodeHighlightingProps={nodeHighlightingProps}\n noDataRenderer={filterApplied ? noFilteredDataRenderer : undefined}\n onItemsRendered={onItemsRendered}\n width={props.width}\n height={props.height}\n />\n {overlay}\n </div>\n );\n}\n\nfunction useModelsTreeNodeLoader(props: ModelsTreeProps) {\n // note: this is a temporary workaround for auto-update not working on ruleset variable changes - instead\n // of auto-updating we just re-create the node loader by re-creating the ruleset\n const rulesets = React.useMemo(() => {\n return {\n general: (!props.enableElementsClassGrouping) ? { ...RULESET_MODELS } : /* istanbul ignore next */ { ...RULESET_MODELS_GROUPED_BY_CLASS },\n search: { ...RULESET_MODELS_SEARCH },\n };\n }, [props.filteredElementIds]); // eslint-disable-line react-hooks/exhaustive-deps\n // const rulesets = {\n // general: (!props.enableElementsClassGrouping) ? RULESET_MODELS : /* istanbul ignore next */ RULESET_MODELS_GROUPED_BY_CLASS,\n // search: RULESET_MODELS_SEARCH,\n // };\n\n const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.general,\n appendChildrenCountForGroupingNodes: (props.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts),\n pagingSize: PAGING_SIZE,\n enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,\n });\n const { nodeLoader: searchNodeLoader, onItemsRendered: onSearchItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.search,\n pagingSize: PAGING_SIZE,\n enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,\n });\n\n const activeNodeLoader = props.filterInfo?.filter ? searchNodeLoader : nodeLoader;\n const activeItemsRenderedCallback = props.filterInfo?.filter ? onSearchItemsRendered : onItemsRendered;\n\n const vars = Presentation.presentation.vars(activeNodeLoader.dataProvider.rulesetId);\n if (props.filteredElementIds) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n vars.setId64s(\"filtered-element-ids\", props.filteredElementIds);\n } else {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n vars.unset(\"filtered-element-ids\");\n }\n\n return {\n nodeLoader: activeNodeLoader,\n onItemsRendered: activeItemsRenderedCallback,\n };\n}\n\nfunction useVisibilityHandler(\n rulesetId: string,\n iModel: IModelConnection,\n activeView?: Viewport,\n visibilityHandler?: ModelsVisibilityHandler,\n filteredDataProvider?: IFilteredPresentationTreeDataProvider,\n hierarchyAutoUpdateEnabled?: boolean,\n) {\n const subjectModelIdsCache = React.useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);\n const defaultVisibilityHandler = useOptionalDisposable(React.useCallback(() => {\n if (activeView)\n return createVisibilityHandler(rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled);\n return undefined;\n }, [rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled]));\n\n const handler = visibilityHandler ?? defaultVisibilityHandler;\n\n React.useEffect(() => {\n handler && handler.setFilteredDataProvider(filteredDataProvider);\n }, [handler, filteredDataProvider]);\n\n return handler;\n}\n\nconst createVisibilityHandler = (rulesetId: string, activeView: Viewport, subjectModelIdsCache: SubjectModelIdsCache, hierarchyAutoUpdateEnabled?: boolean): ModelsVisibilityHandler | undefined => {\n // istanbul ignore next\n return new ModelsVisibilityHandler({ rulesetId, viewport: activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache });\n};\n\nconst isFilteredDataProvider = (dataProvider: IPresentationTreeDataProvider | IFilteredPresentationTreeDataProvider): dataProvider is IFilteredPresentationTreeDataProvider => {\n const filteredProvider = dataProvider as IFilteredPresentationTreeDataProvider;\n return filteredProvider.nodeMatchesFilter !== undefined && filteredProvider.getActiveMatch !== undefined && filteredProvider.countFilteringResults !== undefined;\n};\n\nconst getFilteredDataProvider = (dataProvider: IPresentationTreeDataProvider | IFilteredPresentationTreeDataProvider): IFilteredPresentationTreeDataProvider | undefined => {\n return isFilteredDataProvider(dataProvider) ? dataProvider : undefined;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ModelsTree.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTree.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,mBAAmB,CAAC;AAC3B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAgB,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEpG,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAwE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACrJ,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAChI,OAAO,EAAgC,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAExH,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,gBAAgB;AAChB,MAAM,CAAC,MAAM,cAAc,GAAY,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,yDAAyD;AAC7H,gBAAgB;AAChB,MAAM,CAAC,MAAM,+BAA+B,GAAY,OAAO,CAAC,iCAAiC,CAAC,CAAC,CAAC,yDAAyD;AAE7J,MAAM,qBAAqB,GAAY,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,yDAAyD;AAyDpI;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACnJ,MAAM,aAAa,GAAG,kBAAkB,KAAK,UAAU,CAAC;IAExD,MAAM,EAAE,UAAU,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;IAC1E,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,GAAY,EAAE,IAAkB,EAAE,EAAE;QACpF,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,uBAAuB,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAClI,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAElD,MAAM,iBAAiB,GAAG,oBAAoB,CAC5C,UAAU,CAAC,YAAY,CAAC,SAAS,EACjC,KAAK,CAAC,MAAM,EACZ,UAAU,EACV,uBAAuB,EACvB,uBAAuB,CAAC,kBAAkB,CAAC,YAAY,CAAC,EACxD,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,0BAA0B,CAAC;QACxF,UAAU,EAAE,kBAAkB;QAC9B,iBAAiB;QACjB,gCAAgC,EAAE,IAAI;QACtC,kBAAkB,EAAE,sBAAsB;KAC3C,CAAC,EAAE,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAEtE,MAAM,SAAS,GAAG,YAAY,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,6BAAK,SAAS,EAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAElF,uBAAuB;IACvB,MAAM,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACpD,OAAO,oBAAC,4BAA4B,IAClC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,wBAAwB,CAAC,EACrD,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,gCAAgC,CAAC,GAC/D,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,6BAAK,SAAS,EAAC,yBAAyB,EAAC,GAAG,EAAE,KAAK,CAAC,cAAc;QAChE,oBAAC,cAAc,IACb,UAAU,EAAE,kBAAkB,EAC9B,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EACxD,aAAa,EAAE,YAAY,EAC3B,YAAY,EAAE,YAAY,EAC1B,qBAAqB,EAAE,qBAAqB,EAC5C,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS,EAClE,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,MAAM,EAAE,KAAK,CAAC,MAAM,GACpB;QACD,OAAO,CACJ,CACP,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAsB;;IACrD,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,0BAA0B,CAAC,+BAA+B;QAC3H,MAAM,EAAE,qBAAqB;KAC9B,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,6BAA6B,CAAC;QACpE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,mCAAmC,EAAE,CAAC,KAAK,CAAC,2BAA2B,KAAK,mBAAmB,CAAC,aAAa,CAAC;QAC9G,UAAU,EAAE,WAAW;QACvB,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;KAC3D,CAAC,CAAC;IACH,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,EAAE,GAAG,6BAA6B,CAAC;QAC7G,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,QAAQ,CAAC,MAAM;QACxB,UAAU,EAAE,WAAW;QACvB,yBAAyB,EAAE,KAAK,CAAC,yBAAyB;KAC3D,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,CAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,MAAM,EAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;IAClF,MAAM,2BAA2B,GAAG,CAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,MAAM,EAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,eAAe,CAAC;IAEvG,OAAO;QACL,UAAU,EAAE,gBAAgB;QAC5B,eAAe,EAAE,2BAA2B;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAAiB,EACjB,MAAwB,EACxB,UAAqB,EACrB,iBAA2C,EAC3C,oBAA4D,EAC5D,0BAAoC;IAEpC,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC5E,IAAI,UAAU;YACZ,OAAO,uBAAuB,CAAC,SAAS,EAAE,UAAU,EAAE,oBAAoB,EAAE,0BAA0B,CAAC,CAAC;QAC1G,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,oBAAoB,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC;IAE/E,MAAM,OAAO,GAAG,iBAAiB,aAAjB,iBAAiB,cAAjB,iBAAiB,GAAI,wBAAwB,CAAC;IAE9D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,IAAI,OAAO,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEpC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,SAAiB,EAAE,UAAoB,EAAE,oBAA0C,EAAE,0BAAoC,EAAuC,EAAE;IACjM,uBAAuB;IACvB,OAAO,IAAI,uBAAuB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC5H,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,YAAmF,EAAyD,EAAE;IAC5K,MAAM,gBAAgB,GAAG,YAAqD,CAAC;IAC/E,OAAO,gBAAgB,CAAC,iBAAiB,KAAK,SAAS,IAAI,gBAAgB,CAAC,cAAc,KAAK,SAAS,IAAI,gBAAgB,CAAC,qBAAqB,KAAK,SAAS,CAAC;AACnK,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,YAAmF,EAAqD,EAAE;IACzK,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC,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 \"./ModelsTree.scss\";\nimport * as React from \"react\";\nimport { ControlledTree, SelectionMode, TreeNodeItem, useTreeModel } from \"@itwin/components-react\";\nimport { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport { useDisposable, useOptionalDisposable } from \"@itwin/core-react\";\nimport { NodeKey, Ruleset } from \"@itwin/presentation-common\";\nimport { IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider, usePresentationTreeNodeLoader } from \"@itwin/presentation-components\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { ClassGroupingOption, VisibilityTreeFilterInfo } from \"../Common\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { useVisibilityTreeFiltering, useVisibilityTreeRenderer, VisibilityTreeNoFilteredData } from \"../VisibilityTreeRenderer\";\nimport { ModelsTreeSelectionPredicate, ModelsVisibilityHandler, SubjectModelIdsCache } from \"./ModelsVisibilityHandler\";\n\nconst PAGING_SIZE = 20;\n\n/** @internal */\nexport const RULESET_MODELS: Ruleset = require(\"./Hierarchy.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n/** @internal */\nexport const RULESET_MODELS_GROUPED_BY_CLASS: Ruleset = require(\"./Hierarchy.GroupedByClass.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\nconst RULESET_MODELS_SEARCH: Ruleset = require(\"./ModelsTreeSearch.json\"); // eslint-disable-line @typescript-eslint/no-var-requires\n\n/** Props for [[ModelsTree]] component\n * @public\n */\nexport interface ModelsTreeProps {\n /**\n * An IModel to pull data from\n */\n iModel: IModelConnection;\n /** Width of the component */\n width: number;\n /** Height of the component */\n height: number;\n /**\n * Selection mode in the tree\n */\n selectionMode?: SelectionMode;\n /**\n * Predicate which indicates whether node can be selected or no\n * @alpha\n */\n selectionPredicate?: ModelsTreeSelectionPredicate;\n /**\n * Active view used to determine and control visibility\n */\n activeView?: Viewport;\n /**\n * Ref to the root HTML element used by this component\n */\n rootElementRef?: React.Ref<HTMLDivElement>;\n /**\n * Information for tree filtering.\n * @alpha\n */\n filterInfo?: VisibilityTreeFilterInfo;\n /**\n * Callback invoked when tree is filtered.\n */\n onFilterApplied?: (filteredDataProvider: IPresentationTreeDataProvider, matchesCount: number) => void;\n /**\n * Should the tree group displayed element nodes by class.\n * @beta\n */\n enableElementsClassGrouping?: ClassGroupingOption;\n /**\n * Auto-update the hierarchy when data in the iModel changes.\n * @alpha\n */\n enableHierarchyAutoUpdate?: boolean;\n /**\n * Custom visibility handler.\n * @alpha\n */\n modelsVisibilityHandler?: ModelsVisibilityHandler;\n}\n\n/**\n * A tree component that shows a subject - model - category - element\n * hierarchy along with checkboxes that represent and allow changing\n * the display of those instances.\n * @public\n */\nexport function ModelsTree(props: ModelsTreeProps) {\n const { nodeLoader, onItemsRendered } = useModelsTreeNodeLoader(props);\n const { filteredNodeLoader, isFiltering, nodeHighlightingProps } = useVisibilityTreeFiltering(nodeLoader, props.filterInfo, props.onFilterApplied);\n const filterApplied = filteredNodeLoader !== nodeLoader;\n\n const { activeView, modelsVisibilityHandler, selectionPredicate } = props;\n const nodeSelectionPredicate = React.useCallback((key: NodeKey, node: TreeNodeItem) => {\n return !selectionPredicate ? true : selectionPredicate(key, ModelsVisibilityHandler.getNodeType(node, nodeLoader.dataProvider));\n }, [selectionPredicate, nodeLoader.dataProvider]);\n\n const visibilityHandler = useVisibilityHandler(\n nodeLoader.dataProvider.rulesetId,\n props.iModel,\n activeView,\n modelsVisibilityHandler,\n getFilteredDataProvider(filteredNodeLoader.dataProvider),\n props.enableHierarchyAutoUpdate);\n const eventHandler = useDisposable(React.useCallback(() => new VisibilityTreeEventHandler({\n nodeLoader: filteredNodeLoader,\n visibilityHandler,\n collapsedChildrenDisposalEnabled: true,\n selectionPredicate: nodeSelectionPredicate,\n }), [filteredNodeLoader, visibilityHandler, nodeSelectionPredicate]));\n\n const treeModel = useTreeModel(filteredNodeLoader.modelSource);\n const treeRenderer = useVisibilityTreeRenderer(true, false);\n\n const overlay = isFiltering ? <div className=\"filteredTreeOverlay\" /> : undefined;\n\n // istanbul ignore next\n const noFilteredDataRenderer = React.useCallback(() => {\n return <VisibilityTreeNoFilteredData\n title={TreeWidget.translate(\"modelTree.noModelFound\")}\n message={TreeWidget.translate(\"modelTree.noMatchingModelNames\")}\n />;\n }, []);\n\n return (\n <div className=\"tree-widget-models-tree\" ref={props.rootElementRef}>\n <ControlledTree\n nodeLoader={filteredNodeLoader}\n model={treeModel}\n selectionMode={props.selectionMode || SelectionMode.None}\n eventsHandler={eventHandler}\n treeRenderer={treeRenderer}\n nodeHighlightingProps={nodeHighlightingProps}\n noDataRenderer={filterApplied ? noFilteredDataRenderer : undefined}\n onItemsRendered={onItemsRendered}\n width={props.width}\n height={props.height}\n />\n {overlay}\n </div>\n );\n}\n\nfunction useModelsTreeNodeLoader(props: ModelsTreeProps) {\n const rulesets = {\n general: (!props.enableElementsClassGrouping) ? RULESET_MODELS : /* istanbul ignore next */ RULESET_MODELS_GROUPED_BY_CLASS,\n search: RULESET_MODELS_SEARCH,\n };\n\n const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.general,\n appendChildrenCountForGroupingNodes: (props.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts),\n pagingSize: PAGING_SIZE,\n enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,\n });\n const { nodeLoader: searchNodeLoader, onItemsRendered: onSearchItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.search,\n pagingSize: PAGING_SIZE,\n enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,\n });\n\n const activeNodeLoader = props.filterInfo?.filter ? searchNodeLoader : nodeLoader;\n const activeItemsRenderedCallback = props.filterInfo?.filter ? onSearchItemsRendered : onItemsRendered;\n\n return {\n nodeLoader: activeNodeLoader,\n onItemsRendered: activeItemsRenderedCallback,\n };\n}\n\nfunction useVisibilityHandler(\n rulesetId: string,\n iModel: IModelConnection,\n activeView?: Viewport,\n visibilityHandler?: ModelsVisibilityHandler,\n filteredDataProvider?: IFilteredPresentationTreeDataProvider,\n hierarchyAutoUpdateEnabled?: boolean,\n) {\n const subjectModelIdsCache = React.useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);\n const defaultVisibilityHandler = useOptionalDisposable(React.useCallback(() => {\n if (activeView)\n return createVisibilityHandler(rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled);\n return undefined;\n }, [rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled]));\n\n const handler = visibilityHandler ?? defaultVisibilityHandler;\n\n React.useEffect(() => {\n handler && handler.setFilteredDataProvider(filteredDataProvider);\n }, [handler, filteredDataProvider]);\n\n return handler;\n}\n\nconst createVisibilityHandler = (rulesetId: string, activeView: Viewport, subjectModelIdsCache: SubjectModelIdsCache, hierarchyAutoUpdateEnabled?: boolean): ModelsVisibilityHandler | undefined => {\n // istanbul ignore next\n return new ModelsVisibilityHandler({ rulesetId, viewport: activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache });\n};\n\nconst isFilteredDataProvider = (dataProvider: IPresentationTreeDataProvider | IFilteredPresentationTreeDataProvider): dataProvider is IFilteredPresentationTreeDataProvider => {\n const filteredProvider = dataProvider as IFilteredPresentationTreeDataProvider;\n return filteredProvider.nodeMatchesFilter !== undefined && filteredProvider.getActiveMatch !== undefined && filteredProvider.countFilteringResults !== undefined;\n};\n\nconst getFilteredDataProvider = (dataProvider: IPresentationTreeDataProvider | IFilteredPresentationTreeDataProvider): IFilteredPresentationTreeDataProvider | undefined => {\n return isFilteredDataProvider(dataProvider) ? dataProvider : undefined;\n};\n"]}
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import "./ModelsTree.scss";
|
|
3
|
-
import
|
|
4
|
-
export
|
|
3
|
+
import { ModelsTreeHeaderButtonProps, ModelTreeProps } from "../../../types";
|
|
4
|
+
export interface ModelInfo {
|
|
5
|
+
id: string;
|
|
6
|
+
isPlanProjection?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const ModelsTreeComponent: {
|
|
9
|
+
(props: ModelTreeProps): JSX.Element | null;
|
|
10
|
+
ShowAllButton: typeof ShowAllButton;
|
|
11
|
+
HideAllButton: typeof HideAllButton;
|
|
12
|
+
InvertButton: typeof InvertButton;
|
|
13
|
+
View2DButton: typeof View2DButton;
|
|
14
|
+
View3DButton: typeof View3DButton;
|
|
15
|
+
};
|
|
16
|
+
declare function ShowAllButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
|
|
17
|
+
declare function HideAllButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
|
|
18
|
+
declare function InvertButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
|
|
19
|
+
declare function View2DButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
|
|
20
|
+
declare function View3DButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
|
|
21
|
+
export {};
|
|
5
22
|
//# sourceMappingURL=ModelsTreeComponent.d.ts.map
|
|
@@ -2,23 +2,33 @@
|
|
|
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
|
|
5
|
+
import "./ModelsTree.scss";
|
|
6
|
+
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
6
7
|
import { useActiveIModelConnection, useActiveViewport } from "@itwin/appui-react";
|
|
8
|
+
import { IModelApp } from "@itwin/core-frontend";
|
|
7
9
|
import { useTreeFilteringState } from "../../TreeFilteringState";
|
|
8
|
-
import "./ModelsTree.scss";
|
|
9
|
-
import { TreeHeaderComponent } from "../../header/TreeHeader";
|
|
10
10
|
import { AutoSizer } from "../../utils/AutoSizer";
|
|
11
|
+
import { toggleAllCategories } from "../CategoriesVisibilityUtils";
|
|
11
12
|
import { ModelsTree } from "./ModelsTree";
|
|
13
|
+
import { IconButton } from "../../IconButton";
|
|
14
|
+
import { TreeWidget } from "../../../TreeWidget";
|
|
15
|
+
import { SearchBar } from "../../search-bar/SearchBar";
|
|
12
16
|
export const ModelsTreeComponent = (props) => {
|
|
13
|
-
const [is2dToggleActive, setIs2dToggleActive] = useState(false);
|
|
14
|
-
const [is3dToggleActive, setIs3dToggleActive] = useState(false);
|
|
15
|
-
const [icon2dToggle, setIcon2dToggle] = useState("icon-visibility");
|
|
16
|
-
const [icon3dToggle, setIcon3dToggle] = useState("icon-visibility");
|
|
17
|
-
const [available2dModels, setAvailable2dModels] = useState([]);
|
|
18
|
-
const [available3dModels, setAvailable3dModels] = useState([]);
|
|
19
|
-
const [availableModels, setAvailableModels] = useState([]);
|
|
20
17
|
const iModel = useActiveIModelConnection();
|
|
21
18
|
const viewport = useActiveViewport();
|
|
19
|
+
if (!iModel || !viewport)
|
|
20
|
+
return null;
|
|
21
|
+
return (React.createElement(ModelsTreeComponentImpl, { ...props, iModel: iModel, viewport: viewport }));
|
|
22
|
+
};
|
|
23
|
+
ModelsTreeComponent.ShowAllButton = ShowAllButton;
|
|
24
|
+
ModelsTreeComponent.HideAllButton = HideAllButton;
|
|
25
|
+
ModelsTreeComponent.InvertButton = InvertButton;
|
|
26
|
+
ModelsTreeComponent.View2DButton = View2DButton;
|
|
27
|
+
ModelsTreeComponent.View3DButton = View3DButton;
|
|
28
|
+
function ModelsTreeComponentImpl(props) {
|
|
29
|
+
var _a;
|
|
30
|
+
const [availableModels, setAvailableModels] = useState([]);
|
|
31
|
+
const { viewport, iModel } = props;
|
|
22
32
|
const { searchOptions, filterString, activeMatchIndex, onFilterApplied } = useTreeFilteringState();
|
|
23
33
|
const queryModels = useCallback(async (vp) => {
|
|
24
34
|
var _a;
|
|
@@ -28,7 +38,7 @@ export const ModelsTreeComponent = (props) => {
|
|
|
28
38
|
from: "BisCore.GeometricModel3d",
|
|
29
39
|
wantPrivate: false,
|
|
30
40
|
};
|
|
31
|
-
const modelProps = (_a = await
|
|
41
|
+
const modelProps = (_a = await iModel.models.queryProps(queryParams)) !== null && _a !== void 0 ? _a : [];
|
|
32
42
|
return modelProps
|
|
33
43
|
.map(({ id, isPlanProjection }) => ({ id, isPlanProjection }))
|
|
34
44
|
.filter(({ id }) => id);
|
|
@@ -36,70 +46,108 @@ export const ModelsTreeComponent = (props) => {
|
|
|
36
46
|
useEffect(() => {
|
|
37
47
|
queryModels(viewport)
|
|
38
48
|
.then((modelInfos) => {
|
|
39
|
-
setAvailableModels(modelInfos
|
|
40
|
-
const { models2d, models3d } = modelInfos.reduce((acc, { id, isPlanProjection }) => {
|
|
41
|
-
isPlanProjection ? acc.models2d.push(id) : acc.models3d.push(id);
|
|
42
|
-
return acc;
|
|
43
|
-
}, { models2d: [], models3d: [] });
|
|
44
|
-
setAvailable2dModels(models2d);
|
|
45
|
-
setAvailable3dModels(models3d);
|
|
49
|
+
setAvailableModels(modelInfos);
|
|
46
50
|
})
|
|
47
51
|
.catch((_e) => {
|
|
48
52
|
setAvailableModels([]);
|
|
49
53
|
});
|
|
50
54
|
}, [queryModels, viewport]);
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
return (React.createElement(React.Fragment, null,
|
|
56
|
+
React.createElement(SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget.translate("search"), title: TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterCancel: searchOptions.onFilterCancel, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 }, props.headerButtons
|
|
57
|
+
? props.headerButtons.map((btn, index) => React.createElement(React.Fragment, { key: index }, btn({ viewport, models: availableModels })))
|
|
58
|
+
: [
|
|
59
|
+
React.createElement(ShowAllButton, { viewport: viewport, models: availableModels, key: "show-all-btn" }),
|
|
60
|
+
React.createElement(HideAllButton, { viewport: viewport, models: availableModels, key: "hide-all-btn" }),
|
|
61
|
+
React.createElement(InvertButton, { viewport: viewport, models: availableModels, key: "invert-all-btn" }),
|
|
62
|
+
React.createElement(View2DButton, { viewport: viewport, models: availableModels, key: "view-2d-btn" }),
|
|
63
|
+
React.createElement(View3DButton, { viewport: viewport, models: availableModels, key: "view-3d-btn" }),
|
|
64
|
+
]),
|
|
65
|
+
React.createElement(AutoSizer, null, ({ width, height }) => (React.createElement(ModelsTree, { ...props, iModel: iModel, activeView: viewport, width: width, height: height, filterInfo: { filter: filterString, activeMatchIndex }, onFilterApplied: onFilterApplied })))));
|
|
66
|
+
}
|
|
67
|
+
function ShowAllButton(props) {
|
|
68
|
+
const showAll = async () => {
|
|
69
|
+
if (!props.viewport)
|
|
53
70
|
return;
|
|
71
|
+
await props.viewport.addViewedModels(props.models.map((model) => model.id));
|
|
72
|
+
props.viewport.clearNeverDrawn();
|
|
73
|
+
props.viewport.clearAlwaysDrawn();
|
|
74
|
+
if (props.viewport.iModel) {
|
|
75
|
+
await toggleAllCategories(IModelApp.viewManager, props.viewport.iModel, true, props.viewport, false);
|
|
76
|
+
}
|
|
77
|
+
props.viewport.invalidateScene();
|
|
78
|
+
};
|
|
79
|
+
return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", icon: "icon-visibility", title: TreeWidget.translate("showAll"), onClick: showAll }));
|
|
80
|
+
}
|
|
81
|
+
function HideAllButton(props) {
|
|
82
|
+
const hideAll = async () => {
|
|
83
|
+
props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);
|
|
84
|
+
props.viewport.clearAlwaysDrawn();
|
|
85
|
+
if (props.viewport.iModel) {
|
|
86
|
+
await toggleAllCategories(IModelApp.viewManager, props.viewport.iModel, false, props.viewport, false);
|
|
87
|
+
}
|
|
88
|
+
props.viewport.invalidateScene();
|
|
89
|
+
};
|
|
90
|
+
return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", icon: "icon-visibility-hide-2", title: TreeWidget.translate("hideAll"), onClick: hideAll }));
|
|
91
|
+
}
|
|
92
|
+
function InvertButton(props) {
|
|
93
|
+
const invert = async () => {
|
|
54
94
|
const notViewedModels = [];
|
|
55
95
|
const models = [];
|
|
56
|
-
|
|
57
|
-
if (viewport
|
|
58
|
-
models.push(id);
|
|
96
|
+
props.models.forEach((model) => {
|
|
97
|
+
if (props.viewport.viewsModel(model.id))
|
|
98
|
+
models.push(model.id);
|
|
59
99
|
else
|
|
60
|
-
notViewedModels.push(id);
|
|
100
|
+
notViewedModels.push(model.id);
|
|
61
101
|
});
|
|
62
|
-
await
|
|
63
|
-
viewport
|
|
64
|
-
viewport
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
102
|
+
await props.viewport.addViewedModels(notViewedModels);
|
|
103
|
+
props.viewport.changeModelDisplay(models, false);
|
|
104
|
+
props.viewport.invalidateScene();
|
|
105
|
+
};
|
|
106
|
+
return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", title: TreeWidget.translate("invert"), icon: "icon-visibility-invert", onClick: invert }));
|
|
107
|
+
}
|
|
108
|
+
function View2DButton(props) {
|
|
109
|
+
const models2d = useMemo(() => {
|
|
110
|
+
return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);
|
|
111
|
+
}, [props.models]);
|
|
112
|
+
const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));
|
|
115
|
+
}, [models2d, props.viewport]);
|
|
116
|
+
const viewToggle2D = async () => {
|
|
117
|
+
if (!models2d)
|
|
118
|
+
return;
|
|
75
119
|
if (is2dToggleActive) {
|
|
76
|
-
viewport
|
|
77
|
-
setIs2dToggleActive(false);
|
|
78
|
-
setIcon2dToggle("icon-visibility-hide-2");
|
|
120
|
+
props.viewport.changeModelDisplay(models2d, false);
|
|
79
121
|
}
|
|
80
122
|
else {
|
|
81
|
-
await
|
|
82
|
-
setIs2dToggleActive(true);
|
|
83
|
-
setIcon2dToggle("icon-visibility");
|
|
123
|
+
await props.viewport.addViewedModels(models2d);
|
|
84
124
|
}
|
|
85
|
-
viewport
|
|
86
|
-
}
|
|
87
|
-
|
|
125
|
+
props.viewport.invalidateScene();
|
|
126
|
+
};
|
|
127
|
+
return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", icon: is2dToggleActive ? "icon-visibility" : "icon-visibility-hide-2", title: TreeWidget.translate("toggle2DViews"), onClick: viewToggle2D, label: TreeWidget.translate("label2D"), disabled: models2d.length === 0 }));
|
|
128
|
+
}
|
|
129
|
+
function View3DButton(props) {
|
|
130
|
+
const models3d = useMemo(() => {
|
|
131
|
+
return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);
|
|
132
|
+
}, [props.models]);
|
|
133
|
+
const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));
|
|
136
|
+
}, [models3d, props.viewport]);
|
|
137
|
+
const viewToggle3D = async () => {
|
|
138
|
+
if (!models3d)
|
|
139
|
+
return;
|
|
88
140
|
if (is3dToggleActive) {
|
|
89
|
-
viewport
|
|
90
|
-
setIs3dToggleActive(false);
|
|
91
|
-
setIcon3dToggle("icon-visibility-hide-2");
|
|
141
|
+
props.viewport.changeModelDisplay(models3d, false);
|
|
92
142
|
}
|
|
93
143
|
else {
|
|
94
|
-
await
|
|
95
|
-
setIs3dToggleActive(true);
|
|
96
|
-
setIcon3dToggle("icon-visibility");
|
|
144
|
+
await props.viewport.addViewedModels(models3d);
|
|
97
145
|
}
|
|
98
|
-
viewport
|
|
99
|
-
}
|
|
100
|
-
return (React.createElement(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
146
|
+
props.viewport.invalidateScene();
|
|
147
|
+
};
|
|
148
|
+
return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", icon: is3dToggleActive ? "icon-visibility" : "icon-visibility-hide-2", title: TreeWidget.translate("toggle3DViews"), onClick: viewToggle3D, label: TreeWidget.translate("label3D"), disabled: models3d.length === 0 }));
|
|
149
|
+
}
|
|
150
|
+
function areAllModelsVisible(viewport, models) {
|
|
151
|
+
return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;
|
|
152
|
+
}
|
|
105
153
|
//# sourceMappingURL=ModelsTreeComponent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelsTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeComponent.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 React, { useCallback, useEffect, useState } from \"react\";\nimport type { Viewport } from \"@itwin/core-frontend\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport \"./ModelsTree.scss\";\nimport type {\n GeometricModel3dProps,\n ModelQueryParams,\n} from \"@itwin/core-common\";\nimport { TreeHeaderComponent } from \"../../header/TreeHeader\";\nimport type { ModelTreeProps } from \"../../../types\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { ModelsTree } from \"./ModelsTree\";\n\ninterface TreeViewModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\nexport const ModelsTreeComponent = (props: ModelTreeProps) => {\n const [is2dToggleActive, setIs2dToggleActive] = useState<boolean>(false);\n const [is3dToggleActive, setIs3dToggleActive] = useState<boolean>(false);\n const [icon2dToggle, setIcon2dToggle] = useState<string>(\"icon-visibility\");\n const [icon3dToggle, setIcon3dToggle] = useState<string>(\"icon-visibility\");\n\n const [available2dModels, setAvailable2dModels] = useState<string[]>([]);\n const [available3dModels, setAvailable3dModels] = useState<string[]>([]);\n const [availableModels, setAvailableModels] = useState<string[]>([]);\n\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n const { searchOptions, filterString, activeMatchIndex, onFilterApplied } =\n useTreeFilteringState();\n\n const queryModels = useCallback(async (\n vp: Viewport | undefined\n ): Promise<TreeViewModelInfo[]> => {\n if (vp === undefined) return [];\n\n const queryParams: ModelQueryParams = {\n from: \"BisCore.GeometricModel3d\",\n wantPrivate: false,\n };\n const modelProps = await iModel?.models.queryProps(queryParams) ?? [];\n return modelProps\n .map(({ id, isPlanProjection }: GeometricModel3dProps) => ({ id, isPlanProjection }))\n .filter(({ id }) => id) as TreeViewModelInfo[];\n }, [iModel]);\n\n useEffect(() => {\n queryModels(viewport)\n .then((modelInfos: TreeViewModelInfo[]) => {\n setAvailableModels(modelInfos.map(({ id }) => id));\n\n const { models2d, models3d } = modelInfos.reduce((acc, { id, isPlanProjection }) => {\n isPlanProjection ? acc.models2d.push(id) : acc.models3d.push(id);\n return acc;\n }, { models2d: [] as string[], models3d: [] as string[] });\n\n setAvailable2dModels(models2d);\n setAvailable3dModels(models3d);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels, viewport]);\n\n const invert = useCallback(async () => {\n if (availableModels.length === 0) return;\n const notViewedModels: string[] = [];\n const models: string[] = [];\n availableModels.forEach((id: string) => {\n if (viewport?.viewsModel(id)) models.push(id);\n else notViewedModels.push(id);\n });\n await viewport?.addViewedModels(notViewedModels);\n viewport?.changeModelDisplay(models, false);\n viewport?.invalidateScene();\n }, [viewport, availableModels]);\n\n const hideAll = useCallback(() => {\n viewport?.changeModelDisplay(availableModels, false);\n viewport?.invalidateScene();\n }, [viewport, availableModels]);\n\n const showAll = useCallback(async () => {\n await viewport?.addViewedModels(availableModels);\n viewport?.invalidateScene();\n }, [viewport, availableModels]);\n\n const viewToggle2D = useCallback(async () => {\n if (is2dToggleActive) {\n viewport?.changeModelDisplay(available2dModels, false);\n setIs2dToggleActive(false);\n setIcon2dToggle(\"icon-visibility-hide-2\");\n } else {\n await viewport?.addViewedModels(available2dModels);\n setIs2dToggleActive(true);\n setIcon2dToggle(\"icon-visibility\");\n }\n viewport?.invalidateScene();\n }, [is2dToggleActive, viewport, available2dModels]);\n\n const viewToggle3D = useCallback(async () => {\n if (is3dToggleActive) {\n viewport?.changeModelDisplay(available3dModels, false);\n setIs3dToggleActive(false);\n setIcon3dToggle(\"icon-visibility-hide-2\");\n } else {\n await viewport?.addViewedModels(available3dModels);\n setIs3dToggleActive(true);\n setIcon3dToggle(\"icon-visibility\");\n }\n viewport?.invalidateScene();\n }, [is3dToggleActive, viewport, available3dModels]);\n\n return (\n <>\n {iModel && viewport &&\n <>\n <TreeHeaderComponent\n searchOptions={searchOptions}\n showAll={showAll}\n hideAll={hideAll}\n invert={invert}\n toggle2D={viewToggle2D}\n toggle2DIcon={icon2dToggle}\n toggle3D={viewToggle3D}\n toggle3DIcon={icon3dToggle}\n />\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n }\n </>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ModelsTreeComponent.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeComponent.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 \"./ModelsTree.scss\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { GeometricModel3dProps, ModelQueryParams } from \"@itwin/core-common\";\nimport { IModelApp, IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport { ModelsTreeHeaderButtonProps, ModelTreeProps } from \"../../../types\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { toggleAllCategories } from \"../CategoriesVisibilityUtils\";\nimport { ModelsTree } from \"./ModelsTree\";\nimport { IconButton } from \"../../IconButton\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { SearchBar } from \"../../search-bar/SearchBar\";\n\nexport interface ModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\nexport const ModelsTreeComponent = (props: ModelTreeProps) => {\n const iModel = useActiveIModelConnection();\n const viewport = useActiveViewport();\n\n if (!iModel || !viewport)\n return null;\n\n return (\n <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />\n );\n};\n\nModelsTreeComponent.ShowAllButton = ShowAllButton;\nModelsTreeComponent.HideAllButton = HideAllButton;\nModelsTreeComponent.InvertButton = InvertButton;\nModelsTreeComponent.View2DButton = View2DButton;\nModelsTreeComponent.View3DButton = View3DButton;\n\nfunction ModelsTreeComponentImpl(props: ModelTreeProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n\n const { viewport, iModel } = props;\n\n const { searchOptions, filterString, activeMatchIndex, onFilterApplied } =\n useTreeFilteringState();\n\n const queryModels = useCallback(async (\n vp: Viewport | undefined\n ): Promise<ModelInfo[]> => {\n if (vp === undefined) return [];\n\n const queryParams: ModelQueryParams = {\n from: \"BisCore.GeometricModel3d\",\n wantPrivate: false,\n };\n const modelProps = await iModel.models.queryProps(queryParams) ?? [];\n return modelProps\n .map(({ id, isPlanProjection }: GeometricModel3dProps) => ({ id, isPlanProjection }))\n .filter(({ id }) => id) as ModelInfo[];\n }, [iModel]);\n\n useEffect(() => {\n queryModels(viewport)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels, viewport]);\n\n return (\n <>\n <SearchBar\n value=\"\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterCancel={searchOptions.onFilterCancel}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) =>\n <React.Fragment key={index}>\n {btn({ viewport, models: availableModels })}\n </React.Fragment>)\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" />,\n ]\n }\n </SearchBar>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={{ filter: filterString, activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n const showAll = async () => {\n if (!props.viewport)\n return;\n\n await props.viewport.addViewedModels(props.models.map((model) => model.id));\n props.viewport.clearNeverDrawn();\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n true,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n const hideAll = async () => {\n props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);\n props.viewport.clearAlwaysDrawn();\n if (props.viewport.iModel) {\n await toggleAllCategories(\n IModelApp.viewManager,\n props.viewport.iModel,\n false,\n props.viewport,\n false\n );\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n const invert = async () => {\n const notViewedModels: string[] = [];\n const models: string[] = [];\n props.models.forEach((model) => {\n if (props.viewport.viewsModel(model.id)) models.push(model.id);\n else notViewedModels.push(model.id);\n });\n await props.viewport.addViewedModels(notViewedModels);\n props.viewport.changeModelDisplay(models, false);\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n );\n}\n\nfunction View2DButton(props: ModelsTreeHeaderButtonProps) {\n const models2d = useMemo(() => {\n return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));\n }, [models2d, props.viewport]);\n const viewToggle2D = async () => {\n if (!models2d)\n return;\n\n if (is2dToggleActive) {\n props.viewport.changeModelDisplay(models2d, false);\n } else {\n await props.viewport.addViewedModels(models2d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is2dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={viewToggle2D}\n label={TreeWidget.translate(\"label2D\")}\n disabled={models2d.length === 0}\n />\n );\n}\n\nfunction View3DButton(props: ModelsTreeHeaderButtonProps) {\n const models3d = useMemo(() => {\n return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);\n }, [props.models]);\n\n const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));\n\n useEffect(() => {\n return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));\n }, [models3d, props.viewport]);\n\n const viewToggle3D = async () => {\n if (!models3d)\n return;\n\n if (is3dToggleActive) {\n props.viewport.changeModelDisplay(models3d, false);\n } else {\n await props.viewport.addViewedModels(models3d);\n }\n props.viewport.invalidateScene();\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n icon={is3dToggleActive ? \"icon-visibility\" : \"icon-visibility-hide-2\"}\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={viewToggle3D}\n label={TreeWidget.translate(\"label3D\")}\n disabled={models3d.length === 0}\n />\n );\n}\n\nfunction areAllModelsVisible(viewport: Viewport, models: string[]): boolean {\n return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;\n}\n"]}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import { NodeKey } from "@itwin/presentation-common";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import type { IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider } from "@itwin/presentation-components";
|
|
8
|
-
import type { IVisibilityHandler, VisibilityChangeListener, VisibilityStatus } from "../VisibilityTreeEventHandler";
|
|
1
|
+
import { TreeNodeItem } from "@itwin/components-react";
|
|
2
|
+
import { BeEvent, Id64String } from "@itwin/core-bentley";
|
|
3
|
+
import { IModelConnection, Viewport } from "@itwin/core-frontend";
|
|
4
|
+
import { ECClassGroupingNodeKey, NodeKey } from "@itwin/presentation-common";
|
|
5
|
+
import { IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider } from "@itwin/presentation-components";
|
|
6
|
+
import { IVisibilityHandler, VisibilityChangeListener, VisibilityStatus } from "../VisibilityTreeEventHandler";
|
|
9
7
|
/**
|
|
10
8
|
* Visibility tree node types.
|
|
11
9
|
* @beta
|