@pingux/astro 2.143.0-alpha.1 → 2.143.0-alpha.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.
@@ -36,7 +36,7 @@ var _index = require("./index");
36
36
  var _ListBoxContext = require("./ListBoxContext");
37
37
  var _ListBoxSection = _interopRequireDefault(require("./ListBoxSection"));
38
38
  var _react2 = require("@emotion/react");
39
- var _excluded = ["defaultSelectedKeys", "disabledKeys", "hasAutoFocus", "hasFocusWrap", "hasNoEmptySelection", "hasVirtualFocus", "id", "isCondensed", "isLoading", "isFocusedOnHover", "isSelectedOnPressUp", "isVirtualized", "items", "keyboardDelegate", "label", "loadingState", "onLoadMore", "onLoadPrev", "onScroll", "onSelectionChange", "renderEmptyState", "selectedKeys", "selectionMode", "state", "aria-label", "aria-labelledby", "aria-describedby", "aria-details"];
39
+ var _excluded = ["defaultSelectedKeys", "disabledKeys", "hasAutoFocus", "hasFocusWrap", "hasNoEmptySelection", "hasVirtualFocus", "id", "isCondensed", "isLoading", "isFocusedOnHover", "isSelectedOnPressUp", "isVirtualized", "items", "keyboardDelegate", "label", "loadingState", "onLoadMore", "onLoadPrev", "onScroll", "onSelectionChange", "renderEmptyState", "selectedKeys", "selectionMode", "state", "aria-label", "aria-labelledby", "aria-describedby", "aria-details", "showSelectedOption"];
40
40
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
41
41
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
42
42
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -96,6 +96,7 @@ var ListBox = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
96
96
  ariaLabelledby = props['aria-labelledby'],
97
97
  ariaDescribedby = props['aria-describedby'],
98
98
  ariaDetails = props['aria-details'],
99
+ showSelectedOption = props.showSelectedOption,
99
100
  others = (0, _objectWithoutProperties2["default"])(props, _excluded);
100
101
 
101
102
  // Object matching React Aria API with all options
@@ -196,7 +197,8 @@ var ListBox = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
196
197
  key: item.key,
197
198
  item: item,
198
199
  hasVirtualFocus: hasVirtualFocus,
199
- isCondensed: isCondensed
200
+ isCondensed: isCondensed,
201
+ showSelectedOption: showSelectedOption
200
202
  });
201
203
  }
202
204
  if (type === collectionTypes.LOADER) {
@@ -28,7 +28,7 @@ var _Box = _interopRequireDefault(require("../Box"));
28
28
  var _Icon = _interopRequireDefault(require("../Icon"));
29
29
  var _ListBoxContext = require("./ListBoxContext");
30
30
  var _react2 = require("@emotion/react");
31
- var _excluded = ["item", "hasVirtualFocus", "isCondensed"],
31
+ var _excluded = ["item", "hasVirtualFocus", "isCondensed", "showSelectedOption"],
32
32
  _excluded2 = ["onPressStart", "onPressUp"];
33
33
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
34
34
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -67,6 +67,7 @@ var Option = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
67
67
  var item = props.item,
68
68
  hasVirtualFocus = props.hasVirtualFocus,
69
69
  isCondensed = props.isCondensed,
70
+ showSelectedOption = props.showSelectedOption,
70
71
  others = (0, _objectWithoutProperties2["default"])(props, _excluded);
71
72
  var key = item.key,
72
73
  itemProps = item.props,
@@ -105,7 +106,7 @@ var Option = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
105
106
  var _useStatusClasses = (0, _hooks.useStatusClasses)(null, {
106
107
  isDisabled: isDisabled || isSeparator,
107
108
  isFocused: focused,
108
- isSelected: isSelected,
109
+ isSelected: showSelectedOption ? isSelected : false,
109
110
  isCondensed: isCondensed,
110
111
  isFocusVisible: isFocusVisible,
111
112
  isPressed: isPressed
@@ -142,12 +143,12 @@ var Option = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
142
143
  mr: "xs",
143
144
  className: classNames,
144
145
  variant: "listBox.checkboxIcon"
145
- }) : isSelected && !isOnyx && (0, _react2.jsx)(_Icon["default"], {
146
+ }) : isSelected && !isOnyx && showSelectedOption && (0, _react2.jsx)(_Icon["default"], {
146
147
  icon: _CircleSmallIcon["default"],
147
148
  title: {
148
149
  name: 'Circle Small Icon'
149
150
  }
150
- }), rendered, isSelected && isOnyx && (0, _react2.jsx)(_Icon["default"], {
151
+ }), rendered, isSelected && isOnyx && showSelectedOption && (0, _react2.jsx)(_Icon["default"], {
151
152
  icon: _CheckIcon["default"],
152
153
  title: {
153
154
  name: 'Check Icon'
@@ -155,5 +156,8 @@ var Option = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
155
156
  color: "green-500"
156
157
  }));
157
158
  });
