@deephaven/components 0.82.0 → 0.82.1-beta.2

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 (68) hide show
  1. package/dist/index.d.ts +0 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +0 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/spectrum/comboBox/ComboBox.d.ts +7 -0
  6. package/dist/spectrum/comboBox/ComboBox.d.ts.map +1 -0
  7. package/dist/spectrum/comboBox/ComboBox.js +41 -0
  8. package/dist/spectrum/comboBox/ComboBox.js.map +1 -0
  9. package/dist/spectrum/comboBox/index.d.ts +2 -0
  10. package/dist/spectrum/comboBox/index.d.ts.map +1 -0
  11. package/dist/spectrum/comboBox/index.js +2 -0
  12. package/dist/spectrum/comboBox/index.js.map +1 -0
  13. package/dist/spectrum/index.d.ts +1 -1
  14. package/dist/spectrum/index.d.ts.map +1 -1
  15. package/dist/spectrum/index.js +1 -1
  16. package/dist/spectrum/index.js.map +1 -1
  17. package/dist/spectrum/picker/Picker.d.ts +2 -25
  18. package/dist/spectrum/picker/Picker.d.ts.map +1 -1
  19. package/dist/spectrum/picker/Picker.js +21 -67
  20. package/dist/spectrum/picker/Picker.js.map +1 -1
  21. package/dist/spectrum/picker/PickerNormalized.d.ts +1 -8
  22. package/dist/spectrum/picker/PickerNormalized.d.ts.map +1 -1
  23. package/dist/spectrum/picker/PickerNormalized.js +2 -2
  24. package/dist/spectrum/picker/PickerNormalized.js.map +1 -1
  25. package/dist/spectrum/picker/PickerProps.d.ts +64 -0
  26. package/dist/spectrum/picker/PickerProps.d.ts.map +1 -0
  27. package/dist/spectrum/picker/PickerProps.js +2 -0
  28. package/dist/spectrum/picker/PickerProps.js.map +1 -0
  29. package/dist/spectrum/picker/index.d.ts +3 -0
  30. package/dist/spectrum/picker/index.d.ts.map +1 -1
  31. package/dist/spectrum/picker/index.js +3 -0
  32. package/dist/spectrum/picker/index.js.map +1 -1
  33. package/dist/spectrum/picker/usePickerItemScale.d.ts +9 -0
  34. package/dist/spectrum/picker/usePickerItemScale.d.ts.map +1 -0
  35. package/dist/spectrum/picker/usePickerItemScale.js +17 -0
  36. package/dist/spectrum/picker/usePickerItemScale.js.map +1 -0
  37. package/dist/spectrum/picker/usePickerProps.d.ts +23 -0
  38. package/dist/spectrum/picker/usePickerProps.d.ts.map +1 -0
  39. package/dist/spectrum/picker/usePickerProps.js +70 -0
  40. package/dist/spectrum/picker/usePickerProps.js.map +1 -0
  41. package/dist/spectrum/utils/index.d.ts +2 -0
  42. package/dist/spectrum/utils/index.d.ts.map +1 -1
  43. package/dist/spectrum/utils/index.js +2 -0
  44. package/dist/spectrum/utils/index.js.map +1 -1
  45. package/dist/spectrum/utils/itemUtils.d.ts +7 -2
  46. package/dist/spectrum/utils/itemUtils.d.ts.map +1 -1
  47. package/dist/spectrum/utils/itemUtils.js +13 -0
  48. package/dist/spectrum/utils/itemUtils.js.map +1 -1
  49. package/dist/spectrum/utils/itemWrapperUtils.d.ts.map +1 -1
  50. package/dist/spectrum/utils/itemWrapperUtils.js +2 -2
  51. package/dist/spectrum/utils/itemWrapperUtils.js.map +1 -1
  52. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.d.ts +19 -0
  53. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.d.ts.map +1 -0
  54. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js +31 -0
  55. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js.map +1 -0
  56. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.d.ts +10 -0
  57. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.d.ts.map +1 -0
  58. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js +27 -0
  59. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js.map +1 -0
  60. package/package.json +7 -7
  61. package/dist/ComboBox.d.ts +0 -120
  62. package/dist/ComboBox.d.ts.map +0 -1
  63. package/dist/ComboBox.js +0 -497
  64. package/dist/ComboBox.js.map +0 -1
  65. package/dist/spectrum/pickers.d.ts +0 -2
  66. package/dist/spectrum/pickers.d.ts.map +0 -1
  67. package/dist/spectrum/pickers.js +0 -2
  68. package/dist/spectrum/pickers.js.map +0 -1
