@elliemae/ds-controlled-form 2.4.1-rc.2 → 2.4.1-rc.6

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 (199) 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 +20 -3
  34. package/cjs/large-text-input/DSControlledLargeTextInput.js +83 -0
  35. package/cjs/large-text-input/exported-related/data-test-ids.js +11 -0
  36. package/cjs/large-text-input/exported-related/index.js +12 -0
  37. package/cjs/large-text-input/exported-related/theming.js +13 -0
  38. package/cjs/large-text-input/index.js +15 -0
  39. package/cjs/large-text-input/react-desc-prop-types.js +45 -0
  40. package/cjs/large-text-input/styles.js +40 -0
  41. package/cjs/mask-hook/hooks/index.js +11 -3
  42. package/cjs/mask-hook/hooks/useNumberMask.js +7 -0
  43. package/cjs/mask-hook/hooks/usePhoneMask.js +7 -0
  44. package/cjs/mask-hook/hooks/useRegExpMask.js +122 -0
  45. package/cjs/mask-hook/hooks/useSSNMask.js +7 -0
  46. package/cjs/mask-hook/hooks/{useZipCode.js → useZipCodeMask.js} +12 -5
  47. package/cjs/mask-hook/index.js +11 -3
  48. package/cjs/mask-hook/react-desc-prop-types.js +9 -0
  49. package/cjs/mask-hook/utils/addSpecialCharacters.js +3 -4
  50. package/cjs/mask-hook/utils/flatStringArray.js +18 -0
  51. package/cjs/mask-hook/utils/index.js +2 -0
  52. package/esm/autocomplete/Autocomplete.js +2 -3
  53. package/esm/autocomplete/AutocompleteCTX.js +3 -14
  54. package/esm/autocomplete/AutocompleteDataTestids.js +1 -7
  55. package/esm/autocomplete/config/useAutocomplete.js +27 -14
  56. package/esm/autocomplete/parts/container/Container.js +38 -23
  57. package/esm/autocomplete/parts/container/styled.js +2 -5
  58. package/esm/autocomplete/parts/{controls → container}/useKeyboardNavigation.js +8 -24
  59. package/esm/autocomplete/parts/menu-list/MenuList.js +19 -52
  60. package/esm/autocomplete/parts/menu-list/styled.js +9 -10
  61. package/esm/autocomplete/parts/menu-list/useItemRenderer.js +39 -45
  62. package/esm/autocomplete/react-desc-prop-types.js +5 -8
  63. package/esm/autocomplete/utils/listHelper.js +8 -16
  64. package/esm/checkbox/react-desc-prop-types.js +1 -0
  65. package/esm/combobox/ComboBox.js +1 -1
  66. package/esm/combobox/config/useComboBox.js +8 -2
  67. package/esm/combobox/config/useCorrectOptions.js +15 -43
  68. package/esm/combobox/index.js +1 -1
  69. package/esm/combobox/parts/A11yFocusedOption.js +3 -3
  70. package/esm/combobox/parts/controls/Controls.js +4 -2
  71. package/esm/combobox/parts/controls-input/ControlsInput.js +2 -0
  72. package/esm/combobox/parts/controls-input/styled.js +1 -1
  73. package/esm/combobox/parts/controls-input/useControlsInput.js +6 -6
  74. package/esm/combobox/parts/controls-input/useKeyboardNavigation.js +30 -26
  75. package/esm/combobox/parts/controls-input/useMaskedOnChange.js +7 -5
  76. package/esm/combobox/parts/dropdown-indicator/DropdownIndicator.js +2 -2
  77. package/esm/combobox/parts/header-list/useHeaderListHandlers.js +4 -4
  78. package/esm/combobox/parts/menu-list/MenuList.js +13 -7
  79. package/esm/combobox/parts/menu-list/styled.js +16 -5
  80. package/esm/combobox/parts/menu-list/useItemRenderer.js +8 -8
  81. package/esm/combobox/parts/menu-list/useMenuListSetFocusOption.js +6 -6
  82. package/esm/combobox/react-desc-prop-types.js +2 -1
  83. package/esm/combobox/utils/listHelper.js +38 -12
  84. package/esm/index.js +9 -5
  85. package/esm/large-text-input/DSControlledLargeTextInput.js +72 -0
  86. package/esm/large-text-input/exported-related/data-test-ids.js +7 -0
  87. package/esm/large-text-input/exported-related/index.js +2 -0
  88. package/esm/large-text-input/exported-related/theming.js +8 -0
  89. package/esm/large-text-input/index.js +3 -0
  90. package/esm/large-text-input/react-desc-prop-types.js +36 -0
  91. package/esm/large-text-input/styles.js +30 -0
  92. package/esm/mask-hook/hooks/index.js +5 -4
  93. package/esm/mask-hook/hooks/useNumberMask.js +7 -1
  94. package/esm/mask-hook/hooks/usePhoneMask.js +7 -1
  95. package/esm/mask-hook/hooks/useRegExpMask.js +116 -0
  96. package/esm/mask-hook/hooks/useSSNMask.js +7 -1
  97. package/esm/mask-hook/hooks/{useZipCode.js → useZipCodeMask.js} +11 -5
  98. package/esm/mask-hook/index.js +5 -4
  99. package/esm/mask-hook/react-desc-prop-types.js +8 -1
  100. package/esm/mask-hook/utils/addSpecialCharacters.js +3 -4
  101. package/esm/mask-hook/utils/flatStringArray.js +14 -0
  102. package/esm/mask-hook/utils/index.js +1 -0
  103. package/package.json +60 -88
  104. package/types/autocomplete/Autocomplete.d.ts +4 -61
  105. package/types/autocomplete/AutocompleteCTX.d.ts +4 -3
  106. package/types/autocomplete/AutocompleteDataTestids.d.ts +1 -7
  107. package/types/autocomplete/config/useAutocomplete.d.ts +3 -2
  108. package/types/autocomplete/parts/container/Container.d.ts +1 -2
  109. package/types/autocomplete/parts/container/styled.d.ts +0 -1
  110. package/types/autocomplete/parts/{controls → container}/useKeyboardNavigation.d.ts +0 -0
  111. package/types/autocomplete/parts/menu-list/MenuList.d.ts +1 -2
  112. package/types/autocomplete/parts/menu-list/styled.d.ts +1 -4
  113. package/types/autocomplete/parts/menu-list/useItemRenderer.d.ts +2 -3
  114. package/types/autocomplete/react-desc-prop-types.d.ts +8 -18
  115. package/types/autocomplete/sharedTypes.d.ts +1 -3
  116. package/types/autocomplete/tests/general.test.d.ts +1 -0
  117. package/types/autocomplete/tests/utils.d.ts +5 -0
  118. package/types/autocomplete/utils/listHelper.d.ts +2 -2
  119. package/types/checkbox/ControlledCheckbox.d.ts +1 -1
  120. package/types/checkbox/react-desc-prop-types.d.ts +366 -1
  121. package/types/combobox/ComboBox.d.ts +2 -2
  122. package/types/combobox/parts/dropdown-indicator/DropdownIndicator.d.ts +1 -0
  123. package/types/combobox/react-desc-prop-types.d.ts +381 -3
  124. package/types/combobox/utils/listHelper.d.ts +4 -1
  125. package/types/index.d.ts +1 -0
  126. package/types/large-text-input/DSControlledLargeTextInput.d.ts +5 -0
  127. package/types/large-text-input/exported-related/data-test-ids.d.ts +5 -0
  128. package/types/large-text-input/exported-related/index.d.ts +2 -0
  129. package/types/large-text-input/exported-related/theming.d.ts +6 -0
  130. package/types/large-text-input/index.d.ts +2 -0
  131. package/types/large-text-input/react-desc-prop-types.d.ts +447 -0
  132. package/types/large-text-input/styles.d.ts +3 -0
  133. package/types/large-text-input/tests/DSControlledLargeTextInput.test.d.ts +1 -0
  134. package/types/mask-hook/hooks/index.d.ts +2 -1
  135. package/types/mask-hook/hooks/useNumberMask.d.ts +2 -1
  136. package/types/mask-hook/hooks/usePhoneMask.d.ts +2 -1
  137. package/types/mask-hook/hooks/useRegExpMask.d.ts +4 -0
  138. package/types/mask-hook/hooks/useSSNMask.d.ts +2 -1
  139. package/types/mask-hook/hooks/useZipCodeMask.d.ts +4 -0
  140. package/types/mask-hook/react-desc-prop-types.d.ts +6 -1
  141. package/types/mask-hook/tests/useRegExpMask.test.d.ts +1 -0
  142. package/types/mask-hook/utils/flatStringArray.d.ts +1 -0
  143. package/types/mask-hook/utils/index.d.ts +1 -0
  144. package/types/text-input/DSInputText.d.ts +1 -1
  145. package/types/text-input/config/useInputText.d.ts +110 -110
  146. package/cjs/autocomplete/config/constants.js +0 -14
  147. package/cjs/autocomplete/config/useGetPropsWithDefault.js +0 -11
  148. package/cjs/autocomplete/index.d.js +0 -2
  149. package/cjs/autocomplete/parts/a11y-messages/MultiAllyMessages.js +0 -33
  150. package/cjs/autocomplete/parts/a11y-messages/SingleAllyMessages.js +0 -28
  151. package/cjs/autocomplete/parts/a11y-messages/index.js +0 -11
  152. package/cjs/autocomplete/parts/a11y-messages/styled.js +0 -15
  153. package/cjs/autocomplete/parts/controls/Controls.js +0 -63
  154. package/cjs/autocomplete/parts/controls/index.js +0 -9
  155. package/cjs/autocomplete/parts/controls/styled.js +0 -44
  156. package/cjs/autocomplete/parts/controls/useControlsInput.js +0 -44
  157. package/cjs/autocomplete/parts/controls/useMaskedOnChange.js +0 -28
  158. package/cjs/autocomplete/parts/menu-list/useMenuList.js +0 -69
  159. package/cjs/autocomplete/propTypes.js +0 -25
  160. package/cjs/autocomplete/utils/hooks/useKeyboardNavigation.js +0 -97
  161. package/cjs/autocomplete/utils/hooks/useOnElementResize.js +0 -37
  162. package/cjs/text-input/exported-related/name.js +0 -7
  163. package/cjs/text-input/exported-related/slots.js +0 -11
  164. package/esm/autocomplete/config/constants.js +0 -10
  165. package/esm/autocomplete/config/useGetPropsWithDefault.js +0 -7
  166. package/esm/autocomplete/index.d.js +0 -1
  167. package/esm/autocomplete/parts/a11y-messages/MultiAllyMessages.js +0 -25
  168. package/esm/autocomplete/parts/a11y-messages/SingleAllyMessages.js +0 -20
  169. package/esm/autocomplete/parts/a11y-messages/index.js +0 -2
  170. package/esm/autocomplete/parts/a11y-messages/styled.js +0 -7
  171. package/esm/autocomplete/parts/controls/Controls.js +0 -55
  172. package/esm/autocomplete/parts/controls/index.js +0 -1
  173. package/esm/autocomplete/parts/controls/styled.js +0 -32
  174. package/esm/autocomplete/parts/controls/useControlsInput.js +0 -40
  175. package/esm/autocomplete/parts/controls/useMaskedOnChange.js +0 -24
  176. package/esm/autocomplete/parts/menu-list/useMenuList.js +0 -65
  177. package/esm/autocomplete/propTypes.js +0 -21
  178. package/esm/autocomplete/utils/hooks/useKeyboardNavigation.js +0 -93
  179. package/esm/autocomplete/utils/hooks/useOnElementResize.js +0 -33
  180. package/esm/text-input/exported-related/name.js +0 -3
  181. package/esm/text-input/exported-related/slots.js +0 -7
  182. package/types/autocomplete/config/constants.d.ts +0 -8
  183. package/types/autocomplete/config/useGetPropsWithDefault.d.ts +0 -2
  184. package/types/autocomplete/parts/a11y-messages/MultiAllyMessages.d.ts +0 -3
  185. package/types/autocomplete/parts/a11y-messages/SingleAllyMessages.d.ts +0 -3
  186. package/types/autocomplete/parts/a11y-messages/index.d.ts +0 -2
  187. package/types/autocomplete/parts/a11y-messages/styled.d.ts +0 -1
  188. package/types/autocomplete/parts/controls/Controls.d.ts +0 -3
  189. package/types/autocomplete/parts/controls/index.d.ts +0 -1
  190. package/types/autocomplete/parts/controls/styled.d.ts +0 -8
  191. package/types/autocomplete/parts/controls/useControlsInput.d.ts +0 -9
  192. package/types/autocomplete/parts/controls/useMaskedOnChange.d.ts +0 -2
  193. package/types/autocomplete/parts/menu-list/useMenuList.d.ts +0 -2
  194. package/types/autocomplete/propTypes.d.ts +0 -51
  195. package/types/autocomplete/utils/hooks/useKeyboardNavigation.d.ts +0 -4
  196. package/types/autocomplete/utils/hooks/useOnElementResize.d.ts +0 -3
  197. package/types/mask-hook/hooks/useZipCode.d.ts +0 -3
  198. package/types/text-input/exported-related/name.d.ts +0 -1
  199. package/types/text-input/exported-related/slots.d.ts +0 -5