159
+ Option.defaultProps = {
160
+ showSelectedOption: true
161
+ };
158
162
  var _default = Option;
159
163
  exports["default"] = _default;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { SearchFieldProps, SearchItem } from '../../types';
3
+ export declare const SearchAutoComplete: React.ForwardRefExoticComponent<SearchFieldProps<SearchItem> & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
+ var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
5
+ var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
6
+ var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
7
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
8
+ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
9
+ var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
10
+ var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
11
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
12
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
13
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
14
+ _Object$defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ exports.SearchAutoComplete = void 0;
18
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
19
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
20
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
21
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
22
+ var _react = _interopRequireWildcard(require("react"));
23
+ var _reactAria = require("react-aria");
24
+ var _reactStately = require("react-stately");
25
+ var _CloseIcon = _interopRequireDefault(require("@pingux/mdi-react/CloseIcon"));
26
+ var _utils = require("@react-aria/utils");
27
+ var _ = require("../..");
28
+ var _hooks = require("../../hooks");
29
+ var _pendoID = require("../../utils/devUtils/constants/pendoID");
30
+ var _ListBox = _interopRequireDefault(require("../ListBox/ListBox"));
31
+ var _Popover = _interopRequireDefault(require("../Popover/Popover"));
32
+ var _react2 = require("@emotion/react");
33
+ var _excluded = ["shouldFocusOnHover", "shouldSelectOnPressUp"];
34
+ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
36
+ function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
38
+ var displayName = 'SearchField';
39
+ var SearchAutoComplete = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
40
+ var autocomplete = props.autocomplete,
41
+ hasAutoFocus = props.hasAutoFocus,
42
+ hasNoClearButton = props.hasNoClearButton,
43
+ icon = props.icon,
44
+ isExcludedFromTabOrder = props.isExcludedFromTabOrder,
45
+ label = props.label,
46
+ controlProps = props.controlProps,
47
+ iconProps = props.iconProps,
48
+ labelProps = props.labelProps,
49
+ value = props.value,
50
+ onChange = props.onChange;
51
+ (0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
52
+ var _useFilter = (0, _reactAria.useFilter)({
53
+ sensitivity: 'base'
54
+ }),
55
+ contains = _useFilter.contains;
56
+ var comboBoxState = (0, _reactStately.useComboBoxState)(_objectSpread(_objectSpread({}, props), {}, {
57
+ inputValue: value,
58
+ defaultInputValue: props.defaultValue,
59
+ onInputChange: onChange,
60
+ defaultFilter: contains,
61
+ allowsCustomValue: true
62
+ }));
63
+ var inputRef = (0, _hooks.useLocalOrForwardRef)(ref);
64
+ var outerRef = (0, _react.useRef)(null);
65
+ var listBoxRef = (0, _react.useRef)(null);
66
+ var popoverRef = (0, _react.useRef)(null);
67
+ var clearButtonRef = (0, _react.useRef)(null);
68
+ var _useComboBox = (0, _reactAria.useComboBox)(_objectSpread(_objectSpread({}, props), {}, {
69
+ inputRef: inputRef,
70
+ listBoxRef: listBoxRef,
71
+ popoverRef: popoverRef
72
+ }), comboBoxState),
73
+ inputProps = _useComboBox.inputProps,
74
+ listBoxProps = _useComboBox.listBoxProps,
75
+ rsLabelProps = _useComboBox.labelProps;
76
+ delete inputProps['data-testid'];
77
+ var shouldFocusOnHover = listBoxProps.shouldFocusOnHover,
78
+ shouldSelectOnPressUp = listBoxProps.shouldSelectOnPressUp,
79
+ otherListBoxProps = (0, _objectWithoutProperties2["default"])(listBoxProps, _excluded);
80
+ var searchProps = {
81
+ label: props.label,
82
+ value: comboBoxState.inputValue,
83
+ 'aria-label': props['aria-label'],
84
+ onChange: function onChange(v) {
85
+ return comboBoxState.setInputValue(v);
86
+ },
87
+ onClear: props.onClear,
88
+ onSubmit: props.onSubmit
89
+ };
90
+ var searchState = (0, _reactStately.useSearchFieldState)(searchProps);
91
+ var _useSearchField = (0, _reactAria.useSearchField)(_objectSpread({
92
+ autoComplete: autocomplete,
93
+ autoFocus: hasAutoFocus,
94
+ excludeFromTabOrder: isExcludedFromTabOrder
95
+ }, searchProps), searchState, inputRef),
96
+ raLabelProps = _useSearchField.labelProps,
97
+ raInputProps = _useSearchField.inputProps,
98
+ clearButtonProps = _useSearchField.clearButtonProps;
99
+ var _useField = (0, _hooks.useField)(_objectSpread(_objectSpread({}, props), {}, {
100
+ labelProps: _objectSpread(_objectSpread(_objectSpread({}, labelProps), raLabelProps), rsLabelProps),
101
+ controlProps: _objectSpread(_objectSpread({}, controlProps), raInputProps)
102
+ })),
103
+ fieldContainerProps = _useField.fieldContainerProps,
104
+ fieldControlInputProps = _useField.fieldControlInputProps,
105
+ fieldControlWrapperProps = _useField.fieldControlWrapperProps,
106
+ fieldLabelProps = _useField.fieldLabelProps;
107
+ var handleKeyDownEvent = function handleKeyDownEvent(e) {
108
+ var key = e.key;
109
+ if (key === 'Enter' || key === ' ') {
110
+ comboBoxState.setInputValue('');
111
+ }
112
+ };
113
+
114
+ // Popover width matches the input width
115
+ var _useState = (0, _react.useState)(0),
116
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
117
+ popoverWidth = _useState2[0],
118
+ setPopoverWidth = _useState2[1];
119
+ var onResize = (0, _react.useCallback)(function () {
120
+ /* istanbul ignore next */
121
+ if (outerRef.current) {
122
+ setPopoverWidth(outerRef.current.offsetWidth);
123
+ }
124
+ }, [outerRef, setPopoverWidth]);
125
+ (0, _utils.useResizeObserver)({
126
+ ref: outerRef,
127
+ onResize: onResize
128
+ });
129
+ (0, _react.useLayoutEffect)(onResize, [onResize]);
130
+ return (0, _react2.jsx)(_.Box, (0, _extends2["default"])({}, (0, _pendoID.getPendoID)(displayName), fieldContainerProps), label && (0, _react2.jsx)(_.Label, fieldLabelProps), (0, _react2.jsx)(_.Box, (0, _extends2["default"])({
131
+ variant: "forms.search.wrapper",
132
+ ref: outerRef
133
+ }, fieldControlWrapperProps), (0, _react2.jsx)(_.Input, (0, _extends2["default"])({
134
+ variant: "forms.input.search",
135
+ ref: inputRef
136
+ }, (0, _utils.mergeProps)(fieldControlInputProps, inputProps))), icon && (0, _react2.jsx)(_.Icon, (0, _extends2["default"])({
137
+ icon: icon,
138
+ variant: "forms.search.icon",
139
+ title: {
140
+ name: 'Search Icon'
141
+ }
142
+ }, iconProps)), !hasNoClearButton && searchState.value !== '' && (0, _react2.jsx)(_.IconButton, (0, _extends2["default"])({
143
+ ref: clearButtonRef
144
+ }, clearButtonProps, {
145
+ tabIndex: 0,
146
+ onKeyDown: handleKeyDownEvent,
147
+ color: "text.secondary",
148
+ variant: "searchClearButton"
149
+ }), (0, _react2.jsx)(_.Icon, {
150
+ icon: _CloseIcon["default"],
151
+ title: {
152
+ name: 'Close Icon'
153
+ }
154
+ }))), comboBoxState.isOpen && (0, _react2.jsx)(_Popover["default"], {
155
+ popoverRef: popoverRef,
156
+ triggerRef: outerRef,
157
+ state: comboBoxState,
158
+ isNonModal: true,
159
+ width: popoverWidth
160
+ }, (0, _react2.jsx)(_.ScrollBox, null, (0, _react2.jsx)(_ListBox["default"], (0, _extends2["default"])({
161
+ ref: listBoxRef,
162
+ state: comboBoxState,
163
+ isFocusedOnHover: shouldFocusOnHover,
164
+ isSelectedOnPressUp: shouldSelectOnPressUp,
165
+ showSelectedOption: false
166
+ }, otherListBoxProps)))));
167
+ });
168
+ exports.SearchAutoComplete = SearchAutoComplete;
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
- import { SearchFieldProps } from '../../types';
3
- declare const SearchField: React.ForwardRefExoticComponent<SearchFieldProps & React.RefAttributes<HTMLInputElement>>;
2
+ import { SearchFieldProps, SearchItem } from '../../types';
3
+ declare const SearchField: React.ForwardRefExoticComponent<SearchFieldProps<SearchItem> & React.RefAttributes<HTMLInputElement>>;
4
4
  export default SearchField;
