@elliemae/ds-controlled-form 2.4.1-rc.4 → 2.4.1-rc.5

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 (157) hide show
  1. package/cjs/autocomplete/Autocomplete.js +4 -5
  2. package/cjs/autocomplete/AutocompleteCTX.js +3 -14
  3. package/cjs/autocomplete/AutocompleteDataTestids.js +1 -7
  4. package/cjs/autocomplete/config/useAutocomplete.js +23 -10
  5. package/cjs/autocomplete/parts/container/Container.js +36 -20
  6. package/cjs/autocomplete/parts/container/styled.js +1 -5
  7. package/cjs/autocomplete/parts/{controls → container}/useKeyboardNavigation.js +8 -24
  8. package/cjs/autocomplete/parts/menu-list/MenuList.js +17 -50
  9. package/cjs/autocomplete/parts/menu-list/styled.js +9 -10
  10. package/cjs/autocomplete/parts/menu-list/useItemRenderer.js +38 -44
  11. package/cjs/autocomplete/react-desc-prop-types.js +4 -8
  12. package/cjs/autocomplete/utils/listHelper.js +8 -16
  13. package/cjs/checkbox/react-desc-prop-types.js +1 -0
  14. package/cjs/combobox/ComboBox.js +1 -0
  15. package/cjs/combobox/config/useComboBox.js +8 -2
  16. package/cjs/combobox/config/useCorrectOptions.js +14 -42
  17. package/cjs/combobox/index.js +1 -0
  18. package/cjs/combobox/parts/A11yFocusedOption.js +3 -3
  19. package/cjs/combobox/parts/controls/Controls.js +4 -2
  20. package/cjs/combobox/parts/controls-input/ControlsInput.js +2 -0
  21. package/cjs/combobox/parts/controls-input/styled.js +1 -1
  22. package/cjs/combobox/parts/controls-input/useControlsInput.js +6 -6
  23. package/cjs/combobox/parts/controls-input/useKeyboardNavigation.js +30 -26
  24. package/cjs/combobox/parts/controls-input/useMaskedOnChange.js +7 -5
  25. package/cjs/combobox/parts/dropdown-indicator/DropdownIndicator.js +6 -4
  26. package/cjs/combobox/parts/header-list/useHeaderListHandlers.js +4 -4
  27. package/cjs/combobox/parts/menu-list/MenuList.js +13 -7
  28. package/cjs/combobox/parts/menu-list/styled.js +16 -5
  29. package/cjs/combobox/parts/menu-list/useItemRenderer.js +8 -8
  30. package/cjs/combobox/parts/menu-list/useMenuListSetFocusOption.js +6 -6
  31. package/cjs/combobox/react-desc-prop-types.js +2 -1
  32. package/cjs/combobox/utils/listHelper.js +40 -11
  33. package/cjs/index.js +8 -3
  34. package/cjs/mask-hook/hooks/index.js +7 -3
  35. package/cjs/mask-hook/hooks/useNumberMask.js +5 -0
  36. package/cjs/mask-hook/hooks/usePhoneMask.js +5 -0
  37. package/cjs/mask-hook/hooks/useSSNMask.js +5 -0
  38. package/cjs/mask-hook/hooks/{useZipCode.js → useZipCodeMask.js} +10 -5
  39. package/cjs/mask-hook/index.js +7 -3
  40. package/esm/autocomplete/Autocomplete.js +2 -3
  41. package/esm/autocomplete/AutocompleteCTX.js +3 -14
  42. package/esm/autocomplete/AutocompleteDataTestids.js +1 -7
  43. package/esm/autocomplete/config/useAutocomplete.js +27 -14
  44. package/esm/autocomplete/parts/container/Container.js +38 -23
  45. package/esm/autocomplete/parts/container/styled.js +2 -5
  46. package/esm/autocomplete/parts/{controls → container}/useKeyboardNavigation.js +8 -24
  47. package/esm/autocomplete/parts/menu-list/MenuList.js +19 -52
  48. package/esm/autocomplete/parts/menu-list/styled.js +9 -10
  49. package/esm/autocomplete/parts/menu-list/useItemRenderer.js +39 -45
  50. package/esm/autocomplete/react-desc-prop-types.js +5 -8
  51. package/esm/autocomplete/utils/listHelper.js +8 -16
  52. package/esm/checkbox/react-desc-prop-types.js +1 -0
  53. package/esm/combobox/ComboBox.js +1 -1
  54. package/esm/combobox/config/useComboBox.js +8 -2
  55. package/esm/combobox/config/useCorrectOptions.js +15 -43
  56. package/esm/combobox/index.js +1 -1
  57. package/esm/combobox/parts/A11yFocusedOption.js +3 -3
  58. package/esm/combobox/parts/controls/Controls.js +4 -2
  59. package/esm/combobox/parts/controls-input/ControlsInput.js +2 -0
  60. package/esm/combobox/parts/controls-input/styled.js +1 -1
  61. package/esm/combobox/parts/controls-input/useControlsInput.js +6 -6
  62. package/esm/combobox/parts/controls-input/useKeyboardNavigation.js +30 -26
  63. package/esm/combobox/parts/controls-input/useMaskedOnChange.js +7 -5
  64. package/esm/combobox/parts/dropdown-indicator/DropdownIndicator.js +2 -2
  65. package/esm/combobox/parts/header-list/useHeaderListHandlers.js +4 -4
  66. package/esm/combobox/parts/menu-list/MenuList.js +13 -7
  67. package/esm/combobox/parts/menu-list/styled.js +16 -5
  68. package/esm/combobox/parts/menu-list/useItemRenderer.js +8 -8
  69. package/esm/combobox/parts/menu-list/useMenuListSetFocusOption.js +6 -6
  70. package/esm/combobox/react-desc-prop-types.js +2 -1
  71. package/esm/combobox/utils/listHelper.js +38 -12
  72. package/esm/index.js +5 -5
  73. package/esm/mask-hook/hooks/index.js +4 -4
  74. package/esm/mask-hook/hooks/useNumberMask.js +5 -1
  75. package/esm/mask-hook/hooks/usePhoneMask.js +5 -1
  76. package/esm/mask-hook/hooks/useSSNMask.js +5 -1
  77. package/esm/mask-hook/hooks/{useZipCode.js → useZipCodeMask.js} +9 -5
  78. package/esm/mask-hook/index.js +4 -4
  79. package/package.json +24 -80
  80. package/types/autocomplete/Autocomplete.d.ts +4 -61
  81. package/types/autocomplete/AutocompleteCTX.d.ts +4 -3
  82. package/types/autocomplete/AutocompleteDataTestids.d.ts +1 -7
  83. package/types/autocomplete/config/useAutocomplete.d.ts +3 -2
  84. package/types/autocomplete/parts/container/Container.d.ts +1 -2
  85. package/types/autocomplete/parts/container/styled.d.ts +0 -1
  86. package/types/autocomplete/parts/{controls → container}/useKeyboardNavigation.d.ts +0 -0
  87. package/types/autocomplete/parts/menu-list/MenuList.d.ts +1 -2
  88. package/types/autocomplete/parts/menu-list/styled.d.ts +1 -4
  89. package/types/autocomplete/parts/menu-list/useItemRenderer.d.ts +2 -3
  90. package/types/autocomplete/react-desc-prop-types.d.ts +8 -18
  91. package/types/autocomplete/sharedTypes.d.ts +1 -3
  92. package/types/autocomplete/tests/general.test.d.ts +1 -0
  93. package/types/autocomplete/tests/utils.d.ts +5 -0
  94. package/types/autocomplete/utils/listHelper.d.ts +2 -2
  95. package/types/checkbox/ControlledCheckbox.d.ts +1 -1
  96. package/types/checkbox/react-desc-prop-types.d.ts +366 -1
  97. package/types/combobox/ComboBox.d.ts +2 -2
  98. package/types/combobox/parts/dropdown-indicator/DropdownIndicator.d.ts +1 -0
  99. package/types/combobox/react-desc-prop-types.d.ts +381 -3
  100. package/types/combobox/utils/listHelper.d.ts +4 -1
  101. package/types/large-text-input/DSControlledLargeTextInput.d.ts +1 -1
  102. package/types/large-text-input/react-desc-prop-types.d.ts +422 -1
  103. package/types/mask-hook/hooks/index.d.ts +1 -1
  104. package/types/mask-hook/hooks/useNumberMask.d.ts +2 -1
  105. package/types/mask-hook/hooks/usePhoneMask.d.ts +2 -1
  106. package/types/mask-hook/hooks/useSSNMask.d.ts +2 -1
  107. package/types/mask-hook/hooks/useZipCodeMask.d.ts +4 -0
  108. package/types/text-input/DSInputText.d.ts +1 -1
  109. package/types/text-input/config/useInputText.d.ts +110 -110
  110. package/cjs/autocomplete/config/constants.js +0 -14
  111. package/cjs/autocomplete/config/useGetPropsWithDefault.js +0 -11
  112. package/cjs/autocomplete/index.d.js +0 -2
  113. package/cjs/autocomplete/parts/a11y-messages/MultiAllyMessages.js +0 -33
  114. package/cjs/autocomplete/parts/a11y-messages/SingleAllyMessages.js +0 -28
  115. package/cjs/autocomplete/parts/a11y-messages/index.js +0 -11
  116. package/cjs/autocomplete/parts/a11y-messages/styled.js +0 -15
  117. package/cjs/autocomplete/parts/controls/Controls.js +0 -63
  118. package/cjs/autocomplete/parts/controls/index.js +0 -9
  119. package/cjs/autocomplete/parts/controls/styled.js +0 -44
  120. package/cjs/autocomplete/parts/controls/useControlsInput.js +0 -44
  121. package/cjs/autocomplete/parts/controls/useMaskedOnChange.js +0 -28
  122. package/cjs/autocomplete/parts/menu-list/useMenuList.js +0 -69
  123. package/cjs/autocomplete/propTypes.js +0 -25
  124. package/cjs/autocomplete/utils/hooks/useKeyboardNavigation.js +0 -97
  125. package/cjs/autocomplete/utils/hooks/useOnElementResize.js +0 -37
  126. package/esm/autocomplete/config/constants.js +0 -10
  127. package/esm/autocomplete/config/useGetPropsWithDefault.js +0 -7
  128. package/esm/autocomplete/index.d.js +0 -1
  129. package/esm/autocomplete/parts/a11y-messages/MultiAllyMessages.js +0 -25
  130. package/esm/autocomplete/parts/a11y-messages/SingleAllyMessages.js +0 -20
  131. package/esm/autocomplete/parts/a11y-messages/index.js +0 -2
  132. package/esm/autocomplete/parts/a11y-messages/styled.js +0 -7
  133. package/esm/autocomplete/parts/controls/Controls.js +0 -55
  134. package/esm/autocomplete/parts/controls/index.js +0 -1
  135. package/esm/autocomplete/parts/controls/styled.js +0 -32
  136. package/esm/autocomplete/parts/controls/useControlsInput.js +0 -40
  137. package/esm/autocomplete/parts/controls/useMaskedOnChange.js +0 -24
  138. package/esm/autocomplete/parts/menu-list/useMenuList.js +0 -65
  139. package/esm/autocomplete/propTypes.js +0 -21
  140. package/esm/autocomplete/utils/hooks/useKeyboardNavigation.js +0 -93
  141. package/esm/autocomplete/utils/hooks/useOnElementResize.js +0 -33
  142. package/types/autocomplete/config/constants.d.ts +0 -8
  143. package/types/autocomplete/config/useGetPropsWithDefault.d.ts +0 -2
  144. package/types/autocomplete/parts/a11y-messages/MultiAllyMessages.d.ts +0 -3
  145. package/types/autocomplete/parts/a11y-messages/SingleAllyMessages.d.ts +0 -3
  146. package/types/autocomplete/parts/a11y-messages/index.d.ts +0 -2
  147. package/types/autocomplete/parts/a11y-messages/styled.d.ts +0 -1
  148. package/types/autocomplete/parts/controls/Controls.d.ts +0 -3
  149. package/types/autocomplete/parts/controls/index.d.ts +0 -1
  150. package/types/autocomplete/parts/controls/styled.d.ts +0 -8
  151. package/types/autocomplete/parts/controls/useControlsInput.d.ts +0 -9
  152. package/types/autocomplete/parts/controls/useMaskedOnChange.d.ts +0 -2
  153. package/types/autocomplete/parts/menu-list/useMenuList.d.ts +0 -2
  154. package/types/autocomplete/propTypes.d.ts +0 -51
  155. package/types/autocomplete/utils/hooks/useKeyboardNavigation.d.ts +0 -4
  156. package/types/autocomplete/utils/hooks/useOnElementResize.d.ts +0 -3
  157. package/types/mask-hook/hooks/useZipCode.d.ts +0 -3
