@elliemae/ds-controlled-form 2.4.2-rc.0 → 2.4.2-rc.9

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 (190) hide show
  1. package/cjs/autocomplete/config/useAutocomplete.js +1 -3
  2. package/cjs/checkbox/ControlledCheckbox.js +49 -33
  3. package/cjs/checkbox/exported-related/data-test-ids.js +10 -0
  4. package/cjs/checkbox/exported-related/index.js +12 -0
  5. package/cjs/checkbox/exported-related/theming.js +13 -0
  6. package/cjs/checkbox/react-desc-prop-types.js +0 -1
  7. package/cjs/checkbox/styles.js +26 -15
  8. package/cjs/combobox/ComboBoxCTX.js +1 -1
  9. package/cjs/combobox/ComboboxDataTestids.js +1 -1
  10. package/cjs/combobox/config/useComboBox.js +6 -4
  11. package/cjs/combobox/index.js +5 -0
  12. package/cjs/combobox/parts/DropdownIndicator.js +2 -2
  13. package/cjs/combobox/parts/container/Container.js +5 -5
  14. package/cjs/combobox/parts/container/styled.js +13 -7
  15. package/cjs/combobox/parts/controls/Controls.js +14 -4
  16. package/cjs/combobox/parts/controls/styled.js +22 -13
  17. package/cjs/combobox/parts/controls-input/ControlsInput.js +1 -1
  18. package/cjs/combobox/parts/controls-input/styled.js +7 -3
  19. package/cjs/combobox/parts/controls-input/useControlsInput.js +3 -4
  20. package/cjs/combobox/parts/controls-input/useKeyboardNavigation.js +30 -15
  21. package/cjs/combobox/parts/header-list/HeaderList.js +4 -3
  22. package/cjs/combobox/parts/header-list/useHeaderListHandlers.js +9 -5
  23. package/cjs/combobox/parts/menu-list/MenuList.js +5 -2
  24. package/cjs/combobox/parts/menu-list/styled.js +12 -7
  25. package/cjs/combobox/parts/menu-list/useItemRenderer.js +5 -4
  26. package/cjs/combobox/parts/multi-selected-values-container/MultiSelectedValuesContainer.js +1 -1
  27. package/cjs/combobox/parts/multi-selected-values-container/RemovableSelectedValuePill.js +2 -0
  28. package/cjs/combobox/parts/multi-selected-values-container/useGroupPills.js +13 -10
  29. package/cjs/combobox/theming.js +13 -0
  30. package/cjs/combobox/utils/listHelper.js +2 -1
  31. package/cjs/date-time-picker/config/useChangeHandlers.js +8 -12
  32. package/cjs/date-time-picker/config/useControlledDateTimePicker.js +13 -9
  33. package/cjs/date-time-picker/config/useFocusTracker.js +136 -0
  34. package/cjs/date-time-picker/config/useGetReferences.js +40 -19
  35. package/cjs/date-time-picker/config/useGlobalKeyHandlers.js +8 -12
  36. package/cjs/date-time-picker/parts/ClearButton/ClearButton.js +12 -2
  37. package/cjs/date-time-picker/parts/ClearButton/useClearButton.js +12 -25
  38. package/cjs/date-time-picker/parts/ControlledDateTimePickerContent.js +4 -7
  39. package/cjs/date-time-picker/parts/DateInputs/DDInput.js +8 -2
  40. package/cjs/date-time-picker/parts/DateInputs/DateInputs.js +9 -4
  41. package/cjs/date-time-picker/parts/DateInputs/MMInput.js +8 -2
  42. package/cjs/date-time-picker/parts/DateInputs/YYYYInput.js +8 -2
  43. package/cjs/date-time-picker/parts/DateInputs/useDateInputs.js +76 -95
  44. package/cjs/date-time-picker/parts/Pickers/Calendar/CalendarHead.js +31 -5
  45. package/cjs/date-time-picker/parts/Pickers/Calendar/Day.js +16 -10
  46. package/cjs/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.js +12 -12
  47. package/cjs/date-time-picker/parts/Pickers/Calendar/useFocusLogic.js +2 -38
  48. package/cjs/date-time-picker/parts/Pickers/Calendar/useKeyboardHandlers.js +40 -73
  49. package/cjs/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.js +18 -27
  50. package/cjs/date-time-picker/parts/Pickers/CalendarWithTimeWheel/CalendarWithTimeWheelIconTrigger.js +1 -0
  51. package/cjs/date-time-picker/parts/Pickers/CalendarWithTimeWheel/useConfigCalendarWithTimeWheelCTX.js +17 -23
  52. package/cjs/date-time-picker/parts/Pickers/TimeWheel/HoursList.js +13 -7
  53. package/cjs/date-time-picker/parts/Pickers/TimeWheel/MeridiemList.js +14 -8
  54. package/cjs/date-time-picker/parts/Pickers/TimeWheel/MinutesList.js +13 -7
  55. package/cjs/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.js +36 -230
  56. package/cjs/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.js +11 -13
  57. package/cjs/date-time-picker/parts/TimeInputs/HHInput.js +8 -2
  58. package/cjs/date-time-picker/parts/TimeInputs/MeridiemInput.js +8 -2
  59. package/cjs/date-time-picker/parts/TimeInputs/MinutesInput.js +8 -2
  60. package/cjs/date-time-picker/parts/TimeInputs/TimeInputs.js +11 -6
  61. package/cjs/date-time-picker/parts/TimeInputs/useTimeInputs.js +44 -74
  62. package/cjs/date-time-picker/utils/constants.js +0 -12
  63. package/cjs/date-time-picker/utils/hooks/useGetStartingFocusedDay.js +38 -36
  64. package/cjs/index.js +16 -7
  65. package/cjs/input-group/InputGroup.js +69 -0
  66. package/cjs/input-group/InputGroupDataTestIds.js +12 -0
  67. package/cjs/input-group/index.js +12 -0
  68. package/cjs/input-group/react-desc-prop-types.js +14 -0
  69. package/cjs/input-group/styled.js +46 -0
  70. package/cjs/mask-hook/hooks/index.js +0 -1
  71. package/cjs/mask-hook/hooks/usePhoneMask.js +2 -2
  72. package/cjs/mask-hook/hooks/useRegExpMask.js +0 -1
  73. package/cjs/mask-hook/index.js +0 -1
  74. package/cjs/text-input/styled/borders.js +1 -1
  75. package/esm/autocomplete/config/useAutocomplete.js +1 -3
  76. package/esm/checkbox/ControlledCheckbox.js +52 -36
  77. package/esm/checkbox/exported-related/data-test-ids.js +6 -0
  78. package/esm/checkbox/exported-related/index.js +2 -0
  79. package/esm/checkbox/exported-related/theming.js +8 -0
  80. package/esm/checkbox/react-desc-prop-types.js +0 -1
  81. package/esm/checkbox/styles.js +25 -15
  82. package/esm/combobox/ComboBoxCTX.js +1 -1
  83. package/esm/combobox/ComboboxDataTestids.js +1 -1
  84. package/esm/combobox/config/useComboBox.js +6 -4
  85. package/esm/combobox/index.js +2 -0
  86. package/esm/combobox/parts/DropdownIndicator.js +2 -2
  87. package/esm/combobox/parts/container/Container.js +7 -7
  88. package/esm/combobox/parts/container/styled.js +13 -6
  89. package/esm/combobox/parts/controls/Controls.js +14 -4
  90. package/esm/combobox/parts/controls/styled.js +22 -13
  91. package/esm/combobox/parts/controls-input/ControlsInput.js +1 -1
  92. package/esm/combobox/parts/controls-input/styled.js +7 -3
  93. package/esm/combobox/parts/controls-input/useControlsInput.js +3 -4
  94. package/esm/combobox/parts/controls-input/useKeyboardNavigation.js +30 -15
  95. package/esm/combobox/parts/header-list/HeaderList.js +4 -3
  96. package/esm/combobox/parts/header-list/useHeaderListHandlers.js +9 -5
  97. package/esm/combobox/parts/menu-list/MenuList.js +5 -2
  98. package/esm/combobox/parts/menu-list/styled.js +12 -7
  99. package/esm/combobox/parts/menu-list/useItemRenderer.js +5 -4
  100. package/esm/combobox/parts/multi-selected-values-container/MultiSelectedValuesContainer.js +1 -1
  101. package/esm/combobox/parts/multi-selected-values-container/RemovableSelectedValuePill.js +2 -0
  102. package/esm/combobox/parts/multi-selected-values-container/useGroupPills.js +13 -10
  103. package/esm/combobox/theming.js +8 -0
  104. package/esm/combobox/utils/listHelper.js +2 -1
  105. package/esm/date-time-picker/config/useChangeHandlers.js +8 -12
  106. package/esm/date-time-picker/config/useControlledDateTimePicker.js +13 -9
  107. package/esm/date-time-picker/config/useFocusTracker.js +132 -0
  108. package/esm/date-time-picker/config/useGetReferences.js +41 -20
  109. package/esm/date-time-picker/config/useGlobalKeyHandlers.js +8 -12
  110. package/esm/date-time-picker/parts/ClearButton/ClearButton.js +12 -2
  111. package/esm/date-time-picker/parts/ClearButton/useClearButton.js +12 -25
  112. package/esm/date-time-picker/parts/ControlledDateTimePickerContent.js +4 -7
  113. package/esm/date-time-picker/parts/DateInputs/DDInput.js +8 -2
  114. package/esm/date-time-picker/parts/DateInputs/DateInputs.js +9 -4
  115. package/esm/date-time-picker/parts/DateInputs/MMInput.js +8 -2
  116. package/esm/date-time-picker/parts/DateInputs/YYYYInput.js +8 -2
  117. package/esm/date-time-picker/parts/DateInputs/useDateInputs.js +77 -96
  118. package/esm/date-time-picker/parts/Pickers/Calendar/CalendarHead.js +32 -6
  119. package/esm/date-time-picker/parts/Pickers/Calendar/Day.js +16 -10
  120. package/esm/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.js +12 -12
  121. package/esm/date-time-picker/parts/Pickers/Calendar/useFocusLogic.js +3 -39
  122. package/esm/date-time-picker/parts/Pickers/Calendar/useKeyboardHandlers.js +40 -73
  123. package/esm/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.js +18 -27
  124. package/esm/date-time-picker/parts/Pickers/CalendarWithTimeWheel/CalendarWithTimeWheelIconTrigger.js +1 -0
  125. package/esm/date-time-picker/parts/Pickers/CalendarWithTimeWheel/useConfigCalendarWithTimeWheelCTX.js +17 -23
  126. package/esm/date-time-picker/parts/Pickers/TimeWheel/HoursList.js +14 -8
  127. package/esm/date-time-picker/parts/Pickers/TimeWheel/MeridiemList.js +15 -9
  128. package/esm/date-time-picker/parts/Pickers/TimeWheel/MinutesList.js +14 -8
  129. package/esm/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.js +36 -230
  130. package/esm/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.js +11 -13
  131. package/esm/date-time-picker/parts/TimeInputs/HHInput.js +8 -2
  132. package/esm/date-time-picker/parts/TimeInputs/MeridiemInput.js +8 -2
  133. package/esm/date-time-picker/parts/TimeInputs/MinutesInput.js +8 -2
  134. package/esm/date-time-picker/parts/TimeInputs/TimeInputs.js +11 -6
  135. package/esm/date-time-picker/parts/TimeInputs/useTimeInputs.js +44 -74
  136. package/esm/date-time-picker/utils/constants.js +1 -7
  137. package/esm/date-time-picker/utils/hooks/useGetStartingFocusedDay.js +38 -36
  138. package/esm/index.js +5 -1
  139. package/esm/input-group/InputGroup.js +59 -0
  140. package/esm/input-group/InputGroupDataTestIds.js +8 -0
  141. package/esm/input-group/index.js +2 -0
  142. package/esm/input-group/react-desc-prop-types.js +10 -0
  143. package/esm/input-group/styled.js +35 -0
  144. package/esm/mask-hook/hooks/index.js +1 -1
  145. package/esm/mask-hook/hooks/usePhoneMask.js +2 -2
  146. package/esm/mask-hook/hooks/useRegExpMask.js +1 -1
  147. package/esm/mask-hook/index.js +1 -1
  148. package/esm/text-input/styled/borders.js +1 -1
  149. package/package.json +55 -19
  150. package/types/checkbox/exported-related/data-test-ids.d.ts +4 -0
  151. package/types/checkbox/exported-related/index.d.ts +2 -0
  152. package/types/checkbox/exported-related/theming.d.ts +6 -0
  153. package/types/checkbox/react-desc-prop-types.d.ts +3 -3
  154. package/types/checkbox/styles.d.ts +5 -5
  155. package/types/combobox/ComboboxDataTestids.d.ts +1 -1
  156. package/types/combobox/index.d.ts +2 -0
  157. package/types/combobox/parts/container/styled.d.ts +1 -2
  158. package/types/combobox/theming.d.ts +6 -0
  159. package/types/date-time-picker/config/useChangeHandlers.d.ts +3 -1
  160. package/types/date-time-picker/config/useControlledDateTimePicker.d.ts +2 -5
  161. package/types/date-time-picker/config/useFocusTracker.d.ts +38 -0
  162. package/types/date-time-picker/config/useGetPropsBasedOnType.d.ts +6 -6
  163. package/types/date-time-picker/config/useGetReferences.d.ts +30 -36
  164. package/types/date-time-picker/config/useGlobalKeyHandlers.d.ts +3 -1
  165. package/types/date-time-picker/parts/DateInputs/DDInput.d.ts +2 -1
  166. package/types/date-time-picker/parts/DateInputs/MMInput.d.ts +2 -1
  167. package/types/date-time-picker/parts/DateInputs/YYYYInput.d.ts +2 -1
  168. package/types/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.d.ts +14 -0
  169. package/types/date-time-picker/parts/Pickers/Calendar/useFocusLogic.d.ts +1 -2
  170. package/types/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.d.ts +19 -0
  171. package/types/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.d.ts +0 -6
  172. package/types/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.d.ts +14 -0
  173. package/types/date-time-picker/parts/TimeInputs/HHInput.d.ts +2 -1
  174. package/types/date-time-picker/parts/TimeInputs/MeridiemInput.d.ts +2 -1
  175. package/types/date-time-picker/parts/TimeInputs/MinutesInput.d.ts +2 -1
  176. package/types/date-time-picker/propTypes.d.ts +117 -0
  177. package/types/date-time-picker/sharedTypes.d.ts +1 -1
  178. package/types/date-time-picker/utils/constants.d.ts +0 -6
  179. package/types/index.d.ts +1 -0
  180. package/types/input-group/InputGroup.d.ts +5 -0
  181. package/types/input-group/InputGroupDataTestIds.d.ts +6 -0
  182. package/types/input-group/index.d.ts +2 -0
  183. package/types/input-group/react-desc-prop-types.d.ts +19 -0
  184. package/types/input-group/styled.d.ts +7 -0
  185. package/types/input-group/tests/DSInputGroup.test.d.ts +1 -0
  186. package/types/mask-hook/hooks/useRegExpMask.d.ts +0 -1
  187. package/types/text-input/config/useInputText.d.ts +5 -5
  188. package/cjs/combobox/parts/menu-list/useMenuListSetFocusOption.js +0 -51
  189. package/esm/combobox/parts/menu-list/useMenuListSetFocusOption.js +0 -47
  190. package/types/combobox/parts/menu-list/useMenuListSetFocusOption.d.ts +0 -1
