@itwin/tree-widget-react 0.10.0 → 1.0.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/CHANGELOG.md +331 -0
  2. package/README.md +146 -29
  3. package/lib/cjs/TreeWidget.d.ts +0 -1
  4. package/lib/cjs/TreeWidget.js +1 -6
  5. package/lib/cjs/TreeWidget.js.map +1 -1
  6. package/lib/cjs/components/TreeFilteringState.d.ts +3 -1
  7. package/lib/cjs/components/TreeFilteringState.js +19 -40
  8. package/lib/cjs/components/TreeFilteringState.js.map +1 -1
  9. package/lib/cjs/components/TreeWidgetComponent.d.ts +29 -5
  10. package/lib/cjs/components/TreeWidgetComponent.js +85 -29
  11. package/lib/cjs/components/TreeWidgetComponent.js.map +1 -1
  12. package/lib/cjs/components/TreeWidgetComponent.scss +4 -24
  13. package/lib/cjs/components/TreeWidgetUiItemsProvider.d.ts +25 -2
  14. package/lib/cjs/components/TreeWidgetUiItemsProvider.js +31 -46
  15. package/lib/cjs/components/TreeWidgetUiItemsProvider.js.map +1 -1
  16. package/lib/cjs/components/tree-header/TreeHeader.d.ts +26 -0
  17. package/lib/cjs/components/tree-header/TreeHeader.js +43 -0
  18. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -0
  19. package/lib/cjs/components/tree-header/TreeHeader.scss +69 -0
  20. package/lib/cjs/components/trees/CategoriesVisibilityUtils.d.ts +12 -6
  21. package/lib/cjs/components/trees/CategoriesVisibilityUtils.js +10 -4
  22. package/lib/cjs/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  23. package/lib/cjs/components/trees/Common.d.ts +2 -2
  24. package/lib/cjs/components/trees/Common.js +1 -1
  25. package/lib/cjs/components/trees/Common.js.map +1 -1
  26. package/lib/cjs/components/trees/VisibilityTreeBase.scss +66 -10
  27. package/lib/cjs/components/trees/VisibilityTreeEventHandler.d.ts +13 -12
  28. package/lib/cjs/components/trees/VisibilityTreeEventHandler.js +6 -17
  29. package/lib/cjs/components/trees/VisibilityTreeEventHandler.js.map +1 -1
  30. package/lib/cjs/components/trees/VisibilityTreeRenderer.d.ts +38 -14
  31. package/lib/cjs/components/trees/VisibilityTreeRenderer.js +35 -41
  32. package/lib/cjs/components/trees/VisibilityTreeRenderer.js.map +1 -1
  33. package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +12 -11
  34. package/lib/cjs/components/trees/category-tree/CategoriesTree.js +17 -41
  35. package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
  36. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.d.ts +67 -6
  37. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js +61 -72
  38. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  39. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.d.ts +30 -8
  40. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js +61 -34
  41. package/lib/cjs/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  42. package/lib/cjs/components/trees/external-sources-tree/ExternalSources.json +230 -0
  43. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +27 -0
  44. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js +61 -0
  45. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -0
  46. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +20 -0
  47. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +39 -0
  48. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -0
  49. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.d.ts +30 -0
  50. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js +39 -0
  51. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -0
  52. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +26 -0
  53. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js +35 -0
  54. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -0
  55. package/lib/cjs/components/trees/index.d.ts +5 -1
  56. package/lib/cjs/components/trees/index.js +10 -2
  57. package/lib/cjs/components/trees/index.js.map +1 -1
  58. package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +26 -18
  59. package/lib/cjs/components/trees/models-tree/ModelsTree.js +22 -50
  60. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  61. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.d.ts +70 -2
  62. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +68 -105
  63. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  64. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.d.ts +40 -12
  65. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js +65 -5
  66. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  67. package/lib/cjs/components/trees/models-tree/Utils.d.ts +12 -0
  68. package/lib/cjs/components/trees/models-tree/Utils.js +625 -1
  69. package/lib/cjs/components/trees/models-tree/Utils.js.map +1 -1
  70. package/lib/cjs/components/utils/AutoSizer.d.ts +6 -3
  71. package/lib/cjs/components/utils/AutoSizer.js +9 -29
  72. package/lib/cjs/components/utils/AutoSizer.js.map +1 -1
  73. package/lib/cjs/components/utils/IsPromiseLike.d.ts +4 -1
  74. package/lib/cjs/components/utils/IsPromiseLike.js +6 -3
  75. package/lib/cjs/components/utils/IsPromiseLike.js.map +1 -1
  76. package/lib/cjs/tree-widget-react.d.ts +0 -1
  77. package/lib/cjs/tree-widget-react.js +5 -2
  78. package/lib/cjs/tree-widget-react.js.map +1 -1
  79. package/lib/esm/TreeWidget.d.ts +0 -1
  80. package/lib/esm/TreeWidget.js +2 -7
  81. package/lib/esm/TreeWidget.js.map +1 -1
  82. package/lib/esm/components/TreeFilteringState.d.ts +3 -1
  83. package/lib/esm/components/TreeFilteringState.js +17 -19
  84. package/lib/esm/components/TreeFilteringState.js.map +1 -1
  85. package/lib/esm/components/TreeWidgetComponent.d.ts +29 -5
  86. package/lib/esm/components/TreeWidgetComponent.js +82 -7
  87. package/lib/esm/components/TreeWidgetComponent.js.map +1 -1
  88. package/lib/esm/components/TreeWidgetComponent.scss +4 -24
  89. package/lib/esm/components/TreeWidgetUiItemsProvider.d.ts +25 -2
  90. package/lib/esm/components/TreeWidgetUiItemsProvider.js +29 -41
  91. package/lib/esm/components/TreeWidgetUiItemsProvider.js.map +1 -1
  92. package/lib/esm/components/tree-header/TreeHeader.d.ts +26 -0
  93. package/lib/esm/components/tree-header/TreeHeader.js +36 -0
  94. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -0
  95. package/lib/esm/components/tree-header/TreeHeader.scss +69 -0
  96. package/lib/esm/components/trees/CategoriesVisibilityUtils.d.ts +12 -6
  97. package/lib/esm/components/trees/CategoriesVisibilityUtils.js +10 -4
  98. package/lib/esm/components/trees/CategoriesVisibilityUtils.js.map +1 -1
  99. package/lib/esm/components/trees/Common.d.ts +2 -2
  100. package/lib/esm/components/trees/Common.js +1 -1
  101. package/lib/esm/components/trees/Common.js.map +1 -1
  102. package/lib/esm/components/trees/VisibilityTreeBase.scss +66 -10
  103. package/lib/esm/components/trees/VisibilityTreeEventHandler.d.ts +13 -12
  104. package/lib/esm/components/trees/VisibilityTreeEventHandler.js +6 -17
  105. package/lib/esm/components/trees/VisibilityTreeEventHandler.js.map +1 -1
  106. package/lib/esm/components/trees/VisibilityTreeRenderer.d.ts +38 -14
  107. package/lib/esm/components/trees/VisibilityTreeRenderer.js +29 -19
  108. package/lib/esm/components/trees/VisibilityTreeRenderer.js.map +1 -1
  109. package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +12 -11
  110. package/lib/esm/components/trees/category-tree/CategoriesTree.js +16 -21
  111. package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
  112. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.d.ts +67 -6
  113. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js +60 -52
  114. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  115. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.d.ts +30 -8
  116. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js +57 -14
  117. package/lib/esm/components/trees/category-tree/CategoryVisibilityHandler.js.map +1 -1
  118. package/lib/esm/components/trees/external-sources-tree/ExternalSources.json +230 -0
  119. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +27 -0
  120. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js +34 -0
  121. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -0
  122. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +20 -0
  123. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js +35 -0
  124. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -0
  125. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.d.ts +30 -0
  126. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js +32 -0
  127. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -0
  128. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +26 -0
  129. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js +31 -0
  130. package/lib/esm/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -0
  131. package/lib/esm/components/trees/index.d.ts +5 -1
  132. package/lib/esm/components/trees/index.js +5 -1
  133. package/lib/esm/components/trees/index.js.map +1 -1
  134. package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +26 -18
  135. package/lib/esm/components/trees/models-tree/ModelsTree.js +23 -32
  136. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  137. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.d.ts +70 -2
  138. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +66 -84
  139. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  140. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.d.ts +40 -12
  141. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js +60 -5
  142. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  143. package/lib/esm/components/trees/models-tree/Utils.d.ts +12 -0
  144. package/lib/esm/components/trees/models-tree/Utils.js +622 -0
  145. package/lib/esm/components/trees/models-tree/Utils.js.map +1 -1
  146. package/lib/esm/components/utils/AutoSizer.d.ts +6 -3
  147. package/lib/esm/components/utils/AutoSizer.js +9 -10
  148. package/lib/esm/components/utils/AutoSizer.js.map +1 -1
  149. package/lib/esm/components/utils/IsPromiseLike.d.ts +4 -1
  150. package/lib/esm/components/utils/IsPromiseLike.js +4 -1
  151. package/lib/esm/components/utils/IsPromiseLike.js.map +1 -1
  152. package/lib/esm/tree-widget-react.d.ts +0 -1
  153. package/lib/esm/tree-widget-react.js +0 -1
  154. package/lib/esm/tree-widget-react.js.map +1 -1
  155. package/lib/public/locales/en/TreeWidget.json +13 -4
  156. package/package.json +42 -47
  157. package/lib/cjs/components/rulesets/ClassificationSystems.json +0 -122
  158. package/lib/cjs/components/search-bar/SearchBar.d.ts +0 -48
  159. package/lib/cjs/components/search-bar/SearchBar.js +0 -86
  160. package/lib/cjs/components/search-bar/SearchBar.js.map +0 -1
  161. package/lib/cjs/components/search-bar/SearchBar.scss +0 -118
  162. package/lib/cjs/components/search-bar/SearchBox.d.ts +0 -70
  163. package/lib/cjs/components/search-bar/SearchBox.js +0 -186
  164. package/lib/cjs/components/search-bar/SearchBox.js.map +0 -1
  165. package/lib/cjs/components/search-bar/SearchBox.scss +0 -70
  166. package/lib/cjs/components/trees/IModelContentTree.d.ts +0 -4
  167. package/lib/cjs/components/trees/IModelContentTree.js +0 -50
  168. package/lib/cjs/components/trees/IModelContentTree.js.map +0 -1
  169. package/lib/cjs/components/trees/models-tree/Hierarchy.GroupedByClass.json +0 -391
  170. package/lib/cjs/components/trees/models-tree/Hierarchy.json +0 -386
  171. package/lib/cjs/components/trees/models-tree/ModelsTreeSearch.json +0 -239
  172. package/lib/cjs/types.d.ts +0 -44
  173. package/lib/cjs/types.js +0 -11
  174. package/lib/cjs/types.js.map +0 -1
  175. package/lib/esm/components/rulesets/ClassificationSystems.json +0 -122
  176. package/lib/esm/components/search-bar/SearchBar.d.ts +0 -48
  177. package/lib/esm/components/search-bar/SearchBar.js +0 -60
  178. package/lib/esm/components/search-bar/SearchBar.js.map +0 -1
  179. package/lib/esm/components/search-bar/SearchBar.scss +0 -118
  180. package/lib/esm/components/search-bar/SearchBox.d.ts +0 -70
  181. package/lib/esm/components/search-bar/SearchBox.js +0 -160
  182. package/lib/esm/components/search-bar/SearchBox.js.map +0 -1
  183. package/lib/esm/components/search-bar/SearchBox.scss +0 -70
  184. package/lib/esm/components/trees/IModelContentTree.d.ts +0 -4
  185. package/lib/esm/components/trees/IModelContentTree.js +0 -24
  186. package/lib/esm/components/trees/IModelContentTree.js.map +0 -1
  187. package/lib/esm/components/trees/models-tree/Hierarchy.GroupedByClass.json +0 -391
  188. package/lib/esm/components/trees/models-tree/Hierarchy.json +0 -386
  189. package/lib/esm/components/trees/models-tree/ModelsTreeSearch.json +0 -239
  190. package/lib/esm/types.d.ts +0 -44
  191. package/lib/esm/types.js +0 -8
  192. package/lib/esm/types.js.map +0 -1
  193. /package/lib/cjs/components/{rulesets → trees/imodel-content-tree}/IModelContent.json +0 -0
  194. /package/lib/esm/components/{rulesets → trees/imodel-content-tree}/IModelContent.json +0 -0