@@ -4,12 +4,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _jsx = require('@babel/runtime/helpers/jsx');
6
6
  require('react');
7
- var reactDesc = require('react-desc');
8
7
  var dsPropsHelpers = require('@elliemae/ds-props-helpers');
9
8
  var useAutocomplete = require('./config/useAutocomplete.js');
10
9
  var Container = require('./parts/container/Container.js');
11
- var propTypes = require('./propTypes.js');
12
10
  var AutocompleteCTX = require('./AutocompleteCTX.js');
11
+ var reactDescPropTypes = require('./react-desc-prop-types.js');
13
12
 
14
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
15
14
 
@@ -19,15 +18,15 @@ var _Container;
19
18
 
20
19
  const DSAutocomplete = props => {
21
20
  const propsWithDefault = dsPropsHelpers.useMemoMergePropsWithDefault(props, AutocompleteCTX.defaultProps);
22
- dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, propTypes.propTypes);
21
+ dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, reactDescPropTypes.propTypes);
23
22
  const ctx = useAutocomplete.useAutocomplete(props);
24
23
  return /*#__PURE__*/_jsx__default["default"](AutocompleteCTX.AutocompleteContext.Provider, {
25
24
  value: ctx
26
25
  }, void 0, _Container || (_Container = /*#__PURE__*/_jsx__default["default"](Container.Container, {})));