@@ -32,6 +32,7 @@ const useKeyboardNavigation = () => {
32
32
  inputValue,
33
33
  showPopover,
34
34
  focusOptionIdx,
35
+ listRef,
35
36
  selectAllCheckboxRef,
36
37
  toggleSelectionButtonRef,
37
38
  setShowPopover,
@@ -51,6 +52,14 @@ const useKeyboardNavigation = () => {
51
52
 
52
53
  if (['ArrowDown', 'ArrowUp', 'Enter', 'Spacebar'].includes(e.key) || e.keyCode >= 48 && e.keyCode <= 90) {
53
54
  setShowPopover(true);
55
+ window.requestAnimationFrame(() => {
56
+ if (listRef.current && window.scrollY < listRef.current.offsetHeight) {
57
+ window.scrollTo({
58
+ top: listRef.current.offsetHeight,
59
+ behavior: 'smooth'
60
+ });
61
+ }
62
+ });
54
63
  } // =============================================================================
55
64
  // ESCAPE
56
65
  // =============================================================================
@@ -71,7 +80,7 @@ const useKeyboardNavigation = () => {
71
80
 
72
81
 
73
82
  if (e.key === 'Enter' && (currentItem === null || currentItem === void 0 ? void 0 : currentItem.type) === constants.INTERNAL_MENU_OPTION_TYPES.CREATABLE && onCreate) {
74
- onCreate(inputValue); //blank active item to force search last one
83
+ onCreate(inputValue); // blank active item to force search last one
75
84
 
76
85
  setFocusOptionIdx('');
77
86
  if (onFilter) onFilter(allOptions, '');
@@ -114,9 +123,12 @@ const useKeyboardNavigation = () => {
114
123
  e.stopPropagation();
115
124
 
116
125
  if ((showPopover || inline) && selectableOptions.length) {
117
- const nextItemIndex = listHelper.findInCircularList(filteredOptions, currentItemIndex, isOptionFocuseable);
118
- setFocusOptionIdx(filteredOptions[nextItemIndex].dsId);
119
- scrollOptionIntoView(filteredOptions[nextItemIndex].dsId);
126
+ const nextItemIndexIndex = listHelper.findInCircularList(filteredOptions, currentItemIndex, isOptionFocuseable);
127
+
128
+ if (nextItemIndexIndex > -1) {
129
+ setFocusOptionIdx(filteredOptions[nextItemIndexIndex].dsId);
130
+ scrollOptionIntoView(filteredOptions[nextItemIndexIndex].dsId);
131
+ }
120
132
  }
121
133
  }
122
134
 
@@ -126,16 +138,19 @@ const useKeyboardNavigation = () => {
126
138
  if (!selectableOptions.length) return;
127
139
  const prevItemIndex = listHelper.findInCircularList(filteredOptions, currentItemIndex, isOptionFocuseable, -1);
128
140
 
129
- if (showPopover || inline) {
130
- setFocusOptionIdx(filteredOptions[prevItemIndex].dsId);
131
- scrollOptionIntoView(filteredOptions[prevItemIndex].dsId);
132
- } else {
133
- setShowPopover(true);
134
- setTimeout(() => {
135
- const prevItem = listHelper.findInCircularList(filteredOptions, 0, isOptionFocuseable, -1);
136
- setFocusOptionIdx(filteredOptions[prevItem].dsId);
137
- scrollOptionIntoView(filteredOptions[prevItem].dsId);
138
- });
141
+ if (prevItemIndex > -1) {
142
+ if (showPopover || inline) {
143
+ setFocusOptionIdx(filteredOptions[prevItemIndex].dsId);
144
+ scrollOptionIntoView(filteredOptions[prevItemIndex].dsId);
145
+ } else {
146
+ // open menu and search last item to focused
147
+ setShowPopover(true);
148
+ const lastItemIndex = listHelper.findInCircularList(filteredOptions, 0, isOptionFocuseable, -1);
149
+ setFocusOptionIdx(filteredOptions[lastItemIndex].dsId);
150
+ setTimeout(() => {
151
+ scrollOptionIntoView(filteredOptions[lastItemIndex].dsId);
152
+ });
153
+ }
139
154
  }
140
155
  } // =============================================================================
141
156
  // BACKSPACE
@@ -167,7 +182,7 @@ const useKeyboardNavigation = () => {
167
182
  setShowPopover(false);
168
183
  }
169
184
  }, // eslint-disable-next-line react-hooks/exhaustive-deps
170
- [onKeyDown, currentItem, onCreate, multiple, inputValue, inline, withoutPortal, setShowPopover, onCancel, onFilter, setInputValue, focusOptionIdx, showPopover, selectableOptions.length, filteredOptions, currentItemIndex, setFocusOptionIdx, selectedValues, onChange, selectAllCheckboxRef, toggleSelectionButtonRef]);
185
+ [onKeyDown, currentItem, onCreate, multiple, inputValue, inline, withoutPortal, setShowPopover, onCancel, onFilter, setInputValue, listRef, focusOptionIdx, showPopover, selectableOptions.length, filteredOptions, currentItemIndex, setFocusOptionIdx, selectedValues, onChange, selectAllCheckboxRef, toggleSelectionButtonRef]);
171
186
  return {
172
187
  onInputKeyDown
173
188
  };
@@ -22,6 +22,7 @@ const HeaderList = () => {
22
22
  const {
23
23
  props: {
24
24
  selectedValues,
25
+ filteredOptions,
25
26
  onSelectAll
26
27
  },
27
28
  showSelectedOptions,
@@ -40,15 +41,15 @@ const HeaderList = () => {
40
41
  } = useHeaderListHandlers.useHeaderListHandlers();
41
42
  return /*#__PURE__*/_jsx__default["default"](styled.StyledHeaderListWrapper, {
42
43
  onKeyDown: handleKeyDown,
43
- onMouseDown: handleOnMouseDown
44
+ onMouseDown: handleOnMouseDown,
45
+ "data-testid": ComboboxDataTestids.ComboboxDataTestid.MULTISELECT.HEADER_LIST
44
46
  }, void 0, /*#__PURE__*/_jsx__default["default"](styled.StyledSelectAllCheckbox, {}, void 0, onSelectAll && /*#__PURE__*/_jsx__default["default"](ControlledCheckbox.DSControlledCheckbox, {
45
47
  checked: checkboxStatus,
46
- "aria-controls": checkboxStatus === 'mixed' ? multiSelectedValues.map(item => item.dsId).join(' ') : '',
48
+ "aria-controls": filteredOptions.map(item => item.dsId).join(' '),
47
49
  name: "select-all-checkbox",
48
50
  "aria-label": "Select/Unselect All Items",
49
51
  id: "select-all-checkbox",
50
52
  onChange: handleSelectAllCheckboxChange,
51
- "data-testid": ComboboxDataTestids.ComboboxDataTestid.MULTISELECT.SELECT_ALL_CHECKBOX,
52
53
  onKeyDown: handleCheckAllOnTab,
53
54
  innerRef: selectAllCheckboxRef
54
55
  })), /*#__PURE__*/_jsx__default["default"](styled.StyledSelectedItems, {}, void 0, multiSelectedValues.length > 0 ? /*#__PURE__*/_jsx__default["default"](styled.StyledButtonSelection, {
@@ -55,27 +55,31 @@ const useHeaderListHandlers = () => {
55
55
  e.preventDefault();
56
56
  setShowSelectedOptions(!showSelectedOptions);
57
57
  }, [setShowSelectedOptions, showSelectedOptions]); // when pressing escape on each header list button we close the menu
58
+ // and set focus on input
58
59
 
59
60
  const handleKeyDown = React.useCallback(e => {
60
61
  if (e.key === 'Escape') {
62
+ var _innerRef$current;
63
+
61
64
  setShowPopover(false);
65
+ (_innerRef$current = innerRef.current) === null || _innerRef$current === void 0 ? void 0 : _innerRef$current.focus();
62
66
  }
63
- }, [setShowPopover]); // when hitting tab on selected values button filter we target the input again
67
+ }, [setShowPopover, innerRef]); // when hitting tab on selected values button filter we target the input again
64
68
 
65
69
  const handleFilterSelectionBtnOnTab = React.useCallback(e => {
66
70
  if (e.key === 'Tab' && !e.shiftKey) {
67
- var _innerRef$current;
71
+ var _innerRef$current2;
68
72
 
69
73
  e.preventDefault();
70
- (_innerRef$current = innerRef.current) === null || _innerRef$current === void 0 ? void 0 : _innerRef$current.focus();
74
+ (_innerRef$current2 = innerRef.current) === null || _innerRef$current2 === void 0 ? void 0 : _innerRef$current2.focus();
71
75
  }
72
76
  }, [innerRef]);
73
77
  const handleCheckAllOnTab = React.useCallback(e => {
74
78
  if (e.key === 'Tab' && !e.shiftKey && multiSelectedValues.length === 0) {
75
- var _innerRef$current2;
79
+ var _innerRef$current3;
76
80
 
77
81
  e.preventDefault();
78
- (_innerRef$current2 = innerRef.current) === null || _innerRef$current2 === void 0 ? void 0 : _innerRef$current2.focus();
82
+ (_innerRef$current3 = innerRef.current) === null || _innerRef$current3 === void 0 ? void 0 : _innerRef$current3.focus();
79
83
  }
80
84
  }, [innerRef, multiSelectedValues]);
81
85
  React.useEffect(() => {
@@ -48,7 +48,9 @@ const MenuList = () => {
48
48
  inline: inline,
49
49
  onMouseDown: preventLoseInputFocus,
50
50
  width: width,
51
- minWidth: menuMinWidth,
51
+ minWidth: menuMinWidth // we use width as key to force react virtual re-render on window resize
52
+ // and update the item height accordly
53
+ ,
52
54
  children: [withHeader && (_HeaderList || (_HeaderList = /*#__PURE__*/_jsx__default["default"](HeaderList.HeaderList, {}))), filteredOptions.length > 0 || onCreate ? /*#__PURE__*/jsxRuntime.jsx(styled.StyledVirtualListWrapper, {
53
55
  inline: inline,
54
56
  maxHeight: menuMaxHeight,
@@ -64,9 +66,10 @@ const MenuList = () => {
64
66
  }
65
67
  }, void 0, ItemRenderer)
66
68
  }) : _StyledNoResultsWrapp || (_StyledNoResultsWrapp = /*#__PURE__*/_jsx__default["default"](styled.StyledNoResultsWrapper, {
69
+ role: "alert",
67
70
  "aria-live": "polite"
68
71
  }, void 0, "No matches found"))]
69
- }), [wrapperListRef, inline, preventLoseInputFocus, width, menuMinWidth, withHeader, filteredOptions.length, onCreate, menuMaxHeight, listRef, virtualListHelpers === null || virtualListHelpers === void 0 ? void 0 : virtualListHelpers.totalSize, ItemRenderer]);
72
+ }, width), [wrapperListRef, inline, preventLoseInputFocus, menuMinWidth, withHeader, filteredOptions.length, onCreate, menuMaxHeight, listRef, virtualListHelpers === null || virtualListHelpers === void 0 ? void 0 : virtualListHelpers.totalSize, ItemRenderer, width]);
70
73
  };