@@ -1,99 +1,41 @@
1
1
  "use strict";
2
2
 
3
3
  var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
- var _Object$keys = require("@babel/runtime-corejs3/core-js-stable/object/keys");
5
- var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols");
6
- var _filterInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/filter");
7
- var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
8
- var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
9
- var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors");
10
- var _Object$defineProperties = require("@babel/runtime-corejs3/core-js-stable/object/define-properties");
11
- var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
12
4
  var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
5
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
13
7
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
14
8
  _Object$defineProperty(exports, "__esModule", {
15
9
  value: true
16
10
  });
17
11
  exports["default"] = void 0;
18
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
19
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
13
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
20
14
  var _react = _interopRequireWildcard(require("react"));
21
- var _reactAria = require("react-aria");
22
- var _reactStately = require("react-stately");
23
- var _CloseIcon = _interopRequireDefault(require("@pingux/mdi-react/CloseIcon"));
24
15
  var _SearchIcon = _interopRequireDefault(require("@pingux/mdi-react/SearchIcon"));
25
- var _ = require("../..");
26
- var _hooks = require("../../hooks");
27
- var _pendoID = require("../../utils/devUtils/constants/pendoID");
16
+ var _SearchAutoComplete = require("./SearchAutoComplete");
17
+ var _SearchFieldBase = require("./SearchFieldBase");
28
18
  var _react2 = require("@emotion/react");
