@alfalab/core-components-date-input 1.2.10 → 1.3.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 (49) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/Component.d.ts +16 -18
  3. package/dist/Component.js +65 -28
  4. package/dist/cssm/Component.d.ts +16 -18
  5. package/dist/cssm/Component.js +64 -27
  6. package/dist/cssm/index.js +4 -6
  7. package/dist/cssm/utils/format.d.ts +3 -1
  8. package/dist/cssm/utils/format.js +16 -0
  9. package/dist/cssm/utils/index.d.ts +0 -1
  10. package/dist/cssm/utils/index.js +2 -5
  11. package/dist/cssm/utils/native-supports.d.ts +1 -3
  12. package/dist/cssm/utils/native-supports.js +0 -4
  13. package/dist/esm/Component.d.ts +16 -18
  14. package/dist/esm/Component.js +67 -31
  15. package/dist/esm/index.css +4 -4
  16. package/dist/esm/index.js +4 -4
  17. package/dist/esm/utils/format.d.ts +3 -1
  18. package/dist/esm/utils/format.js +17 -3
  19. package/dist/esm/utils/index.d.ts +0 -1
  20. package/dist/esm/utils/index.js +2 -3
  21. package/dist/esm/utils/native-supports.d.ts +1 -3
  22. package/dist/esm/utils/native-supports.js +1 -3
  23. package/dist/index.css +4 -4
  24. package/dist/index.js +4 -6
  25. package/dist/modern/Component.d.ts +16 -18
  26. package/dist/modern/Component.js +67 -29
  27. package/dist/modern/index.css +4 -4
  28. package/dist/modern/index.js +4 -4
  29. package/dist/modern/utils/format.d.ts +3 -1
  30. package/dist/modern/utils/format.js +13 -3
  31. package/dist/modern/utils/index.d.ts +0 -1
  32. package/dist/modern/utils/index.js +2 -3
  33. package/dist/modern/utils/native-supports.d.ts +1 -3
  34. package/dist/modern/utils/native-supports.js +1 -3
  35. package/dist/utils/format.d.ts +3 -1
  36. package/dist/utils/format.js +16 -0
  37. package/dist/utils/index.d.ts +0 -1
  38. package/dist/utils/index.js +2 -5
  39. package/dist/utils/native-supports.d.ts +1 -3
  40. package/dist/utils/native-supports.js +0 -4
  41. package/package.json +5 -4
  42. package/dist/cssm/utils/date-correction-pipe.d.ts +0 -9
  43. package/dist/cssm/utils/date-correction-pipe.js +0 -59
  44. package/dist/esm/utils/date-correction-pipe.d.ts +0 -9
  45. package/dist/esm/utils/date-correction-pipe.js +0 -54
  46. package/dist/modern/utils/date-correction-pipe.d.ts +0 -9
  47. package/dist/modern/utils/date-correction-pipe.js +0 -52
  48. package/dist/utils/date-correction-pipe.d.ts +0 -9
  49. package/dist/utils/date-correction-pipe.js +0 -59
