@itwin/tree-widget-react 2.0.2 → 2.2.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 (111) hide show
  1. package/CHANGELOG.md +22 -2
  2. package/README.md +105 -0
  3. package/lib/cjs/components/SelectableTree.d.ts +4 -0
  4. package/lib/cjs/components/SelectableTree.js +1 -1
  5. package/lib/cjs/components/SelectableTree.js.map +1 -1
  6. package/lib/cjs/components/TreeSelector.d.ts +2 -0
  7. package/lib/cjs/components/TreeSelector.js +4 -1
  8. package/lib/cjs/components/TreeSelector.js.map +1 -1
  9. package/lib/cjs/components/TreeWidgetUiItemsProvider.d.ts +4 -0
  10. package/lib/cjs/components/TreeWidgetUiItemsProvider.js +7 -7
  11. package/lib/cjs/components/TreeWidgetUiItemsProvider.js.map +1 -1
  12. package/lib/cjs/components/tree-header/TreeHeader.d.ts +1 -0
  13. package/lib/cjs/components/tree-header/TreeHeader.js.map +1 -1
  14. package/lib/cjs/components/trees/VisibilityTreeEventHandler.js +6 -4
  15. package/lib/cjs/components/trees/VisibilityTreeEventHandler.js.map +1 -1
  16. package/lib/cjs/components/trees/VisibilityTreeRenderer.d.ts +11 -3
  17. package/lib/cjs/components/trees/VisibilityTreeRenderer.js +8 -5
  18. package/lib/cjs/components/trees/VisibilityTreeRenderer.js.map +1 -1
  19. package/lib/cjs/components/trees/category-tree/CategoriesTree.d.ts +13 -0
  20. package/lib/cjs/components/trees/category-tree/CategoriesTree.js +14 -2
  21. package/lib/cjs/components/trees/category-tree/CategoriesTree.js.map +1 -1
  22. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js +17 -8
  23. package/lib/cjs/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  24. package/lib/cjs/components/trees/common/ReportingTreeEventHandler.d.ts +27 -0
  25. package/lib/cjs/components/trees/common/ReportingTreeEventHandler.js +51 -0
  26. package/lib/cjs/components/trees/common/ReportingTreeEventHandler.js.map +1 -0
  27. package/lib/cjs/components/trees/common/TreeRenderer.d.ts +17 -2
  28. package/lib/cjs/components/trees/common/TreeRenderer.js +19 -3
  29. package/lib/cjs/components/trees/common/TreeRenderer.js.map +1 -1
  30. package/lib/cjs/components/trees/common/TreeRenderer.scss +1 -1
  31. package/lib/cjs/components/trees/common/UseFeatureReporting.d.ts +23 -0
  32. package/lib/cjs/components/trees/common/UseFeatureReporting.js +30 -0
  33. package/lib/cjs/components/trees/common/UseFeatureReporting.js.map +1 -0
  34. package/lib/cjs/components/trees/common/UsePerformanceReporting.d.ts +18 -0
  35. package/lib/cjs/components/trees/common/UsePerformanceReporting.js +25 -0
  36. package/lib/cjs/components/trees/common/UsePerformanceReporting.js.map +1 -0
  37. package/lib/cjs/components/trees/common/UseVisibilityTreeState.d.ts +8 -1
  38. package/lib/cjs/components/trees/common/UseVisibilityTreeState.js +5 -3
  39. package/lib/cjs/components/trees/common/UseVisibilityTreeState.js.map +1 -1
  40. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +13 -0
  41. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js +21 -5
  42. package/lib/cjs/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  43. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.d.ts +13 -0
  44. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js +22 -1
  45. package/lib/cjs/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  46. package/lib/cjs/components/trees/models-tree/ModelsTree.d.ts +13 -0
  47. package/lib/cjs/components/trees/models-tree/ModelsTree.js +24 -10
  48. package/lib/cjs/components/trees/models-tree/ModelsTree.js.map +1 -1
  49. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js +27 -12
  50. package/lib/cjs/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  51. package/lib/cjs/components/trees/models-tree/ModelsTreeEventHandler.d.ts +10 -0
  52. package/lib/cjs/components/trees/models-tree/ModelsTreeEventHandler.js +5 -0
  53. package/lib/cjs/components/trees/models-tree/ModelsTreeEventHandler.js.map +1 -1
  54. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.d.ts +4 -1
  55. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js +43 -28
  56. package/lib/cjs/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  57. package/lib/esm/components/SelectableTree.d.ts +4 -0
  58. package/lib/esm/components/SelectableTree.js +1 -1
  59. package/lib/esm/components/SelectableTree.js.map +1 -1
  60. package/lib/esm/components/TreeSelector.d.ts +2 -0
  61. package/lib/esm/components/TreeSelector.js +4 -1
  62. package/lib/esm/components/TreeSelector.js.map +1 -1
  63. package/lib/esm/components/TreeWidgetUiItemsProvider.d.ts +4 -0
  64. package/lib/esm/components/TreeWidgetUiItemsProvider.js +7 -7
  65. package/lib/esm/components/TreeWidgetUiItemsProvider.js.map +1 -1
  66. package/lib/esm/components/tree-header/TreeHeader.d.ts +1 -0
  67. package/lib/esm/components/tree-header/TreeHeader.js.map +1 -1
  68. package/lib/esm/components/trees/VisibilityTreeEventHandler.js +7 -5
  69. package/lib/esm/components/trees/VisibilityTreeEventHandler.js.map +1 -1
  70. package/lib/esm/components/trees/VisibilityTreeRenderer.d.ts +11 -3
  71. package/lib/esm/components/trees/VisibilityTreeRenderer.js +8 -5
  72. package/lib/esm/components/trees/VisibilityTreeRenderer.js.map +1 -1
  73. package/lib/esm/components/trees/category-tree/CategoriesTree.d.ts +13 -0
  74. package/lib/esm/components/trees/category-tree/CategoriesTree.js +14 -2
  75. package/lib/esm/components/trees/category-tree/CategoriesTree.js.map +1 -1
  76. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js +17 -8
  77. package/lib/esm/components/trees/category-tree/CategoriesTreeComponent.js.map +1 -1
  78. package/lib/esm/components/trees/common/ReportingTreeEventHandler.d.ts +27 -0
  79. package/lib/esm/components/trees/common/ReportingTreeEventHandler.js +47 -0
  80. package/lib/esm/components/trees/common/ReportingTreeEventHandler.js.map +1 -0
  81. package/lib/esm/components/trees/common/TreeRenderer.d.ts +17 -2
  82. package/lib/esm/components/trees/common/TreeRenderer.js +19 -3
  83. package/lib/esm/components/trees/common/TreeRenderer.js.map +1 -1
  84. package/lib/esm/components/trees/common/TreeRenderer.scss +1 -1
  85. package/lib/esm/components/trees/common/UseFeatureReporting.d.ts +23 -0
  86. package/lib/esm/components/trees/common/UseFeatureReporting.js +26 -0
  87. package/lib/esm/components/trees/common/UseFeatureReporting.js.map +1 -0
  88. package/lib/esm/components/trees/common/UsePerformanceReporting.d.ts +18 -0
  89. package/lib/esm/components/trees/common/UsePerformanceReporting.js +21 -0
  90. package/lib/esm/components/trees/common/UsePerformanceReporting.js.map +1 -0
  91. package/lib/esm/components/trees/common/UseVisibilityTreeState.d.ts +8 -1
  92. package/lib/esm/components/trees/common/UseVisibilityTreeState.js +5 -3
  93. package/lib/esm/components/trees/common/UseVisibilityTreeState.js.map +1 -1
  94. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +13 -0
  95. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js +22 -6
  96. package/lib/esm/components/trees/external-sources-tree/ExternalSourcesTree.js.map +1 -1
  97. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.d.ts +13 -0
  98. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js +23 -2
  99. package/lib/esm/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  100. package/lib/esm/components/trees/models-tree/ModelsTree.d.ts +13 -0
  101. package/lib/esm/components/trees/models-tree/ModelsTree.js +24 -10
  102. package/lib/esm/components/trees/models-tree/ModelsTree.js.map +1 -1
  103. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js +27 -12
  104. package/lib/esm/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  105. package/lib/esm/components/trees/models-tree/ModelsTreeEventHandler.d.ts +10 -0
  106. package/lib/esm/components/trees/models-tree/ModelsTreeEventHandler.js +5 -0
  107. package/lib/esm/components/trees/models-tree/ModelsTreeEventHandler.js.map +1 -1
  108. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.d.ts +4 -1
  109. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js +43 -28
  110. package/lib/esm/components/trees/models-tree/ModelsVisibilityHandler.js.map +1 -1
  111. package/package.json +20 -20