@@ -0,0 +1,122 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ require('core-js/modules/web.dom-collections.iterator.js');
6
+ var React = require('react');
7
+ var dsPropsHelpers = require('@elliemae/ds-props-helpers');
8
+ var dsUtilities = require('@elliemae/ds-utilities');
9
+ var addSpecialCharacters = require('../utils/addSpecialCharacters.js');
10
+ var getPartialMaskedPos = require('../utils/getPartialMaskedPos.js');
11
+ var setCursorPosition = require('../utils/setCursorPosition.js');
12
+ require('core-js/modules/esnext.async-iterator.filter.js');
13
+ require('core-js/modules/esnext.iterator.constructor.js');
14
+ require('core-js/modules/esnext.iterator.filter.js');
15
+ var flatStringArray = require('../utils/flatStringArray.js');
16
+ var reactDescPropTypes = require('../react-desc-prop-types.js');
17
+
18
+ const isRegExp = item => typeof item === 'object';
19
+
20
+ const conformValue = (rawValue, cursorPos, lastKeyCode, regExp, filledMask) => {
21
+ const specialChars = [];
22
+ const flatRegExp = flatStringArray.flatStringArray(regExp);
23
+ const rawValueArray = rawValue.split('');
24
+ let offSet = 0;
25
+ let charsFound = 0;
26
+ let specialCharsLeft = '';
27
+ let fullRegExpMatched = false;
28
+ const maskedValue = [];
29
+
30
+ for (let i = 0; i < flatRegExp.length; i += 1) {
31
+ if (isRegExp(flatRegExp[i])) {
32
+ specialCharsLeft = '';
33
+ fullRegExpMatched = false;
34
+
35
+ for (let j = charsFound + offSet; j < rawValueArray.length; j += 1) {
36
+ var _rawValueArray$j;
37
+
38
+ const match = (_rawValueArray$j = rawValueArray[j]) === null || _rawValueArray$j === void 0 ? void 0 : _rawValueArray$j.match(flatRegExp[i]);
39
+
40
+ if (match) {
41
+ maskedValue.push(match[0]);
42
+ charsFound += 1;
43
+ fullRegExpMatched = true;
44
+ break;
45
+ } else {
46
+ offSet += 1;
47
+ }
48
+ }
49
+
50
+ if (filledMask && !fullRegExpMatched) {
51
+ maskedValue.push('_');
52
+ }
53
+ } else {
54
+ specialChars.push([flatRegExp[i], i]);
55
+ if (rawValueArray[i + offSet] === flatRegExp[i]) charsFound += 1;
56
+ specialCharsLeft += flatRegExp[i];
57
+ }
58
+ }
59
+
60
+ if (!fullRegExpMatched) specialCharsLeft = '';
61
+ const maskedPos = getPartialMaskedPos.getPartialMaskedPos(rawValue, maskedValue, cursorPos);
62
+ const [maskWithSpecialsChars, finalMaskedPos] = addSpecialCharacters.addSpecialCharacters(maskedValue, specialChars, maskedPos, lastKeyCode);
63
+ return [maskWithSpecialsChars + specialCharsLeft, finalMaskedPos];
64
+ };
65
+
66
+ const useRegExpMask = props => {
67
+ const propsWithDefault = dsPropsHelpers.useMemoMergePropsWithDefault(props, reactDescPropTypes.DSMaskRegExpHookDefaultProps);
68
+ dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, reactDescPropTypes.DSMaskRegExpHookPropsTypes);
69
+ const {
70
+ valueSetter,
71
+ onChange: userOnChange,
72
+ onKeyDown: userOnKeyDown,
73
+ onBlur: userOnBlur,
74
+ regExp,
75
+ filledMask
76
+ } = propsWithDefault;
77
+ const lastKeyCode = React.useRef('Unidentified');
78
+ const scheduleAfterRender = dsUtilities.useCallbackAfterRender(); // Some times, the value of the mask is not gonna change (user types invalid char for example)
79
+ // This makes the input to go from "correct" -> "incorrect" -> "correct"
80
+ // But since the input is controlled, the input does not re-render
81
+ // This makes the input go mumbo-jumbo and places the cursor in the end, because we kinda changed the value async
82
+ // Solution for this is to trigger a re-render, we do this with a set state call in the on change event
83
+
84
+ const [, setKey] = React.useState(0);
85
+ const onKeyDown = React.useCallback(e => {
86
+ lastKeyCode.current = e.code;
87
+ if (userOnKeyDown) userOnKeyDown(e);
88
+ }, [userOnKeyDown]);
89
+ const onChange = React.useCallback(e => {
90
+ var _e$target$selectionEn;
91
+
92
+ const [mask, cursorPos] = conformValue(e.target.value, (_e$target$selectionEn = e.target.selectionEnd) !== null && _e$target$selectionEn !== void 0 ? _e$target$selectionEn : 0, lastKeyCode.current, regExp, filledMask);
93
+ valueSetter(prevMask => {
94
+ // Here we need to update the key
95
+ if (mask === prevMask) setKey(key => key + 1);
96
+ return mask;
97
+ });
98
+ if (userOnChange) userOnChange(e, mask);
99
+ scheduleAfterRender(() => setCursorPosition.setCursorPosition(e.target, cursorPos));
100
+ }, [valueSetter, scheduleAfterRender, userOnChange]);
101
+ const onBlur = React.useCallback(e => {
102
+ if (filledMask) {
103
+ const maskedValue = e.target.value.split('');
104
+ const flatRegExp = flatStringArray.flatStringArray(regExp);
105
+ const firstUnderscoreIdx = maskedValue.findIndex((char, idx) => char === '_' && flatRegExp[idx] !== '_');
106
+ if (firstUnderscoreIdx > -1) valueSetter(maskedValue.slice(0, firstUnderscoreIdx).join(''));
107
+ }
108
+
109
+ if (userOnBlur) userOnBlur(e);
110
+ }, [valueSetter, userOnBlur]);
111
+ return {
112
+ onKeyDown,
113
+ onChange,
114
+ onBlur
115
+ };
116
+ };
117
+ const UseRegExpMaskWithSchema = dsPropsHelpers.describe(useRegExpMask);
118
+ UseRegExpMaskWithSchema.propTypes = reactDescPropTypes.DSMaskRegExpHookPropsTypes;
119
+
120
+ exports.UseRegExpMaskWithSchema = UseRegExpMaskWithSchema;
121
+ exports.isRegExp = isRegExp;
122
+ exports.useRegExpMask = useRegExpMask;
@@ -12,6 +12,8 @@ var dsUtilities = require('@elliemae/ds-utilities');
12
12
  var addSpecialCharacters = require('../utils/addSpecialCharacters.js');
