@elliemae/ds-controlled-form 2.4.2-rc.1 → 2.4.2-rc.13

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 (272) hide show
  1. package/cjs/autocomplete/config/useAutocomplete.js +0 -1
  2. package/cjs/autocomplete/parts/A11yFocusedOption.js +46 -0
  3. package/cjs/autocomplete/parts/container/Container.js +36 -24
  4. package/cjs/autocomplete/parts/container/styled.js +2 -2
  5. package/cjs/autocomplete/parts/container/useKeyboardNavigation.js +2 -2
  6. package/cjs/autocomplete/parts/menu-list/MenuList.js +6 -6
  7. package/cjs/autocomplete/parts/menu-list/styled.js +2 -2
  8. package/cjs/autocomplete/parts/menu-list/useItemRenderer.js +1 -1
  9. package/cjs/autocomplete/parts/styled.js +2 -0
  10. package/cjs/autocomplete/utils/listHelper.js +1 -1
  11. package/cjs/checkbox/ControlledCheckbox.js +1 -1
  12. package/cjs/checkbox/config/useValidateProps.js +6 -3
  13. package/cjs/checkbox/react-desc-prop-types.js +2 -1
  14. package/cjs/checkbox/styles.js +73 -27
  15. package/cjs/checkbox/utils/styleHelpers.js +20 -2
  16. package/cjs/combobox/ComboBoxCTX.js +6 -3
  17. package/cjs/combobox/config/useComboBox.js +16 -6
  18. package/cjs/combobox/config/useCorrectOptions.js +1 -2
  19. package/cjs/combobox/parts/A11yFocusedOption.js +14 -6
  20. package/cjs/combobox/parts/A11ySelectedValues.js +2 -4
  21. package/cjs/combobox/parts/DropdownIndicator.js +15 -7
  22. package/cjs/combobox/parts/container/Container.js +11 -14
  23. package/cjs/combobox/parts/container/styled.js +11 -10
  24. package/cjs/combobox/parts/controls/Controls.js +19 -27
  25. package/cjs/combobox/parts/controls/styled.js +54 -22
  26. package/cjs/combobox/parts/controls/useOnPillsNavigation.js +7 -15
  27. package/cjs/combobox/parts/controls-input/ControlsInput.js +2 -2
  28. package/cjs/combobox/parts/controls-input/styled.js +41 -11
  29. package/cjs/combobox/parts/controls-input/useControlsInput.js +4 -7
  30. package/cjs/combobox/parts/controls-input/useKeyboardNavigation.js +19 -28
  31. package/cjs/combobox/parts/controls-input/useMaskedOnChange.js +7 -7
  32. package/cjs/combobox/parts/dropdown-indicator/DropdownIndicator.js +2 -2
  33. package/cjs/combobox/parts/header-list/HeaderList.js +1 -1
  34. package/cjs/combobox/parts/header-list/styled.js +39 -10
  35. package/cjs/combobox/parts/header-list/useHeaderListHandlers.js +7 -14
  36. package/cjs/combobox/parts/menu-list/MenuList.js +8 -6
  37. package/cjs/combobox/parts/menu-list/styled.js +38 -20
  38. package/cjs/combobox/parts/menu-list/useItemRenderer.js +18 -17
  39. package/cjs/combobox/parts/multi-selected-values-container/MultiSelectedValuesContainer.js +1 -1
  40. package/cjs/combobox/parts/multi-selected-values-container/RemovableSelectedValuePill.js +1 -3
  41. package/cjs/combobox/parts/multi-selected-values-container/useGroupPills.js +1 -2
  42. package/cjs/combobox/parts/styled.js +6 -7
  43. package/cjs/combobox/react-desc-prop-types.js +3 -2
  44. package/cjs/combobox/sharedTypes.js +2 -2
  45. package/cjs/combobox/utils/listHelper.js +14 -9
  46. package/cjs/date-range-picker/config/useRangePickerLogic.js +4 -8
  47. package/cjs/date-range-picker/parts/ControlledDateRangeCalendar.js +0 -2
  48. package/cjs/date-range-picker/parts/ControlledDateRangeFromDate.js +0 -2
  49. package/cjs/date-range-picker/parts/ControlledDateRangeToDate.js +0 -2
  50. package/cjs/date-time-picker/config/useChangeHandlers.js +11 -15
  51. package/cjs/date-time-picker/config/useControlledDateTimePicker.js +14 -10
  52. package/cjs/date-time-picker/config/useFocusTracker.js +136 -0
  53. package/cjs/date-time-picker/config/useGetDestructuredValues.js +6 -6
  54. package/cjs/date-time-picker/config/useGetPropsBasedOnType.js +1 -1
  55. package/cjs/date-time-picker/config/useGetReferences.js +39 -18
  56. package/cjs/date-time-picker/config/useGlobalKeyHandlers.js +8 -12
  57. package/cjs/date-time-picker/config/useRelevantValueFromProps.js +1 -1
  58. package/cjs/date-time-picker/config/useValidateProps.js +42 -11
  59. package/cjs/date-time-picker/parts/ClearButton/ClearButton.js +10 -2
  60. package/cjs/date-time-picker/parts/ClearButton/useClearButton.js +12 -25
  61. package/cjs/date-time-picker/parts/ControlledDateTimePickerContent.js +4 -7
  62. package/cjs/date-time-picker/parts/DateInputs/DDInput.js +8 -6
  63. package/cjs/date-time-picker/parts/DateInputs/DateInputs.js +9 -4
  64. package/cjs/date-time-picker/parts/DateInputs/MMInput.js +8 -6
  65. package/cjs/date-time-picker/parts/DateInputs/YYYYInput.js +8 -6
  66. package/cjs/date-time-picker/parts/DateInputs/useDateInputs.js +84 -113
  67. package/cjs/date-time-picker/parts/Pickers/Calendar/CalendarDaysList.js +4 -4
  68. package/cjs/date-time-picker/parts/Pickers/Calendar/CalendarHead.js +25 -7
  69. package/cjs/date-time-picker/parts/Pickers/Calendar/CalendarIconTrigger.js +1 -1
  70. package/cjs/date-time-picker/parts/Pickers/Calendar/Day.js +21 -17
  71. package/cjs/date-time-picker/parts/Pickers/Calendar/Styleds.js +44 -15
  72. package/cjs/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.js +13 -14
  73. package/cjs/date-time-picker/parts/Pickers/Calendar/useCurrentDisplayedMonthYearLogic.js +2 -1
  74. package/cjs/date-time-picker/parts/Pickers/Calendar/useFocusLogic.js +2 -39
  75. package/cjs/date-time-picker/parts/Pickers/Calendar/useKeyboardHandlers.js +40 -73
  76. package/cjs/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.js +18 -29
  77. package/cjs/date-time-picker/parts/Pickers/CalendarWithTimeWheel/CalendarWithTimeWheelIconTrigger.js +2 -1
  78. package/cjs/date-time-picker/parts/Pickers/CalendarWithTimeWheel/useConfigCalendarWithTimeWheelCTX.js +19 -27
  79. package/cjs/date-time-picker/parts/Pickers/TimeWheel/HoursList.js +15 -11
  80. package/cjs/date-time-picker/parts/Pickers/TimeWheel/MeridiemList.js +17 -13
  81. package/cjs/date-time-picker/parts/Pickers/TimeWheel/MinutesList.js +15 -11
  82. package/cjs/date-time-picker/parts/Pickers/TimeWheel/SecondsList.js +2 -2
  83. package/cjs/date-time-picker/parts/Pickers/TimeWheel/Styleds.js +47 -15
  84. package/cjs/date-time-picker/parts/Pickers/TimeWheel/TimeWheelContent.js +1 -1
  85. package/cjs/date-time-picker/parts/Pickers/TimeWheel/TimeWheelIconTrigger.js +1 -1
  86. package/cjs/date-time-picker/parts/Pickers/TimeWheel/useCurrentDisplayedWheelsLogic.js +3 -3
  87. package/cjs/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.js +36 -230
  88. package/cjs/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.js +12 -17
  89. package/cjs/date-time-picker/parts/Styleds.js +12 -6
  90. package/cjs/date-time-picker/parts/TimeInputs/HHInput.js +7 -3
  91. package/cjs/date-time-picker/parts/TimeInputs/MeridiemInput.js +8 -7
  92. package/cjs/date-time-picker/parts/TimeInputs/MinutesInput.js +8 -6
  93. package/cjs/date-time-picker/parts/TimeInputs/TimeInputs.js +11 -6
  94. package/cjs/date-time-picker/parts/TimeInputs/useTimeInputs.js +55 -97
  95. package/cjs/date-time-picker/utils/constants.js +0 -12
  96. package/cjs/date-time-picker/utils/dateHelpers.js +17 -34
  97. package/cjs/date-time-picker/utils/hooks/useGetStartingFocusedDay.js +38 -36
  98. package/cjs/date-time-picker/utils/hooks/useOnClickOutside.js +1 -3
  99. package/cjs/date-time-picker/utils/stringHelpers.js +5 -11
  100. package/cjs/input-group/InputGroup.js +8 -7
  101. package/cjs/input-group/exported-related/data-test-ids.js +12 -0
  102. package/cjs/input-group/exported-related/index.js +12 -0
  103. package/cjs/input-group/exported-related/theming.js +13 -0
  104. package/cjs/input-group/styled.js +90 -23
  105. package/cjs/large-text-input/DSControlledLargeTextInput.js +1 -1
  106. package/cjs/large-text-input/styles.js +27 -13
  107. package/cjs/mask-hook/hooks/useNumberMask.js +1 -5
  108. package/cjs/mask-hook/hooks/usePhoneMask.js +1 -4
  109. package/cjs/mask-hook/hooks/useRegExpMask.js +4 -7
  110. package/cjs/mask-hook/hooks/useSSNMask.js +1 -4
  111. package/cjs/mask-hook/hooks/useZipCodeMask.js +1 -4
  112. package/cjs/mask-hook/utils/addSpecialCharacters.js +0 -1
  113. package/cjs/mask-hook/utils/flatStringArray.js +0 -1
  114. package/cjs/text-input/config/useInputText.js +0 -1
  115. package/cjs/text-input/styled/borders.js +18 -11
  116. package/cjs/text-input/styled/components.js +49 -10
  117. package/cjs/toggle/ControlledToggle.js +2 -3
  118. package/cjs/toggle/styles.js +7 -5
  119. package/esm/autocomplete/config/useAutocomplete.js +0 -1
  120. package/esm/autocomplete/parts/A11yFocusedOption.js +36 -0
  121. package/esm/autocomplete/parts/container/Container.js +39 -27
  122. package/esm/autocomplete/parts/container/styled.js +2 -2
  123. package/esm/autocomplete/parts/container/useKeyboardNavigation.js +2 -2
  124. package/esm/autocomplete/parts/menu-list/MenuList.js +7 -7
  125. package/esm/autocomplete/parts/menu-list/styled.js +2 -2
  126. package/esm/autocomplete/parts/menu-list/useItemRenderer.js +1 -1
  127. package/esm/autocomplete/parts/styled.js +1 -0
  128. package/esm/autocomplete/utils/listHelper.js +1 -1
  129. package/esm/checkbox/ControlledCheckbox.js +2 -2
  130. package/esm/checkbox/config/useValidateProps.js +6 -3
  131. package/esm/checkbox/react-desc-prop-types.js +2 -1
  132. package/esm/checkbox/styles.js +73 -24
  133. package/esm/checkbox/utils/styleHelpers.js +20 -2
  134. package/esm/combobox/ComboBoxCTX.js +6 -3
  135. package/esm/combobox/config/useComboBox.js +16 -6
  136. package/esm/combobox/config/useCorrectOptions.js +1 -2
  137. package/esm/combobox/parts/A11yFocusedOption.js +15 -7
  138. package/esm/combobox/parts/A11ySelectedValues.js +2 -4
  139. package/esm/combobox/parts/DropdownIndicator.js +15 -6
  140. package/esm/combobox/parts/container/Container.js +11 -14
  141. package/esm/combobox/parts/container/styled.js +11 -6
  142. package/esm/combobox/parts/controls/Controls.js +19 -27
  143. package/esm/combobox/parts/controls/styled.js +54 -18
  144. package/esm/combobox/parts/controls/useOnPillsNavigation.js +7 -15
  145. package/esm/combobox/parts/controls-input/ControlsInput.js +2 -2
  146. package/esm/combobox/parts/controls-input/styled.js +41 -7
  147. package/esm/combobox/parts/controls-input/useControlsInput.js +4 -7
  148. package/esm/combobox/parts/controls-input/useKeyboardNavigation.js +20 -29
  149. package/esm/combobox/parts/controls-input/useMaskedOnChange.js +7 -7
  150. package/esm/combobox/parts/dropdown-indicator/DropdownIndicator.js +2 -2
  151. package/esm/combobox/parts/header-list/HeaderList.js +1 -1
  152. package/esm/combobox/parts/header-list/styled.js +40 -7
  153. package/esm/combobox/parts/header-list/useHeaderListHandlers.js +7 -14
  154. package/esm/combobox/parts/menu-list/MenuList.js +8 -6
  155. package/esm/combobox/parts/menu-list/styled.js +38 -17
  156. package/esm/combobox/parts/menu-list/useItemRenderer.js +20 -19
  157. package/esm/combobox/parts/multi-selected-values-container/MultiSelectedValuesContainer.js +1 -1
  158. package/esm/combobox/parts/multi-selected-values-container/RemovableSelectedValuePill.js +1 -3
  159. package/esm/combobox/parts/multi-selected-values-container/useGroupPills.js +1 -2
  160. package/esm/combobox/parts/styled.js +6 -3
  161. package/esm/combobox/react-desc-prop-types.js +3 -2
  162. package/esm/combobox/sharedTypes.js +2 -2
  163. package/esm/combobox/utils/listHelper.js +14 -10
  164. package/esm/date-range-picker/config/useRangePickerLogic.js +3 -7
  165. package/esm/date-range-picker/parts/ControlledDateRangeCalendar.js +0 -2
  166. package/esm/date-range-picker/parts/ControlledDateRangeFromDate.js +0 -2
  167. package/esm/date-range-picker/parts/ControlledDateRangeToDate.js +0 -2
  168. package/esm/date-time-picker/config/useChangeHandlers.js +11 -15
  169. package/esm/date-time-picker/config/useControlledDateTimePicker.js +14 -10
  170. package/esm/date-time-picker/config/useFocusTracker.js +132 -0
  171. package/esm/date-time-picker/config/useGetDestructuredValues.js +6 -6
  172. package/esm/date-time-picker/config/useGetPropsBasedOnType.js +1 -1
  173. package/esm/date-time-picker/config/useGetReferences.js +40 -19
  174. package/esm/date-time-picker/config/useGlobalKeyHandlers.js +8 -12
  175. package/esm/date-time-picker/config/useRelevantValueFromProps.js +1 -1
  176. package/esm/date-time-picker/config/useValidateProps.js +42 -11
  177. package/esm/date-time-picker/parts/ClearButton/ClearButton.js +10 -2
  178. package/esm/date-time-picker/parts/ClearButton/useClearButton.js +12 -25
  179. package/esm/date-time-picker/parts/ControlledDateTimePickerContent.js +4 -7
  180. package/esm/date-time-picker/parts/DateInputs/DDInput.js +8 -6
  181. package/esm/date-time-picker/parts/DateInputs/DateInputs.js +9 -4
  182. package/esm/date-time-picker/parts/DateInputs/MMInput.js +8 -6
  183. package/esm/date-time-picker/parts/DateInputs/YYYYInput.js +8 -6
  184. package/esm/date-time-picker/parts/DateInputs/useDateInputs.js +85 -114
  185. package/esm/date-time-picker/parts/Pickers/Calendar/CalendarDaysList.js +4 -4
  186. package/esm/date-time-picker/parts/Pickers/Calendar/CalendarHead.js +26 -8
  187. package/esm/date-time-picker/parts/Pickers/Calendar/CalendarIconTrigger.js +1 -1
  188. package/esm/date-time-picker/parts/Pickers/Calendar/Day.js +21 -17
  189. package/esm/date-time-picker/parts/Pickers/Calendar/Styleds.js +44 -14
  190. package/esm/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.js +12 -13
  191. package/esm/date-time-picker/parts/Pickers/Calendar/useCurrentDisplayedMonthYearLogic.js +2 -1
  192. package/esm/date-time-picker/parts/Pickers/Calendar/useFocusLogic.js +3 -40
  193. package/esm/date-time-picker/parts/Pickers/Calendar/useKeyboardHandlers.js +40 -73
  194. package/esm/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.js +18 -29
  195. package/esm/date-time-picker/parts/Pickers/CalendarWithTimeWheel/CalendarWithTimeWheelIconTrigger.js +2 -1
  196. package/esm/date-time-picker/parts/Pickers/CalendarWithTimeWheel/useConfigCalendarWithTimeWheelCTX.js +19 -27
  197. package/esm/date-time-picker/parts/Pickers/TimeWheel/HoursList.js +16 -12
  198. package/esm/date-time-picker/parts/Pickers/TimeWheel/MeridiemList.js +18 -14
  199. package/esm/date-time-picker/parts/Pickers/TimeWheel/MinutesList.js +16 -12
  200. package/esm/date-time-picker/parts/Pickers/TimeWheel/SecondsList.js +2 -2
  201. package/esm/date-time-picker/parts/Pickers/TimeWheel/Styleds.js +47 -14
  202. package/esm/date-time-picker/parts/Pickers/TimeWheel/TimeWheelContent.js +1 -1
  203. package/esm/date-time-picker/parts/Pickers/TimeWheel/TimeWheelIconTrigger.js +1 -1
  204. package/esm/date-time-picker/parts/Pickers/TimeWheel/useCurrentDisplayedWheelsLogic.js +3 -3
  205. package/esm/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.js +36 -230
  206. package/esm/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.js +12 -17
  207. package/esm/date-time-picker/parts/Styleds.js +12 -6
  208. package/esm/date-time-picker/parts/TimeInputs/HHInput.js +7 -3
  209. package/esm/date-time-picker/parts/TimeInputs/MeridiemInput.js +8 -7
  210. package/esm/date-time-picker/parts/TimeInputs/MinutesInput.js +8 -6
  211. package/esm/date-time-picker/parts/TimeInputs/TimeInputs.js +11 -6
  212. package/esm/date-time-picker/parts/TimeInputs/useTimeInputs.js +55 -97
  213. package/esm/date-time-picker/utils/constants.js +1 -7
  214. package/esm/date-time-picker/utils/dateHelpers.js +17 -34
  215. package/esm/date-time-picker/utils/hooks/useGetStartingFocusedDay.js +38 -36
  216. package/esm/date-time-picker/utils/hooks/useOnClickOutside.js +1 -3
  217. package/esm/date-time-picker/utils/stringHelpers.js +5 -11
  218. package/esm/input-group/InputGroup.js +5 -4
  219. package/esm/input-group/exported-related/data-test-ids.js +8 -0
  220. package/esm/input-group/exported-related/index.js +2 -0
  221. package/esm/input-group/exported-related/theming.js +8 -0
  222. package/esm/input-group/styled.js +89 -18
  223. package/esm/large-text-input/DSControlledLargeTextInput.js +1 -1
  224. package/esm/large-text-input/styles.js +27 -9
  225. package/esm/mask-hook/hooks/useNumberMask.js +1 -5
  226. package/esm/mask-hook/hooks/usePhoneMask.js +1 -4
  227. package/esm/mask-hook/hooks/useRegExpMask.js +4 -7
  228. package/esm/mask-hook/hooks/useSSNMask.js +1 -4
  229. package/esm/mask-hook/hooks/useZipCodeMask.js +1 -4
  230. package/esm/mask-hook/utils/addSpecialCharacters.js +0 -1
  231. package/esm/mask-hook/utils/flatStringArray.js +0 -1
  232. package/esm/text-input/config/useInputText.js +0 -1
  233. package/esm/text-input/styled/borders.js +18 -7
  234. package/esm/text-input/styled/components.js +49 -6
  235. package/esm/toggle/ControlledToggle.js +0 -1
  236. package/esm/toggle/styles.js +7 -5
  237. package/package.json +39 -15
  238. package/types/autocomplete/parts/A11yFocusedOption.d.ts +5 -0
  239. package/types/autocomplete/parts/container/styled.d.ts +1 -1
  240. package/types/autocomplete/parts/styled.d.ts +0 -0
  241. package/types/autocomplete/utils/listHelper.d.ts +5 -5
  242. package/types/checkbox/react-desc-prop-types.d.ts +1 -1
  243. package/types/checkbox/styles.d.ts +1 -0
  244. package/types/combobox/parts/menu-list/styled.d.ts +1 -0
  245. package/types/combobox/react-desc-prop-types.d.ts +8 -6
  246. package/types/combobox/sharedTypes.d.ts +3 -2
  247. package/types/combobox/utils/listHelper.d.ts +1 -0
  248. package/types/date-time-picker/config/useChangeHandlers.d.ts +3 -1
  249. package/types/date-time-picker/config/useControlledDateTimePicker.d.ts +2 -5
  250. package/types/date-time-picker/config/useFocusTracker.d.ts +38 -0
  251. package/types/date-time-picker/config/useGetPropsBasedOnType.d.ts +6 -6
  252. package/types/date-time-picker/config/useGetReferences.d.ts +30 -36
  253. package/types/date-time-picker/config/useGlobalKeyHandlers.d.ts +3 -1
  254. package/types/date-time-picker/parts/DateInputs/DDInput.d.ts +2 -1
  255. package/types/date-time-picker/parts/DateInputs/MMInput.d.ts +2 -1
  256. package/types/date-time-picker/parts/DateInputs/YYYYInput.d.ts +2 -1
  257. package/types/date-time-picker/parts/Pickers/Calendar/useConfigCalendarCTX.d.ts +14 -0
  258. package/types/date-time-picker/parts/Pickers/Calendar/useFocusLogic.d.ts +1 -2
  259. package/types/date-time-picker/parts/Pickers/Calendar/usePopperTriggerLogic.d.ts +19 -0
  260. package/types/date-time-picker/parts/Pickers/TimeWheel/useKeyboardHandlers.d.ts +0 -6
  261. package/types/date-time-picker/parts/Pickers/TimeWheel/usePopperTriggerLogic.d.ts +14 -0
  262. package/types/date-time-picker/parts/TimeInputs/HHInput.d.ts +2 -1
  263. package/types/date-time-picker/parts/TimeInputs/MeridiemInput.d.ts +2 -1
  264. package/types/date-time-picker/parts/TimeInputs/MinutesInput.d.ts +2 -1
  265. package/types/date-time-picker/propTypes.d.ts +117 -0
  266. package/types/date-time-picker/sharedTypes.d.ts +1 -1
  267. package/types/date-time-picker/utils/constants.d.ts +0 -6
  268. package/types/input-group/exported-related/data-test-ids.d.ts +6 -0
  269. package/types/input-group/exported-related/index.d.ts +2 -0
  270. package/types/input-group/exported-related/theming.d.ts +6 -0
  271. package/types/input-group/styled.d.ts +4 -7
  272. package/types/text-input/config/useInputText.d.ts +4 -4