19
+ var _excluded = ["hasNoClearButton", "mode", "icon"];
29
20
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
30
21
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
- function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
32
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
33
22
  var displayName = 'SearchField';
34
23
  var SearchField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
35
- var autocomplete = props.autocomplete,
36
- hasAutoFocus = props.hasAutoFocus,
37
- hasNoClearButton = props.hasNoClearButton,
38
- icon = props.icon,
39
- isExcludedFromTabOrder = props.isExcludedFromTabOrder,
40
- label = props.label,
41
- controlProps = props.controlProps,
42
- iconProps = props.iconProps,
43
- labelProps = props.labelProps;
44
- (0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
45
- var searchRef = (0, _hooks.useLocalOrForwardRef)(ref);
46
- var state = (0, _reactStately.useSearchFieldState)(props);
47
- var _useSearchField = (0, _reactAria.useSearchField)(_objectSpread({
48
- autoComplete: autocomplete,
49
- autoFocus: hasAutoFocus,
50
- excludeFromTabOrder: isExcludedFromTabOrder
51
- }, props), state, searchRef),
52
- raLabelProps = _useSearchField.labelProps,
53
- raInputProps = _useSearchField.inputProps,
54
- clearButtonProps = _useSearchField.clearButtonProps;
55
- var _useField = (0, _hooks.useField)(_objectSpread(_objectSpread({}, props), {}, {
56
- labelProps: _objectSpread(_objectSpread({}, labelProps), raLabelProps),
57
- controlProps: _objectSpread(_objectSpread({}, controlProps), raInputProps)
58
- })),
59
- fieldContainerProps = _useField.fieldContainerProps,
60
- fieldControlInputProps = _useField.fieldControlInputProps,
61
- fieldControlWrapperProps = _useField.fieldControlWrapperProps,
62
- fieldLabelProps = _useField.fieldLabelProps;
63
- var handleKeyDownEvent = function handleKeyDownEvent(e) {
64
- var key = e.key;
65
- if (key === 'Enter' || key === ' ') {
66
- state.setValue('');
67
- }
68
- };
69
- return (0, _react2.jsx)(_.Box, (0, _extends2["default"])({}, (0, _pendoID.getPendoID)(displayName), fieldContainerProps), label && (0, _react2.jsx)(_.Label, fieldLabelProps), (0, _react2.jsx)(_.Box, (0, _extends2["default"])({
70
- variant: "forms.search.wrapper"
71
- }, fieldControlWrapperProps), (0, _react2.jsx)(_.Input, (0, _extends2["default"])({
72
- variant: "forms.input.search",
73
- ref: searchRef
74
- }, fieldControlInputProps)), icon && (0, _react2.jsx)(_.Icon, (0, _extends2["default"])({
75
- icon: icon,
76
- variant: "forms.search.icon",
77
- size: 20,
78
- title: {
79
- name: 'Search Icon'
80
- }
81
- }, iconProps)), !hasNoClearButton && state.value !== '' && (0, _react2.jsx)(_.IconButton, (0, _extends2["default"])({
82
- tabIndex: 0,
83
- onKeyDown: handleKeyDownEvent,
84
- color: "text.secondary",
85
- variant: "searchClearButton"
86
- }, clearButtonProps), (0, _react2.jsx)(_.Icon, {
87
- icon: _CloseIcon["default"],
88
- title: {
89
- name: 'Close Icon'
90
- }
91
- }))));
24
+ var _props$hasNoClearButt = props.hasNoClearButton,
25
+ hasNoClearButton = _props$hasNoClearButt === void 0 ? false : _props$hasNoClearButt,
26
+ _props$mode = props.mode,
27
+ mode = _props$mode === void 0 ? 'default' : _props$mode,
28
+ _props$icon = props.icon,
29
+ icon = _props$icon === void 0 ? _SearchIcon["default"] : _props$icon,
30
+ rest = (0, _objectWithoutProperties2["default"])(props, _excluded);
31
+ var Component = mode === 'autocomplete' ? _SearchAutoComplete.SearchAutoComplete : _SearchFieldBase.SearchFieldBase;
32
+ return (0, _react2.jsx)(Component, (0, _extends2["default"])({
33
+ hasNoClearButton: hasNoClearButton,
34
+ icon: icon
35
+ }, rest, {
36
+ ref: ref
37
+ }));
92
38
  });
