@skbkontur/react-ui 6.1.4 → 6.1.6-00fed.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.
- package/CHANGELOG.md +11 -0
- package/components/Button/Button.classes.d.ts +8 -0
- package/components/Button/Button.classes.js +10 -0
- package/components/Button/Button.classes.js.map +1 -0
- package/components/Button/Button.mixins.js +1 -1
- package/components/Button/Button.mixins.js.map +1 -1
- package/components/Button/Button.styles.d.ts +2 -8
- package/components/Button/Button.styles.js +3 -9
- package/components/Button/Button.styles.js.map +1 -1
- package/components/Calendar/Calendar.d.ts +2 -8
- package/components/Calendar/Calendar.js +2 -7
- package/components/Calendar/Calendar.js.map +1 -1
- package/components/Calendar/CalendarDay.js +1 -1
- package/components/Calendar/CalendarDay.js.map +1 -1
- package/components/Calendar/MonthView.js +1 -1
- package/components/Calendar/MonthView.js.map +1 -1
- package/components/Calendar/MonthViewModel.js +1 -2
- package/components/Calendar/MonthViewModel.js.map +1 -1
- package/components/Calendar/tids.d.ts +7 -0
- package/components/Calendar/tids.js +8 -0
- package/components/Calendar/tids.js.map +1 -0
- package/components/FileUploader/FileUploaderFile.d.ts +1 -1
- package/components/FileUploader/FileUploaderFile.js +1 -1
- package/components/FileUploader/FileUploaderFile.js.map +1 -1
- package/components/FxInput/FxInput.d.ts +1 -1
- package/components/FxInput/FxInput.js.map +1 -1
- package/components/MaskedInput/MaskedInput.d.ts +6 -2
- package/components/MaskedInput/MaskedInput.js +10 -126
- package/components/MaskedInput/MaskedInput.js.map +1 -1
- package/components/MaskedInput/MaskedInputLegacy.d.ts +3 -0
- package/components/MaskedInput/MaskedInputLegacy.js +142 -0
- package/components/MaskedInput/MaskedInputLegacy.js.map +1 -0
- package/components/MaskedInput/index.d.ts +1 -0
- package/components/MaskedInput/index.js +1 -0
- package/components/MaskedInput/index.js.map +1 -1
- package/components/MaskedInputV2/MaskedInputV2.d.ts +62 -0
- package/components/MaskedInputV2/MaskedInputV2.helpers.d.ts +9 -0
- package/components/MaskedInputV2/MaskedInputV2.helpers.js +17 -0
- package/components/MaskedInputV2/MaskedInputV2.helpers.js.map +1 -0
- package/components/MaskedInputV2/MaskedInputV2.js +307 -0
- package/components/MaskedInputV2/MaskedInputV2.js.map +1 -0
- package/components/MaskedInputV2/MaskedInputV2.phone.d.ts +28 -0
- package/components/MaskedInputV2/MaskedInputV2.phone.js +38 -0
- package/components/MaskedInputV2/MaskedInputV2.phone.js.map +1 -0
- package/components/MaskedInputV2/MaskedInputV2.styles.d.ts +7 -0
- package/components/MaskedInputV2/MaskedInputV2.styles.js +19 -0
- package/components/MaskedInputV2/MaskedInputV2.styles.js.map +1 -0
- package/components/MaskedInputV2/index.d.ts +2 -0
- package/components/MaskedInputV2/index.js +3 -0
- package/components/MaskedInputV2/index.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskOverlay.d.ts +19 -0
- package/components/MaskedInputV2/internal/MaskOverlay.js +54 -0
- package/components/MaskedInputV2/internal/MaskOverlay.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskedCore.d.ts +8 -0
- package/components/MaskedInputV2/internal/MaskedCore.js +186 -0
- package/components/MaskedInputV2/internal/MaskedCore.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskedCore.types.d.ts +37 -0
- package/components/MaskedInputV2/internal/MaskedCore.types.js +2 -0
- package/components/MaskedInputV2/internal/MaskedCore.types.js.map +1 -0
- package/components/MaskedInputV2/internal/MaskedInternal.styles.d.ts +15 -0
- package/components/MaskedInputV2/internal/MaskedInternal.styles.js +34 -0
- package/components/MaskedInputV2/internal/MaskedInternal.styles.js.map +1 -0
- package/components/MaskedInputV2/internal/buildSlotMap.d.ts +11 -0
- package/components/MaskedInputV2/internal/buildSlotMap.js +37 -0
- package/components/MaskedInputV2/internal/buildSlotMap.js.map +1 -0
- package/components/MaskedInputV2/internal/computeMaskAlignPadding.d.ts +6 -0
- package/components/MaskedInputV2/internal/computeMaskAlignPadding.js +47 -0
- package/components/MaskedInputV2/internal/computeMaskAlignPadding.js.map +1 -0
- package/components/MaskedInputV2/internal/computePasteMaskedCursor.d.ts +3 -0
- package/components/MaskedInputV2/internal/computePasteMaskedCursor.js +11 -0
- package/components/MaskedInputV2/internal/computePasteMaskedCursor.js.map +1 -0
- package/components/MaskedInputV2/internal/extractRaw.d.ts +10 -0
- package/components/MaskedInputV2/internal/extractRaw.js +16 -0
- package/components/MaskedInputV2/internal/extractRaw.js.map +1 -0
- package/components/MaskedInputV2/internal/findNearestRawLeft.d.ts +10 -0
- package/components/MaskedInputV2/internal/findNearestRawLeft.js +18 -0
- package/components/MaskedInputV2/internal/findNearestRawLeft.js.map +1 -0
- package/components/MaskedInputV2/internal/helpers.d.ts +8 -0
- package/components/MaskedInputV2/internal/helpers.js +9 -0
- package/components/MaskedInputV2/internal/helpers.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreClipboard.d.ts +37 -0
- package/components/MaskedInputV2/internal/maskedCoreClipboard.js +52 -0
- package/components/MaskedInputV2/internal/maskedCoreClipboard.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreDeletion.d.ts +28 -0
- package/components/MaskedInputV2/internal/maskedCoreDeletion.js +70 -0
- package/components/MaskedInputV2/internal/maskedCoreDeletion.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreInputChange.d.ts +38 -0
- package/components/MaskedInputV2/internal/maskedCoreInputChange.js +49 -0
- package/components/MaskedInputV2/internal/maskedCoreInputChange.js.map +1 -0
- package/components/MaskedInputV2/internal/maskedCoreNavigation.d.ts +13 -0
- package/components/MaskedInputV2/internal/maskedCoreNavigation.js +79 -0
- package/components/MaskedInputV2/internal/maskedCoreNavigation.js.map +1 -0
- package/components/MaskedInputV2/internal/measureInputTextWidth.d.ts +2 -0
- package/components/MaskedInputV2/internal/measureInputTextWidth.js +30 -0
- package/components/MaskedInputV2/internal/measureInputTextWidth.js.map +1 -0
- package/components/MaskedInputV2/internal/setMaskInputSelectionRange.d.ts +2 -0
- package/components/MaskedInputV2/internal/setMaskInputSelectionRange.js +25 -0
- package/components/MaskedInputV2/internal/setMaskInputSelectionRange.js.map +1 -0
- package/components/MaskedInputV2/internal/showOverlay.d.ts +3 -0
- package/components/MaskedInputV2/internal/showOverlay.js +16 -0
- package/components/MaskedInputV2/internal/showOverlay.js.map +1 -0
- package/components/MaskedInputV2/internal/stripMaskChars.d.ts +11 -0
- package/components/MaskedInputV2/internal/stripMaskChars.js +20 -0
- package/components/MaskedInputV2/internal/stripMaskChars.js.map +1 -0
- package/components/MaskedInputV2/internal/types.d.ts +74 -0
- package/components/MaskedInputV2/internal/types.js +2 -0
- package/components/MaskedInputV2/internal/types.js.map +1 -0
- package/components/MaskedInputV2/internal/useInputOverflow.d.ts +4 -0
- package/components/MaskedInputV2/internal/useInputOverflow.js +34 -0
- package/components/MaskedInputV2/internal/useInputOverflow.js.map +1 -0
- package/components/MaskedInputV2/internal/useMaskAlignPadding.d.ts +2 -0
- package/components/MaskedInputV2/internal/useMaskAlignPadding.js +33 -0
- package/components/MaskedInputV2/internal/useMaskAlignPadding.js.map +1 -0
- package/components/MaskedInputV2/internal/useMaskEngine.d.ts +42 -0
- package/components/MaskedInputV2/internal/useMaskEngine.js +128 -0
- package/components/MaskedInputV2/internal/useMaskEngine.js.map +1 -0
- package/components/MaskedInputV2/internal/useMaskedCoreHandlers.d.ts +34 -0
- package/components/MaskedInputV2/internal/useMaskedCoreHandlers.js +335 -0
- package/components/MaskedInputV2/internal/useMaskedCoreHandlers.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-input-mask-element.d.ts +16 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-input-mask-element.js +59 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-input-mask-element.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-mask-element.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-mask-element.js +106 -0
- package/components/MaskedInputV2/react-imask/imask/controls/html-mask-element.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input-history.d.ts +17 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input-history.js +49 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input-history.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input.d.ts +95 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input.js +420 -0
- package/components/MaskedInputV2/react-imask/imask/controls/input.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/controls/mask-element.d.ts +30 -0
- package/components/MaskedInputV2/react-imask/imask/controls/mask-element.js +59 -0
- package/components/MaskedInputV2/react-imask/imask/controls/mask-element.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/action-details.d.ts +30 -0
- package/components/MaskedInputV2/react-imask/imask/core/action-details.js +100 -0
- package/components/MaskedInputV2/react-imask/imask/core/action-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/change-details.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/core/change-details.js +46 -0
- package/components/MaskedInputV2/react-imask/imask/core/change-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/continuous-tail-details.d.ts +21 -0
- package/components/MaskedInputV2/react-imask/imask/core/continuous-tail-details.js +52 -0
- package/components/MaskedInputV2/react-imask/imask/core/continuous-tail-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/holder.d.ts +34 -0
- package/components/MaskedInputV2/react-imask/imask/core/holder.js +38 -0
- package/components/MaskedInputV2/react-imask/imask/core/holder.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/tail-details.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/core/tail-details.js +2 -0
- package/components/MaskedInputV2/react-imask/imask/core/tail-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/core/utils.d.ts +24 -0
- package/components/MaskedInputV2/react-imask/imask/core/utils.js +100 -0
- package/components/MaskedInputV2/react-imask/imask/core/utils.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/imask.d.ts +5 -0
- package/components/MaskedInputV2/react-imask/imask/imask.js +7 -0
- package/components/MaskedInputV2/react-imask/imask/imask.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/index.d.ts +17 -0
- package/components/MaskedInputV2/react-imask/imask/index.js +16 -0
- package/components/MaskedInputV2/react-imask/imask/index.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/base.d.ts +114 -0
- package/components/MaskedInputV2/react-imask/imask/masked/base.js +411 -0
- package/components/MaskedInputV2/react-imask/imask/masked/base.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/create.d.ts +14 -0
- package/components/MaskedInputV2/react-imask/imask/masked/create.js +11 -0
- package/components/MaskedInputV2/react-imask/imask/masked/create.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/factory.d.ts +62 -0
- package/components/MaskedInputV2/react-imask/imask/masked/factory.js +107 -0
- package/components/MaskedInputV2/react-imask/imask/masked/factory.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/pattern.d.ts +101 -0
- package/components/MaskedInputV2/react-imask/imask/masked/pattern.js +549 -0
- package/components/MaskedInputV2/react-imask/imask/masked/pattern.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/block.d.ts +30 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/block.js +2 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/block.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/chunk-tail-details.d.ts +20 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/chunk-tail-details.js +182 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/chunk-tail-details.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/cursor.d.ts +31 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/cursor.js +163 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/cursor.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/fixed-definition.d.ts +42 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/fixed-definition.js +158 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/fixed-definition.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/input-definition.d.ts +56 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/input-definition.js +185 -0
- package/components/MaskedInputV2/react-imask/imask/masked/patterns/input-definition.js.map +1 -0
- package/components/MaskedInputV2/react-imask/imask/masked/regexp.d.ts +17 -0
- package/components/MaskedInputV2/react-imask/imask/masked/regexp.js +36 -0
- package/components/MaskedInputV2/react-imask/imask/masked/regexp.js.map +1 -0
- package/components/MaskedInputV2/react-imask/index.d.ts +3 -0
- package/components/MaskedInputV2/react-imask/index.js +4 -0
- package/components/MaskedInputV2/react-imask/index.js.map +1 -0
- package/components/MaskedInputV2/react-imask/input.d.ts +8 -0
- package/components/MaskedInputV2/react-imask/input.js +35 -0
- package/components/MaskedInputV2/react-imask/input.js.map +1 -0
- package/components/MaskedInputV2/react-imask/mixin.d.ts +31 -0
- package/components/MaskedInputV2/react-imask/mixin.js +246 -0
- package/components/MaskedInputV2/react-imask/mixin.js.map +1 -0
- package/components/MenuItem/MenuItem.mixins.d.ts +1 -0
- package/components/MenuItem/MenuItem.mixins.js +6 -1
- package/components/MenuItem/MenuItem.mixins.js.map +1 -1
- package/components/MenuItem/MenuItem.styles.d.ts +2 -1
- package/components/MenuItem/MenuItem.styles.js +2 -7
- package/components/MenuItem/MenuItem.styles.js.map +1 -1
- package/components/MiniModal/MiniModal.d.ts +2 -16
- package/components/MiniModal/MiniModal.js +2 -16
- package/components/MiniModal/MiniModal.js.map +1 -1
- package/components/MiniModal/MiniModalBody.js +1 -1
- package/components/MiniModal/MiniModalBody.js.map +1 -1
- package/components/MiniModal/MiniModalFooter.js +1 -1
- package/components/MiniModal/MiniModalFooter.js.map +1 -1
- package/components/MiniModal/MiniModalHeader.js +1 -1
- package/components/MiniModal/MiniModalHeader.js.map +1 -1
- package/components/MiniModal/MiniModalIndent.js +1 -1
- package/components/MiniModal/MiniModalIndent.js.map +1 -1
- package/components/MiniModal/tids.d.ts +7 -0
- package/components/MiniModal/tids.js +8 -0
- package/components/MiniModal/tids.js.map +1 -0
- package/components/Modal/Modal.constants.d.ts +9 -0
- package/components/Modal/Modal.constants.js +10 -0
- package/components/Modal/Modal.constants.js.map +1 -0
- package/components/Modal/Modal.d.ts +2 -15
- package/components/Modal/Modal.js +2 -14
- package/components/Modal/Modal.js.map +1 -1
- package/components/Modal/ModalBody.js +1 -1
- package/components/Modal/ModalBody.js.map +1 -1
- package/components/Modal/ModalClose.js +1 -1
- package/components/Modal/ModalClose.js.map +1 -1
- package/components/Switcher/Switcher.d.ts +3 -3
- package/components/Switcher/Switcher.js +1 -1
- package/components/Switcher/Switcher.js.map +1 -1
- package/components/Tabs/Tab.d.ts +4 -5
- package/components/Tabs/Tab.js +0 -1
- package/components/Tabs/Tab.js.map +1 -1
- package/components/Tabs/Tabs.d.ts +2 -2
- package/components/Tabs/Tabs.js +1 -1
- package/components/Tabs/Tabs.js.map +1 -1
- package/components/Toggle/Toggle.classes.d.ts +8 -0
- package/components/Toggle/Toggle.classes.js +10 -0
- package/components/Toggle/Toggle.classes.js.map +1 -0
- package/components/Toggle/Toggle.mixins.js +1 -1
- package/components/Toggle/Toggle.mixins.js.map +1 -1
- package/components/Toggle/Toggle.styles.d.ts +2 -8
- package/components/Toggle/Toggle.styles.js +3 -9
- package/components/Toggle/Toggle.styles.js.map +1 -1
- package/components/Token/Token.d.ts +1 -1
- package/components/Token/Token.js +1 -1
- package/components/Token/Token.js.map +1 -1
- package/components/TokenInput/TokenInput.d.ts +1 -1
- package/components/TokenInput/TokenInput.js +1 -1
- package/components/TokenInput/TokenInput.js.map +1 -1
- package/lib/date/InternalDateValidator.js +1 -2
- package/lib/date/InternalDateValidator.js.map +1 -1
- package/lib/events/keyboard/KeyboardEventCodes.d.ts +2 -0
- package/lib/events/keyboard/KeyboardEventCodes.js +2 -0
- package/lib/events/keyboard/KeyboardEventCodes.js.map +1 -1
- package/lib/events/keyboard/KeyboardMapKeys.js +2 -0
- package/lib/events/keyboard/KeyboardMapKeys.js.map +1 -1
- package/lib/events/keyboard/identifiers.d.ts +2 -0
- package/lib/events/keyboard/identifiers.js +6 -0
- package/lib/events/keyboard/identifiers.js.map +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +1 -0
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js +1 -0
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
13
|
+
var t = {};
|
|
14
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
15
|
+
t[p] = s[p];
|
|
16
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
17
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
18
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
19
|
+
t[p[i]] = s[p[i]];
|
|
20
|
+
}
|
|
21
|
+
return t;
|
|
22
|
+
};
|
|
23
|
+
import React, { useContext, useEffect, useImperativeHandle, useRef, useState } from 'react';
|
|
24
|
+
import { isKeyBackspace, isKeyDelete } from '../../lib/events/keyboard/identifiers.js';
|
|
25
|
+
import { forwardRefAndName } from '../../lib/forwardRefAndName.js';
|
|
26
|
+
import { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';
|
|
27
|
+
import { ThemeContext } from '../../lib/theming/ThemeContext.js';
|
|
28
|
+
import { Input as InputComponent } from '../Input/index.js';
|
|
29
|
+
import { ColorableInputElement } from './ColorableInputElement/index.js';
|
|
30
|
+
import { FixedIMaskInput } from './FixedIMaskInput.js';
|
|
31
|
+
import { getDefinitions, getMaskChar } from './MaskedInput.helpers.js';
|
|
32
|
+
import { getStyles, globalClasses } from './MaskedInput.styles.js';
|
|
33
|
+
export var MaskedInputLegacy = forwardRefAndName('MaskedInputLegacy', function MaskedInputLegacy(props, ref) {
|
|
34
|
+
var mask = props.mask, maskChar = props.maskChar, formatChars = props.formatChars, _a = props.alwaysShowMask, alwaysShowMask = _a === void 0 ? false : _a, _b = props.colored, colored = _b === void 0 ? true : _b, _c = props.imaskProps, customIMaskProps = _c === void 0 ? {} : _c, _d = props.unmask, unmask = _d === void 0 ? false : _d, onValueChange = props.onValueChange, onUnexpectedInput = props.onUnexpectedInput, onChange = props.onChange, onBeforePasteValue = props.onBeforePasteValue, element = props.element, className = props.className,
|
|
35
|
+
// @ts-expect-error: могут передавать игнорируя ошибку
|
|
36
|
+
maxLength = props.maxLength, inputProps = __rest(props, ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onChange", "onBeforePasteValue", "element", "className", "maxLength"]);
|
|
37
|
+
var theme = useContext(ThemeContext);
|
|
38
|
+
var cx = useEmotion().cx;
|
|
39
|
+
var styles = useStyles(getStyles);
|
|
40
|
+
var inputRef = useRef(null);
|
|
41
|
+
var _e = useState(false), focused = _e[0], setFocused = _e[1];
|
|
42
|
+
var prevValue = useRef(props.value || String(props.defaultValue) || '');
|
|
43
|
+
var prevSelectionStart = useRef(null);
|
|
44
|
+
useImperativeHandle(ref, function () {
|
|
45
|
+
return inputRef.current &&
|
|
46
|
+
Object.assign(inputRef.current, {
|
|
47
|
+
selectAll: function () {
|
|
48
|
+
var _a, _b;
|
|
49
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
50
|
+
(_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.delaySelectAll();
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}, []);
|
|
54
|
+
useEffect(function () {
|
|
55
|
+
var _a;
|
|
56
|
+
// Для корректной работы onUnexpectedInput надо знать предыдущий value,
|
|
57
|
+
// но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.
|
|
58
|
+
// Поэтому актуальный value при монтировании надо получать вручную
|
|
59
|
+
if ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input) {
|
|
60
|
+
prevValue.current = inputRef.current.input.value;
|
|
61
|
+
prevSelectionStart.current = inputRef.current.input.selectionStart;
|
|
62
|
+
}
|
|
63
|
+
}, []);
|
|
64
|
+
var imaskProps = getCompatibleIMaskProps();
|
|
65
|
+
return (React.createElement(InputComponent, __assign({ ref: inputRef }, inputProps, { onFocus: handleFocus, onBlur: handleBlur, onInput: handleInput, onKeyDown: handleKeyDown, onPaste: handlePaste, className: cx(globalClasses.root, className, styles.root(theme)), element: colored ? (React.createElement(ColorableInputElement, { showOnFocus: false, alwaysShowMask: alwaysShowMask },
|
|
66
|
+
React.createElement(FixedIMaskInput, __assign({}, imaskProps, { onAccept: handleAccept })))) : (React.createElement(FixedIMaskInput, __assign({}, imaskProps, { onAccept: handleAccept }))) })));
|
|
67
|
+
function handlePaste(event) {
|
|
68
|
+
var _a, _b, _c;
|
|
69
|
+
if (onBeforePasteValue && onValueChange) {
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(onBeforePasteValue((_b = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData('text')) !== null && _b !== void 0 ? _b : ''));
|
|
72
|
+
}
|
|
73
|
+
(_c = props.onPaste) === null || _c === void 0 ? void 0 : _c.call(props, event);
|
|
74
|
+
}
|
|
75
|
+
function getCompatibleIMaskProps() {
|
|
76
|
+
return __assign({ mask: mask.replace(/0/g, '{\\0}'), placeholderChar: getMaskChar(maskChar), definitions: getDefinitions(formatChars),
|
|
77
|
+
// FIXME: Должно быть eager=true, но в imask ломается удаление по delete
|
|
78
|
+
eager: 'append', overwrite: 'shift', lazy: !alwaysShowMask && (props.disabled || !focused), unmask: unmask }, customIMaskProps);
|
|
79
|
+
}
|
|
80
|
+
function handleAccept() {
|
|
81
|
+
var args = [];
|
|
82
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
83
|
+
args[_i] = arguments[_i];
|
|
84
|
+
}
|
|
85
|
+
var value = args[0], e = args[2];
|
|
86
|
+
// Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.
|
|
87
|
+
// Но нативный input никогда не вызывает onChange при монтировании.
|
|
88
|
+
// Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,
|
|
89
|
+
// поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.
|
|
90
|
+
// Он содержит нативное событие, вызвавшее изменение.
|
|
91
|
+
e && (onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(value));
|
|
92
|
+
!e && (prevValue.current = value);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Отслеживаем неожиданные нажатия
|
|
96
|
+
* handleAccept не вызывается когда значение с маской не меняется
|
|
97
|
+
* Сначала вызывается handleAccept, затем handleInput
|
|
98
|
+
*/
|
|
99
|
+
function handleInput(e) {
|
|
100
|
+
var _a;
|
|
101
|
+
var _b = e.currentTarget, value = _b.value, selectionStart = _b.selectionStart;
|
|
102
|
+
// При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.
|
|
103
|
+
// Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.
|
|
104
|
+
if (prevValue.current === value && selectionStart === prevSelectionStart.current) {
|
|
105
|
+
handleUnexpectedInput(value);
|
|
106
|
+
}
|
|
107
|
+
prevValue.current = value;
|
|
108
|
+
prevSelectionStart.current = selectionStart;
|
|
109
|
+
(_a = props.onInput) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
110
|
+
}
|
|
111
|
+
function handleFocus(e) {
|
|
112
|
+
var _a, _b;
|
|
113
|
+
setFocused(true);
|
|
114
|
+
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
115
|
+
// Если value из пропсов отличается от value, которое получит input после обработки,
|
|
116
|
+
// то imask будет ставить каретку за последним валидным символом.
|
|
117
|
+
props.selectAllOnFocus && ((_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.delaySelectAll());
|
|
118
|
+
}
|
|
119
|
+
function handleUnexpectedInput(value) {
|
|
120
|
+
var _a;
|
|
121
|
+
var blink = ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blink.bind(inputRef.current)) || (function () { return undefined; });
|
|
122
|
+
onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();
|
|
123
|
+
}
|
|
124
|
+
function handleBlur(e) {
|
|
125
|
+
var _a;
|
|
126
|
+
setFocused(false);
|
|
127
|
+
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
128
|
+
}
|
|
129
|
+
function handleKeyDown(e) {
|
|
130
|
+
var _a;
|
|
131
|
+
var _b = e.currentTarget, value = _b.value, selectionStart = _b.selectionStart, selectionEnd = _b.selectionEnd;
|
|
132
|
+
if ((isKeyBackspace(e) && selectionStart === 0 && selectionEnd === 0) ||
|
|
133
|
+
(isKeyDelete(e) && prevSelectionStart.current === value.length)) {
|
|
134
|
+
// Случаи, когда нажатие клавиш не тригерит `onInput`
|
|
135
|
+
handleUnexpectedInput(value);
|
|
136
|
+
prevValue.current = e.currentTarget.value;
|
|
137
|
+
}
|
|
138
|
+
prevSelectionStart.current = selectionStart;
|
|
139
|
+
(_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=MaskedInputLegacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaskedInputLegacy.js","sourceRoot":"","sources":["MaskedInputLegacy.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { IMaskInputProps } from '@skbkontur/react-imask';\nimport React, { useContext, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport type { Ref } from 'react';\n\nimport { isKeyBackspace, isKeyDelete } from '../../lib/events/keyboard/identifiers.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { Input } from '../Input/index.js';\nimport { Input as InputComponent } from '../Input/index.js';\nimport { ColorableInputElement } from './ColorableInputElement/index.js';\nimport { FixedIMaskInput } from './FixedIMaskInput.js';\nimport { getDefinitions, getMaskChar } from './MaskedInput.helpers.js';\nimport type { MaskedInputProps } from './MaskedInput.js';\nimport { getStyles, globalClasses } from './MaskedInput.styles.js';\n\nexport const MaskedInputLegacy = forwardRefAndName(\n 'MaskedInputLegacy',\n function MaskedInputLegacy(props: MaskedInputProps, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = {},\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onChange,\n onBeforePasteValue,\n element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n ...inputProps\n } = props;\n const theme = useContext(ThemeContext);\n const { cx } = useEmotion();\n const styles = useStyles(getStyles);\n\n const inputRef = useRef<Input>(null);\n\n const [focused, setFocused] = useState(false);\n const prevValue = useRef<string>(props.value || String(props.defaultValue) || '');\n const prevSelectionStart = useRef<number | null>(null);\n\n useImperativeHandle<typeof inputRef.current, typeof inputRef.current>(\n ref,\n () =>\n inputRef.current &&\n Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n inputRef.current?.delaySelectAll();\n },\n }),\n [],\n );\n\n useEffect(() => {\n // Для корректной работы onUnexpectedInput надо знать предыдущий value,\n // но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.\n // Поэтому актуальный value при монтировании надо получать вручную\n if (inputRef.current?.input) {\n prevValue.current = inputRef.current.input.value;\n prevSelectionStart.current = inputRef.current.input.selectionStart;\n }\n }, []);\n\n const imaskProps = getCompatibleIMaskProps();\n\n return (\n <InputComponent\n ref={inputRef}\n {...inputProps}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n className={cx(globalClasses.root, className, styles.root(theme))}\n element={\n colored ? (\n <ColorableInputElement showOnFocus={false} alwaysShowMask={alwaysShowMask}>\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n </ColorableInputElement>\n ) : (\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n )\n }\n />\n );\n\n function handlePaste(event: React.ClipboardEvent<HTMLInputElement>) {\n if (onBeforePasteValue && onValueChange) {\n event.preventDefault();\n onValueChange?.(onBeforePasteValue(event.clipboardData?.getData('text') ?? ''));\n }\n\n props.onPaste?.(event);\n }\n\n function getCompatibleIMaskProps(): IMaskInputProps<HTMLInputElement> {\n return {\n mask: mask.replace(/0/g, '{\\\\0}') as any,\n placeholderChar: getMaskChar(maskChar),\n definitions: getDefinitions(formatChars),\n // FIXME: Должно быть eager=true, но в imask ломается удаление по delete\n eager: 'append',\n overwrite: 'shift',\n lazy: !alwaysShowMask && (props.disabled || !focused),\n unmask,\n ...customIMaskProps,\n } as IMaskInputProps<HTMLInputElement>;\n }\n\n function handleAccept(...args: Parameters<Required<IMaskInputProps<HTMLInputElement>>['onAccept']>) {\n const [value, , e] = args;\n\n // Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.\n // Но нативный input никогда не вызывает onChange при монтировании.\n // Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,\n // поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.\n // Он содержит нативное событие, вызвавшее изменение.\n e && onValueChange?.(value);\n !e && (prevValue.current = value);\n }\n\n /**\n * Отслеживаем неожиданные нажатия\n * handleAccept не вызывается когда значение с маской не меняется\n * Сначала вызывается handleAccept, затем handleInput\n */\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n const { value, selectionStart } = e.currentTarget;\n\n // При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.\n // Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.\n if (prevValue.current === value && selectionStart === prevSelectionStart.current) {\n handleUnexpectedInput(value);\n }\n prevValue.current = value;\n prevSelectionStart.current = selectionStart;\n\n props.onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n\n // Если value из пропсов отличается от value, которое получит input после обработки,\n // то imask будет ставить каретку за последним валидным символом.\n props.selectAllOnFocus && inputRef.current?.delaySelectAll();\n }\n\n function handleUnexpectedInput(value: string) {\n const blink = inputRef.current?.blink.bind(inputRef.current) || (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const { value, selectionStart, selectionEnd } = e.currentTarget;\n\n if (\n (isKeyBackspace(e) && selectionStart === 0 && selectionEnd === 0) ||\n (isKeyDelete(e) && prevSelectionStart.current === value.length)\n ) {\n // Случаи, когда нажатие клавиш не тригерит `onInput`\n handleUnexpectedInput(value);\n prevValue.current = e.currentTarget.value;\n }\n prevSelectionStart.current = selectionStart;\n\n props.onKeyDown?.(e);\n }\n },\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC","sourcesContent":["export * from './MaskedInput.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC","sourcesContent":["export * from './MaskedInput.js';\nexport { MaskedInputMasks, normalizeRussianPhonePaste } from '../MaskedInputV2/MaskedInputV2.phone.js';\n"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { InputProps, InputType } from '../Input/index.js';
|
|
2
|
+
import { Input } from '../Input/index.js';
|
|
3
|
+
import { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';
|
|
4
|
+
import type { IMaskInputProps } from './react-imask/mixin.js';
|
|
5
|
+
export type MaskedInputV2OnBeforePasteValue = (value: string) => string;
|
|
6
|
+
export interface MaskedInputV2MaskedProps {
|
|
7
|
+
/** Шаблон ввода, определяющий допустимые символы. */
|
|
8
|
+
mask: string;
|
|
9
|
+
/** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.
|
|
10
|
+
* @default _ */
|
|
11
|
+
maskChar?: string;
|
|
12
|
+
/** Словарь правил для настройки маски, где:
|
|
13
|
+
* ключ — символ для использования в маске;
|
|
14
|
+
* значение — регулярка-правило.
|
|
15
|
+
* @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */
|
|
16
|
+
formatChars?: Record<string, string>;
|
|
17
|
+
/** Всегда показывать символы маски, независимо от фокуса в поле.
|
|
18
|
+
* @default false */
|
|
19
|
+
alwaysShowMask?: boolean;
|
|
20
|
+
/** Событие некорректного ввода.
|
|
21
|
+
* Вторым аргументом передаётся метод вспыхивания рамки поля.
|
|
22
|
+
*
|
|
23
|
+
* Если обработчик не задан, то при событии рамка всегда вспыхивает.
|
|
24
|
+
*
|
|
25
|
+
* @param value значение поля
|
|
26
|
+
* @param blink метод вспыхивания рамки поля
|
|
27
|
+
*/
|
|
28
|
+
onUnexpectedInput?: (value: string, blink: () => void) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Событие перед вставкой текста в поле.
|
|
31
|
+
* Вызывается с аргументом value — текст из буфера, браузерного autofill
|
|
32
|
+
* или иной bulk-вставки без clipboard-события.
|
|
33
|
+
*
|
|
34
|
+
* Обработчик должен вернуть текст — он попадёт в поле.
|
|
35
|
+
*
|
|
36
|
+
* При `type="tel"` и отсутствии обработчика применяется
|
|
37
|
+
* {@link normalizeRussianPhonePaste}.
|
|
38
|
+
*
|
|
39
|
+
* @param value значение вставки.
|
|
40
|
+
*/
|
|
41
|
+
onBeforePasteValue?: MaskedInputV2OnBeforePasteValue;
|
|
42
|
+
/** Убирает из value символы маски, которые пользователь не вводил.
|
|
43
|
+
* @default false */
|
|
44
|
+
unmask?: boolean;
|
|
45
|
+
/** Раскрашивает символы маски.
|
|
46
|
+
* @default true
|
|
47
|
+
* @ignore */
|
|
48
|
+
colored?: boolean;
|
|
49
|
+
/** Задает пропсы для компонента `IMaskInput`. Необходимы для юнит-тестов
|
|
50
|
+
* @ignore */
|
|
51
|
+
imaskProps?: IMaskInputProps<HTMLInputElement>;
|
|
52
|
+
}
|
|
53
|
+
export type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;
|
|
54
|
+
export declare const getSafeMaskInputType: (type?: InputType | string) => MaskInputType | undefined;
|
|
55
|
+
export interface MaskedInputV2Props extends MaskedInputV2MaskedProps, Omit<InputProps, 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {
|
|
56
|
+
type?: MaskInputType;
|
|
57
|
+
/** @ignore */
|
|
58
|
+
__fromMaskedInputFacade?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/** @deprecated Используйте {@link MaskedInput}. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@link ReactUIFeatureFlagsContext}. */
|
|
61
|
+
export declare const MaskedInputV2: import("../../lib/forwardRefAndName.js").ReactUIComponentWithRef<Input, MaskedInputV2Props> & Record<never, never>;
|
|
62
|
+
export { getDefinitions, getMaskChar };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Definitions } from './react-imask/imask/masked/pattern.js';
|
|
2
|
+
export declare const DEFAULT_MASK_CHAR = "_";
|
|
3
|
+
export declare const DEFINITIONS: Readonly<{
|
|
4
|
+
'9': RegExp;
|
|
5
|
+
a: RegExp;
|
|
6
|
+
'*': RegExp;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function getDefinitions(formatChars: Record<string, string> | undefined): Definitions;
|
|
9
|
+
export declare function getMaskChar(maskChar: string | undefined): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isNonNullable } from '../../lib/utils.js';
|
|
2
|
+
export var DEFAULT_MASK_CHAR = '_';
|
|
3
|
+
export var DEFINITIONS = Object.freeze({ '9': /[0-9]/, a: /[A-Za-z]/, '*': /[A-Za-z0-9]/ });
|
|
4
|
+
export function getDefinitions(formatChars) {
|
|
5
|
+
if (isNonNullable(formatChars)) {
|
|
6
|
+
var chars = {};
|
|
7
|
+
for (var key in formatChars) {
|
|
8
|
+
chars[key] = new RegExp(formatChars[key]);
|
|
9
|
+
}
|
|
10
|
+
return chars;
|
|
11
|
+
}
|
|
12
|
+
return DEFINITIONS;
|
|
13
|
+
}
|
|
14
|
+
export function getMaskChar(maskChar) {
|
|
15
|
+
return !maskChar ? DEFAULT_MASK_CHAR : maskChar;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=MaskedInputV2.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaskedInputV2.helpers.js","sourceRoot":"","sources":["MaskedInputV2.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,CAAC,IAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC,MAAM,CAAC,IAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;AAE9F,MAAM,UAAU,cAAc,CAAC,WAA+C;IAC5E,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAM,KAAK,GAA2B,EAAE,CAAC;QAEzC,KAAK,IAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC","sourcesContent":["import { isNonNullable } from '../../lib/utils.js';\nimport { type Definitions } from './react-imask/imask/masked/pattern.js';\n\nexport const DEFAULT_MASK_CHAR = '_';\nexport const DEFINITIONS = Object.freeze({ '9': /[0-9]/, a: /[A-Za-z]/, '*': /[A-Za-z0-9]/ });\n\nexport function getDefinitions(formatChars: Record<string, string> | undefined): Definitions {\n if (isNonNullable(formatChars)) {\n const chars: Record<string, RegExp> = {};\n\n for (const key in formatChars) {\n chars[key] = new RegExp(formatChars[key]);\n }\n\n return chars;\n }\n\n return DEFINITIONS;\n}\n\nexport function getMaskChar(maskChar: string | undefined): string {\n return !maskChar ? DEFAULT_MASK_CHAR : maskChar;\n}\n"]}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
13
|
+
var t = {};
|
|
14
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
15
|
+
t[p] = s[p];
|
|
16
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
17
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
18
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
19
|
+
t[p[i]] = s[p[i]];
|
|
20
|
+
}
|
|
21
|
+
return t;
|
|
22
|
+
};
|
|
23
|
+
import React, { useCallback, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, } from 'react';
|
|
24
|
+
import warning from 'warning';
|
|
25
|
+
import { forwardRefAndName } from '../../lib/forwardRefAndName.js';
|
|
26
|
+
import { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';
|
|
27
|
+
import { ThemeContext } from '../../lib/theming/ThemeContext.js';
|
|
28
|
+
import { Input, selectionAllowedTypes } from '../Input/index.js';
|
|
29
|
+
import { extractRaw, findNearestRawLeft, computePasteMaskedCursor } from './internal/helpers.js';
|
|
30
|
+
import { MaskedCore } from './internal/MaskedCore.js';
|
|
31
|
+
import { getSelectionRawRange } from './internal/maskedCoreClipboard.js';
|
|
32
|
+
import { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';
|
|
33
|
+
import { useMaskEngine } from './internal/useMaskEngine.js';
|
|
34
|
+
import { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';
|
|
35
|
+
import { normalizeRussianPhonePaste } from './MaskedInputV2.phone.js';
|
|
36
|
+
import { getStyles, globalClasses } from './MaskedInputV2.styles.js';
|
|
37
|
+
var EMPTY_IMASK_PROPS = {};
|
|
38
|
+
export var getSafeMaskInputType = function (type) {
|
|
39
|
+
if (!type) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
var normalizedType = type.trim();
|
|
43
|
+
if (normalizedType === 'password' || !selectionAllowedTypes.includes(normalizedType)) {
|
|
44
|
+
return 'text';
|
|
45
|
+
}
|
|
46
|
+
return normalizedType;
|
|
47
|
+
};
|
|
48
|
+
function getMaskInputMode(type, inputMode) {
|
|
49
|
+
if (inputMode) {
|
|
50
|
+
return inputMode;
|
|
51
|
+
}
|
|
52
|
+
if ((type === null || type === void 0 ? void 0 : type.trim()) === 'email') {
|
|
53
|
+
return 'email';
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
/** @deprecated Используйте {@link MaskedInput}. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@link ReactUIFeatureFlagsContext}. */
|
|
58
|
+
export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInputV2(props, ref) {
|
|
59
|
+
var mask = props.mask, maskChar = props.maskChar, formatChars = props.formatChars, _a = props.alwaysShowMask, alwaysShowMask = _a === void 0 ? false : _a, _b = props.colored, colored = _b === void 0 ? true : _b, _c = props.imaskProps, customIMaskProps = _c === void 0 ? EMPTY_IMASK_PROPS : _c, _d = props.unmask, unmask = _d === void 0 ? false : _d, onValueChange = props.onValueChange, onUnexpectedInput = props.onUnexpectedInput, onBeforePasteValue = props.onBeforePasteValue, _element = props.element, className = props.className,
|
|
60
|
+
// @ts-expect-error: могут передавать игнорируя ошибку
|
|
61
|
+
maxLength = props.maxLength,
|
|
62
|
+
// @ts-expect-error: могут передавать игнорируя ошибку
|
|
63
|
+
_showClearIcon = props.showClearIcon, selectAllOnFocus = props.selectAllOnFocus, type = props.type, __fromMaskedInputFacade = props.__fromMaskedInputFacade, inputProps = __rest(props, ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onBeforePasteValue", "element", "className", "maxLength", "showClearIcon", "selectAllOnFocus", "type", "__fromMaskedInputFacade"]);
|
|
64
|
+
useEffect(function () {
|
|
65
|
+
if (!__fromMaskedInputFacade) {
|
|
66
|
+
warning(false, '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput instead.');
|
|
67
|
+
}
|
|
68
|
+
}, [__fromMaskedInputFacade]);
|
|
69
|
+
var theme = useContext(ThemeContext);
|
|
70
|
+
var cx = useEmotion().cx;
|
|
71
|
+
var styles = useStyles(getStyles);
|
|
72
|
+
var inputRef = useRef(null);
|
|
73
|
+
var coreInputRef = useRef(null);
|
|
74
|
+
var _e = useState(false), focused = _e[0], setFocused = _e[1];
|
|
75
|
+
var _f = useState(null), selectionIntent = _f[0], setSelectionIntent = _f[1];
|
|
76
|
+
var prevMaskRef = useRef(props.mask);
|
|
77
|
+
var pendingCursorRestoreRef = useRef(null);
|
|
78
|
+
var lastCaretRef = useRef(0);
|
|
79
|
+
var requestSelectionIntent = useCallback(function (intent) {
|
|
80
|
+
setSelectionIntent(function (current) { return (current === 'select-all' && intent === 'caret-end' ? current : intent); });
|
|
81
|
+
}, []);
|
|
82
|
+
var historyRef = useRef([]);
|
|
83
|
+
var historyIndexRef = useRef(-1);
|
|
84
|
+
// Сохраняем позицию курсора перед сменой маски (render-phase read of stable ref).
|
|
85
|
+
// При коммите DOM браузер сбросит курсор в конец из-за изменения value,
|
|
86
|
+
// поэтому восстанавливаем его синхронно в useLayoutEffect ниже.
|
|
87
|
+
if (prevMaskRef.current !== props.mask) {
|
|
88
|
+
pendingCursorRestoreRef.current = lastCaretRef.current;
|
|
89
|
+
prevMaskRef.current = props.mask;
|
|
90
|
+
historyRef.current = [];
|
|
91
|
+
historyIndexRef.current = -1;
|
|
92
|
+
}
|
|
93
|
+
// Движок: IMask как чистый калькулятор, не привязанный к DOM
|
|
94
|
+
var engine = useMaskEngine({
|
|
95
|
+
mask: mask,
|
|
96
|
+
maskChar: maskChar,
|
|
97
|
+
formatChars: formatChars,
|
|
98
|
+
unmask: unmask,
|
|
99
|
+
alwaysShowMask: alwaysShowMask,
|
|
100
|
+
imaskProps: customIMaskProps,
|
|
101
|
+
});
|
|
102
|
+
// Единственный источник истины — raw (только то, что ввёл пользователь, без маски)
|
|
103
|
+
var _g = useState(function () { var _a; return extractRaw(((_a = props.value) !== null && _a !== void 0 ? _a : props.defaultValue), engine); }), raw = _g[0], setRaw = _g[1];
|
|
104
|
+
// MaskState вычисляется синхронно из raw — оба визуальных слоя читают из него
|
|
105
|
+
var maskState = useMemo(function () { return engine.compute(raw, focused); }, [raw, focused, engine]);
|
|
106
|
+
var syncedImaskRef = useRef(engine.imask);
|
|
107
|
+
var prevSyncedValueRef = useRef(props.value);
|
|
108
|
+
// Синхронизировать raw при изменении props.value или правил маски
|
|
109
|
+
useEffect(function () {
|
|
110
|
+
var engineChanged = syncedImaskRef.current !== engine.imask;
|
|
111
|
+
var valueChanged = prevSyncedValueRef.current !== props.value;
|
|
112
|
+
syncedImaskRef.current = engine.imask;
|
|
113
|
+
prevSyncedValueRef.current = props.value;
|
|
114
|
+
if (props.value !== undefined) {
|
|
115
|
+
if (valueChanged || engineChanged) {
|
|
116
|
+
setRaw(extractRaw(props.value, engine));
|
|
117
|
+
}
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (engineChanged) {
|
|
121
|
+
setRaw(function (prev) {
|
|
122
|
+
engine.imask.unmaskedValue = prev;
|
|
123
|
+
return engine.imask.rawInputValue;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}, [props.value, engine]);
|
|
127
|
+
// Вызывать onValueChange только при реальном изменении outputValue,
|
|
128
|
+
// и НЕ при первом рендере (воспроизводит нативное поведение onChange)
|
|
129
|
+
var isFirstRender = useRef(true);
|
|
130
|
+
var prevOutputValue = useRef(maskState.outputValue);
|
|
131
|
+
useEffect(function () {
|
|
132
|
+
if (isFirstRender.current) {
|
|
133
|
+
isFirstRender.current = false;
|
|
134
|
+
prevOutputValue.current = maskState.outputValue;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (maskState.outputValue !== prevOutputValue.current) {
|
|
138
|
+
prevOutputValue.current = maskState.outputValue;
|
|
139
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(maskState.outputValue);
|
|
140
|
+
}
|
|
141
|
+
}, [maskState.outputValue]);
|
|
142
|
+
useImperativeHandle(ref, function () {
|
|
143
|
+
if (!inputRef.current) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return Object.assign(inputRef.current, {
|
|
147
|
+
selectAll: function () {
|
|
148
|
+
var _a;
|
|
149
|
+
requestSelectionIntent('select-all');
|
|
150
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
151
|
+
var el = coreInputRef.current;
|
|
152
|
+
if (el && el.ownerDocument.activeElement !== el) {
|
|
153
|
+
requestSelectionIntent(null);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}, [requestSelectionIntent]);
|
|
158
|
+
useLayoutEffect(function () {
|
|
159
|
+
if (pendingCursorRestoreRef.current !== null && coreInputRef.current) {
|
|
160
|
+
setMaskInputSelectionRange(coreInputRef.current, pendingCursorRestoreRef.current);
|
|
161
|
+
lastCaretRef.current = pendingCursorRestoreRef.current;
|
|
162
|
+
pendingCursorRestoreRef.current = null;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
useEffect(function () {
|
|
166
|
+
if (!focused) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
var el = coreInputRef.current;
|
|
170
|
+
if (!el) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
var syncCaret = function () {
|
|
174
|
+
var _a;
|
|
175
|
+
if (document.activeElement === el) {
|
|
176
|
+
lastCaretRef.current = (_a = el.selectionStart) !== null && _a !== void 0 ? _a : 0;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
document.addEventListener('selectionchange', syncCaret);
|
|
180
|
+
return function () { return document.removeEventListener('selectionchange', syncCaret); };
|
|
181
|
+
}, [focused]);
|
|
182
|
+
return (React.createElement(Input, __assign({ ref: inputRef }, inputProps, { type: getSafeMaskInputType(type), inputMode: getMaskInputMode(type, inputProps.inputMode), onFocus: handleFocus, onBlur: handleBlur, onSelect: handleSelect, className: cx(globalClasses.root, className, styles.root(theme)), element: React.createElement(MaskedCore, { maskState: maskState, slotMap: engine.slotMap, engine: engine, focused: focused, currentRaw: raw, onRawChange: handleRawChange, onUnexpectedInput: triggerUnexpectedInput, onUndo: handleUndo, onRedo: handleRedo, coreInputRef: coreInputRef, colored: colored, selectAllOnFocus: selectAllOnFocus, selectionIntent: selectionIntent, onSelectionIntentChange: requestSelectionIntent }) })));
|
|
183
|
+
function handleRawChange(input, source, cursorPos) {
|
|
184
|
+
if (source === 'paste') {
|
|
185
|
+
handlePasteChange(input, cursorPos);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
if (input !== raw && cursorPos !== undefined) {
|
|
189
|
+
pushHistory(input, cursorPos);
|
|
190
|
+
}
|
|
191
|
+
setRaw(input);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function handlePasteChange(pasted, _cursorPos) {
|
|
195
|
+
var _a, _b;
|
|
196
|
+
var el = coreInputRef.current;
|
|
197
|
+
var selectionStart = (_a = el === null || el === void 0 ? void 0 : el.selectionStart) !== null && _a !== void 0 ? _a : 0;
|
|
198
|
+
var selectionEnd = (_b = el === null || el === void 0 ? void 0 : el.selectionEnd) !== null && _b !== void 0 ? _b : selectionStart;
|
|
199
|
+
// При непустом выделении сначала убираем попавший в него raw (в т.ч. если край на литерале `-`),
|
|
200
|
+
// иначе paste склеивает старое значение с новым.
|
|
201
|
+
var selectedRawRange = selectionEnd > selectionStart ? getSelectionRawRange(selectionStart, selectionEnd, engine.slotMap) : null;
|
|
202
|
+
var baseRaw = raw;
|
|
203
|
+
var rawCursorPos;
|
|
204
|
+
if (selectedRawRange) {
|
|
205
|
+
baseRaw = raw.slice(0, selectedRawRange.rawStart) + raw.slice(selectedRawRange.rawEnd);
|
|
206
|
+
rawCursorPos = selectedRawRange.rawStart;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
rawCursorPos =
|
|
210
|
+
engine.slotMap.maskedToRaw[selectionStart] !== null &&
|
|
211
|
+
engine.slotMap.maskedToRaw[selectionStart] !== undefined
|
|
212
|
+
? engine.slotMap.maskedToRaw[selectionStart]
|
|
213
|
+
: findNearestRawLeft(selectionStart, engine.slotMap);
|
|
214
|
+
}
|
|
215
|
+
var rawBefore = baseRaw.slice(0, rawCursorPos);
|
|
216
|
+
var rawAfter = baseRaw.slice(rawCursorPos);
|
|
217
|
+
var transformed = pasted;
|
|
218
|
+
if (onBeforePasteValue) {
|
|
219
|
+
transformed = onBeforePasteValue(pasted);
|
|
220
|
+
}
|
|
221
|
+
else if (getSafeMaskInputType(type) === 'tel') {
|
|
222
|
+
transformed = normalizeRussianPhonePaste(pasted);
|
|
223
|
+
}
|
|
224
|
+
var result = engine.applyPaste(baseRaw, rawCursorPos, transformed);
|
|
225
|
+
if (result.overflow) {
|
|
226
|
+
// IF-1157: paste с overflow → onUnexpectedInput
|
|
227
|
+
triggerUnexpectedInput();
|
|
228
|
+
}
|
|
229
|
+
var postPasteMaskState = engine.compute(result.raw, true);
|
|
230
|
+
var maskedCursorPos = computePasteMaskedCursor(rawBefore, rawAfter, result.raw, rawCursorPos, engine.slotMap, postPasteMaskState.typedLength);
|
|
231
|
+
if (result.raw !== raw) {
|
|
232
|
+
pushHistory(result.raw, maskedCursorPos);
|
|
233
|
+
}
|
|
234
|
+
setRaw(result.raw);
|
|
235
|
+
pendingCursorRestoreRef.current = maskedCursorPos;
|
|
236
|
+
if (onBeforePasteValue && onValueChange) {
|
|
237
|
+
// Legacy-контракт: при кастомной вставке наружу уходит результат onBeforePasteValue,
|
|
238
|
+
// а не masked/unmasked outputValue (нужно для ComboBox и совместимости с IMaskInput).
|
|
239
|
+
prevOutputValue.current = engine.compute(result.raw, focused).outputValue;
|
|
240
|
+
onValueChange(transformed);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function pushHistory(newRaw, cursorPos) {
|
|
244
|
+
var MAX_HISTORY_LENGTH = 100;
|
|
245
|
+
if (historyRef.current.length === 0) {
|
|
246
|
+
historyRef.current.push({ raw: raw, cursorPos: 0 });
|
|
247
|
+
historyIndexRef.current = 0;
|
|
248
|
+
}
|
|
249
|
+
if (historyIndexRef.current < historyRef.current.length - 1) {
|
|
250
|
+
historyRef.current = historyRef.current.slice(0, historyIndexRef.current + 1);
|
|
251
|
+
}
|
|
252
|
+
historyRef.current.push({ raw: newRaw, cursorPos: cursorPos });
|
|
253
|
+
if (historyRef.current.length > MAX_HISTORY_LENGTH) {
|
|
254
|
+
historyRef.current.shift();
|
|
255
|
+
}
|
|
256
|
+
historyIndexRef.current = historyRef.current.length - 1;
|
|
257
|
+
}
|
|
258
|
+
function handleUndo() {
|
|
259
|
+
if (historyRef.current.length === 0) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
var nextIndex = Math.max(0, historyIndexRef.current - 1);
|
|
263
|
+
if (nextIndex !== historyIndexRef.current) {
|
|
264
|
+
historyIndexRef.current = nextIndex;
|
|
265
|
+
var state = historyRef.current[nextIndex];
|
|
266
|
+
setRaw(state.raw);
|
|
267
|
+
pendingCursorRestoreRef.current = state.cursorPos;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function handleRedo() {
|
|
271
|
+
if (historyRef.current.length === 0) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
var nextIndex = Math.min(historyRef.current.length - 1, historyIndexRef.current + 1);
|
|
275
|
+
if (nextIndex !== historyIndexRef.current) {
|
|
276
|
+
historyIndexRef.current = nextIndex;
|
|
277
|
+
var state = historyRef.current[nextIndex];
|
|
278
|
+
setRaw(state.raw);
|
|
279
|
+
pendingCursorRestoreRef.current = state.cursorPos;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
function triggerUnexpectedInput() {
|
|
283
|
+
var _a, _b;
|
|
284
|
+
var blink = (_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blink.bind(inputRef.current)) !== null && _b !== void 0 ? _b : (function () { return undefined; });
|
|
285
|
+
onUnexpectedInput ? onUnexpectedInput(maskState.outputValue, blink) : blink();
|
|
286
|
+
}
|
|
287
|
+
function handleFocus(e) {
|
|
288
|
+
var _a;
|
|
289
|
+
setFocused(true);
|
|
290
|
+
(_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
291
|
+
}
|
|
292
|
+
function handleBlur(e) {
|
|
293
|
+
var _a;
|
|
294
|
+
setFocused(false);
|
|
295
|
+
(_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
296
|
+
}
|
|
297
|
+
function handleSelect(e) {
|
|
298
|
+
var _a, _b;
|
|
299
|
+
if (coreInputRef.current) {
|
|
300
|
+
lastCaretRef.current = (_a = coreInputRef.current.selectionStart) !== null && _a !== void 0 ? _a : 0;
|
|
301
|
+
}
|
|
302
|
+
(_b = inputProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(inputProps, e);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
// Вспомогательные функции для совместимости (используются в стори и тестах)
|
|
306
|
+
export { getDefinitions, getMaskChar };
|
|
307
|
+
//# sourceMappingURL=MaskedInputV2.js.map
|