@ozen-ui/kit 0.73.0 → 0.75.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 (179) hide show
  1. package/__inner__/cjs/components/Calendar/Calendar.js +26 -2
  2. package/__inner__/cjs/components/Calendar/CalendarContext.d.ts +8 -1
  3. package/__inner__/cjs/components/Calendar/CalendarContext.js +10 -1
  4. package/__inner__/cjs/components/Calendar/__tests__/utils.d.ts +11 -0
  5. package/__inner__/cjs/components/Calendar/__tests__/utils.js +58 -0
  6. package/__inner__/cjs/components/Calendar/components/CalendarGrid/CalendarGrid.js +4 -3
  7. package/__inner__/cjs/components/Calendar/components/CalendarItem/CalendarItem.js +25 -2
  8. package/__inner__/cjs/components/Calendar/components/CalendarItem/CalendarItemContext.d.ts +1 -0
  9. package/__inner__/cjs/components/Calendar/components/CalendarItem/CalendarItemContext.js +1 -0
  10. package/__inner__/cjs/components/Calendar/components/CalendarModeRange/CalendarModeRange.js +68 -13
  11. package/__inner__/cjs/components/Calendar/components/CalendarModeSingle/CalendarModeSingle.js +62 -16
  12. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/CalendarSwitcher.js +6 -7
  13. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.d.ts +3 -0
  14. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.js +13 -0
  15. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.d.ts +2 -0
  16. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.js +5 -0
  17. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.d.ts +4 -0
  18. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.js +2 -0
  19. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/index.d.ts +1 -0
  20. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/index.js +4 -0
  21. package/__inner__/cjs/components/Calendar/constants.d.ts +2 -0
  22. package/__inner__/cjs/components/Calendar/constants.js +7 -1
  23. package/__inner__/cjs/components/Calendar/index.d.ts +1 -0
  24. package/__inner__/cjs/components/Calendar/index.js +1 -0
  25. package/__inner__/cjs/components/Calendar/types.d.ts +13 -5
  26. package/__inner__/cjs/components/Calendar/utils.d.ts +10 -1
  27. package/__inner__/cjs/components/Calendar/utils.js +12 -1
  28. package/__inner__/cjs/components/DatePicker/components/DateInput/DateInput.js +4 -3
  29. package/__inner__/cjs/components/DatePicker/components/DateInput/types.d.ts +6 -2
  30. package/__inner__/cjs/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.d.ts +2 -1
  31. package/__inner__/cjs/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.js +67 -7
  32. package/__inner__/cjs/components/DatePicker/components/DatePickerModeDate/DatePickerModeDate.js +32 -20
  33. package/__inner__/cjs/components/DatePicker/components/DatePickerModeDateRange/DatePickerModeDateRange.js +74 -51
  34. package/__inner__/cjs/components/DatePicker/constants.d.ts +2 -0
  35. package/__inner__/cjs/components/DatePicker/constants.js +4 -1
  36. package/__inner__/cjs/components/DatePicker/types.d.ts +10 -6
  37. package/__inner__/cjs/components/DatePicker/types.js +3 -1
  38. package/__inner__/cjs/components/DatePicker/utils/formatDateToString/formatDateToString.d.ts +2 -1
  39. package/__inner__/cjs/components/DatePicker/utils/formatDateToString/formatDateToString.js +18 -5
  40. package/__inner__/cjs/components/DatePicker/utils/formatStringToDate/formatStringToDate.d.ts +2 -1
  41. package/__inner__/cjs/components/DatePicker/utils/formatStringToDate/formatStringToDate.js +6 -5
  42. package/__inner__/cjs/components/DatePicker/utils/getCommonCalendarProps/getCommonCalendarProps.js +2 -2
  43. package/__inner__/cjs/components/DatePicker/utils/index.d.ts +2 -0
  44. package/__inner__/cjs/components/DatePicker/utils/index.js +2 -0
  45. package/__inner__/cjs/components/DatePicker/utils/isValidDateString/isValidDateString.d.ts +2 -1
  46. package/__inner__/cjs/components/DatePicker/utils/isValidDateString/isValidDateString.js +9 -8
  47. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/index.d.ts +1 -0
  48. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/index.js +4 -0
  49. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/maskPastedDate.d.ts +6 -0
  50. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/maskPastedDate.js +43 -0
  51. package/__inner__/cjs/components/DatePicker/utils/parseDateString/index.d.ts +1 -0
  52. package/__inner__/cjs/components/DatePicker/utils/parseDateString/index.js +4 -0
  53. package/__inner__/cjs/components/DatePicker/utils/parseDateString/parseDateString.d.ts +6 -0
  54. package/__inner__/cjs/components/DatePicker/utils/parseDateString/parseDateString.js +66 -0
  55. package/__inner__/cjs/components/Grid/Grid.d.ts +2 -1
  56. package/__inner__/cjs/components/Grid/GridItem.d.ts +2 -1
  57. package/__inner__/cjs/components/ListCardItem/hooks/useListCardItemRatio.js +10 -14
  58. package/__inner__/cjs/components/SectionMessage/SectionMessage.css +6 -0
  59. package/__inner__/cjs/components/SectionMessage/SectionMessage.js +8 -5
  60. package/__inner__/cjs/components/SectionMessage/config.d.ts +2 -3
  61. package/__inner__/cjs/components/SectionMessage/config.js +6 -22
  62. package/__inner__/cjs/components/SectionMessage/constants.d.ts +3 -0
  63. package/__inner__/cjs/components/SectionMessage/constants.js +7 -1
  64. package/__inner__/cjs/components/SectionMessage/types.d.ts +6 -1
  65. package/__inner__/cjs/components/SectionMessage/types.js +1 -0
  66. package/__inner__/cjs/components/Stack/Stack.css +3 -0
  67. package/__inner__/cjs/components/Stack/Stack.js +2 -1
  68. package/__inner__/cjs/components/Stack/constants.d.ts +1 -0
  69. package/__inner__/cjs/components/Stack/constants.js +2 -1
  70. package/__inner__/cjs/components/Stack/types.d.ts +4 -0
  71. package/__inner__/cjs/components/Stack/types.js +2 -1
  72. package/__inner__/cjs/hooks/useDevEffect/index.d.ts +1 -0
  73. package/__inner__/cjs/hooks/useDevEffect/index.js +4 -0
  74. package/__inner__/cjs/hooks/useDevEffect/useDevEffect.d.ts +3 -0
  75. package/__inner__/cjs/hooks/useDevEffect/useDevEffect.js +13 -0
  76. package/__inner__/cjs/hooks/useIntersectionObserver/index.d.ts +2 -0
  77. package/__inner__/cjs/hooks/useIntersectionObserver/index.js +5 -0
  78. package/__inner__/cjs/hooks/useIntersectionObserver/types.d.ts +29 -0
  79. package/__inner__/cjs/hooks/useIntersectionObserver/types.js +2 -0
  80. package/__inner__/cjs/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +6 -0
  81. package/__inner__/cjs/hooks/useIntersectionObserver/useIntersectionObserver.js +80 -0
  82. package/__inner__/cjs/locale/locale.js +39 -3
  83. package/__inner__/cjs/utils/array/createFilled/createFilledArray.d.ts +1 -1
  84. package/__inner__/cjs/utils/array/createFilled/createFilledArray.js +6 -1
  85. package/__inner__/cjs/utils/react/extractRef.d.ts +2 -0
  86. package/__inner__/cjs/utils/react/extractRef.js +11 -0
  87. package/__inner__/cjs/utils/react/index.d.ts +1 -0
  88. package/__inner__/cjs/utils/react/index.js +1 -0
  89. package/__inner__/esm/components/Calendar/Calendar.js +27 -3
  90. package/__inner__/esm/components/Calendar/CalendarContext.d.ts +8 -1
  91. package/__inner__/esm/components/Calendar/CalendarContext.js +10 -1
  92. package/__inner__/esm/components/Calendar/__tests__/utils.d.ts +11 -0
  93. package/__inner__/esm/components/Calendar/__tests__/utils.js +45 -0
  94. package/__inner__/esm/components/Calendar/components/CalendarGrid/CalendarGrid.js +4 -3
  95. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItem.js +25 -2
  96. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItemContext.d.ts +1 -0
  97. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItemContext.js +1 -0
  98. package/__inner__/esm/components/Calendar/components/CalendarModeRange/CalendarModeRange.js +70 -15
  99. package/__inner__/esm/components/Calendar/components/CalendarModeSingle/CalendarModeSingle.js +64 -18
  100. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/CalendarSwitcher.js +6 -7
  101. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.d.ts +3 -0
  102. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.js +9 -0
  103. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.d.ts +2 -0
  104. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.js +2 -0
  105. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.d.ts +4 -0
  106. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.js +1 -0
  107. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/index.d.ts +1 -0
  108. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/index.js +1 -0
  109. package/__inner__/esm/components/Calendar/constants.d.ts +2 -0
  110. package/__inner__/esm/components/Calendar/constants.js +6 -0
  111. package/__inner__/esm/components/Calendar/index.d.ts +1 -0
  112. package/__inner__/esm/components/Calendar/index.js +1 -0
  113. package/__inner__/esm/components/Calendar/types.d.ts +13 -5
  114. package/__inner__/esm/components/Calendar/utils.d.ts +10 -1
  115. package/__inner__/esm/components/Calendar/utils.js +9 -0
  116. package/__inner__/esm/components/DatePicker/components/DateInput/DateInput.js +3 -2
  117. package/__inner__/esm/components/DatePicker/components/DateInput/types.d.ts +6 -2
  118. package/__inner__/esm/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.d.ts +2 -1
  119. package/__inner__/esm/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.js +67 -7
  120. package/__inner__/esm/components/DatePicker/components/DatePickerModeDate/DatePickerModeDate.js +33 -21
  121. package/__inner__/esm/components/DatePicker/components/DatePickerModeDateRange/DatePickerModeDateRange.js +68 -45
  122. package/__inner__/esm/components/DatePicker/constants.d.ts +2 -0
  123. package/__inner__/esm/components/DatePicker/constants.js +3 -0
  124. package/__inner__/esm/components/DatePicker/types.d.ts +10 -6
  125. package/__inner__/esm/components/DatePicker/types.js +2 -0
  126. package/__inner__/esm/components/DatePicker/utils/formatDateToString/formatDateToString.d.ts +2 -1
  127. package/__inner__/esm/components/DatePicker/utils/formatDateToString/formatDateToString.js +18 -5
  128. package/__inner__/esm/components/DatePicker/utils/formatStringToDate/formatStringToDate.d.ts +2 -1
  129. package/__inner__/esm/components/DatePicker/utils/formatStringToDate/formatStringToDate.js +6 -5
  130. package/__inner__/esm/components/DatePicker/utils/getCommonCalendarProps/getCommonCalendarProps.js +2 -2
  131. package/__inner__/esm/components/DatePicker/utils/index.d.ts +2 -0
  132. package/__inner__/esm/components/DatePicker/utils/index.js +2 -0
  133. package/__inner__/esm/components/DatePicker/utils/isValidDateString/isValidDateString.d.ts +2 -1
  134. package/__inner__/esm/components/DatePicker/utils/isValidDateString/isValidDateString.js +8 -7
  135. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/index.d.ts +1 -0
  136. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/index.js +1 -0
  137. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/maskPastedDate.d.ts +6 -0
  138. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/maskPastedDate.js +39 -0
  139. package/__inner__/esm/components/DatePicker/utils/parseDateString/index.d.ts +1 -0
  140. package/__inner__/esm/components/DatePicker/utils/parseDateString/index.js +1 -0
  141. package/__inner__/esm/components/DatePicker/utils/parseDateString/parseDateString.d.ts +6 -0
  142. package/__inner__/esm/components/DatePicker/utils/parseDateString/parseDateString.js +62 -0
  143. package/__inner__/esm/components/Grid/Grid.d.ts +2 -1
  144. package/__inner__/esm/components/Grid/GridItem.d.ts +2 -1
  145. package/__inner__/esm/components/ListCardItem/hooks/useListCardItemRatio.js +10 -14
  146. package/__inner__/esm/components/SectionMessage/SectionMessage.css +6 -0
  147. package/__inner__/esm/components/SectionMessage/SectionMessage.js +8 -5
  148. package/__inner__/esm/components/SectionMessage/config.d.ts +2 -3
  149. package/__inner__/esm/components/SectionMessage/config.js +6 -21
  150. package/__inner__/esm/components/SectionMessage/constants.d.ts +3 -0
  151. package/__inner__/esm/components/SectionMessage/constants.js +6 -0
  152. package/__inner__/esm/components/SectionMessage/types.d.ts +6 -1
  153. package/__inner__/esm/components/SectionMessage/types.js +1 -0
  154. package/__inner__/esm/components/Stack/Stack.css +3 -0
  155. package/__inner__/esm/components/Stack/Stack.js +3 -2
  156. package/__inner__/esm/components/Stack/constants.d.ts +1 -0
  157. package/__inner__/esm/components/Stack/constants.js +1 -0
  158. package/__inner__/esm/components/Stack/types.d.ts +4 -0
  159. package/__inner__/esm/components/Stack/types.js +1 -0
  160. package/__inner__/esm/hooks/useDevEffect/index.d.ts +1 -0
  161. package/__inner__/esm/hooks/useDevEffect/index.js +1 -0
  162. package/__inner__/esm/hooks/useDevEffect/useDevEffect.d.ts +3 -0
  163. package/__inner__/esm/hooks/useDevEffect/useDevEffect.js +9 -0
  164. package/__inner__/esm/hooks/useIntersectionObserver/index.d.ts +2 -0
  165. package/__inner__/esm/hooks/useIntersectionObserver/index.js +2 -0
  166. package/__inner__/esm/hooks/useIntersectionObserver/types.d.ts +29 -0
  167. package/__inner__/esm/hooks/useIntersectionObserver/types.js +1 -0
  168. package/__inner__/esm/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +6 -0
  169. package/__inner__/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +77 -0
  170. package/__inner__/esm/locale/locale.js +39 -3
  171. package/__inner__/esm/utils/array/createFilled/createFilledArray.d.ts +1 -1
  172. package/__inner__/esm/utils/array/createFilled/createFilledArray.js +6 -1
  173. package/__inner__/esm/utils/react/extractRef.d.ts +2 -0
  174. package/__inner__/esm/utils/react/extractRef.js +7 -0
  175. package/__inner__/esm/utils/react/index.d.ts +1 -0
  176. package/__inner__/esm/utils/react/index.js +1 -0
  177. package/package.json +4 -4
  178. package/useDevEffect/package.json +5 -0
  179. package/useIntersectionObserver/package.json +5 -0