package/CHANGELOG.md CHANGED
@@ -3,6 +3,41 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.3.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-date-input@1.2.13...@alfalab/core-components-date-input@1.3.0) (2022-02-17)
7
+
8
+
9
+ ### Features
10
+
11
+ * **date-input:** add some improvements ([#971](https://github.com/alfa-laboratory/core-components/issues/971)) ([47756ca](https://github.com/alfa-laboratory/core-components/commit/47756ca1d4eea89f78ed7234e95c02e51dd72e49))
12
+
13
+
14
+
15
+
16
+
17
+ ## [1.2.13](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-date-input@1.2.12...@alfalab/core-components-date-input@1.2.13) (2022-02-15)
18
+
19
+ **Note:** Version bump only for package @alfalab/core-components-date-input
20
+
21
+
22
+
23
+
24
+
25
+ ## [1.2.12](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-date-input@1.2.11...@alfalab/core-components-date-input@1.2.12) (2022-02-09)
26
+
27
+ **Note:** Version bump only for package @alfalab/core-components-date-input
28
+
29
+
30
+
31
+
32
+
33
+ ## [1.2.11](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-date-input@1.2.10...@alfalab/core-components-date-input@1.2.11) (2022-02-03)
34
+
35
+ **Note:** Version bump only for package @alfalab/core-components-date-input
36
+
37
+
38
+
39
+
40
+
6
41
  ## [1.2.10](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-date-input@1.2.9...@alfalab/core-components-date-input@1.2.10) (2022-02-02)
7
42
 
8
43
  **Note:** Version bump only for package @alfalab/core-components-date-input
@@ -1,16 +1,8 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { ChangeEvent } from "react";
4
- import { MaskedInputProps } from "@alfalab/core-components-masked-input";
5
- type DateInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'mask' | 'onChange'> & {
6
- /**
7
- * Минимальный год, доступный для ввода
8
- */
9
- minYear?: number;
10
- /**
11
- * Максимальный год, доступный для ввода
12
- */
13
- maxYear?: number;
4
+ import { InputProps } from "@alfalab/core-components-input";
5
+ type DateInputProps = Omit<InputProps, 'onChange'> & {
14
6
  /**
15
7
  * Управление нативным режимом на мобильных устройствах
16
8
  */
@@ -22,16 +14,15 @@ type DateInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'mask' | 'onCha
22
14
  date: Date;
23
15
  value: string;
24
16
  }) => void;
25
- };
26
- declare const DateInput: React.ForwardRefExoticComponent<Pick<MaskedInputProps, "className" | "dataTestId" | "form" | "label" | "slot" | "style" | "title" | "pattern" | "children" | "leftAddons" | "rightAddons" | "size" | "block" | "colors" | "type" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "list" | "step" | "autoFocus" | "disabled" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "name" | "value" | "fieldClassName" | "labelClassName" | "addonsClassName" | "error" | "hint" | "bottomAddons" | "accept" | "alt" | "autoComplete" | "capture" | "checked" | "crossOrigin" | "height" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "readOnly" | "required" | "src" | "width" | "clear" | "success" | "inputClassName" | "focusedClassName" | "filledClassName" | "onClear" | "wrapperRef" | "keepCharPositions"> & {
27
- /**
28
- * Минимальный год, доступный для ввода
29
- */
30
- minYear?: number | undefined;
31
17
  /**
32
- * Максимальный год, доступный для ввода
18
+ * Обработчик окончания ввода
33
19
  */
34
- maxYear?: number | undefined;
20
+ onComplete?: (event: ChangeEvent<HTMLInputElement>, payload: {
21
+ date: Date;
22
+ value: string;
23
+ }) => void;
24
+ };
25
+ declare const DateInput: React.ForwardRefExoticComponent<Pick<InputProps, "dir" | "form" | "label" | "slot" | "style" | "title" | "type" | "value" | "className" | "dataTestId" | "pattern" | "children" | "leftAddons" | "rightAddons" | "size" | "block" | "colors" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "list" | "step" | "autoFocus" | "disabled" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "name" | "fieldClassName" | "labelClassName" | "addonsClassName" | "error" | "hint" | "bottomAddons" | "accept" | "alt" | "autoComplete" | "capture" | "checked" | "crossOrigin" | "height" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "readOnly" | "required" | "src" | "width" | "clear" | "success" | "inputClassName" | "focusedClassName" | "filledClassName" | "onClear" | "wrapperRef"> & {
35
26
  /**
36
27
  * Управление нативным режимом на мобильных устройствах
37
28
  */
@@ -43,5 +34,12 @@ declare const DateInput: React.ForwardRefExoticComponent<Pick<MaskedInputProps,
43
34
  date: Date;
44
35
  value: string;
45
36
  }) => void) | undefined;
37
+ /**
38
+ * Обработчик окончания ввода
39
+ */
40
+ onComplete?: ((event: React.ChangeEvent<HTMLInputElement>, payload: {
41
+ date: Date;
42
+ value: string;
43
+ }) => void) | undefined;
46
44
  } & React.RefAttributes<HTMLInputElement>>;
47
45
  export { DateInputProps, DateInput };
package/dist/Component.js CHANGED
@@ -3,15 +3,16 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var coreComponentsMaskedInput = require('@alfalab/core-components-masked-input');
6
+ var coreComponentsInput = require('@alfalab/core-components-input');
7
+ var mergeRefs = require('react-merge-refs');
7
8
  require('date-fns');
8
9
  var utils_format = require('./utils/format.js');
