@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
@@ -34,12 +34,12 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
34
34
  const useItemRenderer = () => {
35
35
  const {
36
36
  props: {
37
- options,
37
+ filteredOptions,
38
38
  onCreate,
39
39
  onChange,
40
40
  selectedValues,
41
41
  onFilter,
42
- innerRef
42
+ allOptions
43
43
  },
44
44
  setShowPopover,
45
45
  inputValue,
@@ -54,11 +54,11 @@ const useItemRenderer = () => {
54
54
  if (inputValue) {
55
55
  onCreate(inputValue);
56
56
  setInputValue('');
57
- onFilter('');
57
+ onFilter(allOptions, inputValue);
58
58
  }
59
59
  } else if (option.type === constants.MENU_OPTION_TYPES.OPTION) {
60
60
  if (!option.disabled) {
61
- if (onFilter) onFilter('');
61
+ if (onFilter) onFilter(allOptions, inputValue);
62
62
  setInputValue('');
63
63
 
64
64
  if (!multiple) {
@@ -72,7 +72,7 @@ const useItemRenderer = () => {
72
72
 
73
73
  e.stopPropagation();
74
74
  e.preventDefault();
75
- }, [onFilter, selectedValues, onChange, setShowPopover, multiple, innerRef]); // prevent blur from controls input
75
+ }, [onFilter, selectedValues, onChange, setShowPopover, multiple]); // prevent blur from controls input
76
76
 
77
77
  const handleOnMouseDown = React.useCallback(e => {
78
78
  e.preventDefault();
@@ -83,7 +83,7 @@ const useItemRenderer = () => {
83
83
  }
84
84
 
85
85
  return virtualListHelpers.virtualItems.map(vItem => {
86
- const option = options[vItem.index];
86
+ const option = filteredOptions[vItem.index];
87
87
  const generalProps = {
88
88
  wrapperStyles: {
89
89
  position: 'absolute',
@@ -133,7 +133,7 @@ const useItemRenderer = () => {
133
133
  height: "16px",
134
134
  gutter: "xxs",
135
135
  alignItems: "center"
136
- }, void 0, _StyledCreatableLabel || (_StyledCreatableLabel = /*#__PURE__*/_jsx__default["default"](styled.StyledCreatableLabel, {}, void 0, "Add:")), /*#__PURE__*/_jsx__default["default"]("span", {}, void 0, label));
136
+ }, void 0, _StyledCreatableLabel || (_StyledCreatableLabel = /*#__PURE__*/_jsx__default["default"](styled.StyledCreatableLabel, {}, void 0, "Add:")), /*#__PURE__*/_jsx__default["default"]("span", {}, void 0, "\"".concat(label, "\"")));
137
137
  },
138
138
  label: option.label,
139
139
  onClick: e => handleClick(option, e)
@@ -142,7 +142,7 @@ const useItemRenderer = () => {
142
142
 
143
143
  return /*#__PURE__*/jsxRuntime.jsx(jsxRuntime.Fragment, {});
144
144
  });
145
- }, [options, focusOptionIdx, selectedValues, innerRef, virtualListHelpers === null || virtualListHelpers === void 0 ? void 0 : virtualListHelpers.virtualItems]);
145
+ }, [filteredOptions, focusOptionIdx, selectedValues, virtualListHelpers]);
146
146
  };
147
147
 
148
148
  exports.useItemRenderer = useItemRenderer;
@@ -10,7 +10,7 @@ const useMenuListSetFocusOption = () => {
10
10
  const {
11
11
  props: {
12
12
  selectedValues,
13
- options
13
+ filteredOptions
14
14
  },
15
15
  setFocusOptionIdx,
16
16
  hasFocus,
@@ -19,16 +19,16 @@ const useMenuListSetFocusOption = () => {
19
19
  scrollOptionIntoView
20
20
  } = React.useContext(ComboBoxCTX.ComboBoxContext);
21
21
  const getFirstOption = React.useCallback(() => {
22
- for (let i = 0; i < options.length; i += 1) if (!['section', 'separator'].includes(options[i].type) && !options[i].disabled) {
23
- setFocusOptionIdx(options[i].dsId);
22
+ for (let i = 0; i < filteredOptions.length; i += 1) if (!['section', 'separator'].includes(filteredOptions[i].type) && !filteredOptions[i].disabled) {
23
+ setFocusOptionIdx(filteredOptions[i].dsId);
24
24
  break;
25
25
  }
26
- }, [options, setFocusOptionIdx]);
26
+ }, [filteredOptions, setFocusOptionIdx]);
27
27
  React.useEffect(() => {
28
28
  scrollOptionIntoView(focusOptionIdx); // eslint-disable-next-line react-hooks/exhaustive-deps
29
29
  }, [focusOptionIdx]);
30
30
  React.useEffect(() => {
31
- if (options.length === 0) {
31
+ if (filteredOptions.length === 0) {
32
32
  setFocusOptionIdx('');
33
33
  }
34
34
 
@@ -45,7 +45,7 @@ const useMenuListSetFocusOption = () => {
45
45
  }
46
46
 
47
47
  if (hasFocus) getFirstOption();
48
- }, [getFirstOption, inputValue, selectedValues, hasFocus, setFocusOptionIdx, options.length]);
48
+ }, [getFirstOption, inputValue, selectedValues, hasFocus, setFocusOptionIdx, filteredOptions.length]);
49
49
  };