@@ -18,7 +18,7 @@ const useChangeHandlers = _ref => {
18
18
  relevantValues,
19
19
  destructuredValues,
20
20
  propsBasedOnType,
21
- DOMRefs
21
+ focusTrackers
22
22
  } = _ref;
23
23
  const {
24
24
  tempDateString,
@@ -52,8 +52,8 @@ const useChangeHandlers = _ref => {
52
52
  meridiem
53
53
  } = destructuredValues;
54
54
  const {
55
- firstSegmentRef
56
- } = DOMRefs;
55
+ trackFocusFirstSegment
56
+ } = focusTrackers;
57
57
  const getDateMetaInfo = useCallback(function () {
58
58
  let newDateString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
59
59
  let metaInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -81,9 +81,9 @@ const useChangeHandlers = _ref => {
81
81
  appOnTimeChange(appTimeString, metaInfo); // don't do this on useEffect to avoid complete chaos
82
82
 
83
83
  setTimeString(newTimeString);
84
- const newDateTimeString = "".concat(newDateString, " ").concat(newTimeString);
84
+ const newDateTimeString = `${newDateString} ${newTimeString}`;
85
85
 
86
- const newMetaInfo = _objectSpread(_objectSpread(_objectSpread({}, getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
86
+ const newMetaInfo = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, metaInfo), getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
87
87
  newDateString,
88
88
  newTimeString,
89
89
  newDateTimeString
@@ -98,9 +98,9 @@ const useChangeHandlers = _ref => {
98
98
  appOnDateChange(appDateString, metaInfo); // don't do this on useEffect to avoid complete chaos
99
99
 
100
100
  setTempDateString(newDateString);
101
- const newDateTimeString = "".concat(newDateString, " ").concat(tempTimeString);
101
+ const newDateTimeString = `${newDateString} ${tempTimeString}`;
102
102
 
103
- const newMetaInfo = _objectSpread(_objectSpread(_objectSpread({}, getTimeMetaInfo(tempTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
103
+ const newMetaInfo = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, metaInfo), getTimeMetaInfo(tempTimeString, metaInfo)), getDateMetaInfo(newDateString, metaInfo)), {}, {
104
104
  newDateString,
105
105
  newTimeString: tempTimeString,
106
106
  newDateTimeString
@@ -114,9 +114,9 @@ const useChangeHandlers = _ref => {
114
114
  appOnTimeChange(appTimeString, metaInfo); // don't do this on useEffect to avoid complete chaos
115
115
 
116
116
  setTimeString(newTimeString);
117
- const newDateTimeString = "".concat(tempDateString, " ").concat(newTimeString);
117
+ const newDateTimeString = `${tempDateString} ${newTimeString}`;
118
118
 
119
- const newMetaInfo = _objectSpread(_objectSpread(_objectSpread({}, getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(tempDateString, metaInfo)), {}, {
119
+ const newMetaInfo = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, metaInfo), getTimeMetaInfo(newTimeString, metaInfo)), getDateMetaInfo(tempDateString, metaInfo)), {}, {
120
120
  newDateTimeString,
121
121
  newDateString: tempDateString,
122
122
  newTimeString
@@ -233,12 +233,8 @@ const useChangeHandlers = _ref => {
233
233
  if (isDateTime) handleChangeComposedDateTimeString('__/__/____', '__:__ __', metaInfo);
234
234
  if (isDate) handleChangeComposedDateString('__/__/____', metaInfo);
235
235
  if (isTime) handleChangeComposedTimeString('__:__ __', metaInfo);
236
- setTimeout(() => {
237
- var _firstSegmentRef$curr;
238
-
239
- (_firstSegmentRef$curr = firstSegmentRef.current) === null || _firstSegmentRef$curr === void 0 ? void 0 : _firstSegmentRef$curr.focus();
240
- });
241
- }, [appOnDayChange, appOnHourChange, appOnMeridiemChange, appOnMinuteChange, appOnMonthChange, appOnYearChange, firstSegmentRef, handleChangeComposedDateString, handleChangeComposedDateTimeString, handleChangeComposedTimeString, isDate, isDateTime, isTime]);
236
+ trackFocusFirstSegment();
237
+ }, [appOnDayChange, appOnHourChange, appOnMeridiemChange, appOnMinuteChange, appOnMonthChange, appOnYearChange, handleChangeComposedDateString, handleChangeComposedDateTimeString, handleChangeComposedTimeString, isDate, isDateTime, isTime, trackFocusFirstSegment]);
242
238
  return useMemo(() => ({
243
239
  handleChangeComposedDateTimeString,
244
240
  handleChangeComposedDateString,
@@ -4,10 +4,10 @@ import 'core-js/modules/esnext.iterator.filter.js';
4
4
  import 'core-js/modules/esnext.async-iterator.for-each.js';
5
5
  import 'core-js/modules/esnext.iterator.for-each.js';
6
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
- import 'core-js/modules/web.dom-collections.iterator.js';
8
- import React, { useState } from 'react';
7
+ import React from 'react';
9
8
  import { getDataProps } from '@elliemae/ds-props-helpers';
10
9
  import { useGetDatePickerWithDefaultsProps } from './useGetPropsWithDefault.js';
10
+ import { useFocusTracker } from './useFocusTracker.js';
11
11
  import { useGetFlags } from './useGetFlags.js';
12
12
  import { useGetReferences } from './useGetReferences.js';
13
13
  import { useRelevantValueFromProps } from './useRelevantValueFromProps.js';
@@ -27,6 +27,10 @@ const useControlledDateTimePicker = props => {
27
27
  const flags = useGetFlags(propsWithDefaults);
28
28
  const DOMRefs = useGetReferences(flags); // refs are used for "auto-advance" feature
29
29
 
30
+ const focusTrackers = useFocusTracker({
31
+ DOMRefs,
32
+ flags
33
+ });
30
34
  const relevantValues = useRelevantValueFromProps(propsWithDefaults);
31
35
  const propsBasedOnType = useGetPropsBasedOnType(propsWithDefaults);
32
36
  const destructuredValues = useGetDestructuredValues(_objectSpread(_objectSpread({}, propsBasedOnType), flags));
@@ -34,17 +38,18 @@ const useControlledDateTimePicker = props => {
34
38
  relevantValues,
35
39
  destructuredValues,
36
40
  propsBasedOnType,
37
- DOMRefs
41
+ DOMRefs,
42
+ focusTrackers
38
43
  });
39
44
  const globalKeyHandlers = useGlobalKeyHandlers({
40
45
  changeHandlers,
41
46
  propsBasedOnType,
42
47
  DOMRefs,
43
- flags
48
+ flags,
49
+ focusTrackers
44
50
  }); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
45
51
 
46
52
  const dataAttrs = getDataProps(propsWithDefaults);
47
- const [latestInteractionRegion, setLatestInteractionRegion] = useState('');
48
53
  const {
49
54
  announcedDateValues,
50
55
  announcedTimeValues
@@ -54,14 +59,13 @@ const useControlledDateTimePicker = props => {
54
59
  isDateTimeSelector,
55
60
  isWithTimeInputs
56
61
  } = flags;
57
- const ariaCurrentValueForInputs = "current values: ".concat(isWithDateInputs ? "".concat(announcedDateValues) : '').concat(isDateTimeSelector ? ', ' : '').concat(isWithTimeInputs ? "".concat(announcedTimeValues) : '');
58
- const ctx = React.useMemo(() => _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
62
+ const ariaCurrentValueForInputs = `current values: ${isWithDateInputs ? `${announcedDateValues}` : ''}${isDateTimeSelector ? ', ' : ''}${isWithTimeInputs ? `${announcedTimeValues}` : ''}`;
63
+ const ctx = React.useMemo(() => _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
59
64
  props: propsWithDefaults,
60
- latestInteractionRegion,
61
- setLatestInteractionRegion,
62
65
  ariaCurrentValueForInputs,
66
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
63
67
  dataAttrs
64
- }, flags), DOMRefs), relevantValues), propsBasedOnType), destructuredValues), changeHandlers), globalKeyHandlers), [propsWithDefaults, latestInteractionRegion, ariaCurrentValueForInputs, dataAttrs, flags, DOMRefs, relevantValues, propsBasedOnType, destructuredValues, changeHandlers, globalKeyHandlers]);
68
+ }, focusTrackers), flags), DOMRefs), relevantValues), propsBasedOnType), destructuredValues), changeHandlers), globalKeyHandlers), [propsWithDefaults, ariaCurrentValueForInputs, dataAttrs, focusTrackers, flags, DOMRefs, relevantValues, propsBasedOnType, destructuredValues, changeHandlers, globalKeyHandlers]);
65
69
  return ctx;
