@gravity-ui/date-components 1.5.0 → 2.0.1

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 (265) hide show
  1. package/dist/cjs/components/Calendar/Calendar.d.ts +6 -5
  2. package/dist/cjs/components/Calendar/Calendar.js +4 -4
  3. package/dist/cjs/components/Calendar/index.d.ts +6 -6
  4. package/dist/cjs/components/Calendar/index.js +5 -5
  5. package/dist/cjs/components/{CalendarBase → CalendarView}/Calendar.css +9 -6
  6. package/dist/cjs/components/{CalendarBase/CalendarBase.d.ts → CalendarView/CalendarView.d.ts} +2 -2
  7. package/dist/cjs/components/{CalendarBase/CalendarBase.js → CalendarView/CalendarView.js} +4 -3
  8. package/dist/{esm/components/CalendarBase → cjs/components/CalendarView}/hooks/types.d.ts +37 -31
  9. package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.js +1 -2
  10. package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.d.ts +2 -2
  11. package/dist/{esm/components/CalendarBase → cjs/components/CalendarView}/hooks/useCalendarState.d.ts +1 -1
  12. package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarState.js +45 -23
  13. package/dist/cjs/components/CalendarView/hooks/useRangeCalendarState.d.ts +8 -0
  14. package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useRangeCalendarState.js +25 -14
  15. package/dist/cjs/components/DateField/DateField.d.ts +1 -4
  16. package/dist/cjs/components/DateField/DateField.js +3 -1
  17. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.d.ts +97 -0
  18. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.js +316 -0
  19. package/dist/cjs/components/DateField/hooks/useDateFieldProps.d.ts +6 -3
  20. package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +14 -12
  21. package/dist/cjs/components/DateField/hooks/useDateFieldState.d.ts +2 -65
  22. package/dist/cjs/components/DateField/hooks/useDateFieldState.js +98 -410
  23. package/dist/cjs/components/DateField/index.d.ts +1 -0
  24. package/dist/cjs/components/DateField/index.js +1 -0
  25. package/dist/cjs/components/DateField/utils.d.ts +10 -1
  26. package/dist/cjs/components/DateField/utils.js +114 -2
  27. package/dist/cjs/components/DatePicker/DatePicker.d.ts +4 -4
  28. package/dist/cjs/components/DatePicker/DatePicker.js +6 -6
  29. package/dist/cjs/components/DatePicker/MobileCalendar.css +6 -6
  30. package/dist/cjs/components/DatePicker/MobileCalendar.js +17 -12
  31. package/dist/cjs/components/DatePicker/hooks/useDatePickerProps.js +5 -16
  32. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.d.ts +5 -4
  33. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.js +71 -56
  34. package/dist/cjs/components/RangeCalendar/RangeCalendar.d.ts +3 -3
  35. package/dist/cjs/components/RangeCalendar/RangeCalendar.js +4 -4
  36. package/dist/cjs/components/RangeDateField/RangeDateField.css +4 -0
  37. package/dist/cjs/components/RangeDateField/RangeDateField.d.ts +12 -0
  38. package/dist/cjs/components/RangeDateField/RangeDateField.js +25 -0
  39. package/dist/cjs/components/RangeDateField/hooks/useRangeDateFieldState.d.ts +9 -0
  40. package/dist/cjs/components/RangeDateField/hooks/useRangeDateFieldState.js +227 -0
  41. package/dist/cjs/components/RangeDateField/index.d.ts +2 -0
  42. package/dist/cjs/components/RangeDateField/index.js +5 -0
  43. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.d.ts +5 -0
  44. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.js +9 -0
  45. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.d.ts +5 -0
  46. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.js +42 -0
  47. package/dist/cjs/components/RangeDateField/utils/index.d.ts +3 -0
  48. package/dist/cjs/components/RangeDateField/utils/index.js +6 -0
  49. package/dist/cjs/components/RangeDateField/utils/isValidRange.d.ts +3 -0
  50. package/dist/cjs/components/RangeDateField/utils/isValidRange.js +8 -0
  51. package/dist/cjs/components/RelativeDateField/RelativeDateField.d.ts +2 -2
  52. package/dist/cjs/components/RelativeDateField/RelativeDateField.js +5 -2
  53. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +5 -11
  54. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +3 -1
  55. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js +5 -4
  56. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.css +3 -0
  57. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.d.ts +2 -2
  58. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js +13 -2
  59. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +35 -27
  60. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +2 -2
  61. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +12 -16
  62. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.css +56 -0
  63. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +27 -0
  64. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +90 -0
  65. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.css +32 -0
  66. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +14 -0
  67. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js +43 -0
  68. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/en.json +8 -0
  69. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.d.ts +1 -0
  70. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.js +9 -0
  71. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/ru.json +8 -0
  72. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +16 -0
  73. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js +104 -0
  74. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.css +26 -0
  75. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.d.ts +18 -0
  76. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.js +67 -0
  77. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.css +14 -0
  78. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.d.ts +7 -0
  79. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.js +90 -0
  80. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/defaultPresets.d.ts +9 -0
  81. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/defaultPresets.js +186 -0
  82. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/en.json +40 -0
  83. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/index.d.ts +1 -0
  84. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/index.js +9 -0
  85. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/ru.json +40 -0
  86. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.d.ts +16 -0
  87. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.js +85 -0
  88. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.css +3 -0
  89. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.d.ts +9 -0
  90. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.js +62 -0
  91. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/en.json +4 -0
  92. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/index.d.ts +1 -0
  93. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/index.js +9 -0
  94. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/ru.json +4 -0
  95. package/dist/cjs/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.d.ts +26 -0
  96. package/dist/cjs/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js +58 -0
  97. package/dist/cjs/components/RelativeRangeDatePicker/i18n/en.json +8 -0
  98. package/dist/cjs/components/RelativeRangeDatePicker/i18n/index.d.ts +1 -0
  99. package/dist/cjs/components/RelativeRangeDatePicker/i18n/index.js +9 -0
  100. package/dist/cjs/components/RelativeRangeDatePicker/i18n/ru.json +8 -0
  101. package/dist/cjs/components/RelativeRangeDatePicker/index.d.ts +4 -0
  102. package/dist/cjs/components/RelativeRangeDatePicker/index.js +8 -0
  103. package/dist/cjs/components/RelativeRangeDatePicker/utils.d.ts +15 -0
  104. package/dist/cjs/components/RelativeRangeDatePicker/utils.js +53 -0
  105. package/dist/cjs/components/index.d.ts +3 -0
  106. package/dist/cjs/components/index.js +2 -0
  107. package/dist/cjs/components/types/datePicker.d.ts +5 -2
  108. package/dist/cjs/components/types/events.d.ts +4 -4
  109. package/dist/cjs/components/types/inputs.d.ts +10 -9
  110. package/dist/cjs/components/utils/dates.d.ts +1 -2
  111. package/dist/cjs/components/utils/useDefaultTimeZone.d.ts +2 -0
  112. package/dist/cjs/components/utils/useDefaultTimeZone.js +15 -0
  113. package/dist/cjs/components/utils/validation/datePicker.d.ts +6 -0
  114. package/dist/cjs/components/utils/validation/datePicker.js +30 -0
  115. package/dist/cjs/components/utils/validation/i18n/en.json +6 -0
  116. package/dist/cjs/components/utils/validation/i18n/index.d.ts +1 -0
  117. package/dist/cjs/components/utils/validation/i18n/index.js +9 -0
  118. package/dist/cjs/components/utils/validation/i18n/ru.json +6 -0
  119. package/dist/esm/components/Calendar/Calendar.d.ts +6 -5
  120. package/dist/esm/components/Calendar/Calendar.js +4 -4
  121. package/dist/esm/components/Calendar/index.d.ts +6 -6
  122. package/dist/esm/components/Calendar/index.js +5 -5
  123. package/dist/esm/components/{CalendarBase → CalendarView}/Calendar.css +9 -6
  124. package/dist/esm/components/{CalendarBase/CalendarBase.d.ts → CalendarView/CalendarView.d.ts} +2 -2
  125. package/dist/esm/components/{CalendarBase/CalendarBase.js → CalendarView/CalendarView.js} +3 -2
  126. package/dist/{cjs/components/CalendarBase → esm/components/CalendarView}/hooks/types.d.ts +37 -31
  127. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.js +1 -2
  128. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.d.ts +2 -2
  129. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.js +0 -1
  130. package/dist/{cjs/components/CalendarBase → esm/components/CalendarView}/hooks/useCalendarState.d.ts +1 -1
  131. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarState.js +46 -24
  132. package/dist/esm/components/CalendarView/hooks/useRangeCalendarState.d.ts +8 -0
  133. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useRangeCalendarState.js +24 -13
  134. package/dist/esm/components/DateField/DateField.d.ts +1 -4
  135. package/dist/esm/components/DateField/DateField.js +4 -2
  136. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.d.ts +97 -0
  137. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.js +311 -0
  138. package/dist/esm/components/DateField/hooks/useDateFieldProps.d.ts +6 -3
  139. package/dist/esm/components/DateField/hooks/useDateFieldProps.js +14 -12
  140. package/dist/esm/components/DateField/hooks/useDateFieldState.d.ts +2 -65
  141. package/dist/esm/components/DateField/hooks/useDateFieldState.js +97 -409
  142. package/dist/esm/components/DateField/index.d.ts +1 -0
  143. package/dist/esm/components/DateField/index.js +1 -0
  144. package/dist/esm/components/DateField/utils.d.ts +10 -1
  145. package/dist/esm/components/DateField/utils.js +105 -2
  146. package/dist/esm/components/DatePicker/DatePicker.d.ts +4 -4
  147. package/dist/esm/components/DatePicker/DatePicker.js +6 -6
  148. package/dist/esm/components/DatePicker/MobileCalendar.css +6 -6
  149. package/dist/esm/components/DatePicker/MobileCalendar.js +17 -12
  150. package/dist/esm/components/DatePicker/hooks/useDatePickerProps.js +5 -16
  151. package/dist/esm/components/DatePicker/hooks/useDatePickerState.d.ts +5 -4
  152. package/dist/esm/components/DatePicker/hooks/useDatePickerState.js +71 -56
  153. package/dist/esm/components/RangeCalendar/RangeCalendar.d.ts +3 -3
  154. package/dist/esm/components/RangeCalendar/RangeCalendar.js +4 -4
  155. package/dist/esm/components/RangeDateField/RangeDateField.css +4 -0
  156. package/dist/esm/components/RangeDateField/RangeDateField.d.ts +12 -0
  157. package/dist/esm/components/RangeDateField/RangeDateField.js +21 -0
  158. package/dist/esm/components/RangeDateField/hooks/useRangeDateFieldState.d.ts +9 -0
  159. package/dist/esm/components/RangeDateField/hooks/useRangeDateFieldState.js +222 -0
  160. package/dist/esm/components/RangeDateField/index.d.ts +2 -0
  161. package/dist/esm/components/RangeDateField/index.js +2 -0
  162. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.d.ts +5 -0
  163. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.js +5 -0
  164. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.d.ts +5 -0
  165. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.js +38 -0
  166. package/dist/esm/components/RangeDateField/utils/index.d.ts +3 -0
  167. package/dist/esm/components/RangeDateField/utils/index.js +3 -0
  168. package/dist/esm/components/RangeDateField/utils/isValidRange.d.ts +3 -0
  169. package/dist/esm/components/RangeDateField/utils/isValidRange.js +4 -0
  170. package/dist/esm/components/RelativeDateField/RelativeDateField.d.ts +2 -2
  171. package/dist/esm/components/RelativeDateField/RelativeDateField.js +5 -2
  172. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +5 -11
  173. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +3 -1
  174. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js +5 -4
  175. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.css +3 -0
  176. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.d.ts +2 -2
  177. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js +13 -2
  178. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +35 -27
  179. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +2 -2
  180. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +12 -16
  181. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.css +56 -0
  182. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +27 -0
  183. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +85 -0
  184. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.css +32 -0
  185. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +14 -0
  186. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js +39 -0
  187. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/en.json +8 -0
  188. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.d.ts +1 -0
  189. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.js +5 -0
  190. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/ru.json +8 -0
  191. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +16 -0
  192. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js +99 -0
  193. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.css +26 -0
  194. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.d.ts +18 -0
  195. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.js +62 -0
  196. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.css +14 -0
  197. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.d.ts +7 -0
  198. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.js +85 -0
  199. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/defaultPresets.d.ts +9 -0
  200. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/defaultPresets.js +183 -0
  201. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/en.json +40 -0
  202. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/index.d.ts +1 -0
  203. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/index.js +5 -0
  204. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/ru.json +40 -0
  205. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.d.ts +16 -0
  206. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.js +78 -0
  207. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.css +3 -0
  208. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.d.ts +9 -0
  209. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.js +58 -0
  210. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/en.json +4 -0
  211. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/index.d.ts +1 -0
  212. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/index.js +5 -0
  213. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/ru.json +4 -0
  214. package/dist/esm/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.d.ts +26 -0
  215. package/dist/esm/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js +53 -0
  216. package/dist/esm/components/RelativeRangeDatePicker/i18n/en.json +8 -0
  217. package/dist/esm/components/RelativeRangeDatePicker/i18n/index.d.ts +1 -0
  218. package/dist/esm/components/RelativeRangeDatePicker/i18n/index.js +5 -0
  219. package/dist/esm/components/RelativeRangeDatePicker/i18n/ru.json +8 -0
  220. package/dist/esm/components/RelativeRangeDatePicker/index.d.ts +4 -0
  221. package/dist/esm/components/RelativeRangeDatePicker/index.js +3 -0
  222. package/dist/esm/components/RelativeRangeDatePicker/utils.d.ts +15 -0
  223. package/dist/esm/components/RelativeRangeDatePicker/utils.js +46 -0
  224. package/dist/esm/components/index.d.ts +3 -0
  225. package/dist/esm/components/index.js +2 -0
  226. package/dist/esm/components/types/datePicker.d.ts +5 -2
  227. package/dist/esm/components/types/events.d.ts +4 -4
  228. package/dist/esm/components/types/inputs.d.ts +10 -9
  229. package/dist/esm/components/utils/dates.d.ts +1 -2
  230. package/dist/esm/components/utils/useDefaultTimeZone.d.ts +2 -0
  231. package/dist/esm/components/utils/useDefaultTimeZone.js +10 -0
  232. package/dist/esm/components/utils/validation/datePicker.d.ts +6 -0
  233. package/dist/esm/components/utils/validation/datePicker.js +26 -0
  234. package/dist/esm/components/utils/validation/i18n/en.json +6 -0
  235. package/dist/esm/components/utils/validation/i18n/index.d.ts +1 -0
  236. package/dist/esm/components/utils/validation/i18n/index.js +5 -0
  237. package/dist/esm/components/utils/validation/i18n/ru.json +6 -0
  238. package/package.json +27 -27
  239. package/dist/cjs/components/CalendarBase/hooks/useRangeCalendarState.d.ts +0 -7
  240. package/dist/cjs/components/hooks/useControlledState.d.ts +0 -1
  241. package/dist/cjs/components/hooks/useControlledState.js +0 -28
  242. package/dist/esm/components/CalendarBase/hooks/useRangeCalendarState.d.ts +0 -7
  243. package/dist/esm/components/hooks/useControlledState.d.ts +0 -1
  244. package/dist/esm/components/hooks/useControlledState.js +0 -23
  245. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/types.js +0 -0
  246. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.d.ts +0 -0
  247. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.js +0 -0
  248. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.d.ts +0 -0
  249. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.js +0 -0
  250. /package/dist/cjs/components/{CalendarBase → CalendarView}/i18n/en.json +0 -0
  251. /package/dist/cjs/components/{CalendarBase → CalendarView}/i18n/index.d.ts +0 -0
  252. /package/dist/cjs/components/{CalendarBase → CalendarView}/i18n/index.js +0 -0
  253. /package/dist/cjs/components/{CalendarBase → CalendarView}/i18n/ru.json +0 -0
  254. /package/dist/cjs/components/{CalendarBase → CalendarView}/utils.d.ts +0 -0
  255. /package/dist/cjs/components/{CalendarBase → CalendarView}/utils.js +0 -0
  256. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/types.js +0 -0
  257. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.d.ts +0 -0
  258. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.d.ts +0 -0
  259. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.js +0 -0
  260. /package/dist/esm/components/{CalendarBase → CalendarView}/i18n/en.json +0 -0
  261. /package/dist/esm/components/{CalendarBase → CalendarView}/i18n/index.d.ts +0 -0
  262. /package/dist/esm/components/{CalendarBase → CalendarView}/i18n/index.js +0 -0
  263. /package/dist/esm/components/{CalendarBase → CalendarView}/i18n/ru.json +0 -0
  264. /package/dist/esm/components/{CalendarBase → CalendarView}/utils.d.ts +0 -0
  265. /package/dist/esm/components/{CalendarBase → CalendarView}/utils.js +0 -0