9
- var utils_dateCorrectionPipe = require('./utils/date-correction-pipe.js');
10
10
  var utils_nativeSupports = require('./utils/native-supports.js');
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
14
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
15
+ var mergeRefs__default = /*#__PURE__*/_interopDefaultLegacy(mergeRefs);
15
16
 
16
17
  /*! *****************************************************************************
17
18
  Copyright (c) Microsoft Corporation.
@@ -52,40 +53,76 @@ function __rest(s, e) {
52
53
  return t;
53
54
  }
54
55
 
55
- var styles = {"nativeInput":"date-input__nativeInput_qb4yv"};
56
+ var styles = {"nativeInput":"date-input__nativeInput_1692t"};
56
57
  require('./index.css')
57
58
 
58
- var DateInput = React__default['default'].forwardRef(function (_a, ref) {
59
- var maxYear = _a.maxYear, minYear = _a.minYear, _b = _a.mobileMode, mobileMode = _b === void 0 ? 'input' : _b, value = _a.value, defaultValue = _a.defaultValue, rightAddons = _a.rightAddons, onChange = _a.onChange, restProps = __rest(_a, ["maxYear", "minYear", "mobileMode", "value", "defaultValue", "rightAddons", "onChange"]);
60
- var uncontrolled = value === undefined;
61
- var shouldRenderNative = utils_nativeSupports.SUPPORTS_INPUT_TYPE_DATE && mobileMode === 'native';
62
- var _c = React.useState(defaultValue), stateValue = _c[0], setStateValue = _c[1];
63
- var inputValue = uncontrolled ? stateValue : value;
64
- var pipe = React.useMemo(function () {
65
- return utils_dateCorrectionPipe.createAutoCorrectedDatePipe({
66
- maxYear: maxYear,
67
- minYear: minYear,
68
- });
69
- }, [maxYear, minYear]);
70
- var changeHandler = React.useCallback(function (event, newValue, newDate) {
71
- if (uncontrolled) {
72
- setStateValue(newValue);
59
+ var DateInput = React.forwardRef(function (_a, ref) {
60
+ var _b = _a.mobileMode, mobileMode = _b === void 0 ? 'input' : _b, _c = _a.defaultValue, defaultValue = _c === void 0 ? '' : _c, rightAddons = _a.rightAddons, error = _a.error, propValue = _a.value, onBlur = _a.onBlur, onChange = _a.onChange, onComplete = _a.onComplete, restProps = __rest(_a, ["mobileMode", "defaultValue", "rightAddons", "error", "value", "onBlur", "onChange", "onComplete"]);
61
+ var inputRef = React.useRef(null);
62
+ var _d = React.useState(false), shouldRenderNative = _d[0], setShouldRenderNative = _d[1];
63
+ var _e = React.useState(propValue || defaultValue), value = _e[0], setValue = _e[1];
64
+ var _f = React.useState(!utils_format.isValid(propValue)), stateError = _f[0], setStateError = _f[1];
65
+ var handleValueValidity = React.useCallback(function (inputValue) {
66
+ // Валидируем незаполненное значение только если инпут не в фокусе (блюр, либо установка значения снаружи)
67
+ var validateIncomplete = inputRef.current && document.activeElement !== inputRef.current;
68
+ if (!inputValue || validateIncomplete || inputValue.length >= utils_format.DATE_MASK.length) {
69
+ setStateError(!utils_format.isValid(inputValue));
73
70
  }
74
- if (onChange) {
75
- onChange(event, { date: newDate, value: newValue });
76
- }
77
- }, [onChange, uncontrolled]);
71
+ }, []);
78
72
  var handleChange = React.useCallback(function (event) {
79
73
  var newValue = event.target.value;
80
- var newDate = utils_format.parseDateString(newValue);
81
- changeHandler(event, newValue, newDate);
82
- }, [changeHandler]);
74
+ // Позволяем вводить только цифры и точки
75
+ if (/[^\d.]/.test(newValue)) {
76
+ return;
77
+ }
78
+ var dots = newValue.match(/\./g);
79
+ // Не даем вводить больше, чем 2 точки
80
+ if (dots && dots.length > 2) {
81
+ return;
82
+ }
83
+ // Форматируем введенное значение (добавляем точки)
84
+ var formattedValue = utils_format.format(newValue);
85
+ var date = utils_format.parseDateString(formattedValue);
86
+ setValue(formattedValue);
87
+ if (onChange)
88
+ onChange(event, { date: date, value: formattedValue });
89
+ if (utils_format.isCompleteDateInput(formattedValue)) {
90
+ var valid = formattedValue.length > 0 && utils_format.isValid(formattedValue);
91
+ if (!valid)
92
+ return;
93
+ if (onComplete)
94
+ onComplete(event, { date: date, value: formattedValue });
95
+ }
96
+ }, [onChange, onComplete]);
83
97
  var handleNativeInputChange = React.useCallback(function (event) {
84
98
  var newDate = utils_format.parseDateString(event.target.value, utils_format.NATIVE_DATE_FORMAT);
85
99
  var newValue = event.target.value === '' ? '' : utils_format.formatDate(newDate);
86
- changeHandler(event, newValue, newDate);
87
- }, [changeHandler]);
88
- return (React__default['default'].createElement(coreComponentsMaskedInput.MaskedInput, __assign({}, restProps, { ref: ref, mask: utils_dateCorrectionPipe.mask, keepCharPositions: true, defaultValue: defaultValue, value: inputValue, onBeforeDisplay: pipe, onChange: handleChange, rightAddons: React__default['default'].createElement(React__default['default'].Fragment, null,
100
+ setValue(newValue);
101
+ if (onComplete)
102
+ onComplete(event, { date: newDate, value: newValue });
103
+ if (onChange)
104
+ onChange(event, { date: newDate, value: newValue });
105
+ }, [onComplete, onChange]);
106
+ var handleBlur = React.useCallback(function (event) {
107
+ handleValueValidity(value);
108
+ if (onBlur)
109
+ onBlur(event);
110
+ }, [handleValueValidity, onBlur, value]);
111
+ React.useEffect(function () {
112
+ if (mobileMode === 'native' && utils_nativeSupports.isInputDateSupported()) {
113
+ setShouldRenderNative(true);
114
+ }
115
+ }, [mobileMode]);
116
+ React.useEffect(function () {
117
+ if (typeof propValue !== 'undefined') {
118
+ setValue(propValue);
119
+ }
120
+ // eslint-disable-next-line react-hooks/exhaustive-deps
121
+ }, [propValue]);
122
+ React.useEffect(function () {
123
+ handleValueValidity(value);
124
+ }, [handleValueValidity, value]);
125
+ return (React__default['default'].createElement(coreComponentsInput.Input, __assign({}, restProps, { ref: mergeRefs__default['default']([ref, inputRef]), value: value, inputMode: 'decimal', pattern: '[0-9\\.]*', onChange: handleChange, onBlur: handleBlur, placeholder: '\u0414\u0414.\u041C\u041C.\u0413\u0413\u0413\u0413', error: error || stateError, rightAddons: React__default['default'].createElement(React__default['default'].Fragment, null,
89
126
  rightAddons,
90
127
  shouldRenderNative && (React__default['default'].createElement("input", { type: 'date', ref: ref, defaultValue: defaultValue, onChange: handleNativeInputChange, className: styles.nativeInput }))) })));
91
128
  });
@@ -1,16 +1,8 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { ChangeEvent } from "react";
4
- import { MaskedInputProps } from "@alfalab/core-components-masked-input";
5
- type DateInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'mask' | 'onChange'> & {
6
- /**
7
- * Минимальный год, доступный для ввода
8
- */
9
- minYear?: number;
10
- /**
11
- * Максимальный год, доступный для ввода
12
- */
13
- maxYear?: number;
4
+ import { InputProps } from "@alfalab/core-components-input";
5
+ type DateInputProps = Omit<InputProps, 'onChange'> & {
14
6
  /**
15
7
  * Управление нативным режимом на мобильных устройствах
16
8
  */
@@ -22,16 +14,15 @@ type DateInputProps = Omit<MaskedInputProps, 'onBeforeDisplay' | 'mask' | 'onCha
22
14
  date: Date;
23
15
  value: string;
24
16
  }) => void;
