@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
@@ -13,6 +13,7 @@ const isOptionFocuseable = opt => !['section', 'separator'].includes(opt.type) &
13
13
  const useKeyboardNavigation = () => {
14
14
  const {
15
15
  props: {
16
+ allOptions,
16
17
  onCancel,
17
18
  onKeyDown,
18
19
  onChange,
@@ -20,7 +21,7 @@ const useKeyboardNavigation = () => {
20
21
  onFilter,
21
22
  onSelectAll,
22
23
  inline,
23
- options,
24
+ filteredOptions,
24
25
  selectedValues,
25
26
  withoutPortal
26
27
  },
@@ -35,9 +36,9 @@ const useKeyboardNavigation = () => {
35
36
  setFocusOptionIdx
36
37
  } = useContext(ComboBoxContext);
37
38
  const multiple = Array.isArray(selectedValues);
38
- const selectableOptions = getOptions(options);
39
- const currentItemIndex = options.findIndex(opt => opt.dsId === focusOptionIdx);
40
- const currentItem = options.find(item => item.dsId === focusOptionIdx);
39
+ const selectableOptions = getOptions(filteredOptions);
40
+ const currentItemIndex = filteredOptions.findIndex(opt => opt.dsId === focusOptionIdx);
41
+ const currentItem = filteredOptions.find(item => item.dsId === focusOptionIdx);
41
42
  const onInputKeyDown = useCallback(e => {
42
43
  // =============================================================================
43
44
  // CUSTOM KEYS
@@ -55,7 +56,7 @@ const useKeyboardNavigation = () => {
55
56
  if (onCancel) onCancel();
56
57
 
57
58
  if (inputValue) {
58
- if (onFilter) onFilter('');
59
+ if (onFilter) onFilter(allOptions, inputValue);
59
60
  setInputValue('');
60
61
  }
61
62
 
@@ -66,8 +67,10 @@ const useKeyboardNavigation = () => {
66
67
 
67
68
 
68
69
  if (e.key === 'Enter' && (currentItem === null || currentItem === void 0 ? void 0 : currentItem.type) === INTERNAL_MENU_OPTION_TYPES.CREATABLE && onCreate) {
69
- onCreate(inputValue);
70
- if (onFilter) onFilter('');
70
+ onCreate(inputValue); //blank active item to force search last one
71
+
72
+ setFocusOptionIdx('');
73
+ if (onFilter) onFilter(allOptions, '');
71
74
  setInputValue('');
72
75
  return;
73
76
  } // =============================================================================
@@ -80,10 +83,10 @@ const useKeyboardNavigation = () => {
80
83
  e.stopPropagation();
81
84
 
82
85
  if (focusOptionIdx !== '' && (showPopover || inline) && (currentItem === null || currentItem === void 0 ? void 0 : currentItem.type) === MENU_OPTION_TYPES.OPTION && !currentItem.disabled) {
83
- if (onFilter) onFilter('');
86
+ if (onFilter) onFilter(allOptions, '');
84
87
  setInputValue('');
85
88
 
86
- if (!multiple && !inline) {
89
+ if (!multiple) {
87
90
  setShowPopover(false);
88
91
  }
89
92
 
@@ -96,7 +99,7 @@ const useKeyboardNavigation = () => {
96
99
  }
97
100
 
98
101
  if (e.key === 'a' && e.ctrlKey && multiple && onSelectAll) {
99
- onSelectAll(options.filter(option => option.type === 'option' && !option.disabled), e);
102
+ onSelectAll(filteredOptions.filter(option => option.type === 'option' && !option.disabled), e);
100
103
  } // =============================================================================
101
104
  // ARROWS UP AND DOWN: LOGIC TO CALCULATE NEXT OR PREV ITEM TO PSEUDOFOCUS FROM INPUT
102
105
  // =============================================================================
@@ -107,9 +110,9 @@ const useKeyboardNavigation = () => {
107
110
  e.stopPropagation();
108
111
 
109
112
  if ((showPopover || inline) && selectableOptions.length) {
110
- const nextItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable);
111
- setFocusOptionIdx(options[nextItemIndex].dsId);
112
- scrollOptionIntoView(options[nextItemIndex].dsId);
113
+ const nextItemIndex = findInCircularList(filteredOptions, currentItemIndex, isOptionFocuseable);
114
+ setFocusOptionIdx(filteredOptions[nextItemIndex].dsId);
115
+ scrollOptionIntoView(filteredOptions[nextItemIndex].dsId);
113
116
  }
114
117
  }
115
118
 
@@ -117,17 +120,17 @@ const useKeyboardNavigation = () => {
117
120
  e.preventDefault();
118
121
  e.stopPropagation();
119
122
  if (!selectableOptions.length) return;
120
- const prevItemIndex = findInCircularList(options, currentItemIndex, isOptionFocuseable, -1);
123
+ const prevItemIndex = findInCircularList(filteredOptions, currentItemIndex, isOptionFocuseable, -1);
121
124
 
122
125
  if (showPopover || inline) {
123
- setFocusOptionIdx(options[prevItemIndex].dsId);
124
- scrollOptionIntoView(options[prevItemIndex].dsId);
126
+ setFocusOptionIdx(filteredOptions[prevItemIndex].dsId);
127
+ scrollOptionIntoView(filteredOptions[prevItemIndex].dsId);
125
128
  } else {
126
129
  setShowPopover(true);
127
130
  setTimeout(() => {
128
- const prevItem = findInCircularList(options, 0, isOptionFocuseable, -1);
129
- setFocusOptionIdx(options[prevItem].dsId);
130
- scrollOptionIntoView(options[prevItem].dsId);
131
+ const prevItem = findInCircularList(filteredOptions, 0, isOptionFocuseable, -1);
132
+ setFocusOptionIdx(filteredOptions[prevItem].dsId);
133
+ scrollOptionIntoView(filteredOptions[prevItem].dsId);
131
134
  });
132
135
  }
133
136
  } // =============================================================================
@@ -135,14 +138,14 @@ const useKeyboardNavigation = () => {
135
138
  // =============================================================================
136
139
 
137
140
 
138
- if (e.key === 'Backspace' && inputValue.length <= 0 && !inline) {
141
+ if (e.key === 'Backspace' && e.currentTarget.value.length <= 0 && !inline) {
139
142
  const lastValue = getLastValueSelected(selectedValues);
140
143
 
141
- if (!inputValue && lastValue) {
144
+ if (!e.currentTarget.value && lastValue) {
142
145
  onChange(getSuggestedValueOnChange(lastValue, selectedValues), lastValue, e);
143
146
  }
144
147
 
145
- if (onFilter) onFilter('');
148
+ if (onFilter) onFilter(allOptions, inputValue);
146
149
  }
147
150
 
148
151
  if (e.key === 'Tab' && !inline && !withoutPortal) {
@@ -154,12 +157,13 @@ const useKeyboardNavigation = () => {
154
157
  e.preventDefault();
155
158
  element.focus();
156
159
  }
157
- } // waiting for validation from ux
158
- // if (e.key === 'Tab' && multiple) {
159
- // }
160
+ }
160
161
 
162
+ if (e.key === 'Tab' && !multiple && showPopover) {
163
+ setShowPopover(false);
164
+ }
161
165
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
162
- [onKeyDown, currentItem, onCreate, multiple, inputValue, inline, withoutPortal, setShowPopover, onCancel, onFilter, setInputValue, focusOptionIdx, showPopover, selectableOptions.length, options, currentItemIndex, setFocusOptionIdx, selectedValues, onChange, selectAllCheckboxRef, toggleSelectionButtonRef]);
166
+ [onKeyDown, currentItem, onCreate, multiple, inputValue, inline, withoutPortal, setShowPopover, onCancel, onFilter, setInputValue, focusOptionIdx, showPopover, selectableOptions.length, filteredOptions, currentItemIndex, setFocusOptionIdx, selectedValues, onChange, selectAllCheckboxRef, toggleSelectionButtonRef]);
163
167
  return {
164
168
  onInputKeyDown
165
169
  };
@@ -1,11 +1,13 @@
1
1
  import { useContext, useCallback } from 'react';
2
2
  import { ComboBoxContext } from '../../ComboBoxCTX.js';
3
+ import { filterOptions } from '../../utils/listHelper.js';
3
4
 
4
5
  const useMaskedOnChange = () => {
5
6
  const {
6
7
  props: {
7
8
  useMask,
8
- onFilter
9
+ onFilter,
10
+ allOptions
9
11
  },
10
12
  setShowPopover,
11
13
  setInputValue,
@@ -17,16 +19,16 @@ const useMaskedOnChange = () => {
17
19
  setShowPopover(true);
18
20
 
19
21
  if (onFilter) {
20
- onFilter(e.currentTarget.value);
22
+ onFilter(filterOptions(e.currentTarget.value, allOptions), e.currentTarget.value);
21
23
  setInputValue(e.currentTarget.value);
22
24
  }
23
- }, [onFilter, setInputValue, setShowPopover, setShowSelectedOptions]); // onchange used when mask is provided
25
+ }, [allOptions, onFilter, setInputValue, setShowPopover, setShowSelectedOptions]); // onchange used when mask is provided
24
26
 
25
27
  const handleOnChangeMask = useCallback((_, mask) => {
26
28
  setShowSelectedOptions(false);
27
29
  setShowPopover(true);
28
- if (mask && onFilter) onFilter(mask);
29
- }, [onFilter, setShowPopover, setShowSelectedOptions]);
30
+ if (mask && onFilter) onFilter(filterOptions(mask, allOptions), mask);else if (!mask && onFilter) onFilter(allOptions, '');
31
+ }, [allOptions, onFilter, setShowPopover, setShowSelectedOptions]);
30
32
  const onChangeMask = useMask({
31
33
  valueSetter: setInputValue,
32
34
  onChange: handleOnChangeMask
@@ -1,6 +1,6 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
2
  import { useContext } from 'react';
3
- import ChevronSmallDown from '@elliemae/ds-icons/ChevronSmallDown';
3
+ import { ChevronSmallDown } from '@elliemae/ds-icons';
4
4
  import { ComboBoxContext } from '../../ComboBoxCTX.js';
5
5
  import { StyledDropDownButton } from './styled.js';
6
6
  import { ComboboxDataTestid } from '../../ComboboxDataTestids.js';
@@ -27,4 +27,4 @@ const DropdownIndicator = () => {
27
27
  }, void 0, _ChevronSmallDown || (_ChevronSmallDown = /*#__PURE__*/_jsx(ChevronSmallDown, {})));
28
28
  };
29
29
 
30
- export { DropdownIndicator as default };
30
+ export { DropdownIndicator, DropdownIndicator as default };
@@ -10,7 +10,7 @@ const useHeaderListHandlers = () => {
10
10
  const {
11
11
  props: {
12
12
  selectedValues,
13
- options,
13
+ filteredOptions,
14
14
  onSelectAll,
15
15
  innerRef
16
16
  },
@@ -19,7 +19,7 @@ const useHeaderListHandlers = () => {
19
19
  setShowPopover
20
20
  } = useContext(ComboBoxContext);
21
21
  const multiSelectedValues = selectedValues;
22
- const selectableOptions = getSelectableOptions(options);
22
+ const selectableOptions = getSelectableOptions(filteredOptions);
23
23
  const getCheckboxStatus = useMemo(() => {
24
24
  if (multiSelectedValues.length === selectableOptions.length) {
25
25
  return true;
@@ -40,13 +40,13 @@ const useHeaderListHandlers = () => {
40
40
  }, []);
41
41
  const handleSelectAllCheckboxChange = useCallback(e => {
42
42
  if ((!checkboxStatus || checkboxStatus === 'mixed') && onSelectAll) {
43
- onSelectAll(options.filter(option => option.type === 'option' && !option.disabled), e);
43
+ onSelectAll(filteredOptions.filter(option => option.type === 'option' && !option.disabled), e);
44
44
  setCheckboxStatus(true);
45
45
  } else if (onSelectAll) {
46
46
  onSelectAll([], e);
47
47
  setCheckboxStatus(false);
48
48
  }
49
- }, [checkboxStatus, onSelectAll, options]);
49
+ }, [checkboxStatus, onSelectAll, filteredOptions]);
50
50
  const handleToggleSelectedValuesFilter = useCallback(e => {
51
51
  e.preventDefault();
52
52
  setShowSelectedOptions(!showSelectedOptions);
@@ -1,5 +1,6 @@
1
1
  import _jsx from '@babel/runtime/helpers/esm/jsx';
2
2
  import { useContext, useCallback, useMemo } from 'react';
3
+ import { useOnElementResize } from '@elliemae/ds-utilities';
3
4
  import { StyledListWrapper, StyledVirtualListWrapper, StyledList, StyledNoResultsWrapper } from './styled.js';
4
5
  import { ComboboxDataTestid } from '../../ComboboxDataTestids.js';
5
6
  import { ComboBoxContext } from '../../ComboBoxCTX.js';
@@ -15,18 +16,22 @@ const MenuList = () => {
15
16
  menuMaxHeight,
16
17
  onCreate,
17
18
  inline,
18
- options,
19
+ filteredOptions,
19
20
  selectedValues
20
21
  },
21
- referenceElement,
22
+ controlsWrapperRef,
22
23
  listRef,
23
24
  inputValue,
24
25
  wrapperListRef,
25
26
  virtualListHelpers
26
27
  } = useContext(ComboBoxContext);
27
- const multiple = Array.isArray(selectedValues);
28
- const withHeader = !inline && multiple && options.length > 0 && inputValue === '';
28
+ const multiple = Array.isArray(selectedValues); // removing the header list if we are filtering or is inline cb or we have no options to show
29
+
30
+ const withHeader = !inline && multiple && filteredOptions.length > 0 && !inputValue;
29
31
  const ItemRenderer = useItemRenderer();
32
+ const {
33
+ width
34
+ } = useOnElementResize(controlsWrapperRef);
30
35
  const preventLoseInputFocus = useCallback(e => {
31
36
  e.preventDefault();
32
37
  }, []);
@@ -34,8 +39,9 @@ const MenuList = () => {
34
39
  ref: wrapperListRef,
35
40
  inline: inline,
36
41
  onMouseDown: preventLoseInputFocus,
37
- minWidth: menuMinWidth || "".concat((referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth) || '100%'),
38
- children: [withHeader && (_HeaderList || (_HeaderList = /*#__PURE__*/_jsx(HeaderList, {}))), options.length > 0 || onCreate ? /*#__PURE__*/jsx(StyledVirtualListWrapper, {
42
+ width: width,
43
+ minWidth: menuMinWidth,
44
+ children: [withHeader && (_HeaderList || (_HeaderList = /*#__PURE__*/_jsx(HeaderList, {}))), filteredOptions.length > 0 || onCreate ? /*#__PURE__*/jsx(StyledVirtualListWrapper, {
39
45
  inline: inline,
40
46
  maxHeight: menuMaxHeight,
41
47
  ref: listRef,
@@ -52,7 +58,7 @@ const MenuList = () => {
52
58
  }) : _StyledNoResultsWrapp || (_StyledNoResultsWrapp = /*#__PURE__*/_jsx(StyledNoResultsWrapper, {
53
59
  "aria-live": "polite"
54
60
  }, void 0, "No matches found"))]
55
- }), [wrapperListRef, inline, menuMinWidth, referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth, withHeader, options.length, menuMaxHeight, listRef, virtualListHelpers === null || virtualListHelpers === void 0 ? void 0 : virtualListHelpers.totalSize, ItemRenderer, onCreate, preventLoseInputFocus]);
61
+ }), [wrapperListRef, inline, preventLoseInputFocus, width, menuMinWidth, withHeader, filteredOptions.length, onCreate, menuMaxHeight, listRef, virtualListHelpers === null || virtualListHelpers === void 0 ? void 0 : virtualListHelpers.totalSize, ItemRenderer]);
56
62
  };
57
63
 
58
64
  export { MenuList };
@@ -2,17 +2,28 @@ import _taggedTemplateLiteral from '@babel/runtime/helpers/esm/taggedTemplateLit
2
2
  import { styled } from '@elliemae/ds-system';
3
3
 
4
4
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
5
- const StyledListWrapper = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n min-width: ", ";\n background-color: #ffffff;\n"])), props => props.inline ? '100%' : "".concat(props.minWidth, "px"));
5
+ const StyledListWrapper = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n min-width: ", ";\n width: ", ";\n background-color: #ffffff;\n"])), _ref => {
6
+ let {
7
+ inline,
8
+ minWidth
9
+ } = _ref;
10
+ return inline ? '100%' : "".concat(minWidth, "px");
11
+ }, _ref2 => {
12
+ let {
13
+ width
14
+ } = _ref2;
15
+ return "".concat(width, "px");
16
+ });
6
17
  const StyledList = styled.ul(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: relative;\n padding: 0;\n"])));
7
- const StyledVirtualListWrapper = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n overflow-y: auto;\n margin-top: ", ";\n\n max-height: ", ";\n"])), _ref => {
18
+ const StyledVirtualListWrapper = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n overflow-y: auto;\n margin-top: ", ";\n\n max-height: ", ";\n"])), _ref3 => {
8
19
  let {
9
20
  withHeader
10
- } = _ref;
21
+ } = _ref3;
11
22
  return withHeader ? '28px' : '';
12
- }, _ref2 => {
23
+ }, _ref4 => {
13
24
  let {
14
25
  maxHeight
15
- } = _ref2;
26
+ } = _ref4;
16
27
  return !maxHeight ? '400px' : "".concat(maxHeight, "px");
17
28
  });
18
29
  const StyledCreatableLabel = styled.span(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n font-weight: bold;\n font-style: italic;\n"])));
@@ -25,12 +25,12 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
25
25
  const useItemRenderer = () => {
26
26
  const {
27
27
  props: {
28
- options,
28
+ filteredOptions,
29
29
  onCreate,
30
30
  onChange,
31
31
  selectedValues,
32
32
  onFilter,
33
- innerRef
33
+ allOptions
34
34
  },
35
35
  setShowPopover,
36
36
  inputValue,
@@ -45,11 +45,11 @@ const useItemRenderer = () => {
45
45
  if (inputValue) {
46
46
  onCreate(inputValue);
47
47
  setInputValue('');
48
- onFilter('');
48
+ onFilter(allOptions, inputValue);
49
49
  }
50
50
  } else if (option.type === MENU_OPTION_TYPES.OPTION) {
51
51
  if (!option.disabled) {
52
- if (onFilter) onFilter('');
52
+ if (onFilter) onFilter(allOptions, inputValue);
53
53
  setInputValue('');
54
54
 
55
55
  if (!multiple) {
@@ -63,7 +63,7 @@ const useItemRenderer = () => {
63
63
 
64
64
  e.stopPropagation();
65
65
  e.preventDefault();
66
- }, [onFilter, selectedValues, onChange, setShowPopover, multiple, innerRef]); // prevent blur from controls input
66
+ }, [onFilter, selectedValues, onChange, setShowPopover, multiple]); // prevent blur from controls input
67
67
 
68
68
  const handleOnMouseDown = useCallback(e => {
69
69
  e.preventDefault();
@@ -74,7 +74,7 @@ const useItemRenderer = () => {
74
74
  }
75
75
 
76
76
  return virtualListHelpers.virtualItems.map(vItem => {
77
- const option = options[vItem.index];
77
+ const option = filteredOptions[vItem.index];
78
78
  const generalProps = {
79
79
  wrapperStyles: {
80
80
  position: 'absolute',
@@ -124,7 +124,7 @@ const useItemRenderer = () => {
124
124
  height: "16px",
125
125
  gutter: "xxs",
126
126
  alignItems: "center"
127
- }, void 0, _StyledCreatableLabel || (_StyledCreatableLabel = /*#__PURE__*/_jsx(StyledCreatableLabel, {}, void 0, "Add:")), /*#__PURE__*/_jsx("span", {}, void 0, label));
127
+ }, void 0, _StyledCreatableLabel || (_StyledCreatableLabel = /*#__PURE__*/_jsx(StyledCreatableLabel, {}, void 0, "Add:")), /*#__PURE__*/_jsx("span", {}, void 0, "\"".concat(label, "\"")));
128
128
  },
129
129
  label: option.label,
130
130
  onClick: e => handleClick(option, e)
@@ -133,7 +133,7 @@ const useItemRenderer = () => {
133
133
 
134
134
  return /*#__PURE__*/jsx(Fragment, {});
135
135
  });
136
- }, [options, focusOptionIdx, selectedValues, innerRef, virtualListHelpers === null || virtualListHelpers === void 0 ? void 0 : virtualListHelpers.virtualItems]);
136
+ }, [filteredOptions, focusOptionIdx, selectedValues, virtualListHelpers]);
137
137
  };
138
138
 
139
139
  export { useItemRenderer };
@@ -6,7 +6,7 @@ const useMenuListSetFocusOption = () => {
6
6
  const {
7
7
  props: {
8
8
  selectedValues,
9
- options
9
+ filteredOptions
10
10
  },
11
11
  setFocusOptionIdx,
12
12
  hasFocus,
@@ -15,16 +15,16 @@ const useMenuListSetFocusOption = () => {
15
15
  scrollOptionIntoView
16
16
  } = useContext(ComboBoxContext);
17
17
  const getFirstOption = useCallback(() => {
18
- for (let i = 0; i < options.length; i += 1) if (!['section', 'separator'].includes(options[i].type) && !options[i].disabled) {
19
- setFocusOptionIdx(options[i].dsId);
18
+ for (let i = 0; i < filteredOptions.length; i += 1) if (!['section', 'separator'].includes(filteredOptions[i].type) && !filteredOptions[i].disabled) {
19
+ setFocusOptionIdx(filteredOptions[i].dsId);
20
20
  break;
21
21
  }
22
- }, [options, setFocusOptionIdx]);
22
+ }, [filteredOptions, setFocusOptionIdx]);
23
23
  useEffect(() => {
24
24
  scrollOptionIntoView(focusOptionIdx); // eslint-disable-next-line react-hooks/exhaustive-deps
25
25
  }, [focusOptionIdx]);
26
26
  useEffect(() => {
27
- if (options.length === 0) {
27
+ if (filteredOptions.length === 0) {
28
28
  setFocusOptionIdx('');
29
29
  }
30
30
 
@@ -41,7 +41,7 @@ const useMenuListSetFocusOption = () => {
41
41
  }
42
42
 
43
43
  if (hasFocus) getFirstOption();
44
- }, [getFirstOption, inputValue, selectedValues, hasFocus, setFocusOptionIdx, options.length]);
44
+ }, [getFirstOption, inputValue, selectedValues, hasFocus, setFocusOptionIdx, filteredOptions.length]);
45
45
  };