71
74
 
72
75
  exports.MenuList = MenuList;
@@ -10,7 +10,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
10
10
  var _taggedTemplateLiteral__default = /*#__PURE__*/_interopDefaultLegacy(_taggedTemplateLiteral);
11
11
 
12
12
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
13
- const StyledListWrapper = dsSystem.styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral__default["default"](["\n min-width: ", ";\n width: ", ";\n background-color: #ffffff;\n"])), _ref => {
13
+ const StyledListWrapper = dsSystem.styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral__default["default"](["\n min-width: ", ";\n width: ", ";\n background-color: #ffffff;\n max-height: ", ";\n z-index: 100;\n"])), _ref => {
14
14
  let {
15
15
  inline,
16
16
  minWidth
@@ -21,18 +21,23 @@ const StyledListWrapper = dsSystem.styled.div(_templateObject || (_templateObjec
21
21
  width
22
22
  } = _ref2;
23
23
  return "".concat(width, "px");
24
+ }, _ref3 => {
25
+ let {
26
+ maxHeight
27
+ } = _ref3;
28
+ return "".concat(maxHeight, "px");
24
29
  });
25
- const StyledList = dsSystem.styled.ul(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default["default"](["\n position: relative;\n padding: 0;\n"])));
26
- const StyledVirtualListWrapper = dsSystem.styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral__default["default"](["\n overflow-y: auto;\n margin-top: ", ";\n\n max-height: ", ";\n"])), _ref3 => {
30
+ const StyledList = dsSystem.styled.ul(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default["default"](["\n position: relative;\n padding: 0;\n background-color: #ffffff;\n"])));
31
+ const StyledVirtualListWrapper = dsSystem.styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral__default["default"](["\n overflow-y: auto;\n margin-top: ", ";\n max-height: ", ";\n"])), _ref4 => {
27
32
  let {
28
33
  withHeader
29
- } = _ref3;
34
+ } = _ref4;
30
35
  return withHeader ? '28px' : '';