25
- };
26
- declare const DateInput: React.ForwardRefExoticComponent<Pick<MaskedInputProps, "className" | "dataTestId" | "form" | "label" | "slot" | "style" | "title" | "pattern" | "children" | "leftAddons" | "rightAddons" | "size" | "block" | "colors" | "type" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "list" | "step" | "autoFocus" | "disabled" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "name" | "value" | "fieldClassName" | "labelClassName" | "addonsClassName" | "error" | "hint" | "bottomAddons" | "accept" | "alt" | "autoComplete" | "capture" | "checked" | "crossOrigin" | "height" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "readOnly" | "required" | "src" | "width" | "clear" | "success" | "inputClassName" | "focusedClassName" | "filledClassName" | "onClear" | "wrapperRef" | "keepCharPositions"> & {
27
- /**
28
- * Минимальный год, доступный для ввода
29
- */
30
- minYear?: number | undefined;
31
17
  /**
32
- * Максимальный год, доступный для ввода
18
+ * Обработчик окончания ввода
33
19
  */
34
- maxYear?: number | undefined;
20
+ onComplete?: (event: ChangeEvent<HTMLInputElement>, payload: {
21
+ date: Date;
22
+ value: string;
23
+ }) => void;
24
+ };
25
+ declare const DateInput: React.ForwardRefExoticComponent<Pick<InputProps, "className" | "dataTestId" | "form" | "label" | "slot" | "style" | "title" | "pattern" | "children" | "leftAddons" | "rightAddons" | "size" | "block" | "colors" | "type" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "list" | "step" | "autoFocus" | "disabled" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "name" | "value" | "fieldClassName" | "labelClassName" | "addonsClassName" | "error" | "hint" | "bottomAddons" | "accept" | "alt" | "autoComplete" | "capture" | "checked" | "crossOrigin" | "height" | "max" | "maxLength" | "min" | "minLength" | "multiple" | "readOnly" | "required" | "src" | "width" | "clear" | "success" | "inputClassName" | "focusedClassName" | "filledClassName" | "onClear" | "wrapperRef"> & {
35
26
  /**
36
27
  * Управление нативным режимом на мобильных устройствах
37
28
  */
@@ -43,5 +34,12 @@ declare const DateInput: React.ForwardRefExoticComponent<Pick<MaskedInputProps,
43
34
  date: Date;
44
35
  value: string;
45
36
  }) => void) | undefined;