@@ -1,23 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  /*---------------------------------------------------------------------------------------------
2
3
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
5
  *--------------------------------------------------------------------------------------------*/
5
6
  import "../VisibilityTreeBase.scss";
6
- import * as React from "react";
7
+ import { useCallback, useEffect, useMemo } from "react";
7
8
  import { ControlledTree, SelectionMode, useTreeModel } from "@itwin/components-react";
8
- import { useDisposable, useOptionalDisposable } from "@itwin/core-react";
9
- import { isPresentationTreeNodeItem, usePresentationTreeNodeLoader, } from "@itwin/presentation-components";
9
+ import { useDisposable } from "@itwin/core-react";
10
+ import { isPresentationTreeNodeItem, usePresentationTreeNodeLoader } from "@itwin/presentation-components";
10
11
  import { TreeWidget } from "../../../TreeWidget";
11
12
  import { ClassGroupingOption } from "../Common";
12
13
  import { VisibilityTreeEventHandler } from "../VisibilityTreeEventHandler";
13
- import { useVisibilityTreeFiltering, useVisibilityTreeRenderer, VisibilityTreeNoFilteredData } from "../VisibilityTreeRenderer";
14
+ import { createVisibilityTreeRenderer, useVisibilityTreeFiltering, VisibilityTreeNoFilteredData } from "../VisibilityTreeRenderer";
14
15
  import { ModelsVisibilityHandler, SubjectModelIdsCache } from "./ModelsVisibilityHandler";
