@itwin/tree-widget-react 0.1.1

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 (126) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +32 -0
  3. package/lib/cjs/TreeWidget.d.ts +27 -0
  4. package/lib/cjs/TreeWidget.js +57 -0
  5. package/lib/cjs/TreeWidget.js.map +1 -0
  6. package/lib/cjs/components/IconButton.d.ts +14 -0
  7. package/lib/cjs/components/IconButton.js +42 -0
  8. package/lib/cjs/components/IconButton.js.map +1 -0
  9. package/lib/cjs/components/IconButton.scss +73 -0
  10. package/lib/cjs/components/TreeFilteringState.d.ts +16 -0
  11. package/lib/cjs/components/TreeFilteringState.js +67 -0
  12. package/lib/cjs/components/TreeFilteringState.js.map +1 -0
  13. package/lib/cjs/components/TreeWidgetComponent.d.ts +8 -0
  14. package/lib/cjs/components/TreeWidgetComponent.js +41 -0
  15. package/lib/cjs/components/TreeWidgetComponent.js.map +1 -0
  16. package/lib/cjs/components/TreeWidgetComponent.scss +64 -0
  17. package/lib/cjs/components/TreeWidgetControl.d.ts +25 -0
  18. package/lib/cjs/components/TreeWidgetControl.js +64 -0
  19. package/lib/cjs/components/TreeWidgetControl.js.map +1 -0
  20. package/lib/cjs/components/TreeWidgetUiItemsProvider.d.ts +19 -0
  21. package/lib/cjs/components/TreeWidgetUiItemsProvider.js +81 -0
  22. package/lib/cjs/components/TreeWidgetUiItemsProvider.js.map +1 -0
  23. package/lib/cjs/components/header/TreeHeader.d.ts +14 -0
  24. package/lib/cjs/components/header/TreeHeader.js +43 -0
  25. package/lib/cjs/components/header/TreeHeader.js.map +1 -0
  26. package/lib/cjs/components/header/TreeHeader.scss +19 -0
  27. package/lib/cjs/components/rulesets/ClassificationSystems.json +122 -0
  28. package/lib/cjs/components/search-bar/Popup.d.ts +50 -0
  29. package/lib/cjs/components/search-bar/Popup.js +246 -0
  30. package/lib/cjs/components/search-bar/Popup.js.map +1 -0
  31. package/lib/cjs/components/search-bar/Popup.scss +316 -0
  32. package/lib/cjs/components/search-bar/SearchBar.d.ts +53 -0
  33. package/lib/cjs/components/search-bar/SearchBar.js +97 -0
  34. package/lib/cjs/components/search-bar/SearchBar.js.map +1 -0
  35. package/lib/cjs/components/search-bar/SearchBar.scss +110 -0
  36. package/lib/cjs/components/search-bar/SearchBox.d.ts +76 -0
  37. package/lib/cjs/components/search-bar/SearchBox.js +184 -0
  38. package/lib/cjs/components/search-bar/SearchBox.js.map +1 -0
  39. package/lib/cjs/components/search-bar/SearchBox.scss +91 -0
  40. package/lib/cjs/components/trees/CategoriesTree.d.ts +9 -0
  41. package/lib/cjs/components/trees/CategoriesTree.js +76 -0
  42. package/lib/cjs/components/trees/CategoriesTree.js.map +1 -0
  43. package/lib/cjs/components/trees/CategoriesTree.scss +13 -0
  44. package/lib/cjs/components/trees/ClassificationsTree.d.ts +6 -0
  45. package/lib/cjs/components/trees/ClassificationsTree.js +43 -0
  46. package/lib/cjs/components/trees/ClassificationsTree.js.map +1 -0
  47. package/lib/cjs/components/trees/ModelsTree.d.ts +10 -0
  48. package/lib/cjs/components/trees/ModelsTree.js +135 -0
  49. package/lib/cjs/components/trees/ModelsTree.js.map +1 -0
  50. package/lib/cjs/components/trees/ModelsTree.scss +14 -0
  51. package/lib/cjs/components/trees/SpatialTree.d.ts +3 -0
  52. package/lib/cjs/components/trees/SpatialTree.js +41 -0
  53. package/lib/cjs/components/trees/SpatialTree.js.map +1 -0
  54. package/lib/cjs/components/trees/TreeWithRuleset.d.ts +35 -0
  55. package/lib/cjs/components/trees/TreeWithRuleset.js +108 -0
  56. package/lib/cjs/components/trees/TreeWithRuleset.js.map +1 -0
  57. package/lib/cjs/components/trees/TreeWithRulesetTree.scss +17 -0
  58. package/lib/cjs/components/trees/index.d.ts +6 -0
  59. package/lib/cjs/components/trees/index.js +22 -0
  60. package/lib/cjs/components/trees/index.js.map +1 -0
  61. package/lib/cjs/tree-widget-react.d.ts +7 -0
  62. package/lib/cjs/tree-widget-react.js +23 -0
  63. package/lib/cjs/tree-widget-react.js.map +1 -0
  64. package/lib/esm/TreeWidget.d.ts +27 -0
  65. package/lib/esm/TreeWidget.js +53 -0
  66. package/lib/esm/TreeWidget.js.map +1 -0
  67. package/lib/esm/components/IconButton.d.ts +14 -0
  68. package/lib/esm/components/IconButton.js +16 -0
  69. package/lib/esm/components/IconButton.js.map +1 -0
  70. package/lib/esm/components/IconButton.scss +73 -0
  71. package/lib/esm/components/TreeFilteringState.d.ts +16 -0
  72. package/lib/esm/components/TreeFilteringState.js +44 -0
  73. package/lib/esm/components/TreeFilteringState.js.map +1 -0
  74. package/lib/esm/components/TreeWidgetComponent.d.ts +8 -0
  75. package/lib/esm/components/TreeWidgetComponent.js +18 -0
  76. package/lib/esm/components/TreeWidgetComponent.js.map +1 -0
  77. package/lib/esm/components/TreeWidgetComponent.scss +64 -0
  78. package/lib/esm/components/TreeWidgetControl.d.ts +25 -0
  79. package/lib/esm/components/TreeWidgetControl.js +57 -0
  80. package/lib/esm/components/TreeWidgetControl.js.map +1 -0
  81. package/lib/esm/components/TreeWidgetUiItemsProvider.d.ts +19 -0
  82. package/lib/esm/components/TreeWidgetUiItemsProvider.js +74 -0
  83. package/lib/esm/components/TreeWidgetUiItemsProvider.js.map +1 -0
  84. package/lib/esm/components/header/TreeHeader.d.ts +14 -0
  85. package/lib/esm/components/header/TreeHeader.js +20 -0
  86. package/lib/esm/components/header/TreeHeader.js.map +1 -0
  87. package/lib/esm/components/header/TreeHeader.scss +19 -0
  88. package/lib/esm/components/rulesets/ClassificationSystems.json +122 -0
  89. package/lib/esm/components/search-bar/Popup.d.ts +50 -0
  90. package/lib/esm/components/search-bar/Popup.js +220 -0
  91. package/lib/esm/components/search-bar/Popup.js.map +1 -0
  92. package/lib/esm/components/search-bar/Popup.scss +316 -0
  93. package/lib/esm/components/search-bar/SearchBar.d.ts +53 -0
  94. package/lib/esm/components/search-bar/SearchBar.js +71 -0
  95. package/lib/esm/components/search-bar/SearchBar.js.map +1 -0
  96. package/lib/esm/components/search-bar/SearchBar.scss +110 -0
  97. package/lib/esm/components/search-bar/SearchBox.d.ts +76 -0
  98. package/lib/esm/components/search-bar/SearchBox.js +158 -0
  99. package/lib/esm/components/search-bar/SearchBox.js.map +1 -0
  100. package/lib/esm/components/search-bar/SearchBox.scss +91 -0
  101. package/lib/esm/components/trees/CategoriesTree.d.ts +9 -0
  102. package/lib/esm/components/trees/CategoriesTree.js +53 -0
  103. package/lib/esm/components/trees/CategoriesTree.js.map +1 -0
  104. package/lib/esm/components/trees/CategoriesTree.scss +13 -0
  105. package/lib/esm/components/trees/ClassificationsTree.d.ts +6 -0
  106. package/lib/esm/components/trees/ClassificationsTree.js +17 -0
  107. package/lib/esm/components/trees/ClassificationsTree.js.map +1 -0
  108. package/lib/esm/components/trees/ModelsTree.d.ts +10 -0
  109. package/lib/esm/components/trees/ModelsTree.js +112 -0
  110. package/lib/esm/components/trees/ModelsTree.js.map +1 -0
  111. package/lib/esm/components/trees/ModelsTree.scss +14 -0
  112. package/lib/esm/components/trees/SpatialTree.d.ts +3 -0
  113. package/lib/esm/components/trees/SpatialTree.js +18 -0
  114. package/lib/esm/components/trees/SpatialTree.js.map +1 -0
  115. package/lib/esm/components/trees/TreeWithRuleset.d.ts +35 -0
  116. package/lib/esm/components/trees/TreeWithRuleset.js +83 -0
  117. package/lib/esm/components/trees/TreeWithRuleset.js.map +1 -0
  118. package/lib/esm/components/trees/TreeWithRulesetTree.scss +17 -0
  119. package/lib/esm/components/trees/index.d.ts +6 -0
  120. package/lib/esm/components/trees/index.js +10 -0
  121. package/lib/esm/components/trees/index.js.map +1 -0
  122. package/lib/esm/tree-widget-react.d.ts +7 -0
  123. package/lib/esm/tree-widget-react.js +11 -0
  124. package/lib/esm/tree-widget-react.js.map +1 -0
  125. package/lib/public/locales/en/TreeWidget.json +16 -0
  126. package/package.json +97 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TreeWidgetUiItemsProvider = void 0;