@@ -10,6 +10,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
10
10
  * See LICENSE.md in the project root for license terms and full copyright notice.
11
11
  *--------------------------------------------------------------------------------------------*/
12
12
  require("../VisibilityTreeBase.scss");
13
+ const classnames_1 = __importDefault(require("classnames"));
13
14
  const react_1 = require("react");
14
15
  const appui_react_1 = require("@itwin/appui-react");
15
16
  const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
@@ -21,7 +22,6 @@ const AutoSizer_1 = require("../../utils/AutoSizer");
21
22
  const ModelsTree_1 = require("./ModelsTree");
22
23
  const ModelsVisibilityHandler_1 = require("./ModelsVisibilityHandler");
23
24
  const Utils_1 = require("./Utils");
24
- const classnames_1 = __importDefault(require("classnames"));
25
25
  /**
26
26
  * A component that renders [[ModelsTree]] and a header with filtering capabilities
27
27
  * and header buttons.
@@ -87,23 +87,32 @@ function ModelsTreeComponentImpl(props) {
87
87
  }, [iModel]);
88
88
  const filterInfo = (0, react_1.useMemo)(() => ({ filter: filterString, activeMatchIndex: searchOptions.activeMatchIndex }), [filterString, searchOptions.activeMatchIndex]);
89
89
  return ((0, jsx_runtime_1.jsxs)("div", { className: "tree-widget-tree-with-header", children: [(0, jsx_runtime_1.jsx)(TreeHeader_1.TreeHeader, { onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: searchOptions.matchedResultCount, selectedIndex: searchOptions.activeMatchIndex, density: props.density, children: props.headerButtons
90
- ? props.headerButtons.map((btn, index) => (0, jsx_runtime_1.jsx)(react_1.Fragment, { children: btn({ viewport, models: availableModels }) }, index))
90
+ ? props.headerButtons.map((btn, index) => ((0, jsx_runtime_1.jsx)(react_1.Fragment, { children: btn({ viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed }) }, index)))
91
91
  : [
92
- (0, jsx_runtime_1.jsx)(ShowAllButton, { viewport: viewport, models: availableModels, density: props.density }, "show-all-btn"),
93
- (0, jsx_runtime_1.jsx)(HideAllButton, { viewport: viewport, models: availableModels, density: props.density }, "hide-all-btn"),
94
- (0, jsx_runtime_1.jsx)(InvertButton, { viewport: viewport, models: availableModels, density: props.density }, "invert-all-btn"),
95
- (0, jsx_runtime_1.jsx)(View2DButton, { viewport: viewport, models: availableModels, density: props.density }, "view-2d-btn"),
96
- (0, jsx_runtime_1.jsx)(View3DButton, { viewport: viewport, models: availableModels, density: props.density }, "view-3d-btn"),
92
+ (0, jsx_runtime_1.jsx)(ShowAllButton, { viewport: viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed }, "show-all-btn"),
93
+ (0, jsx_runtime_1.jsx)(HideAllButton, { viewport: viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed }, "hide-all-btn"),
94
+ (0, jsx_runtime_1.jsx)(InvertButton, { viewport: viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed }, "invert-all-btn"),
95
+ (0, jsx_runtime_1.jsx)(View2DButton, { viewport: viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed }, "view-2d-btn"),
96
+ (0, jsx_runtime_1.jsx)(View3DButton, { viewport: viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed }, "view-3d-btn"),
97
97
  ] }), (0, jsx_runtime_1.jsx)("div", { className: contentClassName, children: (0, jsx_runtime_1.jsx)(AutoSizer_1.AutoSizer, { children: ({ width, height }) => ((0, jsx_runtime_1.jsx)(ModelsTree_1.ModelsTree, { ...props, iModel: iModel, activeView: viewport, width: width, height: height, filterInfo: filterInfo, onFilterApplied: onFilterApplied })) }) })] }));
98
98
  }
99
99
  function ShowAllButton(props) {
100
- return ((0, jsx_runtime_1.jsx)(itwinui_react_1.IconButton, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("showAll"), onClick: () => void (0, ModelsVisibilityHandler_1.showAllModels)(props.models.map((model) => model.id), props.viewport), children: (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityShow, {}) }));
100
+ return ((0, jsx_runtime_1.jsx)(itwinui_react_1.IconButton, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("showAll"), onClick: () => {
101
+ props.onFeatureUsed?.(`${exports.ModelsTreeComponent.id}-showall`);
102
+ void (0, ModelsVisibilityHandler_1.showAllModels)(props.models.map((model) => model.id), props.viewport);
103
+ }, children: (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityShow, {}) }));
101
104
  }
102
105
  function HideAllButton(props) {
103
- return ((0, jsx_runtime_1.jsx)(itwinui_react_1.IconButton, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("hideAll"), onClick: () => void (0, ModelsVisibilityHandler_1.hideAllModels)(props.models.map((model) => model.id), props.viewport), children: (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHide, {}) }));
106
+ return ((0, jsx_runtime_1.jsx)(itwinui_react_1.IconButton, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("hideAll"), onClick: () => {
107
+ props.onFeatureUsed?.(`${exports.ModelsTreeComponent.id}-hideall`);
108
+ void (0, ModelsVisibilityHandler_1.hideAllModels)(props.models.map((model) => model.id), props.viewport);
109
+ }, children: (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHide, {}) }));
104
110
  }
105
111
  function InvertButton(props) {
106
- return ((0, jsx_runtime_1.jsx)(itwinui_react_1.IconButton, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("invert"), onClick: () => void (0, ModelsVisibilityHandler_1.invertAllModels)(props.models.map((model) => model.id), props.viewport), children: (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHalf, {}) }));
112
+ return ((0, jsx_runtime_1.jsx)(itwinui_react_1.IconButton, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("invert"), onClick: () => {
113
+ props.onFeatureUsed?.(`${exports.ModelsTreeComponent.id}-invert`);
114
+ void (0, ModelsVisibilityHandler_1.invertAllModels)(props.models.map((model) => model.id), props.viewport);
115
+ }, children: (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHalf, {}) }));
107
116
  }
108
117
  function View2DButton(props) {
109
118
  const models2d = (0, react_1.useMemo)(() => {
@@ -114,7 +123,10 @@ function View2DButton(props) {
114
123
  setIs2dToggleActive((0, ModelsVisibilityHandler_1.areAllModelsVisible)(models2d, props.viewport));
115
124
  return props.viewport.onViewedModelsChanged.addListener((vp) => setIs2dToggleActive((0, ModelsVisibilityHandler_1.areAllModelsVisible)(models2d, vp)));
116
125
  }, [models2d, props.viewport]);
117
- return ((0, jsx_runtime_1.jsx)(itwinui_react_1.Button, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("toggle2DViews"), onClick: () => void (0, ModelsVisibilityHandler_1.toggleModels)(models2d, is2dToggleActive, props.viewport), disabled: models2d.length === 0, endIcon: is2dToggleActive ? (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityShow, {}) : (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHide, {}), children: TreeWidget_1.TreeWidget.translate("label2D") }));
126
+ return ((0, jsx_runtime_1.jsx)(itwinui_react_1.Button, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("toggle2DViews"), onClick: () => {
127
+ props.onFeatureUsed?.(`${exports.ModelsTreeComponent.id}-view2d`);
128
+ void (0, ModelsVisibilityHandler_1.toggleModels)(models2d, is2dToggleActive, props.viewport);
129
+ }, disabled: models2d.length === 0, endIcon: is2dToggleActive ? (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityShow, {}) : (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHide, {}), children: TreeWidget_1.TreeWidget.translate("label2D") }));
118
130
  }
119
131
  function View3DButton(props) {
120
132
  const models3d = (0, react_1.useMemo)(() => {
@@ -125,6 +137,9 @@ function View3DButton(props) {
125
137
  setIs3dToggleActive((0, ModelsVisibilityHandler_1.areAllModelsVisible)(models3d, props.viewport));
126
138
  return props.viewport.onViewedModelsChanged.addListener((vp) => setIs3dToggleActive((0, ModelsVisibilityHandler_1.areAllModelsVisible)(models3d, vp)));
127
139
  }, [models3d, props.viewport]);
128
- return ((0, jsx_runtime_1.jsx)(itwinui_react_1.Button, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("toggle3DViews"), onClick: () => void (0, ModelsVisibilityHandler_1.toggleModels)(models3d, is3dToggleActive, props.viewport), disabled: models3d.length === 0, endIcon: is3dToggleActive ? (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityShow, {}) : (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHide, {}), children: TreeWidget_1.TreeWidget.translate("label3D") }));
140
+ return ((0, jsx_runtime_1.jsx)(itwinui_react_1.Button, { size: props.density === "enlarged" ? "large" : "small", styleType: "borderless", title: TreeWidget_1.TreeWidget.translate("toggle3DViews"), onClick: () => {
141
+ props.onFeatureUsed?.(`${exports.ModelsTreeComponent.id}-view3d`);
142
+ void (0, ModelsVisibilityHandler_1.toggleModels)(models3d, is3dToggleActive, props.viewport);
143
+ }, disabled: models3d.length === 0, endIcon: is3dToggleActive ? (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityShow, {}) : (0, jsx_runtime_1.jsx)(itwinui_icons_react_1.SvgVisibilityHide, {}), children: TreeWidget_1.TreeWidget.translate("label3D") }));
129
144
  }
130
145
  //# 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 { Fragment, 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\";\nimport { queryModelsForHeaderActions } from \"./Utils\";\n\nimport type { IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport type { TreeHeaderButtonProps } from \"../../tree-header/TreeHeader\";\nimport type { ModelsTreeProps } from \"./ModelsTree\";\nimport classNames from \"classnames\";\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, \"iModel\" | \"activeView\" | \"width\" | \"height\" | \"filterInfo\" | \"onFilterApplied\"> {\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\n return <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />;\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 [[SelectableTree]].\n * @public\n */\nModelsTreeComponent.id = \"models-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].\n * @public\n */\nModelsTreeComponent.getLabel = () => TreeWidget.translate(\"models\");\n\nfunction ModelsTreeComponentImpl(props: ModelTreeComponentProps & { iModel: IModelConnection; viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n const { viewport, iModel } = props;\n const { searchOptions, filterString, onFilterApplied } = useTreeFilteringState();\n const contentClassName = classNames(\"tree-widget-tree-content\", props.density === \"enlarged\" && \"enlarge\");\n\n useEffect(() => {\n queryModelsForHeaderActions(iModel)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [iModel]);\n\n const filterInfo = useMemo(\n () => ({ filter: filterString, activeMatchIndex: searchOptions.activeMatchIndex }),\n [filterString, searchOptions.activeMatchIndex],\n );\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 density={props.density}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) => <Fragment key={index}>{btn({ viewport, models: availableModels })}</Fragment>)\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" density={props.density} />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" density={props.density} />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" density={props.density} />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" density={props.density} />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" density={props.density} />,\n ]}\n </TreeHeader>\n <div className={contentClassName}>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={filterInfo}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </div>\n </div>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={() =>\n void showAllModels(\n props.models.map((model) => model.id),\n props.viewport,\n )\n }\n >\n <SvgVisibilityShow />\n </IconButton>\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={() =>\n void hideAllModels(\n props.models.map((model) => model.id),\n props.viewport,\n )\n }\n >\n <SvgVisibilityHide />\n </IconButton>\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"invert\")}\n onClick={() =>\n void invertAllModels(\n props.models.map((model) => model.id),\n props.viewport,\n )\n }\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={props.density === \"enlarged\" ? \"large\" : \"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={props.density === \"enlarged\" ? \"large\" : \"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"]}
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 classNames from \"classnames\";\nimport { Fragment, 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\";\nimport { queryModelsForHeaderActions } from \"./Utils\";\n\nimport type { IModelConnection, ScreenViewport, Viewport } from \"@itwin/core-frontend\";\nimport type { TreeHeaderButtonProps } from \"../../tree-header/TreeHeader\";\nimport type { ModelsTreeProps } from \"./ModelsTree\";\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, \"iModel\" | \"activeView\" | \"width\" | \"height\" | \"filterInfo\" | \"onFilterApplied\"> {\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\n return <ModelsTreeComponentImpl {...props} iModel={iModel} viewport={viewport} />;\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 [[SelectableTree]].\n * @public\n */\nModelsTreeComponent.id = \"models-tree\";\n\n/**\n * Label of the component. May be used when a creating a [[TreeDefinition]] for [[SelectableTree]].\n * @public\n */\nModelsTreeComponent.getLabel = () => TreeWidget.translate(\"models\");\n\nfunction ModelsTreeComponentImpl(props: ModelTreeComponentProps & { iModel: IModelConnection; viewport: ScreenViewport }) {\n const [availableModels, setAvailableModels] = useState<ModelInfo[]>([]);\n const { viewport, iModel } = props;\n const { searchOptions, filterString, onFilterApplied } = useTreeFilteringState();\n const contentClassName = classNames(\"tree-widget-tree-content\", props.density === \"enlarged\" && \"enlarge\");\n\n useEffect(() => {\n queryModelsForHeaderActions(iModel)\n .then((modelInfos: ModelInfo[]) => {\n setAvailableModels(modelInfos);\n })\n .catch((_e) => {\n setAvailableModels([]);\n });\n }, [iModel]);\n\n const filterInfo = useMemo(\n () => ({ filter: filterString, activeMatchIndex: searchOptions.activeMatchIndex }),\n [filterString, searchOptions.activeMatchIndex],\n );\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 density={props.density}\n >\n {props.headerButtons\n ? props.headerButtons.map((btn, index) => (\n <Fragment key={index}>{btn({ viewport, models: availableModels, density: props.density, onFeatureUsed: props.onFeatureUsed })}</Fragment>\n ))\n : [\n <ShowAllButton viewport={viewport} models={availableModels} key=\"show-all-btn\" density={props.density} onFeatureUsed={props.onFeatureUsed} />,\n <HideAllButton viewport={viewport} models={availableModels} key=\"hide-all-btn\" density={props.density} onFeatureUsed={props.onFeatureUsed} />,\n <InvertButton viewport={viewport} models={availableModels} key=\"invert-all-btn\" density={props.density} onFeatureUsed={props.onFeatureUsed} />,\n <View2DButton viewport={viewport} models={availableModels} key=\"view-2d-btn\" density={props.density} onFeatureUsed={props.onFeatureUsed} />,\n <View3DButton viewport={viewport} models={availableModels} key=\"view-3d-btn\" density={props.density} onFeatureUsed={props.onFeatureUsed} />,\n ]}\n </TreeHeader>\n <div className={contentClassName}>\n <AutoSizer>\n {({ width, height }) => (\n <ModelsTree\n {...props}\n iModel={iModel}\n activeView={viewport}\n width={width}\n height={height}\n filterInfo={filterInfo}\n onFilterApplied={onFilterApplied}\n />\n )}\n </AutoSizer>\n </div>\n </div>\n );\n}\n\nfunction ShowAllButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={() => {\n props.onFeatureUsed?.(`${ModelsTreeComponent.id}-showall`);\n void showAllModels(\n props.models.map((model) => model.id),\n props.viewport,\n );\n }}\n >\n <SvgVisibilityShow />\n </IconButton>\n );\n}\n\nfunction HideAllButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={() => {\n props.onFeatureUsed?.(`${ModelsTreeComponent.id}-hideall`);\n void hideAllModels(\n props.models.map((model) => model.id),\n props.viewport,\n );\n }}\n >\n <SvgVisibilityHide />\n </IconButton>\n );\n}\n\nfunction InvertButton(props: ModelsTreeHeaderButtonProps) {\n return (\n <IconButton\n size={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"invert\")}\n onClick={() => {\n props.onFeatureUsed?.(`${ModelsTreeComponent.id}-invert`);\n void invertAllModels(\n props.models.map((model) => model.id),\n props.viewport,\n );\n }}\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={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={() => {\n props.onFeatureUsed?.(`${ModelsTreeComponent.id}-view2d`);\n void toggleModels(models2d, is2dToggleActive, props.viewport);\n }}\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={props.density === \"enlarged\" ? \"large\" : \"small\"}\n styleType=\"borderless\"\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={() => {\n props.onFeatureUsed?.(`${ModelsTreeComponent.id}-view3d`);\n void toggleModels(models3d, is3dToggleActive, props.viewport);\n }}\n disabled={models3d.length === 0}\n endIcon={is3dToggleActive ? <SvgVisibilityShow /> : <SvgVisibilityHide />}\n >\n {TreeWidget.translate(\"label3D\")}\n </Button>\n );\n}\n"]}
@@ -2,8 +2,18 @@
2
2
  * @module IModelComponents