93
- SearchField.defaultProps = {
94
- hasNoClearButton: false,
95
- icon: _SearchIcon["default"]
96
- };
97
39
  SearchField.displayName = displayName;
98
40
  var _default = SearchField;
99
41
  exports["default"] = _default;
@@ -1,10 +1,11 @@
1
1
  import { StoryFn } from '@storybook/react';
2
- import { SearchFieldProps } from '../../types';
2
+ import { SearchFieldProps, SearchItem } from '../../types';
3
3
  declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, import("@storybook/types").Args>;
4
4
  export default _default;
5
- export declare const Default: StoryFn<SearchFieldProps>;
6
- export declare const Controlled: StoryFn<SearchFieldProps>;
7
- export declare const CustomIcon: StoryFn<SearchFieldProps>;
8
- export declare const NoClearButton: StoryFn<SearchFieldProps>;
9
- export declare const ControlledWithDebouncedInput: StoryFn<SearchFieldProps>;
10
- export declare const WithFilter: StoryFn<SearchFieldProps>;
5
+ export declare const Default: StoryFn<SearchFieldProps<SearchItem>>;
6
+ export declare const Controlled: StoryFn<SearchFieldProps<SearchItem>>;
7
+ export declare const CustomIcon: StoryFn<SearchFieldProps<SearchItem>>;
8
+ export declare const NoClearButton: StoryFn<SearchFieldProps<SearchItem>>;
9
+ export declare const ControlledWithDebouncedInput: StoryFn<SearchFieldProps<SearchItem>>;
10
+ export declare const WithFilter: StoryFn<SearchFieldProps<SearchItem>>;
11
+ export declare const ControlledWithPopover: StoryFn<SearchFieldProps<SearchItem>>;
@@ -14,7 +14,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
14
14
  _Object$defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