@@ -1,8 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cleanString = exports.splitFormatIntoSections = exports.setSegment = exports.addSegment = exports.getDurationUnitFromSectionType = exports.getSectionValue = exports.getSectionLimits = exports.expandFormat = void 0;
3
+ exports.useFormatSections = exports.isAllSegmentsValid = exports.parseDateFromString = exports.formatSections = exports.getCurrentEditableSectionIndex = exports.toEditableSection = exports.isEditableSection = exports.getEditableSections = exports.cleanString = exports.splitFormatIntoSections = exports.setSegment = exports.addSegment = exports.getDurationUnitFromSectionType = exports.getSectionValue = exports.getSectionLimits = exports.expandFormat = exports.EDITABLE_SEGMENTS = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
4
6
  const date_utils_1 = require("@gravity-ui/date-utils");
7
+ const dates_1 = require("../utils/dates");
5
8
  const i18n_1 = require("./i18n");
9
+ exports.EDITABLE_SEGMENTS = {
10
+ year: true,
11
+ month: true,
12
+ day: true,
13
+ hour: true,
14
+ minute: true,
15
+ second: true,
16
+ dayPeriod: true,
17
+ weekday: true,
18
+ };
6
19
  function expandFormat(format) {
7
20
  const localeFormats = date_utils_1.settings.getLocaleData().formats;
8
21
  const getShortLocalizedFormatFromLongLocalizedFormat = (formatBis) => formatBis.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, (_, escapeSequence, localizedFormat) => escapeSequence || localizedFormat.slice(1));