16
+ import { createRuleset, createSearchRuleset } from "./Utils";
15
17
  const PAGING_SIZE = 20;
16
- /** @internal */
17
- export const RULESET_MODELS = require("./Hierarchy.json"); // eslint-disable-line @typescript-eslint/no-var-requires
18
- /** @internal */
19
- export const RULESET_MODELS_GROUPED_BY_CLASS = require("./Hierarchy.GroupedByClass.json"); // eslint-disable-line @typescript-eslint/no-var-requires
20
- const RULESET_MODELS_SEARCH = require("./ModelsTreeSearch.json"); // eslint-disable-line @typescript-eslint/no-var-requires
21
18
  /**
22
19
  * A tree component that shows a subject - model - category - element
23
20
  * hierarchy along with checkboxes that represent and allow changing
@@ -30,32 +27,34 @@ export function ModelsTree(props) {
30
27
  const filterApplied = filteredNodeLoader !== nodeLoader;
31
28
  const { activeView, modelsVisibilityHandler, selectionPredicate } = props;
32
29
  const visibilityHandler = useVisibilityHandler(nodeLoader.dataProvider.rulesetId, props.iModel, activeView, modelsVisibilityHandler, getFilteredDataProvider(filteredNodeLoader.dataProvider), props.enableHierarchyAutoUpdate);
33
- const eventHandler = useDisposable(React.useCallback(() => new VisibilityTreeEventHandler({
30
+ const eventHandler = useDisposable(useCallback(() => new VisibilityTreeEventHandler({
34
31
  nodeLoader: filteredNodeLoader,
35
32
  visibilityHandler,
36
- collapsedChildrenDisposalEnabled: true,
37
33
  selectionPredicate: (node) => !selectionPredicate || !isPresentationTreeNodeItem(node) ? true : selectionPredicate(node.key, ModelsVisibilityHandler.getNodeType(node)),
38
34
  }), [filteredNodeLoader, visibilityHandler, selectionPredicate]));
39
35
  const treeModel = useTreeModel(filteredNodeLoader.modelSource);
40
- const treeRenderer = useVisibilityTreeRenderer(true, false);
41
- const overlay = isFiltering ? React.createElement("div", { className: "filteredTreeOverlay" }) : undefined;
36
+ const treeRenderer = createVisibilityTreeRenderer({ iconsEnabled: true, descriptionEnabled: false, levelOffset: 10, disableRootNodeCollapse: true });
37
+ const overlay = isFiltering ? _jsx("div", { className: "filteredTreeOverlay" }) : undefined;
42
38
  // istanbul ignore next
43
- const noFilteredDataRenderer = React.useCallback(() => {
44
- return React.createElement(VisibilityTreeNoFilteredData, { title: TreeWidget.translate("modelTree.noModelFound"), message: TreeWidget.translate("modelTree.noMatchingModelNames") });
39
+ const noFilteredDataRenderer = useCallback(() => {
40
+ return _jsx(VisibilityTreeNoFilteredData, { title: TreeWidget.translate("modelTree.noModelFound"), message: TreeWidget.translate("modelTree.noMatchingModelNames") });
45
41
  }, []);
46
- return (React.createElement("div", { className: "tree-widget-visibility-tree-base", ref: props.rootElementRef },
47
- React.createElement(ControlledTree, { nodeLoader: filteredNodeLoader, model: treeModel, selectionMode: props.selectionMode || SelectionMode.None, eventsHandler: eventHandler, treeRenderer: treeRenderer, nodeHighlightingProps: nodeHighlightingProps, noDataRenderer: filterApplied ? noFilteredDataRenderer : undefined, onItemsRendered: onItemsRendered, width: props.width, height: props.height }),
48
- overlay));
42
+ return (_jsxs("div", { className: "tree-widget-visibility-tree-base", ref: props.rootElementRef, children: [_jsx(ControlledTree, { nodeLoader: filteredNodeLoader, model: treeModel, selectionMode: props.selectionMode || SelectionMode.None, eventsHandler: eventHandler, treeRenderer: treeRenderer, nodeHighlightingProps: nodeHighlightingProps, noDataRenderer: filterApplied ? noFilteredDataRenderer : undefined, onItemsRendered: onItemsRendered, width: props.width, height: props.height }), overlay] }));
49
43
  }
50
44
  function useModelsTreeNodeLoader(props) {
51
45
  const rulesets = {
52
- general: (!props.enableElementsClassGrouping) ? RULESET_MODELS : /* istanbul ignore next */ RULESET_MODELS_GROUPED_BY_CLASS,
53
- search: RULESET_MODELS_SEARCH,
46
+ general: useMemo(() => createRuleset({
47
+ enableElementsClassGrouping: !!props.hierarchyConfig?.enableElementsClassGrouping,
48
+ elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,
49
+ }), [props.hierarchyConfig?.enableElementsClassGrouping, props.hierarchyConfig?.elementClassSpecification]),
50
+ search: useMemo(() => createSearchRuleset({
51
+ elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,
52
+ }), [props.hierarchyConfig?.elementClassSpecification]),
54
53
  };
55
54
  const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({
56
55
  imodel: props.iModel,
57
56
  ruleset: rulesets.general,
58
- appendChildrenCountForGroupingNodes: (props.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts),
57
+ appendChildrenCountForGroupingNodes: (props.hierarchyConfig?.enableElementsClassGrouping === ClassGroupingOption.YesWithCounts),
59
58
  pagingSize: PAGING_SIZE,
60
59
  enableHierarchyAutoUpdate: props.enableHierarchyAutoUpdate,
61
60
  });
@@ -73,22 +72,14 @@ function useModelsTreeNodeLoader(props) {
73
72
  };
74
73
  }