@@ -1,120 +0,0 @@
1
- /**
2
- * Combobox that combines a input box with a searchable dropdown menu
3
- *
4
- * props:
5
- * @param {array} options :[{
6
- * title: 'option title for display',
7
- * value: 'option value' //option value
8
- * }]
9
- * @param {string} inputPlaceholder place holder for the input box
10
- * @param {string} searchPlaceholder place holder for the search box in drop down search box
11
- * @param {boolean} disabled disable both input & drop down
12
- *
13
- *
14
- */
15
- import React, { Component } from 'react';
16
- import PropTypes from 'prop-types';
17
- import memoize from 'memoizee';
18
- import { PopperOptions } from 'popper.js';
19
- import SearchInput from './SearchInput';
20
- import { Popper } from './popper';
21
- import './ComboBox.scss';
22
- interface ComboBoxOption {
23
- title: string;
24
- value: string;
25
- }
26
- interface ComboBoxProps {
27
- options: ComboBoxOption[];
28
- popperOptions: PopperOptions;
29
- onChange: (value: string) => void;
30
- inputPlaceholder: string;
31
- searchPlaceholder: string;
32
- disabled: boolean;
33
- className: string;
34
- defaultValue: string;
35
- spellCheck: boolean;
36
- onEnter: () => void;
37
- 'data-testid'?: string;
38
- }
39
- interface ComboBoxState {
40
- value: string;
41
- filter: string;
42
- filteredOptions: ComboBoxOption[];
43
- keyboardOptionIndex: number;
44
- menuIsOpen: boolean;
45
- inputWidth: number;
46
- }
47
- declare enum MENU_NAVIGATION_DIRECTION {
48
- UP = "UP",
49
- DOWN = "DOWN"
50
- }
51
- declare class ComboBox extends Component<ComboBoxProps, ComboBoxState> {
52
- static MENU_NAVIGATION_DIRECTION: typeof MENU_NAVIGATION_DIRECTION;
53
- static DROP_DOWN_MENU_HEIGHT: number;
54
- static propTypes: {
55
- options: PropTypes.Validator<(PropTypes.InferProps<{
56
- title: PropTypes.Validator<string>;
57
- value: PropTypes.Validator<string>;
58
- }> | null | undefined)[]>;
59
- popperOptions: PropTypes.Requireable<PropTypes.InferProps<{
60
- title: PropTypes.Validator<string>;
61
- value: PropTypes.Validator<string>;
62
- }>>;
63
- onChange: PropTypes.Requireable<(...args: any[]) => any>;
64
- inputPlaceholder: PropTypes.Requireable<string>;
65
- searchPlaceholder: PropTypes.Requireable<string>;
66
- disabled: PropTypes.Requireable<boolean>;
67
- className: PropTypes.Requireable<string>;
68
- defaultValue: PropTypes.Requireable<string>;
69
- spellCheck: PropTypes.Requireable<boolean>;
70
- onEnter: PropTypes.Requireable<(...args: any[]) => any>;
71
- 'data-testid': PropTypes.Requireable<string>;
72
- };
73
- static defaultProps: {
74
- onChange(): void;
75
- inputPlaceholder: string;
76
- searchPlaceholder: string;
77
- disabled: boolean;
78
- className: string;
79
- defaultValue: string;
80
- popperOptions: null;
81
- spellCheck: boolean;
82
- onEnter(): void;
83
- 'data-testid': undefined;
84
- };
85
- constructor(props: ComboBoxProps);
86
- componentDidUpdate(): void;
87
- popper: React.RefObject<Popper>;
88
- cbContainer: React.RefObject<HTMLDivElement>;
89
- toggleButton: React.RefObject<HTMLButtonElement>;
90
- menuContainer: React.RefObject<HTMLDivElement>;
91
- input: React.RefObject<HTMLInputElement>;
92
- searchInput: React.RefObject<SearchInput>;
93
- setInputWidth(): void;
94
- getCachedFilteredOptions: ((options: ComboBoxOption[], input: string) => ComboBoxOption[]) & memoize.Memoized<(options: ComboBoxOption[], input: string) => ComboBoxOption[]>;
95
- focus(): void;
96
- resetValue(): void;
97
- updateInputValue(value: string): void;
98
- handleResize(): void;
99
- handleMenuKeyDown(event: React.KeyboardEvent): void;
100
- handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void;
101
- handleInputKeyDown(event: React.KeyboardEvent): void;
102
- handleInputChange(event: React.ChangeEvent<HTMLInputElement>): void;
103
- handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void;
104
- handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void;
105
- handleFilterChange(event: React.ChangeEvent<HTMLInputElement>): void;
106
- handleMenuBlur(event: React.FocusEvent): void;
107
- handleInputBlur(event: React.FocusEvent<HTMLInputElement>): void;
108
- handleMenuOpened(): void;
109
- handleMenuExited(): void;
110
- toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void;
111
- openMenu(): void;
112
- closeMenu(focusInput?: boolean): void;
113
- updateKeyboardIndex(): void;
114
- scrollOptionIntoView(): void;
115
- renderMenuElement(): JSX.Element;
116
- renderOptions(): React.ReactNode;
117
- render(): JSX.Element;
118
- }
119
- export default ComboBox;
120
- //# sourceMappingURL=ComboBox.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComboBox.d.ts","sourceRoot":"","sources":["../src/ComboBox.tsx"],"names":[],"mappings":"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"}
package/dist/ComboBox.js DELETED
@@ -1,497 +0,0 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
- function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
- /**
7
- * Combobox that combines a input box with a searchable dropdown menu
8
- *
9
- * props:
10
- * @param {array} options :[{
11
- * title: 'option title for display',
12
- * value: 'option value' //option value
13
- * }]
14
- * @param {string} inputPlaceholder place holder for the input box
15
- * @param {string} searchPlaceholder place holder for the search box in drop down search box
16
- * @param {boolean} disabled disable both input & drop down
17
- *
18
- *
19
- */
20
- import React, { Component } from 'react';
21
- import PropTypes from 'prop-types';
22
- import memoize from 'memoizee';
23
- import classNames from 'classnames';
24
- import SearchInput from "./SearchInput.js";
25
- import { Popper } from "./popper/index.js";
26
- import "./ComboBox.css";
27
- import { jsx as _jsx } from "react/jsx-runtime";
28
- import { jsxs as _jsxs } from "react/jsx-runtime";
29
- var MENU_NAVIGATION_DIRECTION;
30
- (function (MENU_NAVIGATION_DIRECTION) {
31
- MENU_NAVIGATION_DIRECTION["UP"] = "UP";
32
- MENU_NAVIGATION_DIRECTION["DOWN"] = "DOWN";
33
- })(MENU_NAVIGATION_DIRECTION || (MENU_NAVIGATION_DIRECTION = {}));
34
- class ComboBox extends Component {
35
- constructor(props) {
36
- super(props);
37
- _defineProperty(this, "popper", void 0);
38
- _defineProperty(this, "cbContainer", void 0);
39
- _defineProperty(this, "toggleButton", void 0);
40
- _defineProperty(this, "menuContainer", void 0);
41
- _defineProperty(this, "input", void 0);
42
- _defineProperty(this, "searchInput", void 0);
43
- _defineProperty(this, "getCachedFilteredOptions", memoize((options, input) => options.filter(option => option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0 || option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0)));
44
- this.state = {
45
- value: '',
46
- filter: '',
47
- filteredOptions: props.options,
48
- keyboardOptionIndex: -1,
49
- menuIsOpen: false,
50
- inputWidth: 100
51
- };
52
- this.toggleMenu = this.toggleMenu.bind(this);
53
- this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);
54
- this.handleMenuBlur = this.handleMenuBlur.bind(this);
55
- this.closeMenu = this.closeMenu.bind(this);
56
- this.handleInputChange = this.handleInputChange.bind(this);
57
- this.handleInputKeyDown = this.handleInputKeyDown.bind(this);
58
- this.handleInputBlur = this.handleInputBlur.bind(this);
59
- this.handleFilterChange = this.handleFilterChange.bind(this);
60
- this.handleOptionClick = this.handleOptionClick.bind(this);
61
- this.handleOptionFocus = this.handleOptionFocus.bind(this);
62
- this.handleMenuOpened = this.handleMenuOpened.bind(this);
63
- this.handleMenuExited = this.handleMenuExited.bind(this);
64
- this.popper = /*#__PURE__*/React.createRef();
65
- this.cbContainer = /*#__PURE__*/React.createRef();
66
- this.toggleButton = /*#__PURE__*/React.createRef();
67
- this.menuContainer = /*#__PURE__*/React.createRef();
68
- this.input = /*#__PURE__*/React.createRef();
69
- this.searchInput = /*#__PURE__*/React.createRef();
70
- }
71
- componentDidUpdate() {
72
- var {
73
- menuIsOpen,
74
- keyboardOptionIndex
75
- } = this.state;
76
- if (menuIsOpen && keyboardOptionIndex >= 0) {
77
- this.scrollOptionIntoView();
78
- }
79
- }
80
- setInputWidth() {
81
- if (this.cbContainer.current) {
82
- this.setState({
83
- inputWidth: this.cbContainer.current.getBoundingClientRect().width
84
- });
85
- }
86
- }
87
- focus() {
88
- var _this$input$current;
89
- (_this$input$current = this.input.current) === null || _this$input$current === void 0 ? void 0 : _this$input$current.focus();
90
- }
91
- resetValue() {
92
- this.setState({
93
- value: ''
94
- });
95
- }
96
- updateInputValue(value) {
97
- var {
98
- onChange
99
- } = this.props;
100
- this.setState({
101
- value
102
- });
103
- onChange(value);
104
- }
105
- handleResize() {
106
- this.setInputWidth();
107
- }
108
- handleMenuKeyDown(event) {
109
- var _menuOptions$keyboard, _this$input$current2;
110
- var {
111
- filter,
112
- filteredOptions,
113
- keyboardOptionIndex
114
- } = this.state;
115
- var {
116
- options
117
- } = this.props;
118
- var menuOptions = filter ? filteredOptions : options;
119
- switch (event.key) {
120
- case 'Enter':
121
- if (((_menuOptions$keyboard = menuOptions[keyboardOptionIndex]) === null || _menuOptions$keyboard === void 0 ? void 0 : _menuOptions$keyboard.value) != null) {
122
- this.updateInputValue(menuOptions[keyboardOptionIndex].value);
123
- }
124
- this.closeMenu();
125
- (_this$input$current2 = this.input.current) === null || _this$input$current2 === void 0 ? void 0 : _this$input$current2.focus();
126
- event.stopPropagation();
127
- event.preventDefault();
128
- break;
129
- case 'ArrowUp':
130
- this.handleMenuNavigation(ComboBox.MENU_NAVIGATION_DIRECTION.UP);
131
- event.stopPropagation();
132
- event.preventDefault();
133
- break;
134
- case 'ArrowDown':
135
- this.handleMenuNavigation(ComboBox.MENU_NAVIGATION_DIRECTION.DOWN);
136
- event.stopPropagation();
137
- event.preventDefault();
138
- break;
139
- case 'Escape':
140
- if (filter !== '') {
141
- this.setState({
142
- filter: ''
143
- });
144
- event.stopPropagation(); // Don't trigger blur on input element
145
- } else {
146
- this.closeMenu();
147
- }
148
- break;
149
- case 'Tab':
150
- if (!event.shiftKey && keyboardOptionIndex === menuOptions.length - 1) {
151
- this.closeMenu();
152
- }
153
- break;
154
- default:
155
- break;
156
- }
157
- }
158
- handleMenuNavigation(direction) {
159
- var {
160
- filter,
161
- filteredOptions,
162
- keyboardOptionIndex
163
- } = this.state;
164
- var {
165
- options
166
- } = this.props;
167
- var menuOptions = filter ? filteredOptions : options;
168
- var menuOptionsLength = menuOptions.length;
169
- var delta = 0;
170
- switch (direction) {
171
- case ComboBox.MENU_NAVIGATION_DIRECTION.UP:
172
- delta = -1;
173
- break;
174
- case ComboBox.MENU_NAVIGATION_DIRECTION.DOWN:
175
- delta = 1;
176
- break;
177
- }
178
- if (delta !== 0) {
179
- this.setState({
180
- keyboardOptionIndex: (keyboardOptionIndex + delta + menuOptionsLength) % menuOptionsLength
181
- });
182
- }
183
- }
184
- handleInputKeyDown(event) {
185
- var {
186
- onEnter
187
- } = this.props;
188
- var {
189
- menuIsOpen
190
- } = this.state;
191
- if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
192
- if (!menuIsOpen) {
193
- this.openMenu();
194
- }
195
- } else if (event.key === 'Enter') {
196
- onEnter();
197
- }
198
- }
199
- handleInputChange(event) {
200
- this.updateInputValue(event.target.value);
201
- }
202
- handleOptionClick(event) {
203
- var _this$input$current3;
204
- var optionIndex = Number(event.currentTarget.value);
205
- var {
206
- filter,
207
- filteredOptions
208
- } = this.state;
209
- var {
210
- options
211
- } = this.props;
212
- var menuOptions = filter ? filteredOptions : options;
213
- this.updateInputValue(menuOptions[optionIndex].value);
214
- this.closeMenu();
215
- (_this$input$current3 = this.input.current) === null || _this$input$current3 === void 0 ? void 0 : _this$input$current3.focus();
216
- }
217
- handleOptionFocus(event) {
218
- this.setState({
219
- keyboardOptionIndex: Number(event.target.value)
220
- });
221
- }
222
- handleFilterChange(event) {
223
- var _this$popper$current;
224
- var {
225
- options
226
- } = this.props;
227
- var filter = event.target.value;
228
- var filteredOptions = this.getCachedFilteredOptions(options, filter);
229
- this.setState({
230
- filter,
231
- filteredOptions,
232
- keyboardOptionIndex: 0
233
- });
234
- (_this$popper$current = this.popper.current) === null || _this$popper$current === void 0 ? void 0 : _this$popper$current.scheduleUpdate();
235
- }
236
- handleMenuBlur(event) {
237
- // close if menu blurs, unless its an internal option or the toggleButton which triggers close via click
238
- if (event.relatedTarget instanceof Element && this.popper.current != null && this.popper.current.element.contains(event.relatedTarget) || event.relatedTarget === this.toggleButton.current) {
239
- return;
240
- }
241
- this.closeMenu(false);
242
- }
243
- handleInputBlur(event) {
244
- // if blur event is caused by focusing on search input or open menu by keyboard, don't close the menu
245
- var {
246
- menuIsOpen
247
- } = this.state;
248
- if (menuIsOpen && event.relatedTarget instanceof Element && this.popper.current != null && this.popper.current.element.contains(event.relatedTarget)) {
249
- return;
250
- }
251
- this.closeMenu(false);
252
- }
253
- handleMenuOpened() {
254
- var _this$searchInput$cur;
255
- this.scrollOptionIntoView();
256
- (_this$searchInput$cur = this.searchInput.current) === null || _this$searchInput$cur === void 0 ? void 0 : _this$searchInput$cur.focus();
257
- }
258
- handleMenuExited() {
259
- var {
260
- menuIsOpen
261
- } = this.state;
262
- if (menuIsOpen) {
263
- var _this$popper$current2;
264
- this.setState({
265
- menuIsOpen: false
266
- });
267
- (_this$popper$current2 = this.popper.current) === null || _this$popper$current2 === void 0 ? void 0 : _this$popper$current2.hide();
268
- }
269
- this.setState({
270
- filter: ''
271
- });
272
- }
273
- toggleMenu(event) {
274
- var {
275
- menuIsOpen
276
- } = this.state;
277
- if (menuIsOpen) {
278
- this.closeMenu();
279
- } else {
280
- this.openMenu();
281
- }
282
- event.stopPropagation();
283
- }
284
- openMenu() {
285
- this.updateKeyboardIndex();
286
- this.setInputWidth();
287
- this.setState({
288
- menuIsOpen: true
289
- });
290
- window.requestAnimationFrame(() => {
291
- var _this$popper$current3;
292
- (_this$popper$current3 = this.popper.current) === null || _this$popper$current3 === void 0 ? void 0 : _this$popper$current3.show();
293
- });
294
- }
295
- closeMenu() {
296
- var _this$popper$current4;
297
- var focusInput = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
298
- this.setState({
299
- menuIsOpen: false
300
- });
301
- if (focusInput) {
302
- var _this$input$current4;
303
- (_this$input$current4 = this.input.current) === null || _this$input$current4 === void 0 ? void 0 : _this$input$current4.focus();
304
- }
305
- (_this$popper$current4 = this.popper.current) === null || _this$popper$current4 === void 0 ? void 0 : _this$popper$current4.hide();
306
- }
307
- updateKeyboardIndex() {
308
- var {
309
- value,
310
- filter,
311
- filteredOptions
312
- } = this.state;
313
- var {
314
- options
315
- } = this.props;
316
- var menuOptions = filter ? filteredOptions : options;
317
- var valueIndex = menuOptions.findIndex(option => option.value === value);
318
- this.setState({
319
- keyboardOptionIndex: valueIndex
320
- });
321
- }
322
- scrollOptionIntoView() {
323
- var _this$menuContainer$c;
324
- var activeOption = (_this$menuContainer$c = this.menuContainer.current) === null || _this$menuContainer$c === void 0 ? void 0 : _this$menuContainer$c.querySelector('.cb-option-btn.keyboard-active');
325
- if (activeOption instanceof HTMLElement) {
326
- activeOption.scrollIntoView({
327
- block: 'nearest',
328
- inline: 'nearest'
329
- });
330
- }
331
- }
332
- renderMenuElement() {
333
- var {
334
- searchPlaceholder
335
- } = this.props;
336
- var {
337
- filter,
338
- inputWidth
339
- } = this.state;
340
- return /*#__PURE__*/_jsxs("div", {
341
- className: "cb-menu-container",
342
- ref: this.menuContainer,
343
- role: "presentation",
344
- onKeyDown: this.handleMenuKeyDown,
345
- onClick: event => {
346
- event.stopPropagation();
347
- },
348
- style: {
349
- width: inputWidth
350
- },
351
- onBlur: this.handleMenuBlur,
352
- children: [/*#__PURE__*/_jsx("div", {
353
- className: "cb-search-input-container",
354
- children: /*#__PURE__*/_jsx(SearchInput, {
355
- value: filter,
356
- ref: this.searchInput,
357
- onChange: this.handleFilterChange,
358
- className: "cb-search-input",
359
- placeholder: searchPlaceholder
360
- })
361
- }), /*#__PURE__*/_jsx("div", {
362
- className: "cb-options-container",
363
- children: /*#__PURE__*/_jsx("div", {
364
- className: "cb-options",
365
- children: this.renderOptions()
366
- })
367
- })]
368
- });
369
- }
370
- renderOptions() {
371
- var {
372
- options
373
- } = this.props;
374
- var {
375
- keyboardOptionIndex,
376
- filter,
377
- filteredOptions
378
- } = this.state;
379
- var menuOptions = filter ? filteredOptions : options;
380
- return menuOptions.map((option, index) => {
381
- var key = "option-".concat(index, "-").concat(option.value);
382
- return /*#__PURE__*/_jsx("button", {
383
- type: "button",
384
- value: index,
385
- className: classNames('cb-option-btn', {
386
- 'keyboard-active': keyboardOptionIndex === index
387
- }),
388
- onClick: this.handleOptionClick,
389
- onFocus: this.handleOptionFocus,
390
- children: option.title
391
- }, key);
392
- });
393
- }
394
- render() {
395
- var {
396
- options,
397
- inputPlaceholder,
398
- disabled,
399
- className,
400
- defaultValue,
401
- spellCheck,
402
- 'data-testid': dataTestId
403
- } = this.props;
404
- var {
405
- value
406
- } = this.state;
407
- var {
408
- popperOptions
409
- } = this.props;
410
- popperOptions = _objectSpread({
411
- placement: 'bottom-end',
412
- modifiers: {
413
- preventOverflow: {
414
- enabled: false
415
- }
416
- }
417
- }, popperOptions);
418
- return /*#__PURE__*/_jsxs("div", {
419
- className: "input-group cb-container",
420
- ref: this.cbContainer,
421
- children: [/*#__PURE__*/_jsx("input", {
422
- value: value || defaultValue,
423
- className: classNames('form-control', className, 'cb-input'),
424
- ref: this.input,
425
- onChange: this.handleInputChange,
426
- placeholder: inputPlaceholder || (options[0] != null ? options[0].title : undefined),
427
- disabled: disabled,
428
- onBlur: this.handleInputBlur,
429
- onKeyDown: this.handleInputKeyDown,
430
- spellCheck: spellCheck,
431
- "data-testid": dataTestId !== undefined ? "".concat(dataTestId, "-input") : undefined
432
- }), /*#__PURE__*/_jsx("div", {
433
- className: "input-group-append cb-dropdown",
434
- children: /*#__PURE__*/_jsxs("button", {
435
- // Mimic React Spectrum where dropdown button is not a tab stop
436
- tabIndex: -1,
437
- type: "button",
438
- className: "btn cb-btn form-control",
439
- ref: this.toggleButton,
440
- onClick: this.toggleMenu,
441
- onKeyDown: this.handleInputKeyDown,
442
- disabled: disabled,
443
- "data-testid": dataTestId !== undefined ? "".concat(dataTestId, "-btn") : undefined,
444
- children: [/*#__PURE__*/_jsx("span", {
445
- className: "cb-caret"
446
- }), /*#__PURE__*/_jsx(Popper, {
447
- ref: this.popper,
448
- options: popperOptions,
449
- className: classNames('combobox interactive'),
450
- onEntered: this.handleMenuOpened,
451
- onExited: this.handleMenuExited,
452
- children: this.renderMenuElement()
453
- })]
454
- })
455
- })]
456
- });
457
- }
458
- }
459
- _defineProperty(ComboBox, "MENU_NAVIGATION_DIRECTION", MENU_NAVIGATION_DIRECTION);
460
- _defineProperty(ComboBox, "DROP_DOWN_MENU_HEIGHT", 200);
461
- _defineProperty(ComboBox, "propTypes", {
462
- options: PropTypes.arrayOf(PropTypes.shape({
463
- title: PropTypes.string.isRequired,
464
- value: PropTypes.string.isRequired
465
- })).isRequired,
466
- popperOptions: PropTypes.shape({
467
- title: PropTypes.string.isRequired,
468
- value: PropTypes.string.isRequired
469
- }),
470
- onChange: PropTypes.func,
471
- inputPlaceholder: PropTypes.string,
472
- searchPlaceholder: PropTypes.string,
473
- disabled: PropTypes.bool,
474
- className: PropTypes.string,
475
- defaultValue: PropTypes.string,
476
- spellCheck: PropTypes.bool,
477
- onEnter: PropTypes.func,
478
- 'data-testid': PropTypes.string
479
- });
480
- _defineProperty(ComboBox, "defaultProps", {
481
- onChange() {
482
- // no-op
483
- },
484
- inputPlaceholder: '',
485
- searchPlaceholder: 'Search',
486
- disabled: false,
487
- className: '',
488
- defaultValue: '',
489
- popperOptions: null,
490
- spellCheck: true,
491
- onEnter() {
492
- // no-op
493
- },
494
- 'data-testid': undefined
495
- });
496
- export default ComboBox;
497
- //# sourceMappingURL=ComboBox.js.map