@fluentui/react-datepicker-compat 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/CHANGELOG.json +76 -1
  2. package/CHANGELOG.md +21 -2
  3. package/lib/Calendar.js +0 -1
  4. package/lib/Calendar.js.map +1 -1
  5. package/lib/CalendarDay.js +0 -1
  6. package/lib/CalendarDay.js.map +1 -1
  7. package/lib/CalendarDayGrid.js +0 -1
  8. package/lib/CalendarDayGrid.js.map +1 -1
  9. package/lib/CalendarMonth.js +0 -1
  10. package/lib/CalendarMonth.js.map +1 -1
  11. package/lib/CalendarPicker.js +0 -1
  12. package/lib/CalendarPicker.js.map +1 -1
  13. package/lib/CalendarYear.js +0 -1
  14. package/lib/CalendarYear.js.map +1 -1
  15. package/lib/DatePicker.js +0 -1
  16. package/lib/DatePicker.js.map +1 -1
  17. package/lib/components/Calendar/Calendar.js +278 -300
  18. package/lib/components/Calendar/Calendar.js.map +1 -1
  19. package/lib/components/Calendar/Calendar.types.js +7 -12
  20. package/lib/components/Calendar/Calendar.types.js.map +1 -1
  21. package/lib/components/Calendar/defaults.js +0 -1
  22. package/lib/components/Calendar/defaults.js.map +1 -1
  23. package/lib/components/Calendar/index.js +0 -1
  24. package/lib/components/Calendar/index.js.map +1 -1
  25. package/lib/components/Calendar/useCalendarStyles.styles.js.map +1 -1
  26. package/lib/components/CalendarDay/CalendarDay.js +100 -128
  27. package/lib/components/CalendarDay/CalendarDay.js.map +1 -1
  28. package/lib/components/CalendarDay/CalendarDay.types.js +0 -1
  29. package/lib/components/CalendarDay/CalendarDay.types.js.map +1 -1
  30. package/lib/components/CalendarDay/index.js +0 -1
  31. package/lib/components/CalendarDay/index.js.map +1 -1
  32. package/lib/components/CalendarDay/useCalendarDayStyles.styles.js.map +1 -1
  33. package/lib/components/CalendarDayGrid/CalendarDayGrid.js +146 -159
  34. package/lib/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
  35. package/lib/components/CalendarDayGrid/CalendarDayGrid.types.js +0 -1
  36. package/lib/components/CalendarDayGrid/CalendarDayGrid.types.js.map +1 -1
  37. package/lib/components/CalendarDayGrid/CalendarGridDayCell.js +150 -179
  38. package/lib/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
  39. package/lib/components/CalendarDayGrid/CalendarGridRow.js +20 -34
  40. package/lib/components/CalendarDayGrid/CalendarGridRow.js.map +1 -1
  41. package/lib/components/CalendarDayGrid/CalendarMonthHeaderRow.js +29 -39
  42. package/lib/components/CalendarDayGrid/CalendarMonthHeaderRow.js.map +1 -1
  43. package/lib/components/CalendarDayGrid/index.js +0 -1
  44. package/lib/components/CalendarDayGrid/index.js.map +1 -1
  45. package/lib/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js.map +1 -1
  46. package/lib/components/CalendarDayGrid/useWeekCornerStyles.styles.js.map +1 -1
  47. package/lib/components/CalendarDayGrid/useWeeks.js +34 -36
  48. package/lib/components/CalendarDayGrid/useWeeks.js.map +1 -1
  49. package/lib/components/CalendarMonth/CalendarMonth.js +238 -258
  50. package/lib/components/CalendarMonth/CalendarMonth.js.map +1 -1
  51. package/lib/components/CalendarMonth/CalendarMonth.types.js +0 -1
  52. package/lib/components/CalendarMonth/CalendarMonth.types.js.map +1 -1
  53. package/lib/components/CalendarMonth/index.js +0 -1
  54. package/lib/components/CalendarMonth/index.js.map +1 -1
  55. package/lib/components/CalendarMonth/useCalendarMonthStyles.js +2 -4
  56. package/lib/components/CalendarMonth/useCalendarMonthStyles.js.map +1 -1
  57. package/lib/components/CalendarPicker/CalendarPicker.types.js +1 -2
  58. package/lib/components/CalendarPicker/CalendarPicker.types.js.map +1 -1
  59. package/lib/components/CalendarPicker/index.js +0 -1
  60. package/lib/components/CalendarPicker/index.js.map +1 -1
  61. package/lib/components/CalendarPicker/useCalendarPickerStyles.styles.js.map +1 -1
  62. package/lib/components/CalendarYear/CalendarYear.js +260 -312
  63. package/lib/components/CalendarYear/CalendarYear.js.map +1 -1
  64. package/lib/components/CalendarYear/CalendarYear.types.js +0 -1
  65. package/lib/components/CalendarYear/CalendarYear.types.js.map +1 -1
  66. package/lib/components/CalendarYear/index.js +0 -1
  67. package/lib/components/CalendarYear/index.js.map +1 -1
  68. package/lib/components/CalendarYear/useCalendarYearStyles.styles.js.map +1 -1
  69. package/lib/components/DatePicker/DatePicker.js +4 -5
  70. package/lib/components/DatePicker/DatePicker.js.map +1 -1
  71. package/lib/components/DatePicker/DatePicker.types.js +0 -1
  72. package/lib/components/DatePicker/DatePicker.types.js.map +1 -1
  73. package/lib/components/DatePicker/defaults.js +9 -10
  74. package/lib/components/DatePicker/defaults.js.map +1 -1
  75. package/lib/components/DatePicker/index.js +0 -1
  76. package/lib/components/DatePicker/index.js.map +1 -1
  77. package/lib/components/DatePicker/renderDatePicker.js +5 -12
  78. package/lib/components/DatePicker/renderDatePicker.js.map +1 -1
  79. package/lib/components/DatePicker/useDatePicker.js +401 -353
  80. package/lib/components/DatePicker/useDatePicker.js.map +1 -1
  81. package/lib/components/DatePicker/useDatePickerStyles.styles.js.map +1 -1
  82. package/lib/index.js +0 -1
  83. package/lib/index.js.map +1 -1
  84. package/lib/utils/animations.js +72 -73
  85. package/lib/utils/animations.js.map +1 -1
  86. package/lib/utils/constants.js +50 -52
  87. package/lib/utils/constants.js.map +1 -1
  88. package/lib/utils/dateFormatting/dateFormatting.defaults.js +71 -34
  89. package/lib/utils/dateFormatting/dateFormatting.defaults.js.map +1 -1
  90. package/lib/utils/dateFormatting/dateFormatting.types.js +1 -2
  91. package/lib/utils/dateFormatting/dateFormatting.types.js.map +1 -1
  92. package/lib/utils/dateFormatting/index.js +0 -1
  93. package/lib/utils/dateFormatting/index.js.map +1 -1
  94. package/lib/utils/dateGrid/dateGrid.types.js +1 -2
  95. package/lib/utils/dateGrid/dateGrid.types.js.map +1 -1
  96. package/lib/utils/dateGrid/findAvailableDate.js +14 -21
  97. package/lib/utils/dateGrid/findAvailableDate.js.map +1 -1
  98. package/lib/utils/dateGrid/getBoundedDateRange.js +11 -11
  99. package/lib/utils/dateGrid/getBoundedDateRange.js.map +1 -1
  100. package/lib/utils/dateGrid/getDateRangeTypeToUse.js +6 -8
  101. package/lib/utils/dateGrid/getDateRangeTypeToUse.js.map +1 -1
  102. package/lib/utils/dateGrid/getDayGrid.js +59 -73
  103. package/lib/utils/dateGrid/getDayGrid.js.map +1 -1
  104. package/lib/utils/dateGrid/index.js +0 -1
  105. package/lib/utils/dateGrid/index.js.map +1 -1
  106. package/lib/utils/dateGrid/isAfterMaxDate.js +3 -7
  107. package/lib/utils/dateGrid/isAfterMaxDate.js.map +1 -1
  108. package/lib/utils/dateGrid/isBeforeMinDate.js +3 -7
  109. package/lib/utils/dateGrid/isBeforeMinDate.js.map +1 -1
  110. package/lib/utils/dateGrid/isContiguous.js +11 -12
  111. package/lib/utils/dateGrid/isContiguous.js.map +1 -1
  112. package/lib/utils/dateGrid/isRestrictedDate.js +7 -13
  113. package/lib/utils/dateGrid/isRestrictedDate.js.map +1 -1
  114. package/lib/utils/dateMath/dateMath.js +179 -198
  115. package/lib/utils/dateMath/dateMath.js.map +1 -1
  116. package/lib/utils/dateMath/index.js +0 -1
  117. package/lib/utils/dateMath/index.js.map +1 -1
  118. package/lib/utils/dom.js +5 -6
  119. package/lib/utils/dom.js.map +1 -1
  120. package/lib/utils/focus.js +17 -19
  121. package/lib/utils/focus.js.map +1 -1
  122. package/lib/utils/index.js +0 -1
  123. package/lib/utils/index.js.map +1 -1
  124. package/lib/utils/usePopupPositioning.js +12 -16
  125. package/lib/utils/usePopupPositioning.js.map +1 -1
  126. package/lib-commonjs/Calendar.js +0 -3
  127. package/lib-commonjs/Calendar.js.map +1 -1
  128. package/lib-commonjs/CalendarDay.js +0 -3
  129. package/lib-commonjs/CalendarDay.js.map +1 -1
  130. package/lib-commonjs/CalendarDayGrid.js +0 -3
  131. package/lib-commonjs/CalendarDayGrid.js.map +1 -1
  132. package/lib-commonjs/CalendarMonth.js +0 -3
  133. package/lib-commonjs/CalendarMonth.js.map +1 -1
  134. package/lib-commonjs/CalendarPicker.js +0 -3
  135. package/lib-commonjs/CalendarPicker.js.map +1 -1
  136. package/lib-commonjs/CalendarYear.js +0 -3
  137. package/lib-commonjs/CalendarYear.js.map +1 -1
  138. package/lib-commonjs/DatePicker.js +0 -3
  139. package/lib-commonjs/DatePicker.js.map +1 -1
  140. package/lib-commonjs/components/Calendar/Calendar.js +1 -3
  141. package/lib-commonjs/components/Calendar/Calendar.js.map +1 -1
  142. package/lib-commonjs/components/Calendar/Calendar.types.js +5 -7
  143. package/lib-commonjs/components/Calendar/Calendar.types.js.map +1 -1
  144. package/lib-commonjs/components/Calendar/defaults.js +1 -3
  145. package/lib-commonjs/components/Calendar/defaults.js.map +1 -1
  146. package/lib-commonjs/components/Calendar/index.js +0 -3
  147. package/lib-commonjs/components/Calendar/index.js.map +1 -1
  148. package/lib-commonjs/components/Calendar/useCalendarStyles.styles.js +0 -2
  149. package/lib-commonjs/components/Calendar/useCalendarStyles.styles.js.map +1 -1
  150. package/lib-commonjs/components/CalendarDay/CalendarDay.js +1 -3
  151. package/lib-commonjs/components/CalendarDay/CalendarDay.js.map +1 -1
  152. package/lib-commonjs/components/CalendarDay/CalendarDay.types.js +0 -3
  153. package/lib-commonjs/components/CalendarDay/CalendarDay.types.js.map +1 -1
  154. package/lib-commonjs/components/CalendarDay/index.js +0 -3
  155. package/lib-commonjs/components/CalendarDay/index.js.map +1 -1
  156. package/lib-commonjs/components/CalendarDay/useCalendarDayStyles.styles.js +0 -2
  157. package/lib-commonjs/components/CalendarDay/useCalendarDayStyles.styles.js.map +1 -1
  158. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js +7 -9
  159. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
  160. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.types.js +0 -3
  161. package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.types.js.map +1 -1
  162. package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js +1 -3
  163. package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
  164. package/lib-commonjs/components/CalendarDayGrid/CalendarGridRow.js +1 -3
  165. package/lib-commonjs/components/CalendarDayGrid/CalendarGridRow.js.map +1 -1
  166. package/lib-commonjs/components/CalendarDayGrid/CalendarMonthHeaderRow.js +1 -3
  167. package/lib-commonjs/components/CalendarDayGrid/CalendarMonthHeaderRow.js.map +1 -1
  168. package/lib-commonjs/components/CalendarDayGrid/index.js +0 -3
  169. package/lib-commonjs/components/CalendarDayGrid/index.js.map +1 -1
  170. package/lib-commonjs/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js +0 -2
  171. package/lib-commonjs/components/CalendarDayGrid/useCalendarDayGridStyles.styles.js.map +1 -1
  172. package/lib-commonjs/components/CalendarDayGrid/useWeekCornerStyles.styles.js +0 -2
  173. package/lib-commonjs/components/CalendarDayGrid/useWeekCornerStyles.styles.js.map +1 -1
  174. package/lib-commonjs/components/CalendarDayGrid/useWeeks.js +9 -11
  175. package/lib-commonjs/components/CalendarDayGrid/useWeeks.js.map +1 -1
  176. package/lib-commonjs/components/CalendarMonth/CalendarMonth.js +1 -3
  177. package/lib-commonjs/components/CalendarMonth/CalendarMonth.js.map +1 -1
  178. package/lib-commonjs/components/CalendarMonth/CalendarMonth.types.js +0 -3
  179. package/lib-commonjs/components/CalendarMonth/CalendarMonth.types.js.map +1 -1
  180. package/lib-commonjs/components/CalendarMonth/index.js +0 -3
  181. package/lib-commonjs/components/CalendarMonth/index.js.map +1 -1
  182. package/lib-commonjs/components/CalendarMonth/useCalendarMonthStyles.js +1 -3
  183. package/lib-commonjs/components/CalendarMonth/useCalendarMonthStyles.js.map +1 -1
  184. package/lib-commonjs/components/CalendarPicker/CalendarPicker.types.js +0 -3
  185. package/lib-commonjs/components/CalendarPicker/CalendarPicker.types.js.map +1 -1
  186. package/lib-commonjs/components/CalendarPicker/index.js +0 -3
  187. package/lib-commonjs/components/CalendarPicker/index.js.map +1 -1
  188. package/lib-commonjs/components/CalendarPicker/useCalendarPickerStyles.styles.js +0 -2
  189. package/lib-commonjs/components/CalendarPicker/useCalendarPickerStyles.styles.js.map +1 -1
  190. package/lib-commonjs/components/CalendarYear/CalendarYear.js +1 -3
  191. package/lib-commonjs/components/CalendarYear/CalendarYear.js.map +1 -1
  192. package/lib-commonjs/components/CalendarYear/CalendarYear.types.js +0 -3
  193. package/lib-commonjs/components/CalendarYear/CalendarYear.types.js.map +1 -1
  194. package/lib-commonjs/components/CalendarYear/index.js +0 -3
  195. package/lib-commonjs/components/CalendarYear/index.js.map +1 -1
  196. package/lib-commonjs/components/CalendarYear/useCalendarYearStyles.styles.js +0 -2
  197. package/lib-commonjs/components/CalendarYear/useCalendarYearStyles.styles.js.map +1 -1
  198. package/lib-commonjs/components/DatePicker/DatePicker.js +1 -3
  199. package/lib-commonjs/components/DatePicker/DatePicker.js.map +1 -1
  200. package/lib-commonjs/components/DatePicker/DatePicker.types.js +0 -3
  201. package/lib-commonjs/components/DatePicker/DatePicker.types.js.map +1 -1
  202. package/lib-commonjs/components/DatePicker/defaults.js +1 -3
  203. package/lib-commonjs/components/DatePicker/defaults.js.map +1 -1
  204. package/lib-commonjs/components/DatePicker/index.js +0 -3
  205. package/lib-commonjs/components/DatePicker/index.js.map +1 -1
  206. package/lib-commonjs/components/DatePicker/renderDatePicker.js +1 -3
  207. package/lib-commonjs/components/DatePicker/renderDatePicker.js.map +1 -1
  208. package/lib-commonjs/components/DatePicker/useDatePicker.js +8 -11
  209. package/lib-commonjs/components/DatePicker/useDatePicker.js.map +1 -1
  210. package/lib-commonjs/components/DatePicker/useDatePickerStyles.styles.js +0 -2
  211. package/lib-commonjs/components/DatePicker/useDatePickerStyles.styles.js.map +1 -1
  212. package/lib-commonjs/index.js +0 -3
  213. package/lib-commonjs/index.js.map +1 -1
  214. package/lib-commonjs/utils/animations.js +4 -6
  215. package/lib-commonjs/utils/animations.js.map +1 -1
  216. package/lib-commonjs/utils/constants.js +7 -9
  217. package/lib-commonjs/utils/constants.js.map +1 -1
  218. package/lib-commonjs/utils/dateFormatting/dateFormatting.defaults.js +1 -3
  219. package/lib-commonjs/utils/dateFormatting/dateFormatting.defaults.js.map +1 -1
  220. package/lib-commonjs/utils/dateFormatting/dateFormatting.types.js +0 -3
  221. package/lib-commonjs/utils/dateFormatting/dateFormatting.types.js.map +1 -1
  222. package/lib-commonjs/utils/dateFormatting/index.js +0 -3
  223. package/lib-commonjs/utils/dateFormatting/index.js.map +1 -1
  224. package/lib-commonjs/utils/dateGrid/dateGrid.types.js +0 -3
  225. package/lib-commonjs/utils/dateGrid/dateGrid.types.js.map +1 -1
  226. package/lib-commonjs/utils/dateGrid/findAvailableDate.js +1 -3
  227. package/lib-commonjs/utils/dateGrid/findAvailableDate.js.map +1 -1
  228. package/lib-commonjs/utils/dateGrid/getBoundedDateRange.js +1 -3
  229. package/lib-commonjs/utils/dateGrid/getBoundedDateRange.js.map +1 -1
  230. package/lib-commonjs/utils/dateGrid/getDateRangeTypeToUse.js +1 -3
  231. package/lib-commonjs/utils/dateGrid/getDateRangeTypeToUse.js.map +1 -1
  232. package/lib-commonjs/utils/dateGrid/getDayGrid.js +1 -3
  233. package/lib-commonjs/utils/dateGrid/getDayGrid.js.map +1 -1
  234. package/lib-commonjs/utils/dateGrid/index.js +0 -3
  235. package/lib-commonjs/utils/dateGrid/index.js.map +1 -1
  236. package/lib-commonjs/utils/dateGrid/isAfterMaxDate.js +1 -3
  237. package/lib-commonjs/utils/dateGrid/isAfterMaxDate.js.map +1 -1
  238. package/lib-commonjs/utils/dateGrid/isBeforeMinDate.js +1 -3
  239. package/lib-commonjs/utils/dateGrid/isBeforeMinDate.js.map +1 -1
  240. package/lib-commonjs/utils/dateGrid/isContiguous.js +1 -3
  241. package/lib-commonjs/utils/dateGrid/isContiguous.js.map +1 -1
  242. package/lib-commonjs/utils/dateGrid/isRestrictedDate.js +1 -3
  243. package/lib-commonjs/utils/dateGrid/isRestrictedDate.js.map +1 -1
  244. package/lib-commonjs/utils/dateMath/dateMath.js +1 -3
  245. package/lib-commonjs/utils/dateMath/dateMath.js.map +1 -1
  246. package/lib-commonjs/utils/dateMath/index.js +0 -3
  247. package/lib-commonjs/utils/dateMath/index.js.map +1 -1
  248. package/lib-commonjs/utils/dom.js +1 -3
  249. package/lib-commonjs/utils/dom.js.map +1 -1
  250. package/lib-commonjs/utils/focus.js +1 -3
  251. package/lib-commonjs/utils/focus.js.map +1 -1
  252. package/lib-commonjs/utils/index.js +0 -3
  253. package/lib-commonjs/utils/index.js.map +1 -1
  254. package/lib-commonjs/utils/usePopupPositioning.js +1 -3
  255. package/lib-commonjs/utils/usePopupPositioning.js.map +1 -1
  256. package/package.json +11 -11
