@ozen-ui/kit 0.74.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 (153) 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/ListCardItem/hooks/useListCardItemRatio.js +10 -14
  56. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/b-business-dark/color-b-business-dark.css +1 -1
  57. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/b-business-default/color-b-business-default.css +1 -1
  58. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/ozen-dark/color-ozen-dark.css +1 -1
  59. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/ozen-default/color-ozen-default.css +1 -1
  60. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/vip-dark/color-vip-dark.css +1 -1
  61. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/vip-default/color-vip-default.css +1 -1
  62. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/shadow/ozen-default/shadow-ozen-default.css +1 -1
  63. package/__inner__/cjs/components/Stack/Stack.css +3 -0
  64. package/__inner__/cjs/components/Stack/Stack.js +2 -1
  65. package/__inner__/cjs/components/Stack/constants.d.ts +1 -0
  66. package/__inner__/cjs/components/Stack/constants.js +2 -1
  67. package/__inner__/cjs/components/Stack/types.d.ts +4 -0
  68. package/__inner__/cjs/components/Stack/types.js +2 -1
  69. package/__inner__/cjs/hooks/useDevEffect/index.d.ts +1 -0
  70. package/__inner__/cjs/hooks/useDevEffect/index.js +4 -0
  71. package/__inner__/cjs/hooks/useDevEffect/useDevEffect.d.ts +3 -0
  72. package/__inner__/cjs/hooks/useDevEffect/useDevEffect.js +13 -0
  73. package/__inner__/cjs/hooks/useIntersectionObserver/useIntersectionObserver.js +3 -2
  74. package/__inner__/cjs/locale/locale.js +39 -3
  75. package/__inner__/cjs/utils/array/createFilled/createFilledArray.d.ts +1 -1
  76. package/__inner__/cjs/utils/array/createFilled/createFilledArray.js +6 -1
  77. package/__inner__/esm/components/Calendar/Calendar.js +27 -3
  78. package/__inner__/esm/components/Calendar/CalendarContext.d.ts +8 -1
  79. package/__inner__/esm/components/Calendar/CalendarContext.js +10 -1
  80. package/__inner__/esm/components/Calendar/__tests__/utils.d.ts +11 -0
  81. package/__inner__/esm/components/Calendar/__tests__/utils.js +45 -0
  82. package/__inner__/esm/components/Calendar/components/CalendarGrid/CalendarGrid.js +4 -3
  83. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItem.js +25 -2
  84. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItemContext.d.ts +1 -0
  85. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItemContext.js +1 -0
  86. package/__inner__/esm/components/Calendar/components/CalendarModeRange/CalendarModeRange.js +70 -15
  87. package/__inner__/esm/components/Calendar/components/CalendarModeSingle/CalendarModeSingle.js +64 -18
  88. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/CalendarSwitcher.js +6 -7
  89. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.d.ts +3 -0
  90. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.js +9 -0
  91. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.d.ts +2 -0
  92. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.js +2 -0
  93. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.d.ts +4 -0
  94. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.js +1 -0
  95. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/index.d.ts +1 -0
  96. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/index.js +1 -0
  97. package/__inner__/esm/components/Calendar/constants.d.ts +2 -0
  98. package/__inner__/esm/components/Calendar/constants.js +6 -0
  99. package/__inner__/esm/components/Calendar/index.d.ts +1 -0
  100. package/__inner__/esm/components/Calendar/index.js +1 -0
  101. package/__inner__/esm/components/Calendar/types.d.ts +13 -5
  102. package/__inner__/esm/components/Calendar/utils.d.ts +10 -1
  103. package/__inner__/esm/components/Calendar/utils.js +9 -0
  104. package/__inner__/esm/components/DatePicker/components/DateInput/DateInput.js +3 -2
  105. package/__inner__/esm/components/DatePicker/components/DateInput/types.d.ts +6 -2
  106. package/__inner__/esm/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.d.ts +2 -1
  107. package/__inner__/esm/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.js +67 -7
  108. package/__inner__/esm/components/DatePicker/components/DatePickerModeDate/DatePickerModeDate.js +33 -21
  109. package/__inner__/esm/components/DatePicker/components/DatePickerModeDateRange/DatePickerModeDateRange.js +68 -45
  110. package/__inner__/esm/components/DatePicker/constants.d.ts +2 -0
  111. package/__inner__/esm/components/DatePicker/constants.js +3 -0
  112. package/__inner__/esm/components/DatePicker/types.d.ts +10 -6
  113. package/__inner__/esm/components/DatePicker/types.js +2 -0
  114. package/__inner__/esm/components/DatePicker/utils/formatDateToString/formatDateToString.d.ts +2 -1
  115. package/__inner__/esm/components/DatePicker/utils/formatDateToString/formatDateToString.js +18 -5
  116. package/__inner__/esm/components/DatePicker/utils/formatStringToDate/formatStringToDate.d.ts +2 -1
  117. package/__inner__/esm/components/DatePicker/utils/formatStringToDate/formatStringToDate.js +6 -5
  118. package/__inner__/esm/components/DatePicker/utils/getCommonCalendarProps/getCommonCalendarProps.js +2 -2
  119. package/__inner__/esm/components/DatePicker/utils/index.d.ts +2 -0
  120. package/__inner__/esm/components/DatePicker/utils/index.js +2 -0
  121. package/__inner__/esm/components/DatePicker/utils/isValidDateString/isValidDateString.d.ts +2 -1
  122. package/__inner__/esm/components/DatePicker/utils/isValidDateString/isValidDateString.js +8 -7
  123. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/index.d.ts +1 -0
  124. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/index.js +1 -0
  125. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/maskPastedDate.d.ts +6 -0
  126. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/maskPastedDate.js +39 -0
  127. package/__inner__/esm/components/DatePicker/utils/parseDateString/index.d.ts +1 -0
  128. package/__inner__/esm/components/DatePicker/utils/parseDateString/index.js +1 -0
  129. package/__inner__/esm/components/DatePicker/utils/parseDateString/parseDateString.d.ts +6 -0
  130. package/__inner__/esm/components/DatePicker/utils/parseDateString/parseDateString.js +62 -0
  131. package/__inner__/esm/components/ListCardItem/hooks/useListCardItemRatio.js +10 -14
  132. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/b-business-dark/color-b-business-dark.css +1 -1
  133. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/b-business-default/color-b-business-default.css +1 -1
  134. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/ozen-dark/color-ozen-dark.css +1 -1
  135. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/ozen-default/color-ozen-default.css +1 -1
  136. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/vip-dark/color-vip-dark.css +1 -1
  137. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/vip-default/color-vip-default.css +1 -1
  138. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/shadow/ozen-default/shadow-ozen-default.css +1 -1
  139. package/__inner__/esm/components/Stack/Stack.css +3 -0
  140. package/__inner__/esm/components/Stack/Stack.js +3 -2
  141. package/__inner__/esm/components/Stack/constants.d.ts +1 -0
  142. package/__inner__/esm/components/Stack/constants.js +1 -0
  143. package/__inner__/esm/components/Stack/types.d.ts +4 -0
  144. package/__inner__/esm/components/Stack/types.js +1 -0
  145. package/__inner__/esm/hooks/useDevEffect/index.d.ts +1 -0
  146. package/__inner__/esm/hooks/useDevEffect/index.js +1 -0
  147. package/__inner__/esm/hooks/useDevEffect/useDevEffect.d.ts +3 -0
  148. package/__inner__/esm/hooks/useDevEffect/useDevEffect.js +9 -0
  149. package/__inner__/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +3 -2
  150. package/__inner__/esm/locale/locale.js +39 -3
  151. package/__inner__/esm/utils/array/createFilled/createFilledArray.d.ts +1 -1
  152. package/__inner__/esm/utils/array/createFilled/createFilledArray.js +6 -1
  153. package/package.json +4 -4