75
74
  function useVisibilityHandler(rulesetId, iModel, activeView, visibilityHandler, filteredDataProvider, hierarchyAutoUpdateEnabled) {
76
- const subjectModelIdsCache = React.useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);
77
- const defaultVisibilityHandler = useOptionalDisposable(React.useCallback(() => {
78
- if (activeView)
79
- return createVisibilityHandler(rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled);
80
- return undefined;
81
- }, [rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled]));
75
+ const subjectModelIdsCache = useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);
76
+ const defaultVisibilityHandler = useDisposable(useCallback(() => new ModelsVisibilityHandler({ rulesetId, viewport: activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache }), [rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled]));
82
77
  const handler = visibilityHandler ?? defaultVisibilityHandler;
83
- React.useEffect(() => {
78
+ useEffect(() => {
84
79
  handler && handler.setFilteredDataProvider(filteredDataProvider);
85
80
  }, [handler, filteredDataProvider]);
86
81
  return handler;
87
82
  }
88
- const createVisibilityHandler = (rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled) => {
89
- // istanbul ignore next
90
- return new ModelsVisibilityHandler({ rulesetId, viewport: activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache });
91
- };
92
83
  const isFilteredDataProvider = (dataProvider) => {
93
84
  const filteredProvider = dataProvider;
94
85
  return filteredProvider.nodeMatchesFilter !== undefined && filteredProvider.getActiveMatch !== undefined && filteredProvider.countFilteringResults !== undefined;
@@ -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 \"../VisibilityTreeBase.scss\";\nimport * as React from \"react\";\nimport { ControlledTree, SelectionMode, useTreeModel } from \"@itwin/components-react\";\nimport { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport { useDisposable, useOptionalDisposable } from \"@itwin/core-react\";\nimport { Ruleset } from \"@itwin/presentation-common\";\nimport {\n IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider, isPresentationTreeNodeItem, usePresentationTreeNodeLoader,\n} 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\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: (node) => !selectionPredicate || !isPresentationTreeNodeItem(node) ? true : selectionPredicate(node.key, ModelsVisibilityHandler.getNodeType(node)),\n }), [filteredNodeLoader, visibilityHandler, selectionPredicate]));\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-visibility-tree-base\" 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
+ {"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 \"../VisibilityTreeBase.scss\";\nimport { useCallback, useEffect, useMemo } from \"react\";\nimport { ControlledTree, SelectionMode, useTreeModel } from \"@itwin/components-react\";\nimport { useDisposable } from \"@itwin/core-react\";\nimport { isPresentationTreeNodeItem, usePresentationTreeNodeLoader } from \"@itwin/presentation-components\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { ClassGroupingOption } from \"../Common\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { createVisibilityTreeRenderer, useVisibilityTreeFiltering, VisibilityTreeNoFilteredData } from \"../VisibilityTreeRenderer\";\nimport { ModelsVisibilityHandler, SubjectModelIdsCache } from \"./ModelsVisibilityHandler\";\nimport { createRuleset, createSearchRuleset } from \"./Utils\";\n\nimport type { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport type { SingleSchemaClassSpecification } from \"@itwin/presentation-common\";\nimport type { IFilteredPresentationTreeDataProvider, IPresentationTreeDataProvider } from \"@itwin/presentation-components\";\nimport type { VisibilityTreeFilterInfo } from \"../Common\";\nimport type { ModelsTreeSelectionPredicate } from \"./ModelsVisibilityHandler\";\n\nconst PAGING_SIZE = 20;\n\n/**\n * Props for configuring the hierarchy in [[ModelsTree]].\n * @public\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should the tree group displayed element nodes by class. Defaults to `ClassGroupingOption.No`. */\n enableElementsClassGrouping?: ClassGroupingOption;\n /**\n * Defines the `bis.GeometricElement3d` sub-class that should be used to load element nodes.\n * Defaults to `bis.GeometricElement3d`. It's expected for the given class to derive from it.\n */\n elementClassSpecification?: SingleSchemaClassSpecification;\n}\n\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 */\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 */\n filterInfo?: VisibilityTreeFilterInfo;\n /**\n * Callback invoked when tree is filtered.\n */\n onFilterApplied?: (filteredDataProvider: IPresentationTreeDataProvider, matchesCount: number) => void;\n /**\n * Configuration options for the hierarchy loaded in the component.\n */\n hierarchyConfig?: ModelsTreeHierarchyConfiguration;\n /**\n * Auto-update the hierarchy when data in the iModel changes.\n * @alpha\n */\n enableHierarchyAutoUpdate?: boolean;\n /**\n * Custom visibility handler.\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\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(useCallback(() => new VisibilityTreeEventHandler({\n nodeLoader: filteredNodeLoader,\n visibilityHandler,\n selectionPredicate: (node) => !selectionPredicate || !isPresentationTreeNodeItem(node) ? true : selectionPredicate(node.key, ModelsVisibilityHandler.getNodeType(node)),\n }), [filteredNodeLoader, visibilityHandler, selectionPredicate]));\n\n const treeModel = useTreeModel(filteredNodeLoader.modelSource);\n const treeRenderer = createVisibilityTreeRenderer({ iconsEnabled: true, descriptionEnabled: false, levelOffset: 10, disableRootNodeCollapse: true });\n\n const overlay = isFiltering ? <div className=\"filteredTreeOverlay\" /> : undefined;\n\n // istanbul ignore next\n const noFilteredDataRenderer = 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-visibility-tree-base\" 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: useMemo(() => createRuleset({\n enableElementsClassGrouping: !!props.hierarchyConfig?.enableElementsClassGrouping,\n elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,\n }), [props.hierarchyConfig?.enableElementsClassGrouping, props.hierarchyConfig?.elementClassSpecification]),\n search: useMemo(() => createSearchRuleset({\n elementClassSpecification: props.hierarchyConfig?.elementClassSpecification,\n }), [props.hierarchyConfig?.elementClassSpecification]),\n };\n\n const { nodeLoader, onItemsRendered } = usePresentationTreeNodeLoader({\n imodel: props.iModel,\n ruleset: rulesets.general,\n appendChildrenCountForGroupingNodes: (props.hierarchyConfig?.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 = useMemo(() => new SubjectModelIdsCache(iModel), [iModel]);\n\n const defaultVisibilityHandler = useDisposable(useCallback(\n () =>\n new ModelsVisibilityHandler({ rulesetId, viewport: activeView, hierarchyAutoUpdateEnabled, subjectModelIdsCache }),\n [rulesetId, activeView, subjectModelIdsCache, hierarchyAutoUpdateEnabled])\n );\n\n const handler = visibilityHandler ?? defaultVisibilityHandler;\n\n useEffect(() => {\n handler && handler.setFilteredDataProvider(filteredDataProvider);\n }, [handler, filteredDataProvider]);\n\n return handler;\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,17 +1,85 @@
1
1
  /// <reference types="react" />
2
2
  import "../VisibilityTreeBase.scss";
3
- import { ModelsTreeHeaderButtonProps, ModelTreeProps } from "../../../types";
3
+ import type { TreeHeaderButtonProps } from "../../tree-header/TreeHeader";
4
+ import type { ModelsTreeProps } from "./ModelsTree";
5
+ /**
6
+ * Information about a single Model.
7
+ * @public
8
+ */
4
9
  export interface ModelInfo {
5
10
  id: string;
6
11
  isPlanProjection?: boolean;
7
12
  }
13
+ /**
14
+ * Props that get passed to [[ModelsTreeComponent]] header button renderer.
15
+ * @see ModelTreeComponentProps.headerButtons
16
+ * @public
17
+ */
18
+ export interface ModelsTreeHeaderButtonProps extends TreeHeaderButtonProps {
19
+ /** A list of models available in the iModel. */
20
+ models: ModelInfo[];
21
+ }
22
+ /**
23
+ * Props for [[ModelsTreeComponent]].
24
+ * @public
25
+ */
26
+ export interface ModelTreeComponentProps extends Omit<ModelsTreeProps, "iModel" | "activeView" | "width" | "height" | "filterInfo" | "onFilterApplied"> {
27
+ /**
28
+ * Renderers of header buttons. Defaults to:
29
+ * ```ts
30
+ * [
31
+ * ModelsTreeComponent.ShowAllButton,
32
+ * ModelsTreeComponent.HideAllButton,
33
+ * ModelsTreeComponent.InvertButton,
34
+ * ModelsTreeComponent.View2DButton,
35
+ * ModelsTreeComponent.View3DButton,
36
+ * ]
37
+ * ```
38
+ */
39
+ headerButtons?: Array<(props: ModelsTreeHeaderButtonProps) => React.ReactNode>;
40
+ }
41
+ /**
42
+ * A component that renders [[ModelsTree]] and a header with filtering capabilities
43
+ * and header buttons.
44
+ * @public
45
+ */
8
46
  export declare const ModelsTreeComponent: {
9
- (props: ModelTreeProps): JSX.Element | null;
47
+ (props: ModelTreeComponentProps): JSX.Element | null;
48
+ /**
49
+ * Renders a "Show all" button that enables display of all models.
50
+ * @public
51
+ */
10
52
  ShowAllButton: typeof ShowAllButton;
53
+ /**
54
+ * Renders a "Hide all" button that disables display of all models.
55
+ * @public
56
+ */
11
57
  HideAllButton: typeof HideAllButton;
58
+ /**
59
+ * Renders an "Invert all" button that inverts display of all models.
60
+ * @public
61
+ */
12
62
  InvertButton: typeof InvertButton;
63
+ /**
64
+ * Renders a "View 2D" button that enables display of all plan projection models and disables all others.
65
+ * @public
66
+ */
13
67
  View2DButton: typeof View2DButton;
68
+ /**
69
+ * Renders a "View 3D" button that enables display of all non-plan projection models and disables all plan projection ones.
70
+ * @public
71
+ */
14
72
  View3DButton: typeof View3DButton;
73
+ /**
74
+ * Id of the component. May be used when a creating a [[TreeDefinition]] for [[TreeWidgetComponent]].
75
+ * @public
76
+ */
77
+ id: string;
78
+ /**
79
+ * Label of the component. May be used when a creating a [[TreeDefinition]] for [[TreeWidgetComponent]].
80
+ * @public
81
+ */
82
+ getLabel(): string;
15
83
  };
16
84
  declare function ShowAllButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
17
85
  declare function HideAllButton(props: ModelsTreeHeaderButtonProps): JSX.Element;
@@ -1,146 +1,128 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  /*---------------------------------------------------------------------------------------------
2
3
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
5
  *--------------------------------------------------------------------------------------------*/
5
6
  import "../VisibilityTreeBase.scss";
6
- import React, { useCallback, useEffect, useMemo, useState } from "react";
7
+ import { Fragment, useCallback, useEffect, useMemo, useState } from "react";
7
8
  import { useActiveIModelConnection, useActiveViewport } from "@itwin/appui-react";
8
- import { IModelApp } from "@itwin/core-frontend";
9
9
  import { SvgVisibilityHalf, SvgVisibilityHide, SvgVisibilityShow } from "@itwin/itwinui-icons-react";
10
10
  import { Button, IconButton } from "@itwin/itwinui-react";
11
+ import { TreeWidget } from "../../../TreeWidget";
12
+ import { TreeHeader } from "../../tree-header/TreeHeader";
11
13
  import { useTreeFilteringState } from "../../TreeFilteringState";
12
14
  import { AutoSizer } from "../../utils/AutoSizer";
13
- import { toggleAllCategories } from "../CategoriesVisibilityUtils";
14
15
  import { ModelsTree } from "./ModelsTree";
15
- import { TreeWidget } from "../../../TreeWidget";
16
- import { SearchBar } from "../../search-bar/SearchBar";
16
+ import { areAllModelsVisible, hideAllModels, invertAllModels, showAllModels, toggleModels } from "./ModelsVisibilityHandler";
17
+ /**
18
+ * A component that renders [[ModelsTree]] and a header with filtering capabilities
19
+ * and header buttons.
20
+ * @public
21
+ */
17
22
  export const ModelsTreeComponent = (props) => {
18
23
  const iModel = useActiveIModelConnection();
19
24
  const viewport = useActiveViewport();
20
25
  if (!iModel || !viewport)
21
26
  return null;
22
- return (React.createElement(ModelsTreeComponentImpl, { ...props, iModel: iModel, viewport: viewport }));
27
+ return (_jsx(ModelsTreeComponentImpl, { ...props, iModel: iModel, viewport: viewport }));
23
28
  };
29
+ /**
30
+ * Renders a "Show all" button that enables display of all models.
31
+ * @public
32
+ */
24
33
  ModelsTreeComponent.ShowAllButton = ShowAllButton;
34
+ /**
35
+ * Renders a "Hide all" button that disables display of all models.
36
+ * @public
37
+ */
25
38
  ModelsTreeComponent.HideAllButton = HideAllButton;
39
+ /**
40
+ * Renders an "Invert all" button that inverts display of all models.
41
+ * @public
42
+ */
26
43
  ModelsTreeComponent.InvertButton = InvertButton;
44
+ /**
45
+ * Renders a "View 2D" button that enables display of all plan projection models and disables all others.
46
+ * @public
47
+ */
27
48
  ModelsTreeComponent.View2DButton = View2DButton;
49
+ /**
50
+ * Renders a "View 3D" button that enables display of all non-plan projection models and disables all plan projection ones.
51
+ * @public
52
+ */
28
53
  ModelsTreeComponent.View3DButton = View3DButton;
54
+ /**
55
+ * Id of the component. May be used when a creating a [[TreeDefinition]] for [[TreeWidgetComponent]].
56
+ * @public
57
+ */
58
+ ModelsTreeComponent.id = "models-tree";
59
+ /**
60
+ * Label of the component. May be used when a creating a [[TreeDefinition]] for [[TreeWidgetComponent]].
61
+ * @public
62
+ */
63
+ ModelsTreeComponent.getLabel = () => TreeWidget.translate("models");
29
64
  function ModelsTreeComponentImpl(props) {
30
65
  const [availableModels, setAvailableModels] = useState([]);
31
66
  const { viewport, iModel } = props;
32
- const { searchOptions, filterString, activeMatchIndex, onFilterApplied } = useTreeFilteringState();
33
- const queryModels = useCallback(async (vp) => {
34
- if (vp === undefined)
35
- return [];
67
+ const { searchOptions, filterString, onFilterApplied } = useTreeFilteringState();
68
+ const queryModels = useCallback(async () => {
36
69
  const queryParams = {
37
70
  from: "BisCore.GeometricModel3d",
38
71
  wantPrivate: false,
39
72
  };
40
- const modelProps = await iModel.models.queryProps(queryParams) ?? [];
73
+ const modelProps = await iModel.models.queryProps(queryParams);
41
74
  return modelProps
42
75
  .map(({ id, isPlanProjection }) => ({ id, isPlanProjection }))
43
76
  .filter(({ id }) => id);
44
77
  }, [iModel]);
45
78
  useEffect(() => {
46
- queryModels(viewport)
79
+ queryModels()
47
80
  .then((modelInfos) => {
48
81
  setAvailableModels(modelInfos);
49
82
  })
50
83
  .catch((_e) => {
51
84
  setAvailableModels([]);
52
85
  });
53
- }, [queryModels, viewport]);
54
- return (React.createElement(React.Fragment, null,
55
- React.createElement(SearchBar, { value: "", valueChangedDelay: 500, placeholder: TreeWidget.translate("search"), title: TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: searchOptions.matchedResultCount ?? 0 }, props.headerButtons
56
- ? props.headerButtons.map((btn, index) => React.createElement(React.Fragment, { key: index }, btn({ viewport, models: availableModels })))
57
- : [
58
- React.createElement(ShowAllButton, { viewport: viewport, models: availableModels, key: "show-all-btn" }),
59
- React.createElement(HideAllButton, { viewport: viewport, models: availableModels, key: "hide-all-btn" }),
60
- React.createElement(InvertButton, { viewport: viewport, models: availableModels, key: "invert-all-btn" }),
61
- React.createElement(View2DButton, { viewport: viewport, models: availableModels, key: "view-2d-btn" }),
62
- React.createElement(View3DButton, { viewport: viewport, models: availableModels, key: "view-3d-btn" }),
63
- ]),
64
- React.createElement(AutoSizer, null, ({ width, height }) => (React.createElement(ModelsTree, { ...props, iModel: iModel, activeView: viewport, width: width, height: height, filterInfo: { filter: filterString, activeMatchIndex }, onFilterApplied: onFilterApplied })))));
86
+ }, [queryModels]);
87
+ return (_jsxs("div", { className: "tree-widget-tree-with-header", children: [_jsx(TreeHeader, { onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: searchOptions.matchedResultCount, selectedIndex: searchOptions.activeMatchIndex, children: props.headerButtons
88
+ ? props.headerButtons.map((btn, index) => _jsx(Fragment, { children: btn({ viewport, models: availableModels }) }, index))
89
+ : [
90
+ _jsx(ShowAllButton, { viewport: viewport, models: availableModels }, "show-all-btn"),
91
+ _jsx(HideAllButton, { viewport: viewport, models: availableModels }, "hide-all-btn"),
92
+ _jsx(InvertButton, { viewport: viewport, models: availableModels }, "invert-all-btn"),
93
+ _jsx(View2DButton, { viewport: viewport, models: availableModels }, "view-2d-btn"),
94
+ _jsx(View3DButton, { viewport: viewport, models: availableModels }, "view-3d-btn"),
95
+ ] }), _jsx("div", { className: "tree-widget-tree-content", children: _jsx(AutoSizer, { children: ({ width, height }) => (_jsx(ModelsTree, { ...props, iModel: iModel, activeView: viewport, width: width, height: height, filterInfo: { filter: filterString, activeMatchIndex: searchOptions.activeMatchIndex }, onFilterApplied: onFilterApplied })) }) })] }));
65
96
  }
66
97
  function ShowAllButton(props) {
67
- const showAll = async () => {
68
- if (!props.viewport)
69
- return;
70
- await props.viewport.addViewedModels(props.models.map((model) => model.id));
71
- props.viewport.clearNeverDrawn();
72
- props.viewport.clearAlwaysDrawn();
73
- if (props.viewport.iModel) {
74
- await toggleAllCategories(IModelApp.viewManager, props.viewport.iModel, true, props.viewport, false);
75
- }
76
- };
77
- return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", size: "small", styleType: "borderless", title: TreeWidget.translate("showAll"), onClick: showAll },
78
- React.createElement(SvgVisibilityShow, null)));
98
+ return (_jsx(IconButton, { size: "small", styleType: "borderless", title: TreeWidget.translate("showAll"), onClick: () => void showAllModels(props.models.map((model) => model.id), props.viewport), children: _jsx(SvgVisibilityShow, {}) }));
79
99
  }
80
100
  function HideAllButton(props) {
81
- const hideAll = async () => {
82
- props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);
83
- };
84
- return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", size: "small", styleType: "borderless", title: TreeWidget.translate("hideAll"), onClick: hideAll },
85
- React.createElement(SvgVisibilityHide, null)));
101
+ return (_jsx(IconButton, { size: "small", styleType: "borderless", title: TreeWidget.translate("hideAll"), onClick: () => void hideAllModels(props.models.map((model) => model.id), props.viewport), children: _jsx(SvgVisibilityHide, {}) }));
86
102
  }
