@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,5 +1,17 @@
1
- import { dateTime, settings } from '@gravity-ui/date-utils';
1
+ import React from 'react';
2
+ import { dateTime, isValid, settings } from '@gravity-ui/date-utils';
3
+ import { mergeDateTime } from '../utils/dates';
2
4
  import { i18n } from './i18n';
5
+ export const EDITABLE_SEGMENTS = {
6
+ year: true,
7
+ month: true,
8
+ day: true,
9
+ hour: true,
10
+ minute: true,
11
+ second: true,
12
+ dayPeriod: true,
13
+ weekday: true,
14
+ };
3
15
  export function expandFormat(format) {
4
16
  const localeFormats = settings.getLocaleData().formats;
5
17
  const getShortLocalizedFormatFromLongLocalizedFormat = (formatBis) => formatBis.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, (_, escapeSequence, localizedFormat) => escapeSequence || localizedFormat.slice(1));
@@ -311,7 +323,7 @@ export function splitFormatIntoSections(format) {
311
323
  let isSeparator = false;
312
324
  let isInEscapeBoundary = false;
313
325
  for (let i = 0; i < expandedFormat.length; i++) {
314
- const char = expandedFormat[i];
326
+ const char = expandedFormat[i] || '';
315
327
  if (isInEscapeBoundary) {
316
328
  if (char === escapedCharacters.end) {
317
329
  isInEscapeBoundary = false;
@@ -408,3 +420,94 @@ function getSectionOptions(section, token) {
408
420
  export function cleanString(dirtyString) {
409
421
  return dirtyString.replace(/[\u2066\u2067\u2068\u2069]/g, '');
410
422
  }
423
+ export function getEditableSections(sections, value, validSegments) {
424
+ let position = 1;
425
+ const newSections = [];
426
+ let previousEditableSection = -1;
427
+ for (let i = 0; i < sections.length; i++) {
428
+ const section = sections[i];
429
+ if (!section) {
430
+ continue;
431
+ }
432
+ const newSection = toEditableSection(section, value, validSegments, position, previousEditableSection);
433
+ newSections.push(newSection);
434
+ if (isEditableSection(section)) {
435
+ for (let j = Math.max(0, previousEditableSection); j <= i; j++) {
436
+ const prevSection = newSections[j];
437
+ if (prevSection) {
438
+ prevSection.nextEditableSection = i;
439
+ if (prevSection.previousEditableSection === -1) {
440
+ prevSection.previousEditableSection = i;
441
+ }
442
+ }
443
+ }
444
+ previousEditableSection = i;
445
+ }
446
+ position += newSection.textValue.length;
447
+ }
448
+ return newSections;
449
+ }
450
+ export function isEditableSection(section) {
451
+ var _a;
452
+ return (_a = EDITABLE_SEGMENTS[section.type]) !== null && _a !== void 0 ? _a : false;
453
+ }
454
+ export function toEditableSection(section, value, validSegments, position, previousEditableSection) {
455
+ const isEditable = isEditableSection(section);
456
+ let renderedValue = section.placeholder;
457
+ if ((isEditable && validSegments[section.type]) || section.type === 'timeZoneName') {
458
+ renderedValue = value.format(section.format);
459
+ if (section.contentType === 'digit' && renderedValue.length < section.placeholder.length) {
460
+ renderedValue = renderedValue.padStart(section.placeholder.length, '0');
461
+ }
462
+ }
463
+ // use bidirectional context to allow the browser autodetect text direction
464
+ renderedValue = '\u2068' + renderedValue + '\u2069';
465
+ const sectionLength = renderedValue.length;
466
+ 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));
467
+ return newSection;
468
+ }
469
+ export function getCurrentEditableSectionIndex(sections, selectedSections) {
470
+ const currentIndex = selectedSections === 'all' || selectedSections === -1 ? 0 : selectedSections;
471
+ const section = sections[currentIndex];
472
+ if (section && !EDITABLE_SEGMENTS[section.type]) {
473
+ return section.nextEditableSection;
474
+ }
475
+ return section ? currentIndex : -1;
476
+ }
477
+ export function formatSections(sections) {
478
+ // use ltr direction context to get predictable navigation inside input
479
+ return '\u2066' + sections.map((s) => s.textValue).join('') + '\u2069';
480
+ }
481
+ function parseDate(options) {
482
+ let date = dateTime(options);
483
+ if (!isValid(date)) {
484
+ date = dateTime(Object.assign(Object.assign({}, options), { format: undefined }));
485
+ }
486
+ return date;
487
+ }
488
+ function isDateStringWithTimeZone(str) {
489
+ return /z$/i.test(str) || /[+-]\d\d:\d\d$/.test(str);
490
+ }
491
+ export function parseDateFromString(str, format, timeZone) {
492
+ let date = parseDate({ input: str, format, timeZone });
493
+ if (isValid(date)) {
494
+ if (timeZone && !isDateStringWithTimeZone(str)) {
495
+ const time = parseDate({ input: str, format });
496
+ date = mergeDateTime(date, time);
497
+ }
498
+ }
499
+ return date;
500
+ }
501
+ export function isAllSegmentsValid(allSegments, validSegments) {
502
+ return Object.keys(allSegments).every((key) => validSegments[key]);
503
+ }
504
+ export function useFormatSections(format) {
505
+ const usedFormat = format;
506
+ const [sections, setSections] = React.useState(() => splitFormatIntoSections(usedFormat));
507
+ const [previousFormat, setFormat] = React.useState(usedFormat);
508
+ if (usedFormat !== previousFormat) {
509
+ setFormat(usedFormat);
510
+ setSections(splitFormatIntoSections(usedFormat));
511
+ }
512
+ return sections;
513
+ }
@@ -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;
@@ -11,12 +11,12 @@ import { useDatePickerState } from './hooks/useDatePickerState';
11
11
  import { b } from './utils';
12
12
  import './DatePicker.css';
13
13
  export function DatePicker(_a) {
14
- var { value, defaultValue, onUpdate, className } = _a, props = __rest(_a, ["value", "defaultValue", "onUpdate", "className"]);
14
+ var { className } = _a, props = __rest(_a, ["className"]);
15
15
  const anchorRef = React.useRef(null);
16
- const state = useDatePickerState(Object.assign(Object.assign({}, props), { value,
17
- defaultValue,
18
- onUpdate }));
16
+ const state = useDatePickerState(props);
19
17
  const { groupProps, fieldProps, calendarButtonProps, popupProps, calendarProps, timeInputProps } = useDatePickerProps(state, props);
20
- const [isMobile] = useMobile();
21
- return (_jsxs("div", Object.assign({ className: b(null, className) }, groupProps, { children: [isMobile ? (_jsx(MobileCalendar, { props: props, state: state })) : (_jsx("div", { ref: anchorRef, className: b('popup-anchor'), children: _jsx(Popup, Object.assign({ anchorRef: anchorRef }, popupProps, { children: _jsxs("div", { className: b('popup-content'), children: [typeof props.children === 'function' ? (props.children(calendarProps)) : (_jsx(Calendar, Object.assign({}, calendarProps))), state.hasTime && (_jsx("div", { className: b('time-field-wrapper'), children: _jsx(DateField, Object.assign({}, timeInputProps)) }))] }) })) })), _jsx(TextInput, Object.assign({}, fieldProps, { className: b('field', { mobile: isMobile }), hasClear: !isMobile && fieldProps.hasClear, rightContent: isMobile ? (_jsx(MobileCalendarIcon, { props: props, state: state })) : (_jsx(Button, Object.assign({}, calendarButtonProps, { children: _jsx(Icon, { data: CalendarIcon }) }))) }))] })));
18
+ const isMobile = useMobile();
19
+ return (_jsxs("div", Object.assign({ className: b(null, className) }, groupProps, { children: [isMobile ? (_jsx(MobileCalendar, { props: props, state: state })) : (_jsx("div", { ref: anchorRef, className: b('popup-anchor'), children: _jsx(Popup, Object.assign({ anchorRef: anchorRef }, popupProps, { children: _jsxs("div", { className: b('popup-content'), children: [typeof props.children === 'function' ? (props.children(calendarProps)) : (_jsx(Calendar, Object.assign({}, calendarProps))), state.hasTime && (_jsx("div", { className: b('time-field-wrapper'), children: _jsx(DateField, Object.assign({}, timeInputProps)) }))] }) })) })), _jsx(TextInput, Object.assign({}, fieldProps, { className: b('field', { mobile: isMobile }), hasClear: !isMobile && fieldProps.hasClear, endContent: isMobile ? (_jsx(MobileCalendarIcon, { props: props, state: state })) : (_jsx(Button, Object.assign({}, calendarButtonProps, { children: _jsx(Icon, { data: CalendarIcon }) }))) })), _jsx("input", { type: "text", hidden: true, name: props.name, value: state.value ? state.value.toISOString() : '',
20
+ // Ignore React warning
21
+ onChange: () => { } })] })));
22
22
  }
@@ -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;
@@ -8,6 +8,7 @@ import { getButtonSizeForInput } from '../utils/getButtonSizeForInput';
8
8
  import './MobileCalendar.css';
9
9
  const b = block('mobile-calendar');
10
10
  export function MobileCalendar({ props, state }) {
11
+ var _a, _b;
11
12
  let type = 'date';
12
13
  if (state.hasTime && state.hasDate) {
13
14
  type = 'datetime-local';
@@ -15,31 +16,35 @@ export function MobileCalendar({ props, state }) {
15
16
  else if (state.hasTime) {
16
17
  type = 'time';
17
18
  }
18
- return (_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) => {
19
+ return (_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) => {
20
+ var _a, _b;
19
21
  if (props.readOnly) {
20
22
  return;
21
23
  }
22
24
  const newValue = e.target.value;
23
25
  if (newValue) {
24
- const localDate = dateTime({ input: newValue, format: getDateFormat(type) });
26
+ const localDate = dateTime({
27
+ input: newValue,
28
+ format: getDateFormat(type),
29
+ timeZone: 'system',
30
+ }).timeZone(state.timeZone, true);
25
31
  let newDate = state.hasDate
26
- ? dateTime({
27
- input: newValue,
28
- format: getDateFormat(type),
29
- timeZone: props.timeZone,
30
- })
32
+ ? localDate
31
33
  : createPlaceholderValue({
32
- placeholderValue: props.placeholderValue,
33
- timeZone: props.timeZone,
34
+ placeholderValue: (_a = props.placeholderValue) === null || _a === void 0 ? void 0 : _a.timeZone(state.timeZone),
35
+ timeZone: state.timeZone,
34
36
  });
35
37
  if (state.hasTime) {
36
38
  newDate = mergeDateTime(newDate, localDate);
37
39
  }
38
- else if (state.dateValue) {
39
- newDate = mergeDateTime(newDate, state.dateValue);
40
+ else if (state.value) {
41
+ newDate = mergeDateTime(newDate, state.value.timeZone(state.timeZone));
40
42
  }
41
43
  else {
42
- newDate = newDate.set('hours', 0).set('minutes', 0).set('seconds', 0);
44
+ newDate = mergeDateTime(newDate, createPlaceholderValue({
45
+ placeholderValue: (_b = props.placeholderValue) === null || _b === void 0 ? void 0 : _b.timeZone(state.timeZone),
46
+ timeZone: state.timeZone,
47
+ }));
43
48
  }
44
49
  state.setValue(newDate);
45
50
  }
@@ -6,7 +6,6 @@ import { getButtonSizeForInput } from '../../utils/getButtonSizeForInput';
6
6
  import { mergeProps } from '../../utils/mergeProps';
7
7
  import { i18n } from '../i18n';
8
8
  export function useDatePickerProps(state, _a) {
9
- var _b;
10
9
  var { onFocus, onBlur } = _a, props = __rest(_a, ["onFocus", "onBlur"]);
11
10
  const [isActive, setActive] = React.useState(false);
12
11
  const { focusWithinProps } = useFocusWithin({
@@ -20,15 +19,6 @@ export function useDatePickerProps(state, _a) {
20
19
  },
21
20
  });
22
21
  const { inputProps } = useDateFieldProps(state.dateFieldState, props);
23
- let error;
24
- let validationState = props.validationState;
25
- if (validationState) {
26
- error = validationState === 'invalid' ? props.errorMessage || true : undefined;
27
- }
28
- else {
29
- validationState = state.dateFieldState.validationState;
30
- error = validationState === 'invalid';
31
- }
32
22
  const inputRef = React.useRef(null);
33
23
  const handleRef = useForkRef(inputRef, inputProps.controlRef);
34
24
  const calendarRef = React.useRef(null);
@@ -50,7 +40,7 @@ export function useDatePickerProps(state, _a) {
50
40
  } }),
51
41
  fieldProps: mergeProps(inputProps, state.dateFieldState.isEmpty && !isActive && props.placeholder
52
42
  ? { value: '' }
53
- : undefined, { controlRef: handleRef, error }),
43
+ : undefined, { controlRef: handleRef }),
54
44
  calendarButtonProps: {
55
45
  ref: calendarButtonRef,
56
46
  size: getButtonSizeForInput(props.size),
@@ -81,7 +71,6 @@ export function useDatePickerProps(state, _a) {
81
71
  focusInput();
82
72
  }
83
73
  },
84
- // @ts-expect-error focusTrap in popup was introduced in a newer version of uikit
85
74
  focusTrap: true,
86
75
  },
87
76
  calendarProps: {
@@ -96,20 +85,20 @@ export function useDatePickerProps(state, _a) {
96
85
  focusInput();
97
86
  }
98
87
  },
99
- defaultFocusedValue: (_b = state.dateValue) !== null && _b !== void 0 ? _b : undefined,
100
- value: state.dateValue,
88
+ value: state.dateFieldState.displayValue,
101
89
  minValue: props.minValue,
102
90
  maxValue: props.maxValue,
103
91
  isDateUnavailable: props.isDateUnavailable,
104
- timeZone: props.timeZone,
92
+ timeZone: state.timeZone,
105
93
  },
106
94
  timeInputProps: {
107
95
  value: state.timeValue,
96
+ placeholderValue: state.dateFieldState.displayValue,
108
97
  onUpdate: state.setTimeValue,
109
98
  format: state.timeFormat,
110
99
  readOnly: state.readOnly,
111
100
  disabled: state.disabled,
112
- timeZone: props.timeZone,
101
+ timeZone: state.timeZone,
113
102
  hasClear: props.hasClear,
114
103
  size: props.size,
115
104
  },
@@ -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 {
@@ -1,65 +1,74 @@
1
1
  import React from 'react';
2
+ import { useControlledState } from '@gravity-ui/uikit';
2
3
  import { useDateFieldState } from '../../DateField';
3
- import { splitFormatIntoSections } from '../../DateField/utils';
4
- import { useControlledState } from '../../hooks/useControlledState';
5
4
  import { createPlaceholderValue, mergeDateTime } from '../../utils/dates';
5
+ import { useDefaultTimeZone } from '../../utils/useDefaultTimeZone';
6
6
  export function useDatePickerState(props) {
7
+ var _a;
7
8
  const { disabled, readOnly } = props;
8
9
  const [isOpen, setOpen] = React.useState(false);
9
- const [value, setValue] = useControlledState(props.value, props.defaultValue, props.onUpdate);
10
+ const [value, setValue] = useControlledState(props.value, (_a = props.defaultValue) !== null && _a !== void 0 ? _a : null, props.onUpdate);
10
11
  const [selectedDateInner, setSelectedDate] = React.useState(null);
11
12
  const [selectedTimeInner, setSelectedTime] = React.useState(null);
13
+ const inputTimeZone = useDefaultTimeZone(props.value || props.defaultValue || props.placeholderValue);
14
+ const timeZone = props.timeZone || inputTimeZone;
12
15
  let selectedDate = selectedDateInner;
13
16
  let selectedTime = selectedTimeInner;
14
17
  const format = props.format || 'L';
15
- const { hasDate, hasTime, timeFormat } = React.useMemo(() => {
16
- const sections = splitFormatIntoSections(format);
17
- let hasDate = false;
18
- let hasHours = false;
19
- let hasMinutes = false;
20
- let hasSeconds = false;
21
- for (const s of sections) {
22
- hasHours || (hasHours = s.type === 'hour');
23
- hasMinutes || (hasMinutes = s.type === 'minute');
24
- hasSeconds || (hasSeconds = s.type === 'second');
25
- hasDate || (hasDate = ['day', 'month', 'year'].includes(s.type));
26
- }
27
- return {
28
- hasTime: hasHours || hasMinutes || hasSeconds,
29
- timeFormat: hasSeconds ? 'LTS' : 'LT',
30
- hasDate,
31
- };
32
- }, [format]);
33
- if (value) {
34
- selectedDate = value;
35
- if (hasTime) {
36
- selectedTime = value;
37
- }
38
- }
39
18
  const commitValue = (date, time) => {
40
19
  if (disabled || readOnly) {
41
20
  return;
42
21
  }
43
- setValue(mergeDateTime(date, time));
22
+ setValue(mergeDateTime(date, time).timeZone(inputTimeZone));
44
23
  setSelectedDate(null);
45
24
  setSelectedTime(null);
46
25
  };
26
+ const dateFieldState = useDateFieldState({
27
+ value,
28
+ onUpdate(date) {
29
+ if (date) {
30
+ commitValue(date, date);
31
+ }
32
+ else {
33
+ setValue(null);
34
+ }
35
+ },
36
+ disabled,
37
+ readOnly,
38
+ validationState: props.validationState,
39
+ minValue: props.minValue,
40
+ maxValue: props.maxValue,
41
+ isDateUnavailable: props.isDateUnavailable,
42
+ format,
43
+ placeholderValue: props.placeholderValue,
44
+ timeZone,
45
+ });
46
+ const timeFormat = React.useMemo(() => {
47
+ const hasSeconds = dateFieldState.sections.some((s) => s.type === 'second');
48
+ return hasSeconds ? 'LTS' : 'LT';
49
+ }, [dateFieldState.sections]);
50
+ if (value) {
51
+ selectedDate = value.timeZone(timeZone);
52
+ if (dateFieldState.hasTime) {
53
+ selectedTime = value.timeZone(timeZone);
54
+ }
55
+ }
47
56
  // Intercept setValue to make sure the Time section is not changed by date selection in Calendar
48
57
  const selectDate = (newValue) => {
49
58
  if (disabled || readOnly) {
50
59
  return;
51
60
  }
52
- const shouldClose = !hasTime;
53
- if (hasTime) {
61
+ const shouldClose = !dateFieldState.hasTime;
62
+ if (dateFieldState.hasTime) {
54
63
  if (selectedTime || shouldClose) {
55
- commitValue(newValue, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
64
+ commitValue(newValue, selectedTime || newValue);
56
65
  }
57
66
  else {
58
67
  setSelectedDate(newValue);
59
68
  }
60
69
  }
61
70
  else {
62
- setValue(newValue);
71
+ commitValue(newValue, newValue);
63
72
  }
64
73
  if (shouldClose) {
65
74
  setOpen(false);
@@ -69,29 +78,33 @@ export function useDatePickerState(props) {
69
78
  if (disabled || readOnly) {
70
79
  return;
71
80
  }
81
+ const newTime = newValue !== null && newValue !== void 0 ? newValue : createPlaceholderValue({
82
+ placeholderValue: props.placeholderValue,
83
+ timeZone,
84
+ });
72
85
  if (selectedDate) {
73
- commitValue(selectedDate, newValue);
86
+ commitValue(selectedDate, newTime);
74
87
  }
75
88
  else {
76
- setSelectedTime(newValue);
89
+ setSelectedTime(newTime);
77
90
  }
78
91
  };
79
- const dateFieldState = useDateFieldState({
80
- value: value !== null && value !== void 0 ? value : null,
81
- onUpdate: setValue,
82
- disabled,
83
- readOnly,
84
- validationState: props.validationState,
85
- minValue: props.minValue,
86
- maxValue: props.maxValue,
87
- isDateUnavailable: props.isDateUnavailable,
88
- format,
89
- placeholderValue: props.placeholderValue,
90
- timeZone: props.timeZone,
91
- });
92
+ if (dateFieldState.hasTime && !selectedTime) {
93
+ selectedTime = dateFieldState.displayValue;
94
+ }
92
95
  return {
93
- value: value !== null && value !== void 0 ? value : null,
94
- setValue,
96
+ value,
97
+ setValue(newDate) {
98
+ if (props.readOnly || props.disabled) {
99
+ return;
100
+ }
101
+ if (newDate) {
102
+ setValue(newDate.timeZone(inputTimeZone));
103
+ }
104
+ else {
105
+ setValue(null);
106
+ }
107
+ },
95
108
  dateValue: selectedDate,
96
109
  timeValue: selectedTime,
97
110
  setDateValue: selectDate,
@@ -99,19 +112,21 @@ export function useDatePickerState(props) {
99
112
  disabled,
100
113
  readOnly,
101
114
  format,
102
- hasDate,
103
- hasTime,
115
+ hasDate: dateFieldState.hasDate,
116
+ hasTime: dateFieldState.hasTime,
104
117
  timeFormat,
118
+ timeZone,
105
119
  isOpen,
106
120
  setOpen(newIsOpen) {
107
- if (!newIsOpen && !value && selectedDate && hasTime) {
108
- commitValue(selectedDate, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
121
+ if (!newIsOpen && !value && selectedDate && dateFieldState.hasTime) {
122
+ commitValue(selectedDate, selectedTime ||
123
+ createPlaceholderValue({
124
+ placeholderValue: props.placeholderValue,
125
+ timeZone: inputTimeZone,
126
+ }));
109
127
  }
110
128
  setOpen(newIsOpen);
111
129
  },
112
130
  dateFieldState,
113
131
  };
114
132
  }
115
- function getPlaceholderTime(placeholderValue, timeZone) {
116
- return createPlaceholderValue({ placeholderValue, timeZone });
117
- }
@@ -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.
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import React from 'react';
3
- import { CalendarBase } from '../CalendarBase/CalendarBase';
4
- import { useRangeCalendarState } from '../CalendarBase/hooks/useRangeCalendarState';
5
- import '../CalendarBase/Calendar.css';
3
+ import { CalendarView } from '../CalendarView/CalendarView';
4
+ import { useRangeCalendarState } from '../CalendarView/hooks/useRangeCalendarState';
5
+ import '../CalendarView/Calendar.css';
6
6
  export const RangeCalendar = React.forwardRef(function Calendar(props, ref) {
7
7
  const state = useRangeCalendarState(props);
8
8
  const handleBlur = (e) => {
@@ -12,5 +12,5 @@ export const RangeCalendar = React.forwardRef(function Calendar(props, ref) {
12
12
  }
13
13
  (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
14
14
  };
15
- return _jsx(CalendarBase, Object.assign({ ref: ref }, props, { state: state, onBlur: handleBlur }));
15
+ return _jsx(CalendarView, Object.assign({ ref: ref }, props, { state: state, onBlur: handleBlur }));
16
16
  });
@@ -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,21 @@
1
+ import { __rest } from "tslib";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { TextInput, useFocusWithin } from '@gravity-ui/uikit';
5
+ import { block } from '../../utils/cn';
6
+ import { useDateFieldProps } from '../DateField/hooks/useDateFieldProps';
7
+ import { useRangeDateFieldState } from './hooks/useRangeDateFieldState';
8
+ import './RangeDateField.css';
9
+ const b = block('range-date-field');
10
+ export function RangeDateField(_a) {
11
+ var { className } = _a, props = __rest(_a, ["className"]);
12
+ const state = useRangeDateFieldState(props);
13
+ const { inputProps } = useDateFieldProps(state, props);
14
+ const [isActive, setActive] = React.useState(false);
15
+ const { focusWithinProps } = useFocusWithin({
16
+ onFocusWithinChange(isFocusWithin) {
17
+ setActive(isFocusWithin);
18
+ },
19
+ });
20
+ return (_jsx("div", Object.assign({ className: b(null, className), style: props.style }, focusWithinProps, { children: _jsx(TextInput, Object.assign({}, inputProps, { value: state.isEmpty && !isActive && props.placeholder ? '' : inputProps.value })) })));
21
+ }
@@ -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;