27
26
  };
28
27
 
29
- const DSAutocompleteWithSchema = reactDesc.describe(DSAutocomplete);
30
- DSAutocompleteWithSchema.propTypes = propTypes.propTypes;
28
+ const DSAutocompleteWithSchema = dsPropsHelpers.describe(DSAutocomplete);
29
+ DSAutocompleteWithSchema.propTypes = reactDescPropTypes.propTypes;
31
30
 
32
31
  exports.DSAutocomplete = DSAutocomplete;
33
32
  exports.DSAutocompleteWithSchema = DSAutocompleteWithSchema;
@@ -7,18 +7,10 @@ var lodash = require('lodash');
7
7
 
8
8
  // eslint-disable-next-line @typescript-eslint/no-empty-function
9
9
  const defaultProps = {
10
- placeholder: '',
11
- options: [],
12
- selectedValues: '',
13
- hasError: false,
14
- isLoading: false,
15
- autoFocus: false,
10
+ zIndex: 10,
11
+ withoutPortal: false,
16
12
  startPlacementPreference: 'bottom-start',
17
- placementOrderPreference: ['bottom-start', 'bottom-end'],
18
- onChange: lodash.noop,
19
- onKeyDown: lodash.noop,
20
- onFilter: lodash.noop,
21
- onMenuOpen: lodash.noop
13
+ placementOrderPreference: ['bottom-start', 'bottom-end']
22
14
  };