87
103
  function InvertButton(props) {
88
- const invert = async () => {
89
- const notViewedModels = [];
90
- const models = [];
91
- props.models.forEach((model) => {
92
- if (props.viewport.viewsModel(model.id))
93
- models.push(model.id);
94
- else
95
- notViewedModels.push(model.id);
96
- });
97
- await props.viewport.addViewedModels(notViewedModels);
98
- props.viewport.changeModelDisplay(models, false);
99
- };
100
- return (React.createElement(IconButton, { className: "tree-widget-header-tree-toolbar-icon", size: "small", styleType: "borderless", title: TreeWidget.translate("invert"), onClick: invert },
101
- React.createElement(SvgVisibilityHalf, null)));
104
+ return (_jsx(IconButton, { size: "small", styleType: "borderless", title: TreeWidget.translate("invert"), onClick: () => void invertAllModels(props.models.map((model) => model.id), props.viewport), children: _jsx(SvgVisibilityHalf, {}) }));
102
105
  }
103
106
  function View2DButton(props) {
104
107
  const models2d = useMemo(() => {
105
108
  return props.models.filter((model) => model.isPlanProjection).map((model) => model.id);
106
109
  }, [props.models]);
107
- const [is2dToggleActive, setIs2dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models2d));
110
+ const [is2dToggleActive, setIs2dToggleActive] = useState(false);
108
111
  useEffect(() => {
109
- return props.viewport.onViewedModelsChanged.addListener(() => setIs2dToggleActive(areAllModelsVisible(props.viewport, models2d)));
112
+ setIs2dToggleActive(areAllModelsVisible(models2d, props.viewport));
113
+ return props.viewport.onViewedModelsChanged.addListener((vp) => setIs2dToggleActive(areAllModelsVisible(models2d, vp)));
110
114
  }, [models2d, props.viewport]);