37
+ /**
38
+ * Обработчик окончания ввода
39
+ */
40
+ onComplete?: ((event: React.ChangeEvent<HTMLInputElement>, payload: {
41
+ date: Date;
42
+ value: string;
43
+ }) => void) | undefined;
46
44
  } & React.RefAttributes<HTMLInputElement>>;
47
45
  export { DateInputProps, DateInput };
@@ -3,16 +3,17 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var coreComponentsMaskedInput = require('@alfalab/core-components-masked-input/dist/cssm');
6
+ var coreComponentsInput = require('@alfalab/core-components-input/dist/cssm');
7
+ var mergeRefs = require('react-merge-refs');
7
8
  require('date-fns');
8
9
  var utils_format = require('./utils/format.js');
9
- var utils_dateCorrectionPipe = require('./utils/date-correction-pipe.js');
10
10
  var utils_nativeSupports = require('./utils/native-supports.js');
11
11
  var styles = require('./index.module.css');
12
12
 
13
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
14
14
 
15
15
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
16
+ var mergeRefs__default = /*#__PURE__*/_interopDefaultLegacy(mergeRefs);
16
17
  var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
17
18
 
18
19
  /*! *****************************************************************************
@@ -54,37 +55,73 @@ function __rest(s, e) {
54
55
  return t;
55
56
  }
56
57
 
57
- var DateInput = React__default['default'].forwardRef(function (_a, ref) {
58
- var maxYear = _a.maxYear, minYear = _a.minYear, _b = _a.mobileMode, mobileMode = _b === void 0 ? 'input' : _b, value = _a.value, defaultValue = _a.defaultValue, rightAddons = _a.rightAddons, onChange = _a.onChange, restProps = __rest(_a, ["maxYear", "minYear", "mobileMode", "value", "defaultValue", "rightAddons", "onChange"]);
59
- var uncontrolled = value === undefined;
60
- var shouldRenderNative = utils_nativeSupports.SUPPORTS_INPUT_TYPE_DATE && mobileMode === 'native';
61
- var _c = React.useState(defaultValue), stateValue = _c[0], setStateValue = _c[1];
62
- var inputValue = uncontrolled ? stateValue : value;
63
- var pipe = React.useMemo(function () {
64
- return utils_dateCorrectionPipe.createAutoCorrectedDatePipe({
65
- maxYear: maxYear,
66
- minYear: minYear,
67
- });
68
- }, [maxYear, minYear]);
69
- var changeHandler = React.useCallback(function (event, newValue, newDate) {
70
- if (uncontrolled) {
71
- setStateValue(newValue);
58
+ var DateInput = React.forwardRef(function (_a, ref) {
59
+ var _b = _a.mobileMode, mobileMode = _b === void 0 ? 'input' : _b, _c = _a.defaultValue, defaultValue = _c === void 0 ? '' : _c, rightAddons = _a.rightAddons, error = _a.error, propValue = _a.value, onBlur = _a.onBlur, onChange = _a.onChange, onComplete = _a.onComplete, restProps = __rest(_a, ["mobileMode", "defaultValue", "rightAddons", "error", "value", "onBlur", "onChange", "onComplete"]);
60
+ var inputRef = React.useRef(null);
61
+ var _d = React.useState(false), shouldRenderNative = _d[0], setShouldRenderNative = _d[1];
62
+ var _e = React.useState(propValue || defaultValue), value = _e[0], setValue = _e[1];
63
+ var _f = React.useState(!utils_format.isValid(propValue)), stateError = _f[0], setStateError = _f[1];
64
+ var handleValueValidity = React.useCallback(function (inputValue) {
65
+ // Валидируем незаполненное значение только если инпут не в фокусе (блюр, либо установка значения снаружи)
66
+ var validateIncomplete = inputRef.current && document.activeElement !== inputRef.current;
67
+ if (!inputValue || validateIncomplete || inputValue.length >= utils_format.DATE_MASK.length) {
68
+ setStateError(!utils_format.isValid(inputValue));
72
69
  }
73
- if (onChange) {
74
- onChange(event, { date: newDate, value: newValue });
75
- }
76
- }, [onChange, uncontrolled]);
70
+ }, []);
77
71
  var handleChange = React.useCallback(function (event) {
78
72
  var newValue = event.target.value;
79
- var newDate = utils_format.parseDateString(newValue);
80
- changeHandler(event, newValue, newDate);
81
- }, [changeHandler]);
73
+ // Позволяем вводить только цифры и точки
74
+ if (/[^\d.]/.test(newValue)) {
75
+ return;
76
+ }
77
+ var dots = newValue.match(/\./g);
78
+ // Не даем вводить больше, чем 2 точки
79
+ if (dots && dots.length > 2) {
80
+ return;
81
+ }
82
+ // Форматируем введенное значение (добавляем точки)
83
+ var formattedValue = utils_format.format(newValue);
84
+ var date = utils_format.parseDateString(formattedValue);
85
+ setValue(formattedValue);
86
+ if (onChange)
87
+ onChange(event, { date: date, value: formattedValue });
88
+ if (utils_format.isCompleteDateInput(formattedValue)) {
89
+ var valid = formattedValue.length > 0 && utils_format.isValid(formattedValue);
90
+ if (!valid)
91
+ return;
92
+ if (onComplete)
93
+ onComplete(event, { date: date, value: formattedValue });
94
+ }
95
+ }, [onChange, onComplete]);
82
96
  var handleNativeInputChange = React.useCallback(function (event) {
83
97
  var newDate = utils_format.parseDateString(event.target.value, utils_format.NATIVE_DATE_FORMAT);
84
98
  var newValue = event.target.value === '' ? '' : utils_format.formatDate(newDate);
85
- changeHandler(event, newValue, newDate);
86
- }, [changeHandler]);
87
- return (React__default['default'].createElement(coreComponentsMaskedInput.MaskedInput, __assign({}, restProps, { ref: ref, mask: utils_dateCorrectionPipe.mask, keepCharPositions: true, defaultValue: defaultValue, value: inputValue, onBeforeDisplay: pipe, onChange: handleChange, rightAddons: React__default['default'].createElement(React__default['default'].Fragment, null,
99
+ setValue(newValue);
100
+ if (onComplete)
101
+ onComplete(event, { date: newDate, value: newValue });
102
+ if (onChange)
103
+ onChange(event, { date: newDate, value: newValue });
104
+ }, [onComplete, onChange]);
105
+ var handleBlur = React.useCallback(function (event) {
106
+ handleValueValidity(value);
107
+ if (onBlur)
108
+ onBlur(event);
109
+ }, [handleValueValidity, onBlur, value]);
110
+ React.useEffect(function () {
111
+ if (mobileMode === 'native' && utils_nativeSupports.isInputDateSupported()) {
112
+ setShouldRenderNative(true);
113
+ }
114
+ }, [mobileMode]);
115
+ React.useEffect(function () {
116
+ if (typeof propValue !== 'undefined') {
117
+ setValue(propValue);
118
+ }
119
+ // eslint-disable-next-line react-hooks/exhaustive-deps
120
+ }, [propValue]);
121
+ React.useEffect(function () {
122
+ handleValueValidity(value);
123
+ }, [handleValueValidity, value]);
124
+ return (React__default['default'].createElement(coreComponentsInput.Input, __assign({}, restProps, { ref: mergeRefs__default['default']([ref, inputRef]), value: value, inputMode: 'decimal', pattern: '[0-9\\.]*', onChange: handleChange, onBlur: handleBlur, placeholder: '\u0414\u0414.\u041C\u041C.\u0413\u0413\u0413\u0413', error: error || stateError, rightAddons: React__default['default'].createElement(React__default['default'].Fragment, null,
88
125
  rightAddons,
89
126
  shouldRenderNative && (React__default['default'].createElement("input", { type: 'date', ref: ref, defaultValue: defaultValue, onChange: handleNativeInputChange, className: styles__default['default'].nativeInput }))) })));
90
127
  });
@@ -4,10 +4,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var Component = require('./Component.js');
6
6
  require('react');
7
- require('@alfalab/core-components-masked-input/dist/cssm');
7
+ require('@alfalab/core-components-input/dist/cssm');
8
+ require('react-merge-refs');
8
9
  require('date-fns');
9
10
  var utils_format = require('./utils/format.js');
10
- var utils_dateCorrectionPipe = require('./utils/date-correction-pipe.js');
11
11
  var utils_nativeSupports = require('./utils/native-supports.js');
12
12
  require('./index.module.css');
13
13
 
@@ -17,11 +17,9 @@ exports.DateInput = Component.DateInput;
17
17
  exports.DATE_FORMAT = utils_format.DATE_FORMAT;
18
18
  exports.DATE_MASK = utils_format.DATE_MASK;
19
19
  exports.NATIVE_DATE_FORMAT = utils_format.NATIVE_DATE_FORMAT;
20
+ exports.format = utils_format.format;
20
21
  exports.formatDate = utils_format.formatDate;
21
22
  exports.isCompleteDateInput = utils_format.isCompleteDateInput;
23
+ exports.isValid = utils_format.isValid;
22
24
  exports.parseDateString = utils_format.parseDateString;
23
- exports.createAutoCorrectedDatePipe = utils_dateCorrectionPipe.createAutoCorrectedDatePipe;
24
- exports.mask = utils_dateCorrectionPipe.mask;
25
- exports.IS_BROWSER = utils_nativeSupports.IS_BROWSER;
26
- exports.SUPPORTS_INPUT_TYPE_DATE = utils_nativeSupports.SUPPORTS_INPUT_TYPE_DATE;
27
25
  exports.isInputDateSupported = utils_nativeSupports.isInputDateSupported;
@@ -4,4 +4,6 @@ declare const DATE_MASK: (string | RegExp)[];
4
4
  declare const isCompleteDateInput: (input: string) => boolean;
5
5
  declare const formatDate: (date: number | Date, dateFormat?: string) => string;
6
6
  declare const parseDateString: (value: string, dateFormat?: string) => Date;
7
- export { DATE_FORMAT, NATIVE_DATE_FORMAT, DATE_MASK, isCompleteDateInput, formatDate, parseDateString };
7
+ declare const isValid: (inputValue?: string | undefined) => boolean;
8
+ declare const format: (value: string) => string;
9
+ export { DATE_FORMAT, NATIVE_DATE_FORMAT, DATE_MASK, isCompleteDateInput, formatDate, parseDateString, isValid, format };
@@ -16,10 +16,26 @@ var parseDateString = function (value, dateFormat) {
16
16
  if (dateFormat === void 0) { dateFormat = DATE_FORMAT; }
17
17
  return dateFns.parse(value, dateFormat, new Date());
18
18
  };
19
+ var isValid = function (inputValue) {
20
+ return !inputValue || (isCompleteDateInput(inputValue) && dateFns.isValid(parseDateString(inputValue)));
21
+ };
22
+ var format = function (value) {
23
+ return value
24
+ .replace(/^(\d\d)(\d)$/, '$1.$2') // 121 => 12.1
25
+ .replace(/^(\d\d)\.(\d\d)(\d)$/, '$1.$2.$3') // 12.122 => 12.12.2
26
+ .replace(/^(\d\d)\d\.(.*)/, '$1.$2') // 123.12.2005 => 12.12.2005
27
+ .replace(/^(\d\d\.\d\d)\d\.(.*)/, '$1.$2') // 12.123.2005 => 12.12.2005
28
+ .replace(/^(\d\d\.\d\d\.\d\d\d\d).*/, '$1') // 12.12.20056 => 12.12.2005
29
+ .replace(/\.$/, '') // 12. => 12
30
+ .replace(/^(\d\d\.\d\d)(\d\d\d\d)/, '$1.$2') // 12.122005 => 12.12.2005
31
+ .replace(/^(\d\d)(\d\d\.\d\d\d\d)/, '$1.$2');
32
+ }; // 1212.2005 => 12.12.2005
19
33
 
