@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,316 @@
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-search-popup {
8
+ display: block;
9
+ box-sizing: border-box;
10
+ position: absolute;
11
+ // border-radius: 4px;
12
+ background: $buic-background-1;
13
+ border: 1px solid $buic-background-panel-stroke;
14
+ visibility: hidden;
15
+ z-index: 100;
16
+ animation-duration: 250ms;
17
+ animation-timing-function: ease;
18
+ animation-fill-mode: forwards;
19
+ }
20
+
21
+ .tree-widget-search-popup.arrow::after,
22
+ .tree-widget-search-popup.arrow::before {
23
+ border: solid transparent;
24
+ content: " ";
25
+ height: 0;
26
+ width: 0;
27
+ position: absolute;
28
+ pointer-events: none;
29
+ }
30
+
31
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-left.arrow::after,
32
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-left.arrow::before {
33
+ bottom: 100%;
34
+ left: 25%;
35
+ }
36
+
37
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-right.arrow::after,
38
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-right.arrow::before {
39
+ bottom: 100%;
40
+ left: 75%;
41
+ }
42
+
43
+ .tree-widget-search-popup.tree-widget-search-popup-bottom.arrow::after,
44
+ .tree-widget-search-popup.tree-widget-search-popup-bottom.arrow::before {
45
+ bottom: 100%;
46
+ left: 50%;
47
+ }
48
+
49
+ .tree-widget-search-popup.tree-widget-search-popup-top.arrow::after,
50
+ .tree-widget-search-popup.tree-widget-search-popup-top.arrow::before {
51
+ top: 100%;
52
+ left: 50%;
53
+ }
54
+
55
+ .tree-widget-search-popup.tree-widget-search-popup-top-left.arrow::after,
56
+ .tree-widget-search-popup.tree-widget-search-popup-top-left.arrow::before {
57
+ top: 100%;
58
+ left: 25%;
59
+ }
60
+
61
+ .tree-widget-search-popup.tree-widget-search-popup-top-right.arrow::after,
62
+ .tree-widget-search-popup.tree-widget-search-popup-top-right.arrow::before {
63
+ top: 100%;
64
+ left: 75%;
65
+ }
66
+
67
+ .tree-widget-search-popup.tree-widget-search-popup-left.arrow::after,
68
+ .tree-widget-search-popup.tree-widget-search-popup-left.arrow::before {
69
+ top: 50%;
70
+ left: 100%;
71
+ }
72
+
73
+ .tree-widget-search-popup.tree-widget-search-popup-right.arrow::after,
74
+ .tree-widget-search-popup.tree-widget-search-popup-right.arrow::before {
75
+ top: 50%;
76
+ right: 100%;
77
+ }
78
+
79
+ .tree-widget-search-popup.tree-widget-search-popup-bottom.arrow::before,
80
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-left.arrow::before,
81
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-right.arrow::before {
82
+ border-bottom-color: inherit;
83
+ border-width: 9px;
84
+ margin-left: -9px;
85
+ }
86
+
87
+ .tree-widget-search-popup.tree-widget-search-popup-top.arrow::before,
88
+ .tree-widget-search-popup.tree-widget-search-popup-top-left.arrow::before,
89
+ .tree-widget-search-popup.tree-widget-search-popup-top-right.arrow::before {
90
+ border-top-color: inherit;
91
+ border-width: 9px;
92
+ margin-left: -9px;
93
+ }
94
+
95
+ .tree-widget-search-popup.tree-widget-search-popup-left.arrow::before {
96
+ border-left-color: inherit;
97
+ border-width: 9px;
98
+ margin-top: -9px;
99
+ }
100
+
101
+ .tree-widget-search-popup.tree-widget-search-popup-right.arrow::before {
102
+ border-right-color: inherit;
103
+ border-width: 9px;
104
+ margin-top: -9px;
105
+ }
106
+
107
+ .tree-widget-search-popup.tree-widget-search-popup-bottom.arrow::after,
108
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-left.arrow::after,
109
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-right.arrow::after {
110
+ border-bottom-color: currentColor;
111
+ border-width: 8px;
112
+ margin-left: -8px;
113
+ }
114
+
115
+ .tree-widget-search-popup.tree-widget-search-popup-top.arrow::after,
116
+ .tree-widget-search-popup.tree-widget-search-popup-top-left.arrow::after,
117
+ .tree-widget-search-popup.tree-widget-search-popup-top-right.arrow::after {
118
+ border-top-color: currentColor;
119
+ border-width: 8px;
120
+ margin-left: -8px;
121
+ }
122
+
123
+ .tree-widget-search-popup.tree-widget-search-popup-left.arrow::after {
124
+ border-left-color: currentColor;
125
+ border-width: 8px;
126
+ margin-top: -8px;
127
+ }
128
+
129
+ .tree-widget-search-popup.tree-widget-search-popup-right.arrow::after {
130
+ border-right-color: currentColor;
131
+ border-width: 8px;
132
+ margin-top: -8px;
133
+ }
134
+
135
+ .tree-widget-search-popup-top-left {
136
+ top: -4px;
137
+ left: 0;
138
+ transform: translateY(-100%);
139
+ transform-origin: left bottom 0;
140
+ }
141
+
142
+ .tree-widget-search-popup.tree-widget-search-popup-top-left.visible {
143
+ animation-name: dr-animate-top-corner;
144
+ }
145
+
146
+ .tree-widget-search-popup-top {
147
+ top: -4px;
148
+ left: 50%;
149
+ transform: translate(-50%, -100%);
150
+ transform-origin: bottom;
151
+ }
152
+
153
+ .tree-widget-search-popup.tree-widget-search-popup-top.visible {
154
+ animation-name: dr-animate-top;
155
+ }
156
+
157
+ .tree-widget-search-popup-top-right {
158
+ top: -4px;
159
+ right: 0;
160
+ transform: translateY(-100%);
161
+ transform-origin: right bottom 0;
162
+ }
163
+
164
+ .tree-widget-search-popup.tree-widget-search-popup-top-right.visible {
165
+ animation-name: dr-animate-top-corner;
166
+ }
167
+
168
+ .tree-widget-search-popup-bottom-left {
169
+ top: calc(100% + 0px);
170
+ left: 0;
171
+ transform-origin: left top 0;
172
+ }
173
+
174
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-left.visible {
175
+ animation-name: dr-animate-bottom-corner;
176
+ }
177
+
178
+ .tree-widget-search-popup-bottom {
179
+ top: calc(100% + 4px);
180
+ left: 50%;
181
+ transform: translateX(-50%);
182
+ transform-origin: top;
183
+ }
184
+
185
+ .tree-widget-search-popup.tree-widget-search-popup-bottom.visible {
186
+ animation-name: dr-animate-bottom;
187
+ }
188
+
189
+ .tree-widget-search-popup-bottom-right {
190
+ top: calc(100% + 4px);
191
+ right: 0;
192
+ transform-origin: right top 0;
193
+ }
194
+
195
+ .tree-widget-search-popup.tree-widget-search-popup-bottom-right.visible {
196
+ animation-name: dr-animate-bottom-corner;
197
+ }
198
+
199
+ .tree-widget-search-popup-left {
200
+ left: -4px;
201
+ top: 50%;
202
+ transform: translate(-100%, -50%);
203
+ transform-origin: right;
204
+ }
205
+
206
+ .tree-widget-search-popup.popup-left.visible {
207
+ animation-name: dr-animate-left;
208
+ }
209
+
210
+ .tree-widget-search-popup-right {
211
+ right: -4px;
212
+ top: 50%;
213
+ transform: translate(100%, -50%);
214
+ transform-origin: left;
215
+ }
216
+
217
+ .tree-widget-search-popup.popup-right.visible {
218
+ animation-name: dr-animate-right;
219
+ }
220
+
221
+ .tree-widget-search-popup.popup-bottom-left.arrow,
222
+ .tree-widget-search-popup.popup-bottom.arrow,
223
+ .tree-widget-search-popup.popup-bottom-right.arrow {
224
+ top: calc(100% + 12px);
225
+ }
226
+
227
+ .tree-widget-search-popup.popup-top.arrow,
228
+ .tree-widget-search-popup.popup-top-left.arrow,
229
+ .tree-widget-search-popup.popup-top-right.arrow {
230
+ top: -12px;
231
+ }
232
+
233
+ .tree-widget-search-popup.popup-left.arrow {
234
+ left: -12px;
235
+ }
236
+
237
+ .tree-widget-search-popup.popup-right.arrow {
238
+ right: -12px;
239
+ }
240
+
241
+ .tree-widget-search-popup-shadow {
242
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25);
243
+ background-clip: padding-box;
244
+ }
245
+
246
+ @keyframes dr-animate-bottom {
247
+ from {
248
+ visibility: hidden;
249
+ transform: translateX(-50%) scale(1, 0);
250
+ }
251
+
252
+ to {
253
+ visibility: visible;
254
+ transform: translateX(-50%) scale(1);
255
+ }
256
+ }
257
+
258
+ @keyframes dr-animate-top {
259
+ from {
260
+ visibility: hidden;
261
+ transform: translate(-50%, -100%) scale(1, 0);
262
+ }
263
+
264
+ to {
265
+ visibility: visible;
266
+ transform: translate(-50%, -100%) scale(1);
267
+ }
268
+ }
269
+
270
+ @keyframes dr-animate-top-corner {
271
+ from {
272
+ visibility: hidden;
273
+ transform: translateY(-100%) scale(0);
274
+ }
275
+
276
+ to {
277
+ visibility: visible;
278
+ transform: translateY(-100%) scale(1);
279
+ }
280
+ }
281
+
282
+ @keyframes dr-animate-bottom-corner {
283
+ from {
284
+ visibility: hidden;
285
+ transform: scale(0);
286
+ }
287
+
288
+ to {
289
+ visibility: visible;
290
+ transform: scale(1);
291
+ }
292
+ }
293
+
294
+ @keyframes dr-animate-left {
295
+ from {
296
+ visibility: hidden;
297
+ transform: translate(-100%, -50%) scale(0, 1);
298
+ }
299
+
300
+ to {
301
+ visibility: visible;
302
+ transform: translate(-100%, -50%) scale(1);
303
+ }
304
+ }
305
+
306
+ @keyframes dr-animate-right {
307
+ from {
308
+ visibility: hidden;
309
+ transform: translate(100%, -50%) scale(0, 1);
310
+ }
311
+
312
+ to {
313
+ visibility: visible;
314
+ transform: translate(100%, -50%) scale(1);
315
+ }
316
+ }
@@ -0,0 +1,53 @@
1
+ import * as React from "react";
2
+ import { CommonProps } from "@itwin/core-react";
3
+ import "./SearchBar.scss";
4
+ export declare enum Alignment {
5
+ Left = 0,
6
+ Right = 1
7
+ }
8
+ export interface SearchBarProps extends CommonProps {
9
+ /** value to set SearchBox */
10
+ value?: string;
11
+ /** Enable or disable dropdown functionality. If disabled, searchbox simply expands without displaying the group button */
12
+ enableGrouping: boolean;
13
+ /** show the search box in the open (expanded) state */
14
+ showSearch?: boolean;
15
+ /** alignment content to the left or right of the search bar */
16
+ alignment?: Alignment;
17
+ /** searchbox frequency to poll for changes in value (milliseconds) */
18
+ valueChangedDelay?: number;
19
+ /** searchbox placeholder value to show in gray before anything is entered in */
20
+ placeholder?: string;
21
+ /** title (tooltip) */
22
+ title?: string;
23
+ /** Tells the component if parent component is still handling the filtering */
24
+ filteringInProgress?: boolean;
25
+ /** Filtering is cleared after everything's loaded */
26
+ onFilterStart: (newFilter: string) => void;
27
+ /** Filtering is cleared after everything's loaded */
28
+ onFilterCancel?: () => void;
29
+ /** Filtering is cleared after everything's loaded */
30
+ onFilterClear?: () => void;
31
+ /** Total number of results/entries */
32
+ resultCount: number;
33
+ /** Callback to currently selected result/entry change */
34
+ onSelectedChanged: (index: number) => void;
35
+ }
36
+ interface SearchBarState {
37
+ showSearch: boolean;
38
+ showDropdown: boolean;
39
+ }
40
+ /** SearchBox with expanding search box capability */
41
+ export declare class SearchBar extends React.PureComponent<SearchBarProps, SearchBarState> {
42
+ private _target;
43
+ private _searchBox;
44
+ static defaultProps: Partial<SearchBarProps>;
45
+ constructor(props: any);
46
+ componentDidUpdate(prevProps: SearchBarProps): Promise<void>;
47
+ private _onToggleSearch;
48
+ private _onCloseDropdown;
49
+ private _onToggleDropdown;
50
+ render(): JSX.Element;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=SearchBar.d.ts.map
@@ -0,0 +1,71 @@
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 * as React from "react";
6
+ import classnames from "classnames";
7
+ import { RelativePosition } from "@itwin/appui-abstract";
8
+ import { Popup } from "./Popup";
9
+ import { SearchBox } from "./SearchBox";
10
+ import { IconButton } from "../IconButton";
11
+ import "./SearchBar.scss";
12
+ export var Alignment;
13
+ (function (Alignment) {
14
+ Alignment[Alignment["Left"] = 0] = "Left";
15
+ Alignment[Alignment["Right"] = 1] = "Right";
16
+ })(Alignment || (Alignment = {}));
17
+ /** SearchBox with expanding search box capability */
18
+ export class SearchBar extends React.PureComponent {
19
+ constructor(props) {
20
+ super(props);
21
+ this._target = null;
22
+ this._searchBox = React.createRef();
23
+ this._onToggleSearch = (_event) => {
24
+ const showSearch = !this.state.showSearch;
25
+ this.setState({ showSearch }, () => {
26
+ if (showSearch && this._searchBox.current)
27
+ setTimeout(() => {
28
+ if (this._searchBox.current)
29
+ this._searchBox.current.focus();
30
+ }, 100); // timeout allows the search bar animation to complete!
31
+ });
32
+ };
33
+ this._onCloseDropdown = () => {
34
+ this.setState({ showDropdown: false });
35
+ };
36
+ this._onToggleDropdown = () => {
37
+ this.setState((prevState) => ({ showDropdown: !prevState.showDropdown }));
38
+ };
39
+ this.state = { showSearch: props.showSearch, showDropdown: false };
40
+ }
41
+ async componentDidUpdate(prevProps) {
42
+ if (prevProps.value !== this.props.value) {
43
+ }
44
+ }
45
+ render() {
46
+ const { value, alignment, valueChangedDelay, placeholder, enableGrouping, title, } = this.props;
47
+ const { showSearch, showDropdown } = this.state;
48
+ const classes = classnames("tree-widget-search-bar", this.props.className);
49
+ const searchBoxClassName = classnames("search-bar-search-box", showSearch && "show");
50
+ const searchIconClassName = classnames("search-bar-search-icon", showSearch ? "hide" : "show");
51
+ const groupButtonClassName = classnames("search-bar-group-button2", showSearch && enableGrouping && "show");
52
+ const contentClassName = classnames("search-bar-button-container", showSearch && "hide", alignment === Alignment.Right && "right");
53
+ const searchBarContainerClassName = classnames("search-bar-search-container", enableGrouping && "search-bar-grouping-enabled");
54
+ return (React.createElement("div", { className: classes },
55
+ React.createElement("div", { className: groupButtonClassName, ref: (element) => {
56
+ this._target = element;
57
+ } },
58
+ React.createElement(IconButton, { icon: "icon-more-2", onClick: this._onToggleDropdown })),
59
+ React.createElement("div", { className: contentClassName }, this.props.children),
60
+ React.createElement("div", { className: searchBarContainerClassName },
61
+ React.createElement(SearchBox, { ref: this._searchBox, className: searchBoxClassName, searchText: value, valueChangedDelay: valueChangedDelay, placeholder: placeholder, onFilterCancel: this.props.onFilterCancel, onFilterClear: this.props.onFilterClear, onFilterStart: this.props.onFilterStart, resultCount: this.props.resultCount, onIconClick: this._onToggleSearch, onSelectedChanged: this.props.onSelectedChanged })),
62
+ React.createElement(IconButton, { className: searchIconClassName, icon: "icon-search", onClick: this._onToggleSearch, title: title }),
63
+ showSearch && (React.createElement(Popup, { isShown: showDropdown, position: RelativePosition.BottomLeft, onClose: this._onCloseDropdown, context: this._target },
64
+ React.createElement("div", { className: "search-bar-dropdown-container" }, this.props.children)))));
65
+ }
66
+ }
67
+ SearchBar.defaultProps = {
68
+ alignment: Alignment.Left,
69
+ enableGrouping: true,
70
+ };
71
+ //# sourceMappingURL=SearchBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchBar.js","sourceRoot":"","sources":["../../../../src/components/search-bar/SearchBar.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 * as React from \"react\";\nimport classnames from \"classnames\";\nimport { CommonProps } from \"@itwin/core-react\";\nimport { RelativePosition } from \"@itwin/appui-abstract\";\nimport { Popup } from \"./Popup\";\nimport { SearchBox } from \"./SearchBox\";\nimport { IconButton } from \"../IconButton\";\nimport \"./SearchBar.scss\";\n\nexport enum Alignment {\n Left = 0,\n Right = 1,\n}\n\nexport interface SearchBarProps extends CommonProps {\n /** value to set SearchBox */\n value?: string;\n /** Enable or disable dropdown functionality. If disabled, searchbox simply expands without displaying the group button */\n enableGrouping: boolean;\n /** show the search box in the open (expanded) state */\n showSearch?: boolean;\n /** alignment content to the left or right of the search bar */\n alignment?: Alignment;\n /** searchbox frequency to poll for changes in value (milliseconds) */\n valueChangedDelay?: number;\n /** searchbox placeholder value to show in gray before anything is entered in */\n placeholder?: string;\n /** title (tooltip) */\n title?: string;\n /** Tells the component if parent component is still handling the filtering */\n filteringInProgress?: boolean;\n /** Filtering is cleared after everything's loaded */\n onFilterStart: (newFilter: string) => void;\n /** Filtering is cleared after everything's loaded */\n onFilterCancel?: () => void;\n /** Filtering is cleared after everything's loaded */\n onFilterClear?: () => void;\n /** Total number of results/entries */\n resultCount: number;\n /** Callback to currently selected result/entry change */\n onSelectedChanged: (index: number) => void;\n}\n\ninterface SearchBarState {\n showSearch: boolean;\n showDropdown: boolean;\n}\n\n/** SearchBox with expanding search box capability */\nexport class SearchBar extends React.PureComponent<\n SearchBarProps,\n SearchBarState\n > {\n private _target: HTMLElement | null = null;\n private _searchBox = React.createRef<SearchBox>();\n\n public static defaultProps: Partial<SearchBarProps> = {\n alignment: Alignment.Left,\n enableGrouping: true,\n };\n\n constructor(props: any) {\n super(props);\n\n this.state = { showSearch: props.showSearch, showDropdown: false };\n }\n\n public async componentDidUpdate(prevProps: SearchBarProps) {\n if (prevProps.value !== this.props.value) {\n }\n }\n\n private _onToggleSearch = (\n _event?: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n const showSearch = !this.state.showSearch;\n this.setState({ showSearch }, () => {\n if (showSearch && this._searchBox.current)\n setTimeout(() => {\n if (this._searchBox.current) this._searchBox.current.focus();\n }, 100); // timeout allows the search bar animation to complete!\n });\n };\n\n private _onCloseDropdown = () => {\n this.setState({ showDropdown: false });\n };\n\n private _onToggleDropdown = () => {\n this.setState((prevState) => ({ showDropdown: !prevState.showDropdown }));\n };\n\n public render() {\n const {\n value,\n alignment,\n valueChangedDelay,\n placeholder,\n enableGrouping,\n title,\n } = this.props;\n const { showSearch, showDropdown } = this.state;\n\n const classes = classnames(\"tree-widget-search-bar\", this.props.className);\n const searchBoxClassName = classnames(\n \"search-bar-search-box\",\n showSearch && \"show\"\n );\n const searchIconClassName = classnames(\n \"search-bar-search-icon\",\n showSearch ? \"hide\" : \"show\"\n );\n const groupButtonClassName = classnames(\n \"search-bar-group-button2\",\n showSearch && enableGrouping && \"show\"\n );\n const contentClassName = classnames(\n \"search-bar-button-container\",\n showSearch && \"hide\",\n alignment === Alignment.Right && \"right\"\n );\n const searchBarContainerClassName = classnames(\n \"search-bar-search-container\",\n enableGrouping && \"search-bar-grouping-enabled\",\n );\n\n return (\n <div className={classes}>\n <div\n className={groupButtonClassName}\n ref={(element) => {\n this._target = element;\n }}\n >\n <IconButton icon=\"icon-more-2\" onClick={this._onToggleDropdown} />\n </div>\n <div className={contentClassName}>{this.props.children}</div>\n <div className={searchBarContainerClassName}>\n <SearchBox\n ref={this._searchBox}\n className={searchBoxClassName}\n searchText={value}\n valueChangedDelay={valueChangedDelay}\n placeholder={placeholder}\n onFilterCancel={this.props.onFilterCancel}\n onFilterClear={this.props.onFilterClear}\n onFilterStart={this.props.onFilterStart}\n resultCount={this.props.resultCount}\n onIconClick={this._onToggleSearch}\n onSelectedChanged={this.props.onSelectedChanged}\n />\n </div>\n <IconButton\n className={searchIconClassName}\n icon=\"icon-search\"\n onClick={this._onToggleSearch}\n title={title}\n />\n {showSearch && (\n <Popup\n isShown={showDropdown}\n position={RelativePosition.BottomLeft}\n onClose={this._onCloseDropdown}\n context={this._target}\n >\n <div className=\"search-bar-dropdown-container\">\n {this.props.children}\n </div>\n </Popup>\n )}\n </div>\n );\n }\n}\n"]}
@@ -0,0 +1,110 @@
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-search-bar {
8
+ display: flex;
9
+ align-items: center;
10
+ position: relative;
11
+
12
+ // "..." group button
13
+ .search-bar-group-button2 {
14
+ opacity: 0;
15
+ display: none;
16
+ animation: hide ease-in 0.1s;
17
+ animation-fill-mode: forwards;
18
+
19
+ &.search-bar-group-button2.show {
20
+ animation: show ease-in 0.25s;
21
+ animation-delay: 0.1s;
22
+ animation-fill-mode: forwards;
23
+ display: block;
24
+ }
25
+ }
26
+
27
+ // button container
28
+ .search-bar-button-container {
29
+ display: flex;
30
+ align-items: center;
31
+
32
+ &.right {
33
+ justify-content: flex-end;
34
+ }
35
+
36
+ &.hide {
37
+ display: none;
38
+ }
39
+ }
40
+
41
+ // dropdown container
42
+ .search-bar-dropdown-container {
43
+ display: flex;
44
+ align-items: center;
45
+ padding: 0 $uicore-s;
46
+ }
47
+
48
+ // override of the search box styling
49
+ .search-bar-search-icon {
50
+ position: absolute;
51
+ right: 0;
52
+ opacity: 0;
53
+ transition: all 0.2s ease;
54
+ color: $buic-icon-color;
55
+ &.show {
56
+ opacity: 1;
57
+ }
58
+ }
59
+
60
+ // search box container
61
+ .search-bar-search-container {
62
+ flex: 1;
63
+ height: 100%;
64
+ position: absolute;
65
+ left: 0;
66
+
67
+ .search-bar-search-box {
68
+ height: 32px;
69
+ float: right;
70
+ margin-right: 0;
71
+ box-sizing: border-box;
72
+ width: 0px;
73
+ visibility: hidden;
74
+ opacity: 0;
75
+ overflow: hidden;
76
+ transition: all 0.25s ease;
77
+
78
+ &.show {
79
+ visibility: visible;
80
+ opacity: 1;
81
+ width: 100%;
82
+ }
83
+ }
84
+
85
+ &.search-bar-grouping-enabled {
86
+ left: 32px;
87
+ }
88
+ }
89
+ }
90
+
91
+ @keyframes show {
92
+ 0% {
93
+ opacity: 0;
94
+ }
95
+ 100% {
96
+ opacity: 1;
97
+ }
98
+ }
99
+
100
+ @keyframes hide {
101
+ 0% {
102
+ opacity: 1;
103
+ visibility: visible;
104
+ }
105
+
106
+ 100% {
107
+ opacity: 0;
108
+ visibility: hidden;
109
+ }
110
+ }
@@ -0,0 +1,76 @@
1
+ /** @module SearchBox */
2
+ import * as React from "react";
3
+ import { CommonProps } from "@itwin/core-react";
4
+ import "./SearchBox.scss";
5
+ export interface SearchBoxProps extends CommonProps {
6
+ /** value to set SearchBox */
7
+ searchText?: string;
8
+ /** placeholder value to show in gray before anything is entered in */
9
+ placeholder?: string;
10
+ /** frequency to poll for changes in value */
11
+ valueChangedDelay?: number;
12
+ /** listens for <Enter> keypress */
13
+ onEnterPressed?: () => void;
14
+ /** listens for <Esc> keypress */
15
+ onEscPressed?: () => void;
16
+ /** listens for onClick event for Clear (x) icon */
17
+ onClear?: () => void;
18
+ /** Search or clear icon click */
19
+ onIconClick?: () => void;
20
+ /** Filtering is cleared after everything's loaded */
21
+ onFilterStart: (newFilter: string) => void;
22
+ /** Filtering is cleared after everything's loaded */
23
+ onFilterClear?: () => void;
24
+ /** Filtering is cleared after everything's loaded */
25
+ onFilterCancel?: () => void;
26
+ /** Tells the component if parent component is still handling the filtering */
27
+ filteringInProgress?: boolean;
28
+ /** Total number of results/entries */
29
+ resultCount: number;
30
+ /** Callback to currently selected result/entry change */
31
+ onSelectedChanged: (index: number) => void;
32
+ /** Specify that the <input> element should automatically get focus */
33
+ autoFocus?: boolean;
34
+ }
35
+ /**
36
+ * Enumeration of possible component contexts
37
+ * @internal
38
+ */
39
+ export declare enum InputContext {
40
+ /** Component is ready to filter */
41
+ ReadyToFilter = 0,
42
+ /** Component's parent is currently filtering */
43
+ FilteringInProgress = 1,
44
+ /** Component's parent has finished filtering */
45
+ FilteringFinished = 2,
46
+ /** Component's parent has finished filtering, but ResultSelector(stepping through results) is not enabled */
47
+ FilteringFinishedWithNoStepping = 3
48
+ }
49
+ interface SearchBoxState {
50
+ searchText?: string;
51
+ /** @internal */
52
+ context: InputContext;
53
+ /** Currently selected index */
54
+ selectedIndex: number;
55
+ }
56
+ export declare class SearchBox extends React.PureComponent<SearchBoxProps, SearchBoxState> {
57
+ private _inputElement;
58
+ private _timeoutId;
59
+ constructor(props: SearchBoxProps);
60
+ focus(): void;
61
+ private _trackChange;
62
+ private _handleKeyDown;
63
+ private _handleIconClick;
64
+ private _unsetTimeout;
65
+ componentDidUpdate(prevProps: SearchBoxProps): Promise<void>;
66
+ componentWillUnmount(): void;
67
+ /** @internal */
68
+ static getDerivedStateFromProps(props: SearchBoxProps, state: SearchBoxState): {
69
+ context: InputContext;
70
+ } | null;
71
+ private _onPrevClick;
72
+ private _onNextClick;
73
+ render(): JSX.Element;
74
+ }
75
+ export {};
76
+ //# sourceMappingURL=SearchBox.d.ts.map