@gravity-ui/date-components 1.6.0 → 2.1.0

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 (279) 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/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.js +17 -0
  12. package/dist/{esm/components/CalendarBase → cjs/components/CalendarView}/hooks/useCalendarState.d.ts +1 -1
  13. package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarState.js +45 -23
  14. package/dist/cjs/components/CalendarView/hooks/useRangeCalendarState.d.ts +8 -0
  15. package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useRangeCalendarState.js +25 -14
  16. package/dist/cjs/components/CalendarView/i18n/en.json +7 -0
  17. package/dist/cjs/components/CalendarView/i18n/index.d.ts +1 -0
  18. package/dist/cjs/components/CalendarView/i18n/ru.json +7 -0
  19. package/dist/cjs/components/DateField/DateField.d.ts +1 -4
  20. package/dist/cjs/components/DateField/DateField.js +3 -1
  21. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.d.ts +97 -0
  22. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.js +316 -0
  23. package/dist/cjs/components/DateField/hooks/useDateFieldProps.d.ts +6 -3
  24. package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +14 -12
  25. package/dist/cjs/components/DateField/hooks/useDateFieldState.d.ts +2 -65
  26. package/dist/cjs/components/DateField/hooks/useDateFieldState.js +98 -410
  27. package/dist/cjs/components/DateField/index.d.ts +1 -0
  28. package/dist/cjs/components/DateField/index.js +1 -0
  29. package/dist/cjs/components/DateField/utils.d.ts +10 -1
  30. package/dist/cjs/components/DateField/utils.js +114 -2
  31. package/dist/cjs/components/DatePicker/DatePicker.d.ts +4 -4
  32. package/dist/cjs/components/DatePicker/DatePicker.js +8 -6
  33. package/dist/cjs/components/DatePicker/MobileCalendar.css +7 -32
  34. package/dist/cjs/components/DatePicker/MobileCalendar.d.ts +0 -5
  35. package/dist/cjs/components/DatePicker/MobileCalendar.js +18 -20
  36. package/dist/cjs/components/DatePicker/StubButton.css +26 -0
  37. package/dist/cjs/components/DatePicker/StubButton.d.ts +8 -0
  38. package/dist/cjs/components/DatePicker/StubButton.js +12 -0
  39. package/dist/cjs/components/DatePicker/hooks/useDatePickerProps.js +7 -17
  40. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.d.ts +5 -4
  41. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.js +71 -56
  42. package/dist/cjs/components/RangeCalendar/RangeCalendar.d.ts +3 -3
  43. package/dist/cjs/components/RangeCalendar/RangeCalendar.js +4 -4
  44. package/dist/cjs/components/RangeDateField/RangeDateField.css +4 -0
  45. package/dist/cjs/components/RangeDateField/RangeDateField.d.ts +12 -0
  46. package/dist/cjs/components/RangeDateField/RangeDateField.js +25 -0
  47. package/dist/cjs/components/RangeDateField/hooks/useRangeDateFieldState.d.ts +9 -0
  48. package/dist/cjs/components/RangeDateField/hooks/useRangeDateFieldState.js +227 -0
  49. package/dist/cjs/components/RangeDateField/index.d.ts +2 -0
  50. package/dist/cjs/components/RangeDateField/index.js +5 -0
  51. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.d.ts +5 -0
  52. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.js +9 -0
  53. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.d.ts +5 -0
  54. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.js +42 -0
  55. package/dist/cjs/components/RangeDateField/utils/index.d.ts +3 -0
  56. package/dist/cjs/components/RangeDateField/utils/index.js +6 -0
  57. package/dist/cjs/components/RangeDateField/utils/isValidRange.d.ts +3 -0
  58. package/dist/cjs/components/RangeDateField/utils/isValidRange.js +8 -0
  59. package/dist/cjs/components/RelativeDateField/RelativeDateField.d.ts +2 -2
  60. package/dist/cjs/components/RelativeDateField/RelativeDateField.js +5 -2
  61. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +5 -11
  62. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +3 -1
  63. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js +5 -4
  64. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.css +3 -0
  65. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.d.ts +2 -2
  66. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js +15 -2
  67. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +35 -27
  68. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +2 -2
  69. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +12 -16
  70. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.css +56 -0
  71. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +27 -0
  72. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +90 -0
  73. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.css +32 -0
  74. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +14 -0
  75. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js +43 -0
  76. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/en.json +8 -0
  77. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.d.ts +1 -0
  78. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.js +9 -0
  79. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/i18n/ru.json +8 -0
  80. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +16 -0
  81. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js +104 -0
  82. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.css +26 -0
  83. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.d.ts +18 -0
  84. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.js +67 -0
  85. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.css +14 -0
  86. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.d.ts +7 -0
  87. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.js +90 -0
  88. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/defaultPresets.d.ts +9 -0
  89. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/defaultPresets.js +186 -0
  90. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/en.json +40 -0
  91. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/index.d.ts +1 -0
  92. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/index.js +9 -0
  93. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/i18n/ru.json +40 -0
  94. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.d.ts +16 -0
  95. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.js +85 -0
  96. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.css +3 -0
  97. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.d.ts +9 -0
  98. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.js +62 -0
  99. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/en.json +4 -0
  100. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/index.d.ts +1 -0
  101. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/index.js +9 -0
  102. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/i18n/ru.json +4 -0
  103. package/dist/cjs/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.d.ts +26 -0
  104. package/dist/cjs/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js +58 -0
  105. package/dist/cjs/components/RelativeRangeDatePicker/i18n/en.json +8 -0
  106. package/dist/cjs/components/RelativeRangeDatePicker/i18n/index.d.ts +1 -0
  107. package/dist/cjs/components/RelativeRangeDatePicker/i18n/index.js +9 -0
  108. package/dist/cjs/components/RelativeRangeDatePicker/i18n/ru.json +8 -0
  109. package/dist/cjs/components/RelativeRangeDatePicker/index.d.ts +4 -0
  110. package/dist/cjs/components/RelativeRangeDatePicker/index.js +8 -0
  111. package/dist/cjs/components/RelativeRangeDatePicker/utils.d.ts +15 -0
  112. package/dist/cjs/components/RelativeRangeDatePicker/utils.js +53 -0
  113. package/dist/cjs/components/index.d.ts +3 -0
  114. package/dist/cjs/components/index.js +2 -0
  115. package/dist/cjs/components/types/datePicker.d.ts +5 -2
  116. package/dist/cjs/components/types/events.d.ts +4 -4
  117. package/dist/cjs/components/types/inputs.d.ts +10 -9
  118. package/dist/cjs/components/utils/dates.d.ts +1 -2
  119. package/dist/cjs/components/utils/useDefaultTimeZone.d.ts +2 -0
  120. package/dist/cjs/components/utils/useDefaultTimeZone.js +15 -0
  121. package/dist/cjs/components/utils/validation/datePicker.d.ts +6 -0
  122. package/dist/cjs/components/utils/validation/datePicker.js +30 -0
  123. package/dist/cjs/components/utils/validation/i18n/en.json +6 -0
  124. package/dist/cjs/components/utils/validation/i18n/index.d.ts +1 -0
  125. package/dist/cjs/components/utils/validation/i18n/index.js +9 -0
  126. package/dist/cjs/components/utils/validation/i18n/ru.json +6 -0
  127. package/dist/esm/components/Calendar/Calendar.d.ts +6 -5
  128. package/dist/esm/components/Calendar/Calendar.js +4 -4
  129. package/dist/esm/components/Calendar/index.d.ts +6 -6
  130. package/dist/esm/components/Calendar/index.js +5 -5
  131. package/dist/esm/components/{CalendarBase → CalendarView}/Calendar.css +9 -6
  132. package/dist/esm/components/{CalendarBase/CalendarBase.d.ts → CalendarView/CalendarView.d.ts} +2 -2
  133. package/dist/esm/components/{CalendarBase/CalendarBase.js → CalendarView/CalendarView.js} +3 -2
  134. package/dist/{cjs/components/CalendarBase → esm/components/CalendarView}/hooks/types.d.ts +37 -31
  135. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.js +1 -2
  136. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.d.ts +2 -2
  137. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.js +0 -1
  138. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.js +17 -0
  139. package/dist/{cjs/components/CalendarBase → esm/components/CalendarView}/hooks/useCalendarState.d.ts +1 -1
  140. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarState.js +46 -24
  141. package/dist/esm/components/CalendarView/hooks/useRangeCalendarState.d.ts +8 -0
  142. package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useRangeCalendarState.js +24 -13
  143. package/dist/esm/components/CalendarView/i18n/en.json +7 -0
  144. package/dist/esm/components/CalendarView/i18n/index.d.ts +1 -0
  145. package/dist/esm/components/CalendarView/i18n/ru.json +7 -0
  146. package/dist/esm/components/DateField/DateField.d.ts +1 -4
  147. package/dist/esm/components/DateField/DateField.js +4 -2
  148. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.d.ts +97 -0
  149. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.js +311 -0
  150. package/dist/esm/components/DateField/hooks/useDateFieldProps.d.ts +6 -3
  151. package/dist/esm/components/DateField/hooks/useDateFieldProps.js +14 -12
  152. package/dist/esm/components/DateField/hooks/useDateFieldState.d.ts +2 -65
  153. package/dist/esm/components/DateField/hooks/useDateFieldState.js +97 -409
  154. package/dist/esm/components/DateField/index.d.ts +1 -0
  155. package/dist/esm/components/DateField/index.js +1 -0
  156. package/dist/esm/components/DateField/utils.d.ts +10 -1
  157. package/dist/esm/components/DateField/utils.js +105 -2
  158. package/dist/esm/components/DatePicker/DatePicker.d.ts +4 -4
  159. package/dist/esm/components/DatePicker/DatePicker.js +10 -8
  160. package/dist/esm/components/DatePicker/MobileCalendar.css +7 -32
  161. package/dist/esm/components/DatePicker/MobileCalendar.d.ts +0 -5
  162. package/dist/esm/components/DatePicker/MobileCalendar.js +17 -18
  163. package/dist/esm/components/DatePicker/StubButton.css +26 -0
  164. package/dist/esm/components/DatePicker/StubButton.d.ts +8 -0
  165. package/dist/esm/components/DatePicker/StubButton.js +8 -0
  166. package/dist/esm/components/DatePicker/hooks/useDatePickerProps.js +7 -17
  167. package/dist/esm/components/DatePicker/hooks/useDatePickerState.d.ts +5 -4
  168. package/dist/esm/components/DatePicker/hooks/useDatePickerState.js +71 -56
  169. package/dist/esm/components/RangeCalendar/RangeCalendar.d.ts +3 -3
  170. package/dist/esm/components/RangeCalendar/RangeCalendar.js +4 -4
  171. package/dist/esm/components/RangeDateField/RangeDateField.css +4 -0
  172. package/dist/esm/components/RangeDateField/RangeDateField.d.ts +12 -0
  173. package/dist/esm/components/RangeDateField/RangeDateField.js +21 -0
  174. package/dist/esm/components/RangeDateField/hooks/useRangeDateFieldState.d.ts +9 -0
  175. package/dist/esm/components/RangeDateField/hooks/useRangeDateFieldState.js +222 -0
  176. package/dist/esm/components/RangeDateField/index.d.ts +2 -0
  177. package/dist/esm/components/RangeDateField/index.js +2 -0
  178. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.d.ts +5 -0
  179. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.js +5 -0
  180. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.d.ts +5 -0
  181. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.js +38 -0
  182. package/dist/esm/components/RangeDateField/utils/index.d.ts +3 -0
  183. package/dist/esm/components/RangeDateField/utils/index.js +3 -0
  184. package/dist/esm/components/RangeDateField/utils/isValidRange.d.ts +3 -0
  185. package/dist/esm/components/RangeDateField/utils/isValidRange.js +4 -0
  186. package/dist/esm/components/RelativeDateField/RelativeDateField.d.ts +2 -2
  187. package/dist/esm/components/RelativeDateField/RelativeDateField.js +5 -2
  188. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +5 -11
  189. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +3 -1
  190. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js +5 -4
  191. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.css +3 -0
  192. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.d.ts +2 -2
  193. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js +17 -4
  194. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +35 -27
  195. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +2 -2
  196. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +12 -16
  197. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.css +56 -0
  198. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +27 -0
  199. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +85 -0
  200. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.css +32 -0
  201. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +14 -0
  202. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js +39 -0
  203. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/en.json +8 -0
  204. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.d.ts +1 -0
  205. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/index.js +5 -0
  206. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/i18n/ru.json +8 -0
  207. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +16 -0
  208. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js +99 -0
  209. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.css +26 -0
  210. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.d.ts +18 -0
  211. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.js +62 -0
  212. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.css +14 -0
  213. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.d.ts +7 -0
  214. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/PresetsDoc.js +85 -0
  215. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/defaultPresets.d.ts +9 -0
  216. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/defaultPresets.js +183 -0
  217. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/en.json +40 -0
  218. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/index.d.ts +1 -0
  219. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/index.js +5 -0
  220. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/i18n/ru.json +40 -0
  221. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.d.ts +16 -0
  222. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.js +78 -0
  223. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.css +3 -0
  224. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.d.ts +9 -0
  225. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.js +58 -0
  226. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/en.json +4 -0
  227. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/index.d.ts +1 -0
  228. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/index.js +5 -0
  229. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/i18n/ru.json +4 -0
  230. package/dist/esm/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.d.ts +26 -0
  231. package/dist/esm/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js +53 -0
  232. package/dist/esm/components/RelativeRangeDatePicker/i18n/en.json +8 -0
  233. package/dist/esm/components/RelativeRangeDatePicker/i18n/index.d.ts +1 -0
  234. package/dist/esm/components/RelativeRangeDatePicker/i18n/index.js +5 -0
  235. package/dist/esm/components/RelativeRangeDatePicker/i18n/ru.json +8 -0
  236. package/dist/esm/components/RelativeRangeDatePicker/index.d.ts +4 -0
  237. package/dist/esm/components/RelativeRangeDatePicker/index.js +3 -0
  238. package/dist/esm/components/RelativeRangeDatePicker/utils.d.ts +15 -0
  239. package/dist/esm/components/RelativeRangeDatePicker/utils.js +46 -0
  240. package/dist/esm/components/index.d.ts +3 -0
  241. package/dist/esm/components/index.js +2 -0
  242. package/dist/esm/components/types/datePicker.d.ts +5 -2
  243. package/dist/esm/components/types/events.d.ts +4 -4
  244. package/dist/esm/components/types/inputs.d.ts +10 -9
  245. package/dist/esm/components/utils/dates.d.ts +1 -2
  246. package/dist/esm/components/utils/useDefaultTimeZone.d.ts +2 -0
  247. package/dist/esm/components/utils/useDefaultTimeZone.js +10 -0
  248. package/dist/esm/components/utils/validation/datePicker.d.ts +6 -0
  249. package/dist/esm/components/utils/validation/datePicker.js +26 -0
  250. package/dist/esm/components/utils/validation/i18n/en.json +6 -0
  251. package/dist/esm/components/utils/validation/i18n/index.d.ts +1 -0
  252. package/dist/esm/components/utils/validation/i18n/index.js +5 -0
  253. package/dist/esm/components/utils/validation/i18n/ru.json +6 -0
  254. package/package.json +28 -28
  255. package/dist/cjs/components/CalendarBase/hooks/useRangeCalendarState.d.ts +0 -7
  256. package/dist/cjs/components/CalendarBase/i18n/en.json +0 -4
  257. package/dist/cjs/components/CalendarBase/i18n/index.d.ts +0 -1
  258. package/dist/cjs/components/CalendarBase/i18n/ru.json +0 -4
  259. package/dist/cjs/components/hooks/useControlledState.d.ts +0 -1
  260. package/dist/cjs/components/hooks/useControlledState.js +0 -28
  261. package/dist/esm/components/CalendarBase/hooks/useRangeCalendarState.d.ts +0 -7
  262. package/dist/esm/components/CalendarBase/i18n/en.json +0 -4
  263. package/dist/esm/components/CalendarBase/i18n/index.d.ts +0 -1
  264. package/dist/esm/components/CalendarBase/i18n/ru.json +0 -4
  265. package/dist/esm/components/hooks/useControlledState.d.ts +0 -1
  266. package/dist/esm/components/hooks/useControlledState.js +0 -23
  267. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/types.js +0 -0
  268. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.d.ts +0 -0
  269. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarGridProps.js +0 -0
  270. /package/dist/cjs/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.d.ts +0 -0
  271. /package/dist/cjs/components/{CalendarBase → CalendarView}/i18n/index.js +0 -0
  272. /package/dist/cjs/components/{CalendarBase → CalendarView}/utils.d.ts +0 -0
  273. /package/dist/cjs/components/{CalendarBase → CalendarView}/utils.js +0 -0
  274. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/types.js +0 -0
  275. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarCellProps.d.ts +0 -0
  276. /package/dist/esm/components/{CalendarBase → CalendarView}/hooks/useCalendarProps.d.ts +0 -0
  277. /package/dist/esm/components/{CalendarBase → CalendarView}/i18n/index.js +0 -0
  278. /package/dist/esm/components/{CalendarBase → CalendarView}/utils.d.ts +0 -0
  279. /package/dist/esm/components/{CalendarBase → CalendarView}/utils.js +0 -0