13
13
  var getPartialMaskedPos = require('../utils/getPartialMaskedPos.js');
14
14
  var setCursorPosition = require('../utils/setCursorPosition.js');
15
+ require('core-js/modules/esnext.async-iterator.reduce.js');
16
+ require('core-js/modules/esnext.iterator.reduce.js');
15
17
  var reactDescPropTypes = require('../react-desc-prop-types.js');
16
18
 
17
19
  const ssnSpecialChars = [['-', 3], ['-', 6]];
@@ -65,8 +67,13 @@ const useSSNMask = props => {
65
67
  onChange
66
68
  };
67
69
  };
70
+ const getSSNMaskedValue = value => {
71
+ const [maskedValue] = conformValue(value, value.length - 1, '');
72
+ return maskedValue;
73
+ };
68
74
  const UseSSNMaskWithSchema = dsPropsHelpers.describe(useSSNMask);
69
75
  UseSSNMaskWithSchema.propTypes = reactDescPropTypes.DSMaskHookPropsTypes;
70
76
 
71
77
  exports.UseSSNMaskWithSchema = UseSSNMaskWithSchema;
78
+ exports.getSSNMaskedValue = getSSNMaskedValue;
72
79
  exports.useSSNMask = useSSNMask;
@@ -12,20 +12,22 @@ var dsUtilities = require('@elliemae/ds-utilities');
12
12
  var addSpecialCharacters = require('../utils/addSpecialCharacters.js');