23
15
  const defaultContext = {
24
16
  props: defaultProps,
@@ -29,9 +21,6 @@ const defaultContext = {
29
21
  setReferenceElement: lodash.noop,
30
22
  inputRef: /*#__PURE__*/React.createRef(),
31
23
  listRef: /*#__PURE__*/React.createRef(),
32
- wrapperListRef: /*#__PURE__*/React.createRef(),
33
- controlsWrapperRef: /*#__PURE__*/React.createRef(),
34
- selectedOptionsRef: /*#__PURE__*/React.createRef(),
35
24
  focusOptionIdx: '',
36
25
  setCurrentOption: lodash.noop
37
26
  };
@@ -3,15 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const AutocompleteDataTestid = {
6
- INPUT: 'autocomplete-input',
7
6
  LIST: 'autocomplete-menu-list',
8
- SELECTED_VALUES: 'autocomplete-selected-values',
9
- SELECT_ALL_BUTTON: 'autocomplete-all-btn',
10
- CLEAR_ALL_BUTTON: 'autocomplete-clear-btn',
11
- DROPDOWN: 'autocomplete-dropdown-btn',
12
7
  OPTION: 'autocomplete-option',
13
- SHOW_ALL_BUTTON: 'autocomplete-show-all-btn',
14
- SHOW_SELECTED_OPTIONS_BUTTON: 'autocomplete-selected-options-btn'
8
+ CONTAINER: 'autocomplete-container'
15
9
  };
16
10
 
17
11
  exports.AutocompleteDataTestid = AutocompleteDataTestid;
@@ -10,8 +10,11 @@ require('core-js/modules/esnext.iterator.filter.js');
10
10
  require('core-js/modules/esnext.async-iterator.for-each.js');
11
11
  require('core-js/modules/esnext.iterator.for-each.js');
12
12
  var React = require('react');
13
+ var dsPropsHelpers = require('@elliemae/ds-props-helpers');
13
14
  var reactVirtual = require('react-virtual');
14
- var useGetPropsWithDefault = require('./useGetPropsWithDefault.js');
15
+ var reactDescPropTypes = require('../react-desc-prop-types.js');
16
+ var AutocompleteCTX = require('../AutocompleteCTX.js');
17
+ var listHelper = require('../utils/listHelper.js');
15
18
 
16
19
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
20
 
@@ -21,18 +24,22 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
21
24
 
22
25
  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__default["default"](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; }
23
26
  const useAutocomplete = props => {
27
+ const defaultPropsWithInnerRef = _objectSpread(_objectSpread({}, AutocompleteCTX.defaultProps), {}, {
28
+ innerRef: React.useRef(null)
29
+ });
30
+
31
+ const propsWithDefault = dsPropsHelpers.useMemoMergePropsWithDefault(props, defaultPropsWithInnerRef);
32
+ dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, reactDescPropTypes.propTypes);
24
33
  const [showPopover, setShowPopover] = React.useState(false);
25
34
  const [referenceElement, setReferenceElement] = React.useState(null);
26
35
  const [focusOptionIdx, setCurrentOption] = React.useState('');
27
36
  const inputRef = React.useRef(null);
28
37
  const listRef = React.useRef(null);
29
- const wrapperListRef = React.useRef(null);
30
38
  const selectedOptionsRef = React.useRef(null);
31
- const controlsWrapperRef = React.useRef(null);
32
- const propsWithDefaults = useGetPropsWithDefault.useGetAutocompleteWithDefaultsProps(props);
33
39
  const {
34
- options
35
- } = propsWithDefaults; // ===========================================================================
40
+ options,
41
+ filter
42
+ } = propsWithDefault; // ===========================================================================
36
43
  // Virtualization setup
37
44
  // ===========================================================================
38
45
 
@@ -51,8 +58,16 @@ const useAutocomplete = props => {
51
58
  };
52
59
  virtualListHelpers.scrollToIndex(options.findIndex(opt => opt.dsId === dsId), opts);
53
60
  }, [options, virtualListHelpers]);
61
+ React.useEffect(() => {
62
+ if (filter.length === 0 || options.length === 0) {
63
+ setShowPopover(false);
64
+ }
65
+ }, [filter, options.length, setShowPopover]);
66
+ React.useEffect(() => {
67
+ setCurrentOption(listHelper.getFirstOption(options));
68
+ }, [options, showPopover]);
54
69
  const ctx = React.useMemo(() => ({
55
- props: _objectSpread({}, propsWithDefaults),
70
+ props: _objectSpread({}, propsWithDefault),
56
71
  virtualListHelpers,
57
72
  showPopover,
58
73
  referenceElement,
@@ -60,13 +75,11 @@ const useAutocomplete = props => {
60
75
  listRef,
61
76
  focusOptionIdx,
62
77
  selectedOptionsRef,
63
- controlsWrapperRef,
64
- wrapperListRef,
65
78
  setCurrentOption,
66
79
  scrollOptionIntoView,
67
80
  setReferenceElement,
68
81
  setShowPopover
69
- }), [scrollOptionIntoView, propsWithDefaults, virtualListHelpers, focusOptionIdx, wrapperListRef, showPopover, referenceElement, inputRef, selectedOptionsRef, controlsWrapperRef, listRef]);
82
+ }), [scrollOptionIntoView, propsWithDefault, virtualListHelpers, focusOptionIdx, showPopover, referenceElement, inputRef, selectedOptionsRef, listRef]);
70
83
  return ctx;
71
84
  };
72
85
 
@@ -3,46 +3,63 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _jsx = require('@babel/runtime/helpers/jsx');
6
+ require('core-js/modules/esnext.async-iterator.filter.js');
7
+ require('core-js/modules/esnext.iterator.constructor.js');
8
+ require('core-js/modules/esnext.iterator.filter.js');
6
9
  var React = require('react');
7
10
  var dsPopperjs = require('@elliemae/ds-popperjs');