3
3
  */
4
4
  import { VisibilityTreeEventHandler } from "../VisibilityTreeEventHandler";
5
+ import type { VisibilityTreeEventHandlerParams } from "../VisibilityTreeEventHandler";
5
6
  import type { TreeNodeEventArgs } from "@itwin/components-react";
7
+ import type { UsageTrackedFeatures } from "../common/UseFeatureReporting";
8
+ export interface ModelsTreeEventHandlerProps extends VisibilityTreeEventHandlerParams {
9
+ reportUsage: (props: {
10
+ featureId?: UsageTrackedFeatures;
11
+ reportInteraction: boolean;
12
+ }) => void;
13
+ }
6
14
  export declare class ModelsTreeEventHandler extends VisibilityTreeEventHandler {
15
+ private _reportUsage;
16
+ constructor(props: ModelsTreeEventHandlerProps);
7
17
  onNodeDoubleClick({ nodeId }: TreeNodeEventArgs): Promise<void>;
8
18
  }
9
19
  //# sourceMappingURL=ModelsTreeEventHandler.d.ts.map
@@ -14,6 +14,10 @@ const presentation_components_1 = require("@itwin/presentation-components");
14
14
  const VisibilityTreeEventHandler_1 = require("../VisibilityTreeEventHandler");
15
15
  const ModelsVisibilityHandler_1 = require("./ModelsVisibilityHandler");