@@ -2,44 +2,47 @@ import { __assign, __read, __rest } from "tslib";
2
2
  import React, { useEffect, useState, forwardRef, useRef } from 'react';
3
3
  import { useControlled } from '../../../../hooks/useControlled';
4
4
  import { useMultiRef } from '../../../../hooks/useMultiRef';
5
+ import { useStoredValue } from '../../../../hooks/useStoredValue';
5
6
  import { isKeys } from '../../../../utils/isKeys';
6
7
  import { Calendar } from '../../../Calendar';
7
8
  import { Popover } from '../../../Popover';
9
+ import { DATE_PICKER_DEFAULT_INITIAL_STEP, DATE_PICKER_DEFAULT_STEPS, } from '../../constants';
8
10
  import { cnDatePicker } from '../../index';
9
- import { formatDateToString, formatStringToDate, getCommonCalendarProps, getCommonPopoverProps, isInExclude, isValidDateString, isOutOfRange, useCalendarKeyboard, } from '../../utils';
11
+ import { maskPastedDate, formatDateToString, formatStringToDate, getCommonCalendarProps, getCommonPopoverProps, isInExclude, isValidDateString, isOutOfRange, useCalendarKeyboard, } from '../../utils';
10
12
  import { DateInput, DatePickerRenderRight } from '../index';