@@ -1,6 +1,6 @@
1
1
  import type { MouseEvent, ReactElement, ReactNode } from 'react';
2
2
  import type { DPExcludeConfig, DPDayInteger } from '@rehookify/datepicker';
3
- import type { ExtendableComponentPropsWithRef } from '../../types/ExtendableComponentPropsWithRef';
3
+ import type { WithRequired, ExtendableComponentPropsWithRef } from '../../types';
4
4
  import type { WithDisplayName } from '../../types/react';
5
5
  import type { CALENDAR_DEFAULT_MODE } from './constants';
6
6
  export declare const calendarStepVariant: readonly ["days", "months", "years"];
@@ -18,6 +18,7 @@ export type CalendarPropRenderAdditionalControls<MODE extends CalendarModeVarian
18
18
  date?: MODE extends 'range' ? Date[] : Date;
19
19
  }) => ReactElement;
20
20
  export type CalendarPropCalendars = 1 | 2;
21
+ export type CalendarSteps = CalendarStepVariant[];
21
22
  /**
22
23
  * @deprecated
23
24
  * Use the `CalendarPropOnChange` type to replace it.
@@ -44,6 +45,9 @@ export type CalendarExclude = CalendarPropExclude;
44
45
  * */
45
46
  export type CalendarStartDay = CalendarPropStartDay;
46
47
  export type CalendarRenderAdditionalControls<MODE extends CalendarModeVariant> = CalendarPropRenderAdditionalControls<MODE>;
48
+ export type CalendarOnMonthClick = (event: MouseEvent<HTMLElement>, date: Date) => void;
49
+ export type CalendarOnDayClick = (event: MouseEvent<HTMLElement>, date: Date) => void;
50
+ export type CalendarOnYearClick = (event: MouseEvent<HTMLElement>, date: Date) => void;
47
51
  export type CalendarProps<MODE extends CalendarModeVariant = typeof CALENDAR_DEFAULT_MODE> = ExtendableComponentPropsWithRef<{
48
52
  /** Способ выбора даты:
49
53
  * - `single` — позволяет выбрать одну дату (показывает один календарь).
@@ -75,11 +79,11 @@ export type CalendarProps<MODE extends CalendarModeVariant = typeof CALENDAR_DEF
75
79
  /** Ограничение выбора дат по большей дате */
76
80
  maxDate?: Date;
77
81
  /** Обработчик нажатия на кнопку месяца */
78
- onMonthClick?(e: MouseEvent<HTMLElement>, date: Date): void;
82
+ onMonthClick?: CalendarOnMonthClick;
79
83
  /** Обработчик нажатия на кнопку дня */
80
- onDayClick?(e: MouseEvent<HTMLElement>, date: Date): void;
84
+ onDayClick?: CalendarOnDayClick;
81
85
  /** Обработчик нажатия на кнопку года */
82
- onYearClick?(e: MouseEvent<HTMLElement>, date: Date): void;
86
+ onYearClick?: CalendarOnYearClick;
83
87
  /** Дополнительные контролы — рендер функция */
84
88
  renderAdditionalControls?: CalendarPropRenderAdditionalControls<MODE>;
85
89
  /** Функция форматирования атрибута `aria-label` для кнопок переключения периодов */
@@ -89,6 +93,10 @@ export type CalendarProps<MODE extends CalendarModeVariant = typeof CALENDAR_DEF
89
93
  /** Количество отображаемых календарей в компоненте: один или два */
90
94
  calendars?: CalendarPropCalendars;
91
95
  children?: never;
96
+ /** Шаги календаря. Определяет порядок и наличие этапов выбора. */
97
+ steps?: CalendarSteps;
98
+ /** Изначальный шаг */
99
+ initialStep?: CalendarStepVariant;
92
100
  }, 'div'>;
93
101
  export type CalendarComponent = WithDisplayName<(<MODE extends CalendarModeVariant = typeof CALENDAR_DEFAULT_MODE>(props: CalendarProps<MODE>) => ReactNode)>;
94
- export type CalendarModeComponent<MODE extends CalendarModeVariant> = WithDisplayName<(props: Omit<CalendarProps<MODE>, 'mode'>) => ReactNode>;
102
+ export type CalendarModeComponent<MODE extends CalendarModeVariant> = WithDisplayName<(props: Omit<WithRequired<CalendarProps<MODE>, 'steps' | 'initialStep'>, 'mode'>) => ReactNode>;
@@ -1,3 +1,12 @@
1
- import type { CalendarProps } from './index';
1
+ import type { CalendarProps, CalendarSteps } from './index';
2
2
  export declare const cnCalendar: import("@bem-react/classname").ClassNameFormatter;
3
3
  export declare const getPeriodSwitchAriaLabel: CalendarProps['getPeriodSwitchAriaLabel'];
4
+ export declare const calculateStepsAvailability: (steps: CalendarSteps) => {
5
+ hasDaysStep: boolean;
6
+ hasMonthsStep: boolean;
7
+ hasYearsStep: boolean;
8
+ };
9
+ export declare const calculateStepsHelpers: (steps: CalendarSteps) => {
10
+ lastStep: "days" | "months" | "years";
11
+ firstStep: "days" | "months" | "years";
12
+ };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPeriodSwitchAriaLabel = exports.cnCalendar = void 0;
3
+ exports.calculateStepsHelpers = exports.calculateStepsAvailability = exports.getPeriodSwitchAriaLabel = exports.cnCalendar = void 0;
4
4
  var classname_1 = require("../../utils/classname");
5
5
  exports.cnCalendar = (0, classname_1.cn)('Calendar');