111
- const viewToggle2D = async () => {
112
- if (!models2d)
113
- return;
114
- if (is2dToggleActive) {
115
- props.viewport.changeModelDisplay(models2d, false);
116
- }
117
- else {
118
- await props.viewport.addViewedModels(models2d);
119
- }
120
- };
121
- return (React.createElement(Button, { className: "tree-widget-header-tree-toolbar-icon", size: "small", styleType: "borderless", title: TreeWidget.translate("toggle2DViews"), onClick: viewToggle2D, disabled: models2d.length === 0, endIcon: is2dToggleActive ? React.createElement(SvgVisibilityShow, null) : React.createElement(SvgVisibilityHide, null) }, TreeWidget.translate("label2D")));
115
+ return (_jsx(Button, { size: "small", styleType: "borderless", title: TreeWidget.translate("toggle2DViews"), onClick: () => void toggleModels(models2d, is2dToggleActive, props.viewport), disabled: models2d.length === 0, endIcon: is2dToggleActive ? _jsx(SvgVisibilityShow, {}) : _jsx(SvgVisibilityHide, {}), children: TreeWidget.translate("label2D") }));
122
116
  }
123
117
  function View3DButton(props) {
124
118
  const models3d = useMemo(() => {
125
119
  return props.models.filter((model) => !model.isPlanProjection).map((model) => model.id);
126
120
  }, [props.models]);
127
- const [is3dToggleActive, setIs3dToggleActive] = useState(() => areAllModelsVisible(props.viewport, models3d));
121
+ const [is3dToggleActive, setIs3dToggleActive] = useState(false);
128
122
  useEffect(() => {
129
- return props.viewport.onViewedModelsChanged.addListener(() => setIs3dToggleActive(areAllModelsVisible(props.viewport, models3d)));
123
+ setIs3dToggleActive(areAllModelsVisible(models3d, props.viewport));
124
+ return props.viewport.onViewedModelsChanged.addListener((vp) => setIs3dToggleActive(areAllModelsVisible(models3d, vp)));
130
125
  }, [models3d, props.viewport]);
131
- const viewToggle3D = async () => {
132
- if (!models3d)
133
- return;
134
- if (is3dToggleActive) {
135
- props.viewport.changeModelDisplay(models3d, false);
136
- }
137
- else {
138
- await props.viewport.addViewedModels(models3d);
139
- }
140
- };
141
- return (React.createElement(Button, { className: "tree-widget-header-tree-toolbar-icon", size: "small", styleType: "borderless", title: TreeWidget.translate("toggle3DViews"), onClick: viewToggle3D, disabled: models3d.length === 0, endIcon: is3dToggleActive ? React.createElement(SvgVisibilityShow, null) : React.createElement(SvgVisibilityHide, null) }, TreeWidget.translate("label3D")));
142
- }
143
- function areAllModelsVisible(viewport, models) {
144
- return models.length !== 0 ? models.every((id) => viewport.viewsModel(id)) : false;
126
+ return (_jsx(Button, { size: "small", styleType: "borderless", title: TreeWidget.translate("toggle3DViews"), onClick: () => void toggleModels(models3d, is3dToggleActive, props.viewport), disabled: models3d.length === 0, endIcon: is3dToggleActive ? _jsx(SvgVisibilityShow, {}) : _jsx(SvgVisibilityHide, {}), children: TreeWidget.translate("label3D") }));
145
127
  }