46
46
 
47
47
  export { useMenuListSetFocusOption };
@@ -12,7 +12,8 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
12
12
  function noop() {}
13
13
  const ComboboxPropTypes = _objectSpread(_objectSpread({}, globalAttributesPropTypes), {}, {
14
14
  placeholder: PropTypes.string.description("input's placeholder value").defaultValue(''),
15
- options: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired.description('List of options').defaultValue([]),
15
+ allOptions: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).isRequired.description('List of original options').defaultValue([]),
16
+ filteredOptions: PropTypes.oneOfType([PropTypes.array, PropTypes.object]).description('List of filtered options to show in the menu based on the current internal input filter value').defaultValue([]),
16
17
  selectedValues: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]).isRequired.description('Array of option or single option selected'),
17
18
  disabled: PropTypes.bool.description('wheter or not the input is disabled').defaultValue('false'),
18
19
  autoFocus: PropTypes.bool.description('Whether the combo box uses auto focus or not').defaultValue('false'),
@@ -6,6 +6,8 @@ import 'core-js/modules/esnext.iterator.some.js';
6
6
  import 'core-js/modules/esnext.async-iterator.find.js';
7
7
  import 'core-js/modules/esnext.iterator.find.js';
8
8
  import 'core-js/modules/web.dom-collections.iterator.js';