8
11
  var AutocompleteCTX = require('../../AutocompleteCTX.js');
9
12
  var styled = require('./styled.js');
10
- var Controls = require('../controls/Controls.js');
11
13
  var MenuList = require('../menu-list/MenuList.js');
14
+ var useKeyboardNavigation = require('./useKeyboardNavigation.js');
15
+ var AutocompleteDataTestids = require('../../AutocompleteDataTestids.js');
12
16
  var jsxRuntime = require('react/jsx-runtime');
13
17
 
14
18
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
15
19
 
16
20
  var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
21
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
17
22
 
18
- var _Controls, _MenuList, _MenuList2;
19
-
23
+ var _StyledPopperWrapper;
20
24
  const Container = () => {
21
25
  const {
22
26
  props: {
23
- inline,
24
27
  startPlacementPreference,
28
+ children,
29
+ filter,
25
30
  placementOrderPreference
26
31
  },
27
32
  showPopover,
28
- inputRef,
29
33
  setReferenceElement,
30
34
  setShowPopover,
31
35
  referenceElement
32
36
  } = React.useContext(AutocompleteCTX.AutocompleteContext);
37
+ React.useEffect(() => {
38
+ const closePopper = () => {
39
+ setShowPopover(false);
40
+ };
41
+
42
+ window.addEventListener('blur', closePopper);
43
+ return () => {
44
+ window.removeEventListener('blur', closePopper);
45
+ };
46
+ }, [setShowPopover]);
33
47
  const handleCloseMenu = React.useCallback(() => {
34
48
  setShowPopover(false);
35
- if (inputRef.current) inputRef.current.blur();
36
- }, [inputRef, setShowPopover]);
37
- const handleMouseDown = React.useCallback(e => {
38
- e.preventDefault();
39
- }, []);
40
- const StyledContainer = inline ? styled.StyledContainerInline : styled.StyledContainerWithPopper;
41
- return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
42
- children: [/*#__PURE__*/jsxRuntime.jsxs(StyledContainer, {
43
- ref: setReferenceElement,
44
- children: [_Controls || (_Controls = /*#__PURE__*/_jsx__default["default"](Controls.Controls, {})), inline ? _MenuList || (_MenuList = /*#__PURE__*/_jsx__default["default"](MenuList.MenuList, {})) : null]
45
- }), /*#__PURE__*/_jsx__default["default"](dsPopperjs.DSPopperJS, {
49
+ }, [setShowPopover]);
50
+ const input = React__default["default"].Children.only(children);
51
+ const {
52
+ onInputKeyDown
53
+ } = useKeyboardNavigation.useKeyboardNavigation();
54
+ return /*#__PURE__*/jsxRuntime.jsxs(styled.StyledContainerWithPopper, {
55
+ ref: setReferenceElement,
56
+ role: "combobox",
57
+ "aria-autocomplete": "list",
58
+ "aria-controls": "autocomplete-listbox",
59
+ "aria-expanded": showPopover,
60
+ onKeyDown: onInputKeyDown,
61
+ "data-testid": AutocompleteDataTestids.AutocompleteDataTestid.CONTAINER,
62
+ children: [input, filter && /*#__PURE__*/_jsx__default["default"](dsPopperjs.DSPopperJS, {
46
63
  customOffset: [0, 5],
47
64
  closeContextMenu: handleCloseMenu,
48
65
  referenceElement: referenceElement,
@@ -53,10 +70,9 @@ const Container = () => {
53
70
  withoutArrow: true,
54
71
  withoutAnimation: true,
55
72
  zIndex: 10
56
- }, void 0, /*#__PURE__*/_jsx__default["default"](styled.StyledPopperWrapper, {
57
- tabIndex: -1,
58
- onMouseDown: handleMouseDown
59
- }, void 0, _MenuList2 || (_MenuList2 = /*#__PURE__*/_jsx__default["default"](MenuList.MenuList, {}))))]
73
+ }, void 0, _StyledPopperWrapper || (_StyledPopperWrapper = /*#__PURE__*/_jsx__default["default"](styled.StyledPopperWrapper, {
74
+ tabIndex: -1
75
+ }, void 0, /*#__PURE__*/_jsx__default["default"](MenuList.MenuList, {}))))]
60
76
  });
61
77
  };
62
78
 
@@ -11,13 +11,9 @@ var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
11
11
  const StyledContainerWithPopper = /*#__PURE__*/styled__default["default"].div.withConfig({
12
12
  componentId: "sc-xupfk9-0"
13
13
  })(["width:100%;height:28px;position:relative;"]);
14
- const StyledContainerInline = /*#__PURE__*/styled__default["default"].div.withConfig({
15
- componentId: "sc-xupfk9-1"
16
- })(["width:100%;position:relative;"]);
17
14
  const StyledPopperWrapper = /*#__PURE__*/styled__default["default"].div.withConfig({
18
- componentId: "sc-xupfk9-2"
15
+ componentId: "sc-xupfk9-1"
19
16
  })(["background:#fff;overflow:auto;position:relative;"]);
20
17
 
21
- exports.StyledContainerInline = StyledContainerInline;
22
18
  exports.StyledContainerWithPopper = StyledContainerWithPopper;
23
19
  exports.StyledPopperWrapper = StyledPopperWrapper;