66
70
  };
67
71
 
@@ -0,0 +1,132 @@
1
+ import { useState, useCallback, useMemo } from 'react';
2
+
3
+ /* eslint-disable max-lines */
4
+ const useFocusTracker = _ref => {
5
+ let {
6
+ DOMRefs,
7
+ flags
8
+ } = _ref;
9
+ const [latestInteractionRegion, setLatestInteractionRegion] = useState('');
10
+ const [currFocusDescriber, setCurrFocusDescriber] = useState('');
11
+ const {
12
+ firstSegment,
13
+ lastSegment
14
+ } = DOMRefs;
15
+ const {
16
+ isDateSelector,
17
+ isTimeSelector
18
+ } = flags;
19
+ const trackFocusPicker = useCallback(() => {
20
+ let picker = 'datetime-picker-icon';
21
+ if (isDateSelector) picker = 'date-picker-icon';
22
+ if (isTimeSelector) picker = 'time-picker-icon';
23
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
24
+ if (picker !== currFocusDescriber) setCurrFocusDescriber(picker);
25
+ }, [currFocusDescriber, isDateSelector, isTimeSelector, latestInteractionRegion]);
26
+ const trackFocusFirstSegment = useCallback(() => {
27
+ let region = 'date-inputs';
28
+ if (firstSegment === 'hour-input') region = 'time-inputs';
29
+ if (firstSegment === 'date-picker-icon') region = 'picker-icon';
30
+ if (firstSegment === 'time-picker-icon') region = 'picker-icon';
31
+ if (firstSegment === 'datetime-picker-icon') region = 'picker-icon';
32
+ if (region !== latestInteractionRegion) setLatestInteractionRegion(region);
33
+ if (firstSegment !== currFocusDescriber) setCurrFocusDescriber(firstSegment);
34
+ }, [currFocusDescriber, firstSegment, latestInteractionRegion]);
35
+ const trackFocusLastSegment = useCallback(() => {
36
+ let region = 'date-inputs';
37
+ if (lastSegment === 'meridiem-input') region = 'time-inputs';
38
+ if (lastSegment === 'clear-btn') region = 'clear-btn';
39
+ if (lastSegment === 'date-picker-icon') region = 'picker-icon';
40
+ if (lastSegment === 'time-picker-icon') region = 'picker-icon';
41
+ if (lastSegment === 'datetime-picker-icon') region = 'picker-icon';
42
+ if (region !== latestInteractionRegion) setLatestInteractionRegion(region);
43
+ if (lastSegment !== currFocusDescriber) setCurrFocusDescriber(lastSegment);
44
+ }, [currFocusDescriber, lastSegment, latestInteractionRegion]);
45
+ return useMemo(() => ({
46
+ latestInteractionRegion,
47
+ setLatestInteractionRegion,
48
+ currFocusDescriber,
49
+ setCurrFocusDescriber,
50
+ trackFocusResetter: () => {
51
+ if (latestInteractionRegion !== '') setLatestInteractionRegion('');
52
+ if (currFocusDescriber !== '') setCurrFocusDescriber('');
53
+ },
54
+ trackFocusMonthInput: () => {
55
+ if (latestInteractionRegion !== 'date-inputs') setLatestInteractionRegion('date-inputs');
56
+ if (currFocusDescriber !== 'month-input') setCurrFocusDescriber('month-input');
57
+ },
58
+ trackFocusDayInput: () => {
59
+ if (latestInteractionRegion !== 'date-inputs') setLatestInteractionRegion('date-inputs');
60
+ if (currFocusDescriber !== 'day-input') setCurrFocusDescriber('day-input');
61
+ },
62
+ trackFocusYearInput: () => {
63
+ if (latestInteractionRegion !== 'date-inputs') setLatestInteractionRegion('date-inputs');
64
+ if (currFocusDescriber !== 'year-input') setCurrFocusDescriber('year-input');
65
+ },
66
+ trackFocusHourInput: () => {
67
+ if (latestInteractionRegion !== 'time-inputs') setLatestInteractionRegion('time-inputs');
68
+ if (currFocusDescriber !== 'hour-input') setCurrFocusDescriber('hour-input');
69
+ },
70
+ trackFocusMinuteInput: () => {
71
+ if (latestInteractionRegion !== 'time-inputs') setLatestInteractionRegion('time-inputs');
72
+ if (currFocusDescriber !== 'minute-input') setCurrFocusDescriber('minute-input');
73
+ },
74
+ trackFocusMeridiemInput: () => {
75
+ if (latestInteractionRegion !== 'time-inputs') setLatestInteractionRegion('time-inputs');
76
+ if (currFocusDescriber !== 'meridiem-input') setCurrFocusDescriber('meridiem-input');
77
+ },
78
+ trackFocusClearBtn: () => {
79
+ if (latestInteractionRegion !== 'clear-btn') setLatestInteractionRegion('clear-btn');
80
+ if (currFocusDescriber !== 'clear-btn') setCurrFocusDescriber('clear-btn');
81
+ },
82
+ trackFocusDatePickerIcon: () => {
83
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
84
+ if (currFocusDescriber !== 'date-picker-icon') setCurrFocusDescriber('date-picker-icon');
85
+ },
86
+ trackFocusTimePickerIcon: () => {
87
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
88
+ if (currFocusDescriber !== 'time-picker-icon') setCurrFocusDescriber('time-picker-icon');
89
+ },
90
+ trackFocusDatetimePickerIcon: () => {
91
+ if (latestInteractionRegion !== 'picker-icon') setLatestInteractionRegion('picker-icon');
92
+ if (currFocusDescriber !== 'datetime-picker-icon') setCurrFocusDescriber('datetime-picker-icon');
93
+ },
94
+ trackFocusCalendarPrevMonth: () => {
95
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
96
+ if (currFocusDescriber !== 'calendar-prev-month') setCurrFocusDescriber('calendar-prev-month');
97
+ },
98
+ trackFocusCalendarNextMonth: () => {
99
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
100
+ if (currFocusDescriber !== 'calendar-next-month') setCurrFocusDescriber('calendar-next-month');
101
+ },
102
+ trackFocusCalendarPrevYear: () => {
103
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
104
+ if (currFocusDescriber !== 'calendar-prev-year') setCurrFocusDescriber('calendar-prev-year');
105
+ },
106
+ trackFocusCalendarNextYear: () => {
107
+ if (latestInteractionRegion !== 'calendar-head') setLatestInteractionRegion('calendar-head');
108
+ if (currFocusDescriber !== 'calendar-next-year') setCurrFocusDescriber('calendar-next-year');
109
+ },
110
+ trackFocusCalendarMetafocusedDay: () => {
111
+ if (latestInteractionRegion !== 'calendar-days') setLatestInteractionRegion('calendar-days');
112
+ if (currFocusDescriber !== 'calendar-metafocused-day') setCurrFocusDescriber('calendar-metafocused-day');
113
+ },
114
+ trackFocusTimewheelCurrHour: () => {
115
+ if (latestInteractionRegion !== 'timewheel') setLatestInteractionRegion('timewheel');
116
+ if (currFocusDescriber !== 'timewheel-curr-hour') setCurrFocusDescriber('timewheel-curr-hour');
117
+ },
118
+ trackFocusTimewheelCurrMinute: () => {
119
+ if (latestInteractionRegion !== 'timewheel') setLatestInteractionRegion('timewheel');
120
+ if (currFocusDescriber !== 'timewheel-curr-minute') setCurrFocusDescriber('timewheel-curr-minute');
121
+ },
122
+ trackFocusTimewheelCurrMeridiem: () => {
123
+ if (latestInteractionRegion !== 'timewheel') setLatestInteractionRegion('timewheel');
124
+ if (currFocusDescriber !== 'timewheel-curr-meridiem') setCurrFocusDescriber('timewheel-curr-meridiem');
125
+ },
126
+ trackFocusPicker,
127
+ trackFocusFirstSegment,
128
+ trackFocusLastSegment
129
+ }), [currFocusDescriber, latestInteractionRegion, trackFocusPicker, trackFocusFirstSegment, trackFocusLastSegment]);
130
+ };
131
+
132
+ export { useFocusTracker };
@@ -34,8 +34,8 @@ const useGetDestructuredDateValues = _ref => {
34
34
  const yearNum = convertToPositiveNumberIfPossible(year);
35
35
  const announcedMonth = monthNum !== -1 ? monthNames[monthNum - 1] : 'empty month';
36
36
  const announcedDay = dayNum !== -1 ? announcableCardinalDays[dayNum] : 'empty day';
37
- const announcedYear = yearNum !== -1 ? fillStringWithPlaceHolders("".concat(yearNum), 4, '0') : 'empty year';
38
- const announcedDateValues = "".concat(announcedMonth, ", ").concat(announcedDay, ", ").concat(announcedYear);
37
+ const announcedYear = yearNum !== -1 ? fillStringWithPlaceHolders(`${yearNum}`, 4, '0') : 'empty year';
38
+ const announcedDateValues = `${announcedMonth}, ${announcedDay}, ${announcedYear}`;
39
39
  return useMemo(() => ({
40
40
  month,
41
41
  day,
@@ -69,12 +69,12 @@ const useGetDestructuredTimeValues = _ref2 => {
69
69
  const hoursNum = convertToPositiveNumberIfPossible(hours);
70
70
  const minutesNum = convertToPositiveNumberIfPossible(minutes); // 01 -> 1 ~ 09 -> 9 || 1_ -> 1 ~ 9_ -> 9 || empty...
71
71
 
72
- const announcedHours = hoursNum !== -1 ? "".concat(hoursNum) : 'empty hours'; // 01 -> 1 ~ 09 -> 9 || 1_ -> 1 ~ 9_ -> 9 || empty...
72
+ const announcedHours = hoursNum !== -1 ? `${hoursNum}` : 'empty hours'; // 01 -> 1 ~ 09 -> 9 || 1_ -> 1 ~ 9_ -> 9 || empty...
73
73
 
74
- const announcedMinutes = minutesNum !== -1 ? "".concat(minutesNum) : 'empty minutes';
74
+ const announcedMinutes = minutesNum !== -1 ? `${minutesNum}` : 'empty minutes';
75
75
  const announcedMeridiem = // eslint-disable-next-line no-nested-ternary
76
- meridiem === 'PM' ? "post meridiem" : meridiem === 'AM' ? 'ante meridiem' : 'empty meriediem';
77
- const announcedTimeValues = "".concat(announcedHours, ", ").concat(announcedMinutes, ", ").concat(announcedMeridiem);
76
+ meridiem === 'PM' ? `post meridiem` : meridiem === 'AM' ? 'ante meridiem' : 'empty meriediem';
77
+ const announcedTimeValues = `${announcedHours}, ${announcedMinutes}, ${announcedMeridiem}`;
78
78
  return useMemo(() => ({
79
79
  hours,
80
80
  minutes,
@@ -23,7 +23,7 @@ const useGetPropsBasedOnType = propsWithDefaults => {
23
23
  const appOnMonthChange = (isDateTime || isDate) && propsWithDefaults.onMonthChange ? propsWithDefaults.onMonthChange : noop;
24
24
  const appOnDayChange = (isDateTime || isDate) && propsWithDefaults.onDayChange ? propsWithDefaults.onDayChange : noop;
25
25
  const appOnYearChange = (isDateTime || isDate) && propsWithDefaults.onYearChange ? propsWithDefaults.onYearChange : noop;
26
- const emptyPickerStartingMonthDefault = "".concat(new Date().getMonth() + 1, "/__/").concat(new Date().getFullYear());
26
+ const emptyPickerStartingMonthDefault = `${new Date().getMonth() + 1}/__/${new Date().getFullYear()}`;
27
27
  const emptyPickerStartingMonth = (isDateTime || isDate) && propsWithDefaults.emptyPickerStartingMonth ? propsWithDefaults.emptyPickerStartingMonth : emptyPickerStartingMonthDefault;
28
28
  const onCalendarOpenFocusedDay = (isDateTime || isDate) && propsWithDefaults.onCalendarOpenFocusedDay ? propsWithDefaults.onCalendarOpenFocusedDay : undefined;
29
29
  /* -------------------------- -------------- --------------------------*/
@@ -1,14 +1,20 @@
1
- import { useRef, useMemo } from 'react';
1
+ import { useState, useRef, useMemo } from 'react';
2
2
 
3
3
  /* eslint-disable complexity */
4
4
  const useGetReferences = _ref => {
5
5
  let {
6
6
  isWithDateInputs,
7
7
  isWithTimeInputs,
8
+ isDateSelector,
9
+ isTimeSelector,
10
+ isDateTimeSelector,
8
11
  withAnyPicker,
9
12
  withClearBtn
10
13
  } = _ref;
11
- // refs are used for "auto-advance" feature
14
+ // those 2 states are needed for focus tracking
15
+ const [firstSegment, setFirstSegment] = useState('');
16
+ const [lastSegment, setLastSegment] = useState(''); // refs are used for "auto-advance" feature
17
+
12
18
  const monthInputRef = useRef(null);
13
19
  const dayInputRef = useRef(null);
14
20
  const yearInputRef = useRef(null);
@@ -32,22 +38,38 @@ const useGetReferences = _ref => {
32
38
  const currMeridiemBtnRef = useRef(null);
33
39
  const nextMeridiemBtnRef = useRef(null);
34
40
  let firstSegmentRef = useRef(null);
35
- if (isWithDateInputs) firstSegmentRef = monthInputRef;else if (isWithTimeInputs) firstSegmentRef = hourInputRef;else if (withAnyPicker) firstSegmentRef = pickerButtonRef; // we need some non-ref to force refresh of the hooks dependencies when using firstSegmentRef
36
41
 
37
- const firstFragmentRefUpdateDeps = useMemo(() => ({
38
- isWithDateInputs,
39
- isWithTimeInputs,
40
- withAnyPicker
41
- }), [isWithDateInputs, isWithTimeInputs, withAnyPicker]);
42
+ if (isWithDateInputs) {
43
+ firstSegmentRef = monthInputRef;
44
+ if (firstSegment !== 'month-input') setFirstSegment('month-input');
45
+ } else if (isWithTimeInputs) {
46
+ firstSegmentRef = hourInputRef;
47
+ if (firstSegment !== 'hour-input') setFirstSegment('hour-input');
48
+ } else if (withAnyPicker) {
49
+ firstSegmentRef = pickerButtonRef;
50
+ if (isDateSelector && firstSegment !== 'date-picker-icon') setFirstSegment('date-picker-icon');
51
+ if (isTimeSelector && firstSegment !== 'time-picker-icon') setFirstSegment('time-picker-icon');
52
+ if (isDateTimeSelector && firstSegment !== 'datetime-picker-icon') setFirstSegment('datetime-picker-icon');
53
+ }
54
+
42
55
  let lastSegmentRef = useRef(null);
43
- if (withAnyPicker) lastSegmentRef = pickerButtonRef;else if (withClearBtn) lastSegmentRef = clearButtonRef;else if (isWithTimeInputs) lastSegmentRef = meridiemInputRef;else if (isWithDateInputs) lastSegmentRef = yearInputRef; // we need some non-ref to force refresh of the hooks dependencies when using lastSegmentRef
44
56
 
45
- const lastFragmentRefUpdateDeps = useMemo(() => ({
46
- withAnyPicker,
47
- withClearBtn,
48
- isWithTimeInputs,
49
- isWithDateInputs
50
- }), [isWithDateInputs, isWithTimeInputs, withAnyPicker, withClearBtn]);
57
+ if (withAnyPicker) {
58
+ lastSegmentRef = pickerButtonRef;
59
+ if (isDateSelector && lastSegment !== 'date-picker-icon') setLastSegment('date-picker-icon');
60
+ if (isTimeSelector && lastSegment !== 'time-picker-icon') setLastSegment('time-picker-icon');
61
+ if (isDateTimeSelector && lastSegment !== 'datetime-picker-icon') setLastSegment('datetime-picker-icon');
62
+ } else if (withClearBtn) {
63
+ lastSegmentRef = clearButtonRef;
64
+ if (lastSegment !== 'clear-btn') setLastSegment('clear-btn');
65
+ } else if (isWithTimeInputs) {
66
+ lastSegmentRef = meridiemInputRef;
67
+ if (lastSegment !== 'meridiem-input') setLastSegment('meridiem-input');
68
+ } else if (isWithDateInputs) {
69
+ lastSegmentRef = yearInputRef;
70
+ if (lastSegment !== 'year-input') setLastSegment('year-input');
71
+ }
72
+
51
73
  return useMemo(() => ({
52
74
  monthInputRef,
53
75
  dayInputRef,
@@ -73,10 +95,9 @@ const useGetReferences = _ref => {
73
95
  nextMeridiemBtnRef,
74
96
  firstSegmentRef,
75
97
  lastSegmentRef,
76
- firstFragmentRefUpdateDeps,
77
- lastFragmentRefUpdateDeps
78
- }), [firstFragmentRefUpdateDeps, lastFragmentRefUpdateDeps] // if we remove this last/first segment won't work
79
- );
98
+ firstSegment,
99
+ lastSegment
100
+ }), [firstSegment, lastSegment]);
80
101
  };
81
102
 
82
103
  export { useGetReferences };
@@ -16,8 +16,8 @@ const useGlobalKeyHandlers = _ref => {
16
16
  let {
17
17
  propsBasedOnType,
18
18
  changeHandlers,
19
- DOMRefs,
20
- flags
19
+ flags,
20
+ focusTrackers
21
21
  } = _ref;
22
22
  const {
23
23
  getIsOutOfRangeDay,
@@ -34,13 +34,13 @@ const useGlobalKeyHandlers = _ref => {
34
34
  handleChangeComposedDateTimeString,
35
35
  handleClearAll
36
36
  } = changeHandlers;
37
- const {
38
- lastSegmentRef,
39
- clearButtonRef
40
- } = DOMRefs;
41
37
  const {
42
38
  shouldPreserveClearableSpace
43
39
  } = flags;
40
+ const {
41
+ trackFocusClearBtn,
42
+ trackFocusLastSegment
43
+ } = focusTrackers;
44
44
  const onFillWithCurrentDateKeys = useCallback(function (e) {
45
45
  let metaInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
46
46
  isAutomaticFillTrigger: true
@@ -70,12 +70,8 @@ const useGlobalKeyHandlers = _ref => {
70
70
  appOnMinuteChange(minutes, e, metaInfo);
71
71
  appOnMeridiemChange(meridiem, e, metaInfo);
72
72
  handleChangeComposedDateTimeString(nowDateString, nowTimeString, finalMetaInfo);
73
- setTimeout(() => {
74
- var _clearButtonRef$curre, _lastSegmentRef$curre;
75
-
76
- if (shouldPreserveClearableSpace) (_clearButtonRef$curre = clearButtonRef.current) === null || _clearButtonRef$curre === void 0 ? void 0 : _clearButtonRef$curre.focus();else (_lastSegmentRef$curre = lastSegmentRef.current) === null || _lastSegmentRef$curre === void 0 ? void 0 : _lastSegmentRef$curre.focus();
77
- });
78
- }, [appOnDayChange, appOnHourChange, appOnMeridiemChange, appOnMinuteChange, appOnMonthChange, appOnYearChange, clearButtonRef, getIsDisabledDay, getIsDisabledTime, getIsOutOfRangeDay, handleChangeComposedDateTimeString, lastSegmentRef, shouldPreserveClearableSpace]);
73
+ if (shouldPreserveClearableSpace) trackFocusClearBtn();else trackFocusLastSegment();
74
+ }, [appOnDayChange, appOnHourChange, appOnMeridiemChange, appOnMinuteChange, appOnMonthChange, appOnYearChange, getIsDisabledDay, getIsDisabledTime, getIsOutOfRangeDay, handleChangeComposedDateTimeString, shouldPreserveClearableSpace, trackFocusClearBtn, trackFocusLastSegment]);
79
75
  const onGlobalKeyDown = useCallback(e => {
80
76
  const {
81
77
  key,
@@ -1,8 +1,8 @@
1
- import 'core-js/modules/web.dom-collections.iterator.js';
2
1
  import { useMemo, useState } from 'react';
3
2
  import { getIsDateTime, getIsDate, getIsTime } from '../utils/typeGuards.js';
4
3
  import { dateTimeToDate, dateTimeToTime } from '../utils/stringHelpers.js';
5
4
 
5
+ /* eslint-disable complexity */
6
6
  const useRelevantValueFromProps = props => {
7
7
  const dateStringFromProps = useMemo(() => {
8
8
  if (getIsDateTime(props)) return props.dateTime !== '' ? dateTimeToDate(props.dateTime) : '__/__/____';
@@ -1,43 +1,74 @@
1
+ import 'core-js/modules/es.error.cause.js';
1
2
  import { deconstructValuesFromDateString, isValidDateString, dateTimeToDate, isValidTimeString, dateTimeToTime } from '../utils/stringHelpers.js';
2
3
  import { convertToPositiveNumberIfPossible } from '../utils/numberHelpers.js';
3
4
  import { getIsDateTime, getIsDate, getIsTime } from '../utils/typeGuards.js';
4
5
 
5
- /* eslint-disable max-statements */
6
- const PREPEND = "ControlledDateTimePicker:\n Invalid configuration detected::\n \n ";
6
+ const PREPEND = `ControlledDateTimePicker:
7
+ Invalid configuration detected::
8
+
9
+ `;
7
10
  const NOT_A_DEFECT = ''; // '\n\n\t\tThis is not a defect, please check\n\n\t\thttps://qa.dimsum.rd.elliemae.io/?path=/story/components-desktop-components-d-controlledform-date-time-picker--basic\n\n\t\tfor instructions on how to use the component correctly\n\n';
8
11
 
9
- const INLINE_RECEIVED_PREPEND = "\n\n Received:";
12
+ const INLINE_RECEIVED_PREPEND = `
13
+
14
+ Received:`;
10
15
 
11
16
  const throwInvalidDateTimeError = invalidValue => {
12
- throw new Error("".concat(PREPEND, "the \"dateTime\" you are providing is not respecting the format it must respect.").concat(INLINE_RECEIVED_PREPEND).concat(invalidValue, "(").concat(typeof invalidValue, ")").concat(NOT_A_DEFECT));
17
+ throw new Error(`${PREPEND}the "dateTime" you are providing is not respecting the format it must respect.${INLINE_RECEIVED_PREPEND}${invalidValue}(${typeof invalidValue})${NOT_A_DEFECT}`);
13
18
  };
14
19
 
15
20
  const throwInvalidDaterror = invalidValue => {
16
- throw new Error("".concat(PREPEND, "the \"date\" you are providing is not respecting the format it must respect.").concat(INLINE_RECEIVED_PREPEND).concat(invalidValue, "(").concat(typeof invalidValue, ")").concat(NOT_A_DEFECT));
21
+ throw new Error(`${PREPEND}the "date" you are providing is not respecting the format it must respect.${INLINE_RECEIVED_PREPEND}${invalidValue}(${typeof invalidValue})${NOT_A_DEFECT}`);
17
22
  };
18
23
 
19
24
  const throwInvalidTimerror = invalidValue => {
20
- throw new Error("".concat(PREPEND, "the \"time\" you are providing is not respecting the format it must respect.").concat(INLINE_RECEIVED_PREPEND).concat(invalidValue, "(").concat(typeof invalidValue, ")").concat(NOT_A_DEFECT));
25
+ throw new Error(`${PREPEND}the "time" you are providing is not respecting the format it must respect.${INLINE_RECEIVED_PREPEND}${invalidValue}(${typeof invalidValue})${NOT_A_DEFECT}`);
21
26
  };
22
27
 
23
28
  const throwUncontrolledDateError = (date, onDateChange) => {
24
- throw new Error("".concat(PREPEND, "you are trying to use a date selector while providing a non-string \"date\" or providing a non-function to \"onDateChange\"\n the full-controlled pattern must be used\n\tcheck https://reactjs.org/docs/forms.html#controlled-components for more informations\n\n Received:\n date: ").concat(date, "(").concat(typeof date, ")\n onDateChange: (").concat(typeof onDateChange, ")\n ").concat(NOT_A_DEFECT));
29
+ throw new Error(`${PREPEND}you are trying to use a date selector while providing a non-string "date" or providing a non-function to "onDateChange"
30
+ the full-controlled pattern must be used\n\tcheck https://reactjs.org/docs/forms.html#controlled-components for more informations
31
+
32
+ Received:
33
+ date: ${date}(${typeof date})
34
+ onDateChange: (${typeof onDateChange})
35
+ ${NOT_A_DEFECT}`);
25
36
  };
26
37
 
27
38
  const throwUncontrolledTimeError = (time, onTimeChange) => {
28
- throw new Error("".concat(PREPEND, "you are trying to use a time selector while providing a non-string \"time\" or providing a non-function to \"onTimeChange\"\n the full-controlled pattern must be used\n\tcheck https://reactjs.org/docs/forms.html#controlled-components for more informations\n\n Received:\n time: ").concat(time, "(").concat(typeof time, ")\n onTimeChange: (").concat(typeof onTimeChange, ")\n ").concat(NOT_A_DEFECT));
39
+ throw new Error(`${PREPEND}you are trying to use a time selector while providing a non-string "time" or providing a non-function to "onTimeChange"
40
+ the full-controlled pattern must be used\n\tcheck https://reactjs.org/docs/forms.html#controlled-components for more informations
41
+
42
+ Received:
43
+ time: ${time}(${typeof time})
44
+ onTimeChange: (${typeof onTimeChange})
45
+ ${NOT_A_DEFECT}`);
29
46
  };
30
47
 
31
48
  const throwUncontrolledDateTimeError = (dateTime, onDateTimeChange) => {
32
- throw new Error("".concat(PREPEND, "you are trying to use a date-time selector while providing a non-string \"dateTime\" or providing a non-function to \"onDateTimeChange\"\n the full-controlled pattern must be used\n\tcheck https://reactjs.org/docs/forms.html#controlled-components for more informations\n\n Received:\n dateTime: ").concat(dateTime, "(").concat(typeof dateTime, ")\n onDateTimeChange: (").concat(typeof onDateTimeChange, ")\n ").concat(NOT_A_DEFECT));
49
+ throw new Error(`${PREPEND}you are trying to use a date-time selector while providing a non-string "dateTime" or providing a non-function to "onDateTimeChange"
50
+ the full-controlled pattern must be used\n\tcheck https://reactjs.org/docs/forms.html#controlled-components for more informations
51
+
52
+ Received:
53
+ dateTime: ${dateTime}(${typeof dateTime})
54
+ onDateTimeChange: (${typeof onDateTimeChange})
55
+ ${NOT_A_DEFECT}`);
33
56
  };
34
57
 
35
58
  const throwInvalidEmptyPickerStartingMonthError = emptyPickerStartingMonth => {
36
- throw new Error("".concat(PREPEND, "the provided emptyPickerStartingMonth props is invalid. please provide a string with the format mm/__/yyyy, (mm 01~12, yyyy 0001~9999) \n\n Received:\n ").concat(emptyPickerStartingMonth, "(").concat(typeof emptyPickerStartingMonth, ")\n ").concat(NOT_A_DEFECT));
59
+ throw new Error(`${PREPEND}the provided emptyPickerStartingMonth props is invalid. please provide a string with the format mm/__/yyyy, (mm 01~12, yyyy 0001~9999)
60
+
61
+ Received:
62
+ ${emptyPickerStartingMonth}(${typeof emptyPickerStartingMonth})
63
+ ${NOT_A_DEFECT}`);
37
64
  };
38
65
 
39
66
  const throwInvalidOnCalendarOpenFocusedDayError = onCalendarOpenFocusedDay => {
40
- throw new Error("".concat(PREPEND, "the provided onCalendarOpenFocusedDay props is invalid. please provide a string with the format mm/dd/yyyy, (mm 01~12, dd 01~31, yyyy 0001~9999) \n\n Received:\n ").concat(onCalendarOpenFocusedDay, "(").concat(typeof onCalendarOpenFocusedDay, ")\n ").concat(NOT_A_DEFECT));
67
+ throw new Error(`${PREPEND}the provided onCalendarOpenFocusedDay props is invalid. please provide a string with the format mm/dd/yyyy, (mm 01~12, dd 01~31, yyyy 0001~9999)
68
+
69
+ Received:
70
+ ${onCalendarOpenFocusedDay}(${typeof onCalendarOpenFocusedDay})
71
+ ${NOT_A_DEFECT}`);
41
72
  };
42
73
 
43
74
  const useValidateProps = props => {
@@ -5,12 +5,13 @@ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
5
  import 'core-js/modules/esnext.iterator.for-each.js';
6
6
  import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
7
  import _jsx from '@babel/runtime/helpers/esm/jsx';
8
- import 'react';
8
+ import { useContext } from 'react';
9
9
  import { CloseMedium } from '@elliemae/ds-icons';
10
10
  import { DSIconColors } from '@elliemae/ds-icon';
11
11
  import { BUTTON_SIZES } from '@elliemae/ds-button';
12
12
  import { StyledClearButton } from '../Styleds.js';
13
13
  import { ControlledDateTimePickerDatatestid } from '../../ControlledDateTimePickerDatatestid.js';
14
+ import { ControlledDateTimePickerContext } from '../../ControlledDateTimePickerCTX.js';
14
15
  import { useClearButton } from './useClearButton.js';
15
16
  import { jsx } from 'react/jsx-runtime';
16
17
 
@@ -27,12 +28,19 @@ const ClearButton = () => {
27
28
  const styledsAttrs = {
28
29
  shouldDisplay: withClearBtn
29
30
  };
31
+ const {
32
+ latestInteractionRegion,
33
+ currFocusDescriber
34
+ } = useContext(ControlledDateTimePickerContext);
30
35
  return /*#__PURE__*/jsx(StyledClearButton, _objectSpread(_objectSpread({
31
36
  "aria-label": "clear selected date",
32
37
  buttonType: "icon",
33
38
  size: BUTTON_SIZES.M,
34
39
  "data-testid": ControlledDateTimePickerDatatestid.CLEAR_BUTTON,
35
- innerRef: clearButtonRef,
40
+ innerRef: DomElem => {
41
+ clearButtonRef.current = DomElem;
42
+ if (latestInteractionRegion === 'clear-btn' && currFocusDescriber === 'clear-btn') DomElem?.focus?.();
43
+ },
36
44
  onClick: onClearClick,
37
45
  onKeyDown: onClearButtonKeyDown
38
46
  }, styledsAttrs), {}, {
@@ -11,32 +11,21 @@ const useClearButton = () => {
11
11
  withAnyInputs,
12
12
  isWithTimeInputs,
13
13
  isWithDateInputs,
14
- isTimeSelector,
15
- hourInputRef,
16
- monthInputRef,
17
- pickerButtonRef,
18
- meridiemInputRef,
19
- yearInputRef,
20
- setLatestInteractionRegion
14
+ trackFocusFirstSegment,
15
+ trackFocusMeridiemInput,
16
+ trackFocusYearInput,
17
+ trackFocusPicker
21
18
  } = useContext(ControlledDateTimePickerContext);
22
- const focusFirstRegion = useCallback(() => {
23
- var _hourInputRef$current, _hourInputRef$current2, _monthInputRef$curren, _monthInputRef$curren2;
24
-
25
- if (withAnyInputs) if (isTimeSelector) hourInputRef === null || hourInputRef === void 0 ? void 0 : (_hourInputRef$current = hourInputRef.current) === null || _hourInputRef$current === void 0 ? void 0 : (_hourInputRef$current2 = _hourInputRef$current.focus) === null || _hourInputRef$current2 === void 0 ? void 0 : _hourInputRef$current2.call(_hourInputRef$current);else monthInputRef === null || monthInputRef === void 0 ? void 0 : (_monthInputRef$curren = monthInputRef.current) === null || _monthInputRef$curren === void 0 ? void 0 : (_monthInputRef$curren2 = _monthInputRef$curren.focus) === null || _monthInputRef$curren2 === void 0 ? void 0 : _monthInputRef$curren2.call(_monthInputRef$curren);
26
- }, [withAnyInputs, isTimeSelector, hourInputRef, monthInputRef]);
27
19
  const onClearClick = useCallback(e => {
28
20
  handleClearAll(e);
29
- setLatestInteractionRegion('clear-btn');
30
- focusFirstRegion();
31
- }, [focusFirstRegion, handleClearAll, setLatestInteractionRegion]);
21
+ trackFocusFirstSegment();
22
+ }, [handleClearAll, trackFocusFirstSegment]);
32
23
  const onHomeKeyDown = useCallback(() => {
33
- focusFirstRegion();
34
- }, [focusFirstRegion]);
24
+ trackFocusFirstSegment();
25
+ }, [trackFocusFirstSegment]);
35
26
  const onEndKeyDown = useCallback(() => {
36
- var _pickerButtonRef$curr, _pickerButtonRef$curr2;
37
-
38
- if (withAnyPicker) pickerButtonRef === null || pickerButtonRef === void 0 ? void 0 : (_pickerButtonRef$curr = pickerButtonRef.current) === null || _pickerButtonRef$curr === void 0 ? void 0 : (_pickerButtonRef$curr2 = _pickerButtonRef$curr.focus) === null || _pickerButtonRef$curr2 === void 0 ? void 0 : _pickerButtonRef$curr2.call(_pickerButtonRef$curr);
39
- }, [withAnyPicker, pickerButtonRef]);
27
+ if (withAnyPicker) trackFocusPicker();
28
+ }, [withAnyPicker, trackFocusPicker]);
40
29
  const onClearButtonKeyDown = useCallback(e => {
41
30
  const {
42
31
  key
@@ -49,11 +38,9 @@ const useClearButton = () => {
49
38
  if (key === 'End') onEndKeyDown();
50
39
 
51
40
  if (key === 'Backspace' && withAnyInputs) {
52
- var _meridiemInputRef$cur, _meridiemInputRef$cur2, _yearInputRef$current, _yearInputRef$current2;
53
-
54
- if (isWithTimeInputs) meridiemInputRef === null || meridiemInputRef === void 0 ? void 0 : (_meridiemInputRef$cur = meridiemInputRef.current) === null || _meridiemInputRef$cur === void 0 ? void 0 : (_meridiemInputRef$cur2 = _meridiemInputRef$cur.focus) === null || _meridiemInputRef$cur2 === void 0 ? void 0 : _meridiemInputRef$cur2.call(_meridiemInputRef$cur);else if (isWithDateInputs) yearInputRef === null || yearInputRef === void 0 ? void 0 : (_yearInputRef$current = yearInputRef.current) === null || _yearInputRef$current === void 0 ? void 0 : (_yearInputRef$current2 = _yearInputRef$current.focus) === null || _yearInputRef$current2 === void 0 ? void 0 : _yearInputRef$current2.call(_yearInputRef$current);
41
+ if (isWithTimeInputs) trackFocusMeridiemInput();else if (isWithDateInputs) trackFocusYearInput();
55
42
  }
56
- }, [isWithDateInputs, isWithTimeInputs, meridiemInputRef, onEndKeyDown, onHomeKeyDown, withAnyInputs, yearInputRef]);
43
+ }, [isWithDateInputs, isWithTimeInputs, onEndKeyDown, onHomeKeyDown, trackFocusMeridiemInput, trackFocusYearInput, withAnyInputs]);
57
44
  return useMemo(() => ({
58
45
  onClearClick,
59
46
  onClearButtonKeyDown,