31
- }, _ref4 => {
36
+ }, _ref5 => {
32
37
  let {
33
38
  maxHeight
34
- } = _ref4;
35
- return !maxHeight ? '400px' : "".concat(maxHeight, "px");
39
+ } = _ref5;
40
+ return maxHeight ? "".concat(maxHeight, "px") : '300px';
36
41
  });
37
42
  const StyledCreatableLabel = dsSystem.styled.span(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral__default["default"](["\n font-weight: bold;\n font-style: italic;\n"])));
38
43
  const StyledNoResultsWrapper = dsSystem.styled.div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral__default["default"](["\n padding: 16px;\n"])));
@@ -87,9 +87,10 @@ const useItemRenderer = () => {
87
87
  const generalProps = {
88
88
  wrapperStyles: {
89
89
  position: 'absolute',
90
- top: vItem.start,
90
+ top: 0,
91
91
  left: 0,
92
- width: '100%'
92
+ width: '100%',
93
+ transform: "translateY(".concat(vItem.start, "px)")
93
94
  },
94
95
  key: "".concat(option.dsId),
95
96
  innerRef: vItem.measureRef
@@ -114,8 +115,8 @@ const useItemRenderer = () => {
114
115
  onClick: e => handleClick(option, e),
115
116
  onMouseDown: handleOnMouseDown,
116
117
  isActive: option.dsId === focusOptionIdx,
117
- isSelected: listHelper.isSelected(selectedValues, option),
118
- tabIndex: -1
118
+ isSelected: listHelper.isSelected(selectedValues, option) //tabIndex={-1}
119
+
119
120
  }));