16
16
  class ModelsTreeEventHandler extends VisibilityTreeEventHandler_1.VisibilityTreeEventHandler {
17
+ constructor(props) {
18
+ super(props);
19
+ this._reportUsage = props.reportUsage;
20
+ }
17
21
  async onNodeDoubleClick({ nodeId }) {
18
22
  const model = this.modelSource.getModel();
19
23
  const node = model.getNode(nodeId);
@@ -25,6 +29,7 @@ class ModelsTreeEventHandler extends VisibilityTreeEventHandler_1.VisibilityTree
25
29
  }
26
30
  const instanceIds = node.item.key.instanceKeys.map((instanceKey) => instanceKey.id);
27
31
  await core_frontend_1.IModelApp.viewManager.selectedView?.zoomToElements(instanceIds);
32
+ this._reportUsage({ featureId: "zoom-to-node", reportInteraction: false });
28
33
  }
29
34
  }
30
35
  exports.ModelsTreeEventHandler = ModelsTreeEventHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeEventHandler.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeEventHandler.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAChG;;GAEG;;;AAEH,wDAAiD;AACjD,oEAAqD;AACrD,4EAA4E;AAC5E,8EAA2E;AAC3E,uEAAwF;AAGxF,MAAa,sBAAuB,SAAQ,uDAA0B;IACpD,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAqB;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEnC,IACE,CAAC,IAAI;YACL,CAAC,IAAA,oDAA0B,EAAC,IAAI,CAAC,IAAI,CAAC;YACtC,iDAAuB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,4CAAkB,CAAC,OAAO;YAC7E,CAAC,6BAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAC1C;YACA,OAAO;SACR;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEpF,MAAM,yBAAS,CAAC,WAAW,CAAC,YAAY,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACxE,CAAC;CACF;AAlBD,wDAkBC","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/** @packageDocumentation\n * @module IModelComponents\n */\n\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { NodeKey } from \"@itwin/presentation-common\";\nimport { isPresentationTreeNodeItem } from \"@itwin/presentation-components\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { ModelsTreeNodeType, ModelsVisibilityHandler } from \"./ModelsVisibilityHandler\";\n\nimport type { TreeNodeEventArgs } from \"@itwin/components-react\";\nexport class ModelsTreeEventHandler extends VisibilityTreeEventHandler {\n public override async onNodeDoubleClick({ nodeId }: TreeNodeEventArgs) {\n const model = this.modelSource.getModel();\n const node = model.getNode(nodeId);\n\n if (\n !node ||\n !isPresentationTreeNodeItem(node.item) ||\n ModelsVisibilityHandler.getNodeType(node.item) !== ModelsTreeNodeType.Element ||\n !NodeKey.isInstancesNodeKey(node.item.key)\n ) {\n return;\n }\n\n const instanceIds = node.item.key.instanceKeys.map((instanceKey) => instanceKey.id);\n\n await IModelApp.viewManager.selectedView?.zoomToElements(instanceIds);\n }\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeEventHandler.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeEventHandler.tsx"],"names":[],"mappings":";AAAA;;;gGAGgG;AAChG;;GAEG;;;AAEH,wDAAiD;AACjD,oEAAqD;AACrD,4EAA4E;AAC5E,8EAA2E;AAC3E,uEAAwF;AAUxF,MAAa,sBAAuB,SAAQ,uDAA0B;IAGpE,YAAY,KAAkC;QAC5C,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC;IACxC,CAAC;IAEe,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAqB;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEnC,IACE,CAAC,IAAI;YACL,CAAC,IAAA,oDAA0B,EAAC,IAAI,CAAC,IAAI,CAAC;YACtC,iDAAuB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,4CAAkB,CAAC,OAAO;YAC7E,CAAC,6BAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAC1C;YACA,OAAO;SACR;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEpF,MAAM,yBAAS,CAAC,WAAW,CAAC,YAAY,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;QAEtE,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF;AA3BD,wDA2BC","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/** @packageDocumentation\n * @module IModelComponents\n */\n\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { NodeKey } from \"@itwin/presentation-common\";\nimport { isPresentationTreeNodeItem } from \"@itwin/presentation-components\";\nimport { VisibilityTreeEventHandler } from \"../VisibilityTreeEventHandler\";\nimport { ModelsTreeNodeType, ModelsVisibilityHandler } from \"./ModelsVisibilityHandler\";\n\nimport type { VisibilityTreeEventHandlerParams } from \"../VisibilityTreeEventHandler\";\nimport type { TreeNodeEventArgs } from \"@itwin/components-react\";\nimport type { UsageTrackedFeatures } from \"../common/UseFeatureReporting\";\n\nexport interface ModelsTreeEventHandlerProps extends VisibilityTreeEventHandlerParams {\n reportUsage: (props: { featureId?: UsageTrackedFeatures; reportInteraction: boolean }) => void;\n}\n\nexport class ModelsTreeEventHandler extends VisibilityTreeEventHandler {\n private _reportUsage: (props: { featureId: \"zoom-to-node\"; reportInteraction: false }) => void;\n\n constructor(props: ModelsTreeEventHandlerProps) {\n super(props);\n this._reportUsage = props.reportUsage;\n }\n\n public override async onNodeDoubleClick({ nodeId }: TreeNodeEventArgs) {\n const model = this.modelSource.getModel();\n const node = model.getNode(nodeId);\n\n if (\n !node ||\n !isPresentationTreeNodeItem(node.item) ||\n ModelsVisibilityHandler.getNodeType(node.item) !== ModelsTreeNodeType.Element ||\n !NodeKey.isInstancesNodeKey(node.item.key)\n ) {\n return;\n }\n\n const instanceIds = node.item.key.instanceKeys.map((instanceKey) => instanceKey.id);\n\n await IModelApp.viewManager.selectedView?.zoomToElements(instanceIds);\n\n this._reportUsage({ featureId: \"zoom-to-node\", reportInteraction: false });\n }\n}\n"]}