9
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
10
+ import 'core-js/modules/esnext.iterator.for-each.js';
9
11
  import { MENU_OPTION_TYPES } from '../constants.js';
10
12
 
11
13
  const getSelectableOptions = options => options.filter(option => option.type === MENU_OPTION_TYPES.OPTION && !option.disabled);
@@ -30,15 +32,17 @@ const findInCircularList = function (list, from, criteria) {
30
32
 
31
33
  return from; // return same item
32
34
  };
35
+ const getLastValueSelected = selectedValues => {
36
+ if (Array.isArray(selectedValues)) {
37
+ return selectedValues[selectedValues.length - 1];
38
+ }
39
+
40
+ return selectedValues;
41
+ };
33
42
  const getFirstOption = (options, selectedValues, inputValue) => {
34
43
  if (!inputValue) {
35
- if (Array.isArray(selectedValues) && selectedValues.length > 0) {
36
- return selectedValues[selectedValues.length - 1].dsId;
37
- }
38
-
39
- if (selectedValues !== null && selectedValues !== void 0 && selectedValues.dsId) {
40
- return selectedValues.dsId;
41
- }
44
+ const lastValue = getLastValueSelected(selectedValues);
45
+ if (lastValue) return lastValue.dsId;
42
46
  }
43
47
 
44
48
  for (let i = 0; i < options.length; i += 1) if (!['section', 'separator'].includes(options[i].type) && !options[i].disabled) {
@@ -64,12 +68,34 @@ const getSuggestedValueOnChange = (selectedOption, selectedValues) => {
64
68
 
65
69
  return selectedOption;
66
70
  };
67
- const getLastValueSelected = selectedValues => {
68
- if (Array.isArray(selectedValues)) {
69
- return selectedValues[selectedValues.length - 1];
71
+ const filterOptions = (inputValue, options) => options.filter(option => option.type === MENU_OPTION_TYPES.OPTION && option.label.toLowerCase().includes(inputValue.toLowerCase()));
72
+ const selectedValuesWithSections = (optionsToParse, multiSelectedValue) => {
73
+ var _items2;
74
+
75
+ const items = [];
76
+ if (optionsToParse) optionsToParse.forEach(option => {
77
+ // const isSelectedValue = multiSelectedValue.find((item) => item?.dsId === option.dsId);
78
+ if (option.type === MENU_OPTION_TYPES.OPTION && isSelected(multiSelectedValue, option)) {
79
+ items.push(option);
80
+ }
81
+
82
+ if (option.type === MENU_OPTION_TYPES.SECTION) {
83
+ var _items;
84
+
85
+ if (((_items = items[items.length - 1]) === null || _items === void 0 ? void 0 : _items.type) === MENU_OPTION_TYPES.SECTION) {
86
+ items[items.length - 1] = option;
87
+ } else {
88
+ items.push(option);
89
+ }
90
+ }
91
+ });
92
+
93
+ if (((_items2 = items[items.length - 1]) === null || _items2 === void 0 ? void 0 : _items2.type) === MENU_OPTION_TYPES.SECTION) {
94
+ items.pop();
70
95
  }
71
96
 
72
- return selectedValues;
97
+ return items;
73
98
  };
99
+ const getFilteredOptionsSelected = (filteredOption, selectedValues) => filteredOption.filter(option => option.type === MENU_OPTION_TYPES.OPTION && isSelected(selectedValues, option));
74
100
 
75
- export { findInCircularList, getFirstOption, getLastValueSelected, getOptions, getSelectableOptions, getSuggestedValueOnChange, isSelected, isSelectedValueEmpty, isSelectedValueMultiple };
101
+ export { filterOptions, findInCircularList, getFilteredOptionsSelected, getFirstOption, getLastValueSelected, getOptions, getSelectableOptions, getSuggestedValueOnChange, isSelected, isSelectedValueEmpty, isSelectedValueMultiple, selectedValuesWithSections };
package/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { DSAutocomplete, DSAutocompleteWithSchema } from './autocomplete/Autocomplete.js';
2
2
  export { DSControlledCheckbox, DSControlledCheckboxWithSchema } from './checkbox/ControlledCheckbox.js';
3
- export { DSComboBox, DSComboBoxWithSchema } from './combobox/ComboBox.js';
3
+ export { DSComboBox, DSComboBox as DSComboBoxV3, DSComboBoxWithSchema } from './combobox/ComboBox.js';
4
4
  export { DSControlledDateRangePicker, DSControlledDateRangePickerWithSchema } from './date-range-picker/ControlledDateRangePicker.js';
5
5
  export { ControlledDateRangePickerDatatestid } from './date-range-picker/ControlledDateRangePickerDatatestid.js';
6
6
  export { CONTROLLED_DATE_RANGE_PICKER_TYPES } from './date-range-picker/ControlledDateRangePickerTypes.js';
@@ -11,10 +11,10 @@ export { deconstructValuesFromDateString, prependStringWithPlaceHolders } from '
11
11
  export { getValidationDateTimeStringMetaInfo } from './date-time-picker/utils/dateTimeHelpers.js';
12
12
  export { getDateStringFromDay, getDateValuesFromDate, getDayFromDateString, getValidationDateStringMetaInfo } from './date-time-picker/utils/dateHelpers.js';
13
13
  export { getValidationTimeStringMetaInfo } from './date-time-picker/utils/timeHelpers.js';
14
- export { UsePhoneMaskWithSchema, usePhoneMask } from './mask-hook/hooks/usePhoneMask.js';
15
- export { UseNumberMaskWithSchema, useNumberMask } from './mask-hook/hooks/useNumberMask.js';
16
- export { UseSSNMaskWithSchema, useSSNMask } from './mask-hook/hooks/useSSNMask.js';
17
- export { UseZipCodeMaskWithSchema, useZipCode } from './mask-hook/hooks/useZipCode.js';
14
+ export { UsePhoneMaskWithSchema, getPhoneMaskedValue, usePhoneMask } from './mask-hook/hooks/usePhoneMask.js';
15
+ export { UseNumberMaskWithSchema, getNumberMaskedValue, useNumberMask } from './mask-hook/hooks/useNumberMask.js';
16
+ export { UseSSNMaskWithSchema, getSSNMaskedValue, useSSNMask } from './mask-hook/hooks/useSSNMask.js';
17
+ export { UseZipCodeMaskWithSchema, getUseZipMaskedValue, useZipCodeMask } from './mask-hook/hooks/useZipCodeMask.js';
18
18
  export { DSInputText, DSInputTextWithSchema } from './text-input/DSInputText.js';
19
19
  export { DSInputTextDataTestIds } from './text-input/exported-related/data-test-ids.js';
20
20
  export { DSInputTextName, DSInputTextSlots } from './text-input/exported-related/theming.js';
@@ -1,4 +1,4 @@
1
- export { UsePhoneMaskWithSchema, usePhoneMask } from './usePhoneMask.js';
2
- export { UseNumberMaskWithSchema, useNumberMask } from './useNumberMask.js';
3
- export { UseSSNMaskWithSchema, useSSNMask } from './useSSNMask.js';
4
- export { UseZipCodeMaskWithSchema, useZipCode } from './useZipCode.js';
1
+ export { UsePhoneMaskWithSchema, getPhoneMaskedValue, usePhoneMask } from './usePhoneMask.js';
2
+ export { UseNumberMaskWithSchema, getNumberMaskedValue, useNumberMask } from './useNumberMask.js';
3
+ export { UseSSNMaskWithSchema, getSSNMaskedValue, useSSNMask } from './useSSNMask.js';
4
+ export { UseZipCodeMaskWithSchema, getUseZipMaskedValue, useZipCodeMask } from './useZipCodeMask.js';
@@ -156,7 +156,11 @@ const useNumberMask = props => {
156
156
  onBlur
157
157
  };
158
158
  };
159
+ const getNumberMaskedValue = (value, opts) => {
160
+ const [maskedValue] = conformValue(value, value.length - 1, '', opts);
161
+ return maskedValue;
162
+ };
159
163
  const UseNumberMaskWithSchema = describe(useNumberMask);
160
164
  UseNumberMaskWithSchema.propTypes = DSMaskNumberHookPropsTypes;
161
165
 
162
- export { UseNumberMaskWithSchema, useNumberMask };
166
+ export { UseNumberMaskWithSchema, getNumberMaskedValue, useNumberMask };
@@ -78,7 +78,11 @@ const usePhoneMask = props => {
78
78
  onChange
79
79
  };
80
80
  };
81
+ const getPhoneMaskedValue = (value, opts) => {
82
+ const [maskedValue] = conformValue(value, value.length - 1, '', opts);
83
+ return maskedValue;
84
+ };
81
85
  const UsePhoneMaskWithSchema = describe(usePhoneMask);
82
86
  UsePhoneMaskWithSchema.propTypes = DSMaskPhoneHookPropsTypes;
83
87
 
84
- export { UsePhoneMaskWithSchema, usePhoneMask };
88
+ export { UsePhoneMaskWithSchema, getPhoneMaskedValue, usePhoneMask };
@@ -61,7 +61,11 @@ const useSSNMask = props => {
61
61
  onChange
62
62
  };
63
63
  };
64
+ const getSSNMaskedValue = value => {
65
+ const [maskedValue] = conformValue(value, value.length - 1, '');
66
+ return maskedValue;
67
+ };
64
68
  const UseSSNMaskWithSchema = describe(useSSNMask);
65
69
  UseSSNMaskWithSchema.propTypes = DSMaskHookPropsTypes;
66
70
 
67
- export { UseSSNMaskWithSchema, useSSNMask };
71
+ export { UseSSNMaskWithSchema, getSSNMaskedValue, useSSNMask };
@@ -14,14 +14,14 @@ const zipCodeSpecialChars = [['-', 5]];
14
14
 
15
15
  const conformValue = (rawValue, cursorPos, lastKeyCode) => {
16
16
  // Work with digits only
17
- let maskedValue = rawValue.split('').filter(char => char >= '0' && char <= '9'); // We only consider first 5 digits
17
+ let maskedValue = rawValue.split('').filter(char => char >= '0' && char <= '9'); // We only consider first 9 digits
18
18
 
19
- maskedValue = maskedValue.slice(0, 6);
19
+ maskedValue = maskedValue.slice(0, 9);
20
20
  const maskedPos = getPartialMaskedPos(rawValue, maskedValue, cursorPos);
21
21
  return addSpecialCharacters(maskedValue, zipCodeSpecialChars, maskedPos, lastKeyCode);
22
22
  };
23
23
 
24
- const useZipCode = props => {
24
+ const useZipCodeMask = props => {
25
25
  const propsWithDefault = useMemoMergePropsWithDefault(props, DSMaskHookDefaultProps);
26
26
  useValidateTypescriptPropTypes(propsWithDefault, DSMaskHookPropsTypes);
27
27
  const {
@@ -58,7 +58,11 @@ const useZipCode = props => {
58
58
  onChange
59
59
  };
60
60
  };
61
- const UseZipCodeMaskWithSchema = describe(useZipCode);
61
+ const getUseZipMaskedValue = value => {
62
+ const [maskedValue] = conformValue(value, value.length - 1, '');
63
+ return maskedValue;
64
+ };
65
+ const UseZipCodeMaskWithSchema = describe(useZipCodeMask);
62
66
  UseZipCodeMaskWithSchema.propTypes = DSMaskHookPropsTypes;
63
67
 
64
- export { UseZipCodeMaskWithSchema, useZipCode };
68
+ export { UseZipCodeMaskWithSchema, getUseZipMaskedValue, useZipCodeMask };
@@ -1,4 +1,4 @@
1
- export { UsePhoneMaskWithSchema, usePhoneMask } from './hooks/usePhoneMask.js';
2
- export { UseNumberMaskWithSchema, useNumberMask } from './hooks/useNumberMask.js';
3
- export { UseSSNMaskWithSchema, useSSNMask } from './hooks/useSSNMask.js';
4
- export { UseZipCodeMaskWithSchema, useZipCode } from './hooks/useZipCode.js';
1
+ export { UsePhoneMaskWithSchema, getPhoneMaskedValue, usePhoneMask } from './hooks/usePhoneMask.js';
2
+ export { UseNumberMaskWithSchema, getNumberMaskedValue, useNumberMask } from './hooks/useNumberMask.js';
3
+ export { UseSSNMaskWithSchema, getSSNMaskedValue, useSSNMask } from './hooks/useSSNMask.js';
4
+ export { UseZipCodeMaskWithSchema, getUseZipMaskedValue, useZipCodeMask } from './hooks/useZipCodeMask.js';