120
121
  }
121
122
 
@@ -29,7 +29,7 @@ const MultiSelectedValuesContainer = () => {
29
29
  const correctPillsToShow = useGroupPills.useGroupPills();
30
30
  return React.useMemo(() => /*#__PURE__*/_jsx__default["default"]("div", {
31
31
  style: {
32
- width: 'max-content'
32
+ width: multiSelectedValue.length > 0 ? 'max-content' : '0px'
33
33
  },
34
34
  "data-testid": ComboboxDataTestids.ComboboxDataTestid.SELECTED_VALUES
35
35
  }, void 0, /*#__PURE__*/_jsx__default["default"](dsPills.DSPillGroupV2, {
@@ -33,6 +33,8 @@ const RemovableSelectedValuePill = props => {
33
33
  onRemove: e => {
34
34
  var _innerRef$current;
35
35
 
36
+ // preventing the menu to be opened
37
+ e.stopPropagation();
36
38
  onChange(listHelper.getSuggestedValueOnChange(pill, selectedValues), pill, e);
37
39
  (_innerRef$current = innerRef.current) === null || _innerRef$current === void 0 ? void 0 : _innerRef$current.focus();
38
40
  }
@@ -29,8 +29,11 @@ const useGroupPills = () => {
29
29
  controlsWrapperRef,
30
30
  pillGroupRef
31
31
  } = React.useContext(ComboBoxCTX.ComboBoxContext);
32
- const multiSelectedValues = selectedValues;
33
- const [pillsToShow, setPillsToShow] = React.useState(multiSelectedValues.length);
32
+ const multiSelectedValues = selectedValues; // 30 represent 30 pills maximum to calculate the grouped pill. this fix the load time issue
33
+ // when combobox is receiving a huge amount of options.
34
+
35
+ const selectedValuesLength = Math.min(30, multiSelectedValues.length);
36
+ const [pillsToShow, setPillsToShow] = React.useState(selectedValuesLength);
34
37
  const {
35
38
  width
36
39
  } = dsUtilities.useOnElementResize(controlsWrapperRef);
@@ -38,28 +41,28 @@ const useGroupPills = () => {
38
41
  width: widthInput
39
42
  } = dsUtilities.useOnElementResize(innerRef || null);
40
43
  React.useEffect(() => {
41
- if (multiSelectedValues.length !== pillsToShow) {
42
- setPillsToShow(multiSelectedValues.length);
44
+ if (selectedValuesLength !== pillsToShow) {
45
+ setPillsToShow(selectedValuesLength);
43
46
  } // eslint-disable-next-line react-hooks/exhaustive-deps
44
47
 
45
- }, [multiSelectedValues.length, width, widthInput]);
48
+ }, [selectedValuesLength, width, widthInput]);
46
49
  React.useLayoutEffect(() => {
47
- if (selectedOptionsRef.current) {
50
+ if (selectedOptionsRef.current && pillGroupRef.current) {
48
51
  if (pillGroupRef.current) pillGroupRef.current.style.width = 'max-content';
49
52
  let lastPillFit = -1;
50
53
  let currentWidth = 0;
51
54
  const referenceWidth = selectedOptionsRef.current.offsetWidth;
52
- const pills = [...selectedOptionsRef.current.querySelectorAll(disabled ? '.ds-pill-wrapper-value' : '.ds-pill-wrapper-removable')];
55
+ const pills = [...pillGroupRef.current.querySelectorAll(disabled ? '.ds-pill-wrapper-value' : '.ds-pill-wrapper-removable')];
53
56
  const pillsWidth = pills.map(pill => pill === null || pill === void 0 ? void 0 : pill.offsetWidth);
54
57
  pillsWidth.forEach((pillWidth, idx) => {
55
58
  currentWidth += pillWidth;
56
59
 
57
- if (currentWidth + getGroupedPillWidth(multiSelectedValues.length - idx - 1) <= referenceWidth) {
60
+ if (currentWidth + getGroupedPillWidth(selectedValuesLength - idx - 1) <= referenceWidth) {
58
61
  lastPillFit = idx;
59
62
  }
60
63
  });
61
64
 
62
- if (!(multiSelectedValues.length > 0 && pillsToShow !== multiSelectedValues.length)) {
65
+ if (!(selectedValuesLength > 0 && pillsToShow !== selectedValuesLength)) {
63
66
  const nextPillsToShow = lastPillFit + 1;
64
67
 
65
68
  if (nextPillsToShow !== pillsToShow) {
@@ -69,7 +72,7 @@ const useGroupPills = () => {
69
72
 
70
73
  if (pillGroupRef.current) pillGroupRef.current.style.width = 'fit-content';
71
74
  }
72
- }, [selectedOptionsRef, innerRef, multiSelectedValues, pillsToShow, pillGroupRef, width, widthInput, disabled]);
75
+ }, [selectedOptionsRef, innerRef, multiSelectedValues, pillsToShow, pillGroupRef, width, widthInput, disabled, selectedValuesLength]);
73
76
  return pillsToShow || 1;
74
77
  };
75
78
 
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const DSComboBoxName = 'ds-combobox';
6
+ const DSComboboxSlots = {
7
+ CONTAINER: 'root',
8
+ INPUT_WRAPPER: 'input-wrapper',
9
+ INPUT: 'input'
10
+ };
11
+
12
+ exports.DSComboBoxName = DSComboBoxName;
13
+ exports.DSComboboxSlots = DSComboboxSlots;
@@ -51,7 +51,8 @@ const getFirstOption = (options, selectedValues, inputValue) => {
51
51
 
52
52
  for (let i = 0; i < options.length; i += 1) if (!['section', 'separator'].includes(options[i].type) && !options[i].disabled) {
53
53
  return options[i].dsId;
54
- }
54
+ } // list of disabled item results return ''
55
+
55
56
 
56
57
  return '';
57
58
  };
@@ -26,7 +26,7 @@ const useChangeHandlers = _ref => {
26
26
  relevantValues,
27
27
  destructuredValues,
28
28
  propsBasedOnType,
29
- DOMRefs
29
+ focusTrackers
30
30
  } = _ref;
31
31
  const {
32
32
  tempDateString,
@@ -60,8 +60,8 @@ const useChangeHandlers = _ref => {
60
60
  meridiem
61
61
  } = destructuredValues;
62
62
  const {
63
- firstSegmentRef
64
- } = DOMRefs;
63
+ trackFocusFirstSegment
64
+ } = focusTrackers;
65
65
  const getDateMetaInfo = React.useCallback(function () {
66
66
  let newDateString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
67
67
  let metaInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -91,7 +91,7 @@ const useChangeHandlers = _ref => {
91
91
  setTimeString(newTimeString);
92
92
  const newDateTimeString = "".concat(newDateString, " ").concat(newTimeString);
93
93
 
94
- const newMetaInfo = _objectSpread(_objectSpread(_objectSpread({}, getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
94
+ const newMetaInfo = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, metaInfo), getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
95
95
  newDateString,
96
96
  newTimeString,
97
97
  newDateTimeString
@@ -108,7 +108,7 @@ const useChangeHandlers = _ref => {
108
108
  setTempDateString(newDateString);
109
109
  const newDateTimeString = "".concat(newDateString, " ").concat(tempTimeString);
110
110
 
111
- const newMetaInfo = _objectSpread(_objectSpread(_objectSpread({}, getTimeMetaInfo(tempTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
111
+ const newMetaInfo = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, metaInfo), getTimeMetaInfo(tempTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
112
112
  newDateString,
113
113
  newTimeString: tempTimeString,
114
114
  newDateTimeString
@@ -124,7 +124,7 @@ const useChangeHandlers = _ref => {
124
124
  setTimeString(newTimeString);
125
125
  const newDateTimeString = "".concat(tempDateString, " ").concat(newTimeString);
126
126
 
127
- const newMetaInfo = _objectSpread(_objectSpread(_objectSpread({}, getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(tempDateString, metaInfo)), {}, {
127
+ const newMetaInfo = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, metaInfo), getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(tempDateString, metaInfo)), {}, {
128
128
  newDateTimeString,
129
129
  newDateString: tempDateString,
130
130
  newTimeString
@@ -241,12 +241,8 @@ const useChangeHandlers = _ref => {
241
241
  if (isDateTime) handleChangeComposedDateTimeString('__/__/____', '__:__ __', metaInfo);
242
242
  if (isDate) handleChangeComposedDateString('__/__/____', metaInfo);
243
243
  if (isTime) handleChangeComposedTimeString('__:__ __', metaInfo);
244
- setTimeout(() => {
245
- var _firstSegmentRef$curr;
246
-
247
- (_firstSegmentRef$curr = firstSegmentRef.current) === null || _firstSegmentRef$curr === void 0 ? void 0 : _firstSegmentRef$curr.focus();
248
- });
249
- }, [appOnDayChange, appOnHourChange, appOnMeridiemChange, appOnMinuteChange, appOnMonthChange, appOnYearChange, firstSegmentRef, handleChangeComposedDateString, handleChangeComposedDateTimeString, handleChangeComposedTimeString, isDate, isDateTime, isTime]);
244
+ trackFocusFirstSegment();
245
+ }, [appOnDayChange, appOnHourChange, appOnMeridiemChange, appOnMinuteChange, appOnMonthChange, appOnYearChange, handleChangeComposedDateString, handleChangeComposedDateTimeString, handleChangeComposedTimeString, isDate, isDateTime, isTime, trackFocusFirstSegment]);
250
246
  return React.useMemo(() => ({
251
247
  handleChangeComposedDateTimeString,
252
248
  handleChangeComposedDateString,
@@ -2,16 +2,16 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
- require('core-js/modules/web.dom-collections.iterator.js');
7
5
  require('core-js/modules/esnext.async-iterator.filter.js');
8
6
  require('core-js/modules/esnext.iterator.constructor.js');
9
7
  require('core-js/modules/esnext.iterator.filter.js');
10
8
  require('core-js/modules/esnext.async-iterator.for-each.js');
11
9
  require('core-js/modules/esnext.iterator.for-each.js');
10
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
12
11
  var React = require('react');
13
12
  var dsPropsHelpers = require('@elliemae/ds-props-helpers');
14
13
  var useGetPropsWithDefault = require('./useGetPropsWithDefault.js');
14
+ var useFocusTracker = require('./useFocusTracker.js');
15
15
  var useGetFlags = require('./useGetFlags.js');
16
16
  var useGetReferences = require('./useGetReferences.js');
17
17
  var useRelevantValueFromProps = require('./useRelevantValueFromProps.js');
@@ -36,6 +36,10 @@ const useControlledDateTimePicker = props => {
36
36
  const flags = useGetFlags.useGetFlags(propsWithDefaults);
37
37
  const DOMRefs = useGetReferences.useGetReferences(flags); // refs are used for "auto-advance" feature
38
38
 
39
+ const focusTrackers = useFocusTracker.useFocusTracker({
40
+ DOMRefs,
41
+ flags
42
+ });
39
43
  const relevantValues = useRelevantValueFromProps.useRelevantValueFromProps(propsWithDefaults);
40
44
  const propsBasedOnType = useGetPropsBasedOnType.useGetPropsBasedOnType(propsWithDefaults);
41
45
  const destructuredValues = useGetDestructuredValues.useGetDestructuredValues(_objectSpread(_objectSpread({}, propsBasedOnType), flags));
@@ -43,17 +47,18 @@ const useControlledDateTimePicker = props => {
43
47
  relevantValues,
44
48
  destructuredValues,
45
49
  propsBasedOnType,
46
- DOMRefs
50
+ DOMRefs,
51
+ focusTrackers
47
52
  });
48
53
  const globalKeyHandlers = useGlobalKeyHandlers.useGlobalKeyHandlers({
49
54
  changeHandlers,
50
55
  propsBasedOnType,
51
56
  DOMRefs,
52
- flags
57
+ flags,
58
+ focusTrackers
53
59
  }); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
54
60
 
55
61
  const dataAttrs = dsPropsHelpers.getDataProps(propsWithDefaults);
56
- const [latestInteractionRegion, setLatestInteractionRegion] = React.useState('');
57
62
  const {
58
63
  announcedDateValues,
59
64
  announcedTimeValues
@@ -64,13 +69,12 @@ const useControlledDateTimePicker = props => {
64
69
  isWithTimeInputs
65
70
  } = flags;
66
71
  const ariaCurrentValueForInputs = "current values: ".concat(isWithDateInputs ? "".concat(announcedDateValues) : '').concat(isDateTimeSelector ? ', ' : '').concat(isWithTimeInputs ? "".concat(announcedTimeValues) : '');
67
- const ctx = React__default["default"].useMemo(() => _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
72
+ const ctx = React__default["default"].useMemo(() => _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
68
73
  props: propsWithDefaults,
69
- latestInteractionRegion,
70
- setLatestInteractionRegion,
71
74
  ariaCurrentValueForInputs,
75
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
72
76
  dataAttrs
73
- }, flags), DOMRefs), relevantValues), propsBasedOnType), destructuredValues), changeHandlers), globalKeyHandlers), [propsWithDefaults, latestInteractionRegion, ariaCurrentValueForInputs, dataAttrs, flags, DOMRefs, relevantValues, propsBasedOnType, destructuredValues, changeHandlers, globalKeyHandlers]);
77
+ }, focusTrackers), flags), DOMRefs), relevantValues), propsBasedOnType), destructuredValues), changeHandlers), globalKeyHandlers), [propsWithDefaults, ariaCurrentValueForInputs, dataAttrs, focusTrackers, flags, DOMRefs, relevantValues, propsBasedOnType, destructuredValues, changeHandlers, globalKeyHandlers]);
74
78
  return ctx;
75
79
  };
76
80
 
@@ -0,0 +1,136 @@
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
+
8
+ const useFocusTracker = _ref => {
9
+ let {
10
+ DOMRefs,
11
+ flags
12
+ } = _ref;
13
+ const [latestInteractionRegion, setLatestInteractionRegion] = React.useState('');
14
+ const [currFocusDescriber, setCurrFocusDescriber] = React.useState('');
15
+ const {
16
+ firstSegment,
17
+ lastSegment
18
+ } = DOMRefs;
19
+ const {
20
+ isDateSelector,
21
+ isTimeSelector
22
+ } = flags;
23
+ const trackFocusPicker = React.useCallback(() => {
24
+ let picker = 'datetime-picker-icon';
25
+ if (isDateSelector) picker = 'date-picker-icon';
26
+ if (isTimeSelector) picker = 'time-picker-icon';
27
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
28
+ if (picker !== currFocusDescriber) setCurrFocusDescriber(picker);
29
+ }, [currFocusDescriber, isDateSelector, isTimeSelector, latestInteractionRegion]);
30
+ const trackFocusFirstSegment = React.useCallback(() => {
31
+ let region = 'date-inputs';
32
+ if (firstSegment === 'hour-input') region = 'time-inputs';
33
+ if (firstSegment === 'date-picker-icon') region = 'picker-icon';
34
+ if (firstSegment === 'time-picker-icon') region = 'picker-icon';
35
+ if (firstSegment === 'datetime-picker-icon') region = 'picker-icon';
36
+ if (region !== latestInteractionRegion) setLatestInteractionRegion(region);
37
+ if (firstSegment !== currFocusDescriber) setCurrFocusDescriber(firstSegment);
38
+ }, [currFocusDescriber, firstSegment, latestInteractionRegion]);
39
+ const trackFocusLastSegment = React.useCallback(() => {
40
+ let region = 'date-inputs';
41
+ if (lastSegment === 'meridiem-input') region = 'time-inputs';
42
+ if (lastSegment === 'clear-btn') region = 'clear-btn';
43
+ if (lastSegment === 'date-picker-icon') region = 'picker-icon';
44
+ if (lastSegment === 'time-picker-icon') region = 'picker-icon';
45
+ if (lastSegment === 'datetime-picker-icon') region = 'picker-icon';
46
+ if (region !== latestInteractionRegion) setLatestInteractionRegion(region);
47
+ if (lastSegment !== currFocusDescriber) setCurrFocusDescriber(lastSegment);
48
+ }, [currFocusDescriber, lastSegment, latestInteractionRegion]);
49
+ return React.useMemo(() => ({
50
+ latestInteractionRegion,
51
+ setLatestInteractionRegion,
52
+ currFocusDescriber,
53
+ setCurrFocusDescriber,
54
+ trackFocusResetter: () => {
55
+ if (latestInteractionRegion !== '') setLatestInteractionRegion('');
56
+ if (currFocusDescriber !== '') setCurrFocusDescriber('');
57
+ },
58
+ trackFocusMonthInput: () => {
59
+ if (latestInteractionRegion !== 'date-inputs') setLatestInteractionRegion('date-inputs');
60
+ if (currFocusDescriber !== 'month-input') setCurrFocusDescriber('month-input');
61
+ },
62
+ trackFocusDayInput: () => {
63
+ if (latestInteractionRegion !== 'date-inputs') setLatestInteractionRegion('date-inputs');
64
+ if (currFocusDescriber !== 'day-input') setCurrFocusDescriber('day-input');
65
+ },
66
+ trackFocusYearInput: () => {
67
+ if (latestInteractionRegion !== 'date-inputs') setLatestInteractionRegion('date-inputs');
68
+ if (currFocusDescriber !== 'year-input') setCurrFocusDescriber('year-input');
69
+ },
70
+ trackFocusHourInput: () => {
71
+ if (latestInteractionRegion !== 'time-inputs') setLatestInteractionRegion('time-inputs');
72
+ if (currFocusDescriber !== 'hour-input') setCurrFocusDescriber('hour-input');
73
+ },
74
+ trackFocusMinuteInput: () => {
75
+ if (latestInteractionRegion !== 'time-inputs') setLatestInteractionRegion('time-inputs');
76
+ if (currFocusDescriber !== 'minute-input') setCurrFocusDescriber('minute-input');
77
+ },
78
+ trackFocusMeridiemInput: () => {
79
+ if (latestInteractionRegion !== 'time-inputs') setLatestInteractionRegion('time-inputs');
80
+ if (currFocusDescriber !== 'meridiem-input') setCurrFocusDescriber('meridiem-input');
81
+ },
82
+ trackFocusClearBtn: () => {
83
+ if (latestInteractionRegion !== 'clear-btn') setLatestInteractionRegion('clear-btn');
84
+ if (currFocusDescriber !== 'clear-btn') setCurrFocusDescriber('clear-btn');
85
+ },
86
+ trackFocusDatePickerIcon: () => {
87
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
88
+ if (currFocusDescriber !== 'date-picker-icon') setCurrFocusDescriber('date-picker-icon');
89
+ },
90
+ trackFocusTimePickerIcon: () => {
91
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
92
+ if (currFocusDescriber !== 'time-picker-icon') setCurrFocusDescriber('time-picker-icon');
93
+ },
94
+ trackFocusDatetimePickerIcon: () => {
95
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
96
+ if (currFocusDescriber !== 'datetime-picker-icon') setCurrFocusDescriber('datetime-picker-icon');
97
+ },
98
+ trackFocusCalendarPrevMonth: () => {
99
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
100
+ if (currFocusDescriber !== 'calendar-prev-month') setCurrFocusDescriber('calendar-prev-month');
101
+ },
102
+ trackFocusCalendarNextMonth: () => {
103
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
104
+ if (currFocusDescriber !== 'calendar-next-month') setCurrFocusDescriber('calendar-next-month');
105
+ },
106
+ trackFocusCalendarPrevYear: () => {
107
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
108
+ if (currFocusDescriber !== 'calendar-prev-year') setCurrFocusDescriber('calendar-prev-year');
109
+ },
110
+ trackFocusCalendarNextYear: () => {
111
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
112
+ if (currFocusDescriber !== 'calendar-next-year') setCurrFocusDescriber('calendar-next-year');
113
+ },
114
+ trackFocusCalendarMetafocusedDay: () => {
115
+ if (latestInteractionRegion !== 'calendar-days') setLatestInteractionRegion('calendar-days');
116
+ if (currFocusDescriber !== 'calendar-metafocused-day') setCurrFocusDescriber('calendar-metafocused-day');
117
+ },
118
+ trackFocusTimewheelCurrHour: () => {
119
+ if (latestInteractionRegion !== 'timewheel') setLatestInteractionRegion('timewheel');
120
+ if (currFocusDescriber !== 'timewheel-curr-hour') setCurrFocusDescriber('timewheel-curr-hour');
121
+ },
122
+ trackFocusTimewheelCurrMinute: () => {
123
+ if (latestInteractionRegion !== 'timewheel') setLatestInteractionRegion('timewheel');
124
+ if (currFocusDescriber !== 'timewheel-curr-minute') setCurrFocusDescriber('timewheel-curr-minute');
125
+ },
126
+ trackFocusTimewheelCurrMeridiem: () => {
127
+ if (latestInteractionRegion !== 'timewheel') setLatestInteractionRegion('timewheel');
128
+ if (currFocusDescriber !== 'timewheel-curr-meridiem') setCurrFocusDescriber('timewheel-curr-meridiem');
129
+ },
130
+ trackFocusPicker,
131
+ trackFocusFirstSegment,
132
+ trackFocusLastSegment
133
+ }), [currFocusDescriber, latestInteractionRegion, trackFocusPicker, trackFocusFirstSegment, trackFocusLastSegment]);
134
+ };
135
+
136
+ exports.useFocusTracker = useFocusTracker;