- exports["default"] = exports.WithFilter = exports.NoClearButton = exports.Default = exports.CustomIcon = exports.ControlledWithDebouncedInput = exports.Controlled = void 0;
17
+ exports["default"] = exports.WithFilter = exports.NoClearButton = exports.Default = exports.CustomIcon = exports.ControlledWithPopover = exports.ControlledWithDebouncedInput = exports.Controlled = void 0;
18
18
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
19
19
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
20
20
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
@@ -85,7 +85,7 @@ var Default = function Default(args) {
85
85
  icon: _SearchIcon["default"],
86
86
  onSubmit: function onSubmit(text) {
87
87
  return alert(text);
88
- } // eslint-disable-line no-alert
88
+ }
89
89
  }));
90
90
  };
91
91
  exports.Default = Default;
@@ -180,4 +180,44 @@ var WithFilter = function WithFilter() {
180
180
  }
181
181
  })));
182
182
  };
183
- exports.WithFilter = WithFilter;
183
+ exports.WithFilter = WithFilter;
184
+ var ControlledWithPopover = function ControlledWithPopover() {
185
+ var _useState5 = (0, _react.useState)(''),
186
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
187
+ value = _useState6[0],
188
+ setValue = _useState6[1];
189
+ var items = [{
190
+ id: 'apple',
191
+ name: 'Apple'
192
+ }, {
193
+ id: 'banana',
194
+ name: 'Banana'
195
+ }, {
196
+ id: 'blueberry',
197
+ name: 'Blueberry'
198
+ }];
199
+ return (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_index.SearchField, {
200
+ mode: "autocomplete",
201
+ defaultItems: items,
202
+ value: value,
203
+ onChange: function onChange(val) {
204
+ setValue(val);
205
+ },
206
+ "aria-label": "Search Groups",
207
+ placeholder: "Search",
208
+ onSubmit: function onSubmit(text) {
209
+ return alert(text);
210
+ },
211
+ onClear: function onClear() {
212
+ setValue('');
213
+ }
214
+ }, function (item) {
215
+ return (0, _react2.jsx)(_index.Item, {
216
+ key: item.id,
217
+ textValue: item.name
218
+ }, item.name);
219
+ }), (0, _react2.jsx)(_index.Text, {
220
+ mt: "xs"
221
+ }, "value: ".concat(value)));
222
+ };
223
+ exports.ControlledWithPopover = ControlledWithPopover;
@@ -3,6 +3,7 @@
3
3
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
4
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
5
5
  var _react = _interopRequireDefault(require("react"));