@@ -2,24 +2,25 @@ import { __rest } from "tslib";
2
2
  import React from 'react';
3
3
  import { useFocusWithin, useForkRef } from '@gravity-ui/uikit';
4
4
  import { useDateFieldProps } from '../../DateField';
5
+ import { useRelativeDateFieldProps } from '../../RelativeDateField';
5
6
  import { getButtonSizeForInput } from '../../utils/getButtonSizeForInput';
6
7
  import { mergeProps } from '../../utils/mergeProps';
7
8
  import { i18n } from '../i18n';
8
9
  export function useRelativeDatePickerProps(state, _a) {
9
10
  var { onFocus, onBlur } = _a, props = __rest(_a, ["onFocus", "onBlur"]);
10
- const { mode, setMode, datePickerState, dateFieldState, relativeDateState } = state;
11
- const [focusedDate, setFocusedDate] = React.useState(relativeDateState.lastCorrectDate);
11
+ const { mode, setMode, datePickerState, relativeDateState } = state;
12
+ const [focusedDate, setFocusedDate] = React.useState(mode === 'relative'
13
+ ? relativeDateState.lastCorrectDate
14
+ : datePickerState.dateFieldState.displayValue);
12
15
  const [prevCorrectDate, setPrevCorrectDate] = React.useState(relativeDateState.lastCorrectDate);
13
16
  if (prevCorrectDate !== relativeDateState.lastCorrectDate) {
14
17
  setPrevCorrectDate(relativeDateState.lastCorrectDate);
15
18
  setFocusedDate(relativeDateState.lastCorrectDate);
16
19
  }
17
- const [prevDateValue, setPrevDateValue] = React.useState(datePickerState.dateValue);
18
- if (datePickerState.dateValue !== prevDateValue) {
19
- setPrevDateValue(datePickerState.dateValue);
20
- if (datePickerState.dateValue) {
21
- setFocusedDate(datePickerState.dateValue);
22
- }
20
+ const [prevDateValue, setPrevDateValue] = React.useState(datePickerState.dateFieldState.displayValue);
21
+ if (!datePickerState.dateFieldState.displayValue.isSame(prevDateValue, 'day')) {
22
+ setPrevDateValue(datePickerState.dateFieldState.displayValue);
23
+ setFocusedDate(datePickerState.dateFieldState.displayValue);
23
24
  }
24
25
  const { focusWithinProps } = useFocusWithin({
25
26
  onFocusWithin: onFocus,
@@ -34,6 +35,18 @@ export function useRelativeDatePickerProps(state, _a) {
34
35
  if (!state.isActive && isOpen) {
35
36
  setOpen(false);
36
37
  }
38
+ const [prevOpen, setPrevOpen] = React.useState(isOpen);
39
+ if (isOpen !== prevOpen) {
40
+ setPrevOpen(isOpen);
41
+ if (!isOpen) {
42
+ // FIXME: use popup afterOpenChange instead.
43
+ setTimeout(() => {
44
+ setFocusedDate(mode === 'relative'
45
+ ? relativeDateState.lastCorrectDate
46
+ : datePickerState.dateFieldState.displayValue);
47
+ }, 200);
48
+ }
49
+ }
37
50
  const commonInputProps = {
38
51
  onFocus: () => {
39
52
  if (!state.isActive) {
@@ -41,27 +54,17 @@ export function useRelativeDatePickerProps(state, _a) {
41
54
  setOpen(true);
42
55
  }
43
56
  },
57
+ errorMessage: props.errorMessage,
58
+ errorPlacement: props.errorPlacement,
44
59
  };
45
- const { inputProps } = useDateFieldProps(dateFieldState, Object.assign(Object.assign({}, props), { value: undefined, defaultValue: undefined, onUpdate: undefined }));
46
- const relativeDateProps = {
47
- disabled: relativeDateState.disabled,
48
- value: relativeDateState.text,
49
- onUpdate: relativeDateState.setText,
50
- hasClear: props.hasClear && !relativeDateState.readOnly,
51
- placeholder: props.placeholder,
52
- size: props.size,
53
- };
54
- let error;
60
+ const { inputProps } = useDateFieldProps(datePickerState.dateFieldState, Object.assign(Object.assign({}, props), { value: undefined, defaultValue: undefined, onUpdate: undefined }));
61
+ const { inputProps: relativeDateProps } = useRelativeDateFieldProps(relativeDateState, Object.assign(Object.assign({}, props), { value: undefined, defaultValue: undefined, onUpdate: undefined }));
55
62
  let validationState = props.validationState;
56
- if (validationState) {
57
- error = validationState === 'invalid' ? props.errorMessage || true : undefined;
58
- }
59
- else {
63
+ if (!validationState) {
60
64
  validationState =
61
65
  mode === 'relative'
62
66
  ? relativeDateState.validationState
63
- : dateFieldState.validationState;
64
- error = validationState === 'invalid';
67
+ : datePickerState.dateFieldState.validationState;
65
68
  }
66
69
  const inputRef = React.useRef(null);
67
70
  const handleRef = useForkRef(inputRef, mode === 'relative' ? relativeDateProps.controlRef : inputProps.controlRef);
@@ -87,14 +90,17 @@ export function useRelativeDatePickerProps(state, _a) {
87
90
  focusCalendar();
88
91
  }
89
92
  } }),
90
- fieldProps: mergeProps(commonInputProps, mode === 'relative' ? relativeDateProps : inputProps, mode === 'absolute' && dateFieldState.isEmpty && !state.isActive && props.placeholder
93
+ fieldProps: mergeProps(commonInputProps, mode === 'relative' ? relativeDateProps : inputProps, mode === 'absolute' &&
94
+ datePickerState.dateFieldState.isEmpty &&
95
+ !state.isActive &&
96
+ props.placeholder
91
97
  ? { value: '' }
92
- : undefined, { controlRef: handleRef, error }),
98
+ : undefined, { controlRef: handleRef, validationState }),
93
99
  modeSwitcherProps: {
94
100
  size: getButtonSizeForInput(props.size),
95
101
  disabled: state.readOnly || state.disabled,
96
102
  view: 'flat-secondary',
97
- style: { zIndex: 2 },
103
+ style: { zIndex: 2, marginInlineEnd: 2 },
98
104
  selected: mode === 'relative',
99
105
  extraProps: {
100
106
  'aria-label': i18n('Formula input mode'),
@@ -151,6 +157,8 @@ export function useRelativeDatePickerProps(state, _a) {
151
157
  },
152
158
  focusedValue: focusedDate,
153
159
  onFocusUpdate: setFocusedDate,
160
+ minValue: props.minValue,
161
+ maxValue: props.maxValue,
154
162
  },
155
163
  timeInputProps: {
156
164
  value: datePickerState.timeValue,
@@ -1,5 +1,4 @@
1
1
  import type { DateTime } from '@gravity-ui/date-utils';
2
- import type { DateFieldState } from '../../DateField';
3
2
  import type { DatePickerState } from '../../DatePicker';
4
3
  import type { RelativeDateFieldState } from '../../RelativeDateField';
5
4
  import type { DateFieldBase } from '../../types';
@@ -12,6 +11,8 @@ export type Value = {
12
11
  };
13
12
  export type RelativeDatePickerMode = Value['type'];
14
13
  export interface RelativeDatePickerStateOptions extends DateFieldBase<Value> {
14
+ /** Round up parsed date to the nearest granularity. */
15
+ roundUp?: boolean;
15
16
  }
16
17
  export interface RelativeDatePickerState {
17
18
  value: Value | null;
@@ -19,7 +20,6 @@ export interface RelativeDatePickerState {
19
20
  mode: RelativeDatePickerMode;
20
21
  setMode: (mode: RelativeDatePickerMode) => void;
21
22
  datePickerState: DatePickerState;
22
- dateFieldState: DateFieldState;
23
23
  relativeDateState: RelativeDateFieldState;
24
24
  selectedDate: DateTime | null;
25
25
  /**
@@ -1,15 +1,15 @@
1
1
  import React from 'react';
2
- import { useDateFieldState } from '../../DateField';
2
+ import { useControlledState } from '@gravity-ui/uikit';
3
3
  import { useDatePickerState } from '../../DatePicker';
4
4
  import { useRelativeDateFieldState } from '../../RelativeDateField';
5
- import { useControlledState } from '../../hooks/useControlledState';
6
5
  export function useRelativeDatePickerState(props) {
7
- const [value, setValue] = useControlledState(props.value, props.defaultValue, props.onUpdate);
6
+ var _a;
7
+ const [value, setValue] = useControlledState(props.value, (_a = props.defaultValue) !== null && _a !== void 0 ? _a : null, props.onUpdate);
8
8
  const [mode, setMode] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? 'relative' : 'absolute');
9
9
  const [prevValue, setPrevValue] = React.useState(value);
10
10
  if (value !== prevValue) {
11
11
  setPrevValue(value);
12
- if (value) {
12
+ if (value && value.type !== mode) {
13
13
  setMode(value.type);
14
14
  }
15
15
  }
@@ -31,15 +31,8 @@ export function useRelativeDatePickerState(props) {
31
31
  timeZone: props.timeZone,
32
32
  disabled: props.disabled,
33
33
  readOnly: props.readOnly,
34
- });
35
- const dateFieldState = useDateFieldState({
36
- value: valueDate,
37
- onUpdate: datePickerState.setValue,
38
- format: props.format,
39
- placeholderValue: props.placeholderValue,
40
- timeZone: props.timeZone,
41
- disabled: props.disabled,
42
- readOnly: props.readOnly,
34
+ minValue: props.minValue,
35
+ maxValue: props.maxValue,
43
36
  });
44
37
  const [valueRelative, setValueRelative] = React.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? value.value : null);
45
38
  if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && value.value !== valueRelative) {
@@ -56,6 +49,8 @@ export function useRelativeDatePickerState(props) {
56
49
  },
57
50
  disabled: props.disabled,
58
51
  readOnly: props.readOnly,
52
+ timeZone: datePickerState.timeZone,
53
+ roundUp: props.roundUp,
59
54
  });
60
55
  if (!value) {
61
56
  if (mode === 'absolute' && valueDate) {
@@ -65,10 +60,12 @@ export function useRelativeDatePickerState(props) {
65
60
  setValueRelative(null);
66
61
  }
67
62
  }
68
- const selectedDate = mode === 'relative' ? relativeDateState.parsedDate : datePickerState.dateValue;
63
+ const selectedDate = mode === 'relative'
64
+ ? relativeDateState.parsedDate
65
+ : datePickerState.dateFieldState.displayValue;
69
66
  const [isActive, setActive] = React.useState(false);
70
67
  return {
71
- value: value !== null && value !== void 0 ? value : null,
68
+ value,
72
69
  setValue(v) {
73
70
  if (props.readOnly || props.disabled) {
74
71
  return;
@@ -93,7 +90,6 @@ export function useRelativeDatePickerState(props) {
93
90
  }
94
91
  },
95
92
  datePickerState,
96
- dateFieldState,
97
93
  relativeDateState,
98
94
  selectedDate,
99
95
  isActive,
@@ -0,0 +1,56 @@
1
+ .g-date-relative-range-date-picker {
2
+ position: relative;
3
+ display: inline-flex;
4
+ }
5
+ .g-date-relative-range-date-picker__input_mobile {
6
+ pointer-events: none;
7
+ }
8
+ .g-date-relative-range-date-picker__mobile-trigger {
9
+ --_--g-date-mobile-trigger-clear-width: 0px;
10
+ --_--g-date-mobile-trigger-errors-width: 0px;
11
+ --_--g-date-mobile-trigger-button-width: 24px;
12
+ position: absolute;
13
+ inset: 0;
14
+ inset-inline-end: calc(var(--g-spacing-2) + var(--_--g-date-mobile-trigger-button-width) + var(--_--g-date-mobile-trigger-clear-width) + var(--_--g-date-mobile-trigger-errors-width));
15
+ opacity: 0;
16
+ }
17
+ .g-date-relative-range-date-picker__mobile-trigger_size_s {
18
+ --_--g-date-mobile-trigger-button-width: 20px;
19
+ }
20
+ .g-date-relative-range-date-picker__mobile-trigger_size_l {
21
+ --_--g-date-mobile-trigger-button-width: 28px;
22
+ }
23
+ .g-date-relative-range-date-picker__mobile-trigger_size_xl {
24
+ --_--g-date-mobile-trigger-button-width: 36px;
25
+ }
26
+ .g-date-relative-range-date-picker__mobile-trigger_has-clear {
27
+ --_--g-date-mobile-trigger-clear-width: calc(
28
+ var(--_--g-date-mobile-trigger-button-width) + 2px
29
+ );
30
+ }
31
+ .g-date-relative-range-date-picker__mobile-trigger_has-errors {
32
+ --_--g-date-mobile-trigger-errors-width: calc(
33
+ var(--_--g-date-mobile-trigger-button-width) + 2px
34
+ );
35
+ }
36
+ .g-date-relative-range-date-picker__value-label {
37
+ display: flex;
38
+ width: 100%;
39
+ }
40
+ .g-date-relative-range-date-picker__value-label > div {
41
+ flex: 1 0 0;
42
+ }
43
+ .g-date-relative-range-date-picker__value-label-content {
44
+ display: flex;
45
+ flex-direction: column;
46
+ }
47
+ .g-date-relative-range-date-picker__value-label-tooltip {
48
+ --g-popover-max-width: "none";
49
+ }
50
+ .g-date-relative-range-date-picker__value-label-item, .g-date-relative-range-date-picker__value-label-to, .g-date-relative-range-date-picker__value-label-tz {
51
+ text-align: center;
52
+ }
53
+ .g-date-relative-range-date-picker__value-label-tz {
54
+ margin-block-start: 5px;
55
+ color: var(--g-color-text-hint);
56
+ }
@@ -0,0 +1,27 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { Value } from '../RelativeDatePicker';
3
+ import type { DomProps, InputBase, RangeValue, StyleProps, TextInputProps, Validation } from '../types';
4
+ import type { PresetTab } from './components/Presets/utils';
5
+ import type { RelativeRangeDatePickerStateOptions } from './hooks/useRelativeRangeDatePickerState';
6
+ import './RelativeRangeDatePicker.css';
7
+ export interface RelativeRangeDatePickerProps extends RelativeRangeDatePickerStateOptions, DomProps, InputBase, TextInputProps, Validation, StyleProps {
8
+ /** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
9
+ format?: string;
10
+ /** A placeholder date that controls the default values of each segment when the user first interacts with them. Defaults to today's date at midnight. */
11
+ placeholderValue?: DateTime;
12
+ /** Apply changes with button */
13
+ withApplyButton?: boolean;
14
+ /** Show time zone selector */
15
+ withZonesList?: boolean;
16
+ /** Show relative range presets */
17
+ withPresets?: boolean;
18
+ /** Custom preset tabs */
19
+ presetTabs?: PresetTab[];
20
+ /** Show selected relative values as absolute dates */
21
+ alwaysShowAsAbsolute?: boolean;
22
+ /** */
23
+ getRangeTitle?: (value: RangeValue<Value | null> | null, timeZone: string) => string;
24
+ /** Sets the CSS className for the popup element. */
25
+ popupClassName?: string;
26
+ }
27
+ export declare function RelativeRangeDatePicker(props: RelativeRangeDatePickerProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,85 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { dateTimeParse } from '@gravity-ui/date-utils';
4
+ import { Calendar as CalendarIcon } from '@gravity-ui/icons';
5
+ import { Button, Icon, Popover, TextInput, useFocusWithin, useMobile } from '@gravity-ui/uikit';
6
+ import { block } from '../../utils/cn';
7
+ import { getButtonSizeForInput } from '../utils/getButtonSizeForInput';
8
+ import { PickerDialog } from './components/PickerDialog/PickerDialog';
9
+ import { useRelativeRangeDatePickerState } from './hooks/useRelativeRangeDatePickerState';
10
+ import { i18n } from './i18n';
11
+ import { getDefaultTitle } from './utils';
12
+ import './RelativeRangeDatePicker.css';
13
+ const b = block('relative-range-date-picker');
14
+ export function RelativeRangeDatePicker(props) {
15
+ var _a, _b;
16
+ const state = useRelativeRangeDatePickerState(props);
17
+ const isMobile = useMobile();
18
+ const anchorRef = React.useRef(null);
19
+ const inputRef = React.useRef(null);
20
+ const [isActive, setIsActive] = React.useState(false);
21
+ const [open, setOpen] = React.useState(false);
22
+ const { focusWithinProps } = useFocusWithin({
23
+ isDisabled: props.disabled || isMobile,
24
+ onFocusWithinChange: (isFocusedWithin) => {
25
+ if (!isFocusedWithin) {
26
+ setIsActive(false);
27
+ }
28
+ },
29
+ });
30
+ const { alwaysShowAsAbsolute, presetTabs, getRangeTitle } = props;
31
+ const format = (_a = props.format) !== null && _a !== void 0 ? _a : 'L';
32
+ const text = React.useMemo(() => typeof getRangeTitle === 'function'
33
+ ? getRangeTitle(state.value, state.timeZone)
34
+ : getDefaultTitle({
35
+ value: state.value,
36
+ timeZone: state.timeZone,
37
+ alwaysShowAsAbsolute: alwaysShowAsAbsolute,
38
+ format,
39
+ presets: presetTabs === null || presetTabs === void 0 ? void 0 : presetTabs.flatMap(({ presets }) => presets),
40
+ }), [alwaysShowAsAbsolute, format, getRangeTitle, presetTabs, state.timeZone, state.value]);
41
+ const validationState = props.validationState || (state.isInvalid ? 'invalid' : undefined);
42
+ const errorMessage = (_b = props.errorMessage) !== null && _b !== void 0 ? _b : state.errors.join('\n');
43
+ return (_jsxs("div", Object.assign({ ref: anchorRef }, focusWithinProps, { className: b(null, props.className), style: props.style, children: [_jsx(Popover, { className: b('value-label'), tooltipContentClassName: b('value-label-tooltip'), disabled: isMobile || open || !state.value, delayOpening: 500, placement: ['right', 'right-start', 'right-end', 'auto'], hasArrow: false, content: _jsx(ValueLabel, { value: state.value, format: format, timeZone: state.timeZone }), children: _jsx(TextInput, { controlRef: inputRef, value: text, placeholder: props.placeholder, onUpdate: (v) => {
44
+ if (!props.readOnly && !v) {
45
+ state.setValue(null, 'default');
46
+ }
47
+ }, controlProps: {
48
+ 'aria-haspopup': 'dialog',
49
+ 'aria-expanded': open,
50
+ disabled: isMobile,
51
+ className: b('input', { mobile: isMobile }),
52
+ }, onKeyDown: (e) => {
53
+ if (props.disabled) {
54
+ return;
55
+ }
56
+ if (e.altKey && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {
57
+ e.preventDefault();
58
+ setOpen(true);
59
+ }
60
+ }, onFocus: () => {
61
+ if (!isActive) {
62
+ setIsActive(true);
63
+ setOpen(true);
64
+ }
65
+ }, validationState: validationState, errorMessage: errorMessage, errorPlacement: props.errorPlacement, pin: props.pin, size: props.size, label: props.label, hasClear: props.hasClear, disabled: props.disabled, endContent: _jsx(Button, { view: "flat-secondary", size: getButtonSizeForInput(props.size), disabled: props.disabled, extraProps: {
66
+ 'aria-haspopup': 'dialog',
67
+ 'aria-expanded': open,
68
+ }, onClick: () => {
69
+ setIsActive(true);
70
+ setOpen(!open);
71
+ }, children: _jsx(Icon, { data: CalendarIcon }) }) }) }), isMobile ? (_jsx("button", { className: b('mobile-trigger', {
72
+ 'has-clear': Boolean(props.hasClear && state.value),
73
+ 'has-errors': state.isInvalid && props.errorPlacement === 'inside',
74
+ size: props.size,
75
+ }), onClick: () => {
76
+ setIsActive(true);
77
+ setOpen(true);
78
+ } })) : null, _jsx(PickerDialog, { state: state, props: props, open: open, onClose: () => {
79
+ setOpen(false);
80
+ }, anchorRef: anchorRef, isMobile: isMobile, className: props.className })] })));
81
+ }
82
+ function ValueLabel({ value, format, timeZone }) {
83
+ var _a, _b, _c, _d;
84
+ return (_jsxs("div", { className: b('value-label-content'), children: [_jsx("span", { className: b('value-label-item'), children: (_b = dateTimeParse((_a = value === null || value === void 0 ? void 0 : value.start) === null || _a === void 0 ? void 0 : _a.value, { timeZone })) === null || _b === void 0 ? void 0 : _b.format(format) }), _jsx("span", { className: b('value-label-to'), children: i18n('to') }), _jsx("span", { className: b('value-label-item'), children: (_d = dateTimeParse((_c = value === null || value === void 0 ? void 0 : value.end) === null || _c === void 0 ? void 0 : _c.value, { timeZone, roundUp: true })) === null || _d === void 0 ? void 0 : _d.format(format) }), timeZone && _jsx("span", { className: b('value-label-tz'), children: timeZone })] }));
85
+ }
@@ -0,0 +1,32 @@
1
+ .g-date-relative-range-date-picker-dialog__content {
2
+ --_--popup-content-padding: var(--g-spacing-2);
3
+ padding: var(--_--popup-content-padding);
4
+ }
5
+ .g-date-relative-range-date-picker-dialog__content_mobile {
6
+ --_--popup-content-padding: var(--g-spacing-5);
7
+ }
8
+ .g-date-relative-range-date-picker-dialog__content:not(.g-date-relative-range-date-picker-dialog__content_mobile) {
9
+ width: 310px;
10
+ }
11
+ .g-date-relative-range-date-picker-dialog__content_size_xl:not(.g-date-relative-range-date-picker-dialog__content_mobile) {
12
+ width: 380px;
13
+ }
14
+ .g-date-relative-range-date-picker-dialog__pickers {
15
+ display: flex;
16
+ flex-direction: column;
17
+ gap: var(--g-spacing-2);
18
+ }
19
+ .g-date-relative-range-date-picker-dialog__pickers .g-text-input__label {
20
+ width: 40px;
21
+ }
22
+ .g-date-relative-range-date-picker-dialog__content_size_xl .g-date-relative-range-date-picker-dialog__pickers .g-text-input__label {
23
+ width: 50px;
24
+ }
25
+ .g-date-relative-range-date-picker-dialog__apply {
26
+ margin-block-start: var(--g-spacing-2);
27
+ }
28
+ .g-date-relative-range-date-picker-dialog__zone {
29
+ margin-block: var(--g-spacing-2) calc(-1 * var(--_--popup-content-padding));
30
+ margin-inline: calc(-1 * var(--_--popup-content-padding));
31
+ border-block-start: 1px solid var(--g-color-line-generic);
32
+ }
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ import type { RelativeRangeDatePickerProps } from '../../RelativeRangeDatePicker';
3
+ import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
4
+ import './PickerDialog.css';
5
+ export interface PickerDialogProps {
6
+ className?: string;
7
+ state: RelativeRangeDatePickerState;
8
+ props: RelativeRangeDatePickerProps;
9
+ open: boolean;
10
+ isMobile?: boolean;
11
+ anchorRef?: React.RefObject<HTMLElement>;
12
+ onClose: () => void;
13
+ }
14
+ export declare function PickerDialog({ props, state, open, onClose, isMobile, anchorRef, className, }: PickerDialogProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { dateTime } from '@gravity-ui/date-utils';
3
+ import { Button, Popup, Sheet } from '@gravity-ui/uikit';
4
+ import { block } from '../../../../utils/cn';
5
+ import { RelativeDatePicker } from '../../../RelativeDatePicker';
6
+ import { Presets } from '../Presets/Presets';
7
+ import { Zones } from '../Zones/Zones';
8
+ import { i18n } from './i18n';
9
+ import { useRelativeRangeDatePickerDialogState } from './useRelativeRangeDatePickerDialogState';
10
+ import './PickerDialog.css';
11
+ const b = block('relative-range-date-picker-dialog');
12
+ export function PickerDialog({ props, state, open, onClose, isMobile, anchorRef, className, }) {
13
+ if (isMobile) {
14
+ return (_jsx(Sheet, { visible: open, onClose: onClose, contentClassName: b('content', { mobile: true, size: 'xl' }, className), children: _jsx(DialogContent, Object.assign({}, props, { size: "xl", state: state, onApply: onClose })) }));
15
+ }
16
+ return (_jsx(Popup, { open: open, onClose: onClose, role: "dialog", anchorRef: anchorRef, contentClassName: b('content', { size: props.size }, className), focusTrap: true, restoreFocus: true, children: _jsx(DialogContent, Object.assign({}, props, { state: state, onApply: onClose })) }));
17
+ }
18
+ function DialogContent(props) {
19
+ var _a, _b, _c, _d, _e, _f, _g;
20
+ const state = useRelativeRangeDatePickerDialogState(props.state, props);
21
+ const placeholderValue = ((_a = props.placeholderValue) === null || _a === void 0 ? void 0 : _a.timeZone(props.state.timeZone)) ||
22
+ dateTime({ timeZone: props.state.timeZone });
23
+ const fieldProps = {
24
+ timeZone: props.state.timeZone,
25
+ format: props.format,
26
+ minValue: props.minValue,
27
+ maxValue: props.maxValue,
28
+ hasClear: props.allowNullableValues,
29
+ readOnly: props.readOnly,
30
+ size: props.size,
31
+ errorPlacement: 'inside',
32
+ };
33
+ return (_jsxs("div", { children: [_jsxs("div", { className: b('pickers'), children: [_jsx(RelativeDatePicker, Object.assign({}, fieldProps, { validationState: ((_b = state.startValidation) === null || _b === void 0 ? void 0 : _b.isInvalid) ? 'invalid' : undefined, errorMessage: ((_d = (_c = state.startValidation) === null || _c === void 0 ? void 0 : _c.errors) === null || _d === void 0 ? void 0 : _d.join('\n')) || i18n('Value is incorrect.'), placeholderValue: placeholderValue.startOf('day'), label: i18n('From'), value: state.start, onUpdate: state.setStart })), _jsx(RelativeDatePicker, Object.assign({}, fieldProps, { validationState: ((_e = state.endValidation) === null || _e === void 0 ? void 0 : _e.isInvalid) ? 'invalid' : undefined, errorMessage: ((_g = (_f = state.endValidation) === null || _f === void 0 ? void 0 : _f.errors) === null || _g === void 0 ? void 0 : _g.join('\n')) || i18n('Value is incorrect.'), placeholderValue: placeholderValue.endOf('day'), label: i18n('To'), value: state.end, onUpdate: state.setEnd, roundUp: true }))] }), props.withApplyButton && !props.readOnly ? (_jsx(Button, { disabled: state.isInvalid, size: props.size, onClick: () => {
34
+ state.applyValue();
35
+ props.onApply();
36
+ }, className: b('apply'), width: "max", children: i18n('Apply') })) : null, props.withPresets && !props.readOnly ? (_jsx(Presets, { size: props.size, presetTabs: props.presetTabs, onChoosePreset: (start, end) => {
37
+ state.setRange({ type: 'relative', value: start }, { type: 'relative', value: end });
38
+ }, minValue: props.minValue })) : null, props.withZonesList ? (_jsx("div", { className: b('zone'), children: _jsx(Zones, { value: state.timeZone, onUpdate: state.setTimeZone, disabled: props.readOnly, size: props.size }) })) : null] }));
39
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "Value is incorrect.": "Value is incorrect.",
3
+ "Value is required.": "Value is required.",
4
+ "\"From\" can't be after \"To\".": "\"From\" can't be after \"To\".",
5
+ "From": "From",
6
+ "To": "To",
7
+ "Apply": "Apply"
8
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "Value is required." | "\"From\" can't be after \"To\"." | "From" | "To" | "Value is incorrect." | "Apply", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -0,0 +1,5 @@
1
+ import { addComponentKeysets } from '@gravity-ui/uikit/i18n';
2
+ import { NAMESPACE } from '../../../../../utils/cn';
3
+ import en from './en.json';
4
+ import ru from './ru.json';
5
+ export const i18n = addComponentKeysets({ en, ru }, `${NAMESPACE}relative-range-date-picker-dialog`);
@@ -0,0 +1,8 @@
1
+ {
2
+ "Value is incorrect.": "Значение некорректно.",
3
+ "Value is required.": "Value is required.",
4
+ "\"From\" can't be after \"To\".": "Значение «От» не может быть позже чем «До».",
5
+ "From": "От",
6
+ "To": "Дo",
7
+ "Apply": "Применить"
8
+ }
@@ -0,0 +1,16 @@
1
+ import type { Value } from '../../../RelativeDatePicker';
2
+ import type { RelativeRangeDatePickerProps } from '../../RelativeRangeDatePicker';
3
+ import type { RelativeRangeDatePickerState } from '../../hooks/useRelativeRangeDatePickerState';
4
+ export declare function useRelativeRangeDatePickerDialogState(state: RelativeRangeDatePickerState, props: RelativeRangeDatePickerProps): {
5
+ start: Value | null;
6
+ end: Value | null;
7
+ timeZone: string;
8
+ setStart: (newValue: Value | null) => void;
9
+ setEnd: (newValue: Value | null) => void;
10
+ setRange: (newStart: Value, newEnd: Value) => void;
11
+ setTimeZone: (newTimeZone: string) => void;
12
+ applyValue: () => void;
13
+ isInvalid: boolean;
14
+ startValidation: import("../../../utils/validation/datePicker").ValidationResult | undefined;
15
+ endValidation: import("../../../utils/validation/datePicker").ValidationResult | undefined;
16
+ };
@@ -0,0 +1,99 @@
1
+ import React from 'react';
2
+ import { dateTimeParse } from '@gravity-ui/date-utils';
3
+ import { getValidationResult } from '../../../utils/validation/datePicker';
4
+ import { i18n } from './i18n';
5
+ export function useRelativeRangeDatePickerDialogState(state, props) {
6
+ var _a, _b, _c, _d;
7
+ const { withApplyButton, allowNullableValues } = props;
8
+ const [start, setStart] = React.useState((_b = (_a = state.value) === null || _a === void 0 ? void 0 : _a.start) !== null && _b !== void 0 ? _b : null);
9
+ const [end, setEnd] = React.useState((_d = (_c = state.value) === null || _c === void 0 ? void 0 : _c.end) !== null && _d !== void 0 ? _d : null);
10
+ const [innerTimeZone, setTimeZone] = React.useState(state.timeZone);
11
+ const timeZone = withApplyButton ? innerTimeZone : state.timeZone;
12
+ function setStartValue(newValue) {
13
+ setStart(newValue);
14
+ if (!withApplyButton) {
15
+ state.setValue(getRangeValue(newValue, end, Object.assign(Object.assign({}, props), { timeZone })), timeZone);
16
+ }
17
+ }
18
+ function setEndValue(newValue) {
19
+ setEnd(newValue);
20
+ if (!withApplyButton) {
21
+ state.setValue(getRangeValue(start, newValue, Object.assign(Object.assign({}, props), { timeZone })), timeZone);
22
+ }
23
+ }
24
+ function setTimeZoneValue(newTimeZone) {
25
+ setTimeZone(newTimeZone);
26
+ if (!withApplyButton) {
27
+ state.setValue(getRangeValue(start, end, Object.assign(Object.assign({}, props), { timeZone: newTimeZone })), newTimeZone);
28
+ }
29
+ }
30
+ function setRange(newStart, newEnd) {
31
+ setStart(newStart);
32
+ setEnd(newEnd);
33
+ if (!withApplyButton) {
34
+ state.setValue(getRangeValue(newStart, newEnd, Object.assign(Object.assign({}, props), { timeZone })), timeZone);
35
+ }
36
+ }
37
+ function applyValue() {
38
+ state.setValue(getRangeValue(start, end, Object.assign(Object.assign({}, props), { timeZone })), timeZone);
39
+ }
40
+ const validation = React.useMemo(() => getRangeValidationResult(start, end, allowNullableValues, props.minValue, props.maxValue, props.isDateUnavailable, timeZone), [
41
+ allowNullableValues,
42
+ end,
43
+ props.isDateUnavailable,
44
+ props.maxValue,
45
+ props.minValue,
46
+ start,
47
+ timeZone,
48
+ ]);
49
+ return {
50
+ start,
51
+ end,
52
+ timeZone,
53
+ setStart: setStartValue,
54
+ setEnd: setEndValue,
55
+ setRange,
56
+ setTimeZone: setTimeZoneValue,
57
+ applyValue,
58
+ isInvalid: validation.isInvalid,
59
+ startValidation: validation.startValidationResult,
60
+ endValidation: validation.endValidationResult,
61
+ };
62
+ }
63
+ function getRangeValue(start, end, options = {}) {
64
+ var _a;
65
+ if (!start && !end) {
66
+ return null;
67
+ }
68
+ const { isInvalid } = getRangeValidationResult(start, end, options.allowNullableValues, options.minValue, options.maxValue, options.isDateUnavailable, (_a = options.timeZone) !== null && _a !== void 0 ? _a : 'default');
69
+ if (isInvalid) {
70
+ return null;
71
+ }
72
+ return { start, end };
73
+ }
74
+ function getRangeValidationResult(start, end, allowNullableValues, minValue, maxValue, isDateUnavailable, timeZone) {
75
+ if (!start && !end) {
76
+ return { isInvalid: false };
77
+ }
78
+ const startDate = start ? dateTimeParse(start.value, { timeZone }) : null;
79
+ const endDate = end ? dateTimeParse(end.value, { timeZone, roundUp: true }) : null;
80
+ const startValidationResult = getValidationResult(startDate, minValue, maxValue, isDateUnavailable, timeZone);
81
+ if (!startDate && !allowNullableValues) {
82
+ startValidationResult.isInvalid = true;
83
+ startValidationResult.errors.push(i18n('Value is required.'));
84
+ }
85
+ const endValidationResult = getValidationResult(endDate, minValue, maxValue, isDateUnavailable, timeZone);
86
+ if (!endDate && !allowNullableValues) {
87
+ endValidationResult.isInvalid = true;
88
+ endValidationResult.errors.push(i18n('Value is required.'));
89
+ }
90
+ if (startDate && endDate && endDate.isBefore(startDate)) {
91
+ startValidationResult.isInvalid = true;
92
+ startValidationResult.errors.push(i18n(`"From" can't be after "To".`));
93
+ }
94
+ return {
95
+ isInvalid: startValidationResult.isInvalid || endValidationResult.isInvalid,
96
+ startValidationResult,
97
+ endValidationResult,
98
+ };
99
+ }
@@ -0,0 +1,26 @@
1
+ .g-date-relative-range-date-picker-presets__tabs {
2
+ --g-tabs-border-width: 0;
3
+ display: flex;
4
+ align-items: center;
5
+ gap: var(--g-spacing-2);
6
+ box-shadow: inset 0 -1px var(--g-color-line-generic);
7
+ }
8
+ .g-date-relative-range-date-picker-presets__list-container {
9
+ outline: none;
10
+ }
11
+ .g-date-relative-range-date-picker-presets__doc {
12
+ margin-inline-start: auto;
13
+ }
14
+ .g-date-relative-range-date-picker-presets__content {
15
+ overflow: auto;
16
+ height: 128px;
17
+ }
18
+ .g-date-relative-range-date-picker-presets_size_l .g-date-relative-range-date-picker-presets__content {
19
+ height: 144px;
20
+ }
21
+ .g-date-relative-range-date-picker-presets_size_xl .g-date-relative-range-date-picker-presets__content {
22
+ height: 162px;
23
+ font-size: var(--g-text-body-2-font-size);
24
+ line-height: var(--g-text-body-2-line-height);
25
+ font-weight: var(--g-text-body-font-weight);
26
+ }