13
13
  var getPartialMaskedPos = require('../utils/getPartialMaskedPos.js');
14
14
  var setCursorPosition = require('../utils/setCursorPosition.js');
15
+ require('core-js/modules/esnext.async-iterator.reduce.js');
16
+ require('core-js/modules/esnext.iterator.reduce.js');
15
17
  var reactDescPropTypes = require('../react-desc-prop-types.js');
16
18
 
17
19
  const zipCodeSpecialChars = [['-', 5]];
18
20
 
19
21
  const conformValue = (rawValue, cursorPos, lastKeyCode) => {
20
22
  // Work with digits only
21
- let maskedValue = rawValue.split('').filter(char => char >= '0' && char <= '9'); // We only consider first 5 digits
23
+ let maskedValue = rawValue.split('').filter(char => char >= '0' && char <= '9'); // We only consider first 9 digits
22
24
 
23
- maskedValue = maskedValue.slice(0, 6);
25
+ maskedValue = maskedValue.slice(0, 9);
24
26
  const maskedPos = getPartialMaskedPos.getPartialMaskedPos(rawValue, maskedValue, cursorPos);
25
27
  return addSpecialCharacters.addSpecialCharacters(maskedValue, zipCodeSpecialChars, maskedPos, lastKeyCode);
26
28
  };
27
29
 