@@ -11,67 +11,80 @@ import { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts
11
11
  import { useModalAttributes } from '@fluentui/react-tabster';
12
12
  import { usePopupPositioning } from '../../utils/usePopupPositioning';
13
13
  function isDateOutOfBounds(date, minDate, maxDate) {
14
- return !!minDate && compareDatePart(minDate, date) > 0 || !!maxDate && compareDatePart(maxDate, date) < 0;
14
+ return !!minDate && compareDatePart(minDate, date) > 0 || !!maxDate && compareDatePart(maxDate, date) < 0;
15
15
  }
16
16
  function useFocusLogic() {
17
- const inputRef = React.useRef(null);
18
- const preventFocusOpeningPicker = React.useRef(false);
19
- const focus = () => {
20
- var _inputRef_current, _inputRef_current_focus;
21
- (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : (_inputRef_current_focus = _inputRef_current.focus) === null || _inputRef_current_focus === void 0 ? void 0 : _inputRef_current_focus.call(_inputRef_current);
22
- };
23
- const preventNextFocusOpeningPicker = () => {
24
- preventFocusOpeningPicker.current = true;
25
- };
26
- return [focus, inputRef, preventFocusOpeningPicker, preventNextFocusOpeningPicker];
17
+ const inputRef = React.useRef(null);
18
+ const preventFocusOpeningPicker = React.useRef(false);
19
+ const focus = ()=>{
20
+ var _inputRef_current, _inputRef_current_focus;
21
+ (_inputRef_current = inputRef.current) === null || _inputRef_current === void 0 ? void 0 : (_inputRef_current_focus = _inputRef_current.focus) === null || _inputRef_current_focus === void 0 ? void 0 : _inputRef_current_focus.call(_inputRef_current);
22
+ };
23
+ const preventNextFocusOpeningPicker = ()=>{
24
+ preventFocusOpeningPicker.current = true;
25
+ };
26
+ return [
27
+ focus,
28
+ inputRef,
29
+ preventFocusOpeningPicker,
30
+ preventNextFocusOpeningPicker
31
+ ];
27
32
  }
28
33
  function usePopupVisibility(props) {
29
- const [open, setOpen] = useControllableState({
30
- initialState: false,
31
- defaultState: props.defaultOpen,
32
- state: props.open
33
- });
34
- const isMounted = React.useRef(false);
35
- React.useEffect(() => {
36
- if (isMounted.current && !open) {
37
- var
38
- // If DatePicker's menu (Calendar) is closed, run onAfterMenuDismiss
39
- _props_onOpenChange;
40
- (_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, false);
41
- }
42
- isMounted.current = true;
43
- },
44
- // Should only run on allowTextInput or open change
45
- // eslint-disable-next-line react-hooks/exhaustive-deps
46
- [props.allowTextInput, open]);
47
- return [open, setOpen];
34
+ const [open, setOpen] = useControllableState({
35
+ initialState: false,
36
+ defaultState: props.defaultOpen,
37
+ state: props.open
38
+ });
39
+ const isMounted = React.useRef(false);
40
+ React.useEffect(()=>{
41
+ if (isMounted.current && !open) {
42
+ var // If DatePicker's menu (Calendar) is closed, run onAfterMenuDismiss
43
+ _props_onOpenChange;
44
+ (_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, false);
45
+ }
46
+ isMounted.current = true;
47
+ }, // Should only run on allowTextInput or open change
48
+ // eslint-disable-next-line react-hooks/exhaustive-deps
49
+ [
50
+ props.allowTextInput,
51
+ open
52
+ ]);
53
+ return [
54
+ open,
55
+ setOpen
56
+ ];
48
57
  }
49
- function useSelectedDate({
50
- formatDate,
51
- onSelectDate,
52
- value
53
- }) {
54
- const [selectedDate, setSelectedDateState] = useControllableState({
55
- initialState: undefined,
56
- state: value
57
- });
58
- const [formattedDate, setFormattedDate] = React.useState(() => value && formatDate ? formatDate(value) : '');
59
- const setSelectedDate = newDate => {
60
- if (selectedDate === undefined && newDate !== undefined || selectedDate !== undefined && newDate === undefined || newDate && selectedDate && (newDate > selectedDate || newDate < selectedDate)) {
61
- onSelectDate === null || onSelectDate === void 0 ? void 0 : onSelectDate(newDate);
62
- }
63
- setSelectedDateState(newDate);
64
- setFormattedDate(newDate && formatDate ? formatDate(newDate) : '');
65
- };
66
- React.useEffect(() => {
67
- setFormattedDate(value && formatDate ? formatDate(value) : '');
68
- }, [formatDate, value]);
69
- return [selectedDate, formattedDate, setSelectedDate, setFormattedDate];
58
+ function useSelectedDate({ formatDate , onSelectDate , value }) {
59
+ const [selectedDate, setSelectedDateState] = useControllableState({
60
+ initialState: undefined,
61
+ state: value
62
+ });
63
+ const [formattedDate, setFormattedDate] = React.useState(()=>value && formatDate ? formatDate(value) : '');
64
+ const setSelectedDate = (newDate)=>{
65
+ if (selectedDate === undefined && newDate !== undefined || selectedDate !== undefined && newDate === undefined || newDate && selectedDate && (newDate > selectedDate || newDate < selectedDate)) {
66
+ onSelectDate === null || onSelectDate === void 0 ? void 0 : onSelectDate(newDate);
67
+ }
68
+ setSelectedDateState(newDate);
69
+ setFormattedDate(newDate && formatDate ? formatDate(newDate) : '');
70
+ };
71
+ React.useEffect(()=>{
72
+ setFormattedDate(value && formatDate ? formatDate(value) : '');
73
+ }, [
74
+ formatDate,
75
+ value
76
+ ]);
77
+ return [
78
+ selectedDate,
79
+ formattedDate,
80
+ setSelectedDate,
81
+ setFormattedDate
82
+ ];
70
83
  }
71
- const defaultFormatDate = date => date ? date.toDateString() : '';
72
- const defaultParseDateFromString = dateStr => {
73
- const date = Date.parse(dateStr);
74
- return date ? new Date(date) : null;
84
+ const defaultFormatDate = (date)=>date ? date.toDateString() : '';
85
+ const defaultParseDateFromString = (dateStr)=>{
86
+ const date = Date.parse(dateStr);
87
+ return date ? new Date(date) : null;
75
88
  };
76
89
  /**
77
90
  * Create the state required to render DatePicker.
@@ -81,310 +94,345 @@ const defaultParseDateFromString = dateStr => {
81
94
  *
82
95
  * @param props - props from this instance of DatePicker
83
96
  * @param ref - reference to root Input slot
84
- */
85
- export const useDatePicker_unstable = (props, ref) => {
86
- const {
87
- allowTextInput = false,
88
- allFocusable = false,
89
- borderless = false,
90
- dateTimeFormatter,
91
- defaultOpen = false,
92
- disableAutoFocus = true,
93
- firstDayOfWeek = DayOfWeek.Sunday,
94
- firstWeekOfYear = FirstWeekOfYear.FirstDay,
95
- formatDate = defaultFormatDate,
96
- highlightCurrentMonth = false,
97
- highlightSelectedMonth = false,
98
- initialPickerDate = new Date(),
99
- inlinePopup = false,
100
- isMonthPickerVisible = true,
101
- maxDate,
102
- minDate,
103
- onOpenChange,
104
- onSelectDate: onUserSelectDate,
105
- openOnClick = true,
106
- onValidationResult,
107
- parseDateFromString = defaultParseDateFromString,
108
- showCloseButton = false,
109
- showGoToToday = true,
110
- showMonthPickerAsOverlay = false,
111
- showWeekNumbers = false,
112
- strings = defaultDatePickerStrings,
113
- today,
114
- underlined = false,
115
- value,
116
- ...restOfProps
117
- } = props;
118
- const calendar = React.useRef(null);
119
- const [focus, rootRef, preventFocusOpeningPicker, preventNextFocusOpeningPicker] = useFocusLogic();
120
- const [selectedDate, formattedDate, setSelectedDate, setFormattedDate] = useSelectedDate({
121
- formatDate,
122
- onSelectDate: onUserSelectDate,
123
- value
124
- });
125
- const [open, setOpenState] = usePopupVisibility(props);
126
- const fieldContext = useFieldContext();
127
- var _fieldContext_required;
128
- const required = (_fieldContext_required = fieldContext === null || fieldContext === void 0 ? void 0 : fieldContext.required) !== null && _fieldContext_required !== void 0 ? _fieldContext_required : props.required;
129
- const popupSurfaceId = useId('datePicker-popupSurface');
130
- const validateTextInput = React.useCallback((date = null) => {
131
- let error;
132
- if (allowTextInput) {
133
- if (formattedDate || date) {
134
- // Don't parse if the selected date has the same formatted string as what we're about to parse.
135
- // The formatted string might be ambiguous (ex: "1/2/3" or "New Year Eve") and the parser might
136
- // not be able to come up with the exact same date.
137
- if (selectedDate && formatDate && formatDate(date !== null && date !== void 0 ? date : selectedDate) === formattedDate) {
138
- return;
139
- }
140
- date = date || parseDateFromString(formattedDate);
141
- // Check if date is null or date is an invalid date
142
- if (!date || isNaN(date.getTime())) {
143
- // Reset input if formatting is available
144
- setSelectedDate(selectedDate);
145
- error = 'invalid-input';
146
- } else {
147
- if (isDateOutOfBounds(date, minDate, maxDate)) {
148
- error = 'out-of-bounds';
149
- } else {
150
- setSelectedDate(date);
151
- }
97
+ */ export const useDatePicker_unstable = (props, ref)=>{
98
+ const { allowTextInput =false , allFocusable =false , borderless =false , dateTimeFormatter , defaultOpen =false , disableAutoFocus =true , firstDayOfWeek =DayOfWeek.Sunday , firstWeekOfYear =FirstWeekOfYear.FirstDay , formatDate =defaultFormatDate , highlightCurrentMonth =false , highlightSelectedMonth =false , initialPickerDate =new Date() , inlinePopup =false , isMonthPickerVisible =true , maxDate , minDate , onOpenChange , onSelectDate: onUserSelectDate , openOnClick =true , onValidationResult , parseDateFromString =defaultParseDateFromString , showCloseButton =false , showGoToToday =true , showMonthPickerAsOverlay =false , showWeekNumbers =false , strings =defaultDatePickerStrings , today , underlined =false , value , ...restOfProps } = props;
99
+ const calendar = React.useRef(null);
100
+ const [focus, rootRef, preventFocusOpeningPicker, preventNextFocusOpeningPicker] = useFocusLogic();
101
+ const [selectedDate, formattedDate, setSelectedDate, setFormattedDate] = useSelectedDate({
102
+ formatDate,
103
+ onSelectDate: onUserSelectDate,
104
+ value
105
+ });
106
+ const [open, setOpenState] = usePopupVisibility(props);
107
+ const fieldContext = useFieldContext();
108
+ var _fieldContext_required;
109
+ const required = (_fieldContext_required = fieldContext === null || fieldContext === void 0 ? void 0 : fieldContext.required) !== null && _fieldContext_required !== void 0 ? _fieldContext_required : props.required;
110
+ const popupSurfaceId = useId('datePicker-popupSurface');
111
+ const validateTextInput = React.useCallback((date = null)=>{
112
+ let error;
113
+ if (allowTextInput) {
114
+ if (formattedDate || date) {
115
+ // Don't parse if the selected date has the same formatted string as what we're about to parse.
116
+ // The formatted string might be ambiguous (ex: "1/2/3" or "New Year Eve") and the parser might
117
+ // not be able to come up with the exact same date.
118
+ if (selectedDate && formatDate && formatDate(date !== null && date !== void 0 ? date : selectedDate) === formattedDate) {
119
+ return;
120
+ }
121
+ date = date || parseDateFromString(formattedDate);
122
+ // Check if date is null or date is an invalid date
123
+ if (!date || isNaN(date.getTime())) {
124
+ // Reset input if formatting is available
125
+ setSelectedDate(selectedDate);
126
+ error = 'invalid-input';
127
+ } else {
128
+ if (isDateOutOfBounds(date, minDate, maxDate)) {
129
+ error = 'out-of-bounds';
130
+ } else {
131
+ setSelectedDate(date);
132
+ }
133
+ }
134
+ } else {
135
+ if (required) {
136
+ error = 'required-input';
137
+ }
138
+ onUserSelectDate === null || onUserSelectDate === void 0 ? void 0 : onUserSelectDate(date);
139
+ }
140
+ } else if (required && !formattedDate) {
141
+ error = 'required-input';
152
142
  }
153
- } else {
154
- if (required) {
155
- error = 'required-input';
143
+ onValidationResult === null || onValidationResult === void 0 ? void 0 : onValidationResult({
144
+ error
145
+ });
146
+ }, [
147
+ allowTextInput,
148
+ formatDate,
149
+ formattedDate,
150
+ maxDate,
151
+ minDate,
152
+ onUserSelectDate,
153
+ onValidationResult,
154
+ parseDateFromString,
155
+ required,
156
+ selectedDate,
157
+ setSelectedDate
158
+ ]);
159
+ const setOpen = React.useCallback((newState)=>{
160
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(newState);
161
+ setOpenState(newState);
162
+ }, [
163
+ onOpenChange,
164
+ setOpenState
165
+ ]);
166
+ const dismissDatePickerPopup = React.useCallback((newlySelectedDate)=>{
167
+ if (open) {
168
+ setOpen(false);
169
+ validateTextInput(newlySelectedDate);
170
+ if (!allowTextInput && newlySelectedDate) {
171
+ setSelectedDate(newlySelectedDate);
172
+ }
156
173
  }
157
- onUserSelectDate === null || onUserSelectDate === void 0 ? void 0 : onUserSelectDate(date);
158
- }
159
- } else if (required && !formattedDate) {
160
- error = 'required-input';
161
- }
162
- onValidationResult === null || onValidationResult === void 0 ? void 0 : onValidationResult({
163
- error
164
- });
165
- }, [allowTextInput, formatDate, formattedDate, maxDate, minDate, onUserSelectDate, onValidationResult, parseDateFromString, required, selectedDate, setSelectedDate]);
166
- const setOpen = React.useCallback(newState => {
167
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(newState);
168
- setOpenState(newState);
169
- }, [onOpenChange, setOpenState]);
170
- const dismissDatePickerPopup = React.useCallback(newlySelectedDate => {
171
- if (open) {
172
- setOpen(false);
173
- validateTextInput(newlySelectedDate);
174
- if (!allowTextInput && newlySelectedDate) {
175
- setSelectedDate(newlySelectedDate);
176
- }
177
- }
178
- }, [allowTextInput, open, setOpen, setSelectedDate, validateTextInput]);
179
- const showDatePickerPopup = React.useCallback(() => {
180
- if (!open) {
181
- preventNextFocusOpeningPicker();
182
- setOpen(true);
183
- }
184
- }, [open, preventNextFocusOpeningPicker, setOpen]);
185
- /**
186
- * Callback for closing the calendar callout
187
- */
188
- const calendarDismissed = React.useCallback(newlySelectedDate => {
189
- preventNextFocusOpeningPicker();
190
- dismissDatePickerPopup(newlySelectedDate);
191
- }, [dismissDatePickerPopup, preventNextFocusOpeningPicker]);
192
- const onInputChange = React.useCallback((ev, data) => {
193
- const {
194
- value: newValue
195
- } = data;
196
- if (allowTextInput) {
197
- if (open) {
198
- dismissDatePickerPopup();
199
- }
200
- setFormattedDate(newValue);
201
- }
202
- }, [allowTextInput, dismissDatePickerPopup, open, setFormattedDate]);
203
- const onInputBlur = React.useCallback(() => {
204
- validateTextInput();
205
- }, [validateTextInput]);
206
- const onInputKeyDown = React.useCallback(ev => {
207
- switch (ev.key) {
208
- case Enter:
209
- ev.preventDefault();
210
- ev.stopPropagation();
174
+ }, [
175
+ allowTextInput,
176
+ open,
177
+ setOpen,
178
+ setSelectedDate,
179
+ validateTextInput
180
+ ]);
181
+ const showDatePickerPopup = React.useCallback(()=>{
211
182
  if (!open) {
212
- validateTextInput();
213
- showDatePickerPopup();
214
- } else {
215
- // When DatePicker allows input date string directly,
216
- // it is expected to hit another enter to close the popup
217
- if (props.allowTextInput) {
183
+ preventNextFocusOpeningPicker();
184
+ setOpen(true);
185
+ }
186
+ }, [
187
+ open,
188
+ preventNextFocusOpeningPicker,
189
+ setOpen
190
+ ]);
191
+ /**
192
+ * Callback for closing the calendar callout
193
+ */ const calendarDismissed = React.useCallback((newlySelectedDate)=>{
194
+ preventNextFocusOpeningPicker();
195
+ dismissDatePickerPopup(newlySelectedDate);
196
+ }, [
197
+ dismissDatePickerPopup,
198
+ preventNextFocusOpeningPicker
199
+ ]);
200
+ const onInputChange = React.useCallback((ev, data)=>{
201
+ const { value: newValue } = data;
202
+ if (allowTextInput) {
203
+ if (open) {
204
+ dismissDatePickerPopup();
205
+ }
206
+ setFormattedDate(newValue);
207
+ }
208
+ }, [
209
+ allowTextInput,
210
+ dismissDatePickerPopup,
211
+ open,
212
+ setFormattedDate
213
+ ]);
214
+ const onInputBlur = React.useCallback(()=>{
215
+ validateTextInput();
216
+ }, [
217
+ validateTextInput
218
+ ]);
219
+ const onInputKeyDown = React.useCallback((ev)=>{
220
+ switch(ev.key){
221
+ case Enter:
222
+ ev.preventDefault();
223
+ ev.stopPropagation();
224
+ if (!open) {
225
+ validateTextInput();
226
+ showDatePickerPopup();
227
+ } else {
228
+ // When DatePicker allows input date string directly,
229
+ // it is expected to hit another enter to close the popup
230
+ if (props.allowTextInput) {
231
+ dismissDatePickerPopup();
232
+ }
233
+ }
234
+ break;
235
+ case Escape:
236
+ ev.stopPropagation();
237
+ ev.preventDefault();
238
+ if (open) {
239
+ calendarDismissed();
240
+ }
241
+ break;
242
+ case ArrowDown:
243
+ ev.preventDefault();
244
+ if (ev.altKey && !open) {
245
+ showDatePickerPopup();
246
+ }
247
+ break;
248
+ default:
249
+ break;
250
+ }
251
+ }, [
252
+ calendarDismissed,
253
+ dismissDatePickerPopup,
254
+ open,
255
+ props.allowTextInput,
256
+ showDatePickerPopup,
257
+ validateTextInput
258
+ ]);
259
+ const onInputFocus = React.useCallback(()=>{
260
+ if (disableAutoFocus) {
261
+ return;
262
+ }
263
+ if (!allowTextInput) {
264
+ if (!preventFocusOpeningPicker.current) {
265
+ showDatePickerPopup();
266
+ }
267
+ preventFocusOpeningPicker.current = false;
268
+ }
269
+ }, [
270
+ allowTextInput,
271
+ disableAutoFocus,
272
+ preventFocusOpeningPicker,
273
+ showDatePickerPopup
274
+ ]);
275
+ const onInputClick = React.useCallback(()=>{
276
+ // default openOnClick to !props.disableAutoFocus for legacy support of disableAutoFocus behavior
277
+ if ((props.openOnClick || !props.disableAutoFocus) && !open && !props.disabled) {
278
+ showDatePickerPopup();
279
+ return;
280
+ }
281
+ if (allowTextInput) {
218
282
  dismissDatePickerPopup();
219
- }
220
283
  }
221
- break;
222
- case Escape:
284
+ }, [
285
+ allowTextInput,
286
+ dismissDatePickerPopup,
287
+ open,
288
+ props.disabled,
289
+ props.disableAutoFocus,
290
+ props.openOnClick,
291
+ showDatePickerPopup
292
+ ]);
293
+ const onIconClick = (ev)=>{
223
294
  ev.stopPropagation();
224
- ev.preventDefault();
225
- if (open) {
226
- calendarDismissed();
295
+ if (!open && !props.disabled) {
296
+ showDatePickerPopup();
297
+ } else if (props.allowTextInput) {
298
+ dismissDatePickerPopup();
227
299
  }
228
- break;
229
- case ArrowDown:
230
- ev.preventDefault();
231
- if (ev.altKey && !open) {
232
- showDatePickerPopup();
300
+ };
301
+ const inputAppearance = underlined ? 'underline' : borderless ? 'filled-lighter' : 'outline';
302
+ const [triggerWrapperRef, popupRef] = usePopupPositioning(props);
303
+ const rootShorthand = resolveShorthand(restOfProps, {
304
+ required: true,
305
+ defaultProps: {
306
+ appearance: inputAppearance,
307
+ 'aria-controls': open ? popupSurfaceId : undefined,
308
+ 'aria-expanded': open,
309
+ 'aria-haspopup': 'dialog',
310
+ contentAfter: /*#__PURE__*/ React.createElement(CalendarMonthRegular, {
311
+ onClick: onIconClick
312
+ }),
313
+ readOnly: !allowTextInput,
314
+ role: 'combobox',
315
+ root: {
316
+ 'aria-owns': open ? popupSurfaceId : undefined,
317
+ ref: useMergedRefs(triggerWrapperRef, ref)
318
+ },
319
+ input: {
320
+ ref: rootRef
321
+ }
322
+ }
323
+ });
324
+ rootShorthand.onChange = mergeCallbacks(rootShorthand.onChange, onInputChange);
325
+ rootShorthand.onBlur = mergeCallbacks(rootShorthand.onBlur, onInputBlur);
326
+ rootShorthand.onKeyDown = mergeCallbacks(rootShorthand.onKeyDown, onInputKeyDown);
327
+ rootShorthand.onFocus = mergeCallbacks(rootShorthand.onFocus, onInputFocus);
328
+ rootShorthand.onClick = mergeCallbacks(rootShorthand.onClick, onInputClick);
329
+ const { modalAttributes } = useModalAttributes({
330
+ trapFocus: true,
331
+ alwaysFocusable: true,
332
+ legacyTrapFocus: false
333
+ });
334
+ const popupSurfaceShorthand = open ? resolveShorthand(props.popupSurface, {
335
+ required: true,
336
+ defaultProps: {
337
+ 'aria-label': 'Calendar',
338
+ 'aria-modal': true,
339
+ id: popupSurfaceId,
340
+ role: 'dialog',
341
+ ref: popupRef,
342
+ ...modalAttributes
233
343
  }
234
- break;
235
- default:
236
- break;
237
- }
238
- }, [calendarDismissed, dismissDatePickerPopup, open, props.allowTextInput, showDatePickerPopup, validateTextInput]);
239
- const onInputFocus = React.useCallback(() => {
240
- if (disableAutoFocus) {
241
- return;
242
- }
243
- if (!allowTextInput) {
244
- if (!preventFocusOpeningPicker.current) {
245
- showDatePickerPopup();
246
- }
247
- preventFocusOpeningPicker.current = false;
248
- }
249
- }, [allowTextInput, disableAutoFocus, preventFocusOpeningPicker, showDatePickerPopup]);
250
- const onInputClick = React.useCallback(() => {
251
- // default openOnClick to !props.disableAutoFocus for legacy support of disableAutoFocus behavior
252
- if ((props.openOnClick || !props.disableAutoFocus) && !open && !props.disabled) {
253
- showDatePickerPopup();
254
- return;
255
- }
256
- if (allowTextInput) {
257
- dismissDatePickerPopup();
258
- }
259
- }, [allowTextInput, dismissDatePickerPopup, open, props.disabled, props.disableAutoFocus, props.openOnClick, showDatePickerPopup]);
260
- const onIconClick = ev => {
261
- ev.stopPropagation();
262
- if (!open && !props.disabled) {
263
- showDatePickerPopup();
264
- } else if (props.allowTextInput) {
265
- dismissDatePickerPopup();
266
- }
267
- };
268
- const inputAppearance = underlined ? 'underline' : borderless ? 'filled-lighter' : 'outline';
269
- const [triggerWrapperRef, popupRef] = usePopupPositioning(props);
270
- const rootShorthand = resolveShorthand(restOfProps, {
271
- required: true,
272
- defaultProps: {
273
- appearance: inputAppearance,
274
- 'aria-controls': open ? popupSurfaceId : undefined,
275
- 'aria-expanded': open,
276
- 'aria-haspopup': 'dialog',
277
- contentAfter: /*#__PURE__*/React.createElement(CalendarMonthRegular, {
278
- onClick: onIconClick
279
- }),
280
- readOnly: !allowTextInput,
281
- role: 'combobox',
282
- root: {
283
- 'aria-owns': open ? popupSurfaceId : undefined,
284
- ref: useMergedRefs(triggerWrapperRef, ref)
285
- },
286
- input: {
287
- ref: rootRef
288
- }
289
- }
290
- });
291
- rootShorthand.onChange = mergeCallbacks(rootShorthand.onChange, onInputChange);
292
- rootShorthand.onBlur = mergeCallbacks(rootShorthand.onBlur, onInputBlur);
293
- rootShorthand.onKeyDown = mergeCallbacks(rootShorthand.onKeyDown, onInputKeyDown);
294
- rootShorthand.onFocus = mergeCallbacks(rootShorthand.onFocus, onInputFocus);
295
- rootShorthand.onClick = mergeCallbacks(rootShorthand.onClick, onInputClick);
296
- const {
297
- modalAttributes
298
- } = useModalAttributes({
299
- trapFocus: true,
300
- alwaysFocusable: true,
301
- legacyTrapFocus: false
302
- });
303
- const popupSurfaceShorthand = open ? resolveShorthand(props.popupSurface, {
304
- required: true,
305
- defaultProps: {
306
- 'aria-label': 'Calendar',
307
- 'aria-modal': true,
308
- id: popupSurfaceId,
309
- role: 'dialog',
310
- ref: popupRef,
311
- ...modalAttributes
312
- }
313
- }) : undefined;
314
- const {
315
- targetDocument
316
- } = useFluent();
317
- useOnClickOutside({
318
- element: targetDocument,
319
- callback: ev => dismissDatePickerPopup(),
320
- refs: [triggerWrapperRef, popupRef],
321
- disabled: !open
322
- });
323
- useOnScrollOutside({
324
- element: targetDocument,
325
- callback: ev => dismissDatePickerPopup(),
326
- refs: [triggerWrapperRef, popupRef],
327
- disabled: !open
328
- });
329
- // When the popup is opened, focus should go to the calendar.
330
- // In v8 this was done by focusing after the callout was positioned, but in v9 this can be simulated by using a
331
- // useEffect hook.
332
- React.useEffect(() => {
333
- if (open && !props.disabled && calendar.current) {
334
- calendar.current.focus();
335
- }
336
- }, [disableAutoFocus, open, props.disabled]);
337
- // When the popup is closed, focus should go back to the input.
338
- React.useEffect(() => {
339
- if (!open && !props.disabled) {
340
- focus();
341
- }
342
- }, [open, props.disabled, focus]);
343
- const calendarShorthand = resolveShorthand(props.calendar, {
344
- required: true,
345
- defaultProps: {
346
- allFocusable,
347
- componentRef: calendar,
348
- dateTimeFormatter,
349
- firstDayOfWeek,
350
- firstWeekOfYear,
351
- highlightCurrentMonth,
352
- highlightSelectedMonth,
353
- isMonthPickerVisible,
354
- maxDate,
355
- minDate,
356
- showCloseButton,
357
- showGoToToday,
358
- showMonthPickerAsOverlay,
359
- showWeekNumbers,
360
- strings,
361
- today,
362
- value: selectedDate || initialPickerDate
363
- }
364
- });
365
- calendarShorthand.onDismiss = mergeCallbacks(calendarShorthand.onDismiss, calendarDismissed);
366
- calendarShorthand.onSelectDate = mergeCallbacks(calendarShorthand.onSelectDate, calendarDismissed);
367
- React.useImperativeHandle(props.componentRef, () => ({
368
- focus,
369
- reset() {
370
- setOpen(false);
371
- setSelectedDate(undefined);
372
- },
373
- showDatePickerPopup
374
- }), [focus, setOpen, setSelectedDate, showDatePickerPopup]);
375
- const state = {
376
- disabled: !!props.disabled,
377
- inlinePopup,
378
- components: {
379
- root: Input,
380
- calendar: Calendar,
381
- popupSurface: 'div'
382
- },
383
- calendar: calendarShorthand,
384
- root: rootShorthand,
385
- popupSurface: popupSurfaceShorthand
386
- };
387
- state.root.value = formattedDate;
388
- return state;
344
+ }) : undefined;
345
+ const { targetDocument } = useFluent();
346
+ useOnClickOutside({
347
+ element: targetDocument,
348
+ callback: (ev)=>dismissDatePickerPopup(),
349
+ refs: [
350
+ triggerWrapperRef,
351
+ popupRef
352
+ ],
353
+ disabled: !open
354
+ });
355
+ useOnScrollOutside({
356
+ element: targetDocument,
357
+ callback: (ev)=>dismissDatePickerPopup(),
358
+ refs: [
359
+ triggerWrapperRef,
360
+ popupRef
361
+ ],
362
+ disabled: !open
363
+ });
364
+ // When the popup is opened, focus should go to the calendar.
365
+ // In v8 this was done by focusing after the callout was positioned, but in v9 this can be simulated by using a
366
+ // useEffect hook.
367
+ React.useEffect(()=>{
368
+ if (open && !props.disabled && calendar.current) {
369
+ calendar.current.focus();
370
+ }
371
+ }, [
372
+ disableAutoFocus,
373
+ open,
374
+ props.disabled
375
+ ]);
376
+ // When the popup is closed, focus should go back to the input.
377
+ React.useEffect(()=>{
378
+ if (!open && !props.disabled) {
379
+ focus();
380
+ }
381
+ // Focus function keeps changing, so we need to skip it in the deps
382
+ // eslint-disable-next-line react-hooks/exhaustive-deps
383
+ }, [
384
+ open,
385
+ props.disabled
386
+ ]);
387
+ const calendarShorthand = resolveShorthand(props.calendar, {
388
+ required: true,
389
+ defaultProps: {
390
+ allFocusable,
391
+ componentRef: calendar,
392
+ dateTimeFormatter,
393
+ firstDayOfWeek,
394
+ firstWeekOfYear,
395
+ highlightCurrentMonth,
396
+ highlightSelectedMonth,
397
+ isMonthPickerVisible,
398
+ maxDate,
399
+ minDate,
400
+ showCloseButton,
401
+ showGoToToday,
402
+ showMonthPickerAsOverlay,
403
+ showWeekNumbers,
404
+ strings,
405
+ today,
406
+ value: selectedDate || initialPickerDate
407
+ }
408
+ });
409
+ calendarShorthand.onDismiss = mergeCallbacks(calendarShorthand.onDismiss, calendarDismissed);
410
+ calendarShorthand.onSelectDate = mergeCallbacks(calendarShorthand.onSelectDate, calendarDismissed);
411
+ React.useImperativeHandle(props.componentRef, ()=>({
412
+ focus,
413
+ reset () {
414
+ setOpen(false);
415
+ setSelectedDate(undefined);
416
+ },
417
+ showDatePickerPopup
418
+ }), [
419
+ focus,
420
+ setOpen,
421
+ setSelectedDate,
422
+ showDatePickerPopup
423
+ ]);
424
+ const state = {
425
+ disabled: !!props.disabled,
426
+ inlinePopup,
427
+ components: {
428
+ root: Input,
429
+ calendar: Calendar,
430
+ popupSurface: 'div'
431
+ },
432
+ calendar: calendarShorthand,
433
+ root: rootShorthand,
434
+ popupSurface: popupSurfaceShorthand
435
+ };
436
+ state.root.value = formattedDate;
437
+ return state;
389
438
  };
390
- //# sourceMappingURL=useDatePicker.js.map