@@ -320,7 +333,7 @@ function splitFormatIntoSections(format) {
320
333
  let isSeparator = false;
321
334
  let isInEscapeBoundary = false;
322
335
  for (let i = 0; i < expandedFormat.length; i++) {
323
- const char = expandedFormat[i];
336
+ const char = expandedFormat[i] || '';
324
337
  if (isInEscapeBoundary) {
325
338
  if (char === escapedCharacters.end) {
326
339
  isInEscapeBoundary = false;
@@ -419,3 +432,102 @@ function cleanString(dirtyString) {
419
432
  return dirtyString.replace(/[\u2066\u2067\u2068\u2069]/g, '');
420
433
  }
421
434
  exports.cleanString = cleanString;
435
+ function getEditableSections(sections, value, validSegments) {
436
+ let position = 1;
437
+ const newSections = [];
438
+ let previousEditableSection = -1;
439
+ for (let i = 0; i < sections.length; i++) {
440
+ const section = sections[i];
441
+ if (!section) {
442
+ continue;
443
+ }
444
+ const newSection = toEditableSection(section, value, validSegments, position, previousEditableSection);
445
+ newSections.push(newSection);
446
+ if (isEditableSection(section)) {
447
+ for (let j = Math.max(0, previousEditableSection); j <= i; j++) {
448
+ const prevSection = newSections[j];
449
+ if (prevSection) {
450
+ prevSection.nextEditableSection = i;
451
+ if (prevSection.previousEditableSection === -1) {
452
+ prevSection.previousEditableSection = i;
453
+ }
454
+ }
455
+ }
456
+ previousEditableSection = i;
457
+ }
458
+ position += newSection.textValue.length;
459
+ }
460
+ return newSections;
461
+ }
462
+ exports.getEditableSections = getEditableSections;
463
+ function isEditableSection(section) {
464
+ var _a;
465
+ return (_a = exports.EDITABLE_SEGMENTS[section.type]) !== null && _a !== void 0 ? _a : false;
466
+ }
467
+ exports.isEditableSection = isEditableSection;
468
+ function toEditableSection(section, value, validSegments, position, previousEditableSection) {
469
+ const isEditable = isEditableSection(section);
470
+ let renderedValue = section.placeholder;
471
+ if ((isEditable && validSegments[section.type]) || section.type === 'timeZoneName') {
472
+ renderedValue = value.format(section.format);
473
+ if (section.contentType === 'digit' && renderedValue.length < section.placeholder.length) {
474
+ renderedValue = renderedValue.padStart(section.placeholder.length, '0');
475
+ }
476
+ }
477
+ // use bidirectional context to allow the browser autodetect text direction
478
+ renderedValue = '\u2068' + renderedValue + '\u2069';
479
+ const sectionLength = renderedValue.length;
480
+ const newSection = Object.assign(Object.assign(Object.assign({}, section), { value: getSectionValue(section, value), textValue: renderedValue, start: position, end: position + sectionLength, modified: false, previousEditableSection, nextEditableSection: previousEditableSection }), getSectionLimits(section, value));
481
+ return newSection;
482
+ }
483
+ exports.toEditableSection = toEditableSection;
484
+ function getCurrentEditableSectionIndex(sections, selectedSections) {
485
+ const currentIndex = selectedSections === 'all' || selectedSections === -1 ? 0 : selectedSections;
486
+ const section = sections[currentIndex];
487
+ if (section && !exports.EDITABLE_SEGMENTS[section.type]) {
488
+ return section.nextEditableSection;
489
+ }
490
+ return section ? currentIndex : -1;
491
+ }
492
+ exports.getCurrentEditableSectionIndex = getCurrentEditableSectionIndex;
493
+ function formatSections(sections) {
494
+ // use ltr direction context to get predictable navigation inside input
495
+ return '\u2066' + sections.map((s) => s.textValue).join('') + '\u2069';
496
+ }
497
+ exports.formatSections = formatSections;
498
+ function parseDate(options) {
499
+ let date = (0, date_utils_1.dateTime)(options);
500
+ if (!(0, date_utils_1.isValid)(date)) {
501
+ date = (0, date_utils_1.dateTime)(Object.assign(Object.assign({}, options), { format: undefined }));
502
+ }
503
+ return date;
504
+ }
505
+ function isDateStringWithTimeZone(str) {
506
+ return /z$/i.test(str) || /[+-]\d\d:\d\d$/.test(str);
507
+ }
508
+ function parseDateFromString(str, format, timeZone) {
509
+ let date = parseDate({ input: str, format, timeZone });
510
+ if ((0, date_utils_1.isValid)(date)) {
511
+ if (timeZone && !isDateStringWithTimeZone(str)) {
512
+ const time = parseDate({ input: str, format });
513
+ date = (0, dates_1.mergeDateTime)(date, time);
514
+ }
515
+ }
516
+ return date;
517
+ }
518
+ exports.parseDateFromString = parseDateFromString;
519
+ function isAllSegmentsValid(allSegments, validSegments) {
520
+ return Object.keys(allSegments).every((key) => validSegments[key]);
521
+ }
522
+ exports.isAllSegmentsValid = isAllSegmentsValid;
523
+ function useFormatSections(format) {
524
+ const usedFormat = format;
525
+ const [sections, setSections] = react_1.default.useState(() => splitFormatIntoSections(usedFormat));
526
+ const [previousFormat, setFormat] = react_1.default.useState(usedFormat);
527
+ if (usedFormat !== previousFormat) {
528
+ setFormat(usedFormat);
529
+ setSections(splitFormatIntoSections(usedFormat));
530
+ }
531
+ return sections;
532
+ }
533
+ exports.useFormatSections = useFormatSections;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import { type CalendarProps } from '../Calendar';
3
- import type { AccessibilityProps, DateFieldBase, DomProps, FocusableProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
2
+ import type { CalendarProps } from '../Calendar';
3
+ import type { AccessibilityProps, DateFieldBase, DomProps, FocusableProps, InputDOMProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
4
4
  import './DatePicker.css';
5
- export interface DatePickerProps extends DateFieldBase, TextInputProps, FocusableProps, KeyboardEvents, DomProps, StyleProps, AccessibilityProps {
5
+ export interface DatePickerProps extends DateFieldBase, TextInputProps, FocusableProps, KeyboardEvents, DomProps, InputDOMProps, StyleProps, AccessibilityProps {
6
6
  children?: (props: CalendarProps) => React.ReactNode;
7
7
  }
8
- export declare function DatePicker({ value, defaultValue, onUpdate, className, ...props }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function DatePicker({ className, ...props }: DatePickerProps): import("react/jsx-runtime").JSX.Element;
@@ -14,13 +14,13 @@ const useDatePickerState_1 = require("./hooks/useDatePickerState");
14
14
  const utils_1 = require("./utils");
15
15
  require("./DatePicker.css");
16
16
  function DatePicker(_a) {
17
- var { value, defaultValue, onUpdate, className } = _a, props = tslib_1.__rest(_a, ["value", "defaultValue", "onUpdate", "className"]);
17
+ var { className } = _a, props = tslib_1.__rest(_a, ["className"]);
18
18
  const anchorRef = react_1.default.useRef(null);
19
- const state = (0, useDatePickerState_1.useDatePickerState)(Object.assign(Object.assign({}, props), { value,
20
- defaultValue,
21
- onUpdate }));
19
+ const state = (0, useDatePickerState_1.useDatePickerState)(props);
22
20
  const { groupProps, fieldProps, calendarButtonProps, popupProps, calendarProps, timeInputProps } = (0, useDatePickerProps_1.useDatePickerProps)(state, props);
23
- const [isMobile] = (0, uikit_1.useMobile)();
24
- return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: (0, utils_1.b)(null, className) }, groupProps, { children: [isMobile ? ((0, jsx_runtime_1.jsx)(MobileCalendar_1.MobileCalendar, { props: props, state: state })) : ((0, jsx_runtime_1.jsx)("div", { ref: anchorRef, className: (0, utils_1.b)('popup-anchor'), children: (0, jsx_runtime_1.jsx)(uikit_1.Popup, Object.assign({ anchorRef: anchorRef }, popupProps, { children: (0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.b)('popup-content'), children: [typeof props.children === 'function' ? (props.children(calendarProps)) : ((0, jsx_runtime_1.jsx)(Calendar_1.Calendar, Object.assign({}, calendarProps))), state.hasTime && ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.b)('time-field-wrapper'), children: (0, jsx_runtime_1.jsx)(DateField_1.DateField, Object.assign({}, timeInputProps)) }))] }) })) })), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, fieldProps, { className: (0, utils_1.b)('field', { mobile: isMobile }), hasClear: !isMobile && fieldProps.hasClear, rightContent: isMobile ? ((0, jsx_runtime_1.jsx)(MobileCalendar_1.MobileCalendarIcon, { props: props, state: state })) : ((0, jsx_runtime_1.jsx)(uikit_1.Button, Object.assign({}, calendarButtonProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }))) }))] })));
21
+ const isMobile = (0, uikit_1.useMobile)();
22
+ return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ className: (0, utils_1.b)(null, className) }, groupProps, { children: [isMobile ? ((0, jsx_runtime_1.jsx)(MobileCalendar_1.MobileCalendar, { props: props, state: state })) : ((0, jsx_runtime_1.jsx)("div", { ref: anchorRef, className: (0, utils_1.b)('popup-anchor'), children: (0, jsx_runtime_1.jsx)(uikit_1.Popup, Object.assign({ anchorRef: anchorRef }, popupProps, { children: (0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.b)('popup-content'), children: [typeof props.children === 'function' ? (props.children(calendarProps)) : ((0, jsx_runtime_1.jsx)(Calendar_1.Calendar, Object.assign({}, calendarProps))), state.hasTime && ((0, jsx_runtime_1.jsx)("div", { className: (0, utils_1.b)('time-field-wrapper'), children: (0, jsx_runtime_1.jsx)(DateField_1.DateField, Object.assign({}, timeInputProps)) }))] }) })) })), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, fieldProps, { className: (0, utils_1.b)('field', { mobile: isMobile }), hasClear: !isMobile && fieldProps.hasClear, endContent: isMobile ? ((0, jsx_runtime_1.jsx)(MobileCalendar_1.MobileCalendarIcon, { props: props, state: state })) : ((0, jsx_runtime_1.jsx)(uikit_1.Button, Object.assign({}, calendarButtonProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }))) })), (0, jsx_runtime_1.jsx)("input", { type: "text", hidden: true, name: props.name, value: state.value ? state.value.toISOString() : '',
23
+ // Ignore React warning
24
+ onChange: () => { } })] })));
25
25
  }