28
- const useZipCode = props => {
30
+ const useZipCodeMask = props => {
29
31
  const propsWithDefault = dsPropsHelpers.useMemoMergePropsWithDefault(props, reactDescPropTypes.DSMaskHookDefaultProps);
30
32
  dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, reactDescPropTypes.DSMaskHookPropsTypes);
31
33
  const {
@@ -62,8 +64,13 @@ const useZipCode = props => {
62
64
  onChange
63
65
  };
64
66
  };
65
- const UseZipCodeMaskWithSchema = dsPropsHelpers.describe(useZipCode);
67
+ const getUseZipMaskedValue = value => {
68
+ const [maskedValue] = conformValue(value, value.length - 1, '');
69
+ return maskedValue;
70
+ };
71
+ const UseZipCodeMaskWithSchema = dsPropsHelpers.describe(useZipCodeMask);
66
72
  UseZipCodeMaskWithSchema.propTypes = reactDescPropTypes.DSMaskHookPropsTypes;
67
73
 
68
74
  exports.UseZipCodeMaskWithSchema = UseZipCodeMaskWithSchema;
69
- exports.useZipCode = useZipCode;
75
+ exports.getUseZipMaskedValue = getUseZipMaskedValue;
76
+ exports.useZipCodeMask = useZipCodeMask;
@@ -5,15 +5,23 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var usePhoneMask = require('./hooks/usePhoneMask.js');
6
6
  var useNumberMask = require('./hooks/useNumberMask.js');
7
7
  var useSSNMask = require('./hooks/useSSNMask.js');
8
- var useZipCode = require('./hooks/useZipCode.js');
8
+ var useRegExpMask = require('./hooks/useRegExpMask.js');
9
+ var useZipCodeMask = require('./hooks/useZipCodeMask.js');
9
10
 
10
11
 
11
12
 
12
13
  exports.UsePhoneMaskWithSchema = usePhoneMask.UsePhoneMaskWithSchema;
14
+ exports.getPhoneMaskedValue = usePhoneMask.getPhoneMaskedValue;
13
15
  exports.usePhoneMask = usePhoneMask.usePhoneMask;
14
16
  exports.UseNumberMaskWithSchema = useNumberMask.UseNumberMaskWithSchema;
17
+ exports.getNumberMaskedValue = useNumberMask.getNumberMaskedValue;
15
18
  exports.useNumberMask = useNumberMask.useNumberMask;
16
19
  exports.UseSSNMaskWithSchema = useSSNMask.UseSSNMaskWithSchema;
20
+ exports.getSSNMaskedValue = useSSNMask.getSSNMaskedValue;
17
21
  exports.useSSNMask = useSSNMask.useSSNMask;
18
- exports.UseZipCodeMaskWithSchema = useZipCode.UseZipCodeMaskWithSchema;
19
- exports.useZipCode = useZipCode.useZipCode;
22
+ exports.UseRegExpMaskWithSchema = useRegExpMask.UseRegExpMaskWithSchema;
23
+ exports.isRegExp = useRegExpMask.isRegExp;
24
+ exports.useRegExpMask = useRegExpMask.useRegExpMask;
25
+ exports.UseZipCodeMaskWithSchema = useZipCodeMask.UseZipCodeMaskWithSchema;
26
+ exports.getUseZipMaskedValue = useZipCodeMask.getUseZipMaskedValue;
27
+ exports.useZipCodeMask = useZipCodeMask.useZipCodeMask;
@@ -25,6 +25,9 @@ const DSMaskHookDefaultProps = {
25
25
  const DSMaskPhoneHookDefaultProps = _objectSpread(_objectSpread({}, DSMaskHookDefaultProps), {}, {
26
26
  isInternational: false
27
27
  });
28
+ const DSMaskRegExpHookDefaultProps = _objectSpread(_objectSpread({}, DSMaskHookDefaultProps), {}, {
29
+ filledMask: false
30
+ });
28
31
  const DSMaskNumberHookDefaultProps = _objectSpread(_objectSpread({}, DSMaskHookDefaultProps), {}, {
29
32
  suffix: '',
30
33
  prefix: '',
@@ -38,6 +41,10 @@ const DSMaskHookPropsTypes = {
38
41
  onChange: dsPropsHelpers.PropTypes.func.description('Callback for onChange'),
39
42
  onKeyDown: dsPropsHelpers.PropTypes.func.description('Callback for onKeyDown')
40
43
  };
44
+ const DSMaskRegExpHookPropsTypes = _objectSpread(_objectSpread({}, DSMaskHookPropsTypes), {}, {
45
+ regExp: dsPropsHelpers.PropTypes.arrayOf(dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.string, dsPropsHelpers.PropTypes.instanceOf(RegExp)])).description('Array with regexp or special chars per character').isRequired,
46
+ filledMask: dsPropsHelpers.PropTypes.bool.description('Show blank chars positions').defaultValue(false)
47
+ });
41
48
  const DSMaskPhoneHookPropsTypes = _objectSpread(_objectSpread({}, DSMaskHookPropsTypes), {}, {
42
49
  isInternational: dsPropsHelpers.PropTypes.bool.description('Use or not internaltional phone mask number').defaultValue(false)
43
50
  });
@@ -56,3 +63,5 @@ exports.DSMaskNumberHookDefaultProps = DSMaskNumberHookDefaultProps;
56
63
  exports.DSMaskNumberHookPropsTypes = DSMaskNumberHookPropsTypes;
57
64
  exports.DSMaskPhoneHookDefaultProps = DSMaskPhoneHookDefaultProps;
58
65
  exports.DSMaskPhoneHookPropsTypes = DSMaskPhoneHookPropsTypes;
66
+ exports.DSMaskRegExpHookDefaultProps = DSMaskRegExpHookDefaultProps;
67
+ exports.DSMaskRegExpHookPropsTypes = DSMaskRegExpHookPropsTypes;
@@ -38,10 +38,9 @@ const addSpecialCharacters = (maskWithoutSpecialChars, specialCharsDescr, masked
38
38
  });
39
39
  } else if (lastKeyCode === 'Backspace' && finalMaskedPos) {
40
40
  // If erasing, move the cursor back if we are in a special chars area
41
- specialCharsDescr.forEach(_ref3 => {
42
- let [chars, pos] = _ref3;
43
- if (pos + 1 <= finalMaskedPos && finalMaskedPos <= pos + chars.length) finalMaskedPos = pos;
44
- });
41
+ for (let i = specialCharsDescr.length - 1; i >= 0; i -= 1) {
42
+ if (specialCharsDescr[i][1] + 1 <= finalMaskedPos && finalMaskedPos <= specialCharsDescr[i][1] + specialCharsDescr[i][0].length) [, finalMaskedPos] = specialCharsDescr[i];
43
+ }
45
44
  }
46
45
 