@@ -72,8 +72,11 @@ export declare class ModelsVisibilityHandler implements IVisibilityHandler {
72
72
  protected changeModelsVisibility(ids: Id64String[], visible: boolean): Promise<void>;
73
73
  protected changeCategoryState(categoryId: Id64String, parentModelId: Id64String | undefined, on: boolean): void;
74
74
  protected changeElementGroupingNodeState(key: ECClassGroupingNodeKey, on: boolean): Promise<void>;
75
- protected changeElementState(id: Id64String, modelId: Id64String | undefined, categoryId: Id64String | undefined, on: boolean): Promise<void>;
75
+ protected changeElementState(id: Id64String, modelId: Id64String | undefined, categoryId: Id64String | undefined, on: boolean, hasChildren?: boolean): Promise<void>;
76
76
  protected changeElementsState(modelId: Id64String | undefined, categoryId: Id64String | undefined, elementIds: AsyncGenerator<Id64String>, on: boolean): Promise<void>;
77
+ private changeElementStateInternal;
78
+ private isElementDisplayedByDefault;
79
+ private hasExclusiveAlwaysDrawnElements;
77
80
  private onVisibilityChangeInternal;
78
81
  private onViewChanged;
79
82
  private onElementAlwaysDrawnChanged;
@@ -123,10 +123,10 @@ class ModelsVisibilityHandler {
123
123
  }
124
124
  /** Changes visibility of the items represented by the tree node. */
125
125
  async changeVisibility(node, on) {
126
- const nodeKey = (0, presentation_components_1.isPresentationTreeNodeItem)(node) ? node.key : undefined;
127
- if (!nodeKey) {
126
+ if (!(0, presentation_components_1.isPresentationTreeNodeItem)(node)) {
128
127
  return;
129
128
  }
129
+ const nodeKey = node.key;
130
130
  if (presentation_common_1.NodeKey.isClassGroupingNodeKey(nodeKey)) {
131
131
  await this.changeElementGroupingNodeState(nodeKey, on);
132
132
  return;
@@ -144,7 +144,7 @@ class ModelsVisibilityHandler {
144
144
  this.changeCategoryState(nodeKey.instanceKeys[0].id, this.getCategoryParentModelId(node), on);
145
145
  }
146
146
  else {
147
- await this.changeElementState(nodeKey.instanceKeys[0].id, this.getElementModelId(node), this.getElementCategoryId(node), on);
147
+ await this.changeElementState(nodeKey.instanceKeys[0].id, this.getElementModelId(node), this.getElementCategoryId(node), on, node.hasChildren);
148
148
  }
149
149
  }
150
150
  async getSubjectNodeVisibility(ids, node) {
@@ -317,40 +317,55 @@ class ModelsVisibilityHandler {
317
317
  const { modelId, categoryId, elementIds } = await this.getGroupedElementIds(key);
318
318
  await this.changeElementsState(modelId, categoryId, elementIds.getElementIds(), on);
319
319
  }
320
- async changeElementState(id, modelId, categoryId, on) {
320
+ async changeElementState(id, modelId, categoryId, on, hasChildren) {
321
+ const isDisplayedByDefault = this.isElementDisplayedByDefault(modelId, categoryId);
322
+ const isHiddenDueToExclusiveAlwaysDrawnElements = this.hasExclusiveAlwaysDrawnElements();
323
+ this.changeElementStateInternal(id, on, isDisplayedByDefault, isHiddenDueToExclusiveAlwaysDrawnElements);
324
+ if (!hasChildren) {
325
+ return;
326
+ }
321
327
  const childIdsContainer = this.getAssemblyElementIds(id);
322
- async function* elementIds() {
323
- yield id;
324
- for await (const childId of childIdsContainer.getElementIds()) {
325
- yield childId;
326
- }
328
+ for await (const childId of childIdsContainer.getElementIds()) {
329
+ this.changeElementStateInternal(childId, on, isDisplayedByDefault, isHiddenDueToExclusiveAlwaysDrawnElements);
327
330
  }
328
- await this.changeElementsState(modelId, categoryId, elementIds(), on);
329
331
  }
330
332
  async changeElementsState(modelId, categoryId, elementIds, on) {
331
- const isDisplayedByDefault = modelId &&
332
- this.getModelDisplayStatus(modelId).state === "visible" &&
333
- categoryId &&
334
- this.getCategoryDisplayStatus(categoryId, modelId).state === "visible";
335
- const isHiddenDueToExclusiveAlwaysDrawnElements = this._props.viewport.isAlwaysDrawnExclusive && this._props.viewport.alwaysDrawn && 0 !== this._props.viewport.alwaysDrawn.size;
333
+ const isDisplayedByDefault = this.isElementDisplayedByDefault(modelId, categoryId);
334
+ const isHiddenDueToExclusiveAlwaysDrawnElements = this.hasExclusiveAlwaysDrawnElements();
335
+ for await (const elementId of elementIds) {
336
+ this.changeElementStateInternal(elementId, on, isDisplayedByDefault, isHiddenDueToExclusiveAlwaysDrawnElements);
337
+ }
338
+ }
339
+ changeElementStateInternal(elementId, on, isDisplayedByDefault, isHiddenDueToExclusiveAlwaysDrawnElements) {
340
+ let changedNeverDraw = false;
341
+ let changedAlwaysDrawn = false;
336
342
  const currNeverDrawn = new Set(this._props.viewport.neverDrawn ? this._props.viewport.neverDrawn : []);
337
343
  const currAlwaysDrawn = new Set(this._props.viewport.alwaysDrawn ? this._props.viewport.alwaysDrawn : /* istanbul ignore next */ []);
338
- for await (const elementId of elementIds) {
339
- if (on) {
340
- currNeverDrawn.delete(elementId);
341
- if (!isDisplayedByDefault || isHiddenDueToExclusiveAlwaysDrawnElements) {
342
- currAlwaysDrawn.add(elementId);
343
- }
344
+ if (on) {
345
+ changedNeverDraw = changedNeverDraw || currNeverDrawn.delete(elementId);
346
+ if ((!isDisplayedByDefault || isHiddenDueToExclusiveAlwaysDrawnElements) && !currAlwaysDrawn.has(elementId)) {
347
+ currAlwaysDrawn.add(elementId);
348
+ changedAlwaysDrawn = true;
344
349
  }
345
- else {
346
- currAlwaysDrawn.delete(elementId);
347
- if (isDisplayedByDefault && !isHiddenDueToExclusiveAlwaysDrawnElements) {
348
- currNeverDrawn.add(elementId);
349
- }
350
+ }
351
+ else {
352
+ changedAlwaysDrawn = changedAlwaysDrawn || currAlwaysDrawn.delete(elementId);
353
+ if (isDisplayedByDefault && !isHiddenDueToExclusiveAlwaysDrawnElements && !currNeverDrawn.has(elementId)) {
354
+ currNeverDrawn.add(elementId);
355
+ changedNeverDraw = true;
350
356
  }
351
357
  }
352
- this._props.viewport.setNeverDrawn(currNeverDrawn);
353
- this._props.viewport.setAlwaysDrawn(currAlwaysDrawn, this._props.viewport.isAlwaysDrawnExclusive);
358
+ changedNeverDraw && this._props.viewport.setNeverDrawn(currNeverDrawn);
359
+ changedAlwaysDrawn && this._props.viewport.setAlwaysDrawn(currAlwaysDrawn, this._props.viewport.isAlwaysDrawnExclusive);
360
+ }
361
+ isElementDisplayedByDefault(modelId, categoryId) {
362
+ return (!!modelId &&
363
+ this.getModelDisplayStatus(modelId).state === "visible" &&
364
+ !!categoryId &&
365
+ this.getCategoryDisplayStatus(categoryId, modelId).state === "visible");
366
+ }
367
+ hasExclusiveAlwaysDrawnElements() {
368
+ return this._props.viewport.isAlwaysDrawnExclusive && 0 !== this._props.viewport.alwaysDrawn?.size;
354
369
  }
355
370
  onVisibilityChangeInternal() {
356
371
  if (this._pendingVisibilityChange) {