11
13
  export var DatePickerModeDate = forwardRef(function (props, ref) {
12
- var size = props.size, valueProp = props.value, label = props.label, defaultValue = props.defaultValue, openProp = props.open, onCloseProp = props.onClose, onOpenProp = props.onOpen, onInputChange = props.onInputChange, clearText = props.clearText, defaultOpen = props.defaultOpen, disabled = props.disabled, minDate = props.minDate, maxDate = props.maxDate, exclude = props.exclude, inputProps = props.inputProps, renderRight = props.renderRight, className = props.className, _a = props.calendars, calendars = _a === void 0 ? 1 : _a, disableClearButton = props.disableClearButton, onChange = props.onChange, onKeyDown = props.onKeyDown, autoFocus = props.autoFocus, disableCloseOnSelect = props.disableCloseOnSelect, popoverPropsProp = props.popoverProps, calendarPropsProp = props.calendarProps, onError = props.onError, other = __rest(props, ["size", "value", "label", "defaultValue", "open", "onClose", "onOpen", "onInputChange", "clearText", "defaultOpen", "disabled", "minDate", "maxDate", "exclude", "inputProps", "renderRight", "className", "calendars", "disableClearButton", "onChange", "onKeyDown", "autoFocus", "disableCloseOnSelect", "popoverProps", "calendarProps", "onError"]);
14
+ var size = props.size, valueProp = props.value, label = props.label, defaultValue = props.defaultValue, openProp = props.open, onCloseProp = props.onClose, onOpenProp = props.onOpen, onInputChange = props.onInputChange, clearText = props.clearText, defaultOpen = props.defaultOpen, disabled = props.disabled, minDate = props.minDate, maxDate = props.maxDate, exclude = props.exclude, inputProps = props.inputProps, renderRight = props.renderRight, className = props.className, _a = props.calendars, calendars = _a === void 0 ? 1 : _a, disableClearButton = props.disableClearButton, onChange = props.onChange, onKeyDown = props.onKeyDown, autoFocus = props.autoFocus, disableCloseOnSelect = props.disableCloseOnSelect, popoverPropsProp = props.popoverProps, calendarPropsProp = props.calendarProps, onError = props.onError, _b = props.steps, steps = _b === void 0 ? DATE_PICKER_DEFAULT_STEPS : _b, _c = props.initialStep, initialStep = _c === void 0 ? DATE_PICKER_DEFAULT_INITIAL_STEP : _c, other = __rest(props, ["size", "value", "label", "defaultValue", "open", "onClose", "onOpen", "onInputChange", "clearText", "defaultOpen", "disabled", "minDate", "maxDate", "exclude", "inputProps", "renderRight", "className", "calendars", "disableClearButton", "onChange", "onKeyDown", "autoFocus", "disableCloseOnSelect", "popoverProps", "calendarProps", "onError", "steps", "initialStep"]);
13
15
  var anchorRef = useRef(null);
14
16
  var calendarInnerRef = useRef(null);
15
17
  var calendarRef = useMultiRef([calendarInnerRef, calendarPropsProp === null || calendarPropsProp === void 0 ? void 0 : calendarPropsProp.ref]);
16
18
  var lastValidDate = useRef('');
17
- var _b = __read(useState(null), 2), offsetDate = _b[0], setOffsetDate = _b[1];
18
- var _c = __read(useControlled({
19
+ var _d = __read(useState(null), 2), offsetDate = _d[0], setOffsetDate = _d[1];
20
+ var isWasPaste = useStoredValue(false);
21
+ var _e = __read(useControlled({
19
22
  value: undefined,
20
23
  defaultValue: '',
21
24
  name: 'DatePicker',
22
25
  state: 'inputValue',
23
- }), 2), inputValue = _c[0], setInputValue = _c[1];
24
- var _d = __read(useControlled({
26
+ }), 2), inputValue = _e[0], setInputValue = _e[1];
27
+ var _f = __read(useControlled({
25
28
  value: openProp,
26
29
  defaultValue: defaultOpen,
27
30
  name: 'DatePicker',
28
31
  state: 'open',
29
- }), 2), open = _d[0], setOpen = _d[1];
30
- var _e = __read(useControlled({
32
+ }), 2), open = _f[0], setOpen = _f[1];
33
+ var _g = __read(useControlled({
31
34
  value: valueProp,
32
35
  defaultValue: defaultValue,
33
36
  name: 'DatePicker',
34
37
  state: 'value',
35
- }), 2), value = _e[0], setValue = _e[1];
38
+ }), 2), value = _g[0], setValue = _g[1];
36
39
  var popoverProps = getCommonPopoverProps(__assign(__assign({}, props), { popoverProps: popoverPropsProp }));
37
40
  var calendarProps = getCommonCalendarProps(__assign(__assign({}, props), { calendarProps: calendarPropsProp, ref: calendarRef }));
38
41
  var onOffsetDateChange = function (date) {
39
42
  setOffsetDate(date);
40
43
  };
41
44
  var callOnChange = function (value) {
42
- var formattedDate = formatStringToDate(value);
45
+ var formattedDate = formatStringToDate(value, steps);
43
46
  setValue(formattedDate);
44
47
  onChange === null || onChange === void 0 ? void 0 : onChange(formattedDate);
45
48
  lastValidDate.current = value;
@@ -47,9 +50,9 @@ export var DatePickerModeDate = forwardRef(function (props, ref) {
47
50
  var changeInputValue = function (e, value) {
48
51
  setInputValue(value);
49
52
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(e, value);
50
- if (isValidDateString(value)) {
53
+ if (isValidDateString(value, steps)) {
51
54
  callOnChange(value);
52
- onOffsetDateChange(formatStringToDate(value));
55
+ onOffsetDateChange(formatStringToDate(value, steps));
53
56
  }
54
57
  };
55
58
  var handleExited = function () {
@@ -71,7 +74,7 @@ export var DatePickerModeDate = forwardRef(function (props, ref) {
71
74
  }, [autoFocus]);
72
75
  /** Эффект — синхронизируем значение текстового поля со значением в списке */
73
76
  useEffect(function () {
74
- var formattedDate = formatDateToString(value);
77
+ var formattedDate = formatDateToString(value, steps);
75
78
  if (formattedDate !== inputValue) {
76
79
  setInputValue(formattedDate);
77
80
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(null, formattedDate);
@@ -127,7 +130,7 @@ export var DatePickerModeDate = forwardRef(function (props, ref) {
127
130
  (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(inputProps, e);
128
131
  if (!inputValue)
129
132
  return;
130
- if (!isValidDateString(inputValue))
133
+ if (!isValidDateString(inputValue, steps))
131
134
  changeInputValue(null, lastValidDate.current);
132
135
  };
133
136
  /** Очистка поля */
@@ -135,22 +138,31 @@ export var DatePickerModeDate = forwardRef(function (props, ref) {
135
138
  changeInputValue(null, '');
136
139
  };
137
140
  /** Событие ввода значения в текстовом поле */
138
- var handleChangeInput = function (e) {
141
+ var handleChangeInput = function (event) {
142
+ var _a;
143
+ var value = event.target.value.trim();
144
+ var preparedValue = isWasPaste.current
145
+ ? maskPastedDate(value, steps)
146
+ : value;
147
+ changeInputValue(event, preparedValue);
148
+ (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onChange) === null || _a === void 0 ? void 0 : _a.call(inputProps, event);
149
+ isWasPaste.current = false;
150
+ };
151
+ var handlePasteInput = function (event) {
139
152
  var _a;
140
- var value = e.target.value;
141
- changeInputValue(e, value);
142
- (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onChange) === null || _a === void 0 ? void 0 : _a.call(inputProps, e);
153
+ isWasPaste.current = true;
154
+ (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onPaste) === null || _a === void 0 ? void 0 : _a.call(inputProps, event);
143
155
  };
144
156
  /** Событие выбора значения из календаря */
145
157
  var handleChangeCalendar = function (date) {
146
- var formattedDate = formatDateToString(date);
158
+ var formattedDate = formatDateToString(date, steps);
147
159
  changeInputValue(null, formattedDate);
148
160
  if (!disableCloseOnSelect)
149
161
  handleClose();
150
162
  };
151
163
  return (React.createElement(React.Fragment, null,
152
- React.createElement(DateInput, __assign({ size: size, disabled: disabled, label: label }, other, { className: cnDatePicker({ mode: 'date' }, className), renderRight: React.createElement(DatePickerRenderRight, { size: size, open: open, onClear: handleClear, clearText: clearText, hasValue: !!value, renderRight: renderRight, disableClearButton: disableClearButton }), value: inputValue, inputProps: __assign(__assign({ autoComplete: 'off' }, inputProps), { onBlur: handleBlur, onClick: handleClickOnInput, onChange: handleChangeInput }), bodyProps: { ref: anchorRef, 'aria-expanded': open }, onKeyDown: handleKeyDown, ref: ref })),
164
+ React.createElement(DateInput, __assign({ size: size, disabled: disabled, label: label }, other, { steps: steps, className: cnDatePicker({ mode: 'date' }, className), renderRight: React.createElement(DatePickerRenderRight, { size: size, open: open, onClear: handleClear, clearText: clearText, hasValue: !!value, renderRight: renderRight, disableClearButton: disableClearButton }), value: inputValue, inputProps: __assign(__assign({ autoComplete: 'off' }, inputProps), { onBlur: handleBlur, onClick: handleClickOnInput, onChange: handleChangeInput, onPaste: handlePasteInput }), bodyProps: { ref: anchorRef, 'aria-expanded': open }, onKeyDown: handleKeyDown, ref: ref })),
153
165
  React.createElement(Popover, __assign({ open: open, anchorRef: anchorRef, onClose: handleClose }, popoverProps, { disableEnforceFocus: !enableEnforceFocus, onExited: handleExited }),
154
- React.createElement(Calendar, __assign({ calendars: calendars }, calendarProps, { mode: "single", value: value || null, offsetDate: offsetDate, onOffsetDateChange: onOffsetDateChange, onChange: handleChangeCalendar })))));
166
+ React.createElement(Calendar, __assign({ calendars: calendars }, calendarProps, { steps: steps, initialStep: initialStep, mode: "single", value: value || null, offsetDate: offsetDate, onOffsetDateChange: onOffsetDateChange, onChange: handleChangeCalendar })))));
155
167
  });
156
168
  DatePickerModeDate.displayName = 'DatePickerModeDate';
@@ -5,13 +5,15 @@ import { useBoolean } from '../../../../hooks/useBoolean';
5
5
  import { useControlled } from '../../../../hooks/useControlled';
6
6
  import { useMultiRef } from '../../../../hooks/useMultiRef';
7
7
  import { useMutableRef } from '../../../../hooks/useMutableRef';
8
- import { isKeys } from '../../../../utils/isKeys';
8
+ import { useStoredValue } from '../../../../hooks/useStoredValue';
9
+ import { isKeys } from '../../../../utils';
9
10
  import { Calendar } from '../../../Calendar';
10
11
  import { FieldHint } from '../../../FieldHint';
11
12
  import { Popover } from '../../../Popover';
12
13
  import { Stack } from '../../../Stack';
14
+ import { DATE_PICKER_DEFAULT_INITIAL_STEP, DATE_PICKER_DEFAULT_STEPS, } from '../../constants';
13
15
  import { cnDatePicker } from '../../index';
14
- import { formatDateToString, formatStringToDate, getCommonCalendarProps, getCommonPopoverProps, isValidDateString, useCalendarKeyboard, } from '../../utils';
16
+ import { maskPastedDate, formatDateToString, formatStringToDate, getCommonCalendarProps, getCommonPopoverProps, isValidDateString, useCalendarKeyboard, } from '../../utils';
15
17
  import { DateInput, DatePickerRenderRight } from '../index';
16
18
  import { formatDateForCalendar, getOffsetDateInRange, getValueForDoubleProp, } from './utils';
17
19
  export var DatePickerModeDateRange = forwardRef(function (props, ref) {
@@ -19,13 +21,14 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
19
21
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
20
22
  minDate = props.minDate,
21
23
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
22
- maxDate = props.maxDate, other = __rest(props, ["size", "error", "open", "label", "onKeyDown", "onInputChange", "renderLeft", "renderRight", "required", "fullWidth", "placeholder", "hint", "disableStroke", "hintProps", "onChange", "labelProps", "popoverProps", "calendarProps", "defaultOpen", "onClose", "defaultValue", "value", "inputProps", "disabled", "className", "calendars", "onError", "clearText", "disableCloseOnSelect", "disableClearButton", "onOpen", "fieldsProps", "minDate", "maxDate"]);
23
- var _b = __read(getValueForDoubleProp(label), 2), labelFrom = _b[0], labelTo = _b[1];
24
- var _c = __read(getValueForDoubleProp(renderLeft), 2), renderLeftFrom = _c[0], renderLeftTo = _c[1];
25
- var _d = __read(getValueForDoubleProp(renderRight), 2), renderRightFrom = _d[0], renderRightTo = _d[1];
26
- var _e = __read(getValueForDoubleProp(placeholder), 2), placeholderFrom = _e[0], placeholderTo = _e[1];
27
- var _f = __read(getValueForDoubleProp(inputProps), 2), inputPropsFrom = _f[0], inputPropsTo = _f[1];
28
- var _g = __read(getValueForDoubleProp(labelProps), 2), labelPropsFrom = _g[0], labelPropsTo = _g[1];
24
+ maxDate = props.maxDate, _b = props.steps, steps = _b === void 0 ? DATE_PICKER_DEFAULT_STEPS : _b, _c = props.initialStep, initialStep = _c === void 0 ? DATE_PICKER_DEFAULT_INITIAL_STEP : _c, other = __rest(props, ["size", "error", "open", "label", "onKeyDown", "onInputChange", "renderLeft", "renderRight", "required", "fullWidth", "placeholder", "hint", "disableStroke", "hintProps", "onChange", "labelProps", "popoverProps", "calendarProps", "defaultOpen", "onClose", "defaultValue", "value", "inputProps", "disabled", "className", "calendars", "onError", "clearText", "disableCloseOnSelect", "disableClearButton", "onOpen", "fieldsProps", "minDate", "maxDate", "steps", "initialStep"]);
25
+ var _d = __read(getValueForDoubleProp(label), 2), labelFrom = _d[0], labelTo = _d[1];
26
+ var _e = __read(getValueForDoubleProp(renderLeft), 2), renderLeftFrom = _e[0], renderLeftTo = _e[1];
27
+ var _f = __read(getValueForDoubleProp(renderRight), 2), renderRightFrom = _f[0], renderRightTo = _f[1];
28
+ var _g = __read(getValueForDoubleProp(placeholder), 2), placeholderFrom = _g[0], placeholderTo = _g[1];
29
+ var _h = __read(getValueForDoubleProp(inputProps), 2), inputPropsFrom = _h[0], inputPropsTo = _h[1];
30
+ var _j = __read(getValueForDoubleProp(labelProps), 2), labelPropsFrom = _j[0], labelPropsTo = _j[1];
31
+ var isWasPaste = useStoredValue(false);
29
32
  var containerRef = useRef(null);
30
33
  var anchorRef = useRef(null);
31
34
  var calendarInnerRef = useRef(null);
@@ -33,32 +36,32 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
33
36
  var calendarRef = useMultiRef([calendarInnerRef, calendarPropsProp === null || calendarPropsProp === void 0 ? void 0 : calendarPropsProp.ref]);
34
37
  var fieldsRef = useMultiRef([anchorRef, fieldsProps === null || fieldsProps === void 0 ? void 0 : fieldsProps.ref]);
35
38
  var rootRef = useMultiRef([ref, containerRef]);
36
- var _h = __read(useState(null), 2), offsetDate = _h[0], setOffsetDate = _h[1];
37
- var _j = __read(useState(null), 2), calendarPeriod = _j[0], setCalendarPeriod = _j[1];
39
+ var _k = __read(useState(null), 2), offsetDate = _k[0], setOffsetDate = _k[1];
40
+ var _l = __read(useState(null), 2), calendarPeriod = _l[0], setCalendarPeriod = _l[1];
38
41
  var savedCalendarPeriod = useMutableRef(calendarPeriod);
39
42
  var lastValidDate = useRef(['', '']);
40
- var _k = __read(useBoolean(false), 2), focusInputFrom = _k[0], setFocusInputFrom = _k[1];
41
- var _l = __read(useBoolean(false), 2), focusInputTo = _l[0], setFocusInputTo = _l[1];
42
- var _m = __read(useControlled({
43
+ var _m = __read(useBoolean(false), 2), focusInputFrom = _m[0], setFocusInputFrom = _m[1];
44
+ var _o = __read(useBoolean(false), 2), focusInputTo = _o[0], setFocusInputTo = _o[1];
45
+ var _p = __read(useControlled({
43
46
  value: valueProp,
44
47
  defaultValue: defaultValue,
45
48
  name: 'DatePicker',
46
49
  state: 'value',
47
- }), 2), value = _m[0], setValue = _m[1];
48
- var _o = __read(useControlled({
50
+ }), 2), value = _p[0], setValue = _p[1];
51
+ var _q = __read(useControlled({
49
52
  value: undefined,
50
53
  defaultValue: [],
51
54
  name: 'DatePicker',
52
55
  state: 'inputValue',
53
- }), 2), inputValue = _o[0], setInputValue = _o[1];
54
- var _p = __read(value || [], 2), valueFrom = _p[0], valueTo = _p[1];
55
- var _q = __read(inputValue || [], 2), _r = _q[0], inputValueFrom = _r === void 0 ? '' : _r, _s = _q[1], inputValueTo = _s === void 0 ? '' : _s;
56
- var _t = __read(useControlled({
56
+ }), 2), inputValue = _q[0], setInputValue = _q[1];
57
+ var _r = __read(value || [], 2), valueFrom = _r[0], valueTo = _r[1];
58
+ var _s = __read(inputValue || [], 2), _t = _s[0], inputValueFrom = _t === void 0 ? '' : _t, _u = _s[1], inputValueTo = _u === void 0 ? '' : _u;
59
+ var _v = __read(useControlled({
57
60
  value: openProp,
58
61
  defaultValue: defaultOpen,
59
62
  name: 'DatePicker',
60
63
  state: 'open',
61
- }), 2), open = _t[0], setOpen = _t[1];
64
+ }), 2), open = _v[0], setOpen = _v[1];
62
65
  var popoverProps = getCommonPopoverProps(__assign(__assign({}, props), { popoverProps: popoverPropsProp }));
63
66
  var calendarProps = getCommonCalendarProps(__assign(__assign({}, props), { calendarProps: calendarPropsProp, ref: calendarRef }));
64
67
  var onOffsetDateChange = function (date) {
@@ -76,8 +79,8 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
76
79
  var disableEnforceFocus = !enableEnforceFocusTo;
77
80
  /** Эффект — синхронизируем значение текстового поля со значением в списке */
78
81
  useEffect(function () {
79
- var formattedDateFrom = formatDateToString(valueFrom);
80
- var formattedDateTo = formatDateToString(valueTo);
82
+ var formattedDateFrom = formatDateToString(valueFrom, steps);
83
+ var formattedDateTo = formatDateToString(valueTo, steps);
81
84
  if (formattedDateFrom !== inputValueFrom ||
82
85
  formattedDateTo !== inputValueTo) {
83
86
  setInputValue([formattedDateFrom, formattedDateTo]);
@@ -93,13 +96,13 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
93
96
  }, [onError]);
94
97
  /** Calendar offset when interacting with inputs */
95
98
  useEffect(function () {
96
- if (!isValidDateString(inputValueFrom) ||
97
- !isValidDateString(inputValueTo) ||
99
+ if (!isValidDateString(inputValueFrom, steps) ||
100
+ !isValidDateString(inputValueTo, steps) ||
98
101
  !savedCalendarPeriod.current)
99
102
  return;
100
103
  if ((focusInputFrom || focusInputTo) && open && (calendarPeriod === null || calendarPeriod === void 0 ? void 0 : calendarPeriod.length)) {
101
- var firstDate = formatStringToDate(inputValueFrom);
102
- var secondDate = formatStringToDate(inputValueTo);
104
+ var firstDate = formatStringToDate(inputValueFrom, steps);
105
+ var secondDate = formatStringToDate(inputValueTo, steps);
103
106
  var offset = getOffsetDateInRange(__assign(__assign({}, (focusInputTo && { type: 'end' })), { calendarPeriod: savedCalendarPeriod.current, value: [firstDate || undefined, secondDate || undefined] }));
104
107
  setOffsetDate(offset);
105
108
  }
@@ -125,8 +128,8 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
125
128
  };
126
129
  var callOnChange = function (value) {
127
130
  var _a = __read(value || [], 2), dateFrom = _a[0], dateTo = _a[1];
128
- var formattedDateFrom = formatStringToDate(dateFrom) || undefined;
129
- var formattedDateTo = formatStringToDate(dateTo) || undefined;
131
+ var formattedDateFrom = formatStringToDate(dateFrom, steps) || undefined;
132
+ var formattedDateTo = formatStringToDate(dateTo, steps) || undefined;
130
133
  if (formattedDateTo &&
131
134
  formattedDateFrom &&
132
135
  (formattedDateFrom === null || formattedDateFrom === void 0 ? void 0 : formattedDateFrom.getTime()) > (formattedDateTo === null || formattedDateTo === void 0 ? void 0 : formattedDateTo.getTime())) {
@@ -141,7 +144,8 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
141
144
  setInputValue(value);
142
145
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(e, value);
143
146
  var _a = __read(value || [], 2), valueFrom = _a[0], valueTo = _a[1];
144
- if (isValidDateString(valueFrom) && isValidDateString(valueTo))
147
+ if (isValidDateString(valueFrom, steps) &&
148
+ isValidDateString(valueTo, steps))
145
149
  callOnChange([valueFrom, valueTo]);
146
150
  };
147
151
  var handleExited = function () {
@@ -150,12 +154,20 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
150
154
  setCalendarPeriod(null);
151
155
  (_a = popoverProps === null || popoverProps === void 0 ? void 0 : popoverProps.onExited) === null || _a === void 0 ? void 0 : _a.call(popoverProps);
152
156
  };
157
+ var prepareInputValue = function (value) {
158
+ var trimmed = value.trim();
159
+ if (isWasPaste.current) {
160
+ return maskPastedDate(trimmed, steps);
161
+ }
162
+ return trimmed;
163
+ };
153
164
  /** Событие ввода значения в текстовом поле */
154
- var handleChangeInputFrom = function (e) {
165
+ var handleChangeInputFrom = function (event) {
155
166
  var _a;
156
- var value = e.target.value;
157
- (_a = inputPropsFrom === null || inputPropsFrom === void 0 ? void 0 : inputPropsFrom.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsFrom, e);
158
- changeInputValue(e, [value, inputValueTo]);
167
+ var value = prepareInputValue(event.target.value);
168
+ (_a = inputPropsFrom === null || inputPropsFrom === void 0 ? void 0 : inputPropsFrom.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsFrom, event);
169
+ changeInputValue(event, [value, inputValueTo]);
170
+ isWasPaste.current = false;
159
171
  };
160
172
  /** Очистка поля */
161
173
  var handleClear = function (type) { return function () {
@@ -177,7 +189,7 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
177
189
  setFocusInputFrom.off();
178
190
  if (!inputValue)
179
191
  return;
180
- if (!isValidDateString(inputValueFrom)) {
192
+ if (!isValidDateString(inputValueFrom, steps)) {
181
193
  changeInputValue(null, lastValidDate.current);
182
194
  }
183
195
  };
@@ -187,15 +199,26 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
187
199
  setFocusInputTo.off();
188
200
  if (!inputValue)
189
201
  return;
190
- if (!isValidDateString(inputValueTo))
202
+ if (!isValidDateString(inputValueTo, steps))
191
203
  changeInputValue(null, lastValidDate.current);
192
204
  };
193
205
  /** Событие ввода значения в текстовом поле */
194
- var handleChangeInputTo = function (e) {
206
+ var handleChangeInputTo = function (event) {
207
+ var _a;
208
+ var value = prepareInputValue(event.target.value);
209
+ (_a = inputPropsTo === null || inputPropsTo === void 0 ? void 0 : inputPropsTo.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsTo, event);
210
+ changeInputValue(event, [inputValueFrom, value]);
211
+ isWasPaste.current = false;
212
+ };
213
+ var handlePasteInputFrom = function (event) {
214
+ var _a;
215
+ isWasPaste.current = true;
216
+ (_a = inputPropsFrom === null || inputPropsFrom === void 0 ? void 0 : inputPropsFrom.onPaste) === null || _a === void 0 ? void 0 : _a.call(inputPropsFrom, event);
217
+ };
218
+ var handlePasteInputTo = function (event) {
195
219
  var _a;
196
- var value = e.target.value;
197
- (_a = inputPropsTo === null || inputPropsTo === void 0 ? void 0 : inputPropsTo.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsTo, e);
198
- changeInputValue(e, [inputValueFrom, value]);
220
+ isWasPaste.current = true;
221
+ (_a = inputPropsTo === null || inputPropsTo === void 0 ? void 0 : inputPropsTo.onPaste) === null || _a === void 0 ? void 0 : _a.call(inputPropsTo, event);
199
222
  };
200
223
  /** Открытие списка по клику на текстовом поле */
201
224
  var handleClickOnInputFrom = function (e) {
@@ -221,8 +244,8 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
221
244
  var handleChangeCalendar = function (date) {
222
245
  var _a = __read(date || [], 2), dateFrom = _a[0], dateTo = _a[1];
223
246
  var formattedDate = [
224
- formatDateToString(dateFrom),
225
- formatDateToString(dateTo),
247
+ formatDateToString(dateFrom, steps),
248
+ formatDateToString(dateTo, steps),
226
249
  ];
227
250
  changeInputValue(null, formattedDate);
228
251
  if (!disableCloseOnSelect && dateFrom && dateTo)
@@ -238,10 +261,10 @@ export var DatePickerModeDateRange = forwardRef(function (props, ref) {
238
261
  disableStroke: disableStroke,
239
262
  }, [className]) }, other, { ref: rootRef }),
240
263
  React.createElement(Stack, __assign({ gap: "l", className: cnDatePicker('Fields', [fieldsProps === null || fieldsProps === void 0 ? void 0 : fieldsProps.className]) }, fieldsProps, { ref: fieldsRef }),
241
- React.createElement(DateInput, { size: size, error: error, label: labelFrom, required: required, disabled: disabled, value: inputValueFrom, onKeyDown: handleKeyDown, renderLeft: renderLeftFrom, labelProps: labelPropsFrom, disableStroke: disableStroke, placeholder: placeholderFrom, renderRight: React.createElement(DatePickerRenderRight, { size: size, open: open, hasValue: !!valueFrom, clearText: clearText, renderRight: renderRightFrom, onClear: handleClear('from'), disableClearButton: disableClearButton }), inputProps: __assign(__assign({ autoComplete: 'off' }, inputPropsFrom), { onBlur: handleBlurInputFrom, onFocus: handleFocusInputFrom, onClick: handleClickOnInputFrom, onChange: handleChangeInputFrom }), "data-testid": "date-input-from", bodyProps: { 'aria-expanded': open } }),
242
- React.createElement(DateInput, { size: size, error: error, label: labelTo, required: required, disabled: disabled, value: inputValueTo, onKeyDown: handleKeyDown, renderLeft: renderLeftTo, labelProps: labelPropsTo, placeholder: placeholderTo, disableStroke: disableStroke, renderRight: React.createElement(DatePickerRenderRight, { size: size, open: open, hasValue: !!valueTo, clearText: clearText, renderRight: renderRightTo, onClear: handleClear('to'), disableClearButton: disableClearButton }), inputProps: __assign(__assign({ autoComplete: 'off' }, inputPropsTo), { onBlur: handleBlurInputTo, onFocus: handleFocusInputTo, onClick: handleClickOnInputTo, onChange: handleChangeInputTo }), "data-testid": "date-input-to", bodyProps: { ref: dateInputToRef, 'aria-expanded': open } })),
264
+ React.createElement(DateInput, { size: size, error: error, label: labelFrom, required: required, disabled: disabled, value: inputValueFrom, onKeyDown: handleKeyDown, renderLeft: renderLeftFrom, labelProps: labelPropsFrom, disableStroke: disableStroke, steps: steps, placeholder: placeholderFrom, renderRight: React.createElement(DatePickerRenderRight, { size: size, open: open, hasValue: !!valueFrom, clearText: clearText, renderRight: renderRightFrom, onClear: handleClear('from'), disableClearButton: disableClearButton }), inputProps: __assign(__assign({ autoComplete: 'off' }, inputPropsFrom), { onBlur: handleBlurInputFrom, onFocus: handleFocusInputFrom, onClick: handleClickOnInputFrom, onChange: handleChangeInputFrom, onPaste: handlePasteInputFrom }), "data-testid": "date-input-from", bodyProps: { 'aria-expanded': open } }),
265
+ React.createElement(DateInput, { size: size, error: error, label: labelTo, required: required, disabled: disabled, value: inputValueTo, onKeyDown: handleKeyDown, renderLeft: renderLeftTo, labelProps: labelPropsTo, placeholder: placeholderTo, disableStroke: disableStroke, steps: steps, renderRight: React.createElement(DatePickerRenderRight, { size: size, open: open, hasValue: !!valueTo, clearText: clearText, renderRight: renderRightTo, onClear: handleClear('to'), disableClearButton: disableClearButton }), inputProps: __assign(__assign({ autoComplete: 'off' }, inputPropsTo), { onBlur: handleBlurInputTo, onFocus: handleFocusInputTo, onClick: handleClickOnInputTo, onChange: handleChangeInputTo, onPaste: handlePasteInputTo }), "data-testid": "date-input-to", bodyProps: { ref: dateInputToRef, 'aria-expanded': open } })),
243
266
  React.createElement(FieldHint, __assign({ size: size, error: error, disabled: disabled }, hintProps), hint),
244
267
  React.createElement(Popover, __assign({ open: open, anchorRef: anchorRef, onClose: handleClose }, popoverProps, { onExited: handleExited, ignoreClickOutsideRefs: [containerRef], disableEnforceFocus: disableEnforceFocus }),
245
- React.createElement(Calendar, __assign({ calendars: calendars }, calendarProps, { mode: "range", offsetDate: offsetDate, onChange: handleChangeCalendar, value: formatDateForCalendar(value), onCalendarsChange: onCalendarsChange, onOffsetDateChange: onOffsetDateChange })))));
268
+ React.createElement(Calendar, __assign({ calendars: calendars }, calendarProps, { initialStep: initialStep, steps: steps, mode: "range", offsetDate: offsetDate, onChange: handleChangeCalendar, value: formatDateForCalendar(value), onCalendarsChange: onCalendarsChange, onOffsetDateChange: onOffsetDateChange })))));
246
269
  });
247
270
  DatePickerModeDateRange.displayName = 'DatePickerModeDateRange';
@@ -1,2 +1,4 @@
1
1
  export declare const DATE_PICKER_DEFAULT_SIZE = "m";
2
2
  export declare const DATE_PICKER_DEFAULT_MODE = "date";
3
+ export declare const DATE_PICKER_DEFAULT_STEPS: ("days" | "months" | "years")[];
4
+ export declare const DATE_PICKER_DEFAULT_INITIAL_STEP = "days";
@@ -1,2 +1,5 @@
1
+ import { CALENDAR_DEFAULT_INITIAL_STEP, CALENDAR_DEFAULT_STEPS, } from '../Calendar';
1
2
  export var DATE_PICKER_DEFAULT_SIZE = 'm';
2
3
  export var DATE_PICKER_DEFAULT_MODE = 'date';
4
+ export var DATE_PICKER_DEFAULT_STEPS = CALENDAR_DEFAULT_STEPS;
5
+ export var DATE_PICKER_DEFAULT_INITIAL_STEP = CALENDAR_DEFAULT_INITIAL_STEP;
@@ -1,11 +1,11 @@
1
1
  import type { ChangeEvent, ComponentRef, ReactNode } from 'react';
2
2
  import type { ExtendableComponentPropsWithRef } from '../../types/ExtendableComponentPropsWithRef';
3
3
  import type { WithDisplayName } from '../../types/react';
4
- import type { CalendarProps } from '../Calendar';
4
+ import type { CalendarPropCalendars, CalendarProps, CalendarSteps } from '../Calendar';
5
5
  import type { FieldHintProps } from '../FieldHint';
6
6
  import type { FieldInputProps } from '../FieldInput';
7
7
  import type { FieldLabelProps } from '../FieldLabel';
8
- import type { InputProps, InputSizeVariant } from '../Input';
8
+ import type { InputProps } from '../Input';
9
9
  import type { PopoverBaseProps } from '../Popover';
10
10
  import type { StackProps } from '../Stack';
11
11
  import type { DATE_PICKER_DEFAULT_MODE } from './constants';
@@ -19,7 +19,11 @@ export type DatePickerPropOnChange<MODE extends DatePickerModeVariant> = (date:
19
19
  type InputPropLabel = InputProps['label'];
20
20
  type InputPropRenderLeft = InputProps['renderLeft'];
21
21
  type InputPropRenderRight = InputProps['renderRight'];
22
- type InputPropPlaceholder = InputProps['placeholder'];
22
+ type InputPropPlaceholderString = InputProps['placeholder'];
23
+ type InputPropPlaceholderFunction = (steps: CalendarSteps) => InputPropPlaceholderString;
24
+ export type InputPropPlaceholder = InputPropPlaceholderString | InputPropPlaceholderFunction;
25
+ export declare const datePickerSizeVariant: readonly ["2xs", "xs", "s", "m", "l"];
26
+ export type DatePickerSizeVariant = (typeof datePickerSizeVariant)[number];
23
27
  export type DatePickerPropLabel<MODE> = MODE extends Range ? [InputPropLabel?, InputPropLabel?] | InputPropLabel : InputPropLabel;
24
28
  export type DatePickerPropRenderLeft<MODE> = MODE extends Range ? [InputPropRenderLeft?, InputPropRenderLeft?] | InputPropRenderLeft : InputPropRenderLeft;
25
29
  export type DatePickerPropRenderRight<MODE> = MODE extends Range ? [InputPropRenderRight?, InputPropRenderRight?] | InputPropRenderRight : InputPropRenderRight;
@@ -96,7 +100,7 @@ export type DatePickerProps<MODE extends DatePickerModeVariant = typeof DATE_PIC
96
100
  /** Cвойства FieldHint */
97
101
  hintProps?: Omit<FieldHintProps, 'children'>;
98
102
  /** Размер компонента */
99
- size?: InputSizeVariant;
103
+ size?: DatePickerSizeVariant;
100
104
  /** Если `true` растягивает поле на всю ширину */
101
105
  fullWidth?: boolean;
102
106
  /** Если `true` делает элемент обязательным к заполнению */
@@ -108,8 +112,8 @@ export type DatePickerProps<MODE extends DatePickerModeVariant = typeof DATE_PIC
108
112
  /** Свойства обертки для текстовых полей. Принимает свойства компонента [Stack](https://ozen-ui.bereke.tech/?path=/docs/components-stack--docs) */
109
113
  fieldsProps?: DatePickerPropFieldsProps<MODE>;
110
114
  /** Количество отображаемых календарей в компоненте: один или два */
111
- calendars?: 1 | 2;
112
- } & Pick<CalendarProps, 'minDate' | 'maxDate' | 'exclude'> & Pick<InputProps, 'onKeyDown'>, 'div'>;
115
+ calendars?: CalendarPropCalendars;
116
+ } & Pick<CalendarProps, 'minDate' | 'maxDate' | 'exclude' | 'steps' | 'initialStep'> & Pick<InputProps, 'onKeyDown'>, 'div'>;
113
117
  export type DatePickerComponent = WithDisplayName<(<MODE extends DatePickerModeVariant = typeof DATE_PICKER_DEFAULT_MODE>(props: DatePickerProps<MODE>) => ReactNode)>;
114
118
  export type DatePickerModeComponent<MODE extends DatePickerModeVariant> = WithDisplayName<(props: Omit<DatePickerProps<MODE>, 'mode'>) => ReactNode>;
115
119
  export {};
@@ -1 +1,3 @@
1
+ import { formElementSizeVariant } from '../../types';
1
2
  export var datePickerModeVariant = ['date', 'date-range'];
3
+ export var datePickerSizeVariant = formElementSizeVariant;
@@ -1 +1,2 @@
1
- export declare const formatDateToString: (date: Date | undefined | null) => string;
1
+ import type { CalendarSteps } from '../../../Calendar';
2
+ export declare const formatDateToString: (date: Date | undefined | null, steps: CalendarSteps) => string;
@@ -1,9 +1,22 @@
1
- export var formatDateToString = function (date) {
1
+ export var formatDateToString = function (date, steps) {
2
2
  if (!date) {
3
3
  return '';
4
4
  }
5
- var year = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(date);
6
- var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
7
- var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
8
- return "".concat(day, ".").concat(month, ".").concat(year);
5
+ var hasYearsStep = steps.includes('years');
6
+ var hasMonthsStep = steps.includes('months');
7
+ var hasDaysStep = steps.includes('days');
8
+ var parts = [];
9
+ if (hasDaysStep) {
10
+ var day = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(date);
11
+ parts.push(day);
12
+ }
13
+ if (hasMonthsStep) {
14
+ var month = new Intl.DateTimeFormat('en', { month: '2-digit' }).format(date);
15
+ parts.push(month);
16
+ }
17
+ if (hasYearsStep) {
18
+ var year = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(date);
19
+ parts.push(year);
20
+ }
21
+ return parts.join('.');
9
22
  };
@@ -1 +1,2 @@
1
- export declare const formatStringToDate: (value: string) => Date | null;
1
+ import type { CalendarSteps } from '../../../Calendar';
2
+ export declare const formatStringToDate: (value: string, steps: CalendarSteps) => Date | null;
@@ -1,8 +1,9 @@
1
- import { __read } from "tslib";
2
- export var formatStringToDate = function (value) {
3
- var _a = __read(value.split('.'), 3), date = _a[0], month = _a[1], year = _a[2];
4
- if (!(date && month && year)) {
1
+ import { parseDateString } from '../parseDateString';
2
+ export var formatStringToDate = function (value, steps) {
3
+ var parsedDate = parseDateString(value, steps);
4
+ if (!parsedDate) {
5
5
  return null;
6
6
  }
7
- return new Date(+year, +month - 1, +date);
7
+ var day = parsedDate.day, month = parsedDate.month, year = parsedDate.year;
8
+ return new Date(+year, +month - 1, +day);
8
9
  };
@@ -1,12 +1,12 @@
1
1
  import { __assign } from "tslib";
2
2
  import { getCalendarSizeToFormElement } from '../getCalendarSizeToFormElement';
3
3
  export var getCommonCalendarProps = function (props) {
4
- var minDate = props.minDate, maxDate = props.maxDate, exclude = props.exclude, _a = props.size, size = _a === void 0 ? 'm' : _a, ref = props.ref, calendarProps = props.calendarProps;
4
+ var minDate = props.minDate, maxDate = props.maxDate, exclude = props.exclude, _a = props.size, size = _a === void 0 ? 'm' : _a, ref = props.ref, calendarProps = props.calendarProps, steps = props.steps, initialStep = props.initialStep;
5
5
  /** Соотношение размера календаря к размеру элемента контроля */
6
6
  var calendarSize = getCalendarSizeToFormElement(size);
7
7
  /** Предотвращаем переход фокуса с текстового поля на интерактивные элементы календаря */
8
8
  var handleMouseDownCalendar = function (e) {
9
9
  e.preventDefault();
10
10
  };
11
- return __assign(__assign({ minDate: minDate, maxDate: maxDate, exclude: exclude, size: calendarSize }, calendarProps), { ref: ref, onMouseDown: handleMouseDownCalendar });
11
+ return __assign(__assign({ minDate: minDate, maxDate: maxDate, exclude: exclude, size: calendarSize }, calendarProps), { ref: ref, onMouseDown: handleMouseDownCalendar, steps: steps, initialStep: initialStep });
12
12
  };
@@ -6,4 +6,6 @@ export * from './isInExclude';
6
6
  export * from './getCommonPopoverProps';
7
7
  export * from './getCommonCalendarProps';
8
8
  export * from './isValidDateString';
9
+ export * from './maskPastedDate';
10
+ export * from './parseDateString';
9
11
  export * from './useCalendarKeyboard';
@@ -6,4 +6,6 @@ export * from './isInExclude';
6
6
  export * from './getCommonPopoverProps';
7
7
  export * from './getCommonCalendarProps';
8
8
  export * from './isValidDateString';
9
+ export * from './maskPastedDate';
10
+ export * from './parseDateString';
9
11
  export * from './useCalendarKeyboard';
@@ -1 +1,2 @@
1
- export declare const isValidDateString: (value: string | null | undefined) => boolean;
1
+ import type { CalendarSteps } from '../../../Calendar';
2
+ export declare const isValidDateString: (value: string | null | undefined, steps: CalendarSteps) => boolean;
@@ -1,11 +1,12 @@
1
- import { __read } from "tslib";
2
- import { isValidDate } from '../../../../utils/date';
3
- import { isNotNil } from '../../../../utils/isNotNil';
4
- export var isValidDateString = function (value) {
1
+ import { isNotNil } from '../../../../utils';
2
+ import { parseDateString } from '../parseDateString';
3
+ export var isValidDateString = function (value, steps) {
5
4
  if (!isNotNil(value)) {
6
5
  return false;
7
6
  }
8
- var _a = __read(value.split('.'), 3), date = _a[0], month = _a[1], year = _a[2];
9
- return (value === '' ||
10
- (value.length === 10 && isValidDate("".concat(year, "-").concat(month, "-").concat(date))));
7
+ if (value === '') {
8
+ return true;
9
+ }
10
+ var parsedDate = parseDateString(value, steps);
11
+ return !!parsedDate;
11
12
  };
@@ -0,0 +1 @@
1
+ export * from './maskPastedDate';
@@ -0,0 +1 @@
1
+ export * from './maskPastedDate';
@@ -0,0 +1,6 @@
1
+ import type { CalendarSteps } from '../../../Calendar';
2
+ /**
3
+ * Функция для обработки вставленного значения.
4
+ * Умеет обрабатывать форматы DD.MM.YYYY/DDMMYYYY, либо сочетания вида DDMM/DD.MM.
5
+ */
6
+ export declare const maskPastedDate: (value: string, steps: CalendarSteps) => string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Функция для обработки вставленного значения.
3
+ * Умеет обрабатывать форматы DD.MM.YYYY/DDMMYYYY, либо сочетания вида DDMM/DD.MM.
4
+ */
5
+ export var maskPastedDate = function (value, steps) {
6
+ var digits = value.replace(/\D/g, '').slice(0, 8); // максимум 8 цифр
7
+ var hasYearsStep = steps.includes('years');
8
+ var hasMonthsStep = steps.includes('months');
9
+ var hasDaysStep = steps.includes('days');
10
+ // DD
11
+ if (hasDaysStep && !hasMonthsStep && !hasYearsStep) {
12
+ return digits.slice(0, 2);
13
+ }
14
+ // MM
15
+ if (!hasDaysStep && hasMonthsStep && !hasYearsStep) {
16
+ return digits.slice(0, 2);
17
+ }
18
+ // YYYY
19
+ if (!hasDaysStep && !hasMonthsStep && hasYearsStep) {
20
+ return digits.slice(0, 4);
21
+ }
22
+ // DD.MM.YYYY
23
+ if (hasDaysStep && hasMonthsStep && hasYearsStep) {
24
+ return "".concat(digits.slice(0, 2), ".").concat(digits.slice(2, 4), ".").concat(digits.slice(4, 8));
25
+ }
26
+ // DD.MM
27
+ if (hasDaysStep && hasMonthsStep && !hasYearsStep) {
28
+ return "".concat(digits.slice(0, 2), ".").concat(digits.slice(2, 4));
29
+ }
30
+ // DD.YYYY
31
+ if (hasDaysStep && !hasMonthsStep && hasYearsStep) {
32
+ return "".concat(digits.slice(0, 2), ".").concat(digits.slice(2, 6));
33
+ }
34
+ // MM.YYYY
35
+ if (!hasDaysStep && hasMonthsStep && hasYearsStep) {
36
+ return "".concat(digits.slice(0, 2), ".").concat(digits.slice(2, 6));
37
+ }
38
+ throw new Error('Не удалось сделать маску для значения');
39
+ };
@@ -0,0 +1 @@
1
+ export * from './parseDateString';
@@ -0,0 +1 @@
1
+ export * from './parseDateString';
@@ -0,0 +1,6 @@
1
+ import type { CalendarSteps } from '../../../Calendar';
2
+ export declare const parseDateString: (value: string | null | undefined, steps: CalendarSteps) => {
3
+ year: string;
4
+ month: string;
5
+ day: string;
6
+ } | null;