6
+ var _collections = require("@react-stately/collections");
6
7
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
7
8
  var _testWrapper = require("../../utils/testUtils/testWrapper");
8
9
  var _universalComponentTest = require("../../utils/testUtils/universalComponentTest");
@@ -10,6 +11,7 @@ var _universalFormSubmitTest = require("../../utils/testUtils/universalFormSubmi
10
11
  var _ = _interopRequireDefault(require("."));
11
12
  var _react2 = require("@emotion/react");
12
13
  var testId = 'test-radio-group';
14
+ var testValue = 'Option';
13
15
  var testLabel = 'Test Label';
14
16
  var defaultProps = {
15
17
  'data-testid': testId,
@@ -19,6 +21,16 @@ var getComponent = function getComponent() {
19
21
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
20
22
  return (0, _testWrapper.render)((0, _react2.jsx)(_["default"], (0, _extends2["default"])({}, defaultProps, props)));
21
23
  };
24
+ var getAutocompleteComponent = function getAutocompleteComponent() {
25
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26
+ return (0, _testWrapper.render)((0, _react2.jsx)(_["default"], (0, _extends2["default"])({}, defaultProps, props), (0, _react2.jsx)(_collections.Item, {
27
+ key: "1"
28
+ }, "Option 1"), (0, _react2.jsx)(_collections.Item, {
29
+ key: "2"
30
+ }, "Option 2"), (0, _react2.jsx)(_collections.Item, {
31
+ key: "3"
32
+ }, "Option 3")));
33
+ };
22
34
  (0, _universalFormSubmitTest.universalFieldComponentTests)({
23
35
  renderComponent: function renderComponent(props) {
24
36
  return (0, _react2.jsx)(_["default"], (0, _extends2["default"])({}, defaultProps, props));
@@ -219,4 +231,124 @@ test('clear button should not be present is hasNoClearButton=true ', function ()
219
231
  hasNoClearButton: true
220
232
  });
221
233
  expect(_testWrapper.screen.queryByRole('button')).not.toBeInTheDocument();
234
+ });
235
+ describe('Autocomplete mode', function () {
236
+ beforeAll(function () {
237
+ jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(function () {
238
+ return 1000;
239
+ });
240
+ jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockImplementation(function () {
241
+ return 1000;
242
+ });
243
+ window.HTMLElement.prototype.scrollIntoView = jest.fn();
244
+ jest.spyOn(window.screen, 'width', 'get').mockImplementation(function () {
245
+ return 1024;
246
+ });
247
+ jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) {
248
+ cb(0);
249
+ return 0;
250
+ });
251
+ jest.useFakeTimers();
252
+ });
253
+ afterEach(function () {
254
+ jest.clearAllMocks();
255
+ });
256
+ test('default autocomplete search field', function () {
257
+ getAutocompleteComponent({
258
+ mode: 'autocomplete'
259
+ });
260
+ var search = _testWrapper.screen.getByLabelText(testLabel);
261
+ var label = _testWrapper.screen.getByText(testLabel);
262
+ expect(search).toBeInstanceOf(HTMLInputElement);
263
+ expect(label).toBeInstanceOf(HTMLLabelElement);
264
+ expect(search).toBeInTheDocument();
265
+ expect(label).toBeInTheDocument();
266
+ });
267
+ test('autocomplete options appear on user input', function () {
268
+ getAutocompleteComponent({
269
+ mode: 'autocomplete'
270
+ });
271
+ var control = _testWrapper.screen.getByLabelText(testLabel);
272
+ _userEvent["default"].type(control, testValue);
273
+ expect(control).toHaveValue(testValue);
274
+ expect(_testWrapper.screen.queryByText('Option 1')).toBeInTheDocument();
275
+ expect(_testWrapper.screen.queryByText('Option 2')).toBeInTheDocument();
276
+ expect(_testWrapper.screen.queryByText('Option 3')).toBeInTheDocument();
277
+ _testWrapper.fireEvent.change(control, {
278
+ target: {
279
+ value: '3'
280
+ }
281
+ });
282
+ expect(_testWrapper.screen.queryByText('Option 1')).not.toBeInTheDocument();
283
+ expect(_testWrapper.screen.queryByText('Option 2')).not.toBeInTheDocument();
284
+ expect(_testWrapper.screen.queryByText('Option 3')).toBeInTheDocument();
285
+ });
286
+ test('Allow custom values', function () {
287
+ var onSubmit = jest.fn();
288
+ getAutocompleteComponent({
289
+ mode: 'autocomplete',
290
+ onSubmit: onSubmit
291
+ });
292
+ var control = _testWrapper.screen.getByLabelText(testLabel);
293
+ _userEvent["default"].type(control, 'Custom Value{enter}');
294
+ expect(onSubmit).toHaveBeenCalledWith('Custom Value');
295
+ });
296
+ test('clear button works in autocomplete mode', function () {
297
+ getAutocompleteComponent({
298
+ mode: 'autocomplete'
299
+ });
300
+ var search = _testWrapper.screen.getByLabelText(testLabel);
301
+ _userEvent["default"].type(search, 'clear');
302
+ expect(search).toHaveValue('clear');
303
+ var clearButton = _testWrapper.screen.getByRole('button');
304
+ expect(clearButton).toHaveAttribute('tabindex', '0');
305
+ (0, _testWrapper.act)(function () {
306
+ clearButton.focus();
307
+ });
308
+ expect(clearButton).toHaveFocus();
309
+ _testWrapper.fireEvent.keyDown(clearButton, {
310
+ key: 'Enter'
311
+ });
312
+ _testWrapper.fireEvent.keyUp(clearButton, {
313
+ key: 'Enter'
314
+ });
315
+ expect(search).toHaveValue('');
316
+ });
317
+ test('Down arrow key open listbox popup', function () {
318
+ getAutocompleteComponent({
319
+ mode: 'autocomplete'
320
+ });
321
+ var search = _testWrapper.screen.getByLabelText(testLabel);
322
+ (0, _testWrapper.act)(function () {
323
+ search.focus();
324
+ });
325
+ expect(search).toHaveFocus();
326
+ expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
327
+ _testWrapper.fireEvent.keyDown(search, {
328
+ key: 'ArrowDown'
329
+ });
330
+ (0, _testWrapper.act)(function () {
331
+ jest.runAllTimers();
332
+ });
333
+ expect(_testWrapper.screen.getByRole('listbox')).toBeInTheDocument();
334
+ expect(_testWrapper.screen.getByText('Option 1')).toBeInTheDocument();
335
+ });
336
+ test("No popup when there aren't any options", function () {
337
+ getAutocompleteComponent({
338
+ mode: 'autocomplete'
339
+ });
340
+ var search = _testWrapper.screen.getByLabelText(testLabel);
341
+ (0, _testWrapper.act)(function () {
342
+ search.focus();
343
+ });
344
+ expect(search).toHaveFocus();
345
+ expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
346
+ _userEvent["default"].type(search, 'xyz');
347
+ (0, _testWrapper.act)(function () {
348
+ jest.runAllTimers();
349
+ });
350
+ expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
351
+ expect(_testWrapper.screen.queryByText('Option 1')).not.toBeInTheDocument();
352
+ expect(search).toHaveValue('xyz');
353
+ });
222
354
  });
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { SearchFieldProps, SearchItem } from '../../types';
3
+ export declare const SearchFieldBase: React.ForwardRefExoticComponent<SearchFieldProps<SearchItem> & React.RefAttributes<HTMLInputElement>>;