26
26
  exports.DatePicker = DatePicker;
@@ -26,10 +26,10 @@
26
26
  .g-date-mobile-calendar__input {
27
27
  position: absolute;
28
28
  z-index: 1;
29
- top: 0;
30
- left: 0;
29
+ inset-block-start: 0;
30
+ inset-inline-start: 0;
31
31
  box-sizing: border-box;
32
- width: 100%;
32
+ min-width: 100%;
33
33
  height: 100%;
34
34
  margin: 0;
35
35
  padding: 0;
@@ -39,9 +39,9 @@
39
39
  }
40
40
  .g-date-mobile-calendar__input::-webkit-calendar-picker-indicator {
41
41
  position: absolute;
42
- top: 0;
43
- left: 0;
44
- width: 100%;
42
+ inset-block-start: 0;
43
+ inset-inline-start: 0;
44
+ min-width: 100%;
45
45
  height: 100%;
46
46
  margin: 0;
47
47
  padding: 0;
@@ -11,6 +11,7 @@ const getButtonSizeForInput_1 = require("../utils/getButtonSizeForInput");
11
11
  require("./MobileCalendar.css");
12
12
  const b = (0, cn_1.block)('mobile-calendar');
13
13
  function MobileCalendar({ props, state }) {
14
+ var _a, _b;
14
15
  let type = 'date';
15
16
  if (state.hasTime && state.hasDate) {
16
17
  type = 'datetime-local';
@@ -18,31 +19,35 @@ function MobileCalendar({ props, state }) {
18
19
  else if (state.hasTime) {
19
20
  type = 'time';
20
21
  }
21
- return ((0, jsx_runtime_1.jsx)("input", { className: b('input'), disabled: props.disabled, type: type, value: formatNative(state.value || props.placeholderValue, type), id: props.id, min: formatNative(props.minValue, type), max: formatNative(props.maxValue, type), tabIndex: -1, onChange: (e) => {
22
+ return ((0, jsx_runtime_1.jsx)("input", { className: b('input'), disabled: props.disabled, type: type, value: formatNative(state.dateFieldState.displayValue, type), id: props.id, min: formatNative((_a = props.minValue) === null || _a === void 0 ? void 0 : _a.timeZone(state.timeZone), type), max: formatNative((_b = props.maxValue) === null || _b === void 0 ? void 0 : _b.timeZone(state.timeZone), type), tabIndex: -1, onChange: (e) => {
23
+ var _a, _b;
22
24
  if (props.readOnly) {
23
25
  return;
24
26
  }
25
27
  const newValue = e.target.value;
26
28
  if (newValue) {
27
- const localDate = (0, date_utils_1.dateTime)({ input: newValue, format: getDateFormat(type) });
29
+ const localDate = (0, date_utils_1.dateTime)({
30
+ input: newValue,
31
+ format: getDateFormat(type),
32
+ timeZone: 'system',
33
+ }).timeZone(state.timeZone, true);
28
34
  let newDate = state.hasDate
29
- ? (0, date_utils_1.dateTime)({
30
- input: newValue,
31
- format: getDateFormat(type),
32
- timeZone: props.timeZone,
33
- })
35
+ ? localDate
34
36
  : (0, dates_1.createPlaceholderValue)({
35
- placeholderValue: props.placeholderValue,
36
- timeZone: props.timeZone,
37
+ placeholderValue: (_a = props.placeholderValue) === null || _a === void 0 ? void 0 : _a.timeZone(state.timeZone),
38
+ timeZone: state.timeZone,
37
39
  });
38
40
  if (state.hasTime) {
39
41
  newDate = (0, dates_1.mergeDateTime)(newDate, localDate);
40
42
  }
41
- else if (state.dateValue) {
42
- newDate = (0, dates_1.mergeDateTime)(newDate, state.dateValue);
43
+ else if (state.value) {
44
+ newDate = (0, dates_1.mergeDateTime)(newDate, state.value.timeZone(state.timeZone));
43
45
  }
44
46
  else {
45
- newDate = newDate.set('hours', 0).set('minutes', 0).set('seconds', 0);
47
+ newDate = (0, dates_1.mergeDateTime)(newDate, (0, dates_1.createPlaceholderValue)({
48
+ placeholderValue: (_b = props.placeholderValue) === null || _b === void 0 ? void 0 : _b.timeZone(state.timeZone),
49
+ timeZone: state.timeZone,
50
+ }));
46
51
  }
47
52
  state.setValue(newDate);
48
53
  }
@@ -9,7 +9,6 @@ const getButtonSizeForInput_1 = require("../../utils/getButtonSizeForInput");
9
9
  const mergeProps_1 = require("../../utils/mergeProps");
10
10
  const i18n_1 = require("../i18n");
11
11
  function useDatePickerProps(state, _a) {
12
- var _b;
13
12
  var { onFocus, onBlur } = _a, props = tslib_1.__rest(_a, ["onFocus", "onBlur"]);
14
13
  const [isActive, setActive] = react_1.default.useState(false);
15
14
  const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
@@ -23,15 +22,6 @@ function useDatePickerProps(state, _a) {
23
22
  },
24
23
  });
25
24
  const { inputProps } = (0, DateField_1.useDateFieldProps)(state.dateFieldState, props);
26
- let error;
27
- let validationState = props.validationState;
28
- if (validationState) {
29
- error = validationState === 'invalid' ? props.errorMessage || true : undefined;
30
- }
31
- else {
32
- validationState = state.dateFieldState.validationState;
33
- error = validationState === 'invalid';
34
- }
35
25
  const inputRef = react_1.default.useRef(null);
36
26
  const handleRef = (0, uikit_1.useForkRef)(inputRef, inputProps.controlRef);
37
27
  const calendarRef = react_1.default.useRef(null);
@@ -53,7 +43,7 @@ function useDatePickerProps(state, _a) {
53
43
  } }),
54
44
  fieldProps: (0, mergeProps_1.mergeProps)(inputProps, state.dateFieldState.isEmpty && !isActive && props.placeholder
55
45
  ? { value: '' }
56
- : undefined, { controlRef: handleRef, error }),
46
+ : undefined, { controlRef: handleRef }),
57
47
  calendarButtonProps: {
58
48
  ref: calendarButtonRef,
59
49
  size: (0, getButtonSizeForInput_1.getButtonSizeForInput)(props.size),
@@ -84,7 +74,6 @@ function useDatePickerProps(state, _a) {
84
74
  focusInput();
85
75
  }
86
76
  },
87
- // @ts-expect-error focusTrap in popup was introduced in a newer version of uikit
88
77
  focusTrap: true,
89
78
  },
90
79
  calendarProps: {
@@ -99,20 +88,20 @@ function useDatePickerProps(state, _a) {
99
88
  focusInput();
100
89
  }
101
90
  },
102
- defaultFocusedValue: (_b = state.dateValue) !== null && _b !== void 0 ? _b : undefined,
103
- value: state.dateValue,
91
+ value: state.dateFieldState.displayValue,
104
92
  minValue: props.minValue,
105
93
  maxValue: props.maxValue,
106
94
  isDateUnavailable: props.isDateUnavailable,
107
- timeZone: props.timeZone,
95
+ timeZone: state.timeZone,
108
96
  },
109
97
  timeInputProps: {
110
98
  value: state.timeValue,
99
+ placeholderValue: state.dateFieldState.displayValue,
111
100
  onUpdate: state.setTimeValue,
112
101
  format: state.timeFormat,
113
102
  readOnly: state.readOnly,
114
103
  disabled: state.disabled,
115
- timeZone: props.timeZone,
104
+ timeZone: state.timeZone,
116
105
  hasClear: props.hasClear,
117
106
  size: props.size,
118
107
  },
@@ -6,21 +6,21 @@ export interface DatePickerState {
6
6
  /** The currently selected date. */
7
7
  value: DateTime | null;
8
8
  /** Sets the selected date. */
9
- setValue(value: DateTime | null): void;
9
+ setValue: (value: DateTime | null) => void;
10
10
  /**
11
11
  * The date portion of the value. This may be set prior to `value` if the user has
12
12
  * selected a date but has not yet selected a time.
13
13
  */
14
14
  dateValue: DateTime | null;
15
15
  /** Sets the date portion of the value. */
16
- setDateValue(value: DateTime): void;
16
+ setDateValue: (value: DateTime) => void;
17
17
  /**
18
18
  * The time portion of the value. This may be set prior to `value` if the user has
19
19
  * selected a time but has not yet selected a date.
20
20
  */
21
21
  timeValue: DateTime | null;
22
22
  /** Sets the time portion of the value. */
23
- setTimeValue(value: DateTime | null): void;
23
+ setTimeValue: (value: DateTime | null) => void;
24
24
  /** Whether the field is read only. */
25
25
  readOnly?: boolean;
26
26
  /** Whether the field is disabled. */
@@ -33,10 +33,11 @@ export interface DatePickerState {
33
33
  hasTime: boolean;
34
34
  /** Format of the time when rendered in the input. */
35
35
  timeFormat?: string;
36
+ timeZone: string;
36
37
  /** Whether the calendar popover is currently open. */
37
38
  isOpen: boolean;
38
39
  /** Sets whether the calendar popover is open. */
39
- setOpen(isOpen: boolean): void;
40
+ setOpen: (isOpen: boolean) => void;
40
41
  dateFieldState: DateFieldState;
41
42
  }
42
43
  export interface DatePickerStateOptions extends DateFieldBase {
@@ -3,67 +3,76 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useDatePickerState = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const uikit_1 = require("@gravity-ui/uikit");
6
7
  const DateField_1 = require("../../DateField");
7
- const utils_1 = require("../../DateField/utils");
8
- const useControlledState_1 = require("../../hooks/useControlledState");
9
8
  const dates_1 = require("../../utils/dates");
9
+ const useDefaultTimeZone_1 = require("../../utils/useDefaultTimeZone");
10
10
  function useDatePickerState(props) {
11
+ var _a;
11
12
  const { disabled, readOnly } = props;
12
13
  const [isOpen, setOpen] = react_1.default.useState(false);
13
- const [value, setValue] = (0, useControlledState_1.useControlledState)(props.value, props.defaultValue, props.onUpdate);
14
+ const [value, setValue] = (0, uikit_1.useControlledState)(props.value, (_a = props.defaultValue) !== null && _a !== void 0 ? _a : null, props.onUpdate);
14
15
  const [selectedDateInner, setSelectedDate] = react_1.default.useState(null);
15
16
  const [selectedTimeInner, setSelectedTime] = react_1.default.useState(null);
17
+ const inputTimeZone = (0, useDefaultTimeZone_1.useDefaultTimeZone)(props.value || props.defaultValue || props.placeholderValue);
18
+ const timeZone = props.timeZone || inputTimeZone;
16
19
  let selectedDate = selectedDateInner;
17
20
  let selectedTime = selectedTimeInner;
18
21
  const format = props.format || 'L';
19
- const { hasDate, hasTime, timeFormat } = react_1.default.useMemo(() => {
20
- const sections = (0, utils_1.splitFormatIntoSections)(format);
21
- let hasDate = false;
22
- let hasHours = false;
23
- let hasMinutes = false;
24
- let hasSeconds = false;
25
- for (const s of sections) {
26
- hasHours || (hasHours = s.type === 'hour');
27
- hasMinutes || (hasMinutes = s.type === 'minute');
28
- hasSeconds || (hasSeconds = s.type === 'second');
29
- hasDate || (hasDate = ['day', 'month', 'year'].includes(s.type));
30
- }
31
- return {
32
- hasTime: hasHours || hasMinutes || hasSeconds,
33
- timeFormat: hasSeconds ? 'LTS' : 'LT',
34
- hasDate,
35
- };
36
- }, [format]);
37
- if (value) {
38
- selectedDate = value;
39
- if (hasTime) {
40
- selectedTime = value;
41
- }
42
- }
43
22
  const commitValue = (date, time) => {
44
23
  if (disabled || readOnly) {
45
24
  return;
46
25
  }
47
- setValue((0, dates_1.mergeDateTime)(date, time));
26
+ setValue((0, dates_1.mergeDateTime)(date, time).timeZone(inputTimeZone));
48
27
  setSelectedDate(null);
49
28
  setSelectedTime(null);
50
29
  };
30
+ const dateFieldState = (0, DateField_1.useDateFieldState)({
31
+ value,
32
+ onUpdate(date) {
33
+ if (date) {
34
+ commitValue(date, date);
35
+ }
36
+ else {
37
+ setValue(null);
38
+ }
39
+ },
40
+ disabled,
41
+ readOnly,
42
+ validationState: props.validationState,
43
+ minValue: props.minValue,
44
+ maxValue: props.maxValue,
45
+ isDateUnavailable: props.isDateUnavailable,
46
+ format,
47
+ placeholderValue: props.placeholderValue,
48
+ timeZone,
49
+ });
50
+ const timeFormat = react_1.default.useMemo(() => {
51
+ const hasSeconds = dateFieldState.sections.some((s) => s.type === 'second');
52
+ return hasSeconds ? 'LTS' : 'LT';
53
+ }, [dateFieldState.sections]);
54
+ if (value) {
55
+ selectedDate = value.timeZone(timeZone);
56
+ if (dateFieldState.hasTime) {
57
+ selectedTime = value.timeZone(timeZone);
58
+ }
59
+ }
51
60
  // Intercept setValue to make sure the Time section is not changed by date selection in Calendar
52
61
  const selectDate = (newValue) => {
53
62
  if (disabled || readOnly) {
54
63
  return;
55
64
  }
56
- const shouldClose = !hasTime;
57
- if (hasTime) {
65
+ const shouldClose = !dateFieldState.hasTime;
66
+ if (dateFieldState.hasTime) {
58
67
  if (selectedTime || shouldClose) {
59
- commitValue(newValue, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
68
+ commitValue(newValue, selectedTime || newValue);
60
69
  }
61
70
  else {
62
71
  setSelectedDate(newValue);
63
72
  }
64
73
  }
65
74
  else {
66
- setValue(newValue);
75
+ commitValue(newValue, newValue);
67
76
  }
68
77
  if (shouldClose) {
69
78
  setOpen(false);
@@ -73,29 +82,33 @@ function useDatePickerState(props) {
73
82
  if (disabled || readOnly) {
74
83
  return;
75
84
  }
85
+ const newTime = newValue !== null && newValue !== void 0 ? newValue : (0, dates_1.createPlaceholderValue)({
86
+ placeholderValue: props.placeholderValue,
87
+ timeZone,
88
+ });
76
89
  if (selectedDate) {
77
- commitValue(selectedDate, newValue);
90
+ commitValue(selectedDate, newTime);
78
91
  }
79
92
  else {
80
- setSelectedTime(newValue);
93
+ setSelectedTime(newTime);
81
94
  }
82
95
  };
83
- const dateFieldState = (0, DateField_1.useDateFieldState)({
84
- value: value !== null && value !== void 0 ? value : null,
85
- onUpdate: setValue,
86
- disabled,
87
- readOnly,
88
- validationState: props.validationState,
89
- minValue: props.minValue,
90
- maxValue: props.maxValue,
91
- isDateUnavailable: props.isDateUnavailable,
92
- format,
93
- placeholderValue: props.placeholderValue,
94
- timeZone: props.timeZone,
95
- });
96
+ if (dateFieldState.hasTime && !selectedTime) {
97
+ selectedTime = dateFieldState.displayValue;
98
+ }
96
99
  return {
97
- value: value !== null && value !== void 0 ? value : null,
98
- setValue,
100
+ value,
101
+ setValue(newDate) {
102
+ if (props.readOnly || props.disabled) {
103
+ return;
104
+ }
105
+ if (newDate) {
106
+ setValue(newDate.timeZone(inputTimeZone));
107
+ }
108
+ else {
109
+ setValue(null);
110
+ }
111
+ },
99
112
  dateValue: selectedDate,
100
113
  timeValue: selectedTime,
101
114
  setDateValue: selectDate,
@@ -103,13 +116,18 @@ function useDatePickerState(props) {
103
116
  disabled,
104
117
  readOnly,
105
118
  format,
106
- hasDate,
107
- hasTime,
119
+ hasDate: dateFieldState.hasDate,
120
+ hasTime: dateFieldState.hasTime,
108
121
  timeFormat,
122
+ timeZone,
109
123
  isOpen,
110
124
  setOpen(newIsOpen) {
111
- if (!newIsOpen && !value && selectedDate && hasTime) {
112
- commitValue(selectedDate, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
125
+ if (!newIsOpen && !value && selectedDate && dateFieldState.hasTime) {
126
+ commitValue(selectedDate, selectedTime ||
127
+ (0, dates_1.createPlaceholderValue)({
128
+ placeholderValue: props.placeholderValue,
129
+ timeZone: inputTimeZone,
130
+ }));
113
131
  }
114
132
  setOpen(newIsOpen);
115
133
  },
@@ -117,6 +135,3 @@ function useDatePickerState(props) {
117
135
  };
118
136
  }
119
137
  exports.useDatePickerState = useDatePickerState;
120
- function getPlaceholderTime(placeholderValue, timeZone) {
121
- return (0, dates_1.createPlaceholderValue)({ placeholderValue, timeZone });
122
- }
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
- import type { CalendarInstance, CalendarSize } from '../CalendarBase/CalendarBase';
3
- import type { RangeCalendarStateOptions } from '../CalendarBase/hooks/useRangeCalendarState';
2
+ import type { CalendarInstance, CalendarSize } from '../CalendarView/CalendarView';
3
+ import type { RangeCalendarStateOptions } from '../CalendarView/hooks/useRangeCalendarState';
4
4
  import type { AccessibilityProps, DomProps, FocusEvents, StyleProps } from '../types';
5
- import '../CalendarBase/Calendar.css';
5
+ import '../CalendarView/Calendar.css';
6
6
  export interface RangeCalendarProps extends RangeCalendarStateOptions, DomProps, StyleProps, FocusEvents, AccessibilityProps {
7
7
  /**
8
8
  * The size of the element.
@@ -4,9 +4,9 @@ exports.RangeCalendar = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const react_1 = tslib_1.__importDefault(require("react"));
7
- const CalendarBase_1 = require("../CalendarBase/CalendarBase");
8
- const useRangeCalendarState_1 = require("../CalendarBase/hooks/useRangeCalendarState");
9
- require("../CalendarBase/Calendar.css");
7
+ const CalendarView_1 = require("../CalendarView/CalendarView");
8
+ const useRangeCalendarState_1 = require("../CalendarView/hooks/useRangeCalendarState");
9
+ require("../CalendarView/Calendar.css");
10
10
  exports.RangeCalendar = react_1.default.forwardRef(function Calendar(props, ref) {
11
11
  const state = (0, useRangeCalendarState_1.useRangeCalendarState)(props);
12
12
  const handleBlur = (e) => {
@@ -16,5 +16,5 @@ exports.RangeCalendar = react_1.default.forwardRef(function Calendar(props, ref)
16
16
  }
17
17
  (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
18
18
  };
19
- return (0, jsx_runtime_1.jsx)(CalendarBase_1.CalendarBase, Object.assign({ ref: ref }, props, { state: state, onBlur: handleBlur }));
19
+ return (0, jsx_runtime_1.jsx)(CalendarView_1.CalendarView, Object.assign({ ref: ref }, props, { state: state, onBlur: handleBlur }));
20
20
  });
@@ -0,0 +1,4 @@
1
+ .g-date-range-date-field {
2
+ display: inline-block;
3
+ width: auto;
4
+ }
@@ -0,0 +1,12 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { DateFieldProps } from '../DateField/hooks/useDateFieldProps';
3
+ import type { RangeValue } from '../types';
4
+ import './RangeDateField.css';
5
+ export type RangeDateFieldProps = DateFieldProps<RangeValue<DateTime>> & {
6
+ /**
7
+ * Delimiter separating the start and end parts of the range.
8
+ * @default ' — '
9
+ * */
10
+ delimiter?: string;
11
+ };
12
+ export declare function RangeDateField({ className, ...props }: RangeDateFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RangeDateField = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = tslib_1.__importDefault(require("react"));
7
+ const uikit_1 = require("@gravity-ui/uikit");
8
+ const cn_1 = require("../../utils/cn");
9
+ const useDateFieldProps_1 = require("../DateField/hooks/useDateFieldProps");
10
+ const useRangeDateFieldState_1 = require("./hooks/useRangeDateFieldState");
11
+ require("./RangeDateField.css");
12
+ const b = (0, cn_1.block)('range-date-field');
13
+ function RangeDateField(_a) {
14
+ var { className } = _a, props = tslib_1.__rest(_a, ["className"]);
15
+ const state = (0, useRangeDateFieldState_1.useRangeDateFieldState)(props);
16
+ const { inputProps } = (0, useDateFieldProps_1.useDateFieldProps)(state, props);
17
+ const [isActive, setActive] = react_1.default.useState(false);
18
+ const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
19
+ onFocusWithinChange(isFocusWithin) {
20
+ setActive(isFocusWithin);
21
+ },
22
+ });
23
+ return ((0, jsx_runtime_1.jsx)("div", Object.assign({ className: b(null, className), style: props.style }, focusWithinProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, inputProps, { value: state.isEmpty && !isActive && props.placeholder ? '' : inputProps.value })) })));
24
+ }
25
+ exports.RangeDateField = RangeDateField;
@@ -0,0 +1,9 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { BaseDateFieldState } from '../../DateField';
3
+ import type { DateFieldBase } from '../../types/datePicker';
4
+ import type { RangeValue } from '../../types/inputs';
5
+ export interface RangeDateFieldStateOptions extends DateFieldBase<RangeValue<DateTime>> {
6
+ delimiter?: string;
7
+ }
8
+ export type RangeDateFieldState = BaseDateFieldState<RangeValue<DateTime>>;
9
+ export declare function useRangeDateFieldState(props: RangeDateFieldStateOptions): RangeDateFieldState;