@gravity-ui/date-components 1.0.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/cjs/components/Calendar/Calendar.css +220 -0
  4. package/dist/cjs/components/Calendar/Calendar.d.ts +13 -0
  5. package/dist/cjs/components/Calendar/Calendar.js +15 -0
  6. package/dist/cjs/components/Calendar/CalendarBase.d.ts +18 -0
  7. package/dist/cjs/components/Calendar/CalendarBase.js +89 -0
  8. package/dist/cjs/components/Calendar/RangeCalendar.d.ts +13 -0
  9. package/dist/cjs/components/Calendar/RangeCalendar.js +22 -0
  10. package/dist/cjs/components/Calendar/hooks/types.d.ts +124 -0
  11. package/dist/cjs/components/Calendar/hooks/types.js +2 -0
  12. package/dist/cjs/components/Calendar/hooks/useCalendarCellProps.d.ts +19 -0
  13. package/dist/cjs/components/Calendar/hooks/useCalendarCellProps.js +98 -0
  14. package/dist/cjs/components/Calendar/hooks/useCalendarGridProps.d.ts +5 -0
  15. package/dist/cjs/components/Calendar/hooks/useCalendarGridProps.js +57 -0
  16. package/dist/cjs/components/Calendar/hooks/useCalendarProps.d.ts +10 -0
  17. package/dist/cjs/components/Calendar/hooks/useCalendarProps.js +110 -0
  18. package/dist/cjs/components/Calendar/hooks/useCalendarState.d.ts +7 -0
  19. package/dist/cjs/components/Calendar/hooks/useCalendarState.js +178 -0
  20. package/dist/cjs/components/Calendar/hooks/useRangeCalendarState.d.ts +7 -0
  21. package/dist/cjs/components/Calendar/hooks/useRangeCalendarState.js +82 -0
  22. package/dist/cjs/components/Calendar/i18n/en.json +4 -0
  23. package/dist/cjs/components/Calendar/i18n/index.d.ts +1 -0
  24. package/dist/cjs/components/Calendar/i18n/index.js +11 -0
  25. package/dist/cjs/components/Calendar/i18n/ru.json +4 -0
  26. package/dist/cjs/components/Calendar/index.d.ts +8 -0
  27. package/dist/cjs/components/Calendar/index.js +23 -0
  28. package/dist/cjs/components/Calendar/utils.d.ts +4 -0
  29. package/dist/cjs/components/Calendar/utils.js +40 -0
  30. package/dist/cjs/components/DateField/DateField.css +4 -0
  31. package/dist/cjs/components/DateField/DateField.d.ts +6 -0
  32. package/dist/cjs/components/DateField/DateField.js +38 -0
  33. package/dist/cjs/components/DateField/hooks/useDateFieldProps.d.ts +6 -0
  34. package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +203 -0
  35. package/dist/cjs/components/DateField/hooks/useDateFieldState.d.ts +67 -0
  36. package/dist/cjs/components/DateField/hooks/useDateFieldState.js +628 -0
  37. package/dist/cjs/components/DateField/i18n/en.json +10 -0
  38. package/dist/cjs/components/DateField/i18n/index.d.ts +1 -0
  39. package/dist/cjs/components/DateField/i18n/index.js +11 -0
  40. package/dist/cjs/components/DateField/i18n/ru.json +10 -0
  41. package/dist/cjs/components/DateField/index.d.ts +3 -0
  42. package/dist/cjs/components/DateField/index.js +19 -0
  43. package/dist/cjs/components/DateField/types.d.ts +67 -0
  44. package/dist/cjs/components/DateField/types.js +2 -0
  45. package/dist/cjs/components/DateField/utils.d.ts +14 -0
  46. package/dist/cjs/components/DateField/utils.js +276 -0
  47. package/dist/cjs/components/DatePicker/DatePicker.css +19 -0
  48. package/dist/cjs/components/DatePicker/DatePicker.d.ts +5 -0
  49. package/dist/cjs/components/DatePicker/DatePicker.js +66 -0
  50. package/dist/cjs/components/DatePicker/DesktopCalendar.d.ts +15 -0
  51. package/dist/cjs/components/DatePicker/DesktopCalendar.js +56 -0
  52. package/dist/cjs/components/DatePicker/MobileCalendar.css +49 -0
  53. package/dist/cjs/components/DatePicker/MobileCalendar.d.ts +14 -0
  54. package/dist/cjs/components/DatePicker/MobileCalendar.js +78 -0
  55. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.d.ts +45 -0
  56. package/dist/cjs/components/DatePicker/hooks/useDatePickerState.js +114 -0
  57. package/dist/cjs/components/DatePicker/i18n/en.json +3 -0
  58. package/dist/cjs/components/DatePicker/i18n/index.d.ts +1 -0
  59. package/dist/cjs/components/DatePicker/i18n/index.js +11 -0
  60. package/dist/cjs/components/DatePicker/i18n/ru.json +3 -0
  61. package/dist/cjs/components/DatePicker/index.d.ts +2 -0
  62. package/dist/cjs/components/DatePicker/index.js +18 -0
  63. package/dist/cjs/components/DatePicker/utils.d.ts +1 -0
  64. package/dist/cjs/components/DatePicker/utils.js +5 -0
  65. package/dist/cjs/components/RelativeDateField/RelativeDateField.css +16 -0
  66. package/dist/cjs/components/RelativeDateField/RelativeDateField.d.ts +11 -0
  67. package/dist/cjs/components/RelativeDateField/RelativeDateField.js +37 -0
  68. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +12 -0
  69. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +66 -0
  70. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +30 -0
  71. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js +66 -0
  72. package/dist/cjs/components/RelativeDateField/index.d.ts +3 -0
  73. package/dist/cjs/components/RelativeDateField/index.js +19 -0
  74. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.css +16 -0
  75. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.d.ts +6 -0
  76. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js +32 -0
  77. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +17 -0
  78. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +175 -0
  79. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +36 -0
  80. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +109 -0
  81. package/dist/cjs/components/RelativeDatePicker/i18n/en.json +4 -0
  82. package/dist/cjs/components/RelativeDatePicker/i18n/index.d.ts +1 -0
  83. package/dist/cjs/components/RelativeDatePicker/i18n/index.js +11 -0
  84. package/dist/cjs/components/RelativeDatePicker/i18n/ru.json +4 -0
  85. package/dist/cjs/components/RelativeDatePicker/index.d.ts +3 -0
  86. package/dist/cjs/components/RelativeDatePicker/index.js +19 -0
  87. package/dist/cjs/components/hooks/useControlledState.d.ts +1 -0
  88. package/dist/cjs/components/hooks/useControlledState.js +30 -0
  89. package/dist/cjs/components/index.d.ts +5 -0
  90. package/dist/cjs/components/index.js +21 -0
  91. package/dist/cjs/components/types/datePicker.d.ts +16 -0
  92. package/dist/cjs/components/types/datePicker.js +2 -0
  93. package/dist/cjs/components/types/events.d.ts +17 -0
  94. package/dist/cjs/components/types/events.js +2 -0
  95. package/dist/cjs/components/types/index.d.ts +4 -0
  96. package/dist/cjs/components/types/index.js +2 -0
  97. package/dist/cjs/components/types/inputs.d.ts +79 -0
  98. package/dist/cjs/components/types/inputs.js +2 -0
  99. package/dist/cjs/components/types/style.d.ts +7 -0
  100. package/dist/cjs/components/types/style.js +2 -0
  101. package/dist/cjs/components/utils/getButtonSizeForInput.d.ts +2 -0
  102. package/dist/cjs/components/utils/getButtonSizeForInput.js +20 -0
  103. package/dist/cjs/components/utils/mergeProps.d.ts +13 -0
  104. package/dist/cjs/components/utils/mergeProps.js +47 -0
  105. package/dist/cjs/components/variables.css +0 -0
  106. package/dist/cjs/index.d.ts +1 -0
  107. package/dist/cjs/index.js +17 -0
  108. package/dist/cjs/utils/cn.d.ts +2 -0
  109. package/dist/cjs/utils/cn.js +6 -0
  110. package/dist/esm/components/Calendar/Calendar.css +220 -0
  111. package/dist/esm/components/Calendar/Calendar.d.ts +13 -0
  112. package/dist/esm/components/Calendar/Calendar.js +9 -0
  113. package/dist/esm/components/Calendar/CalendarBase.d.ts +18 -0
  114. package/dist/esm/components/Calendar/CalendarBase.js +83 -0
  115. package/dist/esm/components/Calendar/RangeCalendar.d.ts +13 -0
  116. package/dist/esm/components/Calendar/RangeCalendar.js +16 -0
  117. package/dist/esm/components/Calendar/hooks/types.d.ts +124 -0
  118. package/dist/esm/components/Calendar/hooks/types.js +1 -0
  119. package/dist/esm/components/Calendar/hooks/useCalendarCellProps.d.ts +19 -0
  120. package/dist/esm/components/Calendar/hooks/useCalendarCellProps.js +91 -0
  121. package/dist/esm/components/Calendar/hooks/useCalendarGridProps.d.ts +5 -0
  122. package/dist/esm/components/Calendar/hooks/useCalendarGridProps.js +54 -0
  123. package/dist/esm/components/Calendar/hooks/useCalendarProps.d.ts +10 -0
  124. package/dist/esm/components/Calendar/hooks/useCalendarProps.js +103 -0
  125. package/dist/esm/components/Calendar/hooks/useCalendarState.d.ts +7 -0
  126. package/dist/esm/components/Calendar/hooks/useCalendarState.js +171 -0
  127. package/dist/esm/components/Calendar/hooks/useRangeCalendarState.d.ts +7 -0
  128. package/dist/esm/components/Calendar/hooks/useRangeCalendarState.js +75 -0
  129. package/dist/esm/components/Calendar/i18n/en.json +4 -0
  130. package/dist/esm/components/Calendar/i18n/index.d.ts +1 -0
  131. package/dist/esm/components/Calendar/i18n/index.js +5 -0
  132. package/dist/esm/components/Calendar/i18n/ru.json +4 -0
  133. package/dist/esm/components/Calendar/index.d.ts +8 -0
  134. package/dist/esm/components/Calendar/index.js +7 -0
  135. package/dist/esm/components/Calendar/utils.d.ts +4 -0
  136. package/dist/esm/components/Calendar/utils.js +34 -0
  137. package/dist/esm/components/DateField/DateField.css +4 -0
  138. package/dist/esm/components/DateField/DateField.d.ts +6 -0
  139. package/dist/esm/components/DateField/DateField.js +31 -0
  140. package/dist/esm/components/DateField/hooks/useDateFieldProps.d.ts +6 -0
  141. package/dist/esm/components/DateField/hooks/useDateFieldProps.js +196 -0
  142. package/dist/esm/components/DateField/hooks/useDateFieldState.d.ts +67 -0
  143. package/dist/esm/components/DateField/hooks/useDateFieldState.js +621 -0
  144. package/dist/esm/components/DateField/i18n/en.json +10 -0
  145. package/dist/esm/components/DateField/i18n/index.d.ts +1 -0
  146. package/dist/esm/components/DateField/i18n/index.js +5 -0
  147. package/dist/esm/components/DateField/i18n/ru.json +10 -0
  148. package/dist/esm/components/DateField/index.d.ts +3 -0
  149. package/dist/esm/components/DateField/index.js +3 -0
  150. package/dist/esm/components/DateField/types.d.ts +67 -0
  151. package/dist/esm/components/DateField/types.js +1 -0
  152. package/dist/esm/components/DateField/utils.d.ts +14 -0
  153. package/dist/esm/components/DateField/utils.js +268 -0
  154. package/dist/esm/components/DatePicker/DatePicker.css +19 -0
  155. package/dist/esm/components/DatePicker/DatePicker.d.ts +5 -0
  156. package/dist/esm/components/DatePicker/DatePicker.js +59 -0
  157. package/dist/esm/components/DatePicker/DesktopCalendar.d.ts +15 -0
  158. package/dist/esm/components/DatePicker/DesktopCalendar.js +48 -0
  159. package/dist/esm/components/DatePicker/MobileCalendar.css +49 -0
  160. package/dist/esm/components/DatePicker/MobileCalendar.d.ts +14 -0
  161. package/dist/esm/components/DatePicker/MobileCalendar.js +73 -0
  162. package/dist/esm/components/DatePicker/hooks/useDatePickerState.d.ts +45 -0
  163. package/dist/esm/components/DatePicker/hooks/useDatePickerState.js +107 -0
  164. package/dist/esm/components/DatePicker/i18n/en.json +3 -0
  165. package/dist/esm/components/DatePicker/i18n/index.d.ts +1 -0
  166. package/dist/esm/components/DatePicker/i18n/index.js +5 -0
  167. package/dist/esm/components/DatePicker/i18n/ru.json +3 -0
  168. package/dist/esm/components/DatePicker/index.d.ts +2 -0
  169. package/dist/esm/components/DatePicker/index.js +2 -0
  170. package/dist/esm/components/DatePicker/utils.d.ts +1 -0
  171. package/dist/esm/components/DatePicker/utils.js +2 -0
  172. package/dist/esm/components/RelativeDateField/RelativeDateField.css +16 -0
  173. package/dist/esm/components/RelativeDateField/RelativeDateField.d.ts +11 -0
  174. package/dist/esm/components/RelativeDateField/RelativeDateField.js +30 -0
  175. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +12 -0
  176. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +59 -0
  177. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +30 -0
  178. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js +59 -0
  179. package/dist/esm/components/RelativeDateField/index.d.ts +3 -0
  180. package/dist/esm/components/RelativeDateField/index.js +3 -0
  181. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.css +16 -0
  182. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.d.ts +6 -0
  183. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js +25 -0
  184. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +17 -0
  185. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +168 -0
  186. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.d.ts +36 -0
  187. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +102 -0
  188. package/dist/esm/components/RelativeDatePicker/i18n/en.json +4 -0
  189. package/dist/esm/components/RelativeDatePicker/i18n/index.d.ts +1 -0
  190. package/dist/esm/components/RelativeDatePicker/i18n/index.js +5 -0
  191. package/dist/esm/components/RelativeDatePicker/i18n/ru.json +4 -0
  192. package/dist/esm/components/RelativeDatePicker/index.d.ts +3 -0
  193. package/dist/esm/components/RelativeDatePicker/index.js +3 -0
  194. package/dist/esm/components/hooks/useControlledState.d.ts +1 -0
  195. package/dist/esm/components/hooks/useControlledState.js +23 -0
  196. package/dist/esm/components/index.d.ts +5 -0
  197. package/dist/esm/components/index.js +5 -0
  198. package/dist/esm/components/types/datePicker.d.ts +16 -0
  199. package/dist/esm/components/types/datePicker.js +1 -0
  200. package/dist/esm/components/types/events.d.ts +17 -0
  201. package/dist/esm/components/types/events.js +1 -0
  202. package/dist/esm/components/types/index.d.ts +4 -0
  203. package/dist/esm/components/types/index.js +1 -0
  204. package/dist/esm/components/types/inputs.d.ts +79 -0
  205. package/dist/esm/components/types/inputs.js +1 -0
  206. package/dist/esm/components/types/style.d.ts +7 -0
  207. package/dist/esm/components/types/style.js +1 -0
  208. package/dist/esm/components/utils/getButtonSizeForInput.d.ts +2 -0
  209. package/dist/esm/components/utils/getButtonSizeForInput.js +16 -0
  210. package/dist/esm/components/utils/mergeProps.d.ts +13 -0
  211. package/dist/esm/components/utils/mergeProps.js +43 -0
  212. package/dist/esm/components/variables.css +0 -0
  213. package/dist/esm/index.d.ts +1 -0
  214. package/dist/esm/index.js +1 -0
  215. package/dist/esm/utils/cn.d.ts +2 -0
  216. package/dist/esm/utils/cn.js +3 -0
  217. package/package.json +119 -0