@@ -14,7 +14,7 @@ const isOptionFocuseable = opt => !['section', 'separator'].includes(opt.type);
14
14
  const useKeyboardNavigation = () => {
15
15
  const {
16
16
  props: {
17
- onValueChange,
17
+ onSelect,
18
18
  options
19
19
  },
20
20
  setShowPopover,
@@ -25,25 +25,18 @@ const useKeyboardNavigation = () => {
25
25
  } = React.useContext(AutocompleteCTX.AutocompleteContext);
26
26
  const currentItemIndex = options.findIndex(opt => opt.dsId === focusOptionIdx);
27
27
  const currentItem = options.find(item => item.type === 'option' && item.dsId === focusOptionIdx);
28
- const selectOption = React.useCallback(e => {
29
- if (onValueChange) onValueChange(currentItem.label, e);
30
- setShowPopover(false);
31
- }, [currentItem, setShowPopover, onValueChange]);
32
28
  const onInputKeyDown = React.useCallback(e => {
33
- const targetElement = e.target;
34
-
35
- if (['ArrowDown', 'ArrowUp', 'Enter'].includes(e.key) || e.keyCode >= 48 && e.keyCode <= 90) {
29
+ if ((e.keyCode >= 48 && e.keyCode <= 90 || e.key === 'Backspace') && !showPopover) {
36
30
  setShowPopover(true);
37
- } // =============================================================================
31
+ } else if (e.key === 'Tab') setShowPopover(false); // =============================================================================
38
32
  // ENTER AND SPACE KEY SELECT OPTIONS AND OPEN CLOSE THE POPOVER
39
33
  // =============================================================================
40
34
 
41
35
 
42
- if (e.keyCode === 32 && targetElement.value === '' || e.key === 'Enter') {
43
- if (showPopover) {
44
- e.preventDefault();
45
- selectOption(e);
46
- }
36
+ if (e.key === 'Enter' && showPopover) {
37
+ e.preventDefault();
38
+ onSelect(currentItem === null || currentItem === void 0 ? void 0 : currentItem.label, e);
39
+ setShowPopover(false);
47
40
  } // =============================================================================
48
41
  // ARROWS UP AND DOWN
49
42
  // =============================================================================
@@ -56,8 +49,6 @@ const useKeyboardNavigation = () => {
56
49
  const nextItemIndex = listHelper.findInCircularList(options, currentItemIndex, isOptionFocuseable);
57
50
  setCurrentOption(options[nextItemIndex].dsId);
58
51
  scrollOptionIntoView(options[nextItemIndex].dsId);
59
- } else {
60
- setShowPopover(true);
61
52
  }
62
53
  }
63
54
 
@@ -68,13 +59,6 @@ const useKeyboardNavigation = () => {
68
59
  const nextItemIndex = listHelper.findInCircularList(options, currentItemIndex, isOptionFocuseable, -1);
69
60
  setCurrentOption(options[nextItemIndex].dsId);
70
61
  scrollOptionIntoView(options[nextItemIndex].dsId);
71
- } else {
72
- setShowPopover(true);
73
- setTimeout(() => {
74
- const nextItemIndex = listHelper.findInCircularList(options, 0, isOptionFocuseable, -1);
75
- setCurrentOption(options[nextItemIndex].dsId);
76
- scrollOptionIntoView(options[nextItemIndex].dsId);
77
- });
78
62
  }
79
63
  } // =============================================================================
80
64
  // ESCAPE
@@ -84,7 +68,7 @@ const useKeyboardNavigation = () => {
84
68
  if (e.key === 'Escape') {
85
69
  setShowPopover(false);
86
70
  }
87
- }, [scrollOptionIntoView, currentItemIndex, options, showPopover, setCurrentOption, setShowPopover, selectOption]);
71
+ }, [currentItem === null || currentItem === void 0 ? void 0 : currentItem.label, currentItemIndex, onSelect, options, scrollOptionIntoView, setCurrentOption, setShowPopover, showPopover]);
88
72
  return {
89
73
  onInputKeyDown
90
74
  };
@@ -4,14 +4,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _jsx = require('@babel/runtime/helpers/jsx');
6
6
  var React = require('react');
7
- var dsCircularProgressIndicator = require('@elliemae/ds-circular-progress-indicator');
8
- var dsGrid = require('@elliemae/ds-grid');
9
7
  var styled = require('./styled.js');
10
8
  var AutocompleteDataTestids = require('../../AutocompleteDataTestids.js');
11
9
  var AutocompleteCTX = require('../../AutocompleteCTX.js');
12
- var useOnElementResize = require('../../utils/hooks/useOnElementResize.js');
13
10
  var useItemRenderer = require('./useItemRenderer.js');
14
- var useMenuList = require('./useMenuList.js');
15
11
  var jsxRuntime = require('react/jsx-runtime');
16
12
 
17
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -19,73 +15,44 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
19
15
  var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
20
16
 