7
+ /*---------------------------------------------------------------------------------------------
8
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
9
+ * See LICENSE.md in the project root for license terms and full copyright notice.
10
+ *--------------------------------------------------------------------------------------------*/
11
+ const appui_abstract_1 = require("@itwin/appui-abstract");
12
+ const appui_react_1 = require("@itwin/appui-react");
13
+ const react_1 = __importDefault(require("react"));
14
+ const TreeWidgetComponent_1 = require("./TreeWidgetComponent");
15
+ const trees_1 = require("./trees");
16
+ const TreeWidget_1 = require("../TreeWidget");
17
+ class TreeWidgetUiItemsProvider {
18
+ constructor(props) {
19
+ var _a, _b, _c, _d, _e, _f;
20
+ this.id = "TreeWidgetUiitemsProvider";
21
+ this._imodel = props === null || props === void 0 ? void 0 : props.iModelConnection;
22
+ this._activeView = props === null || props === void 0 ? void 0 : props.activeView;
23
+ this._enableElementsClassGrouping = props === null || props === void 0 ? void 0 : props.enableElementsClassGrouping;
24
+ this._allViewports = props === null || props === void 0 ? void 0 : props.allViewports;
25
+ this._additionalTrees = props === null || props === void 0 ? void 0 : props.additionalTrees;
26
+ this._modelsTreeProps = (_a = props === null || props === void 0 ? void 0 : props.additionalProps) === null || _a === void 0 ? void 0 : _a.modelsTree;
27
+ this._categoriesTreeProps = (_b = props === null || props === void 0 ? void 0 : props.additionalProps) === null || _b === void 0 ? void 0 : _b.categoriesTree;
28
+ this._spatialTreeProps = (_c = props === null || props === void 0 ? void 0 : props.additionalProps) === null || _c === void 0 ? void 0 : _c.spatialTree;
29
+ this._modelsTreeReplacement = (_d = props === null || props === void 0 ? void 0 : props.treeReplacements) === null || _d === void 0 ? void 0 : _d.modelsTree;
30
+ this._categoriesTreeReplacement = (_e = props === null || props === void 0 ? void 0 : props.treeReplacements) === null || _e === void 0 ? void 0 : _e.categoriesTree;
31
+ this._spatialTreeReplacement = (_f = props === null || props === void 0 ? void 0 : props.treeReplacements) === null || _f === void 0 ? void 0 : _f.spatialTree;
32
+ }
33
+ provideWidgets(_stageId, stageUsage, location, _section) {
34
+ var _a, _b, _c;
35
+ const widgets = [];
36
+ const imodel = appui_react_1.UiFramework.getIModelConnection();
37
+ if (stageUsage === appui_abstract_1.StageUsage.General &&
38
+ location === appui_abstract_1.StagePanelLocation.Right &&
39
+ imodel !== undefined) {
40
+ const modelsTreeComponent = (react_1.default.createElement(trees_1.ModelsTreeComponent, { iModel: (_a = this._imodel) !== null && _a !== void 0 ? _a : imodel, allViewports: this._allViewports, activeView: this._activeView, enableElementsClassGrouping: this._enableElementsClassGrouping, ...this._modelsTreeProps }));
41
+ const categoriesTreeComponent = (react_1.default.createElement(trees_1.CategoriesTreeComponent, { iModel: (_b = this._imodel) !== null && _b !== void 0 ? _b : imodel, allViewports: this._allViewports, activeView: this._activeView, ...this._categoriesTreeProps }));
42
+ const spatialContainmentComponent = (react_1.default.createElement(trees_1.SpatialTreeComponent, { iModel: (_c = this._imodel) !== null && _c !== void 0 ? _c : imodel, enableElementsClassGrouping: this._enableElementsClassGrouping
43
+ ? appui_react_1.ClassGroupingOption.Yes
44
+ : appui_react_1.ClassGroupingOption.No, ...this._spatialTreeProps }));
45
+ const trees = [
46
+ {
47
+ label: TreeWidget_1.TreeWidget.translate("modeltree"),
48
+ id: "model-tree",
49
+ render: this._modelsTreeReplacement
50
+ ? this._modelsTreeReplacement
51
+ : () => modelsTreeComponent,
52
+ },
53
+ {
54
+ label: TreeWidget_1.TreeWidget.translate("categories"),
55
+ id: "categories-tree",
56
+ render: this._categoriesTreeReplacement
57
+ ? this._categoriesTreeReplacement
58
+ : () => categoriesTreeComponent,
59
+ },
60
+ {
61
+ label: TreeWidget_1.TreeWidget.translate("containment"),
62
+ id: "spatial-containment-tree",
63
+ render: this._spatialTreeReplacement
64
+ ? this._spatialTreeReplacement
65
+ : () => spatialContainmentComponent,
66
+ },
67
+ ];
68
+ if (this._additionalTrees) {
69
+ trees.push(...this._additionalTrees);
70
+ }
71
+ widgets.push({
72
+ id: "tree",
73
+ label: TreeWidget_1.TreeWidget.translate("treeview"),
74
+ getWidgetContent: () => react_1.default.createElement(TreeWidgetComponent_1.TreeWidgetComponent, { trees: trees }),
75
+ });
76
+ }
77
+ return widgets;
78
+ }
79
+ }
80
+ exports.TreeWidgetUiItemsProvider = TreeWidgetUiItemsProvider;
81
+ //# sourceMappingURL=TreeWidgetUiItemsProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeWidgetUiItemsProvider.js","sourceRoot":"","sources":["../../../src/components/TreeWidgetUiItemsProvider.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*--------------------------------------------------------------------------------------------*/\nimport {\n AbstractWidgetProps,\n StagePanelLocation,\n StagePanelSection,\n StageUsage,\n UiItemsProvider,\n} from \"@itwin/appui-abstract\";\nimport { ClassGroupingOption, UiFramework } from \"@itwin/appui-react\";\nimport React from \"react\";\nimport { TreeWidgetComponent } from \"./TreeWidgetComponent\";\nimport {\n ModelsTreeComponent,\n CategoriesTreeComponent,\n SpatialTreeComponent,\n} from \"./trees\";\nimport { IModelConnection, Viewport } from \"@itwin/core-frontend\";\nimport { SelectableContentDefinition } from \"@itwin/components-react\";\nimport { TreeWidget } from \"../TreeWidget\";\nimport { TreeWidgetControlOptions } from \"./TreeWidgetControl\";\n\nexport class TreeWidgetUiItemsProvider implements UiItemsProvider {\n public readonly id = \"TreeWidgetUiitemsProvider\";\n\n private _imodel?: IModelConnection;\n private _activeView?: Viewport;\n private _enableElementsClassGrouping?: boolean;\n private _allViewports?: boolean;\n private _additionalTrees?: SelectableContentDefinition[];\n private _modelsTreeProps?: {};\n private _categoriesTreeProps?: {};\n private _spatialTreeProps?: {};\n private _modelsTreeReplacement?: () => React.ReactNode;\n private _categoriesTreeReplacement?: () => React.ReactNode;\n private _spatialTreeReplacement?: () => React.ReactNode;\n\n constructor(props?: Partial<TreeWidgetControlOptions>) {\n this._imodel = props?.iModelConnection;\n this._activeView = props?.activeView;\n this._enableElementsClassGrouping = props?.enableElementsClassGrouping;\n this._allViewports = props?.allViewports;\n this._additionalTrees = props?.additionalTrees;\n this._modelsTreeProps = props?.additionalProps?.modelsTree;\n this._categoriesTreeProps = props?.additionalProps?.categoriesTree;\n this._spatialTreeProps = props?.additionalProps?.spatialTree;\n this._modelsTreeReplacement = props?.treeReplacements?.modelsTree;\n this._categoriesTreeReplacement = props?.treeReplacements?.categoriesTree;\n this._spatialTreeReplacement = props?.treeReplacements?.spatialTree;\n }\n\n public provideWidgets(\n _stageId: string,\n stageUsage: string,\n location: StagePanelLocation,\n _section: StagePanelSection | undefined\n ): ReadonlyArray<AbstractWidgetProps> {\n const widgets: AbstractWidgetProps[] = [];\n const imodel = UiFramework.getIModelConnection();\n if (\n stageUsage === StageUsage.General &&\n location === StagePanelLocation.Right &&\n imodel !== undefined\n ) {\n const modelsTreeComponent = (\n <ModelsTreeComponent\n iModel={this._imodel ?? imodel}\n allViewports={this._allViewports}\n activeView={this._activeView}\n enableElementsClassGrouping={this._enableElementsClassGrouping}\n {...this._modelsTreeProps}\n />\n );\n\n const categoriesTreeComponent = (\n <CategoriesTreeComponent\n iModel={this._imodel ?? imodel}\n allViewports={this._allViewports}\n activeView={this._activeView}\n {...this._categoriesTreeProps}\n />\n );\n\n const spatialContainmentComponent = (\n <SpatialTreeComponent\n iModel={this._imodel ?? imodel}\n enableElementsClassGrouping={\n this._enableElementsClassGrouping\n ? ClassGroupingOption.Yes\n : ClassGroupingOption.No\n }\n {...this._spatialTreeProps}\n />\n );\n\n const trees: SelectableContentDefinition[] = [\n {\n label: TreeWidget.translate(\"modeltree\"),\n id: \"model-tree\",\n render: this._modelsTreeReplacement\n ? this._modelsTreeReplacement\n : () => modelsTreeComponent,\n },\n {\n label: TreeWidget.translate(\"categories\"),\n id: \"categories-tree\",\n render: this._categoriesTreeReplacement\n ? this._categoriesTreeReplacement\n : () => categoriesTreeComponent,\n },\n {\n label: TreeWidget.translate(\"containment\"),\n id: \"spatial-containment-tree\",\n render: this._spatialTreeReplacement\n ? this._spatialTreeReplacement\n : () => spatialContainmentComponent,\n },\n ];\n\n if (this._additionalTrees) {\n trees.push(...this._additionalTrees);\n }\n\n widgets.push({\n id: \"tree\",\n label: TreeWidget.translate(\"treeview\"),\n getWidgetContent: () => <TreeWidgetComponent trees={trees} />,\n });\n }\n\n return widgets;\n }\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { SearchOptions } from "../TreeFilteringState";
2
+ import "./TreeHeader.scss";
3
+ export interface TreeHeaderComponentProps {
4
+ showAll?: () => void;
5
+ hideAll?: () => void;
6
+ invert?: () => void;
7
+ toggle2D?: () => void;
8
+ toggle2DIcon?: string;
9
+ toggle3D?: () => void;
10
+ toggle3DIcon?: string;
11
+ searchOptions: SearchOptions;
12
+ }
13
+ export declare function TreeHeaderComponent({ searchOptions, showAll, hideAll, invert, toggle2D, toggle2DIcon, toggle3D, toggle3DIcon, }: TreeHeaderComponentProps): JSX.Element;
14
+ //# sourceMappingURL=TreeHeader.d.ts.map
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.TreeHeaderComponent = void 0;
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ const React = __importStar(require("react"));
28
+ const IconButton_1 = require("../IconButton");
29
+ const SearchBar_1 = require("../search-bar/SearchBar");
30
+ const TreeWidget_1 = require("../../TreeWidget");
31
+ require("./TreeHeader.scss");
32
+ function TreeHeaderComponent({ searchOptions, showAll, hideAll, invert, toggle2D, toggle2DIcon, toggle3D, toggle3DIcon, }) {
33
+ var _a;
34
+ return (React.createElement(SearchBar_1.SearchBar, { value: "", className: "tree-widget-header-tree-search-bar", valueChangedDelay: 500, placeholder: TreeWidget_1.TreeWidget.translate("search"), title: TreeWidget_1.TreeWidget.translate("searchForSomething"), filteringInProgress: searchOptions.isFiltering, onFilterCancel: searchOptions.onFilterCancel, onFilterClear: searchOptions.onFilterCancel, onFilterStart: searchOptions.onFilterStart, onSelectedChanged: searchOptions.onResultSelectedChanged, resultCount: (_a = searchOptions.matchedResultCount) !== null && _a !== void 0 ? _a : 0 },
35
+ React.createElement("div", { className: "tree-widget-search-bar-button-container" },
36
+ showAll && (React.createElement(IconButton_1.IconButton, { className: "tree-widget-header-tree-toolbar-icon", key: "show-all-btn", icon: "icon-visibility", title: TreeWidget_1.TreeWidget.translate("showAll"), onClick: showAll })),
37
+ hideAll && (React.createElement(IconButton_1.IconButton, { className: "tree-widget-header-tree-toolbar-icon", key: "hide-all-btn", icon: "icon-visibility-hide-2", title: TreeWidget_1.TreeWidget.translate("hideAll"), onClick: hideAll })),
38
+ invert && (React.createElement(IconButton_1.IconButton, { key: "invert-all-btn", className: "tree-widget-header-tree-toolbar-icon", title: TreeWidget_1.TreeWidget.translate("invert"), icon: "icon-visibility-invert", onClick: invert })),
39
+ toggle2D && toggle2DIcon && (React.createElement(IconButton_1.IconButton, { className: "tree-widget-header-tree-toolbar-icon", key: "view-2d-btn", icon: toggle2DIcon, title: TreeWidget_1.TreeWidget.translate("toggle2DViews"), onClick: toggle2D, label: TreeWidget_1.TreeWidget.translate("label2D") })),
40
+ toggle3D && toggle3DIcon && (React.createElement(IconButton_1.IconButton, { className: "tree-widget-header-tree-toolbar-icon", key: "view-3d-btn", icon: toggle3DIcon, title: TreeWidget_1.TreeWidget.translate("toggle3DViews"), onClick: toggle3D, label: TreeWidget_1.TreeWidget.translate("label3D") })))));
41
+ }
42
+ exports.TreeHeaderComponent = TreeHeaderComponent;
43
+ //# sourceMappingURL=TreeHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeHeader.js","sourceRoot":"","sources":["../../../../src/components/header/TreeHeader.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,6CAA+B;AAC/B,8CAA2C;AAC3C,uDAAoD;AAEpD,iDAA8C;AAC9C,6BAA2B;AAa3B,SAAgB,mBAAmB,CAAC,EAClC,aAAa,EACb,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,YAAY,GACa;;IACzB,OAAO,CACL,oBAAC,qBAAS,IACR,KAAK,EAAC,EAAE,EACR,SAAS,EAAC,oCAAoC,EAC9C,iBAAiB,EAAE,GAAG,EACtB,WAAW,EAAE,uBAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,EAC3C,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,oBAAoB,CAAC,EACjD,mBAAmB,EAAE,aAAa,CAAC,WAAW,EAC9C,cAAc,EAAE,aAAa,CAAC,cAAc,EAC5C,aAAa,EAAE,aAAa,CAAC,cAAc,EAC3C,aAAa,EAAE,aAAa,CAAC,aAAa,EAC1C,iBAAiB,EAAE,aAAa,CAAC,uBAAuB,EACxD,WAAW,EAAE,MAAA,aAAa,CAAC,kBAAkB,mCAAI,CAAC;QAElD,6BAAK,SAAS,EAAC,yCAAyC;YACrD,OAAO,IAAI,CACV,oBAAC,uBAAU,IACT,SAAS,EAAE,sCAAsC,EACjD,GAAG,EAAC,cAAc,EAClB,IAAI,EAAC,iBAAiB,EACtB,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,SAAS,CAAC,EACtC,OAAO,EAAE,OAAO,GAChB,CACH;YACA,OAAO,IAAI,CACV,oBAAC,uBAAU,IACT,SAAS,EAAE,sCAAsC,EACjD,GAAG,EAAC,cAAc,EAClB,IAAI,EAAC,wBAAwB,EAC7B,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,SAAS,CAAC,EACtC,OAAO,EAAE,OAAO,GAChB,CACH;YACA,MAAM,IAAI,CACT,oBAAC,uBAAU,IACT,GAAG,EAAC,gBAAgB,EACpB,SAAS,EAAE,sCAAsC,EACjD,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,EACrC,IAAI,EAAC,wBAAwB,EAC7B,OAAO,EAAE,MAAM,GACf,CACH;YACA,QAAQ,IAAI,YAAY,IAAI,CAC3B,oBAAC,uBAAU,IACT,SAAS,EAAE,sCAAsC,EACjD,GAAG,EAAC,aAAa,EACjB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,eAAe,CAAC,EAC5C,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,SAAS,CAAC,GACtC,CACH;YACA,QAAQ,IAAI,YAAY,IAAI,CAC3B,oBAAC,uBAAU,IACT,SAAS,EAAE,sCAAsC,EACjD,GAAG,EAAC,aAAa,EACjB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,eAAe,CAAC,EAC5C,OAAO,EAAE,QAAQ,EACjB,KAAK,EAAE,uBAAU,CAAC,SAAS,CAAC,SAAS,CAAC,GACtC,CACH,CACG,CACI,CACb,CAAC;AACJ,CAAC;AA3ED,kDA2EC","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*--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport { IconButton } from \"../IconButton\";\nimport { SearchBar } from \"../search-bar/SearchBar\";\nimport { SearchOptions } from \"../TreeFilteringState\";\nimport { TreeWidget } from \"../../TreeWidget\";\nimport \"./TreeHeader.scss\";\n\nexport interface TreeHeaderComponentProps {\n showAll?: () => void;\n hideAll?: () => void;\n invert?: () => void;\n toggle2D?: () => void;\n toggle2DIcon?: string;\n toggle3D?: () => void;\n toggle3DIcon?: string;\n searchOptions: SearchOptions;\n}\n\nexport function TreeHeaderComponent({\n searchOptions,\n showAll,\n hideAll,\n invert,\n toggle2D,\n toggle2DIcon,\n toggle3D,\n toggle3DIcon,\n}: TreeHeaderComponentProps) {\n return (\n <SearchBar\n value=\"\"\n className=\"tree-widget-header-tree-search-bar\"\n valueChangedDelay={500}\n placeholder={TreeWidget.translate(\"search\")}\n title={TreeWidget.translate(\"searchForSomething\")}\n filteringInProgress={searchOptions.isFiltering}\n onFilterCancel={searchOptions.onFilterCancel}\n onFilterClear={searchOptions.onFilterCancel}\n onFilterStart={searchOptions.onFilterStart}\n onSelectedChanged={searchOptions.onResultSelectedChanged}\n resultCount={searchOptions.matchedResultCount ?? 0}\n >\n <div className=\"tree-widget-search-bar-button-container\">\n {showAll && (\n <IconButton\n className={\"tree-widget-header-tree-toolbar-icon\"}\n key=\"show-all-btn\"\n icon=\"icon-visibility\"\n title={TreeWidget.translate(\"showAll\")}\n onClick={showAll}\n />\n )}\n {hideAll && (\n <IconButton\n className={\"tree-widget-header-tree-toolbar-icon\"}\n key=\"hide-all-btn\"\n icon=\"icon-visibility-hide-2\"\n title={TreeWidget.translate(\"hideAll\")}\n onClick={hideAll}\n />\n )}\n {invert && (\n <IconButton\n key=\"invert-all-btn\"\n className={\"tree-widget-header-tree-toolbar-icon\"}\n title={TreeWidget.translate(\"invert\")}\n icon=\"icon-visibility-invert\"\n onClick={invert}\n />\n )}\n {toggle2D && toggle2DIcon && (\n <IconButton\n className={\"tree-widget-header-tree-toolbar-icon\"}\n key=\"view-2d-btn\"\n icon={toggle2DIcon}\n title={TreeWidget.translate(\"toggle2DViews\")}\n onClick={toggle2D}\n label={TreeWidget.translate(\"label2D\")}\n />\n )}\n {toggle3D && toggle3DIcon && (\n <IconButton\n className={\"tree-widget-header-tree-toolbar-icon\"}\n key=\"view-3d-btn\"\n icon={toggle3DIcon}\n title={TreeWidget.translate(\"toggle3DViews\")}\n onClick={toggle3D}\n label={TreeWidget.translate(\"label3D\")}\n />\n )}\n </div>\n </SearchBar>\n );\n}\n"]}
@@ -0,0 +1,19 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ @import "~@itwin/core-react/lib/esm/core-react/index";
6
+
7
+ .tree-widget-header-tree-search-bar {
8
+ margin-bottom: $uicore-s;
9
+ }
10
+
11
+ .tree-widget-header-tree-toolbar-icon {
12
+ color: $buic-icon-color;
13
+ }
14
+
15
+ .tree-widget-search-bar-button-container {
16
+ display: flex;
17
+ align-items: center;
18
+ width: 100%;
19
+ }
@@ -0,0 +1,122 @@
1
+ {
2
+ "id": "tree-widget-react/ClassificationSystems",
3
+ "rules": [
4
+ {
5
+ "ruleType": "RootNodes",
6
+ "specifications": [
7
+ {
8
+ "specType": "InstanceNodesOfSpecificClasses",
9
+ "classes": [
10
+ {
11
+ "schemaName": "ClassificationSystems",
12
+ "classNames": [
13
+ "ClassificationSystem"
14
+ ]
15
+ }
16
+ ],
17
+ "arePolymorphic": false,
18
+ "groupByClass": false,
19
+ "groupByLabel": false
20
+ }
21
+ ]
22
+ },
23
+ {
24
+ "ruleType": "ChildNodes",
25
+ "condition": "ParentNode.IsOfClass(\"ClassificationSystem\", \"ClassificationSystems\")",
26
+ "specifications": [
27
+ {
28
+ "specType": "RelatedInstanceNodes",
29
+ "relationships": {
30
+ "schemaName": "ClassificationSystems",
31
+ "classNames": [
32
+ "ClassificationSystemOwnsClassificationTable"
33
+ ]
34
+ },
35
+ "relatedClasses": {
36
+ "schemaName": "ClassificationSystems",
37
+ "classNames": [
38
+ "ClassificationTable"
39
+ ]
40
+ },
41
+ "requiredDirection": "Forward",
42
+ "groupByClass": false,
43
+ "groupByLabel": false,
44
+ "doNotSort": true
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ "ruleType": "ChildNodes",
50
+ "condition": "ParentNode.IsOfClass(\"ClassificationTable\", \"ClassificationSystems\")",
51
+ "specifications": [
52
+ {
53
+ "specType": "RelatedInstanceNodes",
54
+ "relationships": {
55
+ "schemaName": "BisCore",
56
+ "classNames": [
57
+ "ModelModelsElement"
58
+ ]
59
+ },
60
+ "relatedClasses": {
61
+ "schemaName": "BisCore",
62
+ "classNames": [
63
+ "Model"
64
+ ]
65
+ },
66
+ "requiredDirection": "Backward",
67
+ "groupByClass": false,
68
+ "groupByLabel": false,
69
+ "hideNodesInHierarchy": true
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ "ruleType": "ChildNodes",
75
+ "condition": "ParentNode.IsOfClass(\"Model\", \"BisCore\")",
76
+ "specifications": [
77
+ {
78
+ "specType": "RelatedInstanceNodes",
79
+ "relationships": {
80
+ "schemaName": "BisCore",
81
+ "classNames": [
82
+ "ModelContainsElements"
83
+ ]
84
+ },
85
+ "relatedClasses": {
86
+ "schemaName": "ClassificationSystems",
87
+ "classNames": [
88
+ "Classification"
89
+ ]
90
+ },
91
+ "requiredDirection": "Forward",
92
+ "groupByClass": false,
93
+ "groupByLabel": false
94
+ }
95
+ ]
96
+ },
97
+ {
98
+ "ruleType": "ChildNodes",
99
+ "condition": "ParentNode.IsOfClass(\"Classification\", \"ClassificationSystems\")",
100
+ "specifications": [
101
+ {
102
+ "specType": "RelatedInstanceNodes",
103
+ "relationships": {
104
+ "schemaName": "ClassificationSystems",
105
+ "classNames": [
106
+ "ElementHasClassifications"
107
+ ]
108
+ },
109
+ "relatedClasses": {
110
+ "schemaName": "BisCore",
111
+ "classNames": [
112
+ "Element"
113
+ ]
114
+ },
115
+ "requiredDirection": "Backward",
116
+ "groupByClass": false,
117
+ "groupByLabel": false
118
+ }
119
+ ]
120
+ }
121
+ ]
122
+ }
@@ -0,0 +1,50 @@
1
+ import * as React from "react";
2
+ import { CommonProps } from "@itwin/core-react";
3
+ import { RelativePosition } from "@itwin/appui-abstract";
4
+ import "./Popup.scss";
5
+ /** Properties for the [[Popup]] component */
6
+ export interface PopupProps extends CommonProps {
7
+ /** show or hide the box shadow */
8
+ showShadow: boolean;
9
+ /** show or hide the arrow */
10
+ showArrow: boolean;
11
+ /** indicate if the popup is shown or not */
12
+ isShown: boolean;
13
+ /** Direction (relative to the target) to which the popup is expanded */
14
+ position: RelativePosition;
15
+ /** Fixed position in the viewport */
16
+ fixedPosition?: {
17
+ top: number;
18
+ left: number;
19
+ };
20
+ /** target element */
21
+ context: HTMLElement | null;
22
+ /** Function called when the popup is opened */
23
+ onOpen?: () => void;
24
+ /** Function called when the popup is closed */
25
+ onClose?: () => void;
26
+ }
27
+ interface PopupState {
28
+ isShown: boolean;
29
+ position: RelativePosition;
30
+ }
31
+ /** Popup React component */
32
+ export declare class Popup extends React.Component<PopupProps, PopupState> {
33
+ private _popupRef;
34
+ private _targetElement?;
35
+ constructor(props: PopupProps, context?: any);
36
+ static defaultProps: Partial<PopupProps>;
37
+ componentDidMount(): void;
38
+ componentDidUpdate(previousProps: PopupProps): void;
39
+ componentWillUnmount(): void;
40
+ private _onBodyClick;
41
+ private _onEsc;
42
+ private _onShow;
43
+ private _onClose;
44
+ private _getContext;
45
+ private getPositionClassName;
46
+ private getPositionWithinViewport;
47
+ render(): JSX.Element;
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=Popup.d.ts.map
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.Popup = void 0;
30
+ const React = __importStar(require("react"));
31
+ const classnames_1 = __importDefault(require("classnames"));
32
+ const appui_abstract_1 = require("@itwin/appui-abstract");
33
+ require("./Popup.scss");
34
+ /** Popup React component */
35
+ class Popup extends React.Component {
36
+ constructor(props, context) {
37
+ super(props, context);
38
+ this._popupRef = React.createRef();
39
+ this._onBodyClick = (event) => {
40
+ const context = this._getContext();
41
+ // Ignore clicks on the popover or button
42
+ if (context === event.target) {
43
+ return;
44
+ }
45
+ if (context && context.contains(event.target)) {
46
+ return;
47
+ }
48
+ if (this._popupRef.current &&
49
+ (this._popupRef.current === event.target ||
50
+ this._popupRef.current.contains(event.target))) {
51
+ return;
52
+ }
53
+ this._onClose();
54
+ };
55
+ this._onEsc = (event) => {
56
+ // Esc key
57
+ if (event.key === "Escape") {
58
+ this._onClose();
59
+ }
60
+ };
61
+ this._getContext = () => this.props.context || this._targetElement;
62
+ this.state = { isShown: this.props.isShown, position: this.props.position };
63
+ }
64
+ componentDidMount() {
65
+ const popupElement = this._popupRef.current;
66
+ if (popupElement && popupElement.parentElement) {
67
+ this._targetElement = popupElement.parentElement;
68
+ }
69
+ }
70
+ componentDidUpdate(previousProps) {
71
+ if (this.props.isShown === previousProps.isShown)
72
+ return;
73
+ if (this.props.isShown) {
74
+ this._onShow();
75
+ }
76
+ else {
77
+ this._onClose();
78
+ }
79
+ }
80
+ componentWillUnmount() {
81
+ document.body.removeEventListener("click", this._onBodyClick, false);
82
+ document.body.removeEventListener("keydown", this._onEsc, false);
83
+ }
84
+ _onShow() {
85
+ if (this.state.isShown) {
86
+ return;
87
+ }
88
+ document.addEventListener("click", this._onBodyClick, true);
89
+ document.addEventListener("keydown", this._onEsc, true);
90
+ const newPosition = this.getPositionWithinViewport();
91
+ this.setState({ position: newPosition, isShown: true }, () => {
92
+ if (this.props.onOpen)
93
+ this.props.onOpen();
94
+ });
95
+ }
96
+ _onClose() {
97
+ if (!this.state.isShown) {
98
+ return;
99
+ }
100
+ document.removeEventListener("click", this._onBodyClick, true);
101
+ document.removeEventListener("keydown", this._onEsc, true);
102
+ // tslint:disable-next-line:tslint-react-set-state-usage
103
+ this.setState({ isShown: false, position: this.props.position }, () => {
104
+ if (this.props.onClose)
105
+ this.props.onClose();
106
+ });
107
+ }
108
+ getPositionClassName(position) {
109
+ switch (position) {
110
+ case appui_abstract_1.RelativePosition.TopLeft:
111
+ return classnames_1.default("tree-widget-search-popup-top-left");
112
+ case appui_abstract_1.RelativePosition.TopRight:
113
+ return classnames_1.default("tree-widget-search-popup-top-right");
114
+ case appui_abstract_1.RelativePosition.BottomLeft:
115
+ return classnames_1.default("tree-widget-search-popup-bottom-left");
116
+ case appui_abstract_1.RelativePosition.BottomRight:
117
+ return classnames_1.default("tree-widget-search-popup-bottom-right");
118
+ case appui_abstract_1.RelativePosition.Top:
119
+ return classnames_1.default("tree-widget-search-popup-top");
120
+ case appui_abstract_1.RelativePosition.Left:
121
+ return classnames_1.default("tree-widget-search-popup-left");
122
+ case appui_abstract_1.RelativePosition.Right:
123
+ return classnames_1.default("tree-widget-search-popup-right");
124
+ default:
125
+ return classnames_1.default("tree-widget-search-popup-bottom");
126
+ }
127
+ }
128
+ getPositionWithinViewport() {
129
+ const popupElement = this._popupRef.current;
130
+ if (!popupElement || !this._targetElement)
131
+ return this.props.position;
132
+ // Note: Cannot use DOMRect yet since it's experimental and not available in all browsers (Nov. 2018)
133
+ const viewportRect = {
134
+ left: window.scrollX,
135
+ top: window.scrollY,
136
+ right: window.scrollX + window.innerWidth,
137
+ bottom: window.scrollY + window.innerHeight,
138
+ };
139
+ const targetRect = this._targetElement.getBoundingClientRect();
140
+ const popupRect = popupElement.getBoundingClientRect();
141
+ const containerStyle = window.getComputedStyle(this._targetElement);
142
+ const offset = this.props.showArrow ? 12 : 4;
143
+ switch (this.props.position) {
144
+ case appui_abstract_1.RelativePosition.BottomRight: {
145
+ const bottomMargin = containerStyle.marginBottom
146
+ ? parseFloat(containerStyle.marginBottom)
147
+ : 0;
148
+ if (targetRect.bottom + popupRect.height + bottomMargin + offset >
149
+ viewportRect.bottom) {
150
+ return appui_abstract_1.RelativePosition.TopRight;
151
+ }
152
+ break;
153
+ }
154
+ case appui_abstract_1.RelativePosition.TopRight: {
155
+ const topMargin = containerStyle.marginTop
156
+ ? parseFloat(containerStyle.marginTop)
157
+ : 0;
158
+ if (targetRect.top - popupRect.height - topMargin - offset <
159
+ viewportRect.top) {
160
+ return appui_abstract_1.RelativePosition.BottomRight;
161
+ }
162
+ break;
163
+ }
164
+ case appui_abstract_1.RelativePosition.TopLeft: {
165
+ const topMargin = containerStyle.marginTop
166
+ ? parseFloat(containerStyle.marginTop)
167
+ : 0;
168
+ if (targetRect.top - popupRect.height - topMargin - offset <
169
+ viewportRect.top) {
170
+ return appui_abstract_1.RelativePosition.BottomLeft;
171
+ }
172
+ break;
173
+ }
174
+ case appui_abstract_1.RelativePosition.BottomLeft: {
175
+ const bottomMargin = containerStyle.marginBottom
176
+ ? parseFloat(containerStyle.marginBottom)
177
+ : 0;
178
+ if (targetRect.bottom + popupRect.height + bottomMargin + offset >
179
+ viewportRect.bottom) {
180
+ return appui_abstract_1.RelativePosition.TopLeft;
181
+ }
182
+ break;
183
+ }
184
+ case appui_abstract_1.RelativePosition.Bottom: {
185
+ const bottomMargin = containerStyle.marginBottom
186
+ ? parseFloat(containerStyle.marginBottom)
187
+ : 0;
188
+ if (targetRect.bottom + popupRect.height + bottomMargin + offset >
189
+ viewportRect.bottom) {
190
+ return appui_abstract_1.RelativePosition.Top;
191
+ }
192
+ break;
193
+ }
194
+ case appui_abstract_1.RelativePosition.Top: {
195
+ const topMargin = containerStyle.marginTop
196
+ ? parseFloat(containerStyle.marginTop)
197
+ : 0;
198
+ if (targetRect.top - popupRect.height - topMargin - offset <
199
+ viewportRect.top) {
200
+ return appui_abstract_1.RelativePosition.Bottom;
201
+ }
202
+ break;
203
+ }
204
+ case appui_abstract_1.RelativePosition.Left: {
205
+ const leftMargin = containerStyle.marginLeft
206
+ ? parseFloat(containerStyle.marginLeft)
207
+ : 0;
208
+ if (targetRect.left - popupRect.width - leftMargin - offset <
209
+ viewportRect.left) {
210
+ return appui_abstract_1.RelativePosition.Right;
211
+ }
212
+ break;
213
+ }
214
+ case appui_abstract_1.RelativePosition.Right: {
215
+ const rightMargin = containerStyle.marginRight
216
+ ? parseFloat(containerStyle.marginRight)
217
+ : 0;
218
+ if (targetRect.right + popupRect.width + rightMargin + offset >
219
+ viewportRect.right) {
220
+ return appui_abstract_1.RelativePosition.Left;
221
+ }
222
+ break;
223
+ }
224
+ }
225
+ return this.props.position;
226
+ }
227
+ render() {
228
+ const className = classnames_1.default("tree-widget-search-popup", this.getPositionClassName(this.state.position), this.props.showShadow && "tree-widget-search-popup-shadow", this.state.isShown && "visible", this.props.showArrow && "arrow", this.props.className);
229
+ let style;
230
+ if (this.props.fixedPosition) {
231
+ style = {
232
+ top: this.props.fixedPosition.top,
233
+ left: this.props.fixedPosition.left,
234
+ position: "fixed",
235
+ };
236
+ }
237
+ return (React.createElement("div", { style: style, className: className, ref: this._popupRef }, this.props.children));
238
+ }
239
+ }
240
+ exports.Popup = Popup;
241
+ Popup.defaultProps = {
242
+ position: appui_abstract_1.RelativePosition.Bottom,
243
+ showShadow: true,
244
+ showArrow: false,
245
+ };
246
+ //# sourceMappingURL=Popup.js.map