47
46
  return [finalMask.join(''), finalMaskedPos];
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ require('core-js/modules/esnext.async-iterator.reduce.js');
6
+ require('core-js/modules/esnext.iterator.constructor.js');
7
+ require('core-js/modules/esnext.iterator.reduce.js');
8
+ require('core-js/modules/web.dom-collections.iterator.js');
9
+
10
+ const flatStringArray = stringArray => stringArray.reduce((acc, curr) => {
11
+ if (typeof curr === 'string') {
12
+ return [...acc, ...curr.split('')];
13
+ }
14
+
15
+ return [...acc, curr];
16
+ }, []);
17
+
18
+ exports.flatStringArray = flatStringArray;
@@ -6,6 +6,7 @@ var addSpecialCharacters = require('./addSpecialCharacters.js');
6
6
  var getPartialMaskedPos = require('./getPartialMaskedPos.js');
7
7
  var setCursorPosition = require('./setCursorPosition.js');
8
8
  var sharedFilters = require('./sharedFilters.js');
9
+ var flatStringArray = require('./flatStringArray.js');
9
10
 
10
11
 
11
12
 
@@ -13,3 +14,4 @@ exports.addSpecialCharacters = addSpecialCharacters.addSpecialCharacters;
13
14
  exports.getPartialMaskedPos = getPartialMaskedPos.getPartialMaskedPos;
14
15
  exports.setCursorPosition = setCursorPosition.setCursorPosition;
15
16
  exports.filterNumbersOnly = sharedFilters.filterNumbersOnly;
17
+ exports.flatStringArray = flatStringArray.flatStringArray;
@@ -1,11 +1,10 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
2
  import 'react';
3
- import { describe } from 'react-desc';
4
- import { useMemoMergePropsWithDefault, useValidateTypescriptPropTypes } from '@elliemae/ds-props-helpers';
3
+ import { describe, useMemoMergePropsWithDefault, useValidateTypescriptPropTypes } from '@elliemae/ds-props-helpers';
5
4
  import { useAutocomplete } from './config/useAutocomplete.js';
6
5
  import { Container } from './parts/container/Container.js';
7
- import { propTypes } from './propTypes.js';
8
6
  import { defaultProps, AutocompleteContext } from './AutocompleteCTX.js';
7
+ import { propTypes } from './react-desc-prop-types.js';
9
8
 
10
9
  var _Container;
11
10
 
@@ -3,18 +3,10 @@ import { noop } from 'lodash';
3
3
 
4
4
  // eslint-disable-next-line @typescript-eslint/no-empty-function
5
5
  const defaultProps = {
6
- placeholder: '',
7
- options: [],
8
- selectedValues: '',
9
- hasError: false,
10
- isLoading: false,
11
- autoFocus: false,
6
+ zIndex: 10,
7
+ withoutPortal: false,
12
8
  startPlacementPreference: 'bottom-start',
13
- placementOrderPreference: ['bottom-start', 'bottom-end'],
14
- onChange: noop,
15
- onKeyDown: noop,
16
- onFilter: noop,
17
- onMenuOpen: noop
9
+ placementOrderPreference: ['bottom-start', 'bottom-end']
18
10
  };
19
11
  const defaultContext = {
20
12
  props: defaultProps,
@@ -25,9 +17,6 @@ const defaultContext = {
25
17
  setReferenceElement: noop,
26
18
  inputRef: /*#__PURE__*/createRef(),
27
19
  listRef: /*#__PURE__*/createRef(),
28
- wrapperListRef: /*#__PURE__*/createRef(),
29
- controlsWrapperRef: /*#__PURE__*/createRef(),
30
- selectedOptionsRef: /*#__PURE__*/createRef(),
31
20
  focusOptionIdx: '',
32
21
  setCurrentOption: noop
33
22
  };
@@ -1,13 +1,7 @@
1
1
  const AutocompleteDataTestid = {
2
- INPUT: 'autocomplete-input',
3
2
  LIST: 'autocomplete-menu-list',
4
- SELECTED_VALUES: 'autocomplete-selected-values',
5
- SELECT_ALL_BUTTON: 'autocomplete-all-btn',
6
- CLEAR_ALL_BUTTON: 'autocomplete-clear-btn',
7
- DROPDOWN: 'autocomplete-dropdown-btn',
8
3
  OPTION: 'autocomplete-option',
9
- SHOW_ALL_BUTTON: 'autocomplete-show-all-btn',
10
- SHOW_SELECTED_OPTIONS_BUTTON: 'autocomplete-selected-options-btn'
4
+ CONTAINER: 'autocomplete-container'
11
5
  };
12
6
 
13
7
  export { AutocompleteDataTestid };
@@ -1,30 +1,37 @@
1
- import 'core-js/modules/esnext.async-iterator.filter.js';
2
- import 'core-js/modules/esnext.iterator.constructor.js';
3
- import 'core-js/modules/esnext.iterator.filter.js';
4
1
  import 'core-js/modules/esnext.async-iterator.for-each.js';
5
2
  import 'core-js/modules/esnext.iterator.for-each.js';
6
3
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
4
  import 'core-js/modules/web.dom-collections.iterator.js';
8
- import { useState, useRef, useCallback, useMemo } from 'react';
5
+ import 'core-js/modules/esnext.async-iterator.filter.js';
6
+ import 'core-js/modules/esnext.iterator.constructor.js';
7
+ import 'core-js/modules/esnext.iterator.filter.js';
8
+ import { useRef, useState, useCallback, useEffect, useMemo } from 'react';
9
+ import { useMemoMergePropsWithDefault, useValidateTypescriptPropTypes } from '@elliemae/ds-props-helpers';
9
10
  import { useVirtual } from 'react-virtual';
10
- import { useGetAutocompleteWithDefaultsProps } from './useGetPropsWithDefault.js';
11
+ import { propTypes } from '../react-desc-prop-types.js';
12
+ import { defaultProps } from '../AutocompleteCTX.js';
13
+ import { getFirstOption } from '../utils/listHelper.js';
11
14
 
12
15
  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; }
13
16
 
14
17
  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; }