146
128
  //# 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 \"../VisibilityTreeBase.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 { SvgVisibilityHalf, SvgVisibilityHide, SvgVisibilityShow } from \"@itwin/itwinui-icons-react\";\nimport { Button, IconButton } from \"@itwin/itwinui-react\";\nimport { ModelsTreeHeaderButtonProps, ModelTreeProps } from \"../../../types\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { toggleAllCategories } from \"../CategoriesVisibilityUtils\";\nimport { ModelsTree } from \"./ModelsTree\";\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 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 };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n >\n <SvgVisibilityShow />\n </IconButton>\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n const hideAll = async () => {\n props.viewport.changeModelDisplay(props.models.map((model) => model.id), false);\n };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n >\n <SvgVisibilityHide />\n </IconButton>\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 };\n\n return (\n <IconButton\n className=\"tree-widget-header-tree-toolbar-icon\"\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"invert\")}\n onClick={invert}\n >\n <SvgVisibilityHalf />\n </IconButton>\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 };\n\n return (\n <Button\n className=\"tree-widget-header-tree-toolbar-icon\"\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={viewToggle2D}\n disabled={models2d.length === 0}\n endIcon={is2dToggleActive ? <SvgVisibilityShow /> : <SvgVisibilityHide />}\n >\n {TreeWidget.translate(\"label2D\")}\n </Button>\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 };\n\n return (\n <Button\n className=\"tree-widget-header-tree-toolbar-icon\"\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={viewToggle3D}\n disabled={models3d.length === 0}\n endIcon={is3dToggleActive ? <SvgVisibilityShow /> : <SvgVisibilityHide />}\n >\n {TreeWidget.translate(\"label3D\")}\n </Button>\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
