@alfalab/core-components-masked-input 7.0.0 → 7.1.0-snapshot-92b8690
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/dynamic-mixins/Component.d.ts +53 -0
- package/dynamic-mixins/Component.js +82 -0
- package/dynamic-mixins/Component.js.map +1 -0
- package/dynamic-mixins/index.css +3 -0
- package/dynamic-mixins/index.d.ts +1 -0
- package/dynamic-mixins/index.js +11 -0
- package/dynamic-mixins/index.js.map +1 -0
- package/dynamic-mixins/index.module.css.js +8 -0
- package/dynamic-mixins/index.module.css.js.map +1 -0
- package/esm/index.css +1 -1
- package/esm/index.module.css.js +1 -1
- package/index.css +1 -1
- package/index.module.css.js +1 -1
- package/modern/index.css +1 -1
- package/modern/index.module.css.js +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { InputProps } from '@alfalab/core-components-input';
|
|
3
|
+
declare type Mask = Array<string | RegExp>;
|
|
4
|
+
export declare type TextMaskConfig = {
|
|
5
|
+
currentCaretPosition: number;
|
|
6
|
+
rawValue: string;
|
|
7
|
+
previousConformedValue: string;
|
|
8
|
+
mask?: Mask | ((rawValue: string) => Mask);
|
|
9
|
+
guide?: boolean;
|
|
10
|
+
showMask?: boolean;
|
|
11
|
+
placeholderChar?: string;
|
|
12
|
+
keepCharPositions?: boolean;
|
|
13
|
+
pipe?: (conformedValue: string, config: TextMaskConfig) => false | string | {
|
|
14
|
+
value: string;
|
|
15
|
+
indexesOfPipedChars: number[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare type MaskedInputProps = InputProps & {
|
|
19
|
+
/**
|
|
20
|
+
* Маска для поля ввода
|
|
21
|
+
* https://github.com/text-mask/text-mask/blob/master/componentDocumentation.md#mask-array
|
|
22
|
+
*/
|
|
23
|
+
mask?: TextMaskConfig['mask'];
|
|
24
|
+
/**
|
|
25
|
+
* Управляет поведением компонента при удалении символов
|
|
26
|
+
*/
|
|
27
|
+
keepCharPositions?: TextMaskConfig['keepCharPositions'];
|
|
28
|
+
/**
|
|
29
|
+
* Дает возможность изменить значение поля перед рендером
|
|
30
|
+
*/
|
|
31
|
+
onBeforeDisplay?: TextMaskConfig['pipe'];
|
|
32
|
+
};
|
|
33
|
+
export declare const PLACEHOLDER_CHAR = "\u2000";
|
|
34
|
+
export declare const MaskedInput: React.ForwardRefExoticComponent<Omit<import("@alfalab/core-components-input/components/base-input").BaseInputProps, "FormControlComponent"> & {
|
|
35
|
+
breakpoint?: number | undefined;
|
|
36
|
+
client?: "desktop" | "mobile" | undefined;
|
|
37
|
+
defaultMatchMediaValue?: boolean | (() => boolean) | undefined;
|
|
38
|
+
} & {
|
|
39
|
+
/**
|
|
40
|
+
* Маска для поля ввода
|
|
41
|
+
* https://github.com/text-mask/text-mask/blob/master/componentDocumentation.md#mask-array
|
|
42
|
+
*/
|
|
43
|
+
mask?: TextMaskConfig['mask'];
|
|
44
|
+
/**
|
|
45
|
+
* Управляет поведением компонента при удалении символов
|
|
46
|
+
*/
|
|
47
|
+
keepCharPositions?: TextMaskConfig['keepCharPositions'];
|
|
48
|
+
/**
|
|
49
|
+
* Дает возможность изменить значение поля перед рендером
|
|
50
|
+
*/
|
|
51
|
+
onBeforeDisplay?: TextMaskConfig['pipe'];
|
|
52
|
+
} & React.RefAttributes<HTMLInputElement>>;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib = require('tslib');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var mergeRefs = require('react-merge-refs');
|
|
8
|
+
var cn = require('classnames');
|
|
9
|
+
var textMaskCore = require('text-mask-core');
|
|
10
|
+
var dynamicMixins = require('@alfalab/core-components-input/dynamic-mixins');
|
|
11
|
+
var index_module = require('./index.module.css.js');
|
|
12
|
+
|
|
13
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
14
|
+
|
|
15
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
16
|
+
var mergeRefs__default = /*#__PURE__*/_interopDefaultCompat(mergeRefs);
|
|
17
|
+
var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
|
|
18
|
+
|
|
19
|
+
// Символ плейсхолдера не может входить в маску, поэтому вместо пробела используется \u2000
|
|
20
|
+
var PLACEHOLDER_CHAR = '\u2000';
|
|
21
|
+
var MaskedInput = React__default.default.forwardRef(function (_a, ref) {
|
|
22
|
+
var _b;
|
|
23
|
+
var mask = _a.mask, _c = _a.keepCharPositions, keepCharPositions = _c === void 0 ? false : _c, value = _a.value, defaultValue = _a.defaultValue, className = _a.className, onBeforeDisplay = _a.onBeforeDisplay, onChange = _a.onChange, onClear = _a.onClear, restProps = tslib.__rest(_a, ["mask", "keepCharPositions", "value", "defaultValue", "className", "onBeforeDisplay", "onChange", "onClear"]);
|
|
24
|
+
var _d = React.useState(null), inputNode = _d[0], setInputNode = _d[1];
|
|
25
|
+
var textMask = React.useRef(null);
|
|
26
|
+
var _e = React.useState(value || defaultValue || ''), inputValue = _e[0], setInputValue = _e[1];
|
|
27
|
+
// Не показываем сырое значение до применения маски
|
|
28
|
+
var _f = React.useState(true), textHidden = _f[0], setTextHidden = _f[1];
|
|
29
|
+
var update = React.useCallback(function (newValue) {
|
|
30
|
+
if (newValue === void 0) { newValue = ''; }
|
|
31
|
+
if (textMask.current && inputNode) {
|
|
32
|
+
try {
|
|
33
|
+
textMask.current.update(newValue);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
// ignore masking errors
|
|
37
|
+
}
|
|
38
|
+
setInputValue(inputNode.value);
|
|
39
|
+
}
|
|
40
|
+
}, [inputNode]);
|
|
41
|
+
var handleInputChange = React.useCallback(function (event) {
|
|
42
|
+
update(event.target.value);
|
|
43
|
+
if (onChange) {
|
|
44
|
+
onChange(event, {
|
|
45
|
+
value: event.target.value,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}, [onChange, update]);
|
|
49
|
+
var handleClear = React.useCallback(function (event) {
|
|
50
|
+
update('');
|
|
51
|
+
if (onClear)
|
|
52
|
+
onClear(event);
|
|
53
|
+
}, [onClear, update]);
|
|
54
|
+
React.useEffect(function () {
|
|
55
|
+
if (inputNode) {
|
|
56
|
+
textMask.current = textMaskCore.createTextMaskInputElement({
|
|
57
|
+
mask: mask,
|
|
58
|
+
inputElement: inputNode,
|
|
59
|
+
pipe: onBeforeDisplay,
|
|
60
|
+
guide: false,
|
|
61
|
+
keepCharPositions: keepCharPositions,
|
|
62
|
+
showMask: false,
|
|
63
|
+
placeholderChar: PLACEHOLDER_CHAR,
|
|
64
|
+
rawValue: '',
|
|
65
|
+
currentCaretPosition: 0,
|
|
66
|
+
previousConformedValue: '',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}, [onBeforeDisplay, mask, keepCharPositions, inputNode]);
|
|
70
|
+
React.useEffect(function () {
|
|
71
|
+
update(value || defaultValue);
|
|
72
|
+
}, [value, update, defaultValue]);
|
|
73
|
+
React.useEffect(function () {
|
|
74
|
+
setTextHidden(false);
|
|
75
|
+
}, []);
|
|
76
|
+
return (React__default.default.createElement(dynamicMixins.Input, tslib.__assign({}, restProps, { className: cn__default.default(className, (_b = {}, _b[index_module.textHidden] = textHidden, _b)), value: inputValue, onChange: handleInputChange, onClear: handleClear, ref: mergeRefs__default.default([ref, setInputNode]) })));
|
|
77
|
+
});
|
|
78
|
+
MaskedInput.displayName = 'MaskedInput';
|
|
79
|
+
|
|
80
|
+
exports.MaskedInput = MaskedInput;
|
|
81
|
+
exports.PLACEHOLDER_CHAR = PLACEHOLDER_CHAR;
|
|
82
|
+
//# sourceMappingURL=Component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Component.js","sources":["../src/Component.tsx"],"sourcesContent":["import React, { ChangeEvent, MouseEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport mergeRefs from 'react-merge-refs';\nimport cn from 'classnames';\nimport { createTextMaskInputElement, TextMaskInputElement } from 'text-mask-core';\n\nimport { Input, InputProps } from '@alfalab/core-components-input';\n\nimport styles from './index.module.css';\n\n// TODO: заставить rollup добавлять кастомные декларации в сборку\ntype Mask = Array<string | RegExp>;\nexport type TextMaskConfig = {\n currentCaretPosition: number;\n rawValue: string;\n previousConformedValue: string;\n mask?: Mask | ((rawValue: string) => Mask);\n guide?: boolean;\n showMask?: boolean;\n placeholderChar?: string;\n keepCharPositions?: boolean;\n pipe?: (\n conformedValue: string,\n config: TextMaskConfig,\n ) => false | string | { value: string; indexesOfPipedChars: number[] };\n};\n\nexport type MaskedInputProps = InputProps & {\n /**\n * Маска для поля ввода\n * https://github.com/text-mask/text-mask/blob/master/componentDocumentation.md#mask-array\n */\n mask?: TextMaskConfig['mask'];\n\n /**\n * Управляет поведением компонента при удалении символов\n */\n keepCharPositions?: TextMaskConfig['keepCharPositions'];\n\n /**\n * Дает возможность изменить значение поля перед рендером\n */\n onBeforeDisplay?: TextMaskConfig['pipe'];\n};\n\n// Символ плейсхолдера не может входить в маску, поэтому вместо пробела используется \\u2000\nexport const PLACEHOLDER_CHAR = '\\u2000';\n\nexport const MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (\n {\n mask,\n keepCharPositions = false,\n value,\n defaultValue,\n className,\n onBeforeDisplay,\n onChange,\n onClear,\n ...restProps\n },\n ref,\n ) => {\n const [inputNode, setInputNode] = useState<HTMLInputElement | null>(null);\n const textMask = useRef<TextMaskInputElement | null>(null);\n\n const [inputValue, setInputValue] = useState(value || defaultValue || '');\n // Не показываем сырое значение до применения маски\n const [textHidden, setTextHidden] = useState(true);\n\n const update = useCallback(\n (newValue = '') => {\n if (textMask.current && inputNode) {\n try {\n textMask.current.update(newValue);\n } catch (e) {\n // ignore masking errors\n }\n\n setInputValue(inputNode.value);\n }\n },\n [inputNode],\n );\n\n const handleInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n update(event.target.value);\n\n if (onChange) {\n onChange(event, {\n value: event.target.value,\n });\n }\n },\n [onChange, update],\n );\n\n const handleClear = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n update('');\n if (onClear) onClear(event);\n },\n [onClear, update],\n );\n\n useEffect(() => {\n if (inputNode) {\n textMask.current = createTextMaskInputElement({\n mask,\n inputElement: inputNode,\n pipe: onBeforeDisplay,\n guide: false,\n keepCharPositions,\n showMask: false,\n placeholderChar: PLACEHOLDER_CHAR,\n rawValue: '',\n currentCaretPosition: 0,\n previousConformedValue: '',\n });\n }\n }, [onBeforeDisplay, mask, keepCharPositions, inputNode]);\n\n useEffect(() => {\n update(value || defaultValue);\n }, [value, update, defaultValue]);\n\n useEffect(() => {\n setTextHidden(false);\n }, []);\n\n return (\n <Input\n {...restProps}\n className={cn(className, { [styles.textHidden]: textHidden })}\n value={inputValue}\n onChange={handleInputChange}\n onClear={handleClear}\n ref={mergeRefs([ref, setInputNode])}\n />\n );\n },\n);\n\nMaskedInput.displayName = 'MaskedInput';\n"],"names":["React","__rest","useState","useRef","useCallback","useEffect","createTextMaskInputElement","Input","__assign","cn","styles","mergeRefs"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Component';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var Component = require('./Component.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.MaskedInput = Component.MaskedInput;
|
|
10
|
+
exports.PLACEHOLDER_CHAR = Component.PLACEHOLDER_CHAR;
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.module.css.js","sources":["src/index.module.css"],"sourcesContent":[".textHidden input {\n opacity: 0;\n}\n"],"names":[],"mappings":";;;;AAEgB,aAAe,CAAC,YAAY,CAAC,gCAAgC,CAAC;;;;"}
|
package/esm/index.css
CHANGED
package/esm/index.module.css.js
CHANGED
package/index.css
CHANGED
package/index.module.css.js
CHANGED
package/modern/index.css
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-masked-input",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.1.0-snapshot-92b8690",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"main": "index.js",
|
|
11
11
|
"module": "./esm/index.js",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@alfalab/core-components-input": "
|
|
13
|
+
"@alfalab/core-components-input": "16.1.0-snapshot-92b8690",
|
|
14
14
|
"classnames": "^2.5.1",
|
|
15
15
|
"react-merge-refs": "^1.1.0",
|
|
16
16
|
"text-mask-core": "^5.1.2",
|
|
@@ -24,6 +24,6 @@
|
|
|
24
24
|
"access": "public",
|
|
25
25
|
"directory": "dist"
|
|
26
26
|
},
|
|
27
|
-
"themesVersion": "14.
|
|
28
|
-
"varsVersion": "10.
|
|
27
|
+
"themesVersion": "14.1.0-snapshot-92b8690",
|
|
28
|
+
"varsVersion": "10.1.0-snapshot-92b8690"
|
|
29
29
|
}
|