50
50
 
51
51
  exports.useMenuListSetFocusOption = useMenuListSetFocusOption;
@@ -20,7 +20,8 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
20
20
  function noop() {}
21
21
  const ComboboxPropTypes = _objectSpread(_objectSpread({}, dsPropsHelpers.globalAttributesPropTypes), {}, {
22
22
  placeholder: dsPropsHelpers.PropTypes.string.description("input's placeholder value").defaultValue(''),
23
- options: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.array, dsPropsHelpers.PropTypes.object]).isRequired.description('List of options').defaultValue([]),
23
+ allOptions: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.array, dsPropsHelpers.PropTypes.object]).isRequired.description('List of original options').defaultValue([]),
24
+ filteredOptions: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.array, dsPropsHelpers.PropTypes.object]).description('List of filtered options to show in the menu based on the current internal input filter value').defaultValue([]),
24
25
  selectedValues: dsPropsHelpers.PropTypes.oneOfType([dsPropsHelpers.PropTypes.arrayOf(dsPropsHelpers.PropTypes.object), dsPropsHelpers.PropTypes.object]).isRequired.description('Array of option or single option selected'),
25
26
  disabled: dsPropsHelpers.PropTypes.bool.description('wheter or not the input is disabled').defaultValue('false'),
26
27
  autoFocus: dsPropsHelpers.PropTypes.bool.description('Whether the combo box uses auto focus or not').defaultValue('false'),
@@ -10,6 +10,8 @@ require('core-js/modules/esnext.iterator.some.js');
10
10
  require('core-js/modules/esnext.async-iterator.find.js');
11
11
  require('core-js/modules/esnext.iterator.find.js');
12
12
  require('core-js/modules/web.dom-collections.iterator.js');
13
+ require('core-js/modules/esnext.async-iterator.for-each.js');
14
+ require('core-js/modules/esnext.iterator.for-each.js');
13
15
  var constants = require('../constants.js');
14
16
 
15
17
  const getSelectableOptions = options => options.filter(option => option.type === constants.MENU_OPTION_TYPES.OPTION && !option.disabled);
@@ -34,15 +36,17 @@ const findInCircularList = function (list, from, criteria) {
34
36
 
35
37
  return from; // return same item
36
38
  };