21
17
  const MenuList = () => {
22
- var _inputRef$current2;
23
-
24
18
  const {
25
19
  props: {
26
- menuMinWidth,
27
- menuMaxHeight,
28
- options,
29
- isLoading
20
+ options
30
21
  },
31
22
  referenceElement,
32
23
  inputRef,
33
24
  listRef,
34
25
  showPopover,
35
- wrapperListRef,
36
- controlsWrapperRef,
37
26
  virtualListHelpers: {
38
27
  totalSize
39
28
  }
40
29
  } = React.useContext(AutocompleteCTX.AutocompleteContext);
41
30
  const ItemRenderer = useItemRenderer.useItemRenderer();
42
- useMenuList.useMenuList();
43
- const {
44
- width
45
- } = useOnElementResize.useOnElementResize(controlsWrapperRef);
46
- const listWidth = React.useMemo(() => menuMinWidth || "".concat(referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth), // eslint-disable-next-line react-hooks/exhaustive-deps
47
- [menuMinWidth, referenceElement, width]);
48
31
  const handleOnFocus = React.useCallback(() => {
49
32
  var _inputRef$current;
50
33
 
51
34
  (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
52
35
  }, [inputRef]);
53
- return /*#__PURE__*/jsxRuntime.jsx(styled.StyledListWrapper, {
36
+ return /*#__PURE__*/_jsx__default["default"](styled.StyledListWrapper, {
54
37
  tabIndex: -1,
55
- ref: wrapperListRef,
56
38
  onMouseDown: e => e.preventDefault(),
57
- minWidth: listWidth,
58
- id: "combo-listbox",
59
- role: "listbox",
60
- children: isLoading && ((_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 ? void 0 : _inputRef$current2.value) !== '' ? /*#__PURE__*/_jsx__default["default"](dsGrid.Grid, {
61
- justifyContent: "center",
62
- alignItems: "center",
39
+ minWidth: referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth,
40
+ id: "autocomplete-listbox",
41
+ role: "listbox"
42
+ }, void 0, options.length > 0 && /*#__PURE__*/jsxRuntime.jsx(styled.StyledVirtualListWrapper, {
43
+ tabIndex: -1,
44
+ ref: listRef,
45
+ children: /*#__PURE__*/_jsx__default["default"](styled.StyledList, {
46
+ tabIndex: -1,
47
+ "aria-expanded": showPopover,
48
+ onFocus: handleOnFocus,
49
+ "data-testid": AutocompleteDataTestids.AutocompleteDataTestid.LIST,
63
50
  style: {
64
- padding: 20
51
+ height: totalSize,
52
+ margin: '8px 0px'
65
53
  }
66
- }, void 0, /*#__PURE__*/_jsx__default["default"](dsCircularProgressIndicator.DSCircularProgressIndicator, {
67
- size: "l",
68
- loading: isLoading,
69
- waiting: false,
70
- showTooltip: false
71
- })) : /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {
72
- children: options.length > 0 && /*#__PURE__*/jsxRuntime.jsx(styled.StyledVirtualListWrapper, {
73
- tabIndex: -1,
74
- maxHeight: menuMaxHeight,
75
- ref: listRef,
76
- children: /*#__PURE__*/_jsx__default["default"](styled.StyledList, {
77
- tabIndex: -1,
78
- "aria-expanded": showPopover,
79
- onFocus: handleOnFocus,
80
- "data-testid": AutocompleteDataTestids.AutocompleteDataTestid.LIST,
81
- style: {
82
- height: totalSize,
83
- margin: '8px 0px'
84
- }
85
- }, void 0, ItemRenderer)
86
- })
87
- })
88
- });
54
+ }, void 0, ItemRenderer)
55
+ }));
89
56
  };
90
57
 
91
58
  exports.MenuList = MenuList;
@@ -10,23 +10,22 @@ var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
10
10
 
11
11
  const StyledListWrapper = /*#__PURE__*/styled__default["default"].div.withConfig({
12
12
  componentId: "sc-qt1kwv-0"
13
- })(["min-width:", ";"], props => props.inline ? '100%' : "".concat(props.minWidth, "px"));
13
+ })(["min-width:", ";"], _ref => {
14
+ let {
15
+ minWidth
16
+ } = _ref;
17
+ return minWidth ? "".concat(minWidth, "px") : '100%';
18
+ });
14
19
  const StyledList = /*#__PURE__*/styled__default["default"].ul.withConfig({
15
20
  componentId: "sc-qt1kwv-1"
16
21
  })(["position:relative;padding:0;"]);
17
22
  const StyledVirtualListWrapper = /*#__PURE__*/styled__default["default"].div.withConfig({
18
23
  componentId: "sc-qt1kwv-2"
19
- })(["overflow-y:auto;margin-top:", ";max-height:", ";"], _ref => {
20
- let {
21
- withHeader
22
- } = _ref;
23
- return withHeader ? '28px' : '';
24
- }, _ref2 => {
24
+ })(["overflow-y:auto;max-height:", ";"], _ref2 => {
25
25
  let {
26
- maxHeight,
27
- inline
26
+ maxHeight
28
27
  } = _ref2;
29
- return inline ? '' : "".concat(!maxHeight ? '400' : maxHeight, "px");
28
+ return "".concat(!maxHeight ? '400' : maxHeight, "px");
30
29
  });
31
30
 
32
31
  exports.StyledList = StyledList;
@@ -13,7 +13,6 @@ require('core-js/modules/esnext.iterator.for-each.js');
13
13
  var React = require('react');
14
14
  var dsForm = require('@elliemae/ds-form');
15
15
  var AutocompleteCTX = require('../../AutocompleteCTX.js');
16
- var listHelper = require('../../utils/listHelper.js');
17
16
  var AutocompleteDataTestids = require('../../AutocompleteDataTestids.js');
18
17
  var jsxRuntime = require('react/jsx-runtime');
19
18
 
@@ -24,66 +23,61 @@ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_definePropert
24
23
  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; }
25
24
 
26
25
  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__default["default"](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; }
