@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,175 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.useRelativeDatePickerProps = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const uikit_1 = require("@gravity-ui/uikit");
20
+ const DateField_1 = require("../../DateField");
21
+ const getButtonSizeForInput_1 = require("../../utils/getButtonSizeForInput");
22
+ const mergeProps_1 = require("../../utils/mergeProps");
23
+ const i18n_1 = require("../i18n");
24
+ function useRelativeDatePickerProps(state, _a) {
25
+ var { onFocus, onBlur } = _a, props = __rest(_a, ["onFocus", "onBlur"]);
26
+ const { mode, setMode, datePickerState, dateFieldState, relativeDateState } = state;
27
+ const [focusedDate, setFocusedDate] = react_1.default.useState(relativeDateState.lastCorrectDate);
28
+ const [prevCorrectDate, setPrevCorrectDate] = react_1.default.useState(relativeDateState.lastCorrectDate);
29
+ if (prevCorrectDate !== relativeDateState.lastCorrectDate) {
30
+ setPrevCorrectDate(relativeDateState.lastCorrectDate);
31
+ setFocusedDate(relativeDateState.lastCorrectDate);
32
+ }
33
+ const [prevDateValue, setPrevDateValue] = react_1.default.useState(datePickerState.dateValue);
34
+ if (datePickerState.dateValue !== prevDateValue) {
35
+ setPrevDateValue(datePickerState.dateValue);
36
+ if (datePickerState.dateValue) {
37
+ setFocusedDate(datePickerState.dateValue);
38
+ }
39
+ }
40
+ const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
41
+ onFocusWithin: onFocus,
42
+ onBlurWithin: onBlur,
43
+ onFocusWithinChange(isFocusWithin) {
44
+ if (!isFocusWithin) {
45
+ state.setActive(isFocusWithin);
46
+ }
47
+ },
48
+ });
49
+ const [isOpen, setOpen] = react_1.default.useState(false);
50
+ if (!state.isActive && isOpen) {
51
+ setOpen(false);
52
+ }
53
+ const [prevActive, setPrevActive] = react_1.default.useState(state.isActive);
54
+ if (prevActive !== state.isActive) {
55
+ setPrevActive(state.isActive);
56
+ if (state.isActive && !isOpen) {
57
+ setOpen(true);
58
+ }
59
+ }
60
+ const commonInputProps = {
61
+ onFocus: () => {
62
+ state.setActive(true);
63
+ },
64
+ };
65
+ const { inputProps } = (0, DateField_1.useDateFieldProps)(dateFieldState, Object.assign(Object.assign({}, props), { value: undefined, defaultValue: undefined, onUpdate: undefined }));
66
+ const relativeDateProps = {
67
+ disabled: relativeDateState.disabled,
68
+ value: relativeDateState.text,
69
+ onUpdate: relativeDateState.setText,
70
+ hasClear: props.hasClear && !relativeDateState.readOnly,
71
+ size: props.size,
72
+ };
73
+ let error;
74
+ let validationState = props.validationState;
75
+ if (validationState) {
76
+ error = validationState === 'invalid' ? props.errorMessage || true : undefined;
77
+ }
78
+ else {
79
+ validationState =
80
+ mode === 'relative'
81
+ ? relativeDateState.validationState
82
+ : dateFieldState.validationState;
83
+ error = validationState === 'invalid';
84
+ }
85
+ const wasActiveBeforeClickRef = react_1.default.useRef(state.isActive);
86
+ const inputRef = react_1.default.useRef(null);
87
+ const handleRef = (0, uikit_1.useForkRef)(inputRef, mode === 'relative' ? relativeDateProps.controlRef : inputProps.controlRef);
88
+ const calendarRef = react_1.default.useRef(null);
89
+ return {
90
+ groupProps: Object.assign({ role: 'group' }, focusWithinProps),
91
+ fieldProps: (0, mergeProps_1.mergeProps)(commonInputProps, mode === 'relative' ? relativeDateProps : inputProps, { controlRef: handleRef, error }),
92
+ modeSwitcherProps: {
93
+ size: (0, getButtonSizeForInput_1.getButtonSizeForInput)(props.size),
94
+ disabled: state.readOnly || state.disabled,
95
+ view: 'flat-secondary',
96
+ style: { zIndex: 2 },
97
+ selected: mode === 'relative',
98
+ extraProps: {
99
+ 'aria-label': (0, i18n_1.i18n)('Formula input mode'),
100
+ },
101
+ onClick: () => {
102
+ setMode(mode === 'relative' ? 'absolute' : 'relative');
103
+ if (mode === 'relative') {
104
+ const valueDate = datePickerState.value;
105
+ if (valueDate) {
106
+ setFocusedDate(valueDate);
107
+ }
108
+ }
109
+ else if (relativeDateState.parsedDate) {
110
+ setFocusedDate(relativeDateState.parsedDate);
111
+ }
112
+ setTimeout(() => { var _a; return (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });
113
+ },
114
+ },
115
+ calendarButtonProps: {
116
+ size: (0, getButtonSizeForInput_1.getButtonSizeForInput)(props.size),
117
+ disabled: state.disabled,
118
+ extraProps: {
119
+ 'aria-label': (0, i18n_1.i18n)('Calendar'),
120
+ 'aria-haspopup': 'dialog',
121
+ 'aria-expanded': isOpen,
122
+ },
123
+ view: 'flat-secondary',
124
+ onFocus: () => {
125
+ wasActiveBeforeClickRef.current = state.isActive;
126
+ },
127
+ onClick: () => {
128
+ state.setActive(true);
129
+ if (wasActiveBeforeClickRef.current) {
130
+ setOpen(!isOpen);
131
+ if (!isOpen) {
132
+ setTimeout(() => {
133
+ var _a;
134
+ (_a = calendarRef.current) === null || _a === void 0 ? void 0 : _a.focus();
135
+ });
136
+ }
137
+ }
138
+ wasActiveBeforeClickRef.current = state.isActive;
139
+ },
140
+ },
141
+ popupProps: {
142
+ open: isOpen,
143
+ onEscapeKeyDown: () => {
144
+ setOpen(false);
145
+ },
146
+ restoreFocus: true,
147
+ },
148
+ calendarProps: {
149
+ ref: calendarRef,
150
+ size: props.size === 's' ? 'm' : props.size,
151
+ readOnly: props.readOnly,
152
+ value: state.selectedDate,
153
+ onUpdate: (v) => {
154
+ datePickerState.setDateValue(v);
155
+ if (!state.datePickerState.hasTime) {
156
+ setOpen(false);
157
+ setTimeout(() => { var _a; return (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });
158
+ }
159
+ },
160
+ focusedValue: focusedDate,
161
+ onFocusUpdate: setFocusedDate,
162
+ },
163
+ timeInputProps: {
164
+ value: datePickerState.timeValue,
165
+ onUpdate: datePickerState.setTimeValue,
166
+ format: datePickerState.timeFormat,
167
+ readOnly: state.readOnly,
168
+ disabled: state.disabled,
169
+ timeZone: props.timeZone,
170
+ hasClear: props.hasClear,
171
+ size: props.size,
172
+ },
173
+ };
174
+ }
175
+ exports.useRelativeDatePickerProps = useRelativeDatePickerProps;
@@ -0,0 +1,36 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { DateFieldState } from '../../DateField';
3
+ import type { DatePickerState } from '../../DatePicker';
4
+ import type { RelativeDateFieldState } from '../../RelativeDateField';
5
+ import type { DateFieldBase } from '../../types';
6
+ export type Value = {
7
+ type: 'absolute';
8
+ value: DateTime;
9
+ } | {
10
+ type: 'relative';
11
+ value: string;
12
+ };
13
+ export type RelativeDatePickerMode = Value['type'];
14
+ export interface RelativeDatePickerStateOptions extends DateFieldBase<Value> {
15
+ }
16
+ export interface RelativeDatePickerState {
17
+ value: Value | null;
18
+ setValue: (value: Value | null) => void;
19
+ mode: RelativeDatePickerMode;
20
+ setMode: (mode: RelativeDatePickerMode) => void;
21
+ datePickerState: DatePickerState;
22
+ dateFieldState: DateFieldState;
23
+ relativeDateState: RelativeDateFieldState;
24
+ selectedDate: DateTime | null;
25
+ /**
26
+ * Whether the field is disabled.
27
+ */
28
+ disabled?: boolean;
29
+ /**
30
+ * Whether the value is immutable.
31
+ */
32
+ readOnly?: boolean;
33
+ isActive: boolean;
34
+ setActive: (isActive: boolean) => void;
35
+ }
36
+ export declare function useRelativeDatePickerState(props: RelativeDatePickerStateOptions): RelativeDatePickerState;
@@ -0,0 +1,109 @@
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.useRelativeDatePickerState = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const DateField_1 = require("../../DateField");
9
+ const DatePicker_1 = require("../../DatePicker");
10
+ const RelativeDateField_1 = require("../../RelativeDateField");
11
+ const useControlledState_1 = require("../../hooks/useControlledState");
12
+ function useRelativeDatePickerState(props) {
13
+ const [value, setValue] = (0, useControlledState_1.useControlledState)(props.value, props.defaultValue, props.onUpdate);
14
+ const [mode, setMode] = react_1.default.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? 'relative' : 'absolute');
15
+ const [prevValue, setPrevValue] = react_1.default.useState(value);
16
+ if (value !== prevValue) {
17
+ setPrevValue(value);
18
+ if (value) {
19
+ setMode(value.type);
20
+ }
21
+ }
22
+ const [valueDate, setValueDate] = react_1.default.useState((value === null || value === void 0 ? void 0 : value.type) === 'absolute' ? value.value : null);
23
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'absolute' && value.value !== valueDate) {
24
+ setValueDate(value.value);
25
+ }
26
+ const datePickerState = (0, DatePicker_1.useDatePickerState)({
27
+ value: valueDate,
28
+ onUpdate: (date) => {
29
+ setValueDate(date);
30
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'absolute' && (date === null || date === void 0 ? void 0 : date.isSame(value.value))) {
31
+ return;
32
+ }
33
+ setValue(date ? { type: 'absolute', value: date } : null);
34
+ },
35
+ format: props.format,
36
+ placeholderValue: props.placeholderValue,
37
+ timeZone: props.timeZone,
38
+ disabled: props.disabled,
39
+ readOnly: props.readOnly,
40
+ });
41
+ const dateFieldState = (0, DateField_1.useDateFieldState)({
42
+ value: valueDate,
43
+ onUpdate: datePickerState.setValue,
44
+ format: props.format,
45
+ placeholderValue: props.placeholderValue,
46
+ timeZone: props.timeZone,
47
+ disabled: props.disabled,
48
+ readOnly: props.readOnly,
49
+ });
50
+ const [valueRelative, setValueRelative] = react_1.default.useState((value === null || value === void 0 ? void 0 : value.type) === 'relative' ? value.value : null);
51
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && value.value !== valueRelative) {
52
+ setValueRelative(value.value);
53
+ }
54
+ const relativeDateState = (0, RelativeDateField_1.useRelativeDateFieldState)({
55
+ value: valueRelative,
56
+ onUpdate: (v) => {
57
+ setValueRelative(v);
58
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'relative' && v === value.value) {
59
+ return;
60
+ }
61
+ setValue(v ? { type: 'relative', value: v } : null);
62
+ },
63
+ disabled: props.disabled,
64
+ readOnly: props.readOnly,
65
+ });
66
+ if (!value) {
67
+ if (mode === 'absolute' && valueDate) {
68
+ setValueDate(null);
69
+ }
70
+ else if (mode === 'relative' && valueRelative) {
71
+ setValueRelative(null);
72
+ }
73
+ }
74
+ const selectedDate = mode === 'relative' ? relativeDateState.parsedDate : datePickerState.dateValue;
75
+ const [isActive, setActive] = react_1.default.useState(false);
76
+ return {
77
+ value: value !== null && value !== void 0 ? value : null,
78
+ setValue(v) {
79
+ if (props.readOnly || props.disabled) {
80
+ return;
81
+ }
82
+ setValue(v);
83
+ },
84
+ disabled: props.disabled,
85
+ readOnly: props.readOnly,
86
+ mode,
87
+ setMode(newMode) {
88
+ if (props.readOnly || props.disabled || newMode === mode) {
89
+ return;
90
+ }
91
+ setMode(newMode);
92
+ if (newMode === 'relative') {
93
+ if ((!value && valueRelative) || value) {
94
+ setValue(valueRelative ? { type: 'relative', value: valueRelative } : null);
95
+ }
96
+ }
97
+ else if ((!value && valueDate) || value) {
98
+ setValue(valueDate ? { type: 'absolute', value: valueDate } : null);
99
+ }
100
+ },
101
+ datePickerState,
102
+ dateFieldState,
103
+ relativeDateState,
104
+ selectedDate,
105
+ isActive,
106
+ setActive,
107
+ };
108
+ }
109
+ exports.useRelativeDatePickerState = useRelativeDatePickerState;
@@ -0,0 +1,4 @@
1
+ {
2
+ "Calendar": "Calendar",
3
+ "Formula input mode": "Formula input mode"
4
+ }
@@ -0,0 +1 @@
1
+ export declare const i18n: (key: "Calendar" | "Formula input mode", 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}relative-date-picker`);
@@ -0,0 +1,4 @@
1
+ {
2
+ "Calendar": "Календарь",
3
+ "Formula input mode": "Режим ввода формулы"
4
+ }
@@ -0,0 +1,3 @@
1
+ export * from './RelativeDatePicker';
2
+ export * from './hooks/useRelativeDatePickerState';
3
+ export * from './hooks/useRelativeDatePickerProps';
@@ -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("./RelativeDatePicker"), exports);
18
+ __exportStar(require("./hooks/useRelativeDatePickerState"), exports);
19
+ __exportStar(require("./hooks/useRelativeDatePickerProps"), exports);
@@ -0,0 +1 @@
1
+ export declare function useControlledState<T, C extends T = T>(value: T, defaultValue: T, onUpdate?: (value: C, ...args: any[]) => void): readonly [T, (newValue: C, ...args: any[]) => void];
@@ -0,0 +1,30 @@
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.useControlledState = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ function useControlledState(value, defaultValue, onUpdate) {
9
+ const [innerValue, setInnerValue] = react_1.default.useState(defaultValue);
10
+ const [wasControlled] = react_1.default.useState(value !== undefined);
11
+ const isControlled = value !== undefined;
12
+ if (wasControlled !== isControlled) {
13
+ console.warn(`WARN: A component changed from ${wasControlled ? 'controlled' : 'uncontrolled'} to ${isControlled ? 'controlled' : 'uncontrolled'}.`);
14
+ }
15
+ const currentValueRef = react_1.default.useRef(isControlled ? value : defaultValue);
16
+ react_1.default.useEffect(() => {
17
+ currentValueRef.current = value;
18
+ }, [value]);
19
+ const setState = react_1.default.useCallback((newValue, ...args) => {
20
+ if (!Object.is(currentValueRef.current, newValue)) {
21
+ onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(newValue, ...args);
22
+ }
23
+ if (!isControlled) {
24
+ currentValueRef.current = newValue;
25
+ setInnerValue(newValue);
26
+ }
27
+ }, [isControlled, onUpdate]);
28
+ return [isControlled ? value : innerValue, setState];
29
+ }
30
+ exports.useControlledState = useControlledState;
@@ -0,0 +1,5 @@
1
+ export * from './Calendar';
2
+ export * from './DateField';
3
+ export * from './DatePicker';
4
+ export * from './RelativeDateField';
5
+ export * from './RelativeDatePicker';
@@ -0,0 +1,21 @@
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("./Calendar"), exports);
18
+ __exportStar(require("./DateField"), exports);
19
+ __exportStar(require("./DatePicker"), exports);
20
+ __exportStar(require("./RelativeDateField"), exports);
21
+ __exportStar(require("./RelativeDatePicker"), exports);
@@ -0,0 +1,16 @@
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { InputBase, Validation, ValueBase } from './inputs';
3
+ export interface DateFieldBase<T = DateTime> extends ValueBase<T, T | null>, InputBase, Validation {
4
+ /** The minimum allowed date that a user may select. */
5
+ minValue?: DateTime;
6
+ /** The maximum allowed date that a user may select. */
7
+ maxValue?: DateTime;
8
+ /** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
9
+ isDateUnavailable?: (date: DateTime) => boolean;
10
+ /** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
11
+ format?: string;
12
+ /** 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. */
13
+ placeholderValue?: DateTime;
14
+ /** */
15
+ timeZone?: string;
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ /// <reference types="react" />
2
+ export interface KeyboardEvents {
3
+ /** Handler that is called when a key is pressed. */
4
+ onKeyDown?: (e: React.KeyboardEvent) => void;
5
+ /** Handler that is called when a key is released. */
6
+ onKeyUp?: (e: React.KeyboardEvent) => void;
7
+ }
8
+ export interface FocusEvents<Target = Element> {
9
+ /** Handler that is called when the element receives focus. */
10
+ onFocus?: (e: React.FocusEvent<Target>) => void;
11
+ /** Handler that is called when the element loses focus. */
12
+ onBlur?: (e: React.FocusEvent<Target>) => void;
13
+ }
14
+ export interface FocusableProps<Target = Element> extends FocusEvents<Target> {
15
+ /** Whether the element should receive focus on render. */
16
+ autoFocus?: boolean;
17
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export type * from './datePicker';
2
+ export type * from './inputs';
3
+ export type * from './style';
4
+ export type * from './events';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,79 @@
1
+ /// <reference types="react" />
2
+ import type { TextInputProps as TextInputBaseProps, TextInputPin, TextInputSize, TextInputView } from '@gravity-ui/uikit';
3
+ export type ValidationState = 'invalid';
4
+ export interface AccessibilityProps {
5
+ /** Defines a string value that labels the current element. */
6
+ 'aria-label'?: string;
7
+ /** Identifies the element (or elements) that labels the current element. */
8
+ 'aria-labelledby'?: string;
9
+ /** Identifies the element (or elements) that describes the object. */
10
+ 'aria-describedby'?: string;
11
+ /** Identifies the element (or elements) that provide a detailed, extended description for the object. */
12
+ 'aria-details'?: string;
13
+ }
14
+ export interface ValueBase<T, C = T> {
15
+ /** The current value (controlled). */
16
+ value?: T | null;
17
+ /** The default value (uncontrolled). */
18
+ defaultValue?: T;
19
+ /** Handler that is called when the value changes. */
20
+ onUpdate?: (value: C) => void;
21
+ }
22
+ export interface Validation {
23
+ /** Whether the input should display its "invalid" visual styling */
24
+ validationState?: ValidationState;
25
+ /** An error message for the field */
26
+ errorMessage?: React.ReactNode;
27
+ }
28
+ export interface DomProps {
29
+ /** The element's unique identifier. */
30
+ id?: string;
31
+ }
32
+ export interface InputBase {
33
+ /**
34
+ * Whether the field is disabled.
35
+ * @default false
36
+ */
37
+ disabled?: boolean;
38
+ /**
39
+ * Whether the calendar value is immutable.
40
+ * @default false
41
+ */
42
+ readOnly?: boolean;
43
+ }
44
+ export interface TextInputProps {
45
+ /** The size of the element */
46
+ size?: TextInputSize;
47
+ /**
48
+ * Corner rounding
49
+ * @default 'round-round'
50
+ */
51
+ pin?: TextInputPin;
52
+ /** Control view */
53
+ view?: TextInputView;
54
+ /** Inner field label */
55
+ label?: TextInputBaseProps['label'];
56
+ /** Text that appears in the field when it has no value set */
57
+ placeholder?: string;
58
+ /**
59
+ * Show clear button
60
+ * @default false
61
+ */
62
+ hasClear?: boolean;
63
+ }
64
+ export interface TextInputExtendProps {
65
+ /**
66
+ * User`s node rendered before label and input
67
+ */
68
+ leftContent?: TextInputBaseProps['leftContent'];
69
+ /**
70
+ * User`s node rendered after input and clear button
71
+ */
72
+ rightContent?: TextInputBaseProps['rightContent'];
73
+ }
74
+ export interface RangeValue<T> {
75
+ /** The start value of the range. */
76
+ start: T;
77
+ /** The end value of the range. */
78
+ end: T;
79
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export interface StyleProps {
3
+ /** Sets inline style for the element. */
4
+ style?: React.CSSProperties;
5
+ /** Sets the CSS className for the element. */
6
+ className?: string;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ import type { TextInputSize } from '@gravity-ui/uikit';
2
+ export declare function getButtonSizeForInput(size: TextInputSize | undefined): "s" | "m" | "l" | "xs";
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getButtonSizeForInput = void 0;
4
+ function getButtonSizeForInput(size) {
5
+ switch (size) {
6
+ case 'xl': {
7
+ return 'l';
8
+ }
9
+ case 'l': {
10
+ return 'm';
11
+ }
12
+ case 's': {
13
+ return 'xs';
14
+ }
15
+ default: {
16
+ return 's';
17
+ }
18
+ }
19
+ }
20
+ exports.getButtonSizeForInput = getButtonSizeForInput;
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ [key: string]: any;
3
+ }
4
+ type PropsArgs = Props | undefined | null;
5
+ type TupleTypes<T> = {
6
+ [P in keyof T]: T[P];
7
+ } extends {
8
+ [key: number]: infer V;
9
+ } ? NullToObject<V> : never;
10
+ type NullToObject<T> = T extends null | undefined ? {} : T;
11
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
12
+ export declare function mergeProps<T extends PropsArgs[]>(...args: T): UnionToIntersection<TupleTypes<T>>;
13
+ export {};