15
18
  const useAutocomplete = props => {
19
+ const defaultPropsWithInnerRef = _objectSpread(_objectSpread({}, defaultProps), {}, {
20
+ innerRef: useRef(null)
21
+ });
22
+
23
+ const propsWithDefault = useMemoMergePropsWithDefault(props, defaultPropsWithInnerRef);
24
+ useValidateTypescriptPropTypes(propsWithDefault, propTypes);
16
25
  const [showPopover, setShowPopover] = useState(false);
17
26
  const [referenceElement, setReferenceElement] = useState(null);
18
27
  const [focusOptionIdx, setCurrentOption] = useState('');
19
28
  const inputRef = useRef(null);
20
29
  const listRef = useRef(null);
21
- const wrapperListRef = useRef(null);
22
30
  const selectedOptionsRef = useRef(null);
23
- const controlsWrapperRef = useRef(null);
24
- const propsWithDefaults = useGetAutocompleteWithDefaultsProps(props);
25
31
  const {
26
- options
27
- } = propsWithDefaults; // ===========================================================================
32
+ options,
33
+ filter
34
+ } = propsWithDefault; // ===========================================================================
28
35
  // Virtualization setup
29
36
  // ===========================================================================
30
37
 
@@ -43,8 +50,16 @@ const useAutocomplete = props => {
43
50
  };
44
51
  virtualListHelpers.scrollToIndex(options.findIndex(opt => opt.dsId === dsId), opts);
45
52
  }, [options, virtualListHelpers]);
53
+ useEffect(() => {
54
+ if (filter.length === 0 || options.length === 0) {
55
+ setShowPopover(false);
56
+ }
57
+ }, [filter, options.length, setShowPopover]);
58
+ useEffect(() => {
59
+ setCurrentOption(getFirstOption(options));
60
+ }, [options, showPopover]);
46
61
  const ctx = useMemo(() => ({
47
- props: _objectSpread({}, propsWithDefaults),
62
+ props: _objectSpread({}, propsWithDefault),
48
63
  virtualListHelpers,
49
64
  showPopover,
50
65
  referenceElement,
@@ -52,13 +67,11 @@ const useAutocomplete = props => {
52
67
  listRef,
53
68
  focusOptionIdx,
54
69
  selectedOptionsRef,
55
- controlsWrapperRef,
56
- wrapperListRef,
57
70
  setCurrentOption,
58
71
  scrollOptionIntoView,
59
72
  setReferenceElement,
60
73
  setShowPopover
61
- }), [scrollOptionIntoView, propsWithDefaults, virtualListHelpers, focusOptionIdx, wrapperListRef, showPopover, referenceElement, inputRef, selectedOptionsRef, controlsWrapperRef, listRef]);
74
+ }), [scrollOptionIntoView, propsWithDefault, virtualListHelpers, focusOptionIdx, showPopover, referenceElement, inputRef, selectedOptionsRef, listRef]);
62
75
  return ctx;
63
76
  };
64
77
 
@@ -1,40 +1,56 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
- import { useContext, useCallback } from 'react';
2
+ import 'core-js/modules/esnext.async-iterator.filter.js';
3
+ import 'core-js/modules/esnext.iterator.constructor.js';
4
+ import 'core-js/modules/esnext.iterator.filter.js';
5
+ import React, { useContext, useEffect, useCallback } from 'react';
3
6
  import { DSPopperJS } from '@elliemae/ds-popperjs';
4
7
  import { AutocompleteContext } from '../../AutocompleteCTX.js';
5
- import { StyledPopperWrapper, StyledContainerInline, StyledContainerWithPopper } from './styled.js';
6
- import { Controls } from '../controls/Controls.js';
8
+ import { StyledContainerWithPopper, StyledPopperWrapper } from './styled.js';
7
9
  import { MenuList } from '../menu-list/MenuList.js';
8
- import { jsxs, Fragment } from 'react/jsx-runtime';
9
-
10
- var _Controls, _MenuList, _MenuList2;
10
+ import { useKeyboardNavigation } from './useKeyboardNavigation.js';
11
+ import { AutocompleteDataTestid } from '../../AutocompleteDataTestids.js';
12
+ import { jsxs } from 'react/jsx-runtime';
11
13
 