27
-
28
26
  const useItemRenderer = () => {
29
27
  const {
30
28
  props: {
31
29
  options,
32
- onChange,
33
- selectedValues,
34
- onFilter
30
+ onSelect
35
31
  },
36
32
  inputRef,
37
33
  setShowPopover,
38
34
  focusOptionIdx,
39
35
  virtualListHelpers
40
36
  } = React.useContext(AutocompleteCTX.AutocompleteContext);
41
- const {
42
- virtualItems
43
- } = virtualListHelpers;
44
37
  const handleClick = React.useCallback((option, e) => {
45
- var _inputRef$current;
46
-
47
- if (inputRef.current) inputRef.current.value = option.label;
48
- onFilter(option.label);
49
- onChange(option.label);
38
+ onSelect(option.label, e);
50
39
  setShowPopover(false);
51
- (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus();
52
40
  e.stopPropagation();
53
41
  e.preventDefault();
54
- }, [onFilter, onChange, setShowPopover, inputRef]);
55
- const handleOnMouseDown = React.useCallback(e => {
56
- e.preventDefault();
57
- }, []);
58
- const ItemRenderer = React.useMemo(() => virtualItems.map(vItem => {
59
- const option = options[vItem.index];
60
- const generalProps = {
61
- wrapperStyles: {
62
- position: 'absolute',
63
- top: vItem.start,
64
- left: 0,
65
- width: '100%'
66
- },
67
- key: "".concat(option.dsId),
68
- innerRef: vItem.measureRef
69
- };
42
+ }, [onSelect, setShowPopover]);
43
+ return React.useMemo(() => {
44
+ if (virtualListHelpers) {
45
+ return virtualListHelpers.virtualItems.map(vItem => {
46
+ const option = options[vItem.index];
47
+ const generalProps = {
48
+ wrapperStyles: {
49
+ position: 'absolute',
50
+ top: vItem.start,
51
+ left: 0,
52
+ width: '100%'
53
+ },
54
+ key: "".concat(option.dsId),
55
+ innerRef: vItem.measureRef
56
+ };
57
+
58
+ if (option.type === 'section') {
59
+ return /*#__PURE__*/jsxRuntime.jsx(dsForm.Section, _objectSpread({
60
+ label: option.label
61
+ }, generalProps));
62
+ }
63
+
64
+ if (option.type === 'option') {
65
+ return /*#__PURE__*/jsxRuntime.jsx(dsForm.SingleMenuItem, _objectSpread(_objectSpread({}, generalProps), {}, {
66
+ value: option.value,
67
+ label: option.label,
68
+ dataTestid: AutocompleteDataTestids.AutocompleteDataTestid.OPTION,
69
+ disabled: option.disabled,
70
+ onClick: e => handleClick(option, e),
71
+ isActive: option.dsId === focusOptionIdx
72
+ }));
73
+ }
70
74
 
71
- if (option.type === 'option') {
72
- return /*#__PURE__*/jsxRuntime.jsx(dsForm.SingleMenuItem, _objectSpread(_objectSpread({}, generalProps), {}, {
73
- value: option.value,
74
- label: option.label,
75
- dataTestid: AutocompleteDataTestids.AutocompleteDataTestid.OPTION,
76
- disabled: option.disabled,
77
- onClick: e => handleClick(option, e),
78
- onMouseDown: handleOnMouseDown,
79
- isActive: option.dsId === focusOptionIdx,
80
- isSelected: listHelper.isSelected(selectedValues, option)
81
- }));
75
+ return /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {});
76
+ });
82
77
  }
83
78
 
84
- return /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {});
85
- }), [options, focusOptionIdx, selectedValues, inputRef, virtualItems]);
86
- return ItemRenderer;
79
+ return null;
80
+ }, [options, focusOptionIdx, inputRef, virtualListHelpers]);
87
81
  };
88
82
 
89
83
  exports.useItemRenderer = useItemRenderer;
@@ -5,15 +5,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var dsPropsHelpers = require('@elliemae/ds-props-helpers');
6
6
 
7
7
  /* eslint-disable @typescript-eslint/no-unused-vars */
8
- function noop() {}
9
8
  const propTypes = {
10
- placeholder: dsPropsHelpers.PropTypes.string.description('input s placeholder value').defaultValue(''),
11
- options: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.array, dsPropsHelpers.PropTypes.object]).description('List of options').defaultValue([]),
12
- value: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.string]).description('Array of option or single option selected'),
13
- autoFocus: dsPropsHelpers.PropTypes.bool.description('Whether the combo box uses auto focus or not').defaultValue('false'),
14
- hasError: dsPropsHelpers.PropTypes.bool.description('Whether the combo box has error or not').defaultValue('false'),
15
- onChange: dsPropsHelpers.PropTypes.func.description('function triggered when an option is selected it will send the options selected').defaultValue('')
9
+ options: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.array, dsPropsHelpers.PropTypes.object]).isRequired.description('List of options').defaultValue([]),
10
+ filter: dsPropsHelpers.PropTypes.string.isRequired.description('String value to filter the options').defaultValue(''),
11
+ onSelect: dsPropsHelpers.PropTypes.func.isRequired.description('function triggered when an option is selected it will send the options selected').defaultValue(''),
12
+ children: dsPropsHelpers.PropTypes.node.isRequired.description('React component to apply autocomplete functionality').defaultValue('')
16
13
  };
17
14
 
18
- exports.noop = noop;
19
15
  exports.propTypes = propTypes;