20
34
  exports.DATE_FORMAT = DATE_FORMAT;
21
35
  exports.DATE_MASK = DATE_MASK;
22
36
  exports.NATIVE_DATE_FORMAT = NATIVE_DATE_FORMAT;
37
+ exports.format = format;
23
38
  exports.formatDate = formatDate;
24
39
  exports.isCompleteDateInput = isCompleteDateInput;
40
+ exports.isValid = isValid;
25
41
  exports.parseDateString = parseDateString;
@@ -1,3 +1,2 @@
1
1
  export * from "./format";
2
- export * from "./date-correction-pipe";
3
2
  export * from "./native-supports";
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  require('date-fns');
6
6
  var utils_format = require('./format.js');
7
- var utils_dateCorrectionPipe = require('./date-correction-pipe.js');
8
7
  var utils_nativeSupports = require('./native-supports.js');
9
8
 
10
9
 
@@ -12,11 +11,9 @@ var utils_nativeSupports = require('./native-supports.js');
12
11
  exports.DATE_FORMAT = utils_format.DATE_FORMAT;
13
12
  exports.DATE_MASK = utils_format.DATE_MASK;
14
13
  exports.NATIVE_DATE_FORMAT = utils_format.NATIVE_DATE_FORMAT;
14
+ exports.format = utils_format.format;
15
15
  exports.formatDate = utils_format.formatDate;