39
+ const getLastValueSelected = selectedValues => {
40
+ if (Array.isArray(selectedValues)) {
41
+ return selectedValues[selectedValues.length - 1];
42
+ }
43
+
44
+ return selectedValues;
45
+ };
37
46
  const getFirstOption = (options, selectedValues, inputValue) => {
38
47
  if (!inputValue) {
39
- if (Array.isArray(selectedValues) && selectedValues.length > 0) {
40
- return selectedValues[selectedValues.length - 1].dsId;
41
- }
42
-
43
- if (selectedValues !== null && selectedValues !== void 0 && selectedValues.dsId) {
44
- return selectedValues.dsId;
45
- }
48
+ const lastValue = getLastValueSelected(selectedValues);
49
+ if (lastValue) return lastValue.dsId;
46
50
  }
47
51
 
48
52
  for (let i = 0; i < options.length; i += 1) if (!['section', 'separator'].includes(options[i].type) && !options[i].disabled) {
@@ -68,15 +72,39 @@ const getSuggestedValueOnChange = (selectedOption, selectedValues) => {
68
72
 
69
73
  return selectedOption;
70
74
  };
71
- const getLastValueSelected = selectedValues => {
72
- if (Array.isArray(selectedValues)) {
73
- return selectedValues[selectedValues.length - 1];
75
+ const filterOptions = (inputValue, options) => options.filter(option => option.type === constants.MENU_OPTION_TYPES.OPTION && option.label.toLowerCase().includes(inputValue.toLowerCase()));
76
+ const selectedValuesWithSections = (optionsToParse, multiSelectedValue) => {
77
+ var _items2;
78
+
79
+ const items = [];
80
+ if (optionsToParse) optionsToParse.forEach(option => {
81
+ // const isSelectedValue = multiSelectedValue.find((item) => item?.dsId === option.dsId);
82
+ if (option.type === constants.MENU_OPTION_TYPES.OPTION && isSelected(multiSelectedValue, option)) {
83
+ items.push(option);
84
+ }
85
+
86
+ if (option.type === constants.MENU_OPTION_TYPES.SECTION) {
87
+ var _items;
88
+
89
+ if (((_items = items[items.length - 1]) === null || _items === void 0 ? void 0 : _items.type) === constants.MENU_OPTION_TYPES.SECTION) {
90
+ items[items.length - 1] = option;
91
+ } else {
92
+ items.push(option);
93
+ }
94
+ }
95
+ });
96
+
97
+ if (((_items2 = items[items.length - 1]) === null || _items2 === void 0 ? void 0 : _items2.type) === constants.MENU_OPTION_TYPES.SECTION) {
98
+ items.pop();
74
99
  }
75
100
 
76
- return selectedValues;
101
+ return items;
77
102
  };
103
+ const getFilteredOptionsSelected = (filteredOption, selectedValues) => filteredOption.filter(option => option.type === constants.MENU_OPTION_TYPES.OPTION && isSelected(selectedValues, option));
78
104
 
105
+ exports.filterOptions = filterOptions;
79
106
  exports.findInCircularList = findInCircularList;
107
+ exports.getFilteredOptionsSelected = getFilteredOptionsSelected;
80
108
  exports.getFirstOption = getFirstOption;
81
109
  exports.getLastValueSelected = getLastValueSelected;
82
110
  exports.getOptions = getOptions;
@@ -85,3 +113,4 @@ exports.getSuggestedValueOnChange = getSuggestedValueOnChange;
85
113
  exports.isSelected = isSelected;
86
114
  exports.isSelectedValueEmpty = isSelectedValueEmpty;
87
115
  exports.isSelectedValueMultiple = isSelectedValueMultiple;
116
+ exports.selectedValuesWithSections = selectedValuesWithSections;
package/cjs/index.js CHANGED
@@ -18,7 +18,7 @@ var timeHelpers = require('./date-time-picker/utils/timeHelpers.js');
18
18
  var usePhoneMask = require('./mask-hook/hooks/usePhoneMask.js');
19
19
  var useNumberMask = require('./mask-hook/hooks/useNumberMask.js');
20
20
  var useSSNMask = require('./mask-hook/hooks/useSSNMask.js');
21
- var useZipCode = require('./mask-hook/hooks/useZipCode.js');
21
+ var useZipCodeMask = require('./mask-hook/hooks/useZipCodeMask.js');
22
22
  var DSInputText = require('./text-input/DSInputText.js');
23
23
  var dataTestIds = require('./text-input/exported-related/data-test-ids.js');
24
24
  var theming = require('./text-input/exported-related/theming.js');
@@ -34,6 +34,7 @@ exports.DSAutocompleteWithSchema = Autocomplete.DSAutocompleteWithSchema;
34
34
  exports.DSControlledCheckbox = ControlledCheckbox.DSControlledCheckbox;
35
35
  exports.DSControlledCheckboxWithSchema = ControlledCheckbox.DSControlledCheckboxWithSchema;
36
36
  exports.DSComboBox = ComboBox.DSComboBox;
37
+ exports.DSComboBoxV3 = ComboBox.DSComboBox;
37
38
  exports.DSComboBoxWithSchema = ComboBox.DSComboBoxWithSchema;
38
39
  exports.DSControlledDateRangePicker = ControlledDateRangePicker.DSControlledDateRangePicker;
39
40
  exports.DSControlledDateRangePickerWithSchema = ControlledDateRangePicker.DSControlledDateRangePickerWithSchema;
@@ -52,13 +53,17 @@ exports.getDayFromDateString = dateHelpers.getDayFromDateString;
52
53
  exports.getValidationDateStringMetaInfo = dateHelpers.getValidationDateStringMetaInfo;
53
54
  exports.getValidationTimeStringMetaInfo = timeHelpers.getValidationTimeStringMetaInfo;
54
55
  exports.UsePhoneMaskWithSchema = usePhoneMask.UsePhoneMaskWithSchema;
56
+ exports.getPhoneMaskedValue = usePhoneMask.getPhoneMaskedValue;
55
57
  exports.usePhoneMask = usePhoneMask.usePhoneMask;
56
58
  exports.UseNumberMaskWithSchema = useNumberMask.UseNumberMaskWithSchema;
59
+ exports.getNumberMaskedValue = useNumberMask.getNumberMaskedValue;
57
60
  exports.useNumberMask = useNumberMask.useNumberMask;
58
61
  exports.UseSSNMaskWithSchema = useSSNMask.UseSSNMaskWithSchema;
62
+ exports.getSSNMaskedValue = useSSNMask.getSSNMaskedValue;
59
63
  exports.useSSNMask = useSSNMask.useSSNMask;
60
- exports.UseZipCodeMaskWithSchema = useZipCode.UseZipCodeMaskWithSchema;
61
- exports.useZipCode = useZipCode.useZipCode;
64
+ exports.UseZipCodeMaskWithSchema = useZipCodeMask.UseZipCodeMaskWithSchema;
65
+ exports.getUseZipMaskedValue = useZipCodeMask.getUseZipMaskedValue;
66
+ exports.useZipCodeMask = useZipCodeMask.useZipCodeMask;
62
67
  exports.DSInputText = DSInputText.DSInputText;
63
68
  exports.DSInputTextWithSchema = DSInputText.DSInputTextWithSchema;
64
69
  exports.DSInputTextDataTestIds = dataTestIds.DSInputTextDataTestIds;
@@ -5,15 +5,19 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var usePhoneMask = require('./usePhoneMask.js');
6
6
  var useNumberMask = require('./useNumberMask.js');
7
7
  var useSSNMask = require('./useSSNMask.js');
8
- var useZipCode = require('./useZipCode.js');
8
+ var useZipCodeMask = require('./useZipCodeMask.js');
9
9
 
10
10
 
11
11
 
12
12
  exports.UsePhoneMaskWithSchema = usePhoneMask.UsePhoneMaskWithSchema;
13
+ exports.getPhoneMaskedValue = usePhoneMask.getPhoneMaskedValue;
13
14
  exports.usePhoneMask = usePhoneMask.usePhoneMask;
14
15
  exports.UseNumberMaskWithSchema = useNumberMask.UseNumberMaskWithSchema;
16
+ exports.getNumberMaskedValue = useNumberMask.getNumberMaskedValue;
15
17
  exports.useNumberMask = useNumberMask.useNumberMask;
16
18
  exports.UseSSNMaskWithSchema = useSSNMask.UseSSNMaskWithSchema;
19
+ exports.getSSNMaskedValue = useSSNMask.getSSNMaskedValue;
17
20
  exports.useSSNMask = useSSNMask.useSSNMask;
18
- exports.UseZipCodeMaskWithSchema = useZipCode.UseZipCodeMaskWithSchema;
19
- exports.useZipCode = useZipCode.useZipCode;
21
+ exports.UseZipCodeMaskWithSchema = useZipCodeMask.UseZipCodeMaskWithSchema;
22
+ exports.getUseZipMaskedValue = useZipCodeMask.getUseZipMaskedValue;
23
+ exports.useZipCodeMask = useZipCodeMask.useZipCodeMask;
@@ -164,8 +164,13 @@ const useNumberMask = props => {
164
164
  onBlur
165
165
  };
166
166
  };
167
+ const getNumberMaskedValue = (value, opts) => {
168
+ const [maskedValue] = conformValue(value, value.length - 1, '', opts);
169
+ return maskedValue;
170
+ };
167
171
  const UseNumberMaskWithSchema = dsPropsHelpers.describe(useNumberMask);
168
172
  UseNumberMaskWithSchema.propTypes = reactDescPropTypes.DSMaskNumberHookPropsTypes;
169
173
 
170
174
  exports.UseNumberMaskWithSchema = UseNumberMaskWithSchema;
175
+ exports.getNumberMaskedValue = getNumberMaskedValue;
171
176
  exports.useNumberMask = useNumberMask;
@@ -86,8 +86,13 @@ const usePhoneMask = props => {
86
86
  onChange
87
87
  };
88
88
  };
89
+ const getPhoneMaskedValue = (value, opts) => {
90
+ const [maskedValue] = conformValue(value, value.length - 1, '', opts);
91
+ return maskedValue;
92
+ };
89
93
  const UsePhoneMaskWithSchema = dsPropsHelpers.describe(usePhoneMask);
90
94
  UsePhoneMaskWithSchema.propTypes = reactDescPropTypes.DSMaskPhoneHookPropsTypes;
91
95
 
92
96
  exports.UsePhoneMaskWithSchema = UsePhoneMaskWithSchema;
97
+ exports.getPhoneMaskedValue = getPhoneMaskedValue;
93
98
  exports.usePhoneMask = usePhoneMask;
@@ -65,8 +65,13 @@ const useSSNMask = props => {
65
65
  onChange
66
66
  };
67
67
  };
68
+ const getSSNMaskedValue = value => {
69
+ const [maskedValue] = conformValue(value, value.length - 1, '');
70
+ return maskedValue;
71
+ };
68
72
  const UseSSNMaskWithSchema = dsPropsHelpers.describe(useSSNMask);
69
73
  UseSSNMaskWithSchema.propTypes = reactDescPropTypes.DSMaskHookPropsTypes;
70
74
 
71
75
  exports.UseSSNMaskWithSchema = UseSSNMaskWithSchema;
76
+ exports.getSSNMaskedValue = getSSNMaskedValue;
72
77
  exports.useSSNMask = useSSNMask;
@@ -18,14 +18,14 @@ const zipCodeSpecialChars = [['-', 5]];
18
18
 
19
19
  const conformValue = (rawValue, cursorPos, lastKeyCode) => {
20
20
  // Work with digits only
21
- let maskedValue = rawValue.split('').filter(char => char >= '0' && char <= '9'); // We only consider first 5 digits
21
+ let maskedValue = rawValue.split('').filter(char => char >= '0' && char <= '9'); // We only consider first 9 digits
22
22
 
23
- maskedValue = maskedValue.slice(0, 6);
23
+ maskedValue = maskedValue.slice(0, 9);
24
24
  const maskedPos = getPartialMaskedPos.getPartialMaskedPos(rawValue, maskedValue, cursorPos);
25
25
  return addSpecialCharacters.addSpecialCharacters(maskedValue, zipCodeSpecialChars, maskedPos, lastKeyCode);
26
26
  };
27
27
 
28
- const useZipCode = props => {
28
+ const useZipCodeMask = props => {
29
29
  const propsWithDefault = dsPropsHelpers.useMemoMergePropsWithDefault(props, reactDescPropTypes.DSMaskHookDefaultProps);
30
30
  dsPropsHelpers.useValidateTypescriptPropTypes(propsWithDefault, reactDescPropTypes.DSMaskHookPropsTypes);
31
31
  const {
@@ -62,8 +62,13 @@ const useZipCode = props => {
62
62
  onChange
63
63
  };
64
64
  };
65
- const UseZipCodeMaskWithSchema = dsPropsHelpers.describe(useZipCode);
65
+ const getUseZipMaskedValue = value => {
66
+ const [maskedValue] = conformValue(value, value.length - 1, '');
67
+ return maskedValue;
68
+ };
69
+ const UseZipCodeMaskWithSchema = dsPropsHelpers.describe(useZipCodeMask);
66
70
  UseZipCodeMaskWithSchema.propTypes = reactDescPropTypes.DSMaskHookPropsTypes;
67
71
 
68
72
  exports.UseZipCodeMaskWithSchema = UseZipCodeMaskWithSchema;
69
- exports.useZipCode = useZipCode;
73
+ exports.getUseZipMaskedValue = getUseZipMaskedValue;
74
+ exports.useZipCodeMask = useZipCodeMask;
@@ -5,15 +5,19 @@ 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 useZipCodeMask = require('./hooks/useZipCodeMask.js');
9
9
 
10
10
 
11
11
 
12
12
  exports.UsePhoneMaskWithSchema = usePhoneMask.UsePhoneMaskWithSchema;
13
+ exports.getPhoneMaskedValue = usePhoneMask.getPhoneMaskedValue;
13
14
  exports.usePhoneMask = usePhoneMask.usePhoneMask;
14
15
  exports.UseNumberMaskWithSchema = useNumberMask.UseNumberMaskWithSchema;
16
+ exports.getNumberMaskedValue = useNumberMask.getNumberMaskedValue;
15
17
  exports.useNumberMask = useNumberMask.useNumberMask;
16
18
  exports.UseSSNMaskWithSchema = useSSNMask.UseSSNMaskWithSchema;
19
+ exports.getSSNMaskedValue = useSSNMask.getSSNMaskedValue;
17
20
  exports.useSSNMask = useSSNMask.useSSNMask;
18
- exports.UseZipCodeMaskWithSchema = useZipCode.UseZipCodeMaskWithSchema;
19
- exports.useZipCode = useZipCode.useZipCode;
21
+ exports.UseZipCodeMaskWithSchema = useZipCodeMask.UseZipCodeMaskWithSchema;
22
+ exports.getUseZipMaskedValue = useZipCodeMask.getUseZipMaskedValue;
23
+ exports.useZipCodeMask = useZipCodeMask.useZipCodeMask;
@@ -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 };