@@ -0,0 +1,45 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { InputBase, ValueBase } from '../../types';
3
+ export type Granularity = 'day' | 'hour' | 'minute' | 'second';
4
+ export interface DatePickerState {
5
+ /** The currently selected date. */
6
+ value: DateTime | null;
7
+ /** Sets the selected date. */
8
+ setValue(value: DateTime | null): void;
9
+ /**
10
+ * The date portion of the value. This may be set prior to `value` if the user has
11
+ * selected a date but has not yet selected a time.
12
+ */
13
+ dateValue: DateTime | null;
14
+ /** Sets the date portion of the value. */
15
+ setDateValue(value: DateTime): void;
16
+ /**
17
+ * The time portion of the value. This may be set prior to `value` if the user has
18
+ * selected a time but has not yet selected a date.
19
+ */
20
+ timeValue: DateTime | null;
21
+ /** Sets the time portion of the value. */
22
+ setTimeValue(value: DateTime | null): void;
23
+ /** Whether the field is read only. */
24
+ readOnly?: boolean;
25
+ /** Whether the field is disabled. */
26
+ disabled?: boolean;
27
+ /** Format of the date when rendered in the input. */
28
+ format: string;
29
+ /** Whether the date picker supports selecting a date. */
30
+ hasDate: boolean;
31
+ /** Whether the date picker supports selecting a time. */
32
+ hasTime: boolean;
33
+ /** Format of the time when rendered in the input. */
34
+ timeFormat?: string;
35
+ /** Whether the calendar popover is currently open. */
36
+ isOpen: boolean;
37
+ /** Sets whether the calendar popover is open. */
38
+ setOpen(isOpen: boolean): void;
39
+ }
40
+ export interface DatePickerStateOptions extends ValueBase<DateTime>, InputBase {
41
+ placeholderValue?: DateTime;
42
+ timeZone?: string;
43
+ format?: string;
44
+ }
45
+ export declare function useDatePickerState(props: DatePickerStateOptions): DatePickerState;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useDatePickerState = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const utils_1 = require("../../DateField/utils");
9
+ const useControlledState_1 = require("../../hooks/useControlledState");
10
+ function useDatePickerState(props) {
11
+ const { disabled, readOnly } = props;
12
+ const [isOpen, setOpen] = react_1.default.useState(false);
13
+ const [value, setValue] = (0, useControlledState_1.useControlledState)(props.value, props.defaultValue, props.onUpdate);
14
+ const [selectedDateInner, setSelectedDate] = react_1.default.useState(null);
15
+ const [selectedTimeInner, setSelectedTime] = react_1.default.useState(null);
16
+ let selectedDate = selectedDateInner;
17
+ let selectedTime = selectedTimeInner;
18
+ const format = props.format || 'L';
19
+ const { hasDate, hasTime, timeFormat } = react_1.default.useMemo(() => {
20
+ const sections = (0, utils_1.splitFormatIntoSections)(format);
21
+ let hasDate = false;
22
+ let hasHours = false;
23
+ let hasMinutes = false;
24
+ let hasSeconds = false;
25
+ for (const s of sections) {
26
+ hasHours || (hasHours = s.type === 'hour');
27
+ hasMinutes || (hasMinutes = s.type === 'minute');
28
+ hasSeconds || (hasSeconds = s.type === 'second');
29
+ hasDate || (hasDate = ['day', 'month', 'year'].includes(s.type));
30
+ }
31
+ return {
32
+ hasTime: hasHours || hasMinutes || hasSeconds,
33
+ timeFormat: hasSeconds ? 'LTS' : 'LT',
34
+ hasDate,
35
+ };
36
+ }, [format]);
37
+ if (value) {
38
+ selectedDate = value;
39
+ if (hasTime) {
40
+ selectedTime = value;
41
+ }
42
+ }
43
+ const commitValue = (date, time) => {
44
+ if (disabled || readOnly) {
45
+ return;
46
+ }
47
+ setValue(mergeDateTime(date, time));
48
+ setSelectedDate(null);
49
+ setSelectedTime(null);
50
+ };
51
+ // Intercept setValue to make sure the Time section is not changed by date selection in Calendar
52
+ const selectDate = (newValue) => {
53
+ if (disabled || readOnly) {
54
+ return;
55
+ }
56
+ const shouldClose = !hasTime;
57
+ if (hasTime) {
58
+ if (selectedTime || shouldClose) {
59
+ commitValue(newValue, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
60
+ }
61
+ else {
62
+ setSelectedDate(newValue);
63
+ }
64
+ }
65
+ else {
66
+ setValue(newValue);
67
+ }
68
+ if (shouldClose) {
69
+ setOpen(false);
70
+ }
71
+ };
72
+ const selectTime = (newValue) => {
73
+ if (disabled || readOnly) {
74
+ return;
75
+ }
76
+ if (selectedDate) {
77
+ commitValue(selectedDate, newValue);
78
+ }
79
+ else {
80
+ setSelectedTime(newValue);
81
+ }
82
+ };
83
+ return {
84
+ value: value !== null && value !== void 0 ? value : null,
85
+ setValue,
86
+ dateValue: selectedDate,
87
+ timeValue: selectedTime,
88
+ setDateValue: selectDate,
89
+ setTimeValue: selectTime,
90
+ disabled,
91
+ readOnly,
92
+ format,
93
+ hasDate,
94
+ hasTime,
95
+ timeFormat,
96
+ isOpen,
97
+ setOpen(newIsOpen) {
98
+ if (!newIsOpen && !value && selectedDate && hasTime) {
99
+ commitValue(selectedDate, selectedTime || getPlaceholderTime(props.placeholderValue, props.timeZone));
100
+ }
101
+ setOpen(newIsOpen);
102
+ },
103
+ };
104
+ }
105
+ exports.useDatePickerState = useDatePickerState;
106
+ function mergeDateTime(date, time) {
107
+ return date
108
+ .set('hours', time.hour())
109
+ .set('minutes', time.minute())
110
+ .set('seconds', time.second());
111
+ }
112
+ function getPlaceholderTime(placeholderValue, timeZone) {
113
+ return (0, utils_1.createPlaceholderValue)({ placeholderValue, timeZone });
114
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "Calendar": "Calendar"
3
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "Calendar", params?: import("@gravity-ui/i18n").Params | undefined) => string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.i18n = void 0;
7
+ const i18n_1 = require("@gravity-ui/uikit/i18n");
8
+ const cn_1 = require("../../../utils/cn");
9
+ const en_json_1 = __importDefault(require("./en.json"));
10
+ const ru_json_1 = __importDefault(require("./ru.json"));
11
+ exports.i18n = (0, i18n_1.addComponentKeysets)({ en: en_json_1.default, ru: ru_json_1.default }, `${cn_1.NAMESPACE}date-picker`);
@@ -0,0 +1,3 @@
1
+ {
2
+ "Calendar": "Календарь"
3
+ }
@@ -0,0 +1,2 @@
1
+ export * from './DatePicker';
2
+ export * from './hooks/useDatePickerState';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./DatePicker"), exports);
18
+ __exportStar(require("./hooks/useDatePickerState"), exports);
@@ -0,0 +1 @@
1
+ export declare const b: import("@bem-react/classname").ClassNameFormatter;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.b = void 0;
4
+ const cn_1 = require("../../utils/cn");
5
+ exports.b = (0, cn_1.block)('date-picker');
@@ -0,0 +1,16 @@
1
+ .g-date-relative-date-field {
2
+ position: relative;
3
+ display: inline-block;
4
+ }
5
+ .g-date-relative-date-field__field {
6
+ width: 100%;
7
+ }
8
+ .g-date-relative-date-field__popup-content {
9
+ outline: none;
10
+ }
11
+ .g-date-relative-date-field__time-field {
12
+ width: 100%;
13
+ }
14
+ .g-date-relative-date-field__time-field-wrapper {
15
+ padding: 10px;
16
+ }
@@ -0,0 +1,11 @@
1
+ import type { AccessibilityProps, DomProps, FocusableProps, KeyboardEvents, StyleProps, TextInputExtendProps, TextInputProps } from '../types';
2
+ import type { RelativeDateFieldOptions } from './hooks/useRelativeDateFieldState';
3
+ import './RelativeDateField.css';
4
+ export interface RelativeDateFieldProps extends RelativeDateFieldOptions, TextInputProps, TextInputExtendProps, DomProps, StyleProps, AccessibilityProps, FocusableProps, KeyboardEvents {
5
+ /**
6
+ * Show time field in popup
7
+ * @default false
8
+ */
9
+ hasTime?: boolean;
10
+ }
11
+ export declare function RelativeDateField(props: RelativeDateFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RelativeDateField = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const uikit_1 = require("@gravity-ui/uikit");
10
+ const cn_1 = require("../../utils/cn");
11
+ const Calendar_1 = require("../Calendar");
12
+ const DateField_1 = require("../DateField");
13
+ const useRelativeDateFieldProps_1 = require("./hooks/useRelativeDateFieldProps");
14
+ const useRelativeDateFieldState_1 = require("./hooks/useRelativeDateFieldState");
15
+ require("./RelativeDateField.css");
16
+ const b = (0, cn_1.block)('relative-date-field');
17
+ function RelativeDateField(props) {
18
+ const state = (0, useRelativeDateFieldState_1.useRelativeDateFieldState)(props);
19
+ const { inputProps, calendarProps, timeInputProps } = (0, useRelativeDateFieldProps_1.useRelativeDateFieldProps)(state, props);
20
+ const [isMobile] = (0, uikit_1.useMobile)();
21
+ const anchorRef = react_1.default.useRef(null);
22
+ const [isOpen, setOpen] = react_1.default.useState(false);
23
+ const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
24
+ onBlurWithin: () => {
25
+ setOpen(false);
26
+ },
27
+ isDisabled: isMobile,
28
+ });
29
+ return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ role: "group", className: b(null, props.className), style: props.style }, focusWithinProps, { children: [(0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, inputProps, { className: b('field'), ref: anchorRef, onFocus: (e) => {
30
+ var _a;
31
+ if (!isMobile) {
32
+ setOpen(true);
33
+ }
34
+ (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
35
+ }, onBlur: props.onBlur })), !isMobile && ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorRef: anchorRef, open: isOpen, children: (0, jsx_runtime_1.jsxs)("div", { className: b('popup-content'), children: [(0, jsx_runtime_1.jsx)(Calendar_1.Calendar, Object.assign({}, calendarProps)), props.hasTime ? ((0, jsx_runtime_1.jsx)("div", { className: b('time-field-wrapper'), children: (0, jsx_runtime_1.jsx)(DateField_1.DateField, Object.assign({ className: b('time-field') }, timeInputProps)) })) : null] }) }))] })));
36
+ }
37
+ exports.RelativeDateField = RelativeDateField;
@@ -0,0 +1,12 @@
1
+ import type { TextInputProps } from '@gravity-ui/uikit';
2
+ import type { CalendarProps } from '../../Calendar';
3
+ import type { DateFieldProps } from '../../DateField';
4
+ import type { RelativeDateFieldProps } from '../RelativeDateField';
5
+ import type { RelativeDateFieldState } from './useRelativeDateFieldState';
6
+ interface RelativeDateProps {
7
+ inputProps: TextInputProps;
8
+ calendarProps: CalendarProps;
9
+ timeInputProps: DateFieldProps;
10
+ }
11
+ export declare function useRelativeDateFieldProps(state: RelativeDateFieldState, props: RelativeDateFieldProps): RelativeDateProps;
12
+ export {};
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useRelativeDateFieldProps = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ function useRelativeDateFieldProps(state, props) {
9
+ const [prevCorrectDate, setPrevCorrectDate] = react_1.default.useState(state.lastCorrectDate);
10
+ const [focusedDate, setFocusedDate] = react_1.default.useState(state.lastCorrectDate);
11
+ if (prevCorrectDate !== state.lastCorrectDate) {
12
+ setPrevCorrectDate(state.lastCorrectDate);
13
+ setFocusedDate(state.lastCorrectDate);
14
+ }
15
+ let error;
16
+ if (props.validationState === 'invalid') {
17
+ error = props.errorMessage || true;
18
+ }
19
+ else {
20
+ error = state.validationState === 'invalid';
21
+ }
22
+ return {
23
+ inputProps: {
24
+ size: props.size,
25
+ autoFocus: props.autoFocus,
26
+ value: state.text,
27
+ onUpdate: state.setText,
28
+ disabled: state.disabled,
29
+ hasClear: props.hasClear,
30
+ //@ts-expect-error TODO: use new TextInput API
31
+ error,
32
+ label: props.label,
33
+ id: props.id,
34
+ leftContent: props.leftContent,
35
+ rightContent: props.rightContent,
36
+ pin: props.pin,
37
+ view: props.view,
38
+ placeholder: props.placeholder,
39
+ onKeyDown: props.onKeyDown,
40
+ onKeyUp: props.onKeyUp,
41
+ onBlur: props.onBlur,
42
+ onFocus: props.onFocus,
43
+ controlProps: {
44
+ 'aria-label': props['aria-label'] || undefined,
45
+ 'aria-labelledby': props['aria-labelledby'] || undefined,
46
+ 'aria-describedby': props['aria-describedby'] || undefined,
47
+ 'aria-details': props['aria-details'] || undefined,
48
+ 'aria-disabled': state.disabled || undefined,
49
+ },
50
+ },
51
+ calendarProps: {
52
+ size: props.size === 's' ? 'm' : props.size,
53
+ readOnly: true,
54
+ value: state.parsedDate,
55
+ focusedValue: focusedDate,
56
+ onFocusUpdate: setFocusedDate,
57
+ },
58
+ timeInputProps: {
59
+ size: props.size,
60
+ readOnly: true,
61
+ value: state.lastCorrectDate,
62
+ format: 'LTS',
63
+ },
64
+ };
65
+ }
66
+ exports.useRelativeDateFieldProps = useRelativeDateFieldProps;
@@ -0,0 +1,30 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { InputBase, Validation, ValueBase } from '../../types';
3
+ export interface RelativeDateFieldState {
4
+ /** The current field value. */
5
+ value: string | null;
6
+ /** Sets the field value */
7
+ setValue: (v: string | null) => void;
8
+ /** Current user input */
9
+ text: string;
10
+ /** Sets text */
11
+ setText: (t: string) => void;
12
+ /** */
13
+ parsedDate: DateTime | null;
14
+ /** */
15
+ lastCorrectDate: DateTime | null;
16
+ /** */
17
+ validationState?: 'invalid';
18
+ /**
19
+ * Whether the field is disabled.
20
+ */
21
+ disabled?: boolean;
22
+ /**
23
+ * Whether the value is immutable.
24
+ */
25
+ readOnly?: boolean;
26
+ }
27
+ export interface RelativeDateFieldOptions extends ValueBase<string, string | null>, InputBase, Validation {
28
+ timeZone?: string;
29
+ }
30
+ export declare function useRelativeDateFieldState(props: RelativeDateFieldOptions): RelativeDateFieldState;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useRelativeDateFieldState = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const date_utils_1 = require("@gravity-ui/date-utils");
9
+ const useControlledState_1 = require("../../hooks/useControlledState");
10
+ function useRelativeDateFieldState(props) {
11
+ const [value, setValue] = (0, useControlledState_1.useControlledState)(props.value, props.defaultValue, props.onUpdate);
12
+ const [text, setText] = react_1.default.useState(value !== null && value !== void 0 ? value : '');
13
+ if (value && value !== text) {
14
+ setText(value);
15
+ }
16
+ const handleTextChange = (t) => {
17
+ if (props.disabled || props.readOnly) {
18
+ return;
19
+ }
20
+ setText(t);
21
+ if (isLikeRelativeDate(t)) {
22
+ const date = (0, date_utils_1.dateTimeParse)(t);
23
+ if (date && (0, date_utils_1.isValid)(date)) {
24
+ setValue(t);
25
+ }
26
+ else {
27
+ setValue(null);
28
+ }
29
+ }
30
+ else {
31
+ setValue(null);
32
+ }
33
+ };
34
+ const parsedDate = react_1.default.useMemo(() => {
35
+ var _a;
36
+ if (!value) {
37
+ return null;
38
+ }
39
+ return (_a = (0, date_utils_1.dateTimeParse)(value, { timeZone: props.timeZone })) !== null && _a !== void 0 ? _a : null;
40
+ }, [value, props.timeZone]);
41
+ const [lastCorrectDate, setLastCorrectDate] = react_1.default.useState(parsedDate);
42
+ if (parsedDate && parsedDate !== lastCorrectDate) {
43
+ setLastCorrectDate(parsedDate);
44
+ }
45
+ const validationState = props.validationState || (text && !parsedDate) ? 'invalid' : undefined;
46
+ return {
47
+ value: value !== null && value !== void 0 ? value : null,
48
+ setValue(v) {
49
+ if (props.disabled || props.readOnly) {
50
+ return;
51
+ }
52
+ setValue(v);
53
+ },
54
+ text,
55
+ setText: handleTextChange,
56
+ parsedDate,
57
+ lastCorrectDate,
58
+ validationState,
59
+ disabled: props.disabled,
60
+ readOnly: props.readOnly,
61
+ };
62
+ }
63
+ exports.useRelativeDateFieldState = useRelativeDateFieldState;
64
+ function isLikeRelativeDate(text) {
65
+ return /^now/i.test(text);
66
+ }
@@ -0,0 +1,3 @@
1
+ export * from './RelativeDateField';
2
+ export * from './hooks/useRelativeDateFieldProps';
3
+ export * from './hooks/useRelativeDateFieldState';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./RelativeDateField"), exports);
18
+ __exportStar(require("./hooks/useRelativeDateFieldProps"), exports);
19
+ __exportStar(require("./hooks/useRelativeDateFieldState"), exports);
@@ -0,0 +1,16 @@
1
+ .g-date-relative-date-picker {
2
+ position: relative;
3
+ display: inline-flex;
4
+ }
5
+ .g-date-relative-date-picker__field {
6
+ width: 100%;
7
+ }
8
+ .g-date-relative-date-picker__popup-content {
9
+ outline: none;
10
+ }
11
+ .g-date-relative-date-picker__time-field {
12
+ width: 100%;
13
+ }
14
+ .g-date-relative-date-picker__time-field-wrapper {
15
+ padding: 10px;
16
+ }
@@ -0,0 +1,6 @@
1
+ import type { AccessibilityProps, DomProps, FocusableProps, KeyboardEvents, StyleProps, TextInputProps } from '../types';
2
+ import type { RelativeDatePickerStateOptions } from './hooks/useRelativeDatePickerState';
3
+ import './RelativeDatePicker.css';
4
+ export interface RelativeDatePickerProps extends RelativeDatePickerStateOptions, TextInputProps, FocusableProps, KeyboardEvents, DomProps, StyleProps, AccessibilityProps {
5
+ }
6
+ export declare function RelativeDatePicker(props: RelativeDatePickerProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RelativeDatePicker = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const icons_1 = require("@gravity-ui/icons");
10
+ const uikit_1 = require("@gravity-ui/uikit");
11
+ const cn_1 = require("../../utils/cn");
12
+ const Calendar_1 = require("../Calendar");
13
+ const DateField_1 = require("../DateField");
14
+ const MobileCalendar_1 = require("../DatePicker/MobileCalendar");
15
+ const useRelativeDatePickerProps_1 = require("./hooks/useRelativeDatePickerProps");
16
+ const useRelativeDatePickerState_1 = require("./hooks/useRelativeDatePickerState");
17
+ require("./RelativeDatePicker.css");
18
+ const b = (0, cn_1.block)('relative-date-picker');
19
+ function RelativeDatePicker(props) {
20
+ const state = (0, useRelativeDatePickerState_1.useRelativeDatePickerState)(props);
21
+ const { groupProps, fieldProps, modeSwitcherProps, calendarButtonProps, popupProps, calendarProps, timeInputProps, } = (0, useRelativeDatePickerProps_1.useRelativeDatePickerProps)(state, props);
22
+ const anchorRef = react_1.default.useRef(null);
23
+ const [isMobile] = (0, uikit_1.useMobile)();
24
+ return ((0, jsx_runtime_1.jsxs)("div", Object.assign({ ref: anchorRef, className: b(null, props.className) }, groupProps, { children: [isMobile && state.mode === 'absolute' && ((0, jsx_runtime_1.jsx)(MobileCalendar_1.MobileCalendar, { state: state.datePickerState, props: {
25
+ id: props.id,
26
+ disabled: props.disabled,
27
+ readOnly: props.readOnly,
28
+ placeholderValue: props.placeholderValue,
29
+ timeZone: props.timeZone,
30
+ } })), (0, jsx_runtime_1.jsx)(uikit_1.TextInput, Object.assign({}, fieldProps, { leftContent: (0, jsx_runtime_1.jsx)(uikit_1.Button, Object.assign({}, modeSwitcherProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Function }) })), rightContent: (0, jsx_runtime_1.jsxs)(react_1.default.Fragment, { children: [!isMobile && ((0, jsx_runtime_1.jsx)(uikit_1.Button, Object.assign({}, calendarButtonProps, { children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Calendar }) }))), isMobile && state.mode === 'absolute' && ((0, jsx_runtime_1.jsx)(MobileCalendar_1.MobileCalendarIcon, { state: state.datePickerState, props: { size: props.size } }))] }) })), !isMobile && ((0, jsx_runtime_1.jsx)(uikit_1.Popup, Object.assign({}, popupProps, { anchorRef: anchorRef, children: (0, jsx_runtime_1.jsxs)("div", { className: b('popup-content'), children: [(0, jsx_runtime_1.jsx)(Calendar_1.Calendar, Object.assign({}, calendarProps)), state.datePickerState.hasTime && ((0, jsx_runtime_1.jsx)("div", { className: b('time-field-wrapper'), children: (0, jsx_runtime_1.jsx)(DateField_1.DateField, Object.assign({}, timeInputProps)) }))] }) })))] })));
31
+ }
32
+ exports.RelativeDatePicker = RelativeDatePicker;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import type { ButtonProps, PopupProps, TextInputProps } from '@gravity-ui/uikit';
3
+ import type { Calendar } from '../../Calendar';
4
+ import type { DateFieldProps } from '../../DateField';
5
+ import type { RelativeDatePickerProps } from '../RelativeDatePicker';
6
+ import type { RelativeDatePickerState } from './useRelativeDatePickerState';
7
+ interface InnerRelativeDatePickerProps {
8
+ groupProps: React.HTMLAttributes<unknown>;
9
+ fieldProps: TextInputProps;
10
+ modeSwitcherProps: ButtonProps;
11
+ calendarButtonProps: ButtonProps;
12
+ popupProps: PopupProps;
13
+ calendarProps: React.ComponentProps<typeof Calendar>;
14
+ timeInputProps: DateFieldProps;
15
+ }
16
+ export declare function useRelativeDatePickerProps(state: RelativeDatePickerState, { onFocus, onBlur, ...props }: RelativeDatePickerProps): InnerRelativeDatePickerProps;
17
+ export {};