6
6
  var getPeriodSwitchAriaLabel = function (step) {
@@ -13,3 +13,14 @@ var getPeriodSwitchAriaLabel = function (step) {
13
13
  return ['Previous period', 'Next period'];
14
14
  };
15
15
  exports.getPeriodSwitchAriaLabel = getPeriodSwitchAriaLabel;
16
+ var calculateStepsAvailability = function (steps) { return ({
17
+ hasDaysStep: steps.includes('days'),
18
+ hasMonthsStep: steps.includes('months'),
19
+ hasYearsStep: steps.includes('years'),
20
+ }); };
21
+ exports.calculateStepsAvailability = calculateStepsAvailability;
22
+ var calculateStepsHelpers = function (steps) { return ({
23
+ lastStep: steps[steps.length - 1],
24
+ firstStep: steps[0],
25
+ }); };
26
+ exports.calculateStepsHelpers = calculateStepsHelpers;
@@ -4,10 +4,11 @@ exports.DateInput = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var react_1 = tslib_1.__importStar(require("react"));
6
6
  var useMultiRef_1 = require("../../../../hooks/useMultiRef");
7
+ var utils_1 = require("../../../../utils");
7
8
  var Input_1 = require("../../../Input");
8
- var utils_1 = require("./utils");
9
+ var utils_2 = require("./utils");
9
10
  exports.DateInput = (0, react_1.forwardRef)(function (_a, ref) {
10
- var valueProp = _a.value, defaultValue = _a.defaultValue, other = tslib_1.__rest(_a, ["value", "defaultValue"]);
11
- return (react_1.default.createElement(Input_1.Input, tslib_1.__assign({ value: (0, utils_1.dateInputMask)(valueProp), defaultValue: (0, utils_1.dateInputMask)(defaultValue) }, other, { ref: (0, useMultiRef_1.useMultiRef)([ref]) })));
11
+ var valueProp = _a.value, defaultValue = _a.defaultValue, steps = _a.steps, placeholder = _a.placeholder, other = tslib_1.__rest(_a, ["value", "defaultValue", "steps", "placeholder"]);
12
+ return (react_1.default.createElement(Input_1.Input, tslib_1.__assign({ value: (0, utils_2.dateInputMask)(valueProp, steps), defaultValue: (0, utils_2.dateInputMask)(defaultValue, steps) }, other, { placeholder: (0, utils_1.isFunction)(placeholder) ? placeholder(steps) : placeholder, ref: (0, useMultiRef_1.useMultiRef)([ref]) })));
12
13
  });
13
14
  exports.DateInput.displayName = 'DateInput';
@@ -1,9 +1,13 @@
1
1
  import type { ComponentRef } from 'react';
2
- import type { ExtendableComponentPropsWithRef } from '../../../../types/ExtendableComponentPropsWithRef';
2
+ import type { ExtendableComponentPropsWithRef } from '../../../../types';
3
+ import type { CalendarSteps } from '../../../Calendar';
3
4
  import type { FIELD_CONTROL_DEFAULT_TAG } from '../../../FieldControl';
4
5
  import type { InputProps } from '../../../Input';
6
+ import type { InputPropPlaceholder } from '../../types';
5
7
  export type DateInputRef = ComponentRef<typeof FIELD_CONTROL_DEFAULT_TAG>;
6
8
  export type DateInputProps = ExtendableComponentPropsWithRef<{
9
+ steps: CalendarSteps;
7
10
  value?: string;
8
11
  defaultValue?: string;
9
- } & Omit<InputProps, 'value' | 'defaultValue'>, typeof FIELD_CONTROL_DEFAULT_TAG>;
12
+ placeholder?: InputPropPlaceholder;
13
+ } & Omit<InputProps, 'value' | 'defaultValue' | 'placeholder'>, typeof FIELD_CONTROL_DEFAULT_TAG>;
@@ -1 +1,2 @@
1
- export declare const dateInputMask: (value: string | undefined) => string | undefined;
1
+ import type { CalendarSteps } from '../../../../../Calendar';
2
+ export declare const dateInputMask: (value: string | undefined, steps: CalendarSteps) => string | undefined;
@@ -1,18 +1,78 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.dateInputMask = void 0;
4
- var dateInputMask = function (value) {
4
+ var onlyOneDot = function (value) {
5
+ // Разрешить только первую точку, остальные убрать
6
+ var firstDotIndex = value.indexOf('.');
7
+ if (firstDotIndex === -1) {
8
+ return value;
9
+ }
10
+ // Сохраняем первую часть и одну точку
11
+ var beforeDot = value.slice(0, firstDotIndex + 1);
12
+ var afterDot = value.slice(firstDotIndex + 1).replace(/\./g, '');
13
+ return beforeDot + afterDot;
14
+ };
15
+ var dateInputMask = function (value, steps) {
5
16
  if (!value) {
6
17
  return value;
7
18
  }
19
+ var hasDaysStep = steps.includes('days');
20
+ var hasMonthsStep = steps.includes('months');
21
+ var hasYearsStep = steps.includes('years');
22
+ var maxLength = 0;
8
23
  var newValue = value.replace(/[^0-9.]/g, ''); // Запрещаем ввод, кроме цифр и точек
9
24
  newValue = newValue.replace(/\.\.+/g, '..'); // Удаляем лишние точки
10
- newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
11
- newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.M
12
- newValue = newValue.replace(/^(\d\d)\.(\d)\.$/g, '$1.0$2.'); // Добавляем 0 в DD.M.
13
- newValue = newValue.replace(/^(\d\d\.\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.MM.Y
14
- if (newValue.length > 10)
15
- newValue = newValue.slice(0, 10); // Ограничиваем длину
25
+ // DD
26
+ if (hasDaysStep && !hasMonthsStep && !hasYearsStep) {
27
+ maxLength = 2;
28
+ newValue = newValue.replace('.', '');
29
+ }
30
+ // MM
31
+ if (!hasDaysStep && hasMonthsStep && !hasYearsStep) {
32
+ maxLength = 2;
33
+ newValue = newValue.replace('.', '');
34
+ }
35
+ // YYYY
36
+ if (!hasDaysStep && !hasMonthsStep && hasYearsStep) {
37
+ maxLength = 4;
38
+ newValue = newValue.replace('.', '');
39
+ }
40
+ // DD.MM.YYYY
41
+ if (hasDaysStep && hasMonthsStep && hasYearsStep) {
42
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
43
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.M
44
+ newValue = newValue.replace(/^(\d\d)\.(\d)\.$/g, '$1.0$2.'); // Добавляем 0 в DD.M.
45
+ newValue = newValue.replace(/^(\d\d\.\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.MM.Y
46
+ // + 2, так как одно соединение в виде "."
47
+ maxLength = 8 + 2;
48
+ }
49
+ // DD.MM
50
+ if (hasDaysStep && hasMonthsStep && !hasYearsStep) {
51
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
52
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.M
53
+ newValue = onlyOneDot(newValue); // Разрешаем только одну точку
54
+ // + 1, так как одно соединение в виде "."
55
+ maxLength = 4 + 1;
56
+ }
57
+ // DD.YYYY
58
+ if (hasDaysStep && !hasMonthsStep && hasYearsStep) {
59
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
60
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.Y
61
+ newValue = onlyOneDot(newValue);
62
+ // + 1, так как одно соединение в виде "."
63
+ maxLength = 6 + 1;
64
+ }
65
+ // MM.YYYY
66
+ if (!hasDaysStep && hasMonthsStep && hasYearsStep) {
67
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в M.
68
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в MM.Y
69
+ newValue = onlyOneDot(newValue);
70
+ // + 1, так как одно соединение в виде "."
71
+ maxLength = 6 + 1;
72
+ }
73
+ if (newValue.length > maxLength) {
74
+ newValue = newValue.slice(0, maxLength); // Ограничиваем длину
75
+ }
16
76
  return newValue;
17
77
  };
18
78
  exports.dateInputMask = dateInputMask;
@@ -5,44 +5,47 @@ var tslib_1 = require("tslib");
5
5
  var react_1 = tslib_1.__importStar(require("react"));
6
6
  var useControlled_1 = require("../../../../hooks/useControlled");
7
7
  var useMultiRef_1 = require("../../../../hooks/useMultiRef");
8
+ var useStoredValue_1 = require("../../../../hooks/useStoredValue");
8
9
  var isKeys_1 = require("../../../../utils/isKeys");
9
10
  var Calendar_1 = require("../../../Calendar");
10
11
  var Popover_1 = require("../../../Popover");
12
+ var constants_1 = require("../../constants");
11
13
  var index_1 = require("../../index");
12
14
  var utils_1 = require("../../utils");
13
15
  var index_2 = require("../index");
14
16
  exports.DatePickerModeDate = (0, react_1.forwardRef)(function (props, ref) {
15
- 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 = tslib_1.__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"]);
17
+ 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 ? constants_1.DATE_PICKER_DEFAULT_STEPS : _b, _c = props.initialStep, initialStep = _c === void 0 ? constants_1.DATE_PICKER_DEFAULT_INITIAL_STEP : _c, other = tslib_1.__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"]);
16
18
  var anchorRef = (0, react_1.useRef)(null);
17
19
  var calendarInnerRef = (0, react_1.useRef)(null);
18
20
  var calendarRef = (0, useMultiRef_1.useMultiRef)([calendarInnerRef, calendarPropsProp === null || calendarPropsProp === void 0 ? void 0 : calendarPropsProp.ref]);
19
21
  var lastValidDate = (0, react_1.useRef)('');
20
- var _b = tslib_1.__read((0, react_1.useState)(null), 2), offsetDate = _b[0], setOffsetDate = _b[1];
21
- var _c = tslib_1.__read((0, useControlled_1.useControlled)({
22
+ var _d = tslib_1.__read((0, react_1.useState)(null), 2), offsetDate = _d[0], setOffsetDate = _d[1];
23
+ var isWasPaste = (0, useStoredValue_1.useStoredValue)(false);
24
+ var _e = tslib_1.__read((0, useControlled_1.useControlled)({
22
25
  value: undefined,
23
26
  defaultValue: '',
24
27
  name: 'DatePicker',
25
28
  state: 'inputValue',
26
- }), 2), inputValue = _c[0], setInputValue = _c[1];
27
- var _d = tslib_1.__read((0, useControlled_1.useControlled)({
29
+ }), 2), inputValue = _e[0], setInputValue = _e[1];
30
+ var _f = tslib_1.__read((0, useControlled_1.useControlled)({
28
31
  value: openProp,
29
32
  defaultValue: defaultOpen,
30
33
  name: 'DatePicker',
31
34
  state: 'open',
32
- }), 2), open = _d[0], setOpen = _d[1];
33
- var _e = tslib_1.__read((0, useControlled_1.useControlled)({
35
+ }), 2), open = _f[0], setOpen = _f[1];
36
+ var _g = tslib_1.__read((0, useControlled_1.useControlled)({
34
37
  value: valueProp,
35
38
  defaultValue: defaultValue,
36
39
  name: 'DatePicker',
37
40
  state: 'value',
38
- }), 2), value = _e[0], setValue = _e[1];
41
+ }), 2), value = _g[0], setValue = _g[1];
39
42
  var popoverProps = (0, utils_1.getCommonPopoverProps)(tslib_1.__assign(tslib_1.__assign({}, props), { popoverProps: popoverPropsProp }));
40
43
  var calendarProps = (0, utils_1.getCommonCalendarProps)(tslib_1.__assign(tslib_1.__assign({}, props), { calendarProps: calendarPropsProp, ref: calendarRef }));
41
44
  var onOffsetDateChange = function (date) {
42
45
  setOffsetDate(date);
43
46
  };
44
47
  var callOnChange = function (value) {
45
- var formattedDate = (0, utils_1.formatStringToDate)(value);
48
+ var formattedDate = (0, utils_1.formatStringToDate)(value, steps);
46
49
  setValue(formattedDate);
47
50
  onChange === null || onChange === void 0 ? void 0 : onChange(formattedDate);
48
51
  lastValidDate.current = value;
@@ -50,9 +53,9 @@ exports.DatePickerModeDate = (0, react_1.forwardRef)(function (props, ref) {
50
53
  var changeInputValue = function (e, value) {
51
54
  setInputValue(value);
52
55
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(e, value);
53
- if ((0, utils_1.isValidDateString)(value)) {
56
+ if ((0, utils_1.isValidDateString)(value, steps)) {
54
57
  callOnChange(value);
55
- onOffsetDateChange((0, utils_1.formatStringToDate)(value));
58
+ onOffsetDateChange((0, utils_1.formatStringToDate)(value, steps));
56
59
  }
57
60
  };
58
61
  var handleExited = function () {
@@ -74,7 +77,7 @@ exports.DatePickerModeDate = (0, react_1.forwardRef)(function (props, ref) {
74
77
  }, [autoFocus]);
75
78
  /** Эффект — синхронизируем значение текстового поля со значением в списке */
76
79
  (0, react_1.useEffect)(function () {
77
- var formattedDate = (0, utils_1.formatDateToString)(value);
80
+ var formattedDate = (0, utils_1.formatDateToString)(value, steps);
78
81
  if (formattedDate !== inputValue) {
79
82
  setInputValue(formattedDate);
80
83
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(null, formattedDate);
@@ -130,7 +133,7 @@ exports.DatePickerModeDate = (0, react_1.forwardRef)(function (props, ref) {
130
133
  (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onBlur) === null || _a === void 0 ? void 0 : _a.call(inputProps, e);
131
134
  if (!inputValue)
132
135
  return;
133
- if (!(0, utils_1.isValidDateString)(inputValue))
136
+ if (!(0, utils_1.isValidDateString)(inputValue, steps))
134
137
  changeInputValue(null, lastValidDate.current);
135
138
  };
136
139
  /** Очистка поля */
@@ -138,22 +141,31 @@ exports.DatePickerModeDate = (0, react_1.forwardRef)(function (props, ref) {
138
141
  changeInputValue(null, '');
139
142
  };
140
143
  /** Событие ввода значения в текстовом поле */
141
- var handleChangeInput = function (e) {
144
+ var handleChangeInput = function (event) {
145
+ var _a;
146
+ var value = event.target.value.trim();
147
+ var preparedValue = isWasPaste.current
148
+ ? (0, utils_1.maskPastedDate)(value, steps)
149
+ : value;
150
+ changeInputValue(event, preparedValue);
151
+ (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onChange) === null || _a === void 0 ? void 0 : _a.call(inputProps, event);
152
+ isWasPaste.current = false;
153
+ };
154
+ var handlePasteInput = function (event) {
142
155
  var _a;
143
- var value = e.target.value;
144
- changeInputValue(e, value);
145
- (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onChange) === null || _a === void 0 ? void 0 : _a.call(inputProps, e);
156
+ isWasPaste.current = true;
157
+ (_a = inputProps === null || inputProps === void 0 ? void 0 : inputProps.onPaste) === null || _a === void 0 ? void 0 : _a.call(inputProps, event);
146
158
  };
147
159
  /** Событие выбора значения из календаря */
148
160
  var handleChangeCalendar = function (date) {
149
- var formattedDate = (0, utils_1.formatDateToString)(date);
161
+ var formattedDate = (0, utils_1.formatDateToString)(date, steps);
150
162
  changeInputValue(null, formattedDate);
151
163
  if (!disableCloseOnSelect)
152
164
  handleClose();
153
165
  };
154
166
  return (react_1.default.createElement(react_1.default.Fragment, null,
155
- react_1.default.createElement(index_2.DateInput, tslib_1.__assign({ size: size, disabled: disabled, label: label }, other, { className: (0, index_1.cnDatePicker)({ mode: 'date' }, className), renderRight: react_1.default.createElement(index_2.DatePickerRenderRight, { size: size, open: open, onClear: handleClear, clearText: clearText, hasValue: !!value, renderRight: renderRight, disableClearButton: disableClearButton }), value: inputValue, inputProps: tslib_1.__assign(tslib_1.__assign({ autoComplete: 'off' }, inputProps), { onBlur: handleBlur, onClick: handleClickOnInput, onChange: handleChangeInput }), bodyProps: { ref: anchorRef, 'aria-expanded': open }, onKeyDown: handleKeyDown, ref: ref })),
167
+ react_1.default.createElement(index_2.DateInput, tslib_1.__assign({ size: size, disabled: disabled, label: label }, other, { steps: steps, className: (0, index_1.cnDatePicker)({ mode: 'date' }, className), renderRight: react_1.default.createElement(index_2.DatePickerRenderRight, { size: size, open: open, onClear: handleClear, clearText: clearText, hasValue: !!value, renderRight: renderRight, disableClearButton: disableClearButton }), value: inputValue, inputProps: tslib_1.__assign(tslib_1.__assign({ autoComplete: 'off' }, inputProps), { onBlur: handleBlur, onClick: handleClickOnInput, onChange: handleChangeInput, onPaste: handlePasteInput }), bodyProps: { ref: anchorRef, 'aria-expanded': open }, onKeyDown: handleKeyDown, ref: ref })),
156
168
  react_1.default.createElement(Popover_1.Popover, tslib_1.__assign({ open: open, anchorRef: anchorRef, onClose: handleClose }, popoverProps, { disableEnforceFocus: !enableEnforceFocus, onExited: handleExited }),
157
- react_1.default.createElement(Calendar_1.Calendar, tslib_1.__assign({ calendars: calendars }, calendarProps, { mode: "single", value: value || null, offsetDate: offsetDate, onOffsetDateChange: onOffsetDateChange, onChange: handleChangeCalendar })))));
169
+ react_1.default.createElement(Calendar_1.Calendar, tslib_1.__assign({ calendars: calendars }, calendarProps, { steps: steps, initialStep: initialStep, mode: "single", value: value || null, offsetDate: offsetDate, onOffsetDateChange: onOffsetDateChange, onChange: handleChangeCalendar })))));
158
170
  });
159
171
  exports.DatePickerModeDate.displayName = 'DatePickerModeDate';
@@ -8,27 +8,30 @@ var useBoolean_1 = require("../../../../hooks/useBoolean");
8
8
  var useControlled_1 = require("../../../../hooks/useControlled");
9
9
  var useMultiRef_1 = require("../../../../hooks/useMultiRef");
10
10
  var useMutableRef_1 = require("../../../../hooks/useMutableRef");
11
- var isKeys_1 = require("../../../../utils/isKeys");
11
+ var useStoredValue_1 = require("../../../../hooks/useStoredValue");
12
+ var utils_1 = require("../../../../utils");
12
13
  var Calendar_1 = require("../../../Calendar");
13
14
  var FieldHint_1 = require("../../../FieldHint");
14
15
  var Popover_1 = require("../../../Popover");
15
16
  var Stack_1 = require("../../../Stack");
17
+ var constants_1 = require("../../constants");
16
18
  var index_1 = require("../../index");
17
- var utils_1 = require("../../utils");
19
+ var utils_2 = require("../../utils");
18
20
  var index_2 = require("../index");
19
- var utils_2 = require("./utils");
21
+ var utils_3 = require("./utils");
20
22
  exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref) {
21
23
  var size = props.size, error = props.error, openProp = props.open, label = props.label, onKeyDown = props.onKeyDown, onInputChange = props.onInputChange, renderLeft = props.renderLeft, renderRight = props.renderRight, required = props.required, fullWidth = props.fullWidth, placeholder = props.placeholder, hint = props.hint, disableStroke = props.disableStroke, hintProps = props.hintProps, onChange = props.onChange, labelProps = props.labelProps, popoverPropsProp = props.popoverProps, calendarPropsProp = props.calendarProps, defaultOpen = props.defaultOpen, onCloseProp = props.onClose, defaultValue = props.defaultValue, valueProp = props.value, inputProps = props.inputProps, disabled = props.disabled, className = props.className, _a = props.calendars, calendars = _a === void 0 ? 2 : _a, onError = props.onError, clearText = props.clearText, disableCloseOnSelect = props.disableCloseOnSelect, disableClearButton = props.disableClearButton, onOpenProp = props.onOpen, fieldsProps = props.fieldsProps,
22
24
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
23
25
  minDate = props.minDate,
24
26
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
- maxDate = props.maxDate, other = tslib_1.__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"]);
26
- var _b = tslib_1.__read((0, utils_2.getValueForDoubleProp)(label), 2), labelFrom = _b[0], labelTo = _b[1];
27
- var _c = tslib_1.__read((0, utils_2.getValueForDoubleProp)(renderLeft), 2), renderLeftFrom = _c[0], renderLeftTo = _c[1];
28
- var _d = tslib_1.__read((0, utils_2.getValueForDoubleProp)(renderRight), 2), renderRightFrom = _d[0], renderRightTo = _d[1];
29
- var _e = tslib_1.__read((0, utils_2.getValueForDoubleProp)(placeholder), 2), placeholderFrom = _e[0], placeholderTo = _e[1];
30
- var _f = tslib_1.__read((0, utils_2.getValueForDoubleProp)(inputProps), 2), inputPropsFrom = _f[0], inputPropsTo = _f[1];
31
- var _g = tslib_1.__read((0, utils_2.getValueForDoubleProp)(labelProps), 2), labelPropsFrom = _g[0], labelPropsTo = _g[1];
27
+ maxDate = props.maxDate, _b = props.steps, steps = _b === void 0 ? constants_1.DATE_PICKER_DEFAULT_STEPS : _b, _c = props.initialStep, initialStep = _c === void 0 ? constants_1.DATE_PICKER_DEFAULT_INITIAL_STEP : _c, other = tslib_1.__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"]);
28
+ var _d = tslib_1.__read((0, utils_3.getValueForDoubleProp)(label), 2), labelFrom = _d[0], labelTo = _d[1];
29
+ var _e = tslib_1.__read((0, utils_3.getValueForDoubleProp)(renderLeft), 2), renderLeftFrom = _e[0], renderLeftTo = _e[1];
30
+ var _f = tslib_1.__read((0, utils_3.getValueForDoubleProp)(renderRight), 2), renderRightFrom = _f[0], renderRightTo = _f[1];
31
+ var _g = tslib_1.__read((0, utils_3.getValueForDoubleProp)(placeholder), 2), placeholderFrom = _g[0], placeholderTo = _g[1];
32
+ var _h = tslib_1.__read((0, utils_3.getValueForDoubleProp)(inputProps), 2), inputPropsFrom = _h[0], inputPropsTo = _h[1];
33
+ var _j = tslib_1.__read((0, utils_3.getValueForDoubleProp)(labelProps), 2), labelPropsFrom = _j[0], labelPropsTo = _j[1];
34
+ var isWasPaste = (0, useStoredValue_1.useStoredValue)(false);
32
35
  var containerRef = (0, react_1.useRef)(null);
33
36
  var anchorRef = (0, react_1.useRef)(null);
34
37
  var calendarInnerRef = (0, react_1.useRef)(null);
@@ -36,34 +39,34 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
36
39
  var calendarRef = (0, useMultiRef_1.useMultiRef)([calendarInnerRef, calendarPropsProp === null || calendarPropsProp === void 0 ? void 0 : calendarPropsProp.ref]);
37
40
  var fieldsRef = (0, useMultiRef_1.useMultiRef)([anchorRef, fieldsProps === null || fieldsProps === void 0 ? void 0 : fieldsProps.ref]);
38
41
  var rootRef = (0, useMultiRef_1.useMultiRef)([ref, containerRef]);
39
- var _h = tslib_1.__read((0, react_1.useState)(null), 2), offsetDate = _h[0], setOffsetDate = _h[1];
40
- var _j = tslib_1.__read((0, react_1.useState)(null), 2), calendarPeriod = _j[0], setCalendarPeriod = _j[1];
42
+ var _k = tslib_1.__read((0, react_1.useState)(null), 2), offsetDate = _k[0], setOffsetDate = _k[1];
43
+ var _l = tslib_1.__read((0, react_1.useState)(null), 2), calendarPeriod = _l[0], setCalendarPeriod = _l[1];
41
44
  var savedCalendarPeriod = (0, useMutableRef_1.useMutableRef)(calendarPeriod);
42
45
  var lastValidDate = (0, react_1.useRef)(['', '']);
43
- var _k = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), focusInputFrom = _k[0], setFocusInputFrom = _k[1];
44
- var _l = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), focusInputTo = _l[0], setFocusInputTo = _l[1];
45
- var _m = tslib_1.__read((0, useControlled_1.useControlled)({
46
+ var _m = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), focusInputFrom = _m[0], setFocusInputFrom = _m[1];
47
+ var _o = tslib_1.__read((0, useBoolean_1.useBoolean)(false), 2), focusInputTo = _o[0], setFocusInputTo = _o[1];
48
+ var _p = tslib_1.__read((0, useControlled_1.useControlled)({
46
49
  value: valueProp,
47
50
  defaultValue: defaultValue,
48
51
  name: 'DatePicker',
49
52
  state: 'value',
50
- }), 2), value = _m[0], setValue = _m[1];
51
- var _o = tslib_1.__read((0, useControlled_1.useControlled)({
53
+ }), 2), value = _p[0], setValue = _p[1];
54
+ var _q = tslib_1.__read((0, useControlled_1.useControlled)({
52
55
  value: undefined,
53
56
  defaultValue: [],
54
57
  name: 'DatePicker',
55
58
  state: 'inputValue',
56
- }), 2), inputValue = _o[0], setInputValue = _o[1];
57
- var _p = tslib_1.__read(value || [], 2), valueFrom = _p[0], valueTo = _p[1];
58
- var _q = tslib_1.__read(inputValue || [], 2), _r = _q[0], inputValueFrom = _r === void 0 ? '' : _r, _s = _q[1], inputValueTo = _s === void 0 ? '' : _s;
59
- var _t = tslib_1.__read((0, useControlled_1.useControlled)({
59
+ }), 2), inputValue = _q[0], setInputValue = _q[1];
60
+ var _r = tslib_1.__read(value || [], 2), valueFrom = _r[0], valueTo = _r[1];
61
+ var _s = tslib_1.__read(inputValue || [], 2), _t = _s[0], inputValueFrom = _t === void 0 ? '' : _t, _u = _s[1], inputValueTo = _u === void 0 ? '' : _u;
62
+ var _v = tslib_1.__read((0, useControlled_1.useControlled)({
60
63
  value: openProp,
61
64
  defaultValue: defaultOpen,
62
65
  name: 'DatePicker',
63
66
  state: 'open',
64
- }), 2), open = _t[0], setOpen = _t[1];
65
- var popoverProps = (0, utils_1.getCommonPopoverProps)(tslib_1.__assign(tslib_1.__assign({}, props), { popoverProps: popoverPropsProp }));
66
- var calendarProps = (0, utils_1.getCommonCalendarProps)(tslib_1.__assign(tslib_1.__assign({}, props), { calendarProps: calendarPropsProp, ref: calendarRef }));
67
+ }), 2), open = _v[0], setOpen = _v[1];
68
+ var popoverProps = (0, utils_2.getCommonPopoverProps)(tslib_1.__assign(tslib_1.__assign({}, props), { popoverProps: popoverPropsProp }));
69
+ var calendarProps = (0, utils_2.getCommonCalendarProps)(tslib_1.__assign(tslib_1.__assign({}, props), { calendarProps: calendarPropsProp, ref: calendarRef }));
67
70
  var onOffsetDateChange = function (date) {
68
71
  setOffsetDate(date);
69
72
  };
@@ -71,7 +74,7 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
71
74
  setCalendarPeriod(date);
72
75
  }, []);
73
76
  /** Enables calendar keyboard interaction */
74
- var enableEnforceFocusTo = (0, utils_1.useCalendarKeyboard)({
77
+ var enableEnforceFocusTo = (0, utils_2.useCalendarKeyboard)({
75
78
  controlRef: dateInputToRef,
76
79
  calendarRef: calendarInnerRef,
77
80
  active: open,
@@ -79,8 +82,8 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
79
82
  var disableEnforceFocus = !enableEnforceFocusTo;
80
83
  /** Эффект — синхронизируем значение текстового поля со значением в списке */
81
84
  (0, react_1.useEffect)(function () {
82
- var formattedDateFrom = (0, utils_1.formatDateToString)(valueFrom);
83
- var formattedDateTo = (0, utils_1.formatDateToString)(valueTo);
85
+ var formattedDateFrom = (0, utils_2.formatDateToString)(valueFrom, steps);
86
+ var formattedDateTo = (0, utils_2.formatDateToString)(valueTo, steps);
84
87
  if (formattedDateFrom !== inputValueFrom ||
85
88
  formattedDateTo !== inputValueTo) {
86
89
  setInputValue([formattedDateFrom, formattedDateTo]);
@@ -96,14 +99,14 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
96
99
  }, [onError]);
97
100
  /** Calendar offset when interacting with inputs */
98
101
  (0, react_1.useEffect)(function () {
99
- if (!(0, utils_1.isValidDateString)(inputValueFrom) ||
100
- !(0, utils_1.isValidDateString)(inputValueTo) ||
102
+ if (!(0, utils_2.isValidDateString)(inputValueFrom, steps) ||
103
+ !(0, utils_2.isValidDateString)(inputValueTo, steps) ||
101
104
  !savedCalendarPeriod.current)
102
105
  return;
103
106
  if ((focusInputFrom || focusInputTo) && open && (calendarPeriod === null || calendarPeriod === void 0 ? void 0 : calendarPeriod.length)) {
104
- var firstDate = (0, utils_1.formatStringToDate)(inputValueFrom);
105
- var secondDate = (0, utils_1.formatStringToDate)(inputValueTo);
106
- var offset = (0, utils_2.getOffsetDateInRange)(tslib_1.__assign(tslib_1.__assign({}, (focusInputTo && { type: 'end' })), { calendarPeriod: savedCalendarPeriod.current, value: [firstDate || undefined, secondDate || undefined] }));
107
+ var firstDate = (0, utils_2.formatStringToDate)(inputValueFrom, steps);
108
+ var secondDate = (0, utils_2.formatStringToDate)(inputValueTo, steps);
109
+ var offset = (0, utils_3.getOffsetDateInRange)(tslib_1.__assign(tslib_1.__assign({}, (focusInputTo && { type: 'end' })), { calendarPeriod: savedCalendarPeriod.current, value: [firstDate || undefined, secondDate || undefined] }));
107
110
  setOffsetDate(offset);
108
111
  }
109
112
  }, [
@@ -128,8 +131,8 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
128
131
  };
129
132
  var callOnChange = function (value) {
130
133
  var _a = tslib_1.__read(value || [], 2), dateFrom = _a[0], dateTo = _a[1];
131
- var formattedDateFrom = (0, utils_1.formatStringToDate)(dateFrom) || undefined;
132
- var formattedDateTo = (0, utils_1.formatStringToDate)(dateTo) || undefined;
134
+ var formattedDateFrom = (0, utils_2.formatStringToDate)(dateFrom, steps) || undefined;
135
+ var formattedDateTo = (0, utils_2.formatStringToDate)(dateTo, steps) || undefined;
133
136
  if (formattedDateTo &&
134
137
  formattedDateFrom &&
135
138
  (formattedDateFrom === null || formattedDateFrom === void 0 ? void 0 : formattedDateFrom.getTime()) > (formattedDateTo === null || formattedDateTo === void 0 ? void 0 : formattedDateTo.getTime())) {
@@ -144,7 +147,8 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
144
147
  setInputValue(value);
145
148
  onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(e, value);
146
149
  var _a = tslib_1.__read(value || [], 2), valueFrom = _a[0], valueTo = _a[1];
147
- if ((0, utils_1.isValidDateString)(valueFrom) && (0, utils_1.isValidDateString)(valueTo))
150
+ if ((0, utils_2.isValidDateString)(valueFrom, steps) &&
151
+ (0, utils_2.isValidDateString)(valueTo, steps))
148
152
  callOnChange([valueFrom, valueTo]);
149
153
  };
150
154
  var handleExited = function () {
@@ -153,12 +157,20 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
153
157
  setCalendarPeriod(null);
154
158
  (_a = popoverProps === null || popoverProps === void 0 ? void 0 : popoverProps.onExited) === null || _a === void 0 ? void 0 : _a.call(popoverProps);
155
159
  };
160
+ var prepareInputValue = function (value) {
161
+ var trimmed = value.trim();
162
+ if (isWasPaste.current) {
163
+ return (0, utils_2.maskPastedDate)(trimmed, steps);
164
+ }
165
+ return trimmed;
166
+ };
156
167
  /** Событие ввода значения в текстовом поле */
157
- var handleChangeInputFrom = function (e) {
168
+ var handleChangeInputFrom = function (event) {
158
169
  var _a;
159
- var value = e.target.value;
160
- (_a = inputPropsFrom === null || inputPropsFrom === void 0 ? void 0 : inputPropsFrom.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsFrom, e);
161
- changeInputValue(e, [value, inputValueTo]);
170
+ var value = prepareInputValue(event.target.value);
171
+ (_a = inputPropsFrom === null || inputPropsFrom === void 0 ? void 0 : inputPropsFrom.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsFrom, event);
172
+ changeInputValue(event, [value, inputValueTo]);
173
+ isWasPaste.current = false;
162
174
  };
163
175
  /** Очистка поля */
164
176
  var handleClear = function (type) { return function () {
@@ -180,7 +192,7 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
180
192
  setFocusInputFrom.off();
181
193
  if (!inputValue)
182
194
  return;
183
- if (!(0, utils_1.isValidDateString)(inputValueFrom)) {
195
+ if (!(0, utils_2.isValidDateString)(inputValueFrom, steps)) {
184
196
  changeInputValue(null, lastValidDate.current);
185
197
  }
186
198
  };
@@ -190,15 +202,26 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
190
202
  setFocusInputTo.off();
191
203
  if (!inputValue)
192
204
  return;
193
- if (!(0, utils_1.isValidDateString)(inputValueTo))
205
+ if (!(0, utils_2.isValidDateString)(inputValueTo, steps))
194
206
  changeInputValue(null, lastValidDate.current);
195
207
  };
196
208
  /** Событие ввода значения в текстовом поле */
197
- var handleChangeInputTo = function (e) {
209
+ var handleChangeInputTo = function (event) {
210
+ var _a;
211
+ var value = prepareInputValue(event.target.value);
212
+ (_a = inputPropsTo === null || inputPropsTo === void 0 ? void 0 : inputPropsTo.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsTo, event);
213
+ changeInputValue(event, [inputValueFrom, value]);
214
+ isWasPaste.current = false;
215
+ };
216
+ var handlePasteInputFrom = function (event) {
217
+ var _a;
218
+ isWasPaste.current = true;
219
+ (_a = inputPropsFrom === null || inputPropsFrom === void 0 ? void 0 : inputPropsFrom.onPaste) === null || _a === void 0 ? void 0 : _a.call(inputPropsFrom, event);
220
+ };
221
+ var handlePasteInputTo = function (event) {
198
222
  var _a;
199
- var value = e.target.value;
200
- (_a = inputPropsTo === null || inputPropsTo === void 0 ? void 0 : inputPropsTo.onChange) === null || _a === void 0 ? void 0 : _a.call(inputPropsTo, e);
201
- changeInputValue(e, [inputValueFrom, value]);
223
+ isWasPaste.current = true;
224
+ (_a = inputPropsTo === null || inputPropsTo === void 0 ? void 0 : inputPropsTo.onPaste) === null || _a === void 0 ? void 0 : _a.call(inputPropsTo, event);
202
225
  };
203
226
  /** Открытие списка по клику на текстовом поле */
204
227
  var handleClickOnInputFrom = function (e) {
@@ -214,7 +237,7 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
214
237
  };
215
238
  /** Управление элементом контроля через клавиатуру */
216
239
  var handleKeyDown = function (event) {
217
- if ((0, isKeys_1.isKeys)(event, ['ArrowDown', 'ArrowUp'])) {
240
+ if ((0, utils_1.isKeys)(event, ['ArrowDown', 'ArrowUp'])) {
218
241
  event.preventDefault();
219
242
  handleOpen();
220
243
  }
@@ -224,8 +247,8 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
224
247
  var handleChangeCalendar = function (date) {
225
248
  var _a = tslib_1.__read(date || [], 2), dateFrom = _a[0], dateTo = _a[1];
226
249
  var formattedDate = [
227
- (0, utils_1.formatDateToString)(dateFrom),
228
- (0, utils_1.formatDateToString)(dateTo),
250
+ (0, utils_2.formatDateToString)(dateFrom, steps),
251
+ (0, utils_2.formatDateToString)(dateTo, steps),
229
252
  ];
230
253
  changeInputValue(null, formattedDate);
231
254
  if (!disableCloseOnSelect && dateFrom && dateTo)
@@ -241,10 +264,10 @@ exports.DatePickerModeDateRange = (0, react_1.forwardRef)(function (props, ref)
241
264
  disableStroke: disableStroke,
242
265
  }, [className]) }, other, { ref: rootRef }),
243
266
  react_1.default.createElement(Stack_1.Stack, tslib_1.__assign({ gap: "l", className: (0, index_1.cnDatePicker)('Fields', [fieldsProps === null || fieldsProps === void 0 ? void 0 : fieldsProps.className]) }, fieldsProps, { ref: fieldsRef }),
244
- react_1.default.createElement(index_2.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_1.default.createElement(index_2.DatePickerRenderRight, { size: size, open: open, hasValue: !!valueFrom, clearText: clearText, renderRight: renderRightFrom, onClear: handleClear('from'), disableClearButton: disableClearButton }), inputProps: tslib_1.__assign(tslib_1.__assign({ autoComplete: 'off' }, inputPropsFrom), { onBlur: handleBlurInputFrom, onFocus: handleFocusInputFrom, onClick: handleClickOnInputFrom, onChange: handleChangeInputFrom }), "data-testid": "date-input-from", bodyProps: { 'aria-expanded': open } }),
245
- react_1.default.createElement(index_2.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_1.default.createElement(index_2.DatePickerRenderRight, { size: size, open: open, hasValue: !!valueTo, clearText: clearText, renderRight: renderRightTo, onClear: handleClear('to'), disableClearButton: disableClearButton }), inputProps: tslib_1.__assign(tslib_1.__assign({ autoComplete: 'off' }, inputPropsTo), { onBlur: handleBlurInputTo, onFocus: handleFocusInputTo, onClick: handleClickOnInputTo, onChange: handleChangeInputTo }), "data-testid": "date-input-to", bodyProps: { ref: dateInputToRef, 'aria-expanded': open } })),
267
+ react_1.default.createElement(index_2.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_1.default.createElement(index_2.DatePickerRenderRight, { size: size, open: open, hasValue: !!valueFrom, clearText: clearText, renderRight: renderRightFrom, onClear: handleClear('from'), disableClearButton: disableClearButton }), inputProps: tslib_1.__assign(tslib_1.__assign({ autoComplete: 'off' }, inputPropsFrom), { onBlur: handleBlurInputFrom, onFocus: handleFocusInputFrom, onClick: handleClickOnInputFrom, onChange: handleChangeInputFrom, onPaste: handlePasteInputFrom }), "data-testid": "date-input-from", bodyProps: { 'aria-expanded': open } }),
268
+ react_1.default.createElement(index_2.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_1.default.createElement(index_2.DatePickerRenderRight, { size: size, open: open, hasValue: !!valueTo, clearText: clearText, renderRight: renderRightTo, onClear: handleClear('to'), disableClearButton: disableClearButton }), inputProps: tslib_1.__assign(tslib_1.__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 } })),
246
269
  react_1.default.createElement(FieldHint_1.FieldHint, tslib_1.__assign({ size: size, error: error, disabled: disabled }, hintProps), hint),
247
270
  react_1.default.createElement(Popover_1.Popover, tslib_1.__assign({ open: open, anchorRef: anchorRef, onClose: handleClose }, popoverProps, { onExited: handleExited, ignoreClickOutsideRefs: [containerRef], disableEnforceFocus: disableEnforceFocus }),
248
- react_1.default.createElement(Calendar_1.Calendar, tslib_1.__assign({ calendars: calendars }, calendarProps, { mode: "range", offsetDate: offsetDate, onChange: handleChangeCalendar, value: (0, utils_2.formatDateForCalendar)(value), onCalendarsChange: onCalendarsChange, onOffsetDateChange: onOffsetDateChange })))));
271
+ react_1.default.createElement(Calendar_1.Calendar, tslib_1.__assign({ calendars: calendars }, calendarProps, { initialStep: initialStep, steps: steps, mode: "range", offsetDate: offsetDate, onChange: handleChangeCalendar, value: (0, utils_3.formatDateForCalendar)(value), onCalendarsChange: onCalendarsChange, onOffsetDateChange: onOffsetDateChange })))));
249
272
  });
250
273
  exports.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";