16
16
  exports.isCompleteDateInput = utils_format.isCompleteDateInput;
17
+ exports.isValid = utils_format.isValid;
17
18
  exports.parseDateString = utils_format.parseDateString;
18
- exports.createAutoCorrectedDatePipe = utils_dateCorrectionPipe.createAutoCorrectedDatePipe;
19
- exports.mask = utils_dateCorrectionPipe.mask;
20
- exports.IS_BROWSER = utils_nativeSupports.IS_BROWSER;
21
- exports.SUPPORTS_INPUT_TYPE_DATE = utils_nativeSupports.SUPPORTS_INPUT_TYPE_DATE;
22
19
  exports.isInputDateSupported = utils_nativeSupports.isInputDateSupported;
@@ -1,7 +1,5 @@
1
- declare const IS_BROWSER: boolean;
2
- declare const SUPPORTS_INPUT_TYPE_DATE: boolean;
3
1
  /**
4
2
  * Возвращает `true`, если поддерживается `input[type="date"]`
5
3
  */
6
4
  declare function isInputDateSupported(): boolean;
7
- export { IS_BROWSER, SUPPORTS_INPUT_TYPE_DATE, isInputDateSupported };
5
+ export { isInputDateSupported };
@@ -2,8 +2,6 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var IS_BROWSER = typeof window !== 'undefined';
6
- var SUPPORTS_INPUT_TYPE_DATE = IS_BROWSER && isInputDateSupported();
7
5
  /**
8
6
  * Возвращает `true`, если поддерживается `input[type="date"]`
9
7
  */
@@ -15,6 +13,4 @@ function isInputDateSupported() {
15
13
  return input.value !== value;
16
14
  }
17
15
 
18
- exports.IS_BROWSER = IS_BROWSER;
19
- exports.SUPPORTS_INPUT_TYPE_DATE = SUPPORTS_INPUT_TYPE_DATE;
20
16
  exports.isInputDateSupported = isInputDateSupported;