14
+ var _StyledPopperWrapper;
12
15
  const Container = () => {
13
16
  const {
14
17
  props: {
15
- inline,
16
18
  startPlacementPreference,
19
+ children,
20
+ filter,
17
21
  placementOrderPreference
18
22
  },
19
23
  showPopover,
20
- inputRef,
21
24
  setReferenceElement,
22
25
  setShowPopover,
23
26
  referenceElement
24
27
  } = useContext(AutocompleteContext);
28
+ useEffect(() => {
29
+ const closePopper = () => {
30
+ setShowPopover(false);
31
+ };
32
+
33
+ window.addEventListener('blur', closePopper);
34
+ return () => {
35
+ window.removeEventListener('blur', closePopper);
36
+ };
37
+ }, [setShowPopover]);
25
38
  const handleCloseMenu = useCallback(() => {
26
39
  setShowPopover(false);
27
- if (inputRef.current) inputRef.current.blur();
28
- }, [inputRef, setShowPopover]);
29
- const handleMouseDown = useCallback(e => {
30
- e.preventDefault();
31
- }, []);
32
- const StyledContainer = inline ? StyledContainerInline : StyledContainerWithPopper;
33
- return /*#__PURE__*/jsxs(Fragment, {
34
- children: [/*#__PURE__*/jsxs(StyledContainer, {
35
- ref: setReferenceElement,
36
- children: [_Controls || (_Controls = /*#__PURE__*/_jsx(Controls, {})), inline ? _MenuList || (_MenuList = /*#__PURE__*/_jsx(MenuList, {})) : null]
37
- }), /*#__PURE__*/_jsx(DSPopperJS, {
40
+ }, [setShowPopover]);
41
+ const input = React.Children.only(children);
42
+ const {
43
+ onInputKeyDown
44
+ } = useKeyboardNavigation();
45
+ return /*#__PURE__*/jsxs(StyledContainerWithPopper, {
46
+ ref: setReferenceElement,
47
+ role: "combobox",
48
+ "aria-autocomplete": "list",
49
+ "aria-controls": "autocomplete-listbox",
50
+ "aria-expanded": showPopover,
51
+ onKeyDown: onInputKeyDown,
52
+ "data-testid": AutocompleteDataTestid.CONTAINER,
53
+ children: [input, filter && /*#__PURE__*/_jsx(DSPopperJS, {
38
54
  customOffset: [0, 5],
39
55
  closeContextMenu: handleCloseMenu,
40
56
  referenceElement: referenceElement,
@@ -45,10 +61,9 @@ const Container = () => {
45
61
  withoutArrow: true,
46
62
  withoutAnimation: true,
47
63
  zIndex: 10
48
- }, void 0, /*#__PURE__*/_jsx(StyledPopperWrapper, {
49
- tabIndex: -1,
50
- onMouseDown: handleMouseDown
51
- }, void 0, _MenuList2 || (_MenuList2 = /*#__PURE__*/_jsx(MenuList, {}))))]
64
+ }, void 0, _StyledPopperWrapper || (_StyledPopperWrapper = /*#__PURE__*/_jsx(StyledPopperWrapper, {
65
+ tabIndex: -1
66
+ }, void 0, /*#__PURE__*/_jsx(MenuList, {}))))]
52
67
  });
53
68
  };
54
69
 
@@ -3,11 +3,8 @@ import styled from 'styled-components';
3
3
  const StyledContainerWithPopper = /*#__PURE__*/styled.div.withConfig({
4
4
  componentId: "sc-xupfk9-0"
5
5
  })(["width:100%;height:28px;position:relative;"]);
6
- const StyledContainerInline = /*#__PURE__*/styled.div.withConfig({
7
- componentId: "sc-xupfk9-1"
8
- })(["width:100%;position:relative;"]);
9
6
  const StyledPopperWrapper = /*#__PURE__*/styled.div.withConfig({
10
- componentId: "sc-xupfk9-2"
7
+ componentId: "sc-xupfk9-1"
11
8
  })(["background:#fff;overflow:auto;position:relative;"]);
12
9
 
13
- export { StyledContainerInline, StyledContainerWithPopper, StyledPopperWrapper };
10
+ export { StyledContainerWithPopper, StyledPopperWrapper };
@@ -10,7 +10,7 @@ const isOptionFocuseable = opt => !['section', 'separator'].includes(opt.type);
10
10
  const useKeyboardNavigation = () => {
11
11
  const {
12
12
  props: {
13
- onValueChange,
13
+ onSelect,
14
14
  options
15
15
  },
16
16
  setShowPopover,
@@ -21,25 +21,18 @@ const useKeyboardNavigation = () => {
21
21
  } = useContext(AutocompleteContext);
22
22
  const currentItemIndex = options.findIndex(opt => opt.dsId === focusOptionIdx);
23
23
  const currentItem = options.find(item => item.type === 'option' && item.dsId === focusOptionIdx);
24
- const selectOption = useCallback(e => {
25
- if (onValueChange) onValueChange(currentItem.label, e);
26
- setShowPopover(false);
27
- }, [currentItem, setShowPopover, onValueChange]);
28
24
  const onInputKeyDown = useCallback(e => {
29
- const targetElement = e.target;
30
-
31
- if (['ArrowDown', 'ArrowUp', 'Enter'].includes(e.key) || e.keyCode >= 48 && e.keyCode <= 90) {
25
+ if ((e.keyCode >= 48 && e.keyCode <= 90 || e.key === 'Backspace') && !showPopover) {
32
26
  setShowPopover(true);
33
- } // =============================================================================
27
+ } else if (e.key === 'Tab') setShowPopover(false); // =============================================================================
34
28
  // ENTER AND SPACE KEY SELECT OPTIONS AND OPEN CLOSE THE POPOVER
35
29
  // =============================================================================
36
30
 
37
31
 
38
- if (e.keyCode === 32 && targetElement.value === '' || e.key === 'Enter') {
39
- if (showPopover) {
40
- e.preventDefault();
41
- selectOption(e);
42
- }
32
+ if (e.key === 'Enter' && showPopover) {
33
+ e.preventDefault();
34
+ onSelect(currentItem === null || currentItem === void 0 ? void 0 : currentItem.label, e);
35
+ setShowPopover(false);
43
36
  } // =============================================================================
44
37
  // ARROWS UP AND DOWN
45
38
  // =============================================================================
@@ -52,8 +45,6 @@ const useKeyboardNavigation = () => {
52
45
  const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable);
53
46
  setCurrentOption(options[nextItemIndex].dsId);
54
47
  scrollOptionIntoView(options[nextItemIndex].dsId);
55
- } else {
56
- setShowPopover(true);
57
48
  }
58
49
  }
59
50
 
@@ -64,13 +55,6 @@ const useKeyboardNavigation = () => {
64
55
  const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable, -1);
65
56
  setCurrentOption(options[nextItemIndex].dsId);
66
57
  scrollOptionIntoView(options[nextItemIndex].dsId);
67
- } else {
68
- setShowPopover(true);
69
- setTimeout(() => {
70
- const nextItemIndex = findInCircularList(options, 0, isOptionFocuseable, -1);
71
- setCurrentOption(options[nextItemIndex].dsId);
72
- scrollOptionIntoView(options[nextItemIndex].dsId);
73
- });
74
58
  }
75
59
  } // =============================================================================
76
60
  // ESCAPE
@@ -80,7 +64,7 @@ const useKeyboardNavigation = () => {
80
64
  if (e.key === 'Escape') {
81
65
  setShowPopover(false);
82
66
  }
83
- }, [scrollOptionIntoView, currentItemIndex, options, showPopover, setCurrentOption, setShowPopover, selectOption]);
67
+ }, [currentItem === null || currentItem === void 0 ? void 0 : currentItem.label, currentItemIndex, onSelect, options, scrollOptionIntoView, setCurrentOption, setShowPopover, showPopover]);
84
68
  return {
85
69
  onInputKeyDown
86
70
  };