+ {"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 \"../VisibilityTreeBase.scss\";\nimport { Fragment, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useActiveIModelConnection, useActiveViewport } from \"@itwin/appui-react\";\nimport { SvgVisibilityHalf, SvgVisibilityHide, SvgVisibilityShow } from \"@itwin/itwinui-icons-react\";\nimport { Button, IconButton } from \"@itwin/itwinui-react\";\nimport { TreeWidget } from \"../../../TreeWidget\";\nimport { TreeHeader } from \"../../tree-header/TreeHeader\";\nimport { useTreeFilteringState } from \"../../TreeFilteringState\";\nimport { AutoSizer } from \"../../utils/AutoSizer\";\nimport { ModelsTree } from \"./ModelsTree\";\nimport { areAllModelsVisible, hideAllModels, invertAllModels, showAllModels, toggleModels } from \"./ModelsVisibilityHandler\";\n\nimport type { GeometricModel3dProps, ModelQueryParams } from \"@itwin/core-common\";\nimport type { IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport type { TreeHeaderButtonProps } from \"../../tree-header/TreeHeader\";\nimport type { ModelsTreeProps } from \"./ModelsTree\";\n\n/**\n * Information about a single Model.\n * @public\n */\nexport interface ModelInfo {\n id: string;\n isPlanProjection?: boolean;\n}\n\n/**\n * Props that get passed to [[ModelsTreeComponent]] header button renderer.\n * @see ModelTreeComponentProps.headerButtons\n * @public\n */\nexport interface ModelsTreeHeaderButtonProps extends TreeHeaderButtonProps {\n /** A list of models available in the iModel. */\n models: ModelInfo[];\n}\n\n/**\n * Props for [[ModelsTreeComponent]].\n * @public\n */\nexport interface ModelTreeComponentProps extends Omit<ModelsTreeProps,\n| \"iModel\"\n| \"activeView\"\n| \"width\"\n| \"height\"\n| \"filterInfo\"\n| \"onFilterApplied\"\n> {\n /**\n * Renderers of header buttons. Defaults to:\n * ```ts\n * [\n * ModelsTreeComponent.ShowAllButton,\n * ModelsTreeComponent.HideAllButton,\n * ModelsTreeComponent.InvertButton,\n * ModelsTreeComponent.View2DButton,\n * ModelsTreeComponent.View3DButton,\n * ]\n * ```\n */\n headerButtons?: Array<(props: ModelsTreeHeaderButtonProps) => React.ReactNode>;\n}\n\n/**\n * A component that renders [[ModelsTree]] and a header with filtering capabilities\n * and header buttons.\n * @public\n */\nexport const ModelsTreeComponent = (props: ModelTreeComponentProps) => {\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\n/**\n * Renders a \"Show all\" button that enables display of all models.\n * @public\n */\nModelsTreeComponent.ShowAllButton = ShowAllButton;\n\n/**\n * Renders a \"Hide all\" button that disables display of all models.\n * @public\n */\nModelsTreeComponent.HideAllButton = HideAllButton;\n\n/**\n * Renders an \"Invert all\" button that inverts display of all models.\n * @public\n */\nModelsTreeComponent.InvertButton = InvertButton;\n\n/**\n * Renders a \"View 2D\" button that enables display of all plan projection models and disables all others.\n * @public\n */\nModelsTreeComponent.View2DButton = View2DButton;\n\n/**\n * Renders a \"View 3D\" button that enables display of all non-plan projection models and disables all plan projection ones.\n * @public\n */\nModelsTreeComponent.View3DButton = View3DButton;\n\n/**\n * Id of the component. May be used when a creating a [[TreeDefinition]] for [[TreeWidgetComponent]].\n * @public\n */\nModelsTreeComponent.id = \"models-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[TreeWidgetComponent]].\n * @public\n */\nModelsTreeComponent.getLabel = () => TreeWidget.translate(\"models\");\n\nfunction ModelsTreeComponentImpl(props: ModelTreeComponentProps & { iModel: IModelConnection, viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n\n const { viewport, iModel } = props;\n\n const { searchOptions, filterString, onFilterApplied } = useTreeFilteringState();\n\n const queryModels = useCallback(async (): Promise<ModelInfo[]> => {\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()\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [queryModels]);\n\n return (\n <div className=\"tree-widget-tree-with-header\">\n <TreeHeader\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount}\n selectedIndex={searchOptions.activeMatchIndex}\n >\n {props.headerButtons\n ? props.headerButtons.map(\n (btn, index) =>\n <Fragment key={index}>\n {btn({ viewport, models: availableModels })}\n </Fragment>\n )\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 </TreeHeader>\n <div className=\"tree-widget-tree-content\">\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: searchOptions.activeMatchIndex }}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </div>\n </div>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={() => void showAllModels(props.models.map((model) => model.id), props.viewport)}\n >\n <SvgVisibilityShow />\n </IconButton>\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={() => void hideAllModels(props.models.map((model) => model.id), props.viewport)}\n >\n <SvgVisibilityHide />\n </IconButton>\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"invert\")}\n onClick={() => void invertAllModels(props.models.map((model) => model.id), props.viewport)}\n >\n <SvgVisibilityHalf />\n </IconButton>\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(false);\n\n useEffect(() => {\n setIs2dToggleActive(areAllModelsVisible(models2d, props.viewport));\n return props.viewport.onViewedModelsChanged.addListener((vp: Viewport) => setIs2dToggleActive(areAllModelsVisible(models2d, vp)));\n }, [models2d, props.viewport]);\n\n return (\n <Button\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={() => void toggleModels(models2d, is2dToggleActive, props.viewport)}\n disabled={models2d.length === 0}\n endIcon={is2dToggleActive ? <SvgVisibilityShow /> : <SvgVisibilityHide />}\n >\n {TreeWidget.translate(\"label2D\")}\n </Button>\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(false);\n\n useEffect(() => {\n setIs3dToggleActive(areAllModelsVisible(models3d, props.viewport));\n return props.viewport.onViewedModelsChanged.addListener((vp: Viewport) => setIs3dToggleActive(areAllModelsVisible(models3d, vp)));\n }, [models3d, props.viewport]);\n\n return (\n <Button\n size=\"small\"\n styleType=\"borderless\"\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={() => void toggleModels(models3d, is3dToggleActive, props.viewport)}\n disabled={models3d.length === 0}\n endIcon={is3dToggleActive ? <SvgVisibilityShow /> : <SvgVisibilityHide />}\n >\n {TreeWidget.translate(\"label3D\")